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