Gestion des volets sous Node-Red en fonction du soleil, avec offsets paramétrables

Ah oui en effet, merci.

Est-ce bien ça ? Il me semble que je me suis trompé.

 value_template: '{{ (as_timestamp((state_attr('sun.sun', 'next_rising')) + (states("input_number.vr_piece_de_vie_matin") | int)  * 60)  | timestamp_custom("%H:%M") }}'

@Vinceg77, as tu trouver une solution pour éviter d’avoir un inject tout les 5 minutes ? Et prendre seulement l’impulsion de l’offset ?

Car actuellement sur ma config lorsque je ferme un VR manuellement, il se met en position haute après 5 minutes.

Je comprends pas le sens de la question… :innocent:

J’ai pris ton code, mais il me semble avoir fait une erreur, est-ce bien celui là ?

La première erreur que je vois c’est que tu utilises des guillemets " et des quottes '.

J’ai mis des quottes dans le code que je te donnes mais toi tu a utilisé les quottes pour entourer la formule… :innocent: Donc tu dois garder les guillemets dans la formule…

Le mieux est de ne pas s’embêter avec ça et de le mettre sur plusieurs lignes ce qui supprime le fait de devoir entourer la formule :

value_template: >
  {{(as_timestamp(state_attr("sun.sun" , "next_rising" )) + (states("input_number.vr_piece_de_vie_matin") | int)* 60)| timestamp_custom("%H:%M") }}

J’ai corrigé également le fait qu’il manquait une parenthèse et que tu englobais les deux entités pour la fonction as_timestamp() alors qu’il faut prendre seulement l’entité sun.sun

PS:
Tu peux très bien écrire comme ceci la formule dans le fichier de configuration :

ouverture_piecedevie:
  friendly_name: 'Ouverture automatique des volets à'
  icon_template: mdi:clock
  value_template: >
    {{
      (
        as_timestamp(
          state_attr("sun.sun" , "next_rising" )
        ) 
        +
        (
          states("input_number.vr_piece_de_vie_matin") |int
        )
        * 60
      ) |timestamp_custom("%H:%M")
    }}

Super je t’en remercie.
En effet, c’est plus simple visuellement.

Je suis un peu confus et je n’arrive toujours pas à obtenir le changement qui a été fait correctement. Serait-ce trop demander si vous pouviez partager le code de flux ? Merci!

Je ne sais pas si c’est une solution fiable, mais pour ma part je compare l’heure actuelle à celle « offsetée » pour déclencher mon flow Node-Red (noeud events: state).

- platform: template
  sensors:
    ouverture_vr_piecedevie:
      friendly_name: 'Ouverture automatique des volets à'
      icon_template: mdi:clock
      value_template: >
        {{
          (
            as_timestamp(
              state_attr("sun.sun" , "next_rising" )
            ) 
            +
            (
              states("input_number.vr_piecedevie_offset_matin") |int
            )
            * 60
          ) |timestamp_custom("%H:%M")
        }}

Et donc un binary_sensor qui passera à On quand l’heure actuelle (time) sera égale à celle « offsetée ».

- platform: template
  sensors:
    heure_egale_offset_matin:
      friendly_name: Heure égale offset matin
      value_template: >-
          {{ states('sensor.time_fr') == states('sensor.ouverture_vr_piecedevie') }}

Aucune idée si c’est une bonne méthode ou pas, mais en tout cas cella marche :slight_smile:

Bonjour à tous et merci pour ce tuto.
Pour mes volets je passe par l’addon tydom qui remonte vers mqtt.
Je ne vois pas quoi appeler dans le service pour fermer ou ouvrir mes volets.
Si je regarde l’état d’un volet ça donne :
image

Ou en position closed.
si quelqu’un a une idée. Je ne maitrise pas mqtt mais j’imagine qu’il faut faire un publish :face_with_spiral_eyes:

Bon question stupide en appelant le service comme dans le tuto c’est simple. Pas besoin de mqtt

J’ai le même comportement. Quelqu’un a une solution?

Hello super tuto,

Bon il a fallut que je trouve seul plein de trucs mais ca forme.
En revanche je ne comprend pas du tout ce que doit être le noeud "change sunset sunrise " à la fin.
Pourriez vous me donner ca conf ?

@Pulpy-Luke en effet ca semble être a creuser !

@Vinceg77

Merci beaucoup pour ce que tu as fait j’ai compris de nouvelles choses sur nodered.

Pourrait tu partagée ton flow txt ?
J’ai un petit soucis, les volets se ferme bien mais ne prennent pas en compte l’offset que j’ai mis pourtant le timer m’annonce bien la bonne valeur.

Merci d’avance

1 « J'aime »

Bonjour tout le monde. Tout d’abord un très gros merci à @Vinceg77 pour ce tutoriel et à toutes les autres personnes qui ont commenté, cela me permet de mettre le pied, confortablement, à l’étrier concernant Node-Red.

Je suis passé également à la méthode avec nœud Cron-plus pour piloter mes volets, mais je rencontre des difficultés:
Je n’arrive pas à anticiper qu’elles informations ressortiront du noeud timer afin de pouvoir configurer le nœud « Sunnise or sunset? ». Je me suis dit que j’allais mettre un debug à la sortie du timer et d’attendre. Puis à la place du debug j’ai essayé de mettre une notification par curiosité et d’avoir l’info si je ne suis pas sur node-red. Je n’ai pas réussi à faire marcher, si vous avez de la documentation française dessus je suis preneur.
Je cherche également à mettre, l’heure à laquelle les volets s’ouvriront ou se fermeront le prochain coup, dans un sensor. Ci-joint une image de ce que j’envisage (partie désactiver).

Le nœud « fonction2 » représente le nœud ou les nœuds qui me pose problème. Je cherche à récupérer l’heure du lever du soleil et d’ajouter l’offset correspondant puis de l’afficher dans un Sensor.
1- je ne sais pas comment récupérer l’heure de lever du soleil. La seule idée qui me vient est de créer un Sensor dans home assistant avec l’heure du lever du soleil, mais je trouve pas cela très propre car je pense qu’on doit pouvoir le faire directement depuis node-red.
2- il y aura ensuite la difficulté d’additionner l’heure du lever du soleil avec l’offset. Auriez-vous des pistes pour cela ?
En vous remerciant par avance.

Voila déjà presque 2 ans que ce flow existe. Je n’ai eu que très peu de temps depuis à consacrer à ma domotique mais mon flow a quand même un peu évolué depuis !

Je suis désolé de ne pas avoir le temps d’expliquer les changements (principalement passage au node Cronplus → node-red-contrib-cron-plus) mais je partage ici le nouveau flow pour ceux qui voudraient adapter leur gestion de volets :

Le flow :

[{"id":"136de8df.933637","type":"server-state-changed","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Saisie volets auto","server":"","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.volets_auto_salon_etat","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":200,"y":100,"wires":[["5f1c9048.92a39"]],"outputLabels":["msg.payload.time"]},{"id":"8a47381c.5c9c58","type":"server-state-changed","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Saisie offset sunrise","server":"","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.volets_auto_salon_offset_ouvre","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":190,"y":149,"wires":[["5f1c9048.92a39"]],"outputLabels":["msg.payload.time"]},{"id":"28fefe79.771132","type":"server-state-changed","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Saisie offset sunset","server":"","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.volets_auto_salon_offset_ferme","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":190,"y":200,"wires":[["5f1c9048.92a39"]],"outputLabels":["msg.payload.time"]},{"id":"4438f9f6.c4cf38","type":"api-current-state","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Volet auto ON ?","server":"","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.volets_auto_salon_etat","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","x":820,"y":200,"wires":[["b9086bd2.7d4228"],[]]},{"id":"a7113aa7.223f68","type":"api-call-service","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ouvre volet gauche","server":"","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.volet_gauche_salon"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1130,"y":300,"wires":[[]]},{"id":"a2f00284.1070d","type":"api-call-service","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ferme volet droit","server":"","version":5,"debugenabled":false,"domain":"cover","service":"close_cover","areaId":[],"deviceId":[],"entityId":["cover.volet_droit_salon"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":920,"y":300,"wires":[["a7113aa7.223f68"]]},{"id":"e5681dc1.2ce65","type":"api-call-service","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ouvre volet gauche","server":"","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.volet_gauche_salon"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":610,"y":300,"wires":[[]]},{"id":"95c645a5.272bd8","type":"api-call-service","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ouvre volet droit","server":"","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.volet_droit_salon"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":400,"y":300,"wires":[["e5681dc1.2ce65"]]},{"id":"ecfa86a0.24f0e8","type":"function","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Load sunX payload","func":"msg.payload= [\n  {\n    \"command\": \"add\",\n    \"name\": \"sunset\",\n    \"topic\": \"sunset\",\n    \"expressionType\": \"solar\",\n    \"solarType\": \"selected\",\n    \"solarEvents\": \"sunset\",\n    \"location\": \"48.87874479077371 2.5838953256607056\",\n    \"offset\": msg.sunset,\n    \"payloadType\": \"str\",\n    \"payload\": \"Close\",\n    \"limit\": null\n  },\n  {\n    \"command\": \"add\",\n    \"name\": \"sunrise\",\n    \"topic\": \"sunrise\",\n    \"expressionType\": \"solar\",\n    \"solarType\": \"selected\",\n    \"solarEvents\": \"sunrise\",\n    \"location\": \"48.87874479077371 2.5838953256607056\",\n    \"offset\": msg.sunrise,\n    \"payloadType\": \"str\",\n    \"payload\": \"Open\",\n    \"limit\": null\n  }\n]\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":220,"wires":[["bc9361d6.2300c"]]},{"id":"bc9361d6.2300c","type":"cronplus","z":"d4e953e9.5224a","g":"f33676da.825828","name":"timer","outputField":"payload","timeZone":"Europe/Paris","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[],"x":650,"y":220,"wires":[["4438f9f6.c4cf38"]]},{"id":"b9086bd2.7d4228","type":"switch","z":"d4e953e9.5224a","g":"f33676da.825828","name":"sunrise or sunset ?","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"sunrise","vt":"str"},{"t":"eq","v":"sunset","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1050,"y":220,"wires":[["5544b602.449bc8"],["ef3e5006.f6b97"]]},{"id":"5544b602.449bc8","type":"link out","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ouvre salonsam out","links":["e36869a1.e18ec8"],"x":1195,"y":200,"wires":[]},{"id":"ef3e5006.f6b97","type":"link out","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ferme salonsam out","links":["e88fe84e.80baa8"],"x":1195,"y":240,"wires":[]},{"id":"e36869a1.e18ec8","type":"link in","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ouvre salonsam in","links":["5544b602.449bc8"],"x":255,"y":300,"wires":[["95c645a5.272bd8"]]},{"id":"e88fe84e.80baa8","type":"link in","z":"d4e953e9.5224a","g":"f33676da.825828","name":"ferme salonsam in","links":["ef3e5006.f6b97"],"x":775,"y":300,"wires":[["a2f00284.1070d"]]},{"id":"4f0594a1.f0573c","type":"inject","z":"d4e953e9.5224a","g":"f33676da.825828","name":"auto inject on deploy","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.5","topic":"","payload":"","payloadType":"date","x":180,"y":260,"wires":[["5f1c9048.92a39"]]},{"id":"5f1c9048.92a39","type":"api-current-state","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Offset sunset","server":"","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_number.volets_auto_salon_offset_ferme","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"sunset","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":430,"y":140,"wires":[["3a6e2dde.4db332"]]},{"id":"3a6e2dde.4db332","type":"api-current-state","z":"d4e953e9.5224a","g":"f33676da.825828","name":"Offset sunrise","server":"","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_number.volets_auto_salon_offset_ouvre","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"sunrise","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":620,"y":140,"wires":[["ecfa86a0.24f0e8"]]}]

Toute la parie de control sur HA est restée la même.

Vincent

Bonjour à tous

Merci pour le travail fait par les uns et les autres.
Merci pour ces recherches @Vinceg77

Je tente de m’inspirer de tout ce travail et notamment dans la mise en place du cron plus.

J’ai ce type d’entité en place sur HA
image

Je souhaite que l’horaire indiqué sur VR CH Parents (Matin) 08:00 soit variabilisé dans node red pour mettre à jour le cron à utiliser.

Dans le node Load sunX payload @Vinceg77 tu adaptes un payload avec un msg.sunset
De mon coté j’aimerais utiliser un msg.vr_ch_parents_matin par exemple pour mettre à jour la valeur du cron 0 0 8 * * MON,TUE,WED,THU,FRI *

Ma question est comment faire pour avoir dans le payload ci-dessous à la ligne expression la bonne ligne de code !
Du genre « expression »: msg.vr_ch_parents_matin, qui permettrait d’ajuster le cron si je change l’heure dans HA

Merci de votre coup de pouce

msg.payload= [
  {
    "command": "add",
    "name": "vr_ch_parents_matin",
    "expression": "0 0 8 * * MON,TUE,WED,THU,FRI *",
    "expressionType": "cron",
    "payloadType": "default",
    "limit": null 
  }
]
return msg;