Raspberry Pi interroge le dernier niveau du réservoir via l'API et reçoit toujours une erreur 401
Traduit de English par IA ·
Je débute dans le domaine de l’IoT, je suis développeur backend et on m’a confié ce projet.Nous avons déjà un capteur de niveau de réservoir qui remonte ses données vers Hermetry (appareil « tank-01 », clé level_pct). Quelqu’un veut un Pi au bureau qui fasse retentir un buzzer lorsque le niveau dépasse 90. Mon plan était un petit service Python sur le Pi qui interroge Hermetry toutes les 5 secondes pour obtenir la dernière valeur. J’ai copié le jeton d’accès depuis la page de tank-01 et j’ai fait ceci :
GET https://<host>/api/telemetry/latest?kind=iot_device&entityId=6f1c...&keys=level_pct
Authorization: Bearer <tank-01 token>
-> 401
J’ai essayé avec et sans « Bearer », même résultat. Le jeton est-il faux, ou est-ce le mauvais point de terminaison ?
New to the IoT side of things, I’m a backend dev and got handed this.
We have a tank level sensor already reporting to Hermetry (device « tank-01 », key level_pct). Someone wants a Pi in the office that sounds a buzzer when the level goes over 90. My plan was a tiny Python service on the Pi that polls Hermetry every 5 seconds for the latest value. I copied the access token from tank-01’s page and did:
GET https://<host>/api/telemetry/latest?kind=iot_device&entityId=6f1c...&keys=level_pct
Authorization: Bearer <tank-01 token>
-> 401
Tried with and without « Bearer », same. Is the token wrong or is this the wrong endpoint?
Traduit de English par IA ·
Ceci est un identifiant d’appareil. Il permet à un appareil de se connecter, il ne lit rien pour vous. L’API de gestion demande une clé API. De plus, interroger toutes les 5 secondes, c’est beaucoup pour un buzzer.
That’s a device credential. It logs a device in, it doesn’t read anything for you. The management API wants an API key. Also every 5 seconds is a lot for a buzzer.
Traduit de English par IA ·
Brian a raison, et il te manque aussi le préfixe de l’organisation. J’ai monté à peu près la même chose pour une chambre froide l’an dernier.1. API Keys (Developer menu) > New API Key. Sous Module permissions, donne uniquement un accès en lecture seule à la télémétrie, rien d’autre. Définis une liste d’adresses IP autorisées sur celle du bureau et note la date d’expiration : par défaut 90 jours, un an au maximum. Mets un rappel dans l’agenda, la nôtre a expiré un samedi.2. Tous les chemins de gestion se trouvent sous le tenant :
GET https://<host>/tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<deviceId>&keys=level_pct
Authorization: Bearer sk_live_...
La réponse ressemble à {« latest »: {« level_pct »: {« ts »: …, « value »: 91.2}}}. Compare le ts avec le précédent pour ne pas faire biper deux fois sur la même mesure.3. Gère le 429 et attends le nombre de secondes indiqué par Retry-After. Interroge toutes les 30 s environ, le réservoir ne se remplit pas en 5 s.L’autre solution, si tu veux un résultat instantané : fais du Pi un device à part entière, crée une règle sur le réservoir qui lui envoie une commande lorsque level_pct dépasse 90, et laisse le Pi attendre sur GET /api/v1/rpc avec son propre token de device. Plus de pièces mobiles, pas de polling. Pour un buzzer, je prendrais la clé API. Les conventions sont décrites dans REST API basics.
Brian’s right, and you’re also missing the organisation prefix. I set up nearly the same thing for a chiller room last year.
1. API Keys (Developer menu) > New API Key. Under Module permissions give it read-only telemetry, nothing else. Set an IP allowlist to the office’s address, and note the expiry, default is 90 days, a year at most. Put a reminder in the calendar, ours expired on a Saturday.
2. Every management path sits under the tenant:
GET https://<host>/tenant/<tenantId>/api/telemetry/latest?kind=iot_device&entityId=<deviceId>&keys=level_pct
Authorization: Bearer sk_live_...
Answer looks like {« latest »: {« level_pct »: {« ts »: …, « value »: 91.2}}}. Compare the ts with the previous one so you don’t buzz twice on the same reading.
3. Handle 429 and wait the Retry-After seconds. Poll every 30 s or so, the tank doesn’t fill in 5.
The other route, if you want it instant: make the Pi a device itself, have a rule on the tank send it a command when level_pct rises above 90, and let the Pi wait on GET /api/v1/rpc with its own device token. More moving parts, no polling. For a buzzer I’d take the API key. Conventions are on REST API basics.
Traduit de English par IA ·
C’étaient deux bugs : le token et la partie /tenant/<tenantId> manquante (j’ai eu un 404 une fois la clé obtenue, puis je m’en suis rendu compte). Ça tourne à 30 s maintenant avec une clé en lecture seule limitée à notre IP. Le buzzer a retenti ce matin quand ils l’ont rempli, donc ça marche.
That was two bugs, the token and the missing /tenant/<tenantId> bit (got a 404 once I had the key, then saw it). Running at 30 s now with a read-only key locked to our IP. Buzzer went off this morning when they filled it, so it works.
Traduit de English par IA ·
Stockez la clé dans un fichier accessible uniquement à root, et non dans le script que vous collerez un jour dans un ticket.
Store the key in a root-only file, not in the script you’ll paste into a ticket some day.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

