De quoi s'agit-il
L'API de Plant Reminder permet à d'autres outils de lire vos plantes et d'enregistrer leurs soins : lire ce qui est à faire, et agir en enregistrant des arrosages et des fertilisations, ou en les annulant. Home Assistant et Alexa l'utilisent, et vos propres scripts aussi.
Elle est incluse avec Premium, ou vous pouvez prendre un pass de 30 jours pour 30 jetons (les jetons s'achètent dans l'app). Le pass ne se renouvelle pas automatiquement.
L'API ne permet jamais de supprimer des plantes, des photos ni l'historique.
Créez votre jeton dans l'app
Chaque intégration utilise un jeton personnel. Pour en créer un :
- Ouvrez l'onglet Plus, puis Home Assistant et Alexa.
- Touchez Activer.
- Touchez Créer un jeton.
- Touchez Copier.
Le jeton ne s'affiche qu'une seule fois : copiez-le tout de suite. Vous pouvez le révoquer à tout moment et en créer un autre.
L'option Autoriser l'enregistrement des arrosages et des fertilisations est cochée par défaut. Si vous la décochez, le jeton devient en lecture seule et toute écriture renvoie insufficient_scope.
Home Assistant
Tout ce qui suit peut être collé dans votre configuration.yaml. Remplacez VOTRE_JETON par le jeton que vous avez copié.
Capteur : plantes à arroser
Un capteur rest qui interroge l'API toutes les 300 secondes. Son état est le nombre de plantes à arroser aujourd'hui ou en retard. L'attribut plants liste tout ce qui est à faire, chaque élément avec son kind : watering (arrosage), fertilization (engrais) ou transplant (rempotage).
rest:
- resource: https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api/v1/due?days=1
scan_interval: 300
headers:
Authorization: "Bearer VOTRE_JETON"
sensor:
- name: "Plantes à arroser"
value_template: "{{ value_json.plants | selectattr('kind', 'eq', 'watering') | list | count }}"
json_attributes:
- plants
- overdue_count
- today
- as_of
Commandes : arroser, fertiliser et annuler
Un rest_command par action. plant_reminder_water et plant_reminder_fertilize reçoivent un plant_id ; les identifiants viennent de GET /v1/plants ou de l'attribut plants du capteur.
rest_command:
plant_reminder_water:
url: "https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api/v1/plants/{{ plant_id }}/water"
method: POST
headers:
Authorization: "Bearer VOTRE_JETON"
content_type: "application/json"
payload: "{}"
plant_reminder_fertilize:
url: "https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api/v1/plants/{{ plant_id }}/fertilize"
method: POST
headers:
Authorization: "Bearer VOTRE_JETON"
content_type: "application/json"
payload: "{}"
plant_reminder_water_all_due:
url: "https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api/v1/due/water"
method: POST
headers:
Authorization: "Bearer VOTRE_JETON"
content_type: "application/json"
payload: "{}"
plant_reminder_undo:
url: "https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api/v1/actions/undo"
method: POST
headers:
Authorization: "Bearer VOTRE_JETON"
content_type: "application/json"
payload: "{}"
Astuce : plutôt que d'écrire le jeton dans le fichier, gardez-le dans secrets.yaml et référencez-le avec !secret.
Automatisation : être prévenu quand il y a des plantes à arroser
Elle envoie une notification avec le nom des plantes chaque fois que le capteur passe au-dessus de zéro. Elle utilise la syntaxe de Home Assistant 2024.10 ou plus récent (triggers: et actions:) ; remplacez notify.notify par votre propre service de notification.
automation:
- alias: "Plant Reminder : plantes à arroser"
triggers:
- trigger: numeric_state
entity_id: sensor.plantes_a_arroser
above: 0
actions:
- action: notify.notify
data:
title: "Plantes à arroser"
message: >-
{{ state_attr('sensor.plantes_a_arroser', 'plants') | selectattr('kind', 'eq', 'watering') | map(attribute='name') | join(', ') }}
Cet exemple n'a pas encore été vérifié sur une version précise de Home Assistant ; la syntaxe suit la documentation de la 2024.10 et des versions suivantes. Si quelque chose ne fonctionne pas sur votre version, écrivez-nous en précisant laquelle. L'identifiant de l'entité provient du nom du capteur : vérifiez-le dans les Outils de développement s'il est différent.
Référence des endpoints
Toutes les routes partent de l'URL de base ci-dessous et exigent l'en-tête Authorization: Bearer VOTRE_JETON. Les corps de requête sont en JSON.
URL de base: https://kerijldtrzlwaawlpdcw.supabase.co/functions/v1/public-api
| Endpoint | Fonction |
|---|---|
GET /v1/due?days=0..7 | Soins à faire dans les N prochains jours (de 0 à 7, 1 par défaut), retards compris : arrosage, engrais et rempotage. Chaque élément porte son kind. |
GET /v1/plants | Liste vos plantes. |
GET /v1/plants/{id} | Détail d'une plante. |
GET /v1/plants/{id}/waterings?since=&limit= | Historique d'arrosage d'une plante. since (date ISO) et limit (de 1 à 500, 100 par défaut) sont facultatifs. |
GET /v1/plants/{id}/fertilizations | Historique de fertilisation d'une plante. Mêmes paramètres facultatifs. |
GET /v1/actions | Actions enregistrées avec votre jeton. limit est facultatif (de 1 à 100, 20 par défaut). |
GET /v1/rooms | Liste vos pièces avec le nombre de plantes de chacune (seulement celles qui s'arrosent). |
POST /v1/plants/{id}/water{at?} | Enregistre un arrosage. at est une date ISO (par défaut : maintenant ; elle ne peut pas être dans le futur). |
POST /v1/plants/{id}/fertilize{at?, fertilizer_form?, application_method?} | Enregistre un apport d'engrais. at fonctionne de la même façon. fertilizer_form accepte liquid ou solid, et application_method accepte soil, foliar ou root_drench ; sans eux, ceux du dernier apport de la plante sont utilisés. |
POST /v1/due/water{dry_run?} | Arrose toutes les plantes à traiter. Avec dry_run: true, il ne fait qu'une simulation et n'enregistre rien. Un lot compte comme une seule écriture. |
POST /v1/rooms/{id}/water{at?, dry_run?} | Enregistre un arrosage pour toutes les plantes de cette pièce. at fonctionne de la même façon ; avec dry_run: true, renvoie seulement la liste. Compte comme une seule écriture et s'annule en bloc. |
POST /v1/actions/undo{action_id?} | Annule une action. Sans action_id, annule la dernière. |
- Pour les écritures, vous pouvez envoyer l'en-tête facultatif
Idempotency-Key: répéter une requête avec la même clé renvoie le résultat d'origine au lieu de l'enregistrer deux fois. - Les dates sont au format ISO 8601, en UTC.
- Chaque réponse contient
api_version(actuellement"1"). - Les erreurs ont la forme
{"error": "code", "message": "..."}.
Erreurs et limites
| Statut | Code | Signification |
|---|---|---|
| 400 | bad_request | La requête est mal formée (par exemple, un paramètre hors plage). |
| 400 | invalid_date | La date n'est pas valide : elle est dans le futur, antérieure à l'adoption de la plante, ou n'est pas au format ISO 8601. |
| 401 | invalid_token | Le jeton est absent, incorrect ou a été révoqué. |
| 401 | token_expired | Le jeton d'accès a expiré et doit être renouvelé (Alexa le fait toute seule). |
| 402 | api_access_expired | L'accès à l'API est terminé (Premium ou pass). Renouvelez-le dans l'app. |
| 403 | insufficient_scope | Le jeton n'a pas l'autorisation d'enregistrer des soins. |
| 403 | write_disabled | Les écritures sont temporairement désactivées de notre côté. La lecture continue de fonctionner. |
| 404 | not_found | La route, la plante ou l'action n'existe pas. |
| 404 | nothing_to_undo | Il n'y a rien de votre jeton à annuler. |
| 409 | already_gone | Ce que vous tentiez d'annuler avait déjà été supprimé. |
| 410 | expired | L'action date de plus de 24 heures et ne peut plus être annulée. |
| 429 | rate_limited | Trop de requêtes. Attendez le nombre de secondes indiqué dans l'en-tête Retry-After. |
| 503 | api_disabled | L'API est temporairement désactivée. |
Limites
- 10 requêtes par minute et 5 000 par jour pour chaque jeton.
- 60 écritures par jour pour chaque jeton (un lot compte pour une).
- L'annulation ne retire que ce que votre propre intégration a enregistré au cours des dernières 24 heures.
Alexa Bientôt disponible
Le skill Plant Reminder pour Alexa est encore en cours de certification et n'est donc pas encore disponible. Voici comment il fonctionnera :
Vous pourrez dire :
En anglais
- Alexa, open my plants
- Alexa, ask my plants what needs watering today
- Alexa, ask my plants if the monstera needs water
- Alexa, tell my plants I watered the ficus
- Alexa, tell my plants I watered the ficus yesterday
- Alexa, tell my plants to water the plants in the living room
- Alexa, tell my plants to water everything due today
- Alexa, tell my plants to undo the last one
En espagnol
- Alexa, abre mis plantas
- Alexa, pregunta a mis plantas qué toca regar hoy
- Alexa, pregunta a mis plantas si toca regar la monstera
- Alexa, dile a mis plantas que he regado el ficus
- Alexa, dile a mis plantas que regué el ficus ayer
- Alexa, dile a mis plantas que riegue las plantas del salón
- Alexa, dile a mis plantas que riegue todas las de hoy
- Alexa, dile a mis plantas que deshaga lo último
Vous associerez votre compte depuis l'app Alexa. Le skill sera disponible en anglais et en espagnol. Après avoir enregistré une plante, la skill demande si vous voulez en enregistrer une autre : dites son nom, ou « that's all » / « ya está ». Les longues listes sont lues cinq par cinq. Si vous demandez pour une plante (« does the monstera need water? » / « ¿toca regar la monstera? »), elle vous dit si c'est pour aujourd'hui, combien de jours de retard elle a ou quel jour c'est prévu ; si c'est le moment, elle propose d'enregistrer l'arrosage.
Confidentialité
Pour chaque jeton, nous conservons la date de dernière utilisation et un compteur quotidien de requêtes, afin d'appliquer les limites et de vous montrer s'il est utilisé.
Le jeton lui-même n'est conservé que sous forme de hash, jamais en clair : personne, nous compris, ne peut le relire. C'est pourquoi il ne s'affiche qu'une seule fois.
Assistance
Pour toute question, bug ou aide sur votre compte, écrivez à [email protected].
Délai de réponse habituel : 24–48 heures ouvrées.