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 Reactions
905 Wyświetleń
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 : 26/05/2023 11:16 pm
(@mig41)
Wpisów: 627
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 8:00 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
Autor tematu
 

@mig41 

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

 
Dodane : 27/05/2023 10:09 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 10:15 am
(@mig41)
Wpisów: 627
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 11:51 am
isom
 isom
(@isom)
Wpisów: 5208
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 1:15 pm
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 7:45 pm
(@mig41)
Wpisów: 627
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 8:29 pm
isom
 isom
(@isom)
Wpisów: 5208
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 9:12 pm
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 12:06 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 9:46 am
isom
 isom
(@isom)
Wpisów: 5208
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 9:59 am
wojtek_gtx reacted
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
Autor tematu
 

@isom

aaa oki 😉

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

 
Dodane : 28/05/2023 10:03 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 6:47 am
isom
 isom
(@isom)
Wpisów: 5208
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 7:29 am
wojtek_gtx
(@wojtek_gtx)
Wpisów: 540
Ekspert Patron Strony Donator 2K19, Donator 2K20, Donator 2K21, Donator 2K22, Donator 2K24, Donator 2K25
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 10:32 pm
Udostępnij: