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

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

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

Beitrag von NilsG » 24.04.2021, 10:15

Ich habe das Programm auch schon mal separiert nur für den GARTEN-Zähler; leider mit dem gleichen - nicht funktionierenden - Ergebnis:

Bildschirmfoto 2021-04-24 um 10.13.46.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

! 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 = 1;
        real vFaktor = 1;
      }

      ! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
      ! * Variable für "XXX Verbrauch heute l" laden
      if ( 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 == ( "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_neu"  )
      {
        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 == ( "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")
    {
      string a="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 == ( "Garten") )
          {
            oVerbrauch_heute_l.State(0);
          }

        }
      }
    }
  }
}
Grüße und DANKE! 🍻

Nils

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

Benutzeravatar
Black
Beiträge: 5472
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

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

Beitrag von Black » 25.04.2021, 22:07

Interessanterweise hat (auf einer Raspberrymatik, 3.57.5)

Script testen nicht die Möglichkeiten scr, this, val vorzugehben. Aber dort würde man dies zum testen am meisten brauchen, wenn man ein Script testen will, ohne dies schon in ein Programm reinzusetzen.

Programme editieren hat der Editor diese EIngabefelder... ungeschickterweise funktionieren diese aber nicht so wirklich.

ID 4245: DebugVars
ID 3451: WerteListeTest

Selbe RMatik, Script testen in RMatik:

RM1.JPG

Das Issue dazu stammte von Anfang januar 2020 von mir
https://github.com/jens-maus/RaspberryMatic/issues/764


So Sollte es dann richtigerweise aussehen: (ausgeführt mit dem Editor des SDV)

RM2.JPG

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

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

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

Beitrag von NilsG » 01.05.2021, 13:27

Moin!

Hat noch jemand anders eine Idee, wie ich das Programm schrittweise testen könnte?
Irgendwo muss doch der Fehler stecken?!?

"Aktualisierung" und "Verbrauch heut in l" funktioniert nicht.
Alle anderen Werte ändern sich und die Impulse passen nun auch
Grüße und DANKE! 🍻

Nils

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

Flipperbastler
Beiträge: 4
Registriert: 21.10.2019, 16:07
Hat sich bedankt: 1 Mal

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

Beitrag von Flipperbastler » 14.05.2021, 14:11

Hallo zusammen,

wer würde mir bitte helfen? Ich bekomme keine Aktualisierung...
Schaffe es auch nicht hier einen Screenshot hochzuladen!

Danke für Eure Hilfe!

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

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

Beitrag von NilsG » 14.05.2021, 17:52

Screenshot ist doch ganz simpel:

Bildschirmfoto 2021-05-14 um 17.51.35.png
Bildschirmfoto 2021-05-14 um 17.51.54.png
Grüße und DANKE! 🍻

Nils

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

Flipperbastler
Beiträge: 4
Registriert: 21.10.2019, 16:07
Hat sich bedankt: 1 Mal

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

Beitrag von Flipperbastler » 15.05.2021, 14:38

Danke Nils, ich werd's versuchen...

Flipperbastler
Beiträge: 4
Registriert: 21.10.2019, 16:07
Hat sich bedankt: 1 Mal

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

Beitrag von Flipperbastler » 15.05.2021, 15:08

Hallo zusammen,

anbei die Bilder. Der Wert "Strom Verbrauch aktuell" aktualisiert sich nicht, habe eben die Zahlen vom Zähler nochmals neu gesetzt, keine Änderung. Variable habe ich auch neu angelegt. Wer hat eine Idee? Dankeschön! Stefan.
strom1.JPG
strom 2.JPG
strom3.JPG
strom 4.JPG
strom 5.JPG

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 » 15.05.2021, 16:52

nach string a="strom" fehlt das Semikolon am Zeilenende.

Flipperbastler
Beiträge: 4
Registriert: 21.10.2019, 16:07
Hat sich bedankt: 1 Mal

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

Beitrag von Flipperbastler » 15.05.2021, 17:41

Meeega! Vielen Dank!!! Ich habe es mehrfach durchgeschaut und einfach nicht gesehen! Jetzt läuft's...
Danke nochmals für Deine Hilfe!

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 » 16.05.2021, 19:38

Hallo Ihr lieben HomeMatic-Profis,
ich bin neu im Forum registriert, habe bisher immer begeistert mitgelesen und schon öfters Hilfe gefunden, bzw. Dinge bei mir umgesetzt. Dafür vielen Dank an alle User im Forum.
Jetzt benötige ich jedoch auch einmal Eure Hilfe. Vielleicht hat jemand bei Gelegenheit Lust und Zeit durch meine Screenshots zu schauen und vorhandene Fehler zu finden.
Ich habe eine CCU3 und 3 HM-ES-TX-WM angelernt für einen Metrix Gaszähler,mit einem Metrix Impulsnehmer NI-3. Einen Iskra MT681-D4A51 Stromzähler mit einem ES-IEC Smart Meter Sensor von ELV und einer Wasseruhr mit Impulsgeber-W mit S0-Scnittstelle von Eugen Stall.
SysVar-Gas.pdf
(1010.25 KiB) 103-mal heruntergeladen
SysVar-Strom.pdf
(1.02 MiB) 101-mal heruntergeladen
SysVar-Wasser.pdf
(1.06 MiB) 64-mal heruntergeladen
Prg-Zaehlerauswertung.pdf
(342.64 KiB) 82-mal heruntergeladen
Script.txt
(13.02 KiB) 96-mal heruntergeladen
Gas.pdf
(253.84 KiB) 95-mal heruntergeladen
Strom.pdf
(270.21 KiB) 90-mal heruntergeladen
Wasser.pdf
(263.5 KiB) 63-mal heruntergeladen
Ich vermute die Fehler im Script, behersche aber nicht die Script-Programmierung, deshalb bitte ich hier um Eure Hilfe.
Beim Gas aktualisiert sich der Zeitstempel nicht,
der aktuelle Zaehlerstand wir bei allen 3 (Gas,Strom,Wasser) nicht weitergezählt,
die Berechnung beim Gas ist viel zu hoch, irgendwo stimmt eine Umrechnungsformel nicht.
Vielleicht habe ich mir auch zu viel vorgenommen, so bin ich halt :?

Wenn jemand Lust und Zeit hätte, mal durchzuschauen, wäre ich sehr dankbar.
Sonnige Grüße
Thommy
PS: mache das hier zum 1.mal und hoffe, Ihr könnt mit meinen Anhängen was anfangen

Antworten

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