Automatisme Arrosage avec Node Red

Bonjour,

Même avec un nœud Inject, la fréquence d’arrosage sous certaines conditions est loin d’être optimum…
Il suffit par exemple qu’il pleuve pendant deux jours pour qu’une programmation 2 ou 3 fois par semaine soit bouleversée et donc inopérante.

Je voudrais donc avec Node Red déclencher un arrosage à 4h00 du matin si les conditions s’y prêtent :

  • humidité du sol ≤ xx%, pas de pluie, etc
    mais à condition qu’un arrosage n’ait pas été effectué les deux jours précédents.

Quel serait à votre avis les bons nodes à utiliser pour définir ces conditions ?
Merci pour votre aide,
patrickp78

Salut,

A mon avis, c’est pas un souci de NR. Tu as HA qui monitore toutes les conditions de météo, de pluie ainsi que les historiques… Quelle logique veux-tu ajouter dans NR ? Vérifier le fais qu’il ai eu de la pluie la veille ou l’avant veille ? Usine à gaz inmaintenable…
C’est à mon avis, à toi de générer dans HA, les binairy/compteurs par exemple qui permettent de dire si un arrosage est opportun dans la nuit… NR se contente de lancer la séquence si c’est autorisé (ne faire que le ET de tous les binaires).

Bonjour,

En en mesurant l’humidité du sol, tu aurais tout ce qu’il faut :thinking:
C’est ce que je fais pour mon potager avec sonde miflora en ble associé à l’intégration d’irrigation unlimited qui ajuste selon le taux humidité le temps renseigné selon les heures de lever et coucher de soleil

Merci pour ces réponses mais vous partez sur une fausse piste. :wink:
Alors je reformule mon problème en le simplifiant.

Je souhaite, avec Node Red, pouvoir lancer l’arrosage à 4h00 du matin, à condition qu’il n’ai pas été activé les deux jours précédents.
D’où ma question initiale : quel serait le bon node à utiliser ?

Merci pour vos conseils,
patrickp78

Pour lancer à 4:00, tous les jours, j’utiliserais cron-plus (node-red-contrib-cron-plus (node) - Node-RED).
Ensuite, pour éviter la suite du flot, s’il y a eu un arrosage dans les deux derniers jours, j’utiliserais un helper datetime de HA. On stocke la date de dernier arrosage (depuis un flot NR qui a été jusqu’au bout…). Et à 4:00, en sortie de cron–plus, on teste la différence entre la date du helper et la date actuelle, si c’est plus de 48h, le test doit donner true et on continue. Arrosage et mise à jour du helper.

1 « J'aime »

Revoilà cron-plus et son cirque aux étoiles :rofl: :rofl: :rofl:
Il m’a toujours fait un peu peur celui-là, jamais vraiment pratiqué mais il faut bien s’y mettre un jour !
Qu’appelles-tu un helper datetime de Home Assistant ?

La doc: Input Datetime - Home Assistant

Ok, je m’attaque à ça , je te fais signe si j’ai besoin d’un coup de main.
Merci pour la piste à suivre,

Bon, ce n’est pas simple. Je comprends la logique mais il y a des fonctions que je ne sais pas utiliser.
Je fais un test sur la base suivante :

  • dans cron plus, allumage toutes les 2 minutes, pendant 15 sec avec delay
  • stockage de l’heure dans un datetime Test Heure Last Eclairage (seulement les heures)
  • pas d’éclairage si le dernier éclairage a eu lieu dans les 10 dernières minutes

Pour le moment, je récupère l’heure (en mode 12h, pas en mode 24h) que je mets ensuite dans un flow. Mais ensuite je sèche ! :cold_sweat:

[{"id":"96d348d3b7b51f80","type":"cronplus","z":"351fb19cf34a4916","name":"Eclairage ttes les 2 min","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"topic1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 */2 * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":150,"y":1520,"wires":[["cda5111a99401062"]]},{"id":"cda5111a99401062","type":"api-call-service","z":"351fb19cf34a4916","name":"ON Appliques Bureau","server":"f1388c55.bbcd1","version":7,"debugenabled":false,"action":"light.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["light.appliques_bureau"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"light","service":"turn_on","x":480,"y":1400,"wires":[["4baf9dc46d79fa3a"]]},{"id":"4baf9dc46d79fa3a","type":"delay","z":"351fb19cf34a4916","name":"","pauseType":"delay","timeout":"15","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":680,"y":1400,"wires":[["f2219af863b7da78"]]},{"id":"f2219af863b7da78","type":"api-call-service","z":"351fb19cf34a4916","name":"OFF Appliques Bureau","server":"f1388c55.bbcd1","version":7,"debugenabled":false,"action":"light.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["light.appliques_bureau"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"light","service":"turn_off","x":880,"y":1400,"wires":[["db85cdfa5eb69a4d"]]},{"id":"db85cdfa5eb69a4d","type":"api-call-service","z":"351fb19cf34a4916","name":"","server":"f1388c55.bbcd1","version":7,"debugenabled":false,"action":"input_datetime.set_datetime","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_datetime.test_heure_last_eclairage"],"labelId":[],"data":"{\"time\":\"05:04:20\"}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":true,"domain":"input_datetime","service":"set_datetime","x":500,"y":1500,"wires":[["403deb7b3b6fec35"]]},{"id":"403deb7b3b6fec35","type":"change","z":"351fb19cf34a4916","name":"","rules":[{"t":"set","p":"last_time","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":1500,"wires":[["1d264391af0f605e"]]},{"id":"1d264391af0f605e","type":"debug","z":"351fb19cf34a4916","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1000,"y":1560,"wires":[]},{"id":"f1388c55.bbcd1","type":"server","name":"Home Assistant RBT","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false}]

Le « no code » c’est bien, mais des fois, quelques lignes de code ça simplifie beaucoup les choses (tout en les rendant plus lisibles)

D’accord avec toi. Encore faut-il bien le connaître et le pratiquer souvent…

L’allumage de la lampe et l’attente ne servent à rien.
Ensuite, tu récupères l’heure. OK.
Le change node derrière il est supposé faire quoi ? Tu stockes dans une variable, la valeur récupérée depuis HA. Et ça s’arrête là.
Voilà une idée, en sortie de cron-plus, tu récupères en payload l’heure d’exécution. C’est ça qu’il faut garder.
Et après la lecture de l’heure du helper, faire un test (noeud switch) pour comparer la valeur de l’heure d’exécution et l’heure du helper.
Pour le test, il faudra faire du jsonata. C’est aussi illisible que le jinja2 natif de HA, plutôt plus puissant… mais, c’est plutôt mieux documenté, je trouve JSONata Documentation · JSONata.

Un début d’example…

[{"id":"71a711c557d6f089","type":"api-current-state","z":"792297de7ddff2e5","name":"","server":"d28c9492.f419c8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_datetime.mydate","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":590,"y":4540,"wires":[["864df9f52bcd1a1a"]]},{"id":"d3ddfcedd33f61f0","type":"inject","z":"792297de7ddff2e5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":4540,"wires":[["d47aa010a0119861"]]},{"id":"864df9f52bcd1a1a","type":"debug","z":"792297de7ddff2e5","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"maintenant - $toMillis(payload,'[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]')","targetType":"jsonata","statusVal":"","statusType":"auto","x":920,"y":4540,"wires":[]},{"id":"d47aa010a0119861","type":"change","z":"792297de7ddff2e5","name":"","rules":[{"t":"set","p":"maintenant","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":4540,"wires":[["71a711c557d6f089"]]},{"id":"d28c9492.f419c8","type":"server","name":"hassio","version":5,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

Ce n’est pas un problème de no code ou de code, dans les deux cas, il faut comprendre comment ça marche un minimum.
Et, je pense qu’avec le no code, le minimum est plus simple à atteindre.

Et bien du coup, nocode ou lowcode, je suis complètement paumé !

Les vidéos officielles de Node Red sont plutôt bien faites. https://www.youtube.com/channel/UCQaB8NXBEPod7Ab8PPCLLAA
Ca aide à comprendre la logique. Après, il « suffit » de pratiquer :slight_smile:

1 « J'aime »

J’en ai pourtant bouffé des vidéos, mais pas sûr que ça m’aide avant quelques semaines à comprendre ça !


« Ca » c’est du jsonata :slight_smile:

La doc est bien faite. JSONata Documentation · JSONata

Cela explique, par exemple, que toMillis peut avoir un picture string. Le bazar qui commence par Y0001…
C’est ce qui permet de transformer en millisecondes une date et de préciser quel est le format de la date en entrée.
Le format complet est expliqué ici: XPath and XQuery Functions and Operators 3.1

L’erreur signifie simplement que le « machin » qui est en payload n’a pas la même syntaxe que dans mon cas, ou que maintenant n’existe pas…

Comment ça parait tellement plus simple de faire ça avec une simple automatisation et une entrée « date et/ou heure » alimentée par le dernier arrosage :rofl:

Après, chacun a le droit d’aimer l’autoflagellation :stuck_out_tongue_winking_eye:

3 « J'aime »

Bon, désolé @golfvert mais je n’ai pas le temps de passer des heures à essayer de devenir un champion du Json, ce n’est pas mon métier.
Je voulais juste un coup de main pour savoir comment, avec Node Red, déclencher une action après un certain délai.
Merci pour ton aide,
patrickp78

Et on en revient à mon post initial ! :rofl: