Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Hütte
Beiträge: 746
Registriert: 08.02.2017, 11:08
Hat sich bedankt: 32 Mal
Danksagung erhalten: 75 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von Hütte » 16.05.2021, 19:56

Bitte die pdf.Dateien durch ScreenShots als Bilddateien ersetzen. Denn es sich sich so gut wie keiner die Arbeit machen, die pdf-Dateien herunterzuladen.

Und Programmcode auch als solchen einbetten (5. Button von links über dem Eingabebereich).

Thommy2021
Beiträge: 7
Registriert: 16.05.2021, 18:30
System: CCU

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von Thommy2021 » 17.05.2021, 22:08

Hallo Hütte,
vielen Dank für die schnelle Antwort und sorry für meine Unkenntnis. :oops:
hier meine Screenshots:
SysVar-Wasser.png
SysVar-Strom.png
SysVar-Gas.png
Wasser.png
Strom.png
Gas.png
Hier mein Script:

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
! Adaptiert Michael Hansen, 01/2021, V1.0; neue Kommentare sind mit ! * gekennzeichnet
! * V1.1 - Abfrage eingefügt, ob sich das Inkrement geändert hat. Nur dann wird gerechnet
! * Fehler in der Berechnung des aktuellen Verbrauchs beseitigt
! * V1.2 - Änderung, dass in den CCU internen Energiezähler der Verbrauch seit der letzten
! * Ablesung geschrieben wird (wie beim Originalskript von Jens)#
! * V1.3 - Zurücksetzen des täglichen Wasserverbrauchs in l ist ergänzt
! * V1.3b - Einige Kommentierungen ergänzt

! Version 1.4 (01.01.2018)

! Nun schauen wir wer uns aufgerufen hat (Device-Channel oder Timer) und welches Device
! es genau war (Nutzung der $src$ Variable) und danach entscheiden wir was wir
! zu tun haben.
object counter = dom.GetObject("$src$");
if(counter)
{
  object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);

  ! Wenn TypeName vom Typ HSSDP ist dann wurde das Program durch ein Event
  ! eines Devices erzeugt, ansonsten durch ein CALENDARDP welches der
  ! Ausfuehrung durch das Zeitmodul entspricht
  if(counter.TypeName() == "HSSDP")
  {
    ! Nun holen wir unmittelbar am anfang alle counter relevanten Daten ab
    ! und speichern sie fuer spaeter zwischen und berechnen auch gleich
    ! noch differenzwerte
    integer diffTime = counter.Timestamp().ToInteger() - counter.LastTimestamp().ToInteger();
    real curValue = counter.Value();
    real lastValue = counter.LastValue();
    real vVeraenderung_Zaehlerstand = ( curValue - lastValue );

    ! * Wir prüfen, ob es überhaupt einen Energieverbrauch gegeben hat und nur dann geht es in die
    ! * Berechnungen
    if (vVeraenderung_Zaehlerstand <> 0)
    {
      ! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom) -> hier muss Garten erweitert werden
      ! aus dem Namen des Channel. Ein Device muss also immer mit "XXXXX-Gas"
      ! bzw. "XXXXXX-Wasser", etc. enden.
      object channel = dom.GetObject(counter.Channel());
      string type = channel.Name().StrValueByIndex("-",1);
    
      ! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
      ! unserer verschiedenen Zaehlerwerte
      object oAktueller_Zaehlerstand = sysvar.Get(type # " aktueller Zaehlerstand");
      ! * oZaehlerstand_Messgeraet_Log benötigt man nur für die Inkrementberechnung mit
      ! * interner Variable
      object oZaehlerstand_Messgeraet_Log = sysvar.Get(type # " Zaehlerstand Messgeraet Log"); 
      object oVerbrauch_Aktuell = sysvar.Get(type # " Verbrauch aktuell");
      object oVerbrauch_Ablesung = sysvar.Get(type # " Verbrauch Ablesung");
      object oLetzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
      object oZaehlerstand_gestern = sysvar.Get(type # " Zaehlerstand gestern");
      object oVerbrauch_heute = sysvar.Get(type # " Verbrauch heute");
      object oZaehlerstand_letzte_Woche = sysvar.Get(type # " Zaehlerstand letzte Woche");
      object oVerbrauch_Woche = sysvar.Get(type # " Verbrauch Woche");
      object oZaehlerstand_letzter_Monat = sysvar.Get(type # " Zaehlerstand letzter Monat");
      object oVerbrauch_Monat = sysvar.Get(type # " Verbrauch Monat");
      object oZaehlerstand_letztes_Jahr = sysvar.Get(type # " Zaehlerstand letztes Jahr");
      object oVerbrauch_Jahr = sysvar.Get(type # " Verbrauch Jahr");
      ! * vUmrechnungsfaktor wird später nur geändert, wenn es der Stromzähler war (Wh vs. kWh)
      real vUmrechnungsfaktor = 1.0;
      ! * vFaktor_l Für die Umrechnung von m3 in l für den Tagesverbrauch Wasser.
      ! * Falls Gas oder Strom, dann wird der Wert auf 1 gesetzt
      real vFaktor_l = 1000.0;

      ! * Wenn der Gassensor aufgerufen hat, dann müssen wir die die Variable "Gas Verbrauch Jahr kWh"
      ! * für Gas laden
      if ( type == ( "Gas" ) )
      {
        object oVerbrauch_Jahr_kWh = sysvar.Get(type # " Verbrauch Jahr kWh"); 
        ! * Damit wir die kWh berechnen können, werden die Faktoren für die Umrechnung bei Gas
        ! * m3 -> kWh benötigt
        real vZustandszahl = 0.9618;
        real vFaktor = 11.3750;
      }

      ! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
      ! * Variable für "XXX Verbrauch heute l" laden
      if ( (type == "Wasser"))
      {
        object oVerbrauch_heute_l = sysvar.Get(type # " Verbrauch heute l"); 
      }
      
      ! Jetzt machen wir die Inkrementberechnung
      ! * Wenn die Variable "XXX Zaehlerstand Messgeraet Log" noch nicht gesetzt wurde (= 0), dann
      ! * wird der letzte Zaehlerstand des Messgerätes verwendet

      if ( oZaehlerstand_Messgeraet_Log.Value() == 0 )
      {
        oZaehlerstand_Messgeraet_Log.State(lastValue);
      }
	  
	  real vInkrement_Geraetezaehler = ( curValue - oZaehlerstand_Messgeraet_Log.Value() );
      
      ! * Der Faktor wird für den aktuellen Verbrauch benötigt, da der bei Wasser nur als Angabe in
      ! * l Sinn macht
      if ( (type == "Wasser"))
      {
        vFaktor_l = 1000.0;
      }
      else
      {
        vFaktor_l = 1.0;
      }
    
      ! Jetzt wird das Inkrement zum letzten Zaehlerstand berechnet
      ! * Dabei muss der Umrechnungsfaktor für die Wasserzaehlung identifiziert und gesetzt werden
      ! * Strom und Gas benötigen keine Umrechnung (Wasser = l; Strom = kWh; Gas = m3).
      ! * vUmrechnungsfaktor wird für den Fall des Batteriewechsels bzw. Zählerüberlaufs benötigt
      ! * (auch noch später)
      if ( type == "Strom"  )
      {
        vUmrechnungsfaktor = 1000.0;
        vInkrement_Geraetezaehler = vInkrement_Geraetezaehler / vUmrechnungsfaktor;
      }
 
      ! Aktuellen Verbrauch berechnen
      if(diffTime > 0)
      {
        oVerbrauch_Aktuell.State(3600.0 * vFaktor_l * vInkrement_Geraetezaehler * vUmrechnungsfaktor / diffTime);
      }
  
      ! Aktuellen Zaehlerstand berechnen
      if (vInkrement_Geraetezaehler < 0)
      {
        ! * Wenn Batteriewechsel, dann direkt den Zaehlerstand des Gerätes addieren
        oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + curValue / vUmrechnungsfaktor));
      }
      else
      {
        ! * Wenn kein Batteriewechsel stattgefunden hat, dann das Inkrement addieren
       oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + vInkrement_Geraetezaehler ));
      }
  
      ! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
      ! des Verbrauches da sind neu berechnen.
      oVerbrauch_heute.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_gestern.Value()) );  
      oVerbrauch_Woche.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzte_Woche.Value()) );
      oVerbrauch_Monat.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzter_Monat.Value()) );
      oVerbrauch_Jahr.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letztes_Jahr.Value()) );
      oVerbrauch_Ablesung.State( ( oAktueller_Zaehlerstand.Value() - oLetzte_Ablesung.Value()) );
 
      ! * Wenn es der Wasser- oder Gartewasserzähler ist, dann berechnen wir noch den Tagesverbrauch
      ! * in l
      if (( type == "Wasser"))
      {
        oVerbrauch_heute_l.State(oVerbrauch_heute.Value() * vFaktor_l);
      }
    
      ! * Wenn es der Gaszähler ist, dann berechnen wir den Jahresverbrauch für Gas in kWh
      if (type == "Gas" )
      {
        oVerbrauch_Jahr_kWh.State( (oVerbrauch_Jahr.Value() * vZustandszahl * vFaktor) );
      }
    
      ! * Jetzt schreiben wir den aktuellen Zaehlerstand des Sensors in unsere Log Variable
      oZaehlerstand_Messgeraet_Log.State(curValue);
    
    
      ! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
      ! dem Wert der letzten Ablesung
      if(counter.HssType() != "GAS_ENERGY_COUNTER")
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounter_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          ! * Aktueller Zaehlerstand ist kWh. Die Variable erwartet Wh und rechnet dies dann ggf. in der Anzeige
          ! * selbst in kWh um
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() * 1000 ); 
        }
      }
      else
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() );
        }
      }

    
      ! Die aktuelle Zeit in eine separate Systemvariable schreiben
      ! damit man direkt sehen kann wann die Zaehelrstaende das letzte
      ! mal aktualisiert wurden.
      sysvar.Get(type # " Aktualisierung").State(system.Date("%F %X"));
    }
  }
  else
  {
    ! Tageszaehleraktualisierung fuer alle Hausanschluss-Zaehler
    ! Hier wird mittels eines Timers der taeglich immer genau um 00:01
    ! dieses Programm ausfuehrt die Systemvariablen aktualisiert die
    ! die Tages/Wochen/Monat/Jahreswerte beinhalten.

    ! Nur weitermachen wenn es wirklich Mitternacht ist
    if(system.Date("%H:%M") == "00:01")
    {
      ! * Für 'string a=""' jetzt die Zähler aufzählen, die ihr am Laufen habt.
      ! *  für z.B. Strom- und Wasserzähler muss die Zeile wie folgt geändert werden
      ! * string a="Strom,Wasser";
      string a="Gas,Strom,Wasser";
      string b;
      object oAktueller_Zaehlerstand;
      object oZaehlerstand_letzte_Woche;
      object oVerbrauch_Woche;
      object oVerbrauch_letzte_Woche;
      object oZaehlerstand_letzter_Monat;
      object oVerbrauch_Monat;
      object oVerbrauch_letzter_Monat;
      object oZaehlerstand_letztes_Jahr;
      object oVerbrauch_Jahr;
      object oVerbrauch_letztes_Jahr;
      object oZaehlerstand_gestern;
      object oVerbrauch_heute;
      object oVerbrauch_gestern;

      ! Nun ueber alle Hauszaehler iterieren
      foreach(b, a.Split(","))
      {
        ! momentaner Zaehlerstand
        oAktueller_Zaehlerstand = sysvar.Get(b # " aktueller Zaehlerstand");
        if(oAktueller_Zaehlerstand)
        {  
          ! Nach Wochenanfang pruefen
          if(system.Date("%a") == "Mon")
          {
            oZaehlerstand_letzte_Woche = sysvar.Get(b # " Zaehlerstand letzte Woche");
            oVerbrauch_Woche = sysvar.Get(b # " Verbrauch Woche");
            oVerbrauch_letzte_Woche = sysvar.Get(b # " Verbrauch letzte Woche");
            
            ! Verbrauch der letzten Woche speichern
            oVerbrauch_letzte_Woche.State( oVerbrauch_Woche.Value() );
            
            ! Referenzwert der Woche speichern
            oZaehlerstand_letzte_Woche.State( oAktueller_Zaehlerstand.Value() );
  
            ! Wochenverbrauch auf 0 setzen
            oVerbrauch_Woche.State(0);   
          }

          ! Nach Monatsanfang pruefen
          if(system.Date("%d") == "01")
          {
            oZaehlerstand_letzter_Monat = sysvar.Get(b # " Zaehlerstand letzter Monat");
            oVerbrauch_Monat = sysvar.Get(b # " Verbrauch Monat");
            oVerbrauch_letzter_Monat = sysvar.Get(b # " Verbrauch letzter Monat");
  
            ! Verbrauch des letzten Monats speichern
            oVerbrauch_letzter_Monat.State( oVerbrauch_Monat.Value() );
  
            ! Referenzwert des Monats speichern
            oZaehlerstand_letzter_Monat.State( oAktueller_Zaehlerstand.Value() );
      
            ! Monatsverbrauch auf 0 setzen
            oVerbrauch_Monat.State(0);       
      
            ! Nach Jahresanfang pruefen
            if(system.Date("%m") == "01")
            {
              oZaehlerstand_letztes_Jahr = sysvar.Get(b # " Zaehlerstand letztes Jahr");
              oVerbrauch_Jahr = sysvar.Get(b # " Verbrauch Jahr");
              oVerbrauch_letztes_Jahr = sysvar.Get(b # " Verbrauch letztes Jahr");
  
              ! Verbrauch des letzten Kalenderjahr speichern
              oVerbrauch_letztes_Jahr.State( oVerbrauch_Jahr.Value() );
  
              ! Referenzwert des Kalenderjahr speichern
              oZaehlerstand_letztes_Jahr.State( oAktueller_Zaehlerstand.Value() );
        
              ! Jahresverbrauch auf 0 setzen
              oVerbrauch_Jahr.State(0);       
            }
          }

          ! aktueller Tagesverbrauch speichern
          oZaehlerstand_gestern = sysvar.Get(b # " Zaehlerstand gestern");
          oVerbrauch_heute = sysvar.Get(b # " Verbrauch heute");
          oVerbrauch_gestern = sysvar.Get(b # " Verbrauch gestern");
          oVerbrauch_heute_l = sysvar.Get(b # " Verbrauch heute l");
          
          
          ! Verbrauch gestern speichern
          oVerbrauch_gestern.State(oVerbrauch_heute.Value());
  
          ! Referenzwert des Tages speichern
          oZaehlerstand_gestern.State(oAktueller_Zaehlerstand.Value());

          ! Tagesverbrauch auf 0 setzen
          oVerbrauch_heute.State(0);
          
          if (( b == "Wasser"))
          {
            oVerbrauch_heute_l.State(0);
          }
          
        }
      }
    }
  }
}
Prg-Zaehlerauswertung.png
Und hier noch einmal die Variablen-Ansicht einen Tag später:
Gas-neu.png
Strom-neu.png
Wasser-neu.png
Ich hoffe, so ist es besser, verzeiht mir bitte...
Vielen Dank für Eure Hilfe!

wendel60
Beiträge: 12
Registriert: 18.04.2019, 07:34

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von wendel60 » 19.05.2021, 08:54

Hallo,

die Angabe "Gas Aktueller Zaehlerstand" in cbm wächst zu schnell.

Gestern Abend den realen Zaehlerstand mit Hilfe Script eingegeben (3652.000). Wurde auch korrekt übernommen.
Heute am Zähler abgelesen (3653.700)
Real wurden bis jetzt 1.71 cbm Gas verbraucht.

Die Variable aus der Scriptberechnung "Gas Aktueller Zaehlerstand" zeigt 3896.98
Der Verbrauch wären dann 244.98 cbm.

btw. "Gas Aktualisierung" erhält auch keinen Zeitstempel.

Kann mir jemand dazu helfen?
Bildschirmfoto 2021-05-19 um 08.50.47.png

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von Xel66 » 19.05.2021, 11:28

Ich würde mal auf eine falsch konfigurierte Zählerkonstante tippen, denn die berechneten Werte sehen plausibel aus.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

wendel60
Beiträge: 12
Registriert: 18.04.2019, 07:34

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von wendel60 » 19.05.2021, 11:39

Hallo,
der HM-Zähler läuft seit Jahren korrekt.
Die Differenz zum realen Zählerstand ist seit dieser Zeit konstant bei +1179 cbm.
Sonst wäre das ein Ansatz.

Bei der Inkrementberechnung zum neuen Zählerstand, denke ich hakt es.....
Der "Gas Zaehlerstand Messgeraet Log" ändert sich in 2,5h nicht.??? Seltsam.

Noch jemand eine Idee?
Bildschirmfoto 2021-05-19 um 11.32.52.png

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
! Adaptiert Michael Hansen, 01/2021, V1.0; neue Kommentare sind mit ! * gekennzeichnet
! * V1.1 - Abfrage eingefügt, ob sich das Inkrement geändert hat. Nur dann wird gerechnet
! * Fehler in der Berechnung des aktuellen Verbrauchs beseitigt
! * V1.2 - Änderung, dass in den CCU internen Energiezähler der Verbrauch seit der letzten
! * Ablesung geschrieben wird (wie beim Originalskript von Jens)#
! * V1.3 - Zurücksetzen des täglichen Wasserverbrauchs in l ist ergänzt
! * V1.3b - Einige Kommentierungen ergänzt

! Version 1.4 (01.01.2018)

! Nun schauen wir wer uns aufgerufen hat (Device-Channel oder Timer) und welches Device
! es genau war (Nutzung der $src$ Variable) und danach entscheiden wir was wir
! zu tun haben.
object counter = dom.GetObject("$src$");
if(counter)
{
  object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);

  ! Wenn TypeName vom Typ HSSDP ist dann wurde das Program durch ein Event
  ! eines Devices erzeugt, ansonsten durch ein CALENDARDP welches der
  ! Ausfuehrung durch das Zeitmodul entspricht
  if(counter.TypeName() == "HSSDP")
  {
    ! Nun holen wir unmittelbar am anfang alle counter relevanten Daten ab
    ! und speichern sie fuer spaeter zwischen und berechnen auch gleich
    ! noch differenzwerte
    integer diffTime = counter.Timestamp().ToInteger() - counter.LastTimestamp().ToInteger();
    real curValue = counter.Value();
    real lastValue = counter.LastValue();
    real vVeraenderung_Zaehlerstand = ( curValue - lastValue );

    ! * Wir prüfen, ob es überhaupt einen Energieverbrauch gegeben hat und nur dann geht es in die
    ! * Berechnungen
    if (vVeraenderung_Zaehlerstand <> 0)
    {
      ! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom) -> hier muss Garten erweitert werden
      ! aus dem Namen des Channel. Ein Device muss also immer mit "XXXXX-Gas"
      ! bzw. "XXXXXX-Wasser", etc. enden.
      object channel = dom.GetObject(counter.Channel());
      string type = channel.Name().StrValueByIndex("-",1);
    
      ! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
      ! unserer verschiedenen Zaehlerwerte
      object oAktueller_Zaehlerstand = sysvar.Get(type # " aktueller Zaehlerstand");
      ! * oZaehlerstand_Messgeraet_Log benötigt man nur für die Inkrementberechnung mit
      ! * interner Variable
      object oZaehlerstand_Messgeraet_Log = sysvar.Get(type # " Zaehlerstand Messgeraet Log"); 
      object oVerbrauch_Aktuell = sysvar.Get(type # " Verbrauch aktuell");
      object oVerbrauch_Ablesung = sysvar.Get(type # " Verbrauch Ablesung");
      object oLetzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
      object oZaehlerstand_gestern = sysvar.Get(type # " Zaehlerstand gestern");
      object oVerbrauch_heute = sysvar.Get(type # " Verbrauch heute");
      object oZaehlerstand_letzte_Woche = sysvar.Get(type # " Zaehlerstand letzte Woche");
      object oVerbrauch_Woche = sysvar.Get(type # " Verbrauch Woche");
      object oZaehlerstand_letzter_Monat = sysvar.Get(type # " Zaehlerstand letzter Monat");
      object oVerbrauch_Monat = sysvar.Get(type # " Verbrauch Monat");
      object oZaehlerstand_letztes_Jahr = sysvar.Get(type # " Zaehlerstand letztes Jahr");
      object oVerbrauch_Jahr = sysvar.Get(type # " Verbrauch Jahr");
      ! * vUmrechnungsfaktor wird später nur geändert, wenn es der Stromzähler war (Wh vs. kWh)
      real vUmrechnungsfaktor = 1.0;
      ! * vFaktor_l Für die Umrechnung von m3 in l für den Tagesverbrauch Wasser.
      ! * Falls Gas oder Strom, dann wird der Wert auf 1 gesetzt
      real vFaktor_l = 1000.0;

      ! * Wenn der Gassensor aufgerufen hat, dann müssen wir die die Variable "Gas Verbrauch Jahr kWh"
      ! * für Gas laden
      if ( type == ( "Gas" ) )
      {
        object oVerbrauch_Jahr_kWh = sysvar.Get(type # " Verbrauch Jahr kWh"); 
        ! * Damit wir die kWh berechnen können, werden die Faktoren für die Umrechnung bei Gas
        ! * m3 -> kWh benötigt
        real vZustandszahl = 0.9094;
        real vFaktor = 10.2562;
      }

      ! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
      ! * Variable für "XXX Verbrauch heute l" laden
      if ( (type == "Wasser") || (type == "Garten"))
      {
        object oVerbrauch_heute_l = sysvar.Get(type # " Verbrauch heute l"); 
      }
      
      ! Jetzt machen wir die Inkrementberechnung
      ! * Wenn die Variable "XXX Zaehlerstand Messgeraet Log" noch nicht gesetzt wurde (= 0), dann
      ! * wird der letzte Zaehlerstand des Messgerätes verwendet

      if ( oZaehlerstand_Messgeraet_Log.Value() == 0 )
      {
        oZaehlerstand_Messgeraet_Log.State(lastValue);
      }
	  
	  real vInkrement_Geraetezaehler = ( curValue - oZaehlerstand_Messgeraet_Log.Value() );
      
      ! * Der Faktor wird für den aktuellen Verbrauch benötigt, da der bei Wasser nur als Angabe in
      ! * l Sinn macht
      if ( (type == "Wasser") || (type == "Garten"))
      {
        vFaktor_l = 1000.0;
      }
      else
      {
        vFaktor_l = 1.0;
      }
    
      ! Jetzt wird das Inkrement zum letzten Zaehlerstand berechnet
      ! * Dabei muss der Umrechnungsfaktor für die Wasserzaehlung identifiziert und gesetzt werden
      ! * Strom und Gas benötigen keine Umrechnung (Wasser = l; Strom = kWh; Gas = m3).
      ! * vUmrechnungsfaktor wird für den Fall des Batteriewechsels bzw. Zählerüberlaufs benötigt
      ! * (auch noch später)
      if ( type == "Strom"  )
      {
        vUmrechnungsfaktor = 1000.0;
        vInkrement_Geraetezaehler = vInkrement_Geraetezaehler / vUmrechnungsfaktor;
      }
 
      ! Aktuellen Verbrauch berechnen
      if(diffTime > 0)
      {
        oVerbrauch_Aktuell.State(3600.0 * vFaktor_l * vInkrement_Geraetezaehler * vUmrechnungsfaktor / diffTime);
      }
  
      ! Aktuellen Zaehlerstand berechnen
      if (vInkrement_Geraetezaehler < 0)
      {
        ! * Wenn Batteriewechsel, dann direkt den Zaehlerstand des Gerätes addieren
        oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + curValue / vUmrechnungsfaktor));
      }
      else
      {
        ! * Wenn kein Batteriewechsel stattgefunden hat, dann das Inkrement addieren
       oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + vInkrement_Geraetezaehler ));
      }
  
      ! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
      ! des Verbrauches da sind neu berechnen.
      oVerbrauch_heute.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_gestern.Value()) );  
      oVerbrauch_Woche.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzte_Woche.Value()) );
      oVerbrauch_Monat.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzter_Monat.Value()) );
      oVerbrauch_Jahr.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letztes_Jahr.Value()) );
      oVerbrauch_Ablesung.State( ( oAktueller_Zaehlerstand.Value() - oLetzte_Ablesung.Value()) );
 
      ! * Wenn es der Wasser- oder Gartewasserzähler ist, dann berechnen wir noch den Tagesverbrauch
      ! * in l
      if (( type == "Wasser") || ( type == "Garten"))
      {
        oVerbrauch_heute_l.State(oVerbrauch_heute.Value() * vFaktor_l);
      }
    
      ! * Wenn es der Gaszähler ist, dann berechnen wir den Jahresverbrauch für Gas in kWh
      if (type == "Gas" )
      {
        oVerbrauch_Jahr_kWh.State( (oVerbrauch_Jahr.Value() * vZustandszahl * vFaktor) );
      }
    
      ! * Jetzt schreiben wir den aktuellen Zaehlerstand des Sensors in unsere Log Variable
      oZaehlerstand_Messgeraet_Log.State(curValue);
    
    
      ! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
      ! dem Wert der letzten Ablesung
      if(counter.HssType() != "GAS_ENERGY_COUNTER")
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounter_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          ! * Aktueller Zaehlerstand ist kWh. Die Variable erwartet Wh und rechnet dies dann ggf. in der Anzeige
          ! * selbst in kWh um
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() * 1000 ); 
        }
      }
      else
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() );
        }
      }

    
      ! Die aktuelle Zeit in eine separate Systemvariable schreiben
      ! damit man direkt sehen kann wann die Zaehelrstaende das letzte
      ! mal aktualisiert wurden.
      sysvar.Get(type # " Aktualisierung").State(system.Date("%F %X"));
    }
  }
  else
  {
    ! Tageszaehleraktualisierung fuer alle Hausanschluss-Zaehler
    ! Hier wird mittels eines Timers der taeglich immer genau um 00:01
    ! dieses Programm ausfuehrt die Systemvariablen aktualisiert die
    ! die Tages/Wochen/Monat/Jahreswerte beinhalten.

    ! Nur weitermachen wenn es wirklich Mitternacht ist
    if(system.Date("%H:%M") == "00:01")
    {
      ! * Für 'string a=""' jetzt die Zähler aufzählen, die ihr am Laufen habt.
      ! *  für z.B. Strom- und Wasserzähler muss die Zeile wie folgt geändert werden
      ! * string a="Strom,Wasser";
      string a="Gas";
      string b;
      object oAktueller_Zaehlerstand;
      object oZaehlerstand_letzte_Woche;
      object oVerbrauch_Woche;
      object oVerbrauch_letzte_Woche;
      object oZaehlerstand_letzter_Monat;
      object oVerbrauch_Monat;
      object oVerbrauch_letzter_Monat;
      object oZaehlerstand_letztes_Jahr;
      object oVerbrauch_Jahr;
      object oVerbrauch_letztes_Jahr;
      object oZaehlerstand_gestern;
      object oVerbrauch_heute;
      object oVerbrauch_gestern;

      ! Nun ueber alle Hauszaehler iterieren
      foreach(b, a.Split(","))
      {
        ! momentaner Zaehlerstand
        oAktueller_Zaehlerstand = sysvar.Get(b # " aktueller Zaehlerstand");
        if(oAktueller_Zaehlerstand)
        {  
          ! Nach Wochenanfang pruefen
          if(system.Date("%a") == "Mon")
          {
            oZaehlerstand_letzte_Woche = sysvar.Get(b # " Zaehlerstand letzte Woche");
            oVerbrauch_Woche = sysvar.Get(b # " Verbrauch Woche");
            oVerbrauch_letzte_Woche = sysvar.Get(b # " Verbrauch letzte Woche");
            
            ! Verbrauch der letzten Woche speichern
            oVerbrauch_letzte_Woche.State( oVerbrauch_Woche.Value() );
            
            ! Referenzwert der Woche speichern
            oZaehlerstand_letzte_Woche.State( oAktueller_Zaehlerstand.Value() );
  
            ! Wochenverbrauch auf 0 setzen
            oVerbrauch_Woche.State(0);   
          }

          ! Nach Monatsanfang pruefen
          if(system.Date("%d") == "01")
          {
            oZaehlerstand_letzter_Monat = sysvar.Get(b # " Zaehlerstand letzter Monat");
            oVerbrauch_Monat = sysvar.Get(b # " Verbrauch Monat");
            oVerbrauch_letzter_Monat = sysvar.Get(b # " Verbrauch letzter Monat");
  
            ! Verbrauch des letzten Monats speichern
            oVerbrauch_letzter_Monat.State( oVerbrauch_Monat.Value() );
  
            ! Referenzwert des Monats speichern
            oZaehlerstand_letzter_Monat.State( oAktueller_Zaehlerstand.Value() );
      
            ! Monatsverbrauch auf 0 setzen
            oVerbrauch_Monat.State(0);       
      
            ! Nach Jahresanfang pruefen
            if(system.Date("%m") == "01")
            {
              oZaehlerstand_letztes_Jahr = sysvar.Get(b # " Zaehlerstand letztes Jahr");
              oVerbrauch_Jahr = sysvar.Get(b # " Verbrauch Jahr");
              oVerbrauch_letztes_Jahr = sysvar.Get(b # " Verbrauch letztes Jahr");
  
              ! Verbrauch des letzten Kalenderjahr speichern
              oVerbrauch_letztes_Jahr.State( oVerbrauch_Jahr.Value() );
  
              ! Referenzwert des Kalenderjahr speichern
              oZaehlerstand_letztes_Jahr.State( oAktueller_Zaehlerstand.Value() );
        
              ! Jahresverbrauch auf 0 setzen
              oVerbrauch_Jahr.State(0);       
            }
          }

          ! aktueller Tagesverbrauch speichern
          oZaehlerstand_gestern = sysvar.Get(b # " Zaehlerstand gestern");
          oVerbrauch_heute = sysvar.Get(b # " Verbrauch heute");
          oVerbrauch_gestern = sysvar.Get(b # " Verbrauch gestern");
          oVerbrauch_heute_l = sysvar.Get(b # " Verbrauch heute l");
          
          
          ! Verbrauch gestern speichern
          oVerbrauch_gestern.State(oVerbrauch_heute.Value());
  
          ! Referenzwert des Tages speichern
          oZaehlerstand_gestern.State(oAktueller_Zaehlerstand.Value());

          ! Tagesverbrauch auf 0 setzen
          oVerbrauch_heute.State(0);
          
          if (( b == "Wasser") || ( b == "Garten"))
          {
            oVerbrauch_heute_l.State(0);
          }
          
        }
      }
    }
  }
}

michael24179
Beiträge: 28
Registriert: 13.09.2017, 14:06
Hat sich bedankt: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von michael24179 » 21.11.2021, 18:14

Ich habe diese Woche mein Gas Zähler einen Sensor spendiert und wollte heute erneut testen, ob ich das Script zum laufen bekomme.Ich weis nicht was ich falsch mache, aber es läuft nicht.

Im CUxD bekomme ich folgenden fehler wenn die CCU veränderung feststellt und das Script ausführt

Code: Alles auswählen

Nov 21 17:51:23 homematic local0.err ReGaHss: ERROR: interface pointer are not initialized [CheckValidTime():iseDOMdpCal.cpp:150]
Nov 21 17:51:25 homematic local0.err ReGaHss: ERROR: ScriptRuntimeError: ! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM ! ! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de> ! Adaptiert Michael Hansen, 01/2021, V1.0; neue Kommentare sind mit ! * gekennzeichnet ! * V1.1 - Abfrage eingefügt, ob sich das Inkrement geändert hat. Nur dann wird gerechnet ! * Fehler in der Berechnung des aktuellen Verbrauchs beseitigt ! * V1.2 - Änderung, dass in den CCU internen Energiezähler der Verbrauch seit der l
tzten ! * Ablesung geschrieben wird (wie beim Originalskript von Jens)# ! * V1.3 - Zurücksetzen des täglichen Wasserverbrauchs in l ist ergänzt ! * V1.3b - Einige Kommentierungen ergänzt  ! Version 1.4 (01.01.2018)  ! Nun schauen wir wer uns aufgerufen hat (Device-Channel oder Timer) und welches Device ! es genau war (Nutzung der 33688 Variable) und danach entscheiden wir was wir ! zu tun haben. object counter = dom.GetObject("33688"); if(counter) {   object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);   
! Wenn TypeName v
Nov 21 17:51:38 homematic daemon.info cuxd[648]: INIT 'xmlrpc_bin://192.168.1.10:9876' '(null)'
Nov 21 17:51:38 homematic daemon.info cuxd[648]: INIT 'xmlrpc_bin://192.168.1.10:9876' 'HAP_CUxD.'
Nov 21 17:51:43 homematic local0.err ReGaHss: ERROR: ScriptRuntimeError: string action = 'dcCreate';integer cId = 33683;integer iStatusOnly = 0; [ExecError():iseESPexec.cpp:12798]
Nov 21 17:51:45 homematic local0.err ReGaHss: ERROR: interface pointer are not initialized [CheckValidTime():iseDOMdpCal.cpp:150]
Mein Script ist unverändert, bis auf das ende, wo ich meine Geräte angebe, welche ich auslese (Gas,Strom)

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
! Adaptiert Michael Hansen, 01/2021, V1.0; neue Kommentare sind mit ! * gekennzeichnet
! * V1.1 - Abfrage eingefügt, ob sich das Inkrement geändert hat. Nur dann wird gerechnet
! * Fehler in der Berechnung des aktuellen Verbrauchs beseitigt
! * V1.2 - Änderung, dass in den CCU internen Energiezähler der Verbrauch seit der letzten
! * Ablesung geschrieben wird (wie beim Originalskript von Jens)#
! * V1.3 - Zurücksetzen des täglichen Wasserverbrauchs in l ist ergänzt
! * V1.3b - Einige Kommentierungen ergänzt

! Version 1.4 (01.01.2018)

! Nun schauen wir wer uns aufgerufen hat (Device-Channel oder Timer) und welches Device
! es genau war (Nutzung der $src$ Variable) und danach entscheiden wir was wir
! zu tun haben.
object counter = dom.GetObject("$src$");
if(counter)
{
  object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);

  ! Wenn TypeName vom Typ HSSDP ist dann wurde das Program durch ein Event
  ! eines Devices erzeugt, ansonsten durch ein CALENDARDP welches der
  ! Ausfuehrung durch das Zeitmodul entspricht
  if(counter.TypeName() == "HSSDP")
  {
    ! Nun holen wir unmittelbar am anfang alle counter relevanten Daten ab
    ! und speichern sie fuer spaeter zwischen und berechnen auch gleich
    ! noch differenzwerte
    integer diffTime = counter.Timestamp().ToInteger() - counter.LastTimestamp().ToInteger();
    real curValue = counter.Value();
    real lastValue = counter.LastValue();
    real vVeraenderung_Zaehlerstand = ( curValue - lastValue );

    ! * Wir prüfen, ob es überhaupt einen Energieverbrauch gegeben hat und nur dann geht es in die
    ! * Berechnungen
    if (vVeraenderung_Zaehlerstand <> 0)
    {
      ! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom) -> hier muss Garten erweitert werden
      ! aus dem Namen des Channel. Ein Device muss also immer mit "XXXXX-Gas"
      ! bzw. "XXXXXX-Wasser", etc. enden.
      object channel = dom.GetObject(counter.Channel());
      string type = channel.Name().StrValueByIndex("-",1);
    
      ! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
      ! unserer verschiedenen Zaehlerwerte
      object oAktueller_Zaehlerstand = sysvar.Get(type # " aktueller Zaehlerstand");
      ! * oZaehlerstand_Messgeraet_Log benötigt man nur für die Inkrementberechnung mit
      ! * interner Variable
      object oZaehlerstand_Messgeraet_Log = sysvar.Get(type # " Zaehlerstand Messgeraet Log"); 
      object oVerbrauch_Aktuell = sysvar.Get(type # " Verbrauch aktuell");
      object oVerbrauch_Ablesung = sysvar.Get(type # " Verbrauch Ablesung");
      object oLetzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
      object oZaehlerstand_gestern = sysvar.Get(type # " Zaehlerstand gestern");
      object oVerbrauch_heute = sysvar.Get(type # " Verbrauch heute");
      object oZaehlerstand_letzte_Woche = sysvar.Get(type # " Zaehlerstand letzte Woche");
      object oVerbrauch_Woche = sysvar.Get(type # " Verbrauch Woche");
      object oZaehlerstand_letzter_Monat = sysvar.Get(type # " Zaehlerstand letzter Monat");
      object oVerbrauch_Monat = sysvar.Get(type # " Verbrauch Monat");
      object oZaehlerstand_letztes_Jahr = sysvar.Get(type # " Zaehlerstand letztes Jahr");
      object oVerbrauch_Jahr = sysvar.Get(type # " Verbrauch Jahr");
      ! * vUmrechnungsfaktor wird später nur geändert, wenn es der Stromzähler war (Wh vs. kWh)
      real vUmrechnungsfaktor = 1.0;
      ! * vFaktor_l Für die Umrechnung von m3 in l für den Tagesverbrauch Wasser.
      ! * Falls Gas oder Strom, dann wird der Wert auf 1 gesetzt
      real vFaktor_l = 1000.0;

      ! * Wenn der Gassensor aufgerufen hat, dann müssen wir die die Variable "Gas Verbrauch Jahr kWh"
      ! * für Gas laden
      if ( type == ( "Gas" ) )
      {
        object oVerbrauch_Jahr_kWh = sysvar.Get(type # " Verbrauch Jahr kWh"); 
        ! * Damit wir die kWh berechnen können, werden die Faktoren für die Umrechnung bei Gas
        ! * m3 -> kWh benötigt
        real vZustandszahl = 0.9639;
        real vFaktor = 10.039;
      }

      ! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
      ! * Variable für "XXX Verbrauch heute l" laden
      if ( (type == "Wasser") || (type == "Garten"))
      {
        object oVerbrauch_heute_l = sysvar.Get(type # " Verbrauch heute l"); 
      }
      
      ! Jetzt machen wir die Inkrementberechnung
      ! * Wenn die Variable "XXX Zaehlerstand Messgeraet Log" noch nicht gesetzt wurde (= 0), dann
      ! * wird der letzte Zaehlerstand des Messgerätes verwendet

      if ( oZaehlerstand_Messgeraet_Log.Value() == 0 )
      {
        oZaehlerstand_Messgeraet_Log.State(lastValue);
      }
	  
	  real vInkrement_Geraetezaehler = ( curValue - oZaehlerstand_Messgeraet_Log.Value() );
      
      ! * Der Faktor wird für den aktuellen Verbrauch benötigt, da der bei Wasser nur als Angabe in
      ! * l Sinn macht
      if ( (type == "Wasser") || (type == "Garten"))
      {
        vFaktor_l = 1000.0;
      }
      else
      {
        vFaktor_l = 1.0;
      }
    
      ! Jetzt wird das Inkrement zum letzten Zaehlerstand berechnet
      ! * Dabei muss der Umrechnungsfaktor für die Wasserzaehlung identifiziert und gesetzt werden
      ! * Strom und Gas benötigen keine Umrechnung (Wasser = l; Strom = kWh; Gas = m3).
      ! * vUmrechnungsfaktor wird für den Fall des Batteriewechsels bzw. Zählerüberlaufs benötigt
      ! * (auch noch später)
      if ( type == "Strom"  )
      {
        vUmrechnungsfaktor = 1000.0;
        vInkrement_Geraetezaehler = vInkrement_Geraetezaehler / vUmrechnungsfaktor;
      }
 
      ! Aktuellen Verbrauch berechnen
      if(diffTime > 0)
      {
        oVerbrauch_Aktuell.State(3600.0 * vFaktor_l * vInkrement_Geraetezaehler * vUmrechnungsfaktor / diffTime);
      }
  
      ! Aktuellen Zaehlerstand berechnen
      if (vInkrement_Geraetezaehler < 0)
      {
        ! * Wenn Batteriewechsel, dann direkt den Zaehlerstand des Gerätes addieren
        oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + curValue / vUmrechnungsfaktor));
      }
      else
      {
        ! * Wenn kein Batteriewechsel stattgefunden hat, dann das Inkrement addieren
       oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + vInkrement_Geraetezaehler ));
      }
  
      ! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
      ! des Verbrauches da sind neu berechnen.
      oVerbrauch_heute.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_gestern.Value()) );  
      oVerbrauch_Woche.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzte_Woche.Value()) );
      oVerbrauch_Monat.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzter_Monat.Value()) );
      oVerbrauch_Jahr.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letztes_Jahr.Value()) );
      oVerbrauch_Ablesung.State( ( oAktueller_Zaehlerstand.Value() - oLetzte_Ablesung.Value()) );
 
      ! * Wenn es der Wasser- oder Gartewasserzähler ist, dann berechnen wir noch den Tagesverbrauch
      ! * in l
      if (( type == "Wasser") || ( type == "Garten"))
      {
        oVerbrauch_heute_l.State(oVerbrauch_heute.Value() * vFaktor_l);
      }
    
      ! * Wenn es der Gaszähler ist, dann berechnen wir den Jahresverbrauch für Gas in kWh
      if (type == "Gas" )
      {
        oVerbrauch_Jahr_kWh.State( (oVerbrauch_Jahr.Value() * vZustandszahl * vFaktor) );
      }
    
      ! * Jetzt schreiben wir den aktuellen Zaehlerstand des Sensors in unsere Log Variable
      oZaehlerstand_Messgeraet_Log.State(curValue);
    
    
      ! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
      ! dem Wert der letzten Ablesung
      if(counter.HssType() != "GAS_ENERGY_COUNTER")
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounter_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          ! * Aktueller Zaehlerstand ist kWh. Die Variable erwartet Wh und rechnet dies dann ggf. in der Anzeige
          ! * selbst in kWh um
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() * 1000 ); 
        }
      }
      else
      {
        object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
        if(oSysVarEnergyCounter)
        {
          oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() );
        }
      }

    
      ! Die aktuelle Zeit in eine separate Systemvariable schreiben
      ! damit man direkt sehen kann wann die Zaehelrstaende das letzte
      ! mal aktualisiert wurden.
      sysvar.Get(type # " Aktualisierung").State(system.Date("%F %X"));
    }
  }
  else
  {
    ! Tageszaehleraktualisierung fuer alle Hausanschluss-Zaehler
    ! Hier wird mittels eines Timers der taeglich immer genau um 00:01
    ! dieses Programm ausfuehrt die Systemvariablen aktualisiert die
    ! die Tages/Wochen/Monat/Jahreswerte beinhalten.

    ! Nur weitermachen wenn es wirklich Mitternacht ist
    if(system.Date("%H:%M") == "00:01")
    {
      ! * Für 'string a=""' jetzt die Zähler aufzählen, die ihr am Laufen habt.
      ! *  für z.B. Strom- und Wasserzähler muss die Zeile wie folgt geändert werden
      ! * string a="Strom,Wasser";
      string a="Gas,Strom";
      string b;
      object oAktueller_Zaehlerstand;
      object oZaehlerstand_letzte_Woche;
      object oVerbrauch_Woche;
      object oVerbrauch_letzte_Woche;
      object oZaehlerstand_letzter_Monat;
      object oVerbrauch_Monat;
      object oVerbrauch_letzter_Monat;
      object oZaehlerstand_letztes_Jahr;
      object oVerbrauch_Jahr;
      object oVerbrauch_letztes_Jahr;
      object oZaehlerstand_gestern;
      object oVerbrauch_heute;
      object oVerbrauch_gestern;

      ! Nun ueber alle Hauszaehler iterieren
      foreach(b, a.Split(","))
      {
        ! momentaner Zaehlerstand
        oAktueller_Zaehlerstand = sysvar.Get(b # " aktueller Zaehlerstand");
        if(oAktueller_Zaehlerstand)
        {  
          ! Nach Wochenanfang pruefen
          if(system.Date("%a") == "Mon")
          {
            oZaehlerstand_letzte_Woche = sysvar.Get(b # " Zaehlerstand letzte Woche");
            oVerbrauch_Woche = sysvar.Get(b # " Verbrauch Woche");
            oVerbrauch_letzte_Woche = sysvar.Get(b # " Verbrauch letzte Woche");
            
            ! Verbrauch der letzten Woche speichern
            oVerbrauch_letzte_Woche.State( oVerbrauch_Woche.Value() );
            
            ! Referenzwert der Woche speichern
            oZaehlerstand_letzte_Woche.State( oAktueller_Zaehlerstand.Value() );
  
            ! Wochenverbrauch auf 0 setzen
            oVerbrauch_Woche.State(0);   
          }

          ! Nach Monatsanfang pruefen
          if(system.Date("%d") == "01")
          {
            oZaehlerstand_letzter_Monat = sysvar.Get(b # " Zaehlerstand letzter Monat");
            oVerbrauch_Monat = sysvar.Get(b # " Verbrauch Monat");
            oVerbrauch_letzter_Monat = sysvar.Get(b # " Verbrauch letzter Monat");
  
            ! Verbrauch des letzten Monats speichern
            oVerbrauch_letzter_Monat.State( oVerbrauch_Monat.Value() );
  
            ! Referenzwert des Monats speichern
            oZaehlerstand_letzter_Monat.State( oAktueller_Zaehlerstand.Value() );
      
            ! Monatsverbrauch auf 0 setzen
            oVerbrauch_Monat.State(0);       
      
            ! Nach Jahresanfang pruefen
            if(system.Date("%m") == "01")
            {
              oZaehlerstand_letztes_Jahr = sysvar.Get(b # " Zaehlerstand letztes Jahr");
              oVerbrauch_Jahr = sysvar.Get(b # " Verbrauch Jahr");
              oVerbrauch_letztes_Jahr = sysvar.Get(b # " Verbrauch letztes Jahr");
  
              ! Verbrauch des letzten Kalenderjahr speichern
              oVerbrauch_letztes_Jahr.State( oVerbrauch_Jahr.Value() );
  
              ! Referenzwert des Kalenderjahr speichern
              oZaehlerstand_letztes_Jahr.State( oAktueller_Zaehlerstand.Value() );
        
              ! Jahresverbrauch auf 0 setzen
              oVerbrauch_Jahr.State(0);       
            }
          }

          ! aktueller Tagesverbrauch speichern
          oZaehlerstand_gestern = sysvar.Get(b # " Zaehlerstand gestern");
          oVerbrauch_heute = sysvar.Get(b # " Verbrauch heute");
          oVerbrauch_gestern = sysvar.Get(b # " Verbrauch gestern");
          oVerbrauch_heute_l = sysvar.Get(b # " Verbrauch heute l");
          
          
          ! Verbrauch gestern speichern
          oVerbrauch_gestern.State(oVerbrauch_heute.Value());
  
          ! Referenzwert des Tages speichern
          oZaehlerstand_gestern.State(oAktueller_Zaehlerstand.Value());

          ! Tagesverbrauch auf 0 setzen
          oVerbrauch_heute.State(0);
          
          if (( b == "Wasser") || ( b == "Garten"))
          {
            oVerbrauch_heute_l.State(0);
          }
          
        }
      }
    }
  }
}
Bild


Bild

Bild

Bild

Bild

michael24179
Beiträge: 28
Registriert: 13.09.2017, 14:06
Hat sich bedankt: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von michael24179 » 21.11.2021, 20:42

Mein Strom wird jetzt berechnet, bei Gas passt noch etwas nicht. Beim Strom hat eine Systemvariable gefehlt. Für Gas kann ich leider keine fehlende Variable mehr finden

Das sind meine Variablen

Strom Verbrauch Ablesung
Strom Verbrauch aktuell
Strom Verbrauch heute
Strom Verbrauch gestern
Strom Verbrauch Woche
Strom Verbrauch Monat
Strom Verbrauch Jahr
Strom Verbrauch letzte Woche
Strom Verbrauch letzter Monat
Strom Verbrauch letztes Jahr
Strom Zaehlerstand gestern
Strom Zaehlerstand letzte Woche
Strom Zaehlerstand letzter Monat
Strom Zaehlerstand letztes Jahr
Strom Zaehlerstand letzte Ablesung
Strom Verbrauch Jahr kWh
Strom aktueller Zaehlerstand
Strom Zaehlerstand Messgeraet Log
Strom Aktualisierung

Gas Verbrauch Ablesung
Gas Verbrauch aktuell
Gas Verbrauch heute
Gas Verbrauch gestern
Gas Verbrauch Woche
Gas Verbrauch Monat
Gas Verbrauch Jahr
Gas Verbrauch letzte Woche
Gas Verbrauch letzter Monat
Gas Verbrauch letztes Jahr
Gas Zaehlerstand gestern
Gas Zaehlerstand letzte Woche
Gas Zaehlerstand letzter Monat
Gas Zaehlerstand letztes Jahr
Gas Zaehlerstand letzte Ablesung
Gas Verbrauch Jahr kWh
Gas aktueller Zaehlerstand
Gas Zaehlerstand Messgeraet Log
Gas Aktualisierung
Gas Verbrauch Jahr kWh

wendel60
Beiträge: 12
Registriert: 18.04.2019, 07:34

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von wendel60 » 12.01.2022, 08:50

Ich brauche mal eure Hilfe.

Der "Energie-Zähler Gerät" zeigt "Wh". Damit ist auch "Zaehlerstand Messgeraet Log" bei über 400.000.
Bei euch scheinen korrekterweise kWh angezeigt zu werden.

Die anderen Werte und Auswertungen passen.

Wo kann der Fehler liegen??
Dateianhänge
Bildschirmfoto 2022-01-12 um 08.42.11.png

Raspihausfan_1
Beiträge: 392
Registriert: 26.06.2018, 11:02
Hat sich bedankt: 4 Mal
Danksagung erhalten: 11 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von Raspihausfan_1 » 15.01.2022, 21:29

Heute nach dem Update auf RaspberryMativ (3.61.7.20220115) stimmen einige Werte nicht mehr, diese wachsen sehr schnell an:
Stromverbrauch aktuell wächst unbegrenzt, steht schon bei ca. 16 kWh
Stromverbrauch heute hat bereits ca. 61 kWh, paar Minuten später steht er bereits bei 71 kWh!
Strom Aktualisierung bleibt stehen, obwohl die letzte Änderung in der Anzeige bereits 45 min weiter ist.

Raspihausfan_1
Beiträge: 392
Registriert: 26.06.2018, 11:02
Hat sich bedankt: 4 Mal
Danksagung erhalten: 11 Mal

Re: Zählersensor HM-ES-TX-WM - Zählerstandberechnung - Batteriewechsel berücksichtigt

Beitrag von Raspihausfan_1 » 16.01.2022, 10:39

Nach dem Firmwareupdate von gestern Nachmittag habe ich mal die aktuellen Stände kopiert.
2022-01-16_fehlerhafte Auswertung Stromzähler.JPG
Was alles fehlerhaft ist, ist rot markiert. Da sind auch Werte dabei, welche über die Initialisierung eingegeben wurden.
Wie bekomme ich den Schiefstand der Daten weg? Es ist auch die Aktualisierung auf gestern Abend stehen geblieben. Programm Stop/Start hat nichts gebracht.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“