Witam,
od blisko tygodnia walczę z kilkoma skryptami DzVents dla mojego systemiku (konkretnie teraz z ciepłomierzem).
Chciałbym mieć pewność ,że dobrze rozumiem zasady.
1.w zdarzeniach wybieram skrypt dzvents w danej funkcji (np device , timer, itp)
2.po otwarciu w/w skryptu mam przykładowy zapis danej funkcji
3.na domoticz wiki są szczegółowe opisy co i jak , i tu mam problem tj nie jestem pewien jak to rozumieć
Isom już mi wyjaśnił ,że jeśli mam urządzenia typu custosensor , to nie mogę robić sobie operacji na ich danych w sposób bezpośredni.
Trzeba takie urządzenie przyporządkować do nowego wirtualnego urządzenia (czy to są zmienne?) , aby działać na wyświetlanych danych.
Próbowałem na kilku przykładach z naszego forum i niestety nic nie działa.
Przypuszczam ,że jest kilka problemów :
-w timerze wpisałem czas odświeżania co 5 sek (nie wyrzuca błędu) , a na wiiki znalazłem minimalny co minutę
-moje urządzenia w domoticzu mają duże litery i spacje. Czy to przeszkadza w skryptach ?
Oto przykład -mam np odczyt z licznika energii (customsensor) fazy L1
idx 42 nazwa PC nap L1 , wartość przekształcona np idx 120 nazwa test
Chciałbym zrobić odczyt co minutę i wykonać przykładową operację matematyczną tj pomnożyć x 60 . Posłużę się skryptem Isoma na przepływ :
return
{
on =
{
timer = { 'every minute'}
},
data = {
dane =
{
initial = {},
},
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_DEBUG, gdy skrypt bedzie Ok
marker = "Licznik wody"
},
execute = function(dz, item)
local factor = 1 -- ustaw wartosc zgodna z twoim licznikiem wartosc 1 to 1 do 1
local przeplyw = dz.devices('Przepływ woda') -- nazwa wirtualnego licznika litry / min
local licznik = dz.devices('Licznik wody') -- obecny licznik w m3
local daneTotal = licznik.counterToday * factor -- aktualizacja "data" z danych dziennych licznika * przelicznik w tym wypadku 1 do 1
if dz.data.dane.total ~= nil then -- pierwszy odczyt nie aktualizuje przepływomierza
przeplyw.cancelQueuedCommands()
local historia = dz.data.dane.lastTime - dz.time.dDate
local aktualprzeplyw = ( daneTotal - dz.data.dane.total ) * 60 / math.max(historia,60) -- litry / min
przeplyw.updateWaterflow(aktualprzeplyw)
przeplyw.updateWaterflow(0).afterMin(10) -- brak nowych danych resetuje licznik po czasie afterMin
end
dz.data.dane.total = daneTotal
dz.data.dane.lastTime = dz.time.dDate
end
}
Jakie nazwy będą odpowiednikiem dla w/w skryptu :
-dane/test ?
-Licznik wody/PC nap L1 ?
-czym są local i do czego służą ?
Czy może mi ktoś wyjaśnić które parametry są dla mnie w tym skrypcie-a może najłatwiej będzie mi zatrybić na tym moim konkretnym przykładzie (proszę o zmianę skryptu wyjściowego).
Mam nadzieję ,że mi to wyjaśnicie-może i ciężko łapię , ale jak już zaciągnę to idę jak czołg...
Pzdr
Isom już mi wyjaśnił ,że jeśli mam urządzenia typu custosensor , to nie mogę robić sobie operacji na ich danych w sposób bezpośredni.
Trzeba takie urządzenie przyporządkować do nowego wirtualnego urządzenia (czy to są zmienne?) , aby działać na wyświetlanych danych.
Proszę !!! Nie przekłamuj rzeczywistości i nie pisz więcej do mnie prywatnie , bo widzę,że wszystko krew w piach :))
Podałem przykład skryptu w którym pomagałem koledze z forum i pokazałem jak dokonać konwersji czujnika CustomSensor żeby wykonać działania matematyczne
https://www.smartnydom.pl/forum/domoticz-reguly/zamiana-stanu-licznika-w-m3-na-przeplyw/#post-17466
local licznik=tonumber(dz.devices('Licznik wody').state)
Tak trudno to odnaleźć i przeczytać cały temat ?
Co do local , to cztery razy tłumaczyłem na przykładach , w skrypcie można sobie uprościć życie i zamiast za każdym razem używać domoticz.devices('Lampa') można sobie utworzyć local np
local lamp = domoticz.devices('Lampa')
i dalej w skrypcie używamy już samego "lamp" bo system wie z czym ma do czynienia .
Timer nie może być mniejszy niż 1 min chyba że użyjemy specjalnych funkcji opisanych na wiki https://www.domoticz.com/wiki/DzVents:_next_generation_Lua_scripting
To by było na tyle z mojej strony
A co z nazwami-mogę mieć duże litery i spacje (w local i w domoticzu ?)
Temat przeczytałem z "wodą"-dwa dni próbowałem zrobić na jego bazie swoje pstryczki...no i nic.
A po za tym to się tak nie wściekaj- poświęciłem trochę czasu , niestety nie załapałem...
Cieszę się ,że Ty i inni tak świetnie łapiecie-bravo !
Ale są jeszcze tacy , którym przychodzi to trudniej...
I tyle...
A czy "Licznik wody" w tym skrypcie , na który się powołujesz nie ma wielkiej litery i spacji ? Takie oczywiste oczywistości prawda ?
Jak nie będziesz kłamał to możne nie będę tak reagował , mam wstawić zrzuty z telefonu ?
Zresztą mówisz o swoim poświęconym czasie, a czyjś czas? i co z tego wynikło ? poświęciłem Ci sporo swojego i prosiłem, chcesz się nauczyć zacznij od podstaw , ale nie , najlepiej czekać na gotowca. Przepraszam że go dla Ciebie nie napisałem i musiałeś tyle czasu zmarnować.
Pytałem o duże litery i spacje , bo na moich wypocinach nie działało-myślałem ,że od tego.
Dlaczego miałbym kłamać ?...Próbowałem kilku przeróżnych kombinacji (tj skryptów )-bez efektu.
Po za tym nie pytam tu o konkretny skrypt dla mnie (tj obliczanie COP , SCOP i itp) tylko o banalny przykład ze zwykłym mnożeniem (nie jest mi potrzebny wynik mnożenia napięcia L1...)- chodzi mi o zrozumienie.
Nie chodzi tu o gotowca dla mnie
Zrobiłem taki test wg skryptu dot przepływomierza :
return
{
on =
{
timer = { 'every minute'}
},
data =
{
test = { initial = {}, },
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_DEBUG, gdy skrypt bedzie Ok
-- marker = "pc nap L3"
},
execute = function(dz, item)
local L2 = dz.devices('dane') -- nazwa wirtualnego licznika przepływu litry / min
local L3=tonumber(dz.devices('pc nap L3').state) -- nazwa licznika wody m3
if dz.data.test ~= nil then -- pierwszy odczyt nie jest brany pod uwagę do obliczeń
L2 = (L3 - dz.data.test) *200 -- obliczanie aktualnego przepływu
dz.devices('dane').update(L2) -- wysłanie obliczonego przepływu do wirtualnego przepływomierza
end
dz.data.test = L3 -- zapammiętanie odczytu z licznika wody
end
}
Błędy takie
W logach jest informacja o błędnej wartości "test" i jest to prawda
test = { initial = {}, }, w dosłownym tłumaczeniu "ustaw wartość początkową dla test na nic " po prostu pusto i to nie jest zero dla jasności
L2 = (L3 - dz.data.test) *200 teraz kolega chce obliczyć co ? Jakaś wartość L3 np 10 - nic x 200
Proszę użyć dowolnej maszyny liczącej i zrobić takie obliczenie 10 - nic x 200 = ?
Najpierw trzeba sprawić żeby to nic zmieniło się na jakąś wartość i jest to ujęte w skrypcie przepływu , tam akurat dzienne wskazanie licznika wody jest mnożone przez factor i to jest wartość którą przyjmuje data.
Wpisałem 1
test = { initial = {1}, },
to samo
PS
nie zauważyłem wpisu o factor
W skrypcie finalnym , który działa nie było zapisów factor. Był w proponowanym-wstawiłem go i tez nic :
return
{
on =
{
timer = { 'every minute'}
},
data =
{
test = { initial = {}, },
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_DEBUG, gdy skrypt bedzie Ok
-- marker = "pc nap L3"
},
execute = function(dz, item)
local factor = 1
local L2 = dz.devices('dane') -- nazwa wirtualnego licznika przepływu litry / min
local L3=tonumber(dz.devices('pc nap L3').state) -- nazwa licznika wody m3
if dz.data.test ~= nil then -- pierwszy odczyt nie jest brany pod uwagę do obliczeń
L2 = (L3 - dz.data.test) *200 -- obliczanie aktualnego przepływu
dz.devices('dane').updatecustomsensor(L2) -- wysłanie obliczonego przepływu do wirtualnego przepływomierza
end
dz.data.test = L3 -- zapammiętanie odczytu z licznika wody
end
}
skrypt oryginalny jako sprawdzony,działający :
return
{
on =
{
timer = { 'every 5 minutes'}
},
data =
{
poprzedniaWoda = { initial = {}, },
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_DEBUG, gdy skrypt bedzie Ok
-- marker = "Licznik wody"
},
execute = function(dz, item)
local przeplyw = dz.devices('Przepływ wody') -- nazwa wirtualnego licznika przepływu litry / min
local licznik=tonumber(dz.devices('Licznik wody').state) -- nazwa licznika wody m3
if dz.data.poprzedniaWoda ~= nil then -- pierwszy odczyt nie jest brany pod uwagę do obliczeń
przeplyw = (licznik - dz.data.poprzedniaWoda) *200 -- obliczanie aktualnego przepływu
dz.devices('Przepływ wody').updateWaterflow(przeplyw) -- wysłanie obliczonego przepływu do wirtualnego przepływomierza
end
dz.data.poprzedniaWoda = licznik -- zapammiętanie odczytu z licznika wody
end
}
Ok-zamieszałem trochę...robiłem próby na kilku skryptach (po wielu próbach , w desperacji)).Sorry za zamieszanie-trzeba się skupić na jednym...
Witam ponownie,
poddaję się-nie mogę w żaden sposób poprawnie napisać skryptu , aby działało cokolwiek na danych z podlicznika i ciepłomierza .
Czy może ktoś mi napisać jeden skrypt wg n/w danych (może jak będzie chociaż jeden działał , to zaskoczę z innymi) :
ciepłomierz moc , idx 110 , customsensor
PC moc elektryczna , idx 39 , customsensor
odczyt wyniku działania ilorazu w/w : COP PC idx 116 customsensor (a może tu jest problem-inny typ ? )
Wykonywanie skryptu co 1 min.
W zamian mogę się podzielić informacjami o pompach ciepła Panasonic (mam dostęp do wielu materiałów serwisowych) lub doświadczeniami z samodzielnej budowy instalacji fotowoltaicznej o mocy 9,9kWp na wiacie.
Pzdr
@bobrow skrypt aktualizuje czujnik COP na podstawie odczytów Ciepłomierza a nie co minutę , bo po co ? Tu masz zrzuty żeby nie było wątpliwości
wszystko to czujniki CustomSensor
a tu ten kawałek kodu
return { on = { devices = {'Cieplomierz'} }, logging = { level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok marker = "licznik COP" }, execute = function(dz, device) local p = tonumber(dz.devices('Pobór pompa').state) local k = tonumber(dz.devices('Cieplomierz').state) local w = dz.devices('COP pompa') -- Obliczenia local cop = dz.utils.round( k / p ,2) dz.log('cop pompy' .. cop.. 'COP ' , dz.LOG_INFO) w.updateCustomSensor(cop) end }
Dzięki za pomoc.
Niestety nie działa-nie ma błędów , ale nie pokazuje COP...
Skrypt po modyfikacji :
return {
on = {
devices = {'ciepłomierz moc'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "licznik COP"
},
execute = function(dz, device)
local p = tonumber(dz.devices('PC moc elektryczna').state)
local k = tonumber(dz.devices('ciepłomierz moc').state)
local w = dz.devices('COP PC')
-- Obliczenia
local cop = dz.utils.round( k / p ,2)
dz.log('cop pompy' .. cop.. 'COP ' , dz.LOG_INFO)
w.updateCustomSensor(cop)
end
}
Nie wiem jeszcze co to jest cop pompy i COP w tym zapisie dz.log('cop pompy' .. cop.. 'COP ' , dz.LOG_INFO)
Jeszcze wersja na idx
return {
on = {
devices = {(110)}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na domoticz.LOG_ERROR, gdy skrypt bedzie Ok
marker = "licznik COP"
},
execute = function(dz, device)
local p = tonumber(dz.devices(39).state)
local k = tonumber(dz.devices(110).state)
local w = dz.devices(116)
-- Obliczenia
local cop = dz.utils.round( k / p ,2)
dz.log('cop pompy' .. cop.. 'COP ' , dz.LOG_INFO)
w.updateCustomSensor(cop)
end
}
Skrypt oczywiście dzvents devices
Dane z domoticza
110 | ciepłomierz kamstrup multical 402 | 00082110 | 1 | ciepłomierz moc | General | Custom Sensor |
39 | PC moc kW | 00070001 | 1 | PC moc elektryczna | General | Custom Sensor |
116 | ciepłomierz kamstrup multical 402 | 00082116 | 1 | COP PC | General | Custom Sensor |
Pompa pracuje ,wskazania są na mocach
Log z tego skryptu wstaw , tylko jako kod a nie tak jak leci bo trzeba się wszystkiego dopatrywać . Wystarczy wkleić logi używając tego
Nie wiem o co chodzi-zaczęło pokazywać COP...
2022-01-29 21:28:00.560 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w godzinach:, trigger: "every minute" 2022-01-29 21:28:00.582 Status: dzVents: Debug: Licznik: Processing device-adapter for PC start: Switch device adapter 2022-01-29 21:28:00.584 Status: dzVents: Debug: Licznik: Processing device-adapter for Godziny pracy PC: Counter device adapter 2022-01-29 21:28:00.584 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w godzinach 2022-01-29 21:28:00.584 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w minutach:, trigger: "every minute" 2022-01-29 21:28:00.585 Status: dzVents: Debug: Licznik: Processing device-adapter for Czas pracy PC w min: Counter device adapter 2022-01-29 21:28:00.585 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w minutach 2022-01-29 21:28:00.586 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua 2022-01-29 21:28:02.116 Status: Incoming connection from: 192.168.1.50 2022-01-29 21:28:02.253 Status: dzVents: Info: Handling events for: "ciepłomierz moc", value: "8.1" 2022-01-29 21:28:02.253 Status: dzVents: Info: licznik COP: ------ Start internal script: Script #1: Device: "ciepłomierz moc (ciepłomierz kamstrup multical 402)", Index: 110 2022-01-29 21:28:02.254 Status: dzVents: Debug: licznik COP: Processing device-adapter for PC moc elektryczna: Custom sensor device adapter 2022-01-29 21:28:02.255 Status: dzVents: Debug: licznik COP: Processing device-adapter for COP PC: Custom sensor device adapter 2022-01-29 21:28:02.255 Status: dzVents: Info: licznik COP: cop pompy2.97COP 2022-01-29 21:28:02.255 Status: dzVents: Info: licznik COP: ------ Finished Script #1 2022-01-29 21:28:02.256 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua 2022-01-29 21:28:13.922 Status: dzVents: Info: Handling events for: "T bufor OUT", value: "33.9" 2022-01-29 21:28:13.923 Status: dzVents: Info: ------ Start internal script: Delta PC bufor: Device: "T bufor OUT (DS18B20)", Index: 60 2022-01-29 21:28:13.925 Status: dzVents: Info: ------ Finished Delta PC bufor 2022-01-29 21:28:13.925 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua 2022-01-29 21:29:00.584 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w godzinach:, trigger: "every minute" 2022-01-29 21:29:00.604 Status: dzVents: Debug: Licznik: Processing device-adapter for PC start: Switch device adapter 2022-01-29 21:29:00.605 Status: dzVents: Debug: Licznik: Processing device-adapter for Godziny pracy PC: Counter device adapter 2022-01-29 21:29:00.605 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w godzinach 2022-01-29 21:29:00.605 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w minutach:, trigger: "every minute" 2022-01-29 21:29:00.606 Status: dzVents: Debug: Licznik: Processing device-adapter for Czas pracy PC w min: Counter device adapter 2022-01-29 21:29:00.606 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w minutach 2022-01-29 21:29:00.607 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua 2022-01-29 21:29:13.968 Status: dzVents: Info: Handling events for: "T bufor OUT", value: "33.9" 2022-01-29 21:29:13.968 Status: dzVents: Info: ------ Start internal script: Delta PC bufor: Device: "T bufor OUT (DS18B20)", Index: 60 2022-01-29 21:29:13.971 Status: dzVents: Info: ------ Finished Delta PC bufor 2022-01-29 21:29:13.971 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua 2022-01-29 21:30:00.533 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w godzinach:, trigger: "every minute" 2022-01-29 21:30:00.550 Status: dzVents: Debug: Licznik: Processing device-adapter for PC start: Switch device adapter 2022-01-29 21:30:00.551 Status: dzVents: Debug: Licznik: Processing device-adapter for Godziny pracy PC: Counter device adapter 2022-01-29 21:30:00.552 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w godzinach 2022-01-29 21:30:00.552 Status: dzVents: Info: Licznik: ------ Start internal script: Czas pracy PC w minutach:, trigger: "every minute" 2022-01-29 21:30:00.553 Status: dzVents: Debug: Licznik: Processing device-adapter for Czas pracy PC w min: Counter device adapter 2022-01-29 21:30:00.553 Status: dzVents: Info: Licznik: ------ Finished Czas pracy PC w minutach 2022-01-29 21:30:00.554 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua