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

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

Moderator: Co-Administratoren

kumpel1969
Beiträge: 6
Registriert: 11.01.2017, 10:43

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

Beitrag von kumpel1969 » 12.01.2017, 13:58

Hallo Jürgen,

erst einmal danke für deine Antwort.

Ich schätze auch, dass es am Skript liegt. Geh ich auf Fehlerprüfung werden einige Fehler angezeigt. Ich habe es so von Jens aus dem ersten Post übernommen.
Geändert habe ich nichts. Jens schreibt ja, dass es nur wichtig ist, dass z.B. der Gerätename immer mit XXXXX -Gas enden muss?!

Gesucht habe ich im Forum nach "Nutzung der $src$ Variable" um das Gerät zu bestimmen. Leider nichts dazu gefunden. In anderen Beispielskripts wird der Name des Device angegeben (zu entnehmen aus dem automatisch erstellen Programms).
Anbei einmal das Skript, wie es bei mir hinterlegt ist.
Brauche ich noch mehr Skripte?

VG Frank

Code: Alles auswählen

! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016 Jens Maus <mail@jens-maus.de>
!
! Version 1.1 (08.11.2016)

! Nun schauen wir wer uns aufgerufen hat (Device 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)
{
  ! 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();

  ! Wenn device NULL ist war die Ausloesung des Scripts durch den Timer verursacht
  ! wenn nicht dann durch ein echtes device.
  object device = dom.GetObject(counter.Device());
  if(device)
  {
    ! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom)
    ! aus dem Namen des Devices. Ein Device muss also immer mit "XXXXX-Gas"
    ! bzw. "XXXXXX-Wasser", etc. enden.
    string type = device.Name().StrValueByIndex("-",1);

    ! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
    ! unserer verschiedenen Zaehlerwerte
    object c = dom.GetObject(type # " Referenz Zaehlerstand");
    object d = dom.GetObject(type # " Zaehlerstand");
    object e = dom.GetObject(type # " Verbrauch aktuell");
    object f = dom.GetObject(type # " Referenz Ablesung");
    object g = dom.GetObject(type # " Verbrauch letzte Ablesung");
    object h = dom.GetObject(type # " Referenz heute");
    object i = dom.GetObject(type # " Verbrauch heute");
    object j = dom.GetObject(type # " Referenz Woche");
    object k = dom.GetObject(type # " Verbrauch Woche");
    object l = dom.GetObject(type # " Referenz Monat");
    object m = dom.GetObject(type # " Verbrauch Monat");
    object n = dom.GetObject(type # " Referenz Kalenderjahr");
    object o = dom.GetObject(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.State();
      if(type == "Strom")
      {
        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(type == "Strom")
    {
      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.State() + curValue);

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

    ! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
    ! dem Wert der letzten Ablesung
    if(type == "Strom")
    {
      object oSysVarEnergyCounter = dom.GetObject("svEnergyCounter_" # counter.Device() # "_" # device.Address());
      if(oSysVarEnergyCounter)
      {
        oSysVarEnergyCounter.State((d.State() - f.State()) * 1000.0);
      }
    }
    else
    {
      object oSysVarEnergyCounter = dom.GetObject("svEnergyCounterGas_" # counter.Device() # "_" # device.Address());
      if(oSysVarEnergyCounter)
      {
        oSysVarEnergyCounter.State(d.State() - f.State());
      }
    }

    ! Die aktuelle Zeit in eine separate Systemvariable schreiben
    ! damit man direkt sehen kann wann die Zaehelrstaende das letzte
    ! mal aktualisiert wurden.
    dom.GetObject(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 = dom.GetObject(b # " Zaehlerstand");
 
        ! Nach Wochenanfang pruefen
        if(system.Date("%a") == "Mon")
        {
          d = dom.GetObject(b # " Referenz Woche");
          e = dom.GetObject(b # " Verbrauch Woche");
          f = dom.GetObject(b # " Verbrauch letzte Woche");
 
          ! Verbrauch der letzten Woche speichern
          f.State(e.State());
 
          ! Referenzwert der Woche speichern
          d.State(c.State());
 
          ! Wochenverbrauch auf 0 setzen
          e.State(0);   
        }

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

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

        ! Tagesverbrauch auf 0 setzen
        e.State(0);
      }
    }
  }
}
Zuletzt geändert von Herbert_Testmann am 13.02.2017, 13:30, insgesamt 1-mal geändert.
Grund: Code tag eingefügt

Sunti
Beiträge: 449
Registriert: 10.12.2011, 17:56
Danksagung erhalten: 3 Mal

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

Beitrag von Sunti » 12.01.2017, 17:15

Hallo miteinander,

@JMaus - VIELEN DANK für dein tolles Script und das Du uns das zur Verfügung stellst :D :D :D

Ich hatte hier gestern auch eine "Fehlermeldung" stehen und dann schnell wieder gelöscht da ich meinen "Fehler" gefunden hatte

Mir war der gleiche Flüchtigkeitsfehler unterlaufen wie lemonbiter auf Seite 3 dieses Thread`s - korrigiert und schwups lief`s

@Kumpel1969 - nix geändert - nur das Programm erstellen und in das Script die beiden "eigenen" Daten eintragen und die beiden "Startdaten" per "Script testen" einpfelgen - fertig - läuft :D :D :D

Vielen Dank nochmals

Greets SunTi


BadenPower hat geschrieben:
lemonbiter hat geschrieben:Ich habe einen Stromzähler und habe versucht mich 1:1 an Deine Anleitung zu halten inkl. Nomenklatur des HM-ES-TX-WM.
Leider nur versucht, aber nicht getan.
lemonbiter hat geschrieben:Frage 3: Warum bekomme ich im Status keinen Wert für Aktueller Stromverbrauch etc...
Schau Dir den Auslöser Deines Programmes in der 1. Zeile an.

Bei Dir soll also das Programm gestartet werden, wenn sich der Wahrheitsgehalt der Bedingung "größer oder gleich null" ändert. Wann soll den der Wert der Energieentnahme kleiner als 0 werden, damit sich der Wahrheitsgehalt ändert? Richtig nie! Und deswegen wird Dein Porgramm nicht ausgelöst. Schau Dir das Programm im ersten Post nochmals an, dann erkennst Du den Unterschied.

.

kumpel1969
Beiträge: 6
Registriert: 11.01.2017, 10:43

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

Beitrag von kumpel1969 » 12.01.2017, 19:11

Ich kapiere es wohl irgendwie nicht. Meinst du mit den beiden eigenen Daten die Zählerstände? Die habe ich über "Skript testen" eingetragen.

Oder im Skript selbst das Device benennen?

Aslo z.B. in:
object counter = dom.GetObject("$src$");
if(counter)

Nur was dort eintragen?

Danke für die Hilfe, stehe wohl auf dem Schlauch.

Edit: Konnte jetzt noch einmal mit den Skripten von Jens den letzten Ablesewert sowie den aktuellen Zählerstand eintragen. Das hat zuvor nicht mit den Skipten funktioniert. Hatte es dann mit diesen beiden Skipten HMside getan:

CODE: ALLES AUSWÄHLEN
string list="MEIN-AKTUELLER-ZÄHLER-WERT";
dom.GetObject('Gas Referenz Zaehlerstand ').State(list);
WriteLine(list);

und

CODE: ALLES AUSWÄHLEN
string list="ZÄHLER-WERT-DER-LETZTEN-ABLESUNG";
dom.GetObject('Gas Referenz Ablesung ').State(list);
WriteLine(list);


CCU noch einmal neu gestartet:

Sieht jetzt so aus:
14.PNG
Meiner Meinung nach keine Änderung, da immer noch Fragezeichen bei "Gas Aktualisierung"

Ich habe auch einige Minuten gewartet, damit etwas gas verbraucht wird, werde aber noch etwas länger warten um sicher zu gehen, dass auch eine komplette Einheit verbraucht wird.

Yogi123
Beiträge: 29
Registriert: 05.04.2011, 09:23

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

Beitrag von Yogi123 » 12.01.2017, 20:15

Hallo Frank,
ich hatte das gleiche Problem das Du vorgenannt beschrieben hast:

-- Edit: Konnte jetzt noch einmal mit den Skripten von Jens den letzten Ablesewert sowie den aktuellen Zählerstand eintragen. Das hat zuvor nicht mit den Skipten funktioniert. Hatte -- es dann mit diesen beiden Skipten HMside getan:
____________________________________________

---CODE: ALLES AUSWÄHLEN
-- string list="MEIN-AKTUELLER-ZÄHLER-WERT";
-- dom.GetObject('Gas Referenz Zaehlerstand ').State(list);
-- WriteLine(list);
____________________________________________

wo bei "Script testen" wie in der Beschreibung erwähnt die Werte nicht übernommem wurden.
Ich hatte dann alle Systemvariablen für dieses Programm gelöscht und neu erstellt.
Dann ging es ...
Ich hoffe daß das eventuell weiterhilft, weil m. E. in dem Script was Du verwendest alles soweit in Ordung
sein müsste.
Gruß
Jürgen

kumpel1969
Beiträge: 6
Registriert: 11.01.2017, 10:43

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

Beitrag von kumpel1969 » 12.01.2017, 21:05

Hallo Jürgen,

die beiden Variablen hatte ich gestern wie du gerade beschrieben hast befüllen können. Heute seltsamerweise auch mit dem Skript von Jens.
Mir ist gerade noch aufgefallen, dass ich keine Leerzeichen am Anfange der Zeilen im Skript habe. Die hatte ich gestern alles gelöscht, da die Fehlerprüfung die Zeile dann nicht mehr moniert hat.

Ich habe gerade noch einmal das gesamte Skript einfach kopiert und neu eingefügt und siehe da: Es funktioniert.

So sieht es jetzt aus.
15.PNG
Gestern war ich am Laptop mit Chrome unterwegs. Heute an meinem Desktop-Rechner dem Edge-Browser. Das war sicher dieses typische Problem mit Cache oder falschem Browser.

Ich danke euch vielmals. Homematic macht doch einfach Spass...

Viele Grüße
Frank

Sunti
Beiträge: 449
Registriert: 10.12.2011, 17:56
Danksagung erhalten: 3 Mal

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

Beitrag von Sunti » 13.01.2017, 16:32

Hallo miteinander,

habe den "Schneesturm" genutzt um nochmals alles neu zu machen ... wollte dann beim Gaszähler den IST-Zählerstand per Script eingeben:

- "wieder" keine Antwort vom Script
- die Eingabe vom Endstand letztes Jahr wurde übernommen

mmmmhhhh und dann viel mir ein das ich die Gerätebezeichnung von den geforderten:
Hausanschluss-Gas
Hausanschluss-Gas

auf "meine" Bezeichung:

UG_Bad_Hausanschluss-Gas
UG Bad Hausanschluss-Gas

geändert hatte - gestern nach der Erfassung - heute dummerweise vor der Eingabe mit dem Script :twisted: :twisted: :twisted:

Also bei Hausanschluss-xxx bleiben !!!

Greets SunTi

Benutzeravatar
Andronid
Beiträge: 265
Registriert: 06.03.2012, 17:52
Wohnort: Beelitz

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

Beitrag von Andronid » 23.01.2017, 13:41

Hallo Jens,
auch von mir "Daumen hoch!" für dein tolles und kurzes Programm. Den Stromzähler hatte ich ziemlich schnell am Laufen. Mittlerweile sind auch alle Variablen gefüllt. Beim Gaszähler sieht es leider etwas schlechter aus. Da fehlen einfach noch zu viele Einträge. Ganz besonders der erste oben links mit den ??? Leider habe ich keine Ahnung, woran es liegt. Habe alles noch mal durchgesehen.
GasZähler.jpg
Programm.png
Dann hätte ich mal eine Frage. Könnte man sich die Daten auch per Pushover schicken lassen? Wenn ja, wie bzw. wo muss ich dann die Meldung im Program einfügen?
Beste Grüße
Andronid


--------------------------------------------------------------------------------------------------------
RaspiMatic, Fw: 3.51.6, 132 Kanäle in 66 Geräten und 48 CUxD-Kanäle in 3 CUxD-Geräten:

---------------------------------------------------------------------------------------------------------

Yogi123
Beiträge: 29
Registriert: 05.04.2011, 09:23

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

Beitrag von Yogi123 » 02.02.2017, 10:28

Guten Morgen,
ich möchte auch nochmal zurückkommen auf das Zählersensor-Programm und benötige Hilfestellung da ich folgende Problematik habe:
Seit anfang letzten Monats Januar bekam ich die Zählerstand-Berechnung an einem Gaszähler mit korrekter Anzeige zum laufen.
Ich hatte mich schon sehr gefreut, da auch nach Ablauf der Verbrauchswoche die aktuelle vergangene Woche ordnungsgemäß auf
Null gesetzt wurde und der Verbrauch der neuen Woche neu aufsummiert wurde.
Das hat bis Ende des Monats Januar 2017 ohnen Probleme funktioniert.
Mit Einsatz des neuen Monats Februar 2017 hat das Programm aber den aktuellen Monats-Verbrauch weiter
aufsummiert und der vergangene Monat Januar wurde nicht auf Null gesetzt.
Ich weiß leider jetzt nicht mehr weiter um die Problematik zu finden.

Hat eventuell jemand das gleiche Problem, bzw. kann sich jemand melden der mir weiterhelfen kann ?

Ich habe auch schon versucht folgende Zeile im Programmcode zu ändern da ich hier den Fehler vermutete:
Programmcode.pdf
(719.37 KiB) 216-mal heruntergeladen
Hier sieht die Zeile beim Zurücksetzen des Wochenverbrauchs so aus:
! Wochenverbrauch auf 0 setzen
e.State(0);
}

Hier sieht die Zeile bei Zurücksetzen des Monatsverbrauch so aus:
! Monatsverbrauch auf 0 setzen
e.State(0);

Es fehlt also das Zeichen "}"
Kann das eventuell das Problem sein oder muss das so sein .... ?

Ich habe versuchsweise hier das Zeichen mal eingesetzt, es hat sich aber nichts getan.
Nachdem ich den Programmcode wieder auf den ursprünglichen Zustand gespeichert hab , läuft jetzt als zusätzliche Problematik
das Programm gar nicht mehr.

Kann mir bitte jemand dringend weiterhelfen.

Jürgen

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

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

Beitrag von jmaus » 02.02.2017, 11:05

Yogi123 hat geschrieben:[...]
Hat eventuell jemand das gleiche Problem, bzw. kann sich jemand melden der mir weiterhelfen kann ?
Für mich hört sich das eher danach an das das Script nicht jeden Tag korrekt und automatisch um 0:00 Uhr aufgerufen wird und er daher mitunter einfach weitersummiert. Kontrolliere bitte nochmal dein Setup.
Yogi123 hat geschrieben: Ich habe auch schon versucht folgende Zeile im Programmcode zu ändern da ich hier den Fehler vermutete:
Programmcode.pdf
Hier sieht die Zeile beim Zurücksetzen des Wochenverbrauchs so aus:
! Wochenverbrauch auf 0 setzen
e.State(0);
}

Hier sieht die Zeile bei Zurücksetzen des Monatsverbrauch so aus:
! Monatsverbrauch auf 0 setzen
e.State(0);

Es fehlt also das Zeichen "}"
Kann das eventuell das Problem sein oder muss das so sein .... ?
Nein, das ist kein Problem und das Programm ist so vollkommen korrekt.
Ich habe versuchsweise hier das Zeichen mal eingesetzt, es hat sich aber nichts getan.
Nachdem ich den Programmcode wieder auf den ursprünglichen Zustand gespeichert hab , läuft jetzt als zusätzliche Problematik
das Programm gar nicht mehr.
Dann hast du ausversehen was kaputt gemacht. Gehe zurück auf Start, ziehe keine 2000 EUR ein ;)
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Yogi123
Beiträge: 29
Registriert: 05.04.2011, 09:23

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

Beitrag von Yogi123 » 02.02.2017, 19:20

Hallo Jens,
vielen Dank für die Antwort und nochmals für das tolle Programm.
Muß ich denn jetzt ganz neu beginnen oder kann ich die Systemvariablen bestehen lassen ?
Ich könnte ja dann die bisher eingelesenen Daten weiter behalten, wenn das geht ?

Weiterhin habe ich noch eine Frage zu der Einbindung des Stromzählers:

Es gibt hierzu schon einige Posts von mir, wo ich schon mitgeteilt habe daß mein Stromzähler
wie es aussieht von dem Sensor nicht unterstützt wird.
Es handelt sich hier um den Stromzähler ED21.
Ich habe mal den Schriftverkehr von ELV beigefügt, auf den ich ca. 2 Wochen warten mußte, um eine Antwort
zu bekommen.

Meine Frage wäre:
Welchen Stromzähler benutzt Du, der mit dem Stromzählersensor kompatibel ist ?
(bzw. womit läuft bei Dir das Programm)
Und welchen Homematic Sensor benutzt Du ? Die ältere oder die neuere Version.
Nochmals besten Dank für Deine Unterstützung !
Jürgen




.
ELV_Schriftverkehr.pdf
Schriftverkehr mit ELV
(52.42 KiB) 154-mal heruntergeladen
Dateianhänge
Stromzählerdaten_EDL21.pdf
Stromzählerdaten
(116.36 KiB) 201-mal heruntergeladen

Antworten

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