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: 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ählerstandberech

Beitrag von NickHM » 08.02.2018, 09:04

Guten Morgen

vielleicht übersehe ich etwas, aber
Kannst Du nicht in 2 Programmen das Script nutzen? Jedes Programm von einem Stromzähler getriggert.

Code: Alles auswählen

Damit das Auswerteprogramm und der Skript korrekt funktionieren müssen alle eingesetzten HM-ES-TX-WM Geräte eine eineindeutige Namensgebung besitzen die den jeweiligen Zählertyp (Strom, Gas, Wasser) wiedergeben. Wichtig ist hierbei das der Name jeweils mit "-Typ" endet. D.h. für einen Stromzähler eben z.B. "Hausanschluss-Strom".
Du hast also einmal einen Zähler "Hausanschluss-Strom" und einmal "Waermepumpe-Strom"

In dem zweiten Script benennst Du alle SysVar "name_2" legst diese in der CCU an und musst leider im kompletten Script alle SysVar Namen ein mal mit _2 ergänzen (suchen / Ersetzen)

Dann laufen beide Scripte parallel.

Damit Du nicht Unmengen an SysVar hast, musst Du nur die für Strom anlegen. Seit der letzten Version hat Jens eine Möglichkeit eingebaut, im Script zu definieren, welche Gewerke überhaupt geprüft werden. Wenn kein Gas und Wasser da ist, trägst Du das nicht ein und brauchst dann auch die SysVar nicht.

Nudge
Beiträge: 91
Registriert: 30.01.2017, 11:42

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

Beitrag von Nudge » 08.02.2018, 12:55

Suenzihome hat geschrieben: Kann man das Skript nicht irgendwie so abändern dass man sagt Strom und Strom 2.
Ja, das ist machbar und kein Problem. Der Name ist ziemlich egal, so lange diese unterscheidbar sind. Per Default geht das Script von "Strom", "Wasser" und "Gas" aus (es sucht auch nach dem Bindestrich). Das kann man aber im Script anpassen (string a="Gas,Strom,Wasser" einfach ändern nach z.B. string a="Strom,Strom2"). Du mußt dann nur den Kanalnamen Deines zweiten Stromzählers entsprechend anpassen, wie Du es auch schon beim ersten Stromzähler getan hast, damit das Script auch "Strom2" findet.
Oder wäre es vielleicht möglich auch den Gaszähler zu nutzen und überall wohl Gas im Skript steht das mit Strom 1 umzubenennen und demzufolge auch den Zähler dann Strom 1 zu nennen als Typ.
Nein, den Gaszähler kannst Du nicht (ohne Änderungen) für Strom nutzen, da für den Stromzähler die Zählerwerte in Watt umgerechnet werden, beim Gaszähler aber nicht.

Mein Tipp an Dich: Du hast es ja schon hinbekommen, den ersten Stromzähler mit dem Script zum Laufen zu bringen. Richte den zweiten Stromzähler auch so ein, ABER nutze NICHT "Strom" als Kennung, sondern z.B. "Strom2". Vergiß auch nicht den Kanalnamen für den zweiten Stromzähler bezüglich Strom2 anzupassen! Mit "Strom2" legst Du dann für den neuen Stromzähler alle notwendigen Systemvariablen ein (wie Du es auch beim ersten Zähler mit "Strom" getan hast. Beispiel: "Strom2 Referenz heute"). Dann noch im Script von string a="Gas,Strom,Wasser" nach z.B. string a="Strom,Strom2" ändern. Das sollte es schon gewesen sein.

Borland
Beiträge: 415
Registriert: 28.10.2015, 21:12
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Borland » 09.02.2018, 08:37

Moin, irgendwas mache ich noch falsch, komme aber nicht drauf ohne Hilfe ;-)

Ich denke, dass ich alles nach Anweisung gemacht habe.
Klappt auch soweit, nur werden mir keine Verbräuche vom Vortag angezeigt.
Welche Infos muss ich liefern damit mir jemand helfen kann?

VG
B.
Energie.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ählerstandberech

Beitrag von NickHM » 09.02.2018, 09:15

Hallo

in welcher Form unterscheiden sich die im Bild gezeigten SysVar von den SysVar des ersten Zählers?

Das mit dem "Verbrauch" gestern war mal ein Bug in den ersten Versionen. In der aktuellen Version sollte das nicht mehr auftauchen. Eine Lösung bei den alten Versionen war, nur die Zähler im Script berechnen zu lassen, die auch existieren.

Nudge
Beiträge: 91
Registriert: 30.01.2017, 11:42

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

Beitrag von Nudge » 09.02.2018, 09:22

Blöde Frage, aber Deine CCU war über Mitternacht aktiv? Exakt um "00:00" (mkit 2 Sekunden Verzögerung) wird "Strom Verbrauch gestern" gespeichert und sollte im Display erscheinen. Wenn das nicht der Fall ist, gibt es mehrere Möglichkeiten:

1. Fehler im Script. Dann bleibt der Zähler bei 0.
2. Falscher Kanal-/Variablenname. Dann kann der Zähler nicht aktualisiert werden.

Man müßte daher mal Deine Systemvariablen / Kanalname des Zählers anschauen.

Die restlichen Wert scheinen mir aber auch nicht plausibel zu sein, da die Verbräuche doch etwas "hoch" sind. Du darfst natürlich nicht vergessen, die Zähler zu nullen!

Borland
Beiträge: 415
Registriert: 28.10.2015, 21:12
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Borland » 09.02.2018, 10:16

Moin,

zunächst mal Danke für die Unterstützung.
Ich habe alles (Skripte, Anleitung, Einstellungen) von der ersten Seite dieses Beitrags hier genommen, falls das nicht aktuelle ist, wäre es nett, wenn mir jemand sagen könnte wo ich die aktuellen Versionen herbekomme.
Mein Stromverbrauch lag im letzten Abrechnungszeitraum bei 4950KWh, dass bei einem 2 Personen Haus (mit Hund ;-)). Daher bin ich gerade dabei mich von unnötigen Spielereien zu trennen, bzw. z.B. Dinge (Server, Datensicherung etc.) nicht mehr auf einzelnen Geräten, sondern z.B, gebündelt auf meiner Synology laufen zu lassen die eh 24/7 wegen der Videoüberwachung läuft.
Damit ich meinen Stromverbrauch ermitteln kann habe ich mir den HM-ES-TX-WM besorgt und installiert (zunächst nur für Strom).
Das erstmal Grundsätzlich.

Ich bin schon kurz davor einmal alles neu zu machen. Daher einmal meine Konfiguration, vielleicht sieht ja jemand etwas und ich kann es ändern ;-)

Zunächst das Skript, hier habe ich mal den Teil "Stromverbrauch gestern" selber zugefügt da das im Ursprungsskript nicht enthalten war (wahrscheinlich habe ich das falsch gemacht ;-))

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"); 
    object p = sysvar.Get(type # " Verbrauch Gestern"); 

    ! 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,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);
        }
      }
    }
  }
}
Hier das Programm:
Bildschirmfoto 2018-02-09 um 10.00.26.png
Hier die SysVariablen:
Bildschirmfoto 2018-02-09 um 10.11.37.png
Bildschirmfoto 2018-02-09 um 10.11.49.png
Hier die SysVar "Stromverbrauch gestern mit Kanalauswahl":
Bildschirmfoto 2018-02-09 um 10.13.57.png
Die beiden Skripte die ich laut Anleitung auf der ersten Seite bei "Skript testen" ausführen soll habe ich mehrfach ausgeführt.

Also, besser einmal komplett neu starten oder hat jemand eine Idee?


EDIT: Stromverbrauch Woche kann auch nicht stimmen, dass ist der Verbrauch seit ich den Zählersensor installiert habe (13.01.18)


VG

B.

Nudge
Beiträge: 91
Registriert: 30.01.2017, 11:42

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

Beitrag von Nudge » 09.02.2018, 10:36

Borland hat geschrieben: Ich habe alles (Skripte, Anleitung, Einstellungen) von der ersten Seite dieses Beitrags hier genommen, falls das nicht aktuelle ist, wäre es nett, wenn mir jemand sagen könnte wo ich die aktuellen Versionen herbekomme.
Die Scripte auf der ersten Seite sind aktuell und funktionieren. Ich hab diese auch erst vor ein paar Wochen bei mir nue implementiert. Das läuft bis heute fehlerfrei.
Mein Stromverbrauch lag im letzten Abrechnungszeitraum bei 4950KWh, dass bei einem 2 Personen Haus (mit Hund ;-)).
Was mich halt etwas stutzig gemacht hat: der Tagesstromverbrauch ist viel zu hoch (ca. 340 kWh). Das könnte aber am mehrfachen Ausführen des Scriptes liegen.
Den Rest schau ich mir später mal per Differenzreport an. Dann kann ich Dir weiterhelfen.

Nudge
Beiträge: 91
Registriert: 30.01.2017, 11:42

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

Beitrag von Nudge » 09.02.2018, 10:48

So, mal eben auf die Schnelle:

1. Du hast einen Schreibfehler bei der Systemvariablen "Strom Referenz Heute" gemacht. Korrekt wäre "Strom Referenz heute". Bitte akribisch auf die Schreibweise achten! Das Script überprüft exakt auf den Namen (auch Leerzeichen!).

2. Schau auch mal nach " Verbrauch gestern". Das ist im Script mal " Verbrauch Gestern", mal "Verbrauch gestern" geschrieben.

Somit ist es logisch, daß das Script nicht funktionieren kann.

Nimm daher nochmal das Originalscript und ändere die von Dir angelegte Refernzvariable auf "Strom Referenz heute" ab.

Nachtrag: Du hast selbst eine Zeile eingefügt. Das ist überflüssig! "Strom Verbrauch gestern" wird am Ende des Scriptes gespeichert! Du mußt da nix ändern. Dein Fehler war "Strom Referenz Heute" anstatt "Strom Referenz heute"

Borland
Beiträge: 415
Registriert: 28.10.2015, 21:12
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Borland » 09.02.2018, 12:52

Ich habe jetzt mal alles (Programm, Variablen) gelöscht und neu angelegt.
Die Bezeichnungen der Variablen habe ich extra aus dem Skript kopiert um keine Schreibfehler zu machen.
Et lüpt wieder nich :-(
Es ist auch eine Differenz zwischen dem Zählerstand den ich im Skript eingebe und dem was bei Skript testen ausgegeben wird.
Es werden auch gleiche Werte für Woche, heute Monat angezeigt.

Ich mache irgendwas falsch, weis aber nicht was...
Referenz Zählerstand.png
Bildschirmfoto 2018-02-09 um 12.45.48.png
Bildschirmfoto 2018-02-09 um 12.45.58.png
Bildschirmfoto 2018-02-09 um 12.46.34.png
Bildschirmfoto 2018-02-09 um 12.52.36.png

Benutzeravatar
shartelt
Beiträge: 7421
Registriert: 14.01.2015, 14:59
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 524 Mal
Danksagung erhalten: 753 Mal

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

Beitrag von shartelt » 09.02.2018, 12:55

das sieht doch gut aus?
Alle Werte sind ja weg. Morgen solltest Du dann Werte in gestern sehen?

Antworten

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