neuerdings tritt ein Phänomen auf, welches ich mir nicht erklären kann.
Sporadisch wird beim ein bzw ausschalten von kanal 3 oder 4, mal der Zählerstand nicht in die sv pumpe og/eg ein geschrieben bzw beim ausschalten nicht neu berechnet.
beides (kein schreiben bei ein bzw berechnen bei aus) passiert unabhängig voneinander und ich konnte es bis dato nicht reproduzieren.
jemand eine ansatz woran es liegen könnte? anbei das script zur berechnung.
system aktuelle raspberrymatic. ob das nach einem update dieser anfing, kann ich nicht ausschließen.
vielen dank
edit: das programm welches das script startet, wird aber immer ausgelöst. im log findet sich nix zum entsprechenden zeitpunkt
Code: Alles auswählen
!- Strom getrennt nach Kanal abrechnen / MN 27.06.2020
!- 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 bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand EIN bei Änderung auslösen
!- ODER Pumpe:4 Schaltzustand AUS bei Änderung auslösen
!- DANN dieses SKRIPT
!- Definitionen: Variablennamen zwischen den "" an eigene Gegebenheiten anpassen
string Zaehlername = "svEnergyCounter_1439_0001D3C99C9B5B:6";
string NameSV3_gesamt = "sv_PumpeOG";
string NameSV4_gesamt = "sv_PumpeEG";
string NameSV3_ein = "sv_PumpeOG_EIN";
string NameSV4_ein = "sv_PumpeEG_EIN";
!- hier nichts mehr anpassen
string kanal;
object oSrc;
real ZaehlerGesamt;
real ZaehlerAktuell;
real ZaehlerAlt3;
real ZaehlerAlt4;
real Diff3;
real Diff4;
real DiffTeilen;
real DiffRest;
!- 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/1000;
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
if ( sVal == "0" )
{
!- ausgeschaltet
ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_gesamt).State();
Diff3 = ( ZaehlerAktuell - ZaehlerAlt3 );
if ( ZaehlerAlt4 > 0 )
{
!- Zaehler 4 läuft parallel, hälftig abrechnen
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
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("Protokolleintrag").State("xxxTest: Kanal 3 ein");
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV3_ein).State(ZaehlerAktuell);
}
}
if ( kanal == "4" )
{
!- Kanal 4 betätigt
if ( sVal == "0" )
{
!- ausgeschaltet
ZaehlerGesamt = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_gesamt).State();
Diff4 = ( ZaehlerAktuell - ZaehlerAlt4 );
if ( ZaehlerAlt3 > 0 )
{
!- Zaehler 3 läuft parallel, hälftig abrechnen
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
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("Protokolleintrag").State("xxxTest: Kanal 4 ein");
dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSV4_ein).State(ZaehlerAktuell);
}
}