Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Kabellose und kabelgebundene Sender und Empfänger der klassischen Homematic-Serie

Moderator: Co-Administratoren

MQ-AW
Beiträge: 7
Registriert: 05.04.2021, 18:21
System: CCU
Danksagung erhalten: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von MQ-AW » 24.03.2022, 17:04

Danke, das war der entscheidende Hinweis :oops: Nachdem ich nun den Sensor umgesetzt habe, zählt er auch schon richtig.

Was kann denn der andere Sensor mehr, bzw welche weiteren Informationen kann ich noch erfassen?

Gruß

Don Kanaille
Beiträge: 661
Registriert: 27.03.2019, 21:29
Hat sich bedankt: 9 Mal
Danksagung erhalten: 111 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von Don Kanaille » 24.03.2022, 22:35

Es handelt sich um einen Zweirichtungszähler. Wenn dieser auch in Lieferrichtung (PV-Überschuss-Einspeisung) betrieben wird, so kann dies nicht korrekt mit dem ES-LED erfasst werden. Außerdem werden mit dem ES-IEC Absolutwerte der Zählerstände und der Momentanleistung gelesen. Fehler oder Sprünge, z. B bei einem Batteriewechsel, kann es damit nicht geben.

Dani3000
Beiträge: 81
Registriert: 14.03.2020, 16:47
Hat sich bedankt: 11 Mal
Danksagung erhalten: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von Dani3000 » 25.03.2022, 08:50

Don Kanaille hat geschrieben:
24.03.2022, 22:35
Es handelt sich um einen Zweirichtungszähler. Wenn dieser auch in Lieferrichtung (PV-Überschuss-Einspeisung) betrieben wird, so kann dies nicht korrekt mit dem ES-LED erfasst werden. Außerdem werden mit dem ES-IEC Absolutwerte der Zählerstände und der Momentanleistung gelesen. Fehler oder Sprünge, z. B bei einem Batteriewechsel, kann es damit nicht geben.
Genau so ist es. Ich habe den Sensor und es funktioniert einfach problemlos. Ich habe beide Zählerstände, von der Einspeisung und vom Verbrauch, zudem die Momentanleistung auf Kanal. Beim Einspeisen ist der Wert negativ, wenn ich Strom beziehe ist der Wert positiv.
Jetzt suche ich noch ein Skript um die Tages, Wochen, Monats und Jahresverbräuche auszurechnen. Zudem die Tages, Wochen, Monats und Jahreseispeisung. Mit welchem Script geht das, oder muss ich mir da selbst was basteln? Ich habe hier schon so viel gelesen und gesucht, aber das richtige war noch nicht dabei. Vor allem für die 2-Richtungsvariante??

jürgen0211
Beiträge: 1
Registriert: 28.11.2021, 21:01
System: CCU
Hat sich bedankt: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von jürgen0211 » 29.03.2022, 19:14

nabend , ich bin gerade auf deinen post gestossen- meine frage ich habe auch einen zwei richtungszähler und würden den auch mit dem Zählersensor HM-ES-TX-WM auslesen. muß ich das genau so machen wie es auf seite 1 beschrieben ist?? bedanke mich jetzt schonmal bei euch für die hilfe

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

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von Xel66 » 29.03.2022, 23:16

jürgen0211 hat geschrieben:
29.03.2022, 19:14
muß ich das genau so machen wie es auf seite 1 beschrieben ist??
Nein, denn für diesen Zählertyp benötigst Du einen anderen Lesekopf und kannst Zählerstände für die Richtungen getrennt direkt auslesen (initialer Zählerstand, Handling des Übertrages oder Batteriewechsels usw. sind nicht notwendig) und nicht nur Impulse zählen. Installiere das erst mal und schaue, was Du wirklich benötigst. Die 2er Firmware verhält sich grundsätzlich anders als die des reinen Impulszählers.

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

Camullus
Beiträge: 3
Registriert: 15.04.2022, 09:55
System: CCU
Hat sich bedankt: 2 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von Camullus » 30.04.2022, 17:11

Baxxy hat geschrieben:
20.11.2020, 22:22
JBST hat geschrieben:
20.11.2020, 20:23
Leider finde ich den Fehler nicht. Kann mir bitte jemand helfen ?
Du musst im Programm schon "bei Aktualisierung" wählen, genau wie im Beispiel auf S.1 :wink:

Ich habe meinen Fehler Stundenlang gesucht und
dann alle 78 Seiten von diesen Post überflogen und dann die einfache Lösung(s.o)

Vielen Dank, genau hier bin ich auch drüber gestolpert. :lol:

Wer lesen kann ist klar im Vorteil. :roll:
An dieser Stelle ein Dank an allen, welche hier immer anderen Teilnehmern helfen.
Und vor Allem auch bei Neulingen, sehr geduldig bleiben. Aber sowas macht ein gutes Forum aus.

Gruß
Christian

MGK
Beiträge: 14
Registriert: 19.09.2017, 07:05
Danksagung erhalten: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von MGK » 03.05.2022, 14:36

Hallo,

ich nutze das Programm/Script nun schon seit 2017 für die Auswertung meines Gaszählers.
Nun habe ich mir noch ein zweiten HM-ES-TX-WM mit IEC Sensor gekauft und möchte meinen Stromzähler auswerten.
In diesem Zuge habe ich das Script von Version 1.1 auf die Version 1.4 aktualisiert.
Mein Gaszähler funktioniert weiter wie gewohnt, alles besten, nur der Stromzähler will einmal nicht richtig funktionieren.
Der Wert des Energie-Zähler Gerät stimmt immer, aber die restlichen Werte laufen nach kurzer Zeit total aus dem Ruder. :shock:
Alle Umrechnungen von Wh zu kWh habe ich schon entfernt, trotzdem werden die Werte immer schnell exorbitant größer.
Ich bin mit meinem Latein leider am Ende, vielleicht findet einer von Euch den Fehler.
Hier die Daten meiner Installation.

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
!
! 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();

    ! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom)
    ! 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 c = sysvar.Get(type # " Referenz Zaehlerstand");
    object d = sysvar.Get(type # " Zaehlerstand");
    object e = sysvar.Get(type # " Verbrauch aktuell");
    object f = sysvar.Get(type # " Referenz Ablesung");
    object g = sysvar.Get(type # " Verbrauch letzte Ablesung");
    object h = sysvar.Get(type # " Referenz heute");
    object i = sysvar.Get(type # " Verbrauch heute");
    object j = sysvar.Get(type # " Referenz Woche");
    object k = sysvar.Get(type # " Verbrauch Woche");
    object l = sysvar.Get(type # " Referenz Monat");
    object m = sysvar.Get(type # " Verbrauch Monat");
    object n = sysvar.Get(type # " Referenz Kalenderjahr");
    object o = sysvar.Get(type # " Verbrauch Kalenderjahr"); 

    ! Nun schauen wir ob der Zaehler uebergelaufen ist (diffValue < 0) weil
    ! die Zaehlervariablen des HM-ES-TX-WM gerade beim Stromzaehler regelmaessig
    ! ueberlaufen.
    real diffValue = curValue - lastValue;
    if(diffValue < 0.0)
    {
      ! Der Zaehler scheint uebergelaufen zu sein -> ValueMax hinzuaddieren
      diffValue = diffValue + counter.ValueMax();
      
      ! "Referenz Zaehlerstand" dann um ValueMax erhoehen. Beim Stromzaehler
      ! muss aber erst das ganze noch in Watt umgerechnet werden.
      real a = c.Value();
      c.State(a + counter.ValueMax());
    }

    ! Aktuellen Verbrauch berechnen
    if(diffTime > 0) { e.State(3600.0 * diffValue / diffTime); }

    ! Aktuellen Zaehlerstand berechnen
    d.State(c.Value() + curValue);

    ! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
    ! des Verbrauches da sind neu berechnen.
    g.State(d.Value() - f.Value());
    if(h.Value() != 0) { i.State(d.Value() - h.Value()); }
    else { i.State(d.Value() - c.Value()); } 
    if(j.Value() != 0) { k.State(d.Value() - j.Value()); } 
    else { k.State(d.Value() - c.Value()); } 
    if(l.Value() != 0) { m.State(d.Value() - l.Value()); } 
    else { m.State(d.State() - c.State()); } 
    if(n.Value() != 0) { o.State(d.Value() - n.Value()); } 
    else { o.State(d.Value() - c.Value()); }

    ! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
    ! dem Wert der letzten Ablesung
    if(counter.HssType() != "GAS_ENERGY_COUNTER")
    {
      object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterIEC_" # channel.ID() # "_" # channel.Address());
      if(oSysVarEnergyCounter)
      {
        oSysVarEnergyCounter.State(d.Value() - f.Value());
      }
    }
    else
    {
      object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
      if(oSysVarEnergyCounter)
      {
        oSysVarEnergyCounter.State(d.Value() - f.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:00
    ! 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:00")
    {
      string a="Gas,Strom,Wasser";
      string b;
      object c;
      object d;
      object e;
      object f;

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

          ! Nach Monatsanfang pruefen
          if(system.Date("%d") == "01")
          {
            d = sysvar.Get(b # " Referenz Monat");
            e = sysvar.Get(b # " Verbrauch Monat");
            f = sysvar.Get(b # " Verbrauch letzter Monat");
  
            ! Verbrauch des letzten Monats speichern
            f.State(e.Value());
  
            ! Referenzwert des Monats speichern
            d.State(c.Value());
      
            ! Monatsverbrauch auf 0 setzen
            e.State(0);       
      
            ! Nach Jahresanfang pruefen
            if(system.Date("%m") == "01")
            {
              d = sysvar.Get(b # " Referenz Kalenderjahr");
              e = sysvar.Get(b # " Verbrauch Kalenderjahr");
              f = sysvar.Get(b # " Verbrauch letztes Kalenderjahr");
  
              ! Verbrauch des letzten Kalenderjahr speichern
              f.State(e.Value());
  
              ! Referenzwert des Kalenderjahr speichern
              d.State(c.Value());
        
              ! Jahresverbrauch auf 0 setzen
              e.State(0);       
            }
          }

          ! aktueller Tagesverbrauch speichern
          d = sysvar.Get(b # " Referenz heute");
          e = sysvar.Get(b # " Verbrauch heute");
          f = sysvar.Get(b # " Verbrauch gestern");
  
          ! Verbrauch der letzten Woche speichern
          f.State(e.Value());
  
          ! Referenzwert der Woche speichern
          d.State(c.Value());

          ! Tagesverbrauch auf 0 setzen
          e.State(0);
        }
      }
    }
  }
}
1.PNG
2.PNG
3.PNG
4.PNG
5.PNG
6.PNG
6.PNG (21.6 KiB) 1598 mal betrachtet
Strom Referenz Zaehlerstand.csv
(705 Bytes) 36-mal heruntergeladen
Strom Zaehlerstand.csv
(3.97 KiB) 28-mal heruntergeladen

MGK
Beiträge: 14
Registriert: 19.09.2017, 07:05
Danksagung erhalten: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von MGK » 05.05.2022, 10:32

Hallo,

mittlerweile kann ich den Fehler etwas eingrenzen, irgendein Script, wahrscheinlich Systemintern, speichert die hohen Werte in den Variablen "Strom Zaehlerstand" (Zeitstempel 10:16:11.196) und "Strom Referenz Zaehlerstand" (Zeitstempel 10:16:11.151).
Ich dachte hier im Thread gelesen zu haben, das bei IEC Sensor die Variable "Strom Referenz Zaehlerstand" gar nicht benutzt wird und deswegen immer bei 0 bleibt. Habe ich das so richtig gelesen / verstanden.
Wenn ja warum ändert sich diese bei mir, hat jemand vielleicht eine Idee?

Verlauf der Variable "Strom Referenz Zaehlerstand"
7.PNG
7.PNG (5.09 KiB) 1555 mal betrachtet
Verlauf der Variable "Strom Zaehlerstand"
8.PNG
8.PNG (7.03 KiB) 1555 mal betrachtet

MGK
Beiträge: 14
Registriert: 19.09.2017, 07:05
Danksagung erhalten: 1 Mal

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von MGK » 05.05.2022, 11:13

Ich habe mir nun mal die Systeminternen Programme anzeigen lassen und dabei festgestellt das ich 6 Programme für die beiden Zähler habe, 5 für eine Seriennummer (GAS) und 1 für die Seriennummer (Strom).

Hier die Auflistung der Systeminternen Programme
9.PNG
Hier die Geräte Übersicht der Zähler
10.PNG
Ich vermute nun mal das eins der Systeminternen Programme für den Gas Zähler mir die Werte vom Strom Zähler versaut.
Wahrscheinlich, sind die zu vielen Systeminternen Programme noch Überbleibsel von den Firmware Updates, ich hatte den Gaszähler aus Dummheit von Firmware 1.0 auf 2.5 und dann wieder zurück auf 1.2 aktualisiert.
Nach jedem Firmware Update habe ich zwar immer den Zähler gelöscht und ein Werksreset gemacht, aber allem Anschein nach sind doch noch Reste im System übrig geblieben.
Wie bekomme ich nun raus, welche Systeminternen Programme zu viel sind?

Suenzihome
Beiträge: 96
Registriert: 09.06.2017, 00:19

Re: Zählersensor HM-ES-TX-WM - Universelle Zählerstandberechnung

Beitrag von Suenzihome » 12.05.2022, 05:05

Hütte hat geschrieben:
14.02.2021, 22:17
R.Thümer hat geschrieben:
06.02.2021, 20:38
jmaus hat geschrieben:
07.06.2016, 15:43

Anpassung bei Zählerwechsel:
Da Energieversorger in regelmäßigen Abständen einen neuen/aktualisierten Hausanschlusszähler installieren muss somit auch bei jedem Zählerwechsel der aktualisierte Zählerstand mittels des folgenden Skriptes der CCU mitgeteilt werden:
  1. TODO
Hallo, gibt es eine Lösung für den Zählerwechsel? Ein Script ist ja nicht angegeben oder Wie muss ich "1. TODO" verstehen? Mein Zähler wurde gegen einen Smart Meter getauscht und da der aktuelle Zählerstand ja unter dem der letzten Ablesung liegt kann ich diesen über das vorhandene Scipt "Initiale

Einrichtung/Anpassung Referenzwert Zählerstand" nicht setzen. Den letzten Zählerstand vom ausgebauten Zähler habe ich mit dem Script "Initiale Einrichtung/Anpassung Referenzwert letzte Ablesung" gesetzt. Muss ich jetzt wieder bei 0 :( starten oder kann ich alte Werte weiter nutzen? :?:

MfG R.Thümer
Bei einem kompletten Zählerwechsel bleibt dir im Moment nichts anderes übrig, als bei Null zu starten. Und das hat absolut nichts mit dem abgewandelten Script von MIchael zu tun, da diese Version des Scriptes darauf zielt, einen Reset des internen Zählers des HM-ES-TX-WM bei einem Batteriewechsel abzufangen..

Wenn du nun deinen Smartmeter über einen ES-IEC-Sensor statt einem ES-Fer- oder ES-LED-Sensor ausliest, dann musst du zwei Dinge beachten.
1. Bei Einsatz des ES-IEC-Sensors muss die FW-Version 2.5 auf dem HM-ES-TX-WM installiert werden (diese FW ist ausschließlich auf der Downloadseite von eQ-3 zu finden und wird dir nicht auf der Startseite der WebUI angezeigt, da je nach eingesetzem Sensor verschiedede FW-Versionen auf dem jeweiligen HM-ES-TX-WM zu installieren sind.
2. Beim Einsatz des ES-IEC-Sensors werden die Daten/Zählerstände direkt aus dem Zähler in kWh ausgelesen. Damit die späteren Berechnungen stimmen, muss das Original-Script von Jens angepasst werden.

Dazu folgender Bereich

Code: Alles auswählen

    ! Wenn dies ein Stromzaehler ist muessen wir die Werte von
    ! Watt zu Kilowatt konvertieren
    if(counter.HssType() != "GAS_ENERGY_COUNTER")
    {
      diffValue = diffValue / 1000.0;
      curValue = curValue / 1000.0;
    } 
zumindest durch folgene Zeilen ersetzt werden:

Code: Alles auswählen

    ! Wenn dies ein Stromzaehler ist muessen wir die Werte von
    ! Watt zu Kilowatt konvertieren
!    if(counter.HssType() != "GAS_ENERGY_COUNTER")
!    {
!      diffValue = diffValue / 1000.0;
!      curValue = curValue / 1000.0;
!    } 

Natürlich unter Annahme, dass es nur einen HM-ES-TX-WM-Zähler gibt, der einen Stromzähler ausliest. Sollte es neben dem Hauptzähler, der einen ES-IEC-Sensor benutzt, noch einen Unterzähler geben, der einen anderen Sensor benutzt, dann wird es komplizierter
Hallo,

Bei mir ist zb der fall das Ich einen HM-ES-TX-WM für Strom, Strom_HZG, Wasser, Gartenwasser habe die laufen alle mit dem ES Led.

Jetzt kommt noch einer hinzu mit IEC Sensor Strom_Bezug.

Wäre es hier möglich wenn ich das Script in ein neues Programm packe und wie von Hütte geschrieben die zeilen auskommentiere sowie die anderen Zähler auch raus nehme unter "String"

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
!
! 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();

    ! Nun extrahieren wir den Zaehlertyp (Strom_Bezug)
    ! 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 c = sysvar.Get(type # " Referenz Zaehlerstand");
    object d = sysvar.Get(type # " Zaehlerstand");
    object e = sysvar.Get(type # " Verbrauch aktuell");
    object f = sysvar.Get(type # " Referenz Ablesung");
    object g = sysvar.Get(type # " Verbrauch letzte Ablesung");
    object h = sysvar.Get(type # " Referenz heute");
    object i = sysvar.Get(type # " Verbrauch heute");
    object j = sysvar.Get(type # " Referenz Woche");
    object k = sysvar.Get(type # " Verbrauch Woche");
    object l = sysvar.Get(type # " Referenz Monat");
    object m = sysvar.Get(type # " Verbrauch Monat");
    object n = sysvar.Get(type # " Referenz Kalenderjahr");
    object o = sysvar.Get(type # " Verbrauch Kalenderjahr"); 

    ! Nun schauen wir ob der Zaehler uebergelaufen ist (diffValue < 0) weil
    ! die Zaehlervariablen des HM-ES-TX-WM gerade beim Stromzaehler regelmaessig
    ! ueberlaufen.
    real diffValue = curValue - lastValue;
    if(diffValue < 0.0)
    {
      ! Der Zaehler scheint uebergelaufen zu sein -> ValueMax hinzuaddieren
      diffValue = diffValue + counter.ValueMax();
      
      ! "Referenz Zaehlerstand" dann um ValueMax erhoehen. Beim Stromzaehler
      ! muss aber erst das ganze noch in Watt umgerechnet werden.
      real a = c.Value().ToFloat().ToString(3);
      if(counter.HssType() != "GAS_ENERGY_COUNTER")
      {
        a = a * 1000.0;
        a = a + counter.ValueMax();
        c.State(a / 1000.0);
      }
      else
      {
        c.State(a + counter.ValueMax());
      }
    }

    ! Wenn dies ein Stromzaehler ist muessen wir die Werte von
    ! Watt zu Kilowatt konvertieren
   ! if(counter.HssType() != "GAS_ENERGY_COUNTER")
   !{
   !  diffValue = diffValue / 1000.0;
   !   curValue = curValue / 1000.0;
   !} 

    ! Aktuellen Verbrauch berechnen
    if(diffTime > 0) { e.State(3600.0 * diffValue / diffTime); }

    ! Aktuellen Zaehlerstand berechnen
    d.State(c.Value() + curValue);

    ! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
    ! des Verbrauches da sind neu berechnen.
    g.State(d.Value() - f.Value());
    if(h.Value() != 0) { i.State(d.Value() - h.Value()); }
    else { i.State(d.Value() - c.Value()); } 
    if(j.Value() != 0) { k.State(d.Value() - j.Value()); } 
    else { k.State(d.Value() - c.Value()); } 
    if(l.Value() != 0) { m.State(d.Value() - l.Value()); } 
    else { m.State(d.State() - c.State()); } 
    if(n.Value() != 0) { o.State(d.Value() - n.Value()); } 
    else { o.State(d.Value() - c.Value()); }

    ! 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)
      {
        oSysVarEnergyCounter.State((d.Value() - f.Value()) * 1000.0);
      }
    }
    else
    {
      object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
      if(oSysVarEnergyCounter)
      {
        oSysVarEnergyCounter.State(d.Value() - f.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:00
    ! 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:00")
    {
      string a="Strom_Bezug";
      string b;
      object c;
      object d;
      object e;
      object f;

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

          ! Nach Monatsanfang pruefen
          if(system.Date("%d") == "01")
          {
            d = sysvar.Get(b # " Referenz Monat");
            e = sysvar.Get(b # " Verbrauch Monat");
            f = sysvar.Get(b # " Verbrauch letzter Monat");
  
            ! Verbrauch des letzten Monats speichern
            f.State(e.Value());
  
            ! Referenzwert des Monats speichern
            d.State(c.Value());
      
            ! Monatsverbrauch auf 0 setzen
            e.State(0);       
      
            ! Nach Jahresanfang pruefen
            if(system.Date("%m") == "01")
            {
              d = sysvar.Get(b # " Referenz Kalenderjahr");
              e = sysvar.Get(b # " Verbrauch Kalenderjahr");
              f = sysvar.Get(b # " Verbrauch letztes Kalenderjahr");
  
              ! Verbrauch des letzten Kalenderjahr speichern
              f.State(e.Value());
  
              ! Referenzwert des Kalenderjahr speichern
              d.State(c.Value());
        
              ! Jahresverbrauch auf 0 setzen
              e.State(0);       
            }
          }

          ! aktueller Tagesverbrauch speichern
          d = sysvar.Get(b # " Referenz heute");
          e = sysvar.Get(b # " Verbrauch heute");
          f = sysvar.Get(b # " Verbrauch gestern");
  
          ! Verbrauch der letzten Woche speichern
          f.State(e.Value());
  
          ! Referenzwert der Woche speichern
          d.State(c.Value());

          ! Tagesverbrauch auf 0 setzen
          e.State(0);
        }
      }
    }
  }
}

Antworten

Zurück zu „HomeMatic Aktoren und Sensoren (klassisch)“