Synchronizacja przycisku i swiateł (zapętlony trigger)

Witam,

mam na ścianie przełącznik zigbee podpięty pod zigbee2mqtt w ha, w pokoju oświetlenie to żarówki hue. Po przełączeniu przycisku chcę żeby światła się odpowiednio zapalały/gasły w zależności od stanu przycisku. Przycisk ma też diodkę informującą na czerwono jak światło się świeci.

Flow do zapalenia gaszenia świateł trigerowany zmianą stanu przycisku jest dość prosty (event state is on, call service light on/off, 3 nody i działa).

Problem jeśli chcę aby stan przycisku zsynchronizować ze stanem światła, jeśli jakaś inna automatyzacja lub aplikacja hue zmieni stan świateł… Niby prosy, znowu 3 nody, event state słucha na zmianę świateł i ustawia stan przycisku… tyle że tutaj robi się pętla, bo zmiana stanu przycisku po zmianie świateł trigeruje even zmiany stanu przycisku i ustawia mi światłą. Czyli np. jeśli w jakiś inny sposób niż przyciskiem włączę sobie światła na np. 50%, to automatyzacja włączy mi przycisk (to dobrze) i dalej włączy światła na 100% (to już źle)…

Generalnie szukam rozwiązania, co zrobić żeby wywołanie serwisu który zmieni stan jakiejś encji, nie odpalało wybranych nodów nasłuchujących na stan tejże encji… Da się to jakoś zrobić?

Da się :wink: Podobny problem do Twojego

Potwierdzam u mnie działa, sprawdź to :wink:

Z tego co zrozumiałem, w tamtym wątku udało się dopracować wersję gdzie:

  • znana stanu w jednym przycisku, ustawia stan w drugim,
  • to powoduje trigger w nodzie słuchającym na stan drugiego przycisku
  • co nie zmienia pierwszego przycisku, bo nas on już właściwy stan

Wydaje mi się, że jakoś powinienem u mnie dać radę dojść do tego samego.

Mam jeszcze trochę potrzebę pociągnąć ten wątek już w celach bardziej rozwojowych. Wydaje mi się, że może istnieć sytuacja, kiedy osiągnięcie takiego stanu nie będzie możliwe i wtedy jednak lepiej by było zrobić coś aby ten drugi trigger się nie odpalił… No.
Mamy jedną żarówkę, dwa przyciski.

  • przycisk 1 zmiana z off na on ręczna włącza żarówkę na 50% niezależnie od stanu żarówki i ustawia przycisk 2 na off
  • przycisk 2 zmiana z off na on włącza żarówkę na 100% niezależnie od stanu żarówki i ustawia przycisk 1 na off
  • dowolny przycisk znana z on na off wyłącza żarówkę

Takie ustawienie wydaje mi się realne i sensowne, w zależności gdzie klikniemy mamy jaśniej albo ciemniej. Tyle że flow który na włączenie przycisku 2, zapali żarówkę i spowoduje włączenie przycisku 1 który aktualnie może być włączony (intencją użytkownika jest zrobienie sobie jaśniej), wpadnie w trigger wyłączenia przycisku 1 i zgasi światło…

Sprzeczność rozumowania.
Dowolny - pod warunkiem, że jest włączony - czyli nie dowolny :wink:

WTF?

Wprowadź sobie zmienną, która odwzoruje rzeczywisty stan procesu.
np. 0- stan wył, 1- pierwszy włączony, 2 - drugi włączony.
Będziesz ją aktualizował natychmiast po wystąpieniu zdarzenie od przycisku, a dalszą część działań uzależnisz już tylko od tej wartości.

Staraj się zagęszczać swoje wypowiedzi i wspomagać jakąś ilustracją.

1 polubienie

hej, dzięki za pomoc i sorry za przydługie wypowiedzi…

zmienne - jak to ustawić i jak do dokładniej działa…?

flow który próbuję zamodelować to:


I taki scenarius:

  1. oba przyciski i światła są off
  2. klik w przycisk 1 => zapalm światło (ok), wyłączam przycisk 2 (ok, bo nic się nie dzieje), triggeruje się zmiana światła na on, jasność 50%, więc przycisk 1 na on (ok, bo nic się nie dzieje) i przycisk 2 na off (ok, bo nic się nie dzieje)
  3. klik w przycisk 2 => zmieniam światło na 100% (ok), wyłączam przycisk 2 (ok), triggeruje się zmiana przycisku 2 na off która wyłącza światło (to nie jest ok)

znalazłem że mam taki node jak state machine… próbuję to jakoś nim ogarnąć, ale nie wiem czy mi się uda…

Nie kombinuj, bo cały czas się kręcisz wokół własnego ogona.
Dostałeś odpowiedź - wystarczy tylko dokończyć.
Czy już czujesz, że wymiana obrazków niczego nie daje? :wink:
Zrób eksport swojego procesu to go poprawie - będzie szybciej.
Wtedy będziesz mógł sobie analizować do woli.

https://nodered.org/docs/user-guide/context

tu jest exoprt z obrazka:

[{"id":"e80c15263b10f669","type":"tab","label":"kuchnia-test","disabled":false,"info":"","env":[]},{"id":"f52f4d2c72c97a08","type":"server-state-changed","z":"e80c15263b10f669","name":"przycisk1","server":"6544056f.9523cc","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"switch.swiatla_kuchnia_l2","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":440,"y":120,"wires":[["fd133d6572f50b41","fe6e53fec1bb4803"],["e6b9c21bc426c952"]]},{"id":"4ab6d166c731461c","type":"server-state-changed","z":"e80c15263b10f669","name":"przycisk2","server":"6544056f.9523cc","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"switch.swiatla_kuchnia_l3","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":440,"y":180,"wires":[["97f160e75647b7a7","676119d18821f1fc"],["e6b9c21bc426c952"]]},{"id":"ce49e910db028c57","type":"server-state-changed","z":"e80c15263b10f669","name":"swiatlo","server":"6544056f.9523cc","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"light.kuchnia","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"brightness","propertyType":"msg","value":"data.new_state.attributes.brightness","valueType":"str"}],"x":450,"y":260,"wires":[["ed62b7d20f1370d5"],["676119d18821f1fc","fe6e53fec1bb4803"]]},{"id":"fd133d6572f50b41","type":"api-call-service","z":"e80c15263b10f669","name":"swiatlo 50%","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.kuchnia"],"data":"{\"kelvin\": 2500, \"brightness_pct\": 50, \"transition\": 0.6}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":120,"wires":[[]]},{"id":"e6b9c21bc426c952","type":"api-call-service","z":"e80c15263b10f669","name":"swiatlo off","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.kuchnia"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":80,"wires":[[]]},{"id":"97f160e75647b7a7","type":"api-call-service","z":"e80c15263b10f669","name":"swiatlo 100%","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.kuchnia"],"data":"{\"kelvin\": 2500, \"brightness_pct\": 100, \"transition\": 0.6}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":160,"wires":[[]]},{"id":"ed62b7d20f1370d5","type":"switch","z":"e80c15263b10f669","name":"jasnosc > 50%","property":"brightness","propertyType":"msg","rules":[{"t":"lte","v":"127","vt":"str"},{"t":"gt","v":"127","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":660,"y":360,"wires":[["a1b6c72941bb0e69","676119d18821f1fc"],["62d13acf3ba452b2","fe6e53fec1bb4803"]]},{"id":"676119d18821f1fc","type":"api-call-service","z":"e80c15263b10f669","name":"przycisk1 off","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.swiatla_kuchnia_l2"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":990,"y":240,"wires":[[]]},{"id":"62d13acf3ba452b2","type":"api-call-service","z":"e80c15263b10f669","name":"przycisk1 on","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.swiatla_kuchnia_l2"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":380,"wires":[[]]},{"id":"fe6e53fec1bb4803","type":"api-call-service","z":"e80c15263b10f669","name":"przycisk2 off","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.swiatla_kuchnia_l3"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":990,"y":280,"wires":[[]]},{"id":"a1b6c72941bb0e69","type":"api-call-service","z":"e80c15263b10f669","name":"przycisk2 on","server":"6544056f.9523cc","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.swiatla_kuchnia_l3"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":340,"wires":[[]]},{"id":"6544056f.9523cc","type":"server","name":"Home Assistant","addon":true}]

Potestuj ten… nie mam możliwości sprawdzenia, jeśli coś nie działa to się poprawi.
flows (62).json (9,6 KB)