Powiadomienia
Wyczyść wszystko

Domoticz - Przepływ wody

11 Wpisów
2 Użytkownicy
0 Likes
997 Wyświetleń
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

Proszę o sprawdzenie skryptu do przeliczania przepływu na podstawie licznika Tasmoty. Tasmota liczy impulsy przepływomierza i co 60 sekund wysyła wartość do Domoticza na IDX Custom Sensor (testowalem też Counter) resetująć lokalny licznik.

 

Domoticz - urządzenia:

IDX: 103, Nazwa: Przeplyw_Domoticz, Podtyp: Custom Sensor, Jednostka: [impulsy/min]

IDX: 124, Nazwa: Przeplyw_Domoticz, Podtyp: Waterflow, Jednostka: [l/min]

IDX: 125, Nazwa: Przeplyw_Domoticz2, Podtyp: Custom Sensor, Jednostka: [l/h]

 

 

Reguła 1:

return {
on = {
devices = {
103
}
},
execute = function(domoticz, device)
domoticz.devices(124).updateWaterflow(((domoticz.devices(103).flow / 60) + 8 / 6) - 80)
end
}

Error LOG:

2022-08-15 14:50:03.734 Status: dzVents: Info: Handling events for: "Pompa_Przeplyw_Pulse", value: "340;1"
2022-08-15 14:50:03.734 Status: dzVents: Info: ------ Start internal script: Przeplyw: Device: "Pompa_Przeplyw_Pulse (Virtual)", Index: 103
2022-08-15 14:50:03.735 Status: dzVents: Debug: Processing device-adapter for Przeplyw_Domoticz: Waterflow device
2022-08-15 14:50:03.735 Status: dzVents: Info: ------ Finished Przeplyw
2022-08-15 14:50:03.735 Status: dzVents: !Info: Debug: Writing module summary to usunięty link
2022-08-15 14:50:03.735 Error: dzVents: Error: (3.1.8) An error occurred when calling event handler Przeplyw
2022-08-15 14:50:03.735 Error: dzVents: Error: (3.1.8) ... usunięty link : attempt to perform arithmetic on a nil value (field 'flow'

 

 

Reguła 2A - updateWaterflow:

return {
on = {
devices = {'Pompa_Przeplyw_Pulse'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "Przeplyw Liczony"
},
execute = function(dz, device)
local pulsy = dz.devices('Pompa_Przeplyw_Pulse').state
local przeplyw = dz.devices('Przeplyw_Domoticz')
-- Obliczenia
local przeplyw_liczony = (((((pulsy / 60) + 8) / 6) * 60) - 80)
przeplyw.updateWaterflow(przeplyw_liczony)
dz.log('przeplyw pompy' .. l usunięty link  'przeplyw ' , dz.LOG_INFO)

end
}

 

Error LOG:

2022-08-15 14:52:03.731 Status: dzVents: Debug: - Device: Pompa_Przeplyw_Pulse
2022-08-15 14:52:03.742 Status: dzVents: Info: Handling events for: "Pompa_Przeplyw_Pulse", value: "8177;1"
2022-08-15 14:52:03.742 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Przeplyw_Pulse (Virtual)", Index: 103
2022-08-15 14:52:03.743 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz: Waterflow device
2022-08-15 14:52:03.743 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 14:52:03.743 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to usunięty link
2022-08-15 14:52:03.743 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 14:52:03.743 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:13: attempt to perform arithmetic on a string value (local 'pulsy')

 

 

Reguła 2B - updateCustomSensor

return {
on = {
devices = {'Pompa_Przeplyw_Pulse'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "Przeplyw Liczony"
},
execute = function(dz, device)
local pulsy = dz.devices('Pompa_Przeplyw_Pulse')
local przeplyw = dz.devices('Przeplyw_Domoticz2')
-- Obliczenia
local przeplyw_liczony = (((((pulsy / 60) + 8) / 6) * 60) - 80)
przeplyw.updateCustomSensor(przeplyw_liczony)
dz.log('przeplyw pompy' .. l usunięty link  'przeplyw ' , dz.LOG_INFO)

end
}

 

Error LOG:

2022-08-15 14:58:04.113 Status: dzVents: Debug: - Device: Pompa_Przeplyw_Pulse
2022-08-15 14:58:04.124 Status: dzVents: Info: Handling events for: "Pompa_Przeplyw_Pulse", value: "8101;1"
2022-08-15 14:58:04.124 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Przeplyw_Pulse (Virtual)", Index: 103
2022-08-15 14:58:04.125 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz2: Custom sensor device adapter
2022-08-15 14:58:04.125 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 14:58:04.125 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to usunięty link
2022-08-15 14:58:04.125 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 14:58:04.125 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:13: attempt to perform arithmetic on a table value (local 'pulsy')

 

Z góry dzękuję za pomoc .

Pozdrawiam,

Jarek

 

 

 

 
Dodane : 15/08/2022 3:00 pm
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

W wersji 2A zmień wiersz 

Dodane przez: @sonda1975

local pulsy = dz.devices('Pompa_Przeplyw_Pulse').state

Na 

local pulsy = tonumber(dz.devices('Pompa_Przeplyw_Pulse').state)

dalszej matematyki nie kumam więc nie sprawdzę 

 
Dodane : 15/08/2022 3:53 pm
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

Witam,

 

Jak kolwiek kombinuję ciagle to samo:

Opcja 1

return {
on = {
devices = {'Pompa_Impulsy'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "Przeplyw Liczony"
},
execute = function(dz, device)
local przeplyw = dz.devices('Przeplyw_Domoticz2') --nazwa virtualnego licznika
--local impulsy = dz.utils.stringSplit('Pompa_Impulsy',convertNumber) -- impulsy na minute z Tasmota
local impulsy = tonumber(dz.devices('Pompa_Impulsy')) -- impulsy na minute z Tasmota

-- Obliczenia
local przeplyw_liczony = ((((( impulsy / 60) + 8) / 6) * 60) - 80)
dz.devices(przeplyw).updateCustomSensor(przeplyw_liczony)
dz.log('przeplyw pompy' .. l usunięty link  'przeplyw ' , dz.LOG_INFO)

end
}

ERROR LOG

2022-08-15 16:42:04.067 Status: dzVents: Info: Handling events for: "Pompa_Impulsy", value: "8356;1"
2022-08-15 16:42:04.068 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Impulsy (Virtual)", Index: 129
2022-08-15 16:42:04.068 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz2: Custom sensor device adapter
2022-08-15 16:42:04.068 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 16:42:04.068 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to usunięty link
2022-08-15 16:42:04.068 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 16:42:04.068 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:15: attempt to perform arithmetic on a string value (local 'impulsy')

 

Opcja 2

rreturn {
        on = {
                devices = {'Pompa_Impulsy'}
        },
     logging = {
                level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
                marker = "Przeplyw Liczony"
             },    
        execute = function(dz, device)
		local przeplyw = dz.devices('Przeplyw_Domoticz2') --nazwa virtualnego licznika
		--local impulsy = dz.utils.stringSplit('Pompa_Impulsy',convertNumber) -- impulsy na minute z Tasmota
		local impulsy = dz.devices('Pompa_Impulsy').state -- impulsy na minute z Tasmota (tonumber())
		
		-- Obliczenia
	    local przeplyw_liczony =  ((((( impulsy / 60) + 8) / 6) * 60) - 80)
	    dz.devices(przeplyw).updateCustomSensor(przeplyw_liczony)
	    dz.log('przeplyw pompy' .. l usunięty link  'przeplyw ' , dz.LOG_INFO)
	
end
}

 

ERROR LOG

2022-08-15 16:49:04.023 Status: dzVents: Debug: - Device: Pompa_Impulsy
2022-08-15 16:49:04.034 Status: dzVents: Info: Handling events for: "Pompa_Impulsy", value: "8432;1"
2022-08-15 16:49:04.034 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Impulsy (Virtual)", Index: 129
2022-08-15 16:49:04.035 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz2: Custom sensor device adapter
2022-08-15 16:49:04.035 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 16:49:04.035 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to usunięty link
2022-08-15 16:49:04.035 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 16:49:04.035 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:15: attempt to perform arithmetic on a string value (local 'impulsy')

 

OPCJA 3

return {
on = {
devices = {'Pompa_Impulsy'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "Przeplyw Liczony"
},
execute = function(dz, device)
local przeplyw = dz.devices('Przeplyw_Domoticz2') --nazwa virtualnego licznika
local impulsy = dz.utils.stringSplit('Pompa_Impulsy',convertNumber) -- impulsy na minute z Tasmota
--local impulsy = dz.devices('Pompa_Impulsy').state -- impulsy na minute z Tasmota (tonumber())

-- Obliczenia
local przeplyw_liczony = ((((( impulsy / 60) + 8) / 6) * 60) - 80)
dz.devices(przeplyw).updateCustomSensor(przeplyw_liczony)
dz.log('przeplyw pompy' .. l usunięty link  'przeplyw ' , dz.LOG_INFO)

end
}

ERROR LOG

2022-08-15 16:51:03.796 Status: dzVents: Debug: - Device: Pompa_Impulsy
2022-08-15 16:51:03.807 Status: dzVents: Info: Handling events for: "Pompa_Impulsy", value: "8278;1"
2022-08-15 16:51:03.807 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Impulsy (Virtual)", Index: 129
2022-08-15 16:51:03.808 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz2: Custom sensor device adapter
2022-08-15 16:51:03.808 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 16:51:03.808 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to usunięty link
2022-08-15 16:51:03.808 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 16:51:03.808 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:15: attempt to perform arithmetic on a table value (local 'impulsy')

 

Dzękuję za pomoc.

Pozdrawiam,

Jarek

 
Dodane : 15/08/2022 4:54 pm
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 
Dodane przez: @sonda1975

IDX: 103, Nazwa: Przeplyw_Domoticz, Podtyp: Custom Sensor, Jednostka: [impulsy/min]

IDX: 124, Nazwa: Przeplyw_Domoticz, Podtyp: Waterflow, Jednostka: [l/min]

Nie mogą być dwa czujniki z tą samą nazwą . Który ma być brany pod uwagę ? 

Dodatkowo w żadnej wersji nie widzę prawidłowej konwersji ciągu znaków na liczbę całkowitą . Podałem jak ma to wyglądać.

Nie można zrobić działań matematycznych na ciągu znaków 200 impulsów/min 

 
Dodane : 15/08/2022 6:36 pm
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

Mój błąd

Jeśli wszystko na CustomSensor to:

IDX: 103, Nazwa: Pompa_Przeplyw_Pulse, Podtyp: Custom Sensor, Jednostka: [impulsy/min]

IDX: 125, Nazwa: Przeplyw_Domoticz2, Podtyp: Custom Sensor, Jednostka: [l/h]]

 

A jeśli WaterFlow to

IDX: 103, Nazwa: Pompa_Przeplyw_Pulse, Podtyp: Custom Sensor, Jednostka: [impulsy/min]

IDX: 124, Nazwa: Przeplyw_Domoticz, Podtyp: Waterflow, Jednostka: [l/min]

 

 

 
Dodane : 15/08/2022 6:53 pm
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

@isom 

Niestety efekt ten sam. Zawziąłem się a to czasami się nie opłaca.

Zrobiłem ten przepływ poprzez zasadę w samej Tasmocie. Moduł ESP32 liczy to zgodnie ze wzorem przepływomierza w cyklu 60 sekundowym,  co daje l/min, więc chyba sobie odpuszczę Skrypt.

Następna wersja:

return {
        on = {
                devices = {'Pompa_Przeplyw_Pulse'}
        },
     logging = {
                level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
                marker = "Przeplyw Liczony"
             },    
        execute = function(dz, device)
		local przeplyw = dz.devices('Przeplyw_Domoticz2') --nazwa virtualnego licznika
		local impulsy = tonumber(dz.devices('Pompa_Przeplyw_Pulse').state) -- impulsy na minute z Tasmota (tonumber())
		
		-- Obliczenia
	    local przeplyw_liczony =  ((((( impulsy / 60) + 8) / 6) * 60) - 80)
	    dz.devices(przeplyw).updateCustomSensor(przeplyw_liczony)
	    dz.log('przeplyw pompy' .. l/h.. 'przeplyw ' , dz.LOG_INFO)
	
end
}

 

ERROL LOG

2022-08-15 19:03:05.115 Status: dzVents: Debug: Event triggers:
2022-08-15 19:03:05.115 Status: dzVents: Debug: - Device: Pompa_Przeplyw_Pulse
2022-08-15 19:03:05.126 Status: dzVents: Info: Handling events for: "Pompa_Przeplyw_Pulse", value: "8501;1"
2022-08-15 19:03:05.126 Status: dzVents: Info: Przeplyw Liczony: ------ Start internal script: Przeplyw v2: Device: "Pompa_Przeplyw_Pulse (Virtual)", Index: 103
2022-08-15 19:03:05.127 Status: dzVents: Debug: Przeplyw Liczony: Processing device-adapter for Przeplyw_Domoticz2: Custom sensor device adapter
2022-08-15 19:03:05.127 Status: dzVents: Info: Przeplyw Liczony: ------ Finished Przeplyw v2
2022-08-15 19:03:05.127 Status: dzVents: !Info: Przeplyw Liczony: Debug: Writing module summary to /home/pi/domoticz/scripts/dzVents/module.log
2022-08-15 19:03:05.127 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: An error occurred when calling event handler Przeplyw v2
2022-08-15 19:03:05.127 Error: dzVents: Error: (3.1.8) Przeplyw Liczony: ...moticz/scripts/dzVents/generated_scripts/Przeplyw v2.lua:14: attempt to perform arithmetic on a nil value (local 'impulsy')

 

Komentarz.

Tasmota liczy impulsy z przepływomierza i co 60 sekund wysyła tą wartość pod IDX 103 (Custom sensor 'Pompa_Przeplyw_Pulse') i jednocześnie resetując licznik, co daje wartość chwilową =  ilość impulsów / min. Wartośc ta podzielona przez 60 daje impulsy na sekundę, czyli czestotliwośc [F].

Domoticz otrzymuje co 60 sekund dla przykładu wartośc = 10000 impulsów, co daje częstotliwosc 167 Hz (=10000/60). Wzór na przepływ: Q=(F+8)/6 [l/m] lub Q=(((F+8)/6)*60)-80 [l/h]. 80 to wartośc stała dająca przepływ zerowy przy F=0.

 

Dziękuję,

 

 
Dodane : 15/08/2022 7:11 pm
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@sonda1975 weź sobie skoro się tak uparłeś podstaw swoje nazwy do tego co poniżej, to oczywiście nie ma sensu bo dzielę wartość impulsów przez dwa ale zobacz foto

1
return 
{
on = 
{
devices = { 'Impulsy'}
}, 
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
 marker = "Licznik "
}, 
execute = function(dz, devices)
local przeplyw = dz.devices('Przepływ') -- nazwa wirtualnego licznika przepływu  litry / min
local licznik=tonumber(dz.devices('Impulsy').state) -- nazwa licznika tasmota
local oblicz = licznik/2
przeplyw.updateCustomSensor(oblicz) -- wysłanie obliczonego przepływu do wirtualnego przepływomierza
end
}
 
Dodane : 15/08/2022 8:35 pm
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

@isom

 

Moge jeszcze prosić o typ zastosowanego sensora virtualnego dla zmiennej "licznik"? Pytam, bo error jest ten sam, więc musi to być problem z typem zastosowanego u mnie wirtualnego licznika przepływu.

 

Dziękuję,

 

 

 
Dodane : 15/08/2022 8:50 pm
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 
Dodane przez: @sonda1975

Moge jeszcze prosić o typ zastosowanego sensora virtualnego dla zmiennej "licznik"? Pytam, bo error jest ten sam, więc musi to być problem z typem zastosowanego u mnie wirtualnego licznika przepływu.

 

1
2
 
Dodane : 15/08/2022 8:54 pm
sonda1975
(@sonda1975)
Wpisów: 6
Bywalec
Autor tematu
 

@isom  Więc, zrobiłem mały test z prostym skryptem zamiany jednostki przepływu z l/m na l/h. Chciałem mieć poprawną jednostkę przepływu w w litrach na godzinę a nie jak standartowo oferuje Domoticz (wersja 2022.1)  dla sensora wirtualnego Waterflow litrach na minutę.

Skrypt ma po prostu pobierać wartość IDX 131 i wprost podstawiać ją za IDX 134 w celu wyświertlania poprawnej jednostki l/h

IDX:

  • 131 - SubTyp: Waterflow, wymyszony przez Domoticz na  l/min, ale tak naprawdę l/h bo wyliczany jest przez sam moduł Tasmota i wysyłany komędą: publish domoticz/in {"idx":131,"svalue":"%mem3%;1"} już przeliczony w litrach na godzinę.
  • 134 - SubTyp: Custom sensor z opisem jednostki l/h.

 

Działająca wersja - konversja jednostki l/m >>> l/h

return {
on = {devices = { 131}}, 
logging = {level = domoticz.LOG_ERROR, -- zmien na domoticz.LOG_ERROR, LOG_DEBUG gdy skrypt bedzie Ok
marker = "Przeplyw"}, 
execute = function(dz, devices)
    local przeplyw = dz.devices(134) -- nazwa wirtualnego licznika przepływu  litry / min
    local licznik=tonumber(dz.devices(131).flow) -- nazwa licznika tasmota
    local oblicz = licznik
przeplyw.updateCustomSensor(oblicz) -- wysłanie obliczonego przepływu do wirtualnego przepływomierza
end
    }

Zwracam uwagę na parametr 'flow" zmiennej 'licznik' bez którego skrypt przestaje działac.

Wkrypt się wywala gdy:

  • brak parametru "flow' dla zmiennej 'licznik' lub jakakolwiej zamiana na 'state" skutkuje brakiem ["sValue"]=(przeliczona wartośc).
    Bez parametr

    Z parametr

 

Dziękuję za odpowiedz,

 

 

 
Dodane : 16/08/2022 10:04 am
isom
 isom
(@isom)
Wpisów: 5084
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@sonda1975 zupełnie nie rozumiem problemu, może przenieś kolego swoje doświadczenia do tematów związanych z domoticz/ zdarzenia, bo to już mocno odbiega od szybkiego pytania. Najlepiej nowy wątek . Co do jednostek w customsensor to nie mają one zupełnie znaczenia. Przykład poniżej dla czujnika Waterflow , który aktualizuje czujnik CustomSensor

1
Dodane przez: @sonda1975

local licznik=tonumber(dz.devices(131).flow) -- nazwa licznika tasmota

Tu nie potrzeba "tonumber" , bo w czujniku przepływu wartość jest liczbą a dpisek .flow mówi nam w jakich to jest jednostkach, taki wpis ma zastosowanie przy CustomSensor gdzie mamy doczynienia z ciągiem znaków na dodatek dowolnie konfigurowanym przez użytkownika

 
Dodane : 16/08/2022 11:14 am
Udostępnij: