Pisanie skryptów w ...
 
Powiadomienia
Wyczyść wszystko

UWAGAStrona oraz Forum Smart'ny Dom nie będzie dostępne 23 Grudnia 2024 ze względu na przenoszenie serwisu na mocniejszą maszynę.

W tym czasie polecam poświęcenie swojego czasu na pomoc partnerowi w przygotowaniu udanych Świąt 😉

Za niedogodności z góry przepraszam, admin

Kontakt

Domoticz Pisanie skryptów w DzVents

36 Wpisów
2 Użytkownicy
1 Reactions
3,947 Wyświetleń
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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

 
Dodane : 26/01/2022 12:15 pm
isom
 isom
(@isom)
Wpisów: 5190
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 
Dodane przez: @bobrow

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 

 
Dodane : 26/01/2022 12:59 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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.

 

 
Dodane : 26/01/2022 1:13 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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

 
Dodane : 26/01/2022 1:17 pm
isom
 isom
(@isom)
Wpisów: 5190
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

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

 

 
Dodane : 26/01/2022 1:20 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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

 
Dodane : 26/01/2022 1:47 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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 

2022-01-26 15:56:00.265 Error: dzVents: Error: (3.1.7) An error occurred when calling event handler Script #1
2022-01-26 15:56:00.265 Error: dzVents: Error: (3.1.7) ...domoticz/scripts/dzVents/generated_scripts/Script #1.lua:22: attempt to perform arithmetic on a table value (field 'test')
 
Z poprzednich prób została zmieniona nazwa z PC nap L3 na pc nap L3 -żeby nie było ,że kłamie.
 
Dodane : 26/01/2022 4:29 pm
isom
 isom
(@isom)
Wpisów: 5190
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

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. 

 

 
Dodane : 26/01/2022 5:12 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

Wpisałem 1

test = { initial = {1}, },

to samo

 

PS

nie zauważyłem wpisu o factor

 
Dodane : 26/01/2022 5:32 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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
}
 
Dodane : 26/01/2022 8:42 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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

 
Dodane : 26/01/2022 8:44 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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 

 
Dodane : 29/01/2022 12:40 pm
isom
 isom
(@isom)
Wpisów: 5190
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@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

2

 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
}
		
 
Dodane : 29/01/2022 7:08 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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)

 
Dodane : 29/01/2022 9:13 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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
}

 

 
Dodane : 29/01/2022 9:16 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

Skrypt oczywiście dzvents devices

 
Dodane : 29/01/2022 9:21 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

Dane z domoticza

Pompa pracuje ,wskazania są na mocach

 
Dodane : 29/01/2022 9:24 pm
isom
 isom
(@isom)
Wpisów: 5190
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

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

1

 

 
Dodane : 29/01/2022 9:26 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

Nie wiem o co chodzi-zaczęło pokazywać COP...

 
Dodane : 29/01/2022 9:29 pm
(@bobrow)
Wpisów: 387
Weteran
Autor tematu
 

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
 
Dodane : 29/01/2022 9:30 pm
Strona 1 / 2
Udostępnij: