Na stronie ESPEasy
https://espeasy.readthedocs.io/en/latest/Rules/Rules.html
jest taki gotowy kod. Potrzebuję trochę wsparcia.
Chcę stworzyć urządzenie, które zliczy mi ilość Kwh ciepła wyprodukowane przez pompę ciepła, która pobiera moc elektryczną w Watach.
W Domoticzu nie wiem czy jest jakieś urządzenie, które to wykonane, ale chyba też potrzebny jest skrypt.
Swoją drogą ciekawy jestem jak to wygląda np. w Home Asistancie, w którym chcę wylądować, czy też się trzeba tak męczyć ?
DO brzegu. Jak zrozumiałem:
Muszę stworzyć dummy device o nazwie "Power" z pozycjami:
1. sekundy ilośc miejsc po przecinku 0, "Seconds"
2. PowerUsed : 0,0001
a var#4, var#3 ? czy mam zrobić takie w dummy device? A zmienne nr 1 i 5 ? int#1 i int#5
gdzie tu jest moc urządzenia w watach-moc źródłowa ?
Mowa jest o GPIO-14. Ja mam PZEM-004T działa po RX TX.
Czy sobie dać spokój ?
// Used variables: 1,3,4,5
On GPIO#14 Do // GPIO-14 = D5 on Wemos/NodeMCU ESP8266 boards
If %eventvalue1%=0 // On state
Let,1,%syssec_d% // Store current nr of seconds of today in var#1
Else // Off state
Event,CalcPower // Don't queue
Event,TransmitPower // Send out to receiver
Endif
Let,5,!%eventvalue1% // 0 = On, to invert on/off state change to: Let,5,%eventvalue1%
LogEntry,"Power [int#5#O#C], measured: [Power#Seconds] sec. [Power#PowerUsed#d.4] kWh"
Endon
On CalcPower Do
TaskValueSet,Power,Seconds,[Power#Seconds]+%syssec_d%-[int#1] // Add run time to Power#Seconds
Let,4,[Power#Seconds]*[var#3] // Wattseconds
If [var#4]>0
TaskValueSet,Power,PowerUsed,[var#4]/3600000 // Wattseconds to kWh
Endif
TaskRun,Power
Endon
On TransmitPower Do
// Send value of [Power#Seconds] and [Power#PowerUsed] to wherever you need it, adjust as needed
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Total RunningTime = [Power#Seconds] Seconds, PowerUsed = [Power#PowerUsed] kWh'
Endon
On Clock#Time=All,00:00 Do // At midnight
// Include power used until midnight
If [Plugin#GPIO#PinState#14]=0 // Still on?
Event,CalcPower // Don't queue
Endif
Let,1,0 // Reset start time
Event,TransmitPower // Send out remainder of the day
TaskValueSet,Power,Seconds,0 // Reset total counter
TaskValueSet,Power,PowerUsed,0 // Reset total power
Endon
On System#Boot Do
Monitor,gpio,14 // Generate an event when the GPIO state changes
Let,3,250 // Wattage of the load, adjust as needed
Endon
Jak masz pzem to ten zestaw reguł nie jest dla Ciebie.
Ten kod mierzy, jak długo urządzenie podłączone do GPIO 14 jest włączone, liczy na tej podstawie zużycie energii elektrycznej, zapisuje to w logach, wysyła na serwer po http i resetuje liczniki każdego dnia o północy. Takie coś można użyć gdy masz np grzałkę o znanej mocy 500W i chcesz żeby policzyć ile zużyła przez dzień.
Tyle i aż tyle, wiec twój pzem ma się do tego nijak 🙂
No i elegancko, idziemy tą drogą.
To szerokiej drogi. Nie wiem jak chcesz obliczać współczynnik wydajności pompy ciepła korzystając z tego zestawu reguł.
Obejrzyj sobie ten materiał i odpowiedź sam znajdziesz https://www.youtube.com/watch?v=xjKClsN_dL0
Oglądałem już ten film. Mam obliczany współczynnik cop w Domoticzu, ale w ESP też umiem to zrobić, żeby obliczył COP.
No ale ciepłomierza ten kod też nie zrobi, bo on bazuje na stałej wartości pobieranej mocy i czasie. Nie oblicza mocy urządzenia podłączonego do GPIO. To jest taki średnio dokładny wskaźnik ile mogło pobrać przez dobę coś co jest włączone przez określony czas.
A średnio dokładny dlatego, że nawet moc grzałki zależy od wartości napięcia, a ono u nikogo nie jest wartością stałą i wiadomo dlaczego 🙂
Już na pewno wiesz, że momentami kuleję w tej automatyce, ale jak już kółeczka zrobią mi klik klik to wtedy sobie raczkuję. Ważne aby do przodu. Ja jestem prostym mechanikiem z wykształcenia więc jeśli chodzi o inżynierię sanitarną, zatem moc, przepływy, itp. to już moja bajka.
Zrobił w Espeasy moc, cop pompy ciepła :).
Ale jeszcze wątek poboczny. Czy da się w tasmocie podłączyć kilka wyświetlaczy 7 segmentowych do jednej płytki ESP? Bo w esp easy można tylko jeden.
Rozumiem, to działa, zakłada, że moc pobierana przez grzałkę jest constans.
Ale liczenie samego czasu raczej jest precyzyjne.
Dlatego PZEM004T
Dobra, przypomniało mi się, że robiłem kiedyś skrypt w DZ VENTS DEVICE czas pracy turbiny wiatrowej,
return {
on = { timer = {'every minute'}
},
logging =
{
level = domoticz.LOG_ERROR,
marker = 'Licznik',
},
execute = function(domoticz, _ )
local myDevice = domoticz.devices(115)
local aktlicznik = domoticz.devices(120).counter
if myDevice.state == "On" then
aktlicznik = aktlicznik + 1
domoticz.devices(120).updateCounter(aktlicznik)
end
end
}
Więc zrobię to w domoticzu, ale jak utknę to poproszę Cię o pomoc. I już spytam, bo jak zrozumiałem, to będzie to liczyć co każdą minutę, czy też liczy co sekundę ale do worka wrzuca co minutę ?
To Ty kolego podstawiasz wartość mocy a nie pzem , tak na początek musisz
On System#Boot Do Monitor,gpio,14 // Monitoruj zmiany stanu GPIO14 Let,3,500 // Przyjęta moc urządzenia: 500 W EndOn
Tu określasz jakiej mocy urządzenie jest na GPIO14 czyli co załącza przekaźnik
Potem jest obliczany czas włączonego przekaźnika
A skrypt, którego używasz, to zwykły licznik czasu, który co minutę sprawdza czy urządzenie jest włączone i jeśli tak zwiększa wartość wirtualnego licznika o 1
@isom a dziękuję, to już mi dużo tłumaczy, czemu zamiast wartości constans nie można tam wstawić pozycji z tabelki [pzem#W] ?
Dlatego że w dalszej części kodu ta wartość nie jest sprawdzana a tylko podstawiana
Hmmmm, to na razie zostawię ten skrypt LUA i domoticza.
Jest też taki skrypt z ESPEasy : czas pracy urządzenia.
Czyli tamten skrypt liczy czas włączenia GPIO, a ten liczy i włączenia i wyłączenia i jest warunek progowy-idealny do mojego PZEM-a:) -będzie się miał nie nijak .
OD tego zacznę bo już mam pomysła:
Aby rejestrować dzienny czas aktywności urządzenia (w sekundach), opracowano poniższe reguły (na forum).
Wymagane zadania urządzenia:
-
Czujnik (w przykładzie temperatura)
-
Urządzenie pozorne (nazwane
Dummyw tym przykładzie, minimalne 2 wartościLoggingONiLoggingOFF), Interwał można ustawić na 0
Zmieniono: 2025-03-21 Użyj zmiennych nazwanych zamiast zmiennych numerowanych.
On System#Boot Do
TaskValueSet,Dummy,LoggingON,1 // Make sure timer is started and Heater ON message is sent
Endon
On DS1#Temperature Do // Check tmeperature
If %eventvalue1% < 40
GPIO,5,0
AsyncEvent,HeaterON=%eventvalue1%
Endif
If %eventvalue1% > 55
GPIO,5,1
AsyncEvent,HeaterOFF=%eventvalue1%
Endif
Endon
On HeaterON Do // Optional 1st argument is the temperature, defaults to the value of DS1#Temperature if not provided
If [Dummy#LoggingON] = 1
Let,secs,%syssec_d% // Store current nr of seconds of today in var#secs
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Temp = %eventvalue1|[DS1#Temperature]% -> Heater ON'
TaskValueSet,Dummy,LoggingON,0
TaskValueSetAndRun,Dummy,LoggingOFF,1
Endif
Endon
On HeaterOFF Do // Optional 1st argument is the temperature, defaults to the value of DS1#Temperature if not provided
If [Dummy#LoggingOFF] = 1
Inc,total,%syssec_d%-[int#secs] // Add run time to var#total
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Temp = %eventvalue1|[DS1#Temperature]% -> Heater OFF'
TaskValueSet,Dummy,LoggingON,1
TaskValueSetAndRun,Dummy,LoggingOFF,0
Endif
Endon
On Clock#Time=All,00:00 Do // At midnight
// Send value of [int#total] to wherever you need it
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Total RunningTime = [int#total] Seconds'
Let,secs,0 // Reset start time
Let,total,0 // Reset total counter
Endon
Zrobiłem tak, ale coś nie liczy. Nie skonfigurowałem na razie tego http-wysyłanie logów-do domoticza, ale to chyba nie jest przyczyną, że nie liczy czasu włączenia gdy t1>55*C. Przekaźnik załączyło. Jak W rules 1 użyłem raz już system#boot to chyba drugi raz użyć system#boot ?
On System#Boot Do
TaskValueSet,Dummy,LoggingON,1 // Make sure timer is started and Heater ON message is sent
Endon
On t#t1 Do // Check tmeperature
If %eventvalue1% > 55
GPIO,12,0
AsyncEvent,HeaterON=%eventvalue1%
Endif
If %eventvalue1% < 45
GPIO,12,1
AsyncEvent,HeaterOFF=%eventvalue1%l
Endif
Endon
On HeaterON Do // Optional 1st argument is the temperature, defaults to the value of t#t1 if not provided
If [Dummy#LoggingON] = 1
Let,secs,%syssec_d% // Store current nr of seconds of today in var#secs
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Temp = %eventvalue1|[t#t1]% -> HeaterON'
TaskValueSet,Dummy,LoggingON,0
TaskValueSetAndRun,Dummy,LoggingOFF,1
Endif
Endon
On HeaterOFF Do // Optional 1st argument is the temperature, defaults to the value of t#t1 if not provided
If [Dummy#LoggingOFF] = 1
Inc,total,%syssec_d%-[int#secs] // Add run time to var#total
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Temp = %eventvalue1|[t#t1]% -> HeaterOFF'
TaskValueSet,Dummy,LoggingON,1
TaskValueSetAndRun,Dummy,LoggingOFF,0
Endif
Endon
On Clock#Time=All,00:00 Do // At midnight
// Send value of [int#total] to wherever you need it
PostToHTTP,192.168.1.20,8080,/receiver.php,'','%lcltime% !!! Total RunningTime = [int#total] Seconds'
Let,secs,0 // Reset start time
Let,total,0 // Reset total counter
Endon
A w jakim interwale aktualizuje się to twoje t1 ? Bo ten zestaw reguł to zwykły termostat i wymaga czujnika temperatury.
On System#Boot jak sama nazwa wskazuje jest wywoływany tylko przy restarcie esp więc jaki drugi chcesz ?
@isom temperaturę mam co 1 s interwał.
Chodziło mi o to, że zauważyłem, że esp rules nie lubi jak się np. robi jakąś regułę nową, i się powołuje na to samo urządzenie. Czyli np.
on t#t1 do
iff
endon
i już drugiego takiego warunku z 0n t#t1 do nie mogę użyć. Dlatego pytałem o ten system#boot, ale to nie problem.
Weź utwórz sobie w domoticz czujnik wirtualny typ text
i spróbuj z wersją uproszczoną, ale liczącą czas działania.
Reszta informacji w komentarzach
On System#Boot Do
Let,1,0 // zeruj czas startu
Let,2,0 // zeruj licznik czasu
EndOn
On DS1#Temperature Do // podstaw swój czujnik temperatury
// WŁĄCZ
If %eventvalue1% < 40 and [int#1]=0
GPIO,12,1
Let,1,%syssec_d% // zapamiętaj start
EndIf
// WYŁĄCZ
If %eventvalue1% > 55 and [int#1]>0
GPIO,12,0
Let,2,[int#2] + %syssec_d% - [int#1] // dodaj czas pracy
Let,1,0 // reset startu
// Wyślij do Domoticz (czas w sekundach)zmień adres i idx na swój
PostToHTTP,192.168.1.20,8080,
/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=[int#2],
,
EndIf
EndOn
On Clock#Time=All,00:00 Do
// raport dzienny
PostToHTTP,192.168.1.20,8080,
/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=[int#2],
,
Let,1,0
Let,2,0
EndOn
Krótki opis co to robi:
Temp < 40 włącz przekaźnik i zapamiętaj czas startu.
Po wzroście temp >55 wyłącz przekaźnik policz czas pracy przekaźnika, wyślij do czujnika w domoticz i zresetuj czas startu
O pólnocy wyślij do domoticz dzienny czas pracy i wyzeruj liczniki.
@isom dzięki, do domoticza to send http, ale to już mam, ogarnę.
Ja mam taką propozycję step by step, żeby znaleźć trolla. Bo coś nie liczy tego czasu pracy pinu. Czy też warunku. Termostat działa.
On System#Boot Do
Let,1,0 // zeruj czas startu
Let,2,0 // zeruj licznik czasu
Endon
On ads#t Do // podstaw swój czujnik temperatury
If %eventvalue1% < 40 and [int#1]=0
GPIO,12,1
Let,1,%syssec_d% // zapamiętaj start
Endif
If %eventvalue1% > 55 and [int#1]>0
GPIO,12,0
Let,2,[int#2] + %syssec_d% - [int#1] // dodaj czas pracy
Let,1,0 // reset startu
Endif
Endon







