Jakość powietrza i otwarte okna - automatyzacja

Panowie mam mały problem.
Zrobiłem automatyzację, która informuje mnie o tym, że zmienił się na zewnątrz stan powietrza. Robiłem to dawno (nawet chyba opierałem się na jakimś filmie @artur).
W związku z tym, że teraz mam kilka czujników otwarcia w oknach chciałbym, żeby po zmianie stanu powietrza poszło powiadomienie - “masz otwarte okno w salonie. Zamknij bo stan powietrza jest zły”. Na tą chwile mam zrobioną grupę ze wszystkimi oknami. Jeżeli któreś jest otwarte idzie komunikat o konieczności zamknięcia.
Nie wiem jak wydobyć informacje o konkretnym oknie. Potrzebuje tutaj Waszej pomocy.
Oczywiście wiem, że mógłbym sprawdzać stan każdego okna i zrobić ogromną automatyzację ale wydaje mi się, że to bardzo nieeleganckie rozwiązanie i można to zrobić łatwiej. Ma ktoś jakiś pomysł?W załączniku to co do tej pory zrobiłem.
jakosc_powietrza.json (26,1 KB)

Możesz użyć tego flow wcale nie jest skomplikowany i rozrośnięty.
Ja użyłem go do wykrycia, które okno jest otwarte, kiedy pada deszcz.

Super. Jest to jakieś rozwiązanie. Jak dla mnie wystarczy.
Gorzej jak ktoś ma 30 okien w domu :stuck_out_tongue:

Ja bym zrobił inaczej. Wykorzystał bym “nod get entities” i atrybut “device_class”. Dodatkowo w encji wprowadził ustandaryzowaną nazwę “Okno TWOJA NAZWA”. Okno jest słowem kluczowym.
Proces będzie wyglądał tak:

[{"id":"2e7cb7d3d2fbaba0","type":"ha-get-entities","z":"f6a80b77.904ed","name":"","server":"6a2af6d8.98c388","version":0,"rules":[{"property":"attributes.device_class","logic":"is","value":"door","valueType":"str"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":400,"y":520,"wires":[["cce2988cdd9830f2"]]},{"id":"d51e503672927d87","type":"inject","z":"f6a80b77.904ed","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":520,"wires":[["2e7cb7d3d2fbaba0"]]},{"id":"4919c8f46538ef47","type":"debug","z":"f6a80b77.904ed","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":830,"y":520,"wires":[]},{"id":"cce2988cdd9830f2","type":"function","z":"f6a80b77.904ed","name":"","func":"msg.komunikat = \"\";\n\nfor (var i = msg.payload.length - 1; i >= 0; i--) \n{\n    if(msg.payload[i].attributes.friendly_name.substr(0,5).toUpperCase() == \"DRZWI\")\n    {\n        if (msg.payload[i].attributes.contact = true)\n        {\n            msg.komunikat = msg.komunikat + msg.payload[i].attributes.friendly_name + \", \";    \n        }\n    }\n}\n\nif (msg.komunikat != \"\")\n{\n    msg.komunikat = \"Uwaga! Wykryto otwarte okna. \" + msg.komunikat;\n}\n\n\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":520,"wires":[["4919c8f46538ef47"]]},{"id":"6a2af6d8.98c388","type":"server","name":"Home Assistant 1","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30}]

To jest świetne. Dokładnie o coś w tym stylu mi chodziło. Ale mam jeden problem.
Z funkcji zrozumiałem, że sprawdza atrybut contact. W przypadku czujników Sonoffa nie ma z tym problemu. Ale w jednym pokoju mam czujnik zrobiony na bazie esp32 i nie mam takiego atrybutu.
okno

Próbowałem zmienić trochę tą funkcję żeby reagowała na stan a nie atrybut ale jestem na to za krótki. Pomożesz?

Dla ESp32 używasz ESPHome czy Arduino IDE?

EspHome. Dużo bardziej przyjazne jeżeli chodzi o integrację z HA.

Ja znowu nie odnajduje się w ESPHome. Może ktoś z grupowiczów podpowie jak dodać atrybut w ESPHhome.

Niestety z tego co się orientuję nie da się tego zrobić. Dlatego moje pytanie o zmianę flow. Czy nie da się zamiast atrybutu czytać stan encji?

narazie mam coś takiego, o grupie nie pomyślałem

obraz

tu masz same flow okna

flows(3).json (10,8 KB)

i jeszcze takie co


flows(4).json (19,7 KB)

możecie wierzyć, że ostatnie powiadomienie często mi się pojawia… :unamused:

i nie trzeba było długo czekać, zakres czujnika kończy się na 992
obraz

@mich w nodzie function zmień linię z

if (msg.payload[i].attributes.contact = true)

na

if (msg.payload[i].state = "off")

@Mariusz_Kuciński niestety nie działa tak jak powinno. Na początku nie tworzył mi wcale komunikatu mimo, że widział otwarte okno. Zmieniłem wtedy w tej lini:

if(msg.payload[i].attributes.friendly_name.substr(0,4).toUpperCase() == "OKNO")

cyfrę 5 na 4. U Ciebie były drzwi(5 liter) u mnie okno (4).
Od tego momentu mam już komunikat ale jest on generowany za każdym razem. Nieważne czy okna są otwarte czy zamknięte.
Wrzucam swój flow. Nie wiem co robię źle. Może jakaś literówka?

[{"id":"2e7cb7d3d2fbaba0","type":"ha-get-entities","z":"df2c2c48.6ec27","name":"","server":"6e5c65cb.c3223c","version":0,"rules":[{"property":"attributes.device_class","logic":"is","value":"window","valueType":"str"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":450,"y":840,"wires":[["cce2988cdd9830f2"]]},{"id":"d51e503672927d87","type":"inject","z":"df2c2c48.6ec27","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":840,"wires":[["2e7cb7d3d2fbaba0"]]},{"id":"4919c8f46538ef47","type":"debug","z":"df2c2c48.6ec27","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":880,"y":840,"wires":[]},{"id":"cce2988cdd9830f2","type":"function","z":"df2c2c48.6ec27","name":"","func":"msg.komunikat = \"\";\n\nfor (var i = msg.payload.length - 1; i >= 0; i--) \n{\n    if(msg.payload[i].attributes.friendly_name.substr(0,4).toUpperCase() == \"OKNO\")\n    {\n        if (msg.payload[i].state = \"off\")\n        {\n            msg.komunikat = msg.komunikat + msg.payload[i].attributes.friendly_name + \", \";    \n        }\n    }\n}\n\nif (msg.komunikat != \"\")\n{\n    msg.komunikat = \"Uwaga! Wykryto otwarte okna. \" + msg.komunikat;\n}\n\n\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":840,"wires":[["4919c8f46538ef47"]]},{"id":"6e5c65cb.c3223c","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":false,"heartbeat":false,"heartbeatInterval":30}]

@luki25 Dzięki za podpowiedź ale w Twojej automatyzacji trzeba dodać każde okno osobno. Tworzy to problemy przy dodawaniu nowych czujników. Wolałbym tego uniknąć.

No tak
if (msg.payload[i].state = "off")
zmien na
if (msg.payload[i].state = "on")

w atrybucie “contact” jest odwrotna logika :slight_smile: “true” oznacz zamknięte.

Dopiero teraz udało mi się naprawić błąd i wszystko działa jak potrzeba. Oczywiście logika jest odwrotna więc trzeba zamienić to na on. Ale to nie to wszystko. Najważniejszy element w nodzie funkcji to podwójny znak =

if (msg.payload[i].state == "on")

Nie jestem specjalistą od NodeRed dlatego tak długo zeszło mi ze znalezieniem przyczyny. Jeżeli miałem tylko jeden znak = to funkcja działała w następujący sposób. Znajdowała encje, których nawza zawierała OKNO i zmieniała ich stan w payload na to co miałem umieszczone w cudzysłowiu
Np. taki kod:

 if (msg.payload[i].state = "Jasna_cholera")

Dawał następujący rezultat:
Zrzut ekranu 2022-02-23 145416

Masz rację mój błąd jeden znak = podstawia wartość do zmiennej atrybutu. Sorki za zamieszanie.

Nie ma problemu. Przynajmniej czegoś się nauczyłem :+1:

1 Like