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:
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:
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:
Z góry dzękuję za pomoc .
Pozdrawiam,
Jarek
W wersji 2A zmień wiersz
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ę
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
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
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
Dzękuję za pomoc.
Pozdrawiam,
Jarek
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
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]
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
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ę,
@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
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 }
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ę,
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.
@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).
Dziękuję za odpowiedz,
@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
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