Plant Reminder: Arrosage

Connectez Plant Reminder à Home Assistant et Alexa

Une API de lecture et d'actions pour vos plantes : consultez ce qui demande des soins, enregistrez arrosages et fertilisations (ou annulez-les) depuis votre maison connectée.

Incluse avec Premium Ou un pass de 30 jours pour 30 jetons Home Assistant Alexa : bientôt

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 :

  1. Ouvrez l'onglet Plus, puis Home Assistant et Alexa.
  2. Touchez Activer.
  3. Touchez Créer un jeton.
  4. 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

EndpointFonction
GET /v1/due?days=0..7Soins à 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/plantsListe 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}/fertilizationsHistorique de fertilisation d'une plante. Mêmes paramètres facultatifs.
GET /v1/actionsActions enregistrées avec votre jeton. limit est facultatif (de 1 à 100, 20 par défaut).
GET /v1/roomsListe 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

StatutCodeSignification
400bad_requestLa requête est mal formée (par exemple, un paramètre hors plage).
400invalid_dateLa 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.
401invalid_tokenLe jeton est absent, incorrect ou a été révoqué.
401token_expiredLe jeton d'accès a expiré et doit être renouvelé (Alexa le fait toute seule).
402api_access_expiredL'accès à l'API est terminé (Premium ou pass). Renouvelez-le dans l'app.
403insufficient_scopeLe jeton n'a pas l'autorisation d'enregistrer des soins.
403write_disabledLes écritures sont temporairement désactivées de notre côté. La lecture continue de fonctionner.
404not_foundLa route, la plante ou l'action n'existe pas.
404nothing_to_undoIl n'y a rien de votre jeton à annuler.
409already_goneCe que vous tentiez d'annuler avait déjà été supprimé.
410expiredL'action date de plus de 24 heures et ne peut plus être annulée.
429rate_limitedTrop de requêtes. Attendez le nombre de secondes indiqué dans l'en-tête Retry-After.
503api_disabledL'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.