Czujnik jakości pow...
 
Powiadomienia
Wyczyść wszystko

Czujnik jakości powietrza PMS5003 z LED i sterowanie w Node-Red

16 Wpisów
3 Użytkownicy
1 Likes
564 Wyświetleń
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

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ąć

jako

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
}

 

 
Dodane : 27/05/2023 12:16 am
(@mig41)
Wpisów: 615
Ekspert
 

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...

 
Dodane : 27/05/2023 9:00 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

@mig41 

node function to już dla mnie wyższa szkoła jazdy - tam już trzeba ogarniać programowanie

 
Dodane : 27/05/2023 11:09 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

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 ...

 
Dodane : 27/05/2023 11:15 am
(@mig41)
Wpisów: 615
Ekspert
 

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...

 

 
Dodane : 27/05/2023 12:51 pm
isom
 isom
(@isom)
Wpisów: 5086
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Dodane przez: @wojtek_gtx

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}]
 
Dodane : 27/05/2023 2:15 pm
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

@isom 

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

 
Dodane : 27/05/2023 8:45 pm
(@mig41)
Wpisów: 615
Ekspert
 

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

 
Dodane : 27/05/2023 9:29 pm
isom
 isom
(@isom)
Wpisów: 5086
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Dodane przez: @wojtek_gtx

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}]
 
Dodane : 27/05/2023 10:12 pm
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

@isom 

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 ?

 
Dodane : 28/05/2023 1:06 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

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

 
Dodane : 28/05/2023 10:46 am
isom
 isom
(@isom)
Wpisów: 5086
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@wojtek_gtx napisałem jak to ustawić, trzeba tylko czytać

Dodane przez: @isom

podpinasz ON zielony i OFF pozostałe

A tak to ma wyglądać dla dwóch wyjść, trzecie raczej oczywiste

3

 

 
Dodane : 28/05/2023 10:59 am
wojtek_gtx reacted
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

@isom

aaa oki 😉

Nie tylko w temacie Domoticz dajesz radę, dziękuję

 
Dodane : 28/05/2023 11:03 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

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 

 
Dodane : 01/06/2023 7:47 am
isom
 isom
(@isom)
Wpisów: 5086
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Nod inject + trzy call service trzeba sobie dodać, albo jak to problem, można załonić gazetą 🙂

 
Dodane : 01/06/2023 8:29 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 538
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24
Autor tematu
 

@isom 

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

 
Dodane : 05/06/2023 11:32 pm
Udostępnij: