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

MichHan
Beiträge: 33
Registriert: 25.12.2020, 10:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von MichHan » 22.01.2021, 19:33

Hallo zusammen,
dies ist meine erste Veröffentlichung eines Scripts, dass auf dem Script von Jens Maus basiert:
viewtopic.php?f=27&t=31353&hilit=Z%C3%A ... erechnung
Dort hatte ich zuerst gepostet und Jens und Nick haben empfohlen, einen neuen Beitrag zu starten.
Ich bin in Sachen scripting kein Profi. Von daher bitte ich um Nachsicht. Das Script läuft bei mir ohne Probleme.

An dieser Stelle: Jens hat das Script und die Anweisung geschrieben, auf der ich lediglich mit kleinen Modifikationen aufgesetzt habe. Ich habe auch Textstellen zur Installation aus dem Originalpost von Jens verwendet, weil sie einfach gleich geblieben sind.

Log:
2021-01-24: V1.1:
- Es wird geprüft, ob es eine Änderung im Energiezähler des auslösenden Sensors gegeben hat, nur dann wird gerechnet
- Es gab einen Fehler in der Berechnung des aktuellen Verbrauchs (Faktoren müssen zu korrekten Berechnung mit Komma gesetzt sein
- Entfernung nicht benötigter Variablen (Danke an Baxxy)

2021-01-24: V1.2
- Ich hatte in den CCU internen Energiezähler den aktuellen Zählerstand geschrieben und habe dies analog zum Originalskript von Jens auf den Verbrauch seit der letzten Ablesung (zurück)-geändert (Danke an Bacardy)

2021-01-27: V1.3
- Das zurücksetzen der Variablen für den täglichen Wasserverbrauch in l hatte gefehlt und ist jetzt drin

2021-04-18: V1.3b
- Einige Kommentierung zum besseren Verständnis ergänzt



So jetzt aber zum modifzierten Script und der Motivation:
Ich habe mich in den letzten Tagen mit der Batteriethematik beschäftigt, weil mich die aktuelle Lösung in Verbindung mit der Referenzvariable, die nicht direkt dem Zählerstand entspricht, immer verwirrt hatte. :?:
Ich habe das Script von Jens so modifiziert, dass ein Batteriewechsel ohne zusätzliche Maßnahmen gemacht werden kann. Auch Rebooten der CCU ist kein Problem. Ein Überlauf der Variablen des Energiesensors ist auch nicht zu berücksichtigen.

Das habe ich dadurch erreicht, dass ich die Variable, die den aktuellen Zählerstand enthält, immer um das Inkement zwischen dem aktuellem Wert und dem letzten Wert des Energiesensors erhöhe (und nicht durch die jeweilige Differenz zu der Referenzvariable absolut).
Die Differenz ermittle ich mit dem aktuellen Stand des Energiezählers und dem letzten Stand, den ich in einer neuen Variablen in der CCU speichere. Ich habe bewußt nicht den Wert LastValue des Energiezählers benutzt, damit bei einem Verlustpaket (Signal des Energiesensors zur CCU kommt nicht an) der letzte Zählerstand der in der letzten Inkrementberechnung verwendet wurde, in der CCU vorliegt. Dadurch wird bei der nächsten
erfolgreichen Übertragung das verlorene Datenpaket im Inkrement berücksichtig.

Bei Überlauf oder Batteriwechsel wird die Differenz negativ (das benutzt Jens, um den Überlauf zu identifizieren). Ich erhöhe in diesem Fall einfach den Zählerstand nicht durch das Inkrement, sondern direkt durch den Wert des Energiesensores (der ist ja jetzt knapp über Null). Dadurch geht, wenn überhaupt, die Differenz zwischen letztem Wert des Energiesensors bis zum Batteriewechsel / Überlauf verloren. Bei mir sind das (maximal) 50 Wh beim Strom, 0,1 m3 bei Gas und 0,001 m3 beim Wasser. Wenn man den Batteriewechsel macht, bevor der nächste Impuls kommt, dann hat man gar keine Lücke. Damit kann ich gut leben.
Falls man solche kleinen Differenzen beheben will, dann kann man den Zählerstand ablesen und diesen Wert direkt in der Variablen "XXX aktueller Zaehlerstand" abspeichern (im Sinne wysiwyg). Keine verwirrenden Referenzwerte mehr.

Zusätzlich habe ich die Variablen teilweise anders benannt (damit hatte ich im Script eine bessere Übersicht, was jetzt gemeint ist). Ich habe auch zusätzliche Variablen eingeführt (Tageswasserverbrauch in l, Gasverbrauch in kWh, Gartenwasserzähler, ...).
Damit kann es (leider) nicht einfach 1:1 mit den existierenden Variablen übernommen werden.

Folgende Anmerkungen:
- ich habe einige neue Variablen eingeführt
- Gasverbrauch in kWh (die dafür notwendigen Werte für die Zustandszahl und den Faktor habe ich im Script selbst hinterlegt)
- den Tagesverbrauch von Wasser in l
- den Wert des Energiezählers als Logvariable in der CCU (wird für die Inkrementbildung benötigt)
- Variablen zur Erfassung der letzten Werte (gestern, letzte Woche, letzter Monat, letztes Jahr)

Da ich einen Zähler für das Gartenwasser habe, taucht im Script teilweise die Abfrage danach auf.

An dieser Stelle übernehme ich die Anweisung von Jens, um die notwendigen Schritte zur Installation zu nehmen:


Installation/Inbetriebnahme:

Namensgebung der HM-ES-TX-WM Damit das Auswerteprogramm und der Skript korrekt funktionieren müssen alle eingesetzten HM-ES-TX-WM Geräte eine eineindeutige Namensgebung besitzen die den jeweiligen Zählertyp (Strom, Gas, Wasser, ...) wiedergeben. Wichtig ist hierbei das der Name jeweils mit "-Typ" endet. D.h. für einen Stromzähler eben z.B. "Hausanschluss-Strom". Hier einmal ein Screenshot der Benennung meiner eingesetzten HM-ES-TX-WM:
Screenshot (15).png
Screenshot (15).png (14.76 KiB) 10672 mal betrachtet


Auf Anregung hier auch nochmal ein Screenshot der aufgeklappten Zähler. Bitte darauf achten, dass der Name für den Kanal stimmt, auf dem auch die Übertragung der Daten stattfindet:


Homematic_forum_Hausanschluss.png

Anlegen der notwendigen Systemvariablen

Für jeden Typ (Strom, Gas, Wasser, ...) eines eingesetzten HM-ES-TX-WM müssen in der CCU eine gewisse Menge an Systemvariablen eingerichtet werden. Der folgende Screenshot zeigt hierbei den Auszug der benötigten Systemvariablen für einen HM-ES-TX-WM der an einem Wasserzähler betrieben wird. Wichtig ist hierbei das die Systemvariablen immer mit der jeweiligen Typenbezeichnung beginnen, in dem Falle eben "Wasser ":
Screenshot 1-1.png
Screenshot 1-2.png
Screenshot 1-3.png
Screenshot 1-4.png

Bitte bedenken, dass für einen Gaszähler die Systemvariable für die Angabe in kWh erforderlich ist:
Screenshot 1-5.png
Screenshot 1-5.png (19.87 KiB) 10482 mal betrachtet

Anlegen eines neuen Programmes + Skriptes für Zählerauswertung
Damit die Zählerauswertung regelmäßig erfolgt muss am Schluss in der CCU ein neues Programm angelegt werden das auf der einen Seite bei Veränderungen der Energie-Zähler werte bei Aktualisierung ausgelöst wird, aber eben auch durch einen täglichen Timer um genau 0:01 Uhr. Wichtig ist hierbei das man in dem Programm ALLE seine HM-ES-TX-WM Geräte in die erste "Wenn..." Bedingung einträgt und nicht für jedes HM-ES-TX-WM ein separates Programm macht. Das Programm sollte z.B. bei Einsatz von drei HM-ES-TX-WM Geräten (Gas, Strom, Wasser, ...) wie folgt aussehen:
Screenshot (18).png
HINWEIS: Wenn man als Stromzähler die IEC Variante zum abgreifen der Zahlenwerte nutzt muss natürlich in dem Programm bei der Bedingung entsprechend "IEC Energie-Zähler Gerät" ausgewählt werden.


Einfügen des notwendigen Skriptes zur Verbrauchsberechnung
Damit die Verbrauchsberechnung durchführt wird muss nun am Schluss noch das folgende Skript unter "Aktivität: Dann..." eingefügt werden (Eigene Modifikationen/Anpassungen müssten daran eigentlich nicht notwendig sein):

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,Wasser,Garten";
      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);
          }
          
        }
      }
    }
  }
}


Initiale Einrichtung/Anpassung Zählerstande:

Damit die Berechnung des aktuellen Zählerstandes funktioniert muss man mittels des folgenden Skriptes verschiedene Variablen setzen:

Man geht zum jeweiligen Hausanschluss-Zähler (z.B. Stromzähler) und liest dort den aktuellen Verbrauchswert möglichst genau ab und schreibt sich diesen auf. Ebenfalls die Zählerstände der letzten Ablesung des Energieversorgers sowie der Zählerstand zum Jahreswechsels.
Nun führt man mittels "Skript testen" unter der CCU zeitnah das folgende Skript aus. Hierbei die entsprechenden Werte eintragen. Jens hat das mit zwei Scripten gemacht. Ich habe das in ein Script gepackt. Bitte bedenken, dass man ggf. hier einzelne Zeilen löscht oder hinzufügt, wenn man den entpsrechenden Zähler nicht hat (hier ist Strom, Gas, Wasser und Garten berücksichtigt).

Code: Alles auswählen

real Energiezaehler_Strom = 000.000; ! kWh für Strom aktueller Zaehlerstand
real LetzteAblesung_Strom = 000.000; ! kWh
real Zaehlerstand_letztes_Jahr_Strom = 000.000; ! m3

real Energiezaehler_Gas = 000.000; ! m3 für Gas aktueller Zaehlerstand
real LetzteAblesung_Gas = 000.000; ! m3
real Zaehlerstand_letztes_Jahr_Gas = 000.000; ! m3

real Energiezaehler_Wasser = 000.000; ! m3 für Wasser aktueller Zaehlerstand
real LetzteAblesung_Wasser = 000.000; ! m3
real Zaehlerstand_letztes_Jahr_Wasser = 000.000; ! m3

real Energiezaehler_Garten = 000.000; ! m3 für Garten aktueller Zaehlerstand
real LetzteAblesung_Garten = 000.000; ! m3
real Zaehlerstand_letztes_Jahr_Garten = 000.000; ! m3

if (Energiezaehler_Strom > 0)
{
  (dom.GetObject("Strom aktueller Zaehlerstand")).State(Energiezaehler_Strom);
  WriteLine("Variable Energiezähler wurde gesetzt auf: " # Energiezaehler_Strom);
}

if (LetzteAblesung_Strom > 0)
{
  (dom.GetObject("Strom Zaehlerstand letzte Ablesung")).State(LetzteAblesung_Strom);
  WriteLine("Letzte Ablesung Strom wurde gesetzt auf: " # LetzteAblesung_Strom);
}

if (Zaehlerstand_letztes_Jahr_Strom > 0)
{
  (dom.GetObject("Strom Zaehlerstand letztes Jahr")).State(Zaehlerstand_letztes_Jahr_Strom);
  WriteLine("Zaehlerstand Strom vom letzten Jahr wurde gesetzt auf: " # Zaehlerstand_letztes_Jahr_Strom);
}

if (Energiezaehler_Gas > 0)
{
  (dom.GetObject("Gas aktueller Zaehlerstand")).State(Energiezaehler_Gas);
  WriteLine("Variable Energiezähler Gas wurde gesetzt auf: " # Energiezaehler_Gas);
}

if (LetzteAblesung_Gas > 0)
{
  (dom.GetObject("Gas Zaehlerstand letzte Ablesung")).State(LetzteAblesung_Gas);
  WriteLine("Letzte Ablesung Gas wurde gesetzt auf: " # LetzteAblesung_Gas);
}

if (Zaehlerstand_letztes_Jahr_Gas > 0)
{
  (dom.GetObject("Gas Zaehlerstand letztes Jahr")).State(Zaehlerstand_letztes_Jahr_Gas);
  WriteLine("Zaehlerstand Gas vom letzten Jahr wurde gesetzt auf: " # Zaehlerstand_letztes_Jahr_Gas);
}

if (Energiezaehler_Wasser > 0)
{
  (dom.GetObject("Wasser aktueller Zaehlerstand")).State(Energiezaehler_Wasser);
  WriteLine("Variable Energiezähler Wasser wurde gesetzt auf: " # Energiezaehler_Wasser);
}

if (LetzteAblesung_Wasser > 0)
{
  (dom.GetObject("Wasser Zaehlerstand letzte Ablesung")).State(LetzteAblesung_Wasser);
  WriteLine("Letzte Ablesung Wasser wurde gesetzt auf: " # LetzteAblesung_Wasser);
}

if (Zaehlerstand_letztes_Jahr_Wasser > 0)
{
  (dom.GetObject("Wasser Zaehlerstand letztes Jahr")).State(Zaehlerstand_letztes_Jahr_Wasser);
  WriteLine("Zaehlerstand Wasser vom letzten Jahr wurde gesetzt auf: " # Zaehlerstand_letztes_Jahr_Wasser);
}

if (Energiezaehler_Garten > 0)
{
  (dom.GetObject("Garten aktueller Zaehlerstand")).State(Energiezaehler_Garten);
  WriteLine("Variable Energiezähler Garten wurde gesetzt auf: " # Energiezaehler_Garten);
}

if (LetzteAblesung_Garten > 0)
{
  (dom.GetObject("Garten Zaehlerstand letzte Ablesung")).State(LetzteAblesung_Garten);
  WriteLine("Letzte Ablesung Garten wurde gesetzt auf: " # LetzteAblesung_Garten);
}

if (Zaehlerstand_letztes_Jahr_Garten > 0)
{
  (dom.GetObject("Garten Zaehlerstand letztes Jahr")).State(Zaehlerstand_letztes_Jahr_Garten);
  WriteLine("Zaehlerstand Garten vom letzten Jahr wurde gesetzt auf: " # Zaehlerstand_letztes_Jahr_Garten);
}

Alle anderen Systemvariablen zu Zählerständen sollten sich dann nach verstreichen der jeweiligen Zeit (Tag, Woche, Monat) entsprechend selbst aktualisieren.


So, ich hoffe, ich habe das einigermaßen verständlich hier gepostet.

Viel Spaß mit dem Script.
Zuletzt geändert von MichHan am 18.04.2021, 10:06, insgesamt 8-mal geändert.

Benutzeravatar
NilsG
Beiträge: 1685
Registriert: 09.08.2013, 23:44
System: CCU
Hat sich bedankt: 381 Mal
Danksagung erhalten: 30 Mal
Kontaktdaten:

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

Beitrag von NilsG » 22.01.2021, 20:25

Super Sache!

Da werde ich mich mal ranmachen und meine 3 Zähler umfrickeln 8)
MichHan hat geschrieben:
22.01.2021, 19:33
Anlegen eines neuen Programmes + Skriptes für Zählerauswertung
Damit die Zählerauswertung regelmäßig erfolgt muss am Schluss in der CCU ein neues Programm angelegt werden das auf der einen Seite bei Veränderungen der Energie-Zähler werte bei Aktualisierung ausgelöst wird, aber eben auch durch einen täglichen Timer um genau 0:01 Uhr.
Warum 00:01 und nicht 00:00?!
Grüße und DANKE! 🍻

Nils

-----------------------------------------
CCU3 + 2x LAN-Gateway

MichHan
Beiträge: 33
Registriert: 25.12.2020, 10:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von MichHan » 22.01.2021, 20:49

Ich hatte bei meinem letzten Script auch 00:01 Uhr. Kein besonderer Grund. Ich glaube beim ersten Script hatte ich das so eingestellt um anderen Aufgaben, die ggf. um 00:00 Uhr kommen aus dem Weg zu gehen.

Benutzeravatar
NilsG
Beiträge: 1685
Registriert: 09.08.2013, 23:44
System: CCU
Hat sich bedankt: 381 Mal
Danksagung erhalten: 30 Mal
Kontaktdaten:

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

Beitrag von NilsG » 23.01.2021, 20:16

Ok, Danke!
Mache mich da gleich oder morgen mal ran.

Ich habe nun quasi 3 Minuten Zeit, um die Batterien zu wechseln, korrekt?
Also die Zeit, zwischen den Impulsen dem HM-TX
Grüße und DANKE! 🍻

Nils

-----------------------------------------
CCU3 + 2x LAN-Gateway

MichHan
Beiträge: 33
Registriert: 25.12.2020, 10:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von MichHan » 24.01.2021, 09:51

Hallo,

wenn es keinen erfassten Energieverbrauch gibt (gut machbar bei Gas und Wasser), dann hast Du kein Verlustpaket. Ansonsten geht Dir die erfasste Energie zwischen letzter Übermittlung bis zum Batteriewechsel verloren. So, wie beim Zählerüberlauf auch. Bezogen auf z.B. einem Stromverbrauch von 2500 kWh im Jahr sind das dann um die 0,04 kWh. Je nach Zähler siehst Du das garnicht.

Gruß

Michael

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

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

Beitrag von Baxxy » 24.01.2021, 10:52

Hallo MichHan,
zunächst mal Danke das du dich des Problems "Batteriewechsel" angenommen hast. :)
Ich selbst nutze aktuell den HM-ES-TX-WM als Stromzähler mit dem jmaus - Script.

Nun habe ich mich mal mit deiner Version beschäftigt und mir sind ein paar Sachen unklar / aufgefallen.

Im Script werden ja auch...

Code: Alles auswählen

xxx Verbrauch letzter Monat
xxx Verbrauch letztes Jahr
xxx Verbrauch letzte Woche
befüllt.
Diese sind aber auf deinen Screenshots nicht zu sehen.

Bezogen auf den Stromzähler:

Code: Alles auswählen

xxx Verbrauch aktuell
wird in Wh ausgegeben. Ist vielleicht so gewollt, aber je nach Haushalt ist die Zahl dann teilweise recht hoch.
Vielleicht hier:

Code: Alles auswählen

verb_akt.State(3600.0 * vFaktor_l * vInkrement_Geraetezaehler * vUmrechnungsfaktor / diffTime);
den Umrechnungsfaktor entfernen?

Bezogen auf das Script:

Code: Alles auswählen

object oZaehlerstand_letzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
wird nicht weiter benutzt und ist daher überflüssig. Du hast ja noch...

Code: Alles auswählen

object oLetzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
Allgemeine Frage:
Wie auch jmaus beschreibst du die interne SV (CCU interner Energiezähler).
jmaus: Energiezähler seit letzter Ablesung
Du: aktueller Zäählerstand

Hast du das interne Programm welches diese SV normalerweise befüllt deaktiviert?

MichHan
Beiträge: 33
Registriert: 25.12.2020, 10:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von MichHan » 24.01.2021, 13:18

Hallo Baxxy,

Danke für Deine Anmerkungen.
Ich habe den Screenshot der Variablen angepasst. Die von Dir genannten Variablen waren tatsächlich nicht drauf. Ist behoben.
Auch die doppelte Variable habe ich aus dem Script genommen.

Die Berechnung des aktuellen Stromverbrauchs ist in W (es ist eine alternative Berechnung zum Wert Leistung des Energiezählers) und ist in der Regel 3-stellig (z.B. 500 W). Wenn der Backofen und die Waschmaschine läuft, dann auch 4-stellig :D

Wenn ich in meinem Script "letzte Ablesung" verwende, dann ist damit immer die Ablesung des Energieversorgers gemeint. Die ist ja häufig nicht gleich dem Zählerstand am 31.12. 00:00 Uhr.
Die Variablen "Zaehlerstand" benutze ich immer, um den Fixpunkt zu den Differenzen des jeweiligen Zeitpunktes zu haben (Gestern, Woche, Monat, Jahr, Ablesung)..

Bei jeder Aktualisierung wird die SV der CCU nach wie vor mit dem aktuellen Zaehlerstand gefüllt. Diese Befüllung habe ich nicht deaktiviert.

Wenn es weitere Fragen oder Anmerkungen zum Script gibt, dann freue ich mich über Feedback.

Gruß
Michael

Bacardy
Beiträge: 16
Registriert: 11.08.2018, 19:40
Hat sich bedankt: 9 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Bacardy » 24.01.2021, 17:04

Bei mir bleiben die Werte leider leer. Ich hatte gestern noch das von Jmaus laufen, da funktionierte es. Ich habe sicherlich irgendwas übersehen. Bin das ganze jetzt aber schon zig mal durchgegangen und habe es gerade auch nochmal komplett gelöscht und neu aufgesetzt, leider ohne Erfolg. Ich würde mich freuen wenn einer von euch mal kurz drüber schauen könnte:
Systemvariabel 1.PNG
Systemvariabel 2.PNG
Programm.PNG
Hausanschluss-Strom.PNG
Gruß
Daniel

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

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

Beitrag von Baxxy » 24.01.2021, 17:13

Bacardy hat geschrieben:
24.01.2021, 17:04
Ich habe sicherlich irgendwas übersehen.
Hast du den Namen der letzten SysVar im Script angepasst?
Script:

Code: Alles auswählen

object oZaehlerstand_Messgeraet_Log = sysvar.Get(type # " Zaehlerstand Messgeraet Log");
Deine heißt:

Code: Alles auswählen

Strom Zaehlerstand Messgeraet
also ohne "Log" am Ende.

MichHan
Beiträge: 33
Registriert: 25.12.2020, 10:05
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von MichHan » 24.01.2021, 17:28

Hallo Daniel,

und die Variable 'Strom Verbrauch heute Wh' ist zu viel.

Nur bei Wasser gibt es zusätzlich die Variable 'Wasser Verbrauch heute l'.

Gruß

Michael

Antworten

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