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

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

Moderator: Co-Administratoren

NickHM
Beiträge: 3729
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 65 Mal
Danksagung erhalten: 119 Mal

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

Beitrag von NickHM » 10.11.2019, 17:49

Hallo

Du musst die gemerkten Referenzwerte anpassen. Also eigentlich nur wie bei der Inbetriebnahme im ersten Beitrag beschrieben. Die Werte sind wieder richtig, sobald eine Woche / Monat um sind. Hauptsache der aktuelle Zählerstand stimmt wieder.

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

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

Beitrag von Suenzihome » 12.11.2019, 21:25

Ok danke... hab es hinbekommen.

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

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

Beitrag von Suenzihome » 26.11.2019, 13:40

So habe jetzt den Impulszähler von Eugen inbetrieb genommen. Und möchte nun gerne mit Jens sein Script auf den Wasserzähler auslesen bisher klappt alles gut.

Nur ich würde gerne wissen ob es eine Möglichkeit die zählerwerte in den Variablen der kanalzuordnung auf 3 stellen hinter dem Komma anzeigen zu lassen bei mir werden nur 2 Stellen angezeigt.

Vielen dank
Dateianhänge
Unbenannt1.JPG

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 - Universelle Zählerstandberechnung

Beitrag von NilsG » 26.11.2019, 14:13

Guck mal hier:

viewtopic.php?t=29289
Grüße und DANKE! 🍻

Nils

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

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

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

Beitrag von Suenzihome » 26.11.2019, 14:39

Hallo das habe ich gerade gelesen aber wie müsste ich das bei jens im Script anpassen?

Verstehe leider nicht viel vom scripten..hier das script

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, Strom_HZG)
    ! 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();
      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="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);
        }
      }
    }
  }
}

Vielen dank im Vorraus

Marrom77
Beiträge: 73
Registriert: 27.02.2018, 22:43
Hat sich bedankt: 2 Mal
Danksagung erhalten: 4 Mal

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

Beitrag von Marrom77 » 27.11.2019, 00:59

Script ist seit geraumer Zeit implementiert und verarbeitet die Verbrauchswerte bei den Zählerständen zuverlässig. Aber: Der else-Zweig zur Speicherung der Historie um Mitternacht hat leider unzuverlässig funktioniert, was ich dann leider nicht mehr logisch nachvollziehen kann. Tagelang klappt's, dann geht's bisweilen eben nicht. Die Gesamtzählerstände sind immer korrekt, so dass "nur" HEUTE und GESTERN durcheinander kommen, was sich am nächsten Tag bereinigt. Ich bin jetzt einfach hergegangen und habe den ELSE-Zweig für Speicherung um Mitternacht in ein eigenes Script verlagert. Scheint jetzt besser zu funktionieren, woran das auch immer liegt...

Könnte es sein, dass die Programmausführung derart verzögert wird, dass die IF-Abfrage "Uhrzeit = 0:00" nicht mehr greift? Das wäre zumindest eine logische Erklärung, warum die Werte von Zeit zu Zeit nicht mehr aktualisiert werden...

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

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

Beitrag von Suenzihome » 04.12.2019, 00:49

Hallo wollte noch mal nachfragen ob es möglich ist in der raspimatic die Systemvariablen bzw die Ausgaben mit 3 oder 4 Stellen nach dem Komma anzeigen zu lassen bin immer noch nicht weiter gekommen.

Lg suenzihome

dontom
Beiträge: 13
Registriert: 09.11.2011, 18:18
Hat sich bedankt: 1 Mal

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

Beitrag von dontom » 10.12.2019, 18:26

Servus allerseits,

habe mir nun auch für meinen Gas- und Stromzähler einen Sensor gegönnt und wollte beginnen, lt. Post. Nr. 1 die Variablen und das Programm anzulegen, jedoch sehe ich lt. den Screenshots beim Programm z.B. Hausanschlus-Strom und bei den anzulegenden Variablen keine Kanalzuordnung..
Meine CCU bietet mir da jeweils Kanal 1 oder 2 an :?:
Ist da jetzt Kanal 1 auszuwählen oder habe ich einen Fehler beim Anlegen des Gerätes gemacht?
Sorry für die wahrscheinlich dumme Frage und schon mal im vorhinein Danke für eure Antworten,

Tom

Slice
Beiträge: 1192
Registriert: 03.02.2016, 14:44
System: Alternative CCU (auf Basis OCCU)
Wohnort: irgendwo aus Süd BaWü
Hat sich bedankt: 135 Mal
Danksagung erhalten: 82 Mal

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

Beitrag von Slice » 10.12.2019, 21:20

Hallo Tom,

ich würde jetzt mal tippen und vermuten das Du den Hinweis keinen Kanal wie den anderen von einem Gerät zu benennen richtig gemacht hast. :wink:
Allerdings ergibt sich in diesem Fall eine Besonderheit, auf dem Bild vom Gerät auf Seite 1 werden beide Kanäle gleich benannt!
Dann wirst Du vermutlich auch nur einen Kanal zur Auswahl haben für die Kanalzuordnung.
Ich habe selbst nach dieser Anleitung bei mir Strom und Wasser umgesetzt und läuft auch ohne weitere Probleme.

Grüße,
Slice
----------------------------------------------------------------------------------------
Raspi3B+ Bullseye mit HB-RF-ETH und RPI-RF-MOD auf piVCCU-FW 3.73.9 / Addons: CuxD v2.11 - E-Mail v1.7.6 - Patcher v1.0.0 - Philips Hue v3.2.5 - Programme drucken v2.6 - Scriptparser v1.11 - XML-API v2.3
Geräte: 141 / Kanäle: 791 / Datenpunkte: 6080 / SysVars: 275 / Programme: 161 / Regadom IDs: 14010 / 48 CUxD-Kanäle in 3 CUxD-Geräten
Intel NUC i3-5010U @ 2,1 GHz mit 16 GB RAM & 512 GB SSD für Proxmox mit ioBroker VM und CCU-Historian/InfluxDB/Grafana VM
----------------------------------------------------------------------------------------
Projekte im Forum: HomeHub v4.1 / Fritzbox-Anruferliste für HomeHub
----------------------------------------------------------------------------------------

dontom
Beiträge: 13
Registriert: 09.11.2011, 18:18
Hat sich bedankt: 1 Mal

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

Beitrag von dontom » 11.12.2019, 18:23

Hallo Slice,

ich hab mir sowas ähnliches ja schon fast gedacht, als ich mit dem tippseln meiner Frage fertig war :D
Danke für die Rückmeldung,
Tom

Antworten

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