Re: Verbrauch HMIP-PSM
Verfasst: 24.06.2022, 19:34
So, und hier noch eine ordentliche Debugging Variante des Programms. Du brauchst eine Systemvariable Typ Text, die "Protokolleintrag" heisst und auf protokolliert steht. Die SV für die Zählerstände solltest Du auch auf protokolliert setzen. Dann kannst Du nach dem Durchlauf des Programms im Systemprotokoll (!) alle Schritte im Detail sehen.
Code: Alles auswählen
!- Strom getrennt nach Kanal abrechnen / MN 25.06.2022 Debug-Version
!- https://homematic-forum.de/forum/viewtopic.php?f=60&t=59546&p=590070#p590070
!- WENN Pumpe:3 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:3 Schaltzustand AUS nur prüfen
!- ODER Pumpe:4 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand AUS nur prüfen
!- DANN dieses SKRIPT _verzögert_ um 3 Sekunden OHNE Retriggerung
!- Definitionen, ggf. anpassen
string Zaehlername = "svEnergyCounter_15140_0001D3C99CAC8A:6";
string NameSV3_gesamt = "Zaehler3ges";
string NameSV4_gesamt = "Zaehler4ges";
string NameSV3_ein = "Zaehlerstand3ein";
string NameSV4_ein = "Zaehlerstand4ein";
real Einheit = 1000; !- 1 für Wh, 1000 für kWh
!- hier nichts mehr anpassen
string kanal;
object oSrc;
real ZaehlerGesamt;
real ZaehlerAktuell;
real ZaehlerAlt3;
real ZaehlerAlt4;
real Diff3;
real Diff4;
real DiffTeilen;
real DiffRest;
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: START"); ! debug
!- welcher Kanal?
oSrc = dom.GetObject("$src$");
kanal = (dom.GetObject(oSrc.Channel())).ChnNumber();
!- aktueller Status 0 = aus / 1 = ein
string sVal = "$val$";
ZaehlerAktuell = dom.GetObject(Zaehlername).Value();
ZaehlerAktuell = ZaehlerAktuell/Einheit;
ZaehlerAlt3 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State();
ZaehlerAlt4 = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State();
if ( kanal == "3" )
{
!- Kanal 3 betätigt
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: Kanal 3 betätigt"); ! debug
if ( sVal == "0" )
{
!- ausgeschaltet
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 3 ausgeschaltet"); ! debug
ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State();
Diff3 = ( ZaehlerAktuell - ZaehlerAlt3 );
if ( ZaehlerAlt4 > 0 )
{
!- Zaehler 4 läuft parallel, hälftig abrechnen
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hälftig abrechnen"); ! debug
Diff4 = ( ZaehlerAktuell - ZaehlerAlt4 );
DiffTeilen = Diff4.Min(Diff3);
DiffRest = Diff3 - DiffTeilen;
Diff3 = DiffRest + ( DiffTeilen / 2 );
ZaehlerAlt4 = ZaehlerAlt4 + ( DiffTeilen / 2 );
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAlt4);
}
!- hochzählen
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hochgezählt " #Diff3); ! debug
ZaehlerGesamt = ZaehlerGesamt + Diff3;
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State(ZaehlerGesamt);
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(0);
} else {
!- eingeschaltet, Zählerstand merken
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 3 eingeschaltet"); ! debug
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAktuell);
}
}
if ( kanal == "4" )
{
!- Kanal 4 betätigt
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: Kanal 4 betätigt"); ! debug
if ( sVal == "0" )
{
!- ausgeschaltet
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 4 ausgeschaltet"); ! debug
ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State();
Diff4 = ( ZaehlerAktuell - ZaehlerAlt4 );
if ( ZaehlerAlt3 > 0 )
{
!- Zaehler 3 läuft parallel, hälftig abrechnen
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hälftig abrechnen"); ! debug
Diff3 = ( ZaehlerAktuell - ZaehlerAlt3 );
DiffTeilen = Diff3.Min(Diff4);
DiffRest = Diff4 - DiffTeilen;
Diff4 = DiffRest + ( DiffTeilen / 2 );
ZaehlerAlt3 = ZaehlerAlt3 + ( DiffTeilen / 2 );
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAlt3);
}
!- hochzählen
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: hochgezählt " #Diff4); ! debug
ZaehlerGesamt = ZaehlerGesamt + Diff4;
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State(ZaehlerGesamt);
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(0);
} else {
!- eingeschaltet, Zählerstand merken
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: 4 eingeschaltet"); ! debug
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAktuell);
}
}
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Protokolleintrag").State("Pumpe: ENDE"); ! debug