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

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

Moderator: Co-Administratoren

Fearrider
Beiträge: 26
Registriert: 29.08.2017, 09:21
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 11 Mal

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

Beitrag von Fearrider » 27.10.2022, 08:06

jp112sdl hat geschrieben:
27.10.2022, 07:55
Auslösung muss auf "bei Aktualisierung" stehen. Du hast "bei Änderung" gewählt.
Vielen Dank!!
Dann bin ich gespannt was ich morgen lesen kann :-D Bzw. jetzt schon...
Screenshot (6).png
Muss ich dann auch nochmal den aktuellen Zählerstand einlesen?

MichaelN
Beiträge: 9678
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

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

Beitrag von MichaelN » 27.10.2022, 08:34

Und du solltest es vermeiden Gerät und Kanal den gleichen Namen zu geben. Also generell.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
jmaus
Beiträge: 9862
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1880 Mal
Kontaktdaten:

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

Beitrag von jmaus » 27.10.2022, 09:07

MichaelN hat geschrieben:
27.10.2022, 08:34
Und du solltest es vermeiden Gerät und Kanal den gleichen Namen zu geben. Also generell.
Das kann man so nicht pauschal sagen. Selbst nutze ich das seit vielen vielen Jahren so das ich dem "Hauptkanal" eines Gerätes den gleichen Namen gebe wie dem Gerät selbst. Funktioniert bisher tadellos, ist aber natürlich auch davon abhängig ob und wie man eventl. Skriptbefehle dann aufruft!
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

MichaelN
Beiträge: 9678
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

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

Beitrag von MichaelN » 27.10.2022, 09:47

D.h. In deinem Skript hast Du das schon berücksichtigt.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++


Fearrider
Beiträge: 26
Registriert: 29.08.2017, 09:21
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 11 Mal

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

Beitrag von Fearrider » 30.10.2022, 11:32

Hallo zusammen,
die Auswertung läuft seit ein paar Tagen.
Screenshot (7).png
Was meint Ihr, ist das soweit schlüssig?
Ich muss das Gerät auf jeden Fall nochmal resetten und den aktuellen Zählerstand über das Skript einfügen.
Schönen Sonntag!

VG Thorsten

Edit:
Wenn ich den aktuellen Zählerstand eingeben will, kommt etwas anderes heraus :(
Kann mir da jemand helfen?
Screenshot (9).png

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

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

Beitrag von Suenzihome » 04.11.2022, 01:04

Hallo ich nutze das Script nun schon seit ca 3 oder 4 jahren.

Aber immer wieder haut es mir gewaltige Minuswerte in die Zählerstände aber auch in ungewöhnlichen Abständen mal funktioniert es ein halbes Jahr dann wieder nur 2 Monate.

Kann mir da jemand helfen. Und nochmal drüberschauen?
Vielleicht du @JensMaus
Version 1.4 (01.01.2018)

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 (Gartenwasser, Gas, Wasser, Strom, Strom_HZG, 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,Gartenwasser,Gas,Strom,Strom_HZG,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);
        }
      }
    }
  }
}
Dateianhänge
Screenshot (219).png

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

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

Beitrag von NickHM » 04.11.2022, 08:04

Suenzihome hat geschrieben:
04.11.2022, 01:04

Aber immer wieder haut es mir gewaltige Minuswerte in die Zählerstände aber auch in ungewöhnlichen Abständen mal funktioniert es ein halbes Jahr dann wieder nur 2 Monate.
Eine mögliche Ursache ...

Wenn der Fehler auftritt, schau dir mal den Stand des internen Zählers an. Der springt entweder auf Null, wenn ein bestimmter Stand erreicht ist, was das Programm dann eigentlich abfängt.
Oder der springt auf Null, wenn die Spannungsversorgung unterbrochen wurde. In dem Fall funktioniert die Kompensation im Programm nicht, weil der Zählerstand vor dem Neustart nicht bekannt ist.
Wenn der Zählerstand im Gerät also sehr gering ist. wäre das ein Anhaltspunkt für einen Neustart, dessen Ursache dann im zweiten Schritt zu ermitteln wäre.

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

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

Beitrag von Suenzihome » 04.11.2022, 10:52

Wenn der Fehler auftritt, schau dir mal den Stand des internen Zählers an. Der springt entweder auf Null, wenn ein bestimmter Stand erreicht ist, was das Programm dann eigentlich abfängt.
Meinst du damit den Zähler der raspberrymatic? So wie es aussieht war der auf 0 den der ist identisch mit dem errechneten Strom Zählerstand.
Oder der springt auf Null, wenn die Spannungsversorgung unterbrochen wurde. In dem Fall funktioniert die Kompensation im Programm nicht, weil der Zählerstand vor dem Neustart nicht bekannt ist.
Also die Spannungsversorgung vom HM-ES-TX-WM ist nicht zusammen gebrochen.


Ich denke das es was mit dem Überlauf zutun hat. Der Überlauf ist doch das was du oben beschrieben hast " wenn ein bestimmter Stand erreicht ist" oder ?

Wie kann ich das verhindern?

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

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

Beitrag von NickHM » 04.11.2022, 14:14

Suenzihome hat geschrieben:
04.11.2022, 10:52

Wie kann ich das verhindern?
Wenn es der "normale" Überlauf ist, wird das im Programm kompensiert. Da dürfte es keinen Fehler geben.
Es klinkt eher so, als wenn das Gerät neu startet. Entweder ist etwas defekt oder der Batteriekontakt ist nicht stabil.

Wenn Du mal in das Script schaust ...

Code: Alles auswählen

    ! 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();
      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());
      }
    }

Antworten

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