UWAGA: Strona oraz Forum Smart'ny Dom nie będzie dostępne 23 Grudnia 2024 ze względu na przenoszenie serwisu na mocniejszą maszynę.
W tym czasie polecam poświęcenie swojego czasu na pomoc partnerowi w przygotowaniu udanych Świąt 😉
Za niedogodności z góry przepraszam, admin
Witam
Posiadam czujnik jakości powietrza który odczytuje mi wartości PM
Do ESP mam dopięte 3 LED-y, czerwona, zielona, niebieska.
Chciałbym przy jakiś wartościach odczytu PM aby w danych zakresach zapalał się konkretny kolor LED
Miałem to zrobione w Domoticz dzięki życzliwości kolegi @isom przez dzvents ale przesiadłem się na HA i muszę to ogarnąć za pomocą node red .
Pomożecie mi to ogarnąć
tak zrobiłem ale nie działa za bardzo
W Domoticz miałem takie coś :
return { on = { timer = {'between 05:30 and 22:29' , 'at 22:30'}, --czas dzialania oraz czas wylaczenia LED-ow }, execute = function(dz, item) --nazwy urzadzen w nawiasie nazwy z domoticz-a local PM10=tonumber(dz.devices('Pm 10').state) local PM25=tonumber(dz.devices('Pm 2.5').state) local czerwona=dz.devices('Czerwony') local zielona=dz.devices('Zielony') local niebieski=dz.devices('Niebieski') local alert=dz.devices('Stan Powietrza') -- alert sensor do wizualizacji if dz.time.matchesRule('between 05:30 and 22:29') then -- czas uruchamiania skryptu if (PM10<=21 or PM25<=12) then czerwona.switchOff() niebieski.switchOn() zielona.switchOff() alert.updateAlertSensor(1 , 'Bardzo Dobre Powietrze') dz.log('Stan Super') end if ((PM10>21 and PM10<=60) or (PM25>12 and PM25<=36)) then czerwona.switchOff() niebieski.switchOff() zielona.switchOn() alert.updateAlertSensor(1 , 'Dobra jakość Powietrza') dz.log('Stan OK') end if ((PM10>60 and PM10<=140) or (PM25>36 and PM25<=84)) then czerwona.switchOn() niebieski.switchOff() zielona.switchOn() alert.updateAlertSensor(2 , 'Średnia jakość powietrza') dz.log('Słabo') end if (PM10>140 or PM25>84) then czerwona.switchOn() niebieski.switchOff() zielona.switchOff() alert.updateAlertSensor(4 , 'Nie polecam spaceru') dz.log('Do Bani') end elseif dz.time.matchesRule('at 22:30') then -- ustawienie skryptu do uspienia LED niebieski.switchOff() czerwona.switchOff() zielona.switchOff() alert.updateAlertSensor(0 , 'Noc brak wskazań LED') dz.log('Nie aktywne bo jest noc') end end }
To może Cię wskaźnik Gauge zainteresuje : https://www.home-assistant.io/dashboards/gauge/
Ustawiasz tylko wartości , przy jakich jest zielony , przy jakich żółty a przy jakich czerwony , i Ci to wyświetla...
EDIT: Ok , teraz doczytałem ,że chodzi o fizyczne ledy w esp....
Najprościej w nodzie function z ustawionymi trzema (lub z czterema dla niebieskiej) wyjściami...
node function to już dla mnie wyższa szkoła jazdy - tam już trzeba ogarniać programowanie
Miałem też brane pod uwagę brane dwa odczyty PM10 i PM2.5 or / and jak to połączyć
Ten przykład w Node-Red to mój wymysł, myślałem że tak coś się da zrobić ale ...
Dobra , to weź wstaw TU kod tego twojego przepływu .
Z tego co mi się wydaje , to kolejne "przejście" powinno iść od góry...
Ten przykład w Node-Red to mój wymysł
Tak to będzie trudno, @mig41 dobrze podpowiada, na wstępie warto wartości PM2.5 - 10 zapisywać do zmiennych flow potem w nodzie funkcji odczytujesz wartości tych zmiennych i sprawdzasz podobnie jak w skrypcie dzVents.
Masz tu przykład dla dwóch wyjść z funkcji , na zasadzie porównawczej możesz to rozbudować na dowolną ilość wyjść
[{"id":"260bc51089277df0","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"22a3fe7f991c061d","type":"inject","z":"260bc51089277df0","name":"5:00 do 23:00","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/2 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":140,"wires":[["5a28be956004565f"]]},{"id":"fb8fe3dea34ea244","type":"function","z":"260bc51089277df0","name":"Kiedy i co włączyć ","func":"let pm1 = flow.get('pm10');\nlet pm2 = flow.get('pm2');\n\nif ((pm1 > 21) && (pm1 < 60) || (pm2 > 12) && (pm2 <= 36)){\n msg.payload = \"1\";\n return [msg, null];\n}\n\nif ((pm1 > 60) && (pm2 > 36)) {\n msg.payload = \"1\";\n return [null, msg];\n}\n\n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":140,"wires":[["cb9d66ea09eebeaf"],["6fdc1ee9955afdd1"]]},{"id":"5a28be956004565f","type":"api-current-state","z":"260bc51089277df0","name":"PM 10","server":"1a9033b6.071e8c","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"pm10","propertyType":"flow","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":350,"y":140,"wires":[["de68d384c0e4bf9e"]]},{"id":"de68d384c0e4bf9e","type":"api-current-state","z":"260bc51089277df0","name":"PM 2","server":"1a9033b6.071e8c","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"pm2","propertyType":"flow","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":510,"y":140,"wires":[["fb8fe3dea34ea244"]]},{"id":"cb9d66ea09eebeaf","type":"debug","z":"260bc51089277df0","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":100,"wires":[]},{"id":"6fdc1ee9955afdd1","type":"debug","z":"260bc51089277df0","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":180,"wires":[]},{"id":"1a9033b6.071e8c","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false}]
to tu w nodzie function muszę dopisać dalsze zależności (zakresy) ?
a jak podłączyć nod call service od danej diody (danego koloru) czy muszę w nodzie function dołożyć jeszcze dwa outputs, tylko skąd skrypt by miał wiedzieć którym ma wyjść i czy ma trafić do call service on czy off
Podpisałem moje mqtt oraz czujniki PM10 i PM2.5 ale w debug nic się nie pojawia
Tak , w node function trzeba przepisać zależności , ustawić wyjścia w zależności od kolorów ( to trzy wyjścia) , a możesz nawet od stanów ( sześć wyjść) . Wszystko zależy jak to sobie napiszesz. Może dałoby się ustawiać wszystko jednym uniwersalnym wyjściem ... Kwestia wiedzy i umiejętności.
Proponuję sześć wyjść ... Najprościej będzie zrozumieć. Tutaj jest jak się podaje wiadomości na poszczególne wyjścia: https://nodered.org/docs/user-guide/writing-functions
Podpisałem moje mqtt oraz czujniki PM10 i PM2.5 ale w debug nic się nie pojawia
A dodałeś waruniki z mniejszymi wartościami ? Obecnie jakość powietrza jest bardzo dobra, a dwa przykładowe wyjścia z noda funkcji nie spełniają obecnych warunków, dlatego nie otrzymałeś nic na wyjściu.
Masz tu trzy wyjścia i zapewne z trzeciego w debug otrzymasz wiadomość "zielony" , więc do tego wyjścia podpinasz ON zielony i OFF pozostałe
[{"id":"260bc51089277df0","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"22a3fe7f991c061d","type":"inject","z":"260bc51089277df0","name":"5:00 do 23:00","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/2 5-22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":140,"wires":[["5a28be956004565f"]]},{"id":"fb8fe3dea34ea244","type":"function","z":"260bc51089277df0","name":"Kiedy i co włączyć ","func":"let pm1 = flow.get('pm10');\nlet pm2 = flow.get('pm2');\n\nif ((pm1 > 21) && (pm1 < 60) || (pm2 > 12) && (pm2 <= 36)){\n msg.payload = \"niebieski\";\n return [msg, null, null];\n}\n\nif ((pm1 > 60) && (pm2 > 36)) {\n msg.payload = \"czerwony\";\n return [null, msg, null];\n}\n\nif ((pm1 < 21) && (pm2 < 12)) {\n msg.payload = \"zielony\";\n return [null,null, msg];\n}\n","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":140,"wires":[["cb9d66ea09eebeaf"],["6fdc1ee9955afdd1"],["c842ee2944ea7233"]]},{"id":"5a28be956004565f","type":"api-current-state","z":"260bc51089277df0","name":"PM 10","server":"1a9033b6.071e8c","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.pm_10","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"pm10","propertyType":"flow","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":350,"y":140,"wires":[["de68d384c0e4bf9e"]]},{"id":"de68d384c0e4bf9e","type":"api-current-state","z":"260bc51089277df0","name":"PM 2","server":"1a9033b6.071e8c","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.pm2_5","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"pm2","propertyType":"flow","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":510,"y":140,"wires":[["fb8fe3dea34ea244"]]},{"id":"cb9d66ea09eebeaf","type":"debug","z":"260bc51089277df0","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":80,"wires":[]},{"id":"6fdc1ee9955afdd1","type":"debug","z":"260bc51089277df0","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":160,"wires":[]},{"id":"c842ee2944ea7233","type":"debug","z":"260bc51089277df0","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":940,"y":240,"wires":[]},{"id":"1a9033b6.071e8c","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false}]
Dziękuje coś zadziałało, akurat czujnik u mnie wykrył pm10 - 21 a pm2.5 - 20 więc zapaliło LED na niebiesko - mam skonfigurowane w Node RED LEDy jako call service, ustawioną mam encję, domain - switch, service - turn_on więc Led się zaświecił. Jak dopiąć wyłącznik tego LEDa jak odczyt jest inny, wyłącznik mam skonfigurowany domain - switch, service - turn_off ?
Tak teraz myślę żeby wyłączać to trzeba dołożyć kolejne wyjścia i po każdym "if" dopisać "else" ?
Nie za bardzo takie tematy ogarniam
@wojtek_gtx napisałem jak to ustawić, trzeba tylko czytać
podpinasz ON zielony i OFF pozostałe
A tak to ma wyglądać dla dwóch wyjść, trzecie raczej oczywiste
Cały przepływ odpala się między 5 a 23 interwał ma co 2 min ale co później i kombinuję co mam tu jeszcze dostawić żeby od 23 do 5 rano wszystkie LED były wyłączone bo teraz zostają włączone na ostatnim odczycie
Nod inject + trzy call service trzeba sobie dodać, albo jak to problem, można załonić gazetą 🙂
Zrobione pierwszym sposobem poddanym przez ciebie, kurde dla mnie ten NodeRed to jedna wielka zagadka i nie szukam prostych rozwiązań tylko tych najbardziej zagmatwanych 😉 jeszcze raz dziękuje