Si...Sinon (if…else) en Node-Red

1 « J'aime »

Déjà vu aussi. Je me documente mais comme dit plus haut, je pense qu’il me manque le beaba du très débutant

Un bête truc,
Sous jeedom, j’avais un scénario qui disait : si « hiver » a « heure de coucher du soleil » moins 30min, fermer tous les volets. Si été, « heure de coucher du soleil » plus 30 minutes, fermer tous les volets.
C’est un bête truc mais pour moi c’est le commencement. Ma logique jeedom me perd aussi je pense.

Voilà à quoi ta fermeture de volets peut ressembler :
image

J’imagine que tu devais (dans jeedom) un déclencheur a (par exemple) 4 heure du matin qui, dans le scenario faisait un:

if hiver then
a 'heure du coucher' -30 Lance le scenario de fermeture des volets
else
a 'heure du coucher' +30 Lance le scenario de fermeture des volets

Effectivement la logique de NR n’est pas la même.

Déjà, pas besoin d’« astuce » pour gérer les heures comme dans jeedom. Dans NR, il y a plein de palettes différentes qui permettent nativement de déclencher des flots à l’heure que tu veux.
L’autre « problème » c’est que NR est très (trop?) riche et qu’il y a plein de méthodes pour faire la même chose…

Tu as déjà deux pistes de solution. Et on pourrais en mettre d’autres :slight_smile: ou :frowning: ?!

Mais, déjà un autre truc vraiment plus facile qu’avec jeedom c’est l’édition des « scenario ». J’ai toujours eu un mal de chien à changer les actions d’ordre avec l’éditeur jeedom. Avec NR, tu déplaces les noeuds et les fils…

La version de @fredarro est très bien et compacte.

Voici une autre version plus détaillée (c’est à dire avec plus de noeud, mais simple à configurer):

  1. Pour connaitre la saison, tu peux par exemple utiliser l’API domogeek
  2. Tu testes le résultat avec un noeud switch
  3. Tu déclenches ton évènement de coucher de soleil avec un noeud cron-plus
  4. Tu mets ton déclenchement de fermeture de volet

N’hésite pas si tu as besoin de plus d’information

Le noeud utilisé est inject-enhanced de node-red-contrib-sun-position

Après les automatisation de HA via l’UI marche a peu près de la même manière que Jeedom la seul différence c’est les appel de service à la fin en fonction des demandes.

Mais pour des automatisations simple n’est très visuel.

mouvement (trigger) sur on action lumière on

Oui, ça j’ai du mal. Je pense que je vais essayer de persévérer avec node-.red qui semble être génial. Si j’ai bien compris, les automations avec ha se font en code dans le fichier configuration… je trouve le principe moins bien (visuel) quand il faut faire une modification…

Je ne sais pas si c’est une erreur de frappe de ta part mais moi, je ne trouve pas node-red-contrib-sun-position. J’ai un truc qui y ressemble mais c’est pas tout à fait ce nom là. D’ailleurs, l’icône n’est pas le même que sur l’exemple. J’ai aussi un « sunrise »je crois.
@fredarro j’ai essayé ta méthode mais plutôt que de mettre l’action fermeture volets, j’ai mis debug pour voir l’info qui passait mais quand je l’active, rien ne se passe. Rien dans la console debug…

Il est ici : node-red-contrib-sun-position (node) - Node-RED

Salut,

Je pense que tu peux éventuellement essayer cette palette node-red-contrib-scheduler (node) - Node-RED

Didier

Ahhhhh merci, je croyais qu’il se trouvait dans ma palette lol.
Par contre, ça n’a rien à voir avec ce fil mais j’ai essayé le ssh avec putty, et ça ne marche pas. Mais pour installer le noeud, il donne une commande en ssh je pense… je suis encore largué

image

Merci, faut que j’essaye. Je ne suis pas chez moi. J’essayerai ce soir. En tout cas, encore un grand merci à vous tous pour vos aides.

Non non… :innocent:

  1. Configuration → Plans

Ou

  1. Configuration → Automatisations

Avec NodeRed, rien de plus simple dés qu’il y a de la conditionnelle → code en javascript dans le node de developpement

If (condition 1){
return X
}
Else if (condition 2){
return Y
}
else{
return W
}

Un message a été scindé en un nouveau sujet : Installer l’API domogeek

Bonjour,

Je viens de tenter de programmer la fermeture de mes volets avec node-red en suivant la méthode de @evenisse
Seulement, je bloque. Je pensais avoir fait ce qu’il fallait mais le debug n’indique parfois rien ou quand il indique, c’est pour me dire qu’il ne trouve pas de valeur (alors que je la vois indiquée).
Petite question aussi, la requête de l’API domogeek semble beuguer régulièrement (réponse: unknown). Comment puis-je faire pour qu’il attende une réponse correcte?
Je vous post le code de node-red. Savez-vous me dire où je fais mal?

Merci

[{"id":"89990f99.a6d4e","type":"tab","label":"Volets","disabled":false,"info":""},{"id":"946fc8b0.e47f18","type":"debug","z":"89990f99.a6d4e","name":"Débug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1110,"y":480,"wires":[]},{"id":"f5e891c3.81dac","type":"api-call-service","z":"89990f99.a6d4e","name":"","server":"f2797c98.ae263","version":1,"debugenabled":false,"service_domain":"cover","service":"close_cover","entityId":"cover.montee_descente_totale","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1160,"y":540,"wires":[[]]},{"id":"7771658e.a06c2c","type":"switch","z":"89990f99.a6d4e","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"fall","vt":"str"},{"t":"eq","v":"winter","vt":"str"},{"t":"eq","v":"spring","vt":"str"},{"t":"eq","v":"summer","vt":"str"}],"checkall":"true","repair":false,"outputs":4,"x":550,"y":460,"wires":[["ab1a6250.88dfe"],["ab1a6250.88dfe"],["25b435d1.170caa"],["25b435d1.170caa"]]},{"id":"5374377.252e5c8","type":"inject","z":"89990f99.a6d4e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":80,"y":460,"wires":[["358d363f.bf91aa"]]},{"id":"358d363f.bf91aa","type":"api-current-state","z":"89990f99.a6d4e","name":"","server":"f2797c98.ae263","version":1,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"sensor.saison","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":320,"y":460,"wires":[["7771658e.a06c2c"]]},{"id":"ab1a6250.88dfe","type":"cronplus","z":"89990f99.a6d4e","name":"Heure d'hiver","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"solar","expression":"0 * * * * * *","location":"49.97697041919103 5.487235290929675","offset":"15","solarType":"selected","solarEvents":"sunset"}],"x":810,"y":440,"wires":[["946fc8b0.e47f18","f5e891c3.81dac"]]},{"id":"25b435d1.170caa","type":"cronplus","z":"89990f99.a6d4e","name":"Heure d'été","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"solar","expression":"0 * * * * * *","location":"49.97697737275994 5.487342579290271","offset":"30","solarType":"selected","solarEvents":"sunset"}],"x":800,"y":520,"wires":[["946fc8b0.e47f18","f5e891c3.81dac"]]},{"id":"f2797c98.ae263","type":"server","name":"Home Assistant","addon":true}]

Plusieurs choses:

  • le timestamp au début ne sera lancé que si tu cliques dessus. Donc, pour programmer un flot à faire régulièrement ça ne va pas
  • la logique de cron-plus c’est de programmer l’exécution une fois pour toute et de ne pas lancer un nouveau cron-plus à chaque fois que tu cliques sur time-stamp. Sinon, tu vas te retrouver avec plusieurs exécution de ton dernier noeud
  • pour le calcul de la saison, on trouve des exemples en javascript qui font ça en qq lignes de codes. J’ai juste pompé ce que j’ai trouvé là https://stackoverflow.com/questions/5670678/javascript-coding-input-a-specific-date-output-the-season
  • si j’ai compris ce que tu voulais faire c’est décaler la fermeture des volets de 15 minutes quand on est en été et printemps. C’est ça?

Si c’est un bon résumé, voilà une méthode:

[{"id":"8f6957f4.01c118","type":"function","z":"f5b50430.ea48b8","name":"Saison","func":"const md = (month, day) => ({month, day})\nconst toMd = date => md(date.getMonth(), date.getDate())\n\nconst before = (md1, md2) => (md1.month < md2.month) \n  || ((md1.month === md2.month) && (md1.day <= md2.day)) \n\nconst after = (md1, md2) => !before(md1, md2)\n\nconst between = (mdX, mdLow, mdHigh) => \n  after(mdX, mdLow) && before(mdX, mdHigh)\n \nconst season = (date, seasons) => ((md = toMd(date)) =>\n  Object.keys(seasons).find(season => seasons[season](md))\n)()\n\nconst MARCH_EQUINOX = md(2, 20)\nconst JUNE_SOLSTICE = md(5, 21)\nconst SEPTEMBER_EQUINOX = md(8, 23)\nconst DECEMBER_SOLSTICE = md(11, 21)\nconst NEW_YEAR = md(0, 1)\n\nconst seasons = {\n  spring: d => between(d, MARCH_EQUINOX, JUNE_SOLSTICE),\n  summer: d => between(d, JUNE_SOLSTICE, SEPTEMBER_EQUINOX),\n  fall: d => between(d, SEPTEMBER_EQUINOX, DECEMBER_SOLSTICE),\n  winter: d => \n    between(d, DECEMBER_SOLSTICE, NEW_YEAR) ||\n    between(d, NEW_YEAR, MARCH_EQUINOX)\n}\n\nmsg.payload = season(new Date(), seasons) \n  \nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":350,"y":1560,"wires":[["3a1c9876.944e48"]]},{"id":"3a1c9876.944e48","type":"switch","z":"f5b50430.ea48b8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"regex","v":"winter|fall","vt":"str","case":false},{"t":"regex","v":"summer|spring","vt":"str","case":false}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":1560,"wires":[["1b7e2d5f.f619a3"],["ff544df5.0da09"]]},{"id":"6d0b2a76.3e8864","type":"cronplus","z":"f5b50430.ea48b8","name":"Sunset + 15","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"solar","expression":"0 * * * * * *","location":"49.97697041919103 5.487235290929675","offset":"15","solarType":"selected","solarEvents":"sunset"}],"x":190,"y":1560,"wires":[["8f6957f4.01c118"]]},{"id":"1b7e2d5f.f619a3","type":"api-call-service","z":"f5b50430.ea48b8","name":"","server":"f2797c98.ae263","version":1,"debugenabled":false,"service_domain":"cover","service":"close_cover","entityId":"cover.montee_descente_totale","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":860,"y":1540,"wires":[[]]},{"id":"ff544df5.0da09","type":"delay","z":"f5b50430.ea48b8","name":"","pauseType":"delay","timeout":"15","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":650,"y":1600,"wires":[["1b7e2d5f.f619a3"]]},{"id":"f2797c98.ae263","type":"server","name":"Home Assistant","addon":true}]

Le cron se lance à sunset + 15 et en fonction de la saison attend 15 minutes ou pas avant d’appeler la fermeture des volets.

1 « J'aime »