Öldurchflusszähler für Homematic

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

joroehr
Beiträge: 67
Registriert: 20.11.2016, 22:38
Hat sich bedankt: 1 Mal

Öldurchflusszähler für Homematic

Beitrag von joroehr » 26.09.2017, 22:27

Hallo zusammen,

da offenbar Bedarf nach einem detaillierten Tutorial für einen Öldurchflusszähler besteht möchte ich mein Projekt hier zusammenfassen und vorstellen.

Zunächst einmal vielen Dank an alle, die mir mit Rat und Tat beiseite gestanden haben!

Materialien:
1 x HM-ES-TX-WM Energiezähler
1 x RJ12-Anschlussstecker nebst Kabel
1 x 110kOhm Widerstand
1 x Installationsdose
1 x Ölzähler HZ 5DR

Zunächst zur Vorüberlegung:
Der Ölzähler liefert einen stetigen Impuls bei Durchfluss über den Reed-Kontakt. diesen greife ich mit dem Energiezähler ab und werte ihn aus.

Verbindung Ölzähler - Energiezähler
Hierbei hat mir dieser Post mit dem dazugehörigen Link geholfen. Die Kabel werden in der Installationsdose wie beschrieben verbunden und der Widerstand entsprechend eingelötet.
viewtopic.php?f=27&t=34344#p326297

Auswertung in der CCU:
Als Grundlage dient das Skript zur universellen Zählerstandberechnung von jMaus (viewtopic.php?f=27&t=31353). Dieses habe ich um die Variable Oel ergänzt. Jede angegebene Variable ist um die Präfix Oel ergänzt und auch im Skript angepasst.

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,Oel";
      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);
      }
    }
  }
}
Das Skript läuft nun seit fast 9 Monaten problemlos und absolut zuverlässig.
Dateianhänge
21687808_10214126411096585_1822715693423014228_n.jpg
284 Kanäle in 117 Geräten

tomtom1307
Beiträge: 16
Registriert: 13.03.2018, 13:32

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 13.03.2018, 13:36

Hallo joroehr,

ich würde gerne dein Ölzähler- Projekt bei mir umsetzten und wollte dich daher fragen ob du mir auch mal ein Diagramm oder ähnlicher zeigen könntest wie man dann die Messwerte auswerten kann. Ich bin da noch ziemlich unwissend...


Viele Grüße
Thomas

joroehr
Beiträge: 67
Registriert: 20.11.2016, 22:38
Hat sich bedankt: 1 Mal

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 13.03.2018, 22:48

Hallo Thomas,

anbei ein Screenshot von der mitgelieferten Maske und einem Standarddiagramm. Ich tracke aber zustzlich über den CCU Historian auf einem Raspery Pi die Variablen und kann hier weitere Auswertungen auch über längere Zeiträume anfertigen.

VG

Johannes
Dateianhänge
2018-03-13 22_47_52-WebConnector - Internet Explorer.png
2018-03-13 22_45_47-WebConnector - Internet Explorer.png
2018-03-13 22_45_47-WebConnector - Internet Explorer.png (29.63 KiB) 5488 mal betrachtet
284 Kanäle in 117 Geräten

tomtom1307
Beiträge: 16
Registriert: 13.03.2018, 13:32

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 14.03.2018, 13:12

Hallo Johannes,

Vielen Dank für die schnelle Antwort. Dann werde ich mal den Versuch starten das Projekt umzusetzen.
Sofern es für dich ok ist, würde ich mich bei dir dann melden falls ich Fragen habe.

Viele Grüße
Thomas

tomtom1307
Beiträge: 16
Registriert: 13.03.2018, 13:32

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 01.10.2018, 09:20

Hallo Johannes,

ich bin mir nicht sicher ob du bereits meine persönliche Nachricht bekommen hast.

Ich habe mittlerweile die Umsetzung des "Ölzähler-Projekts" begonnen und hätte hierzu noch ein paar Fragen.

Wo genau muss ich das Skript einbinden?
Wie bekomme ich eine Verbrauchsübersicht wie du? Bisher sehe ich nur die Standard-Übersicht der Zählereinheit, jedoch keine Öl-Werte.

Viele Grüße
Thomas

joroehr
Beiträge: 67
Registriert: 20.11.2016, 22:38
Hat sich bedankt: 1 Mal

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 01.10.2018, 09:33

Hi Thomas,

das Skript bindest du unter Programme - Skript testen ein.

Die Übersicht erhältst du, wenn du unter „Status und Bwdienung“ unter Geräte auf den Durchflusszöhler klickst. Ich habe mir diesen auch direkt in die Favoriten gepackt.

VG

Johannes
284 Kanäle in 117 Geräten

tomtom1307
Beiträge: 16
Registriert: 13.03.2018, 13:32

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 01.10.2018, 11:57

Hi Johannes,

danke für deine schnelle Antwort.

Ok, d.h. wenn ich das Skript-Teste und auf Ausführen drücke, ist es dann automatisch immer hinterlegt/läuft im Hintergrund mit?

Bei mir werden aktuell noch keine Werte für den Tagesverbrauch etc. im Diagramm angezeigt bzw. auch keine Platzhalter dargestellt. Vielleicht werden die ja erst angezeigt wenn die Daten erhoben wurden. Oder muss ich diese Werte noch irgendwie im Diagramm ergänzen/aktivieren?

VG
Thomas

joroehr
Beiträge: 67
Registriert: 20.11.2016, 22:38
Hat sich bedankt: 1 Mal

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 01.10.2018, 12:21

Hi Thomas,

über Skript testen spielst du die Ausgangszählerstände bzw. Zwischenablesungen ein.

Du benötigst noch das Skript, welches die Variablen auswertet und als Programm hinterlegt ist. Hast du dies bereits eingerichtet?

Es ist korrekt, dass die Daten erst erscheinen, wenn sie das erste mal berechnet werden.

VG

Johannes
284 Kanäle in 117 Geräten

tomtom1307
Beiträge: 16
Registriert: 13.03.2018, 13:32

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 01.10.2018, 12:47

Hi Johannes,

ja, ich habe quasi ein Programm erstellt, indem ich den Energiezähler als Gerät ausgewählt habe und dann und das Skript als Aktivität hinterlegt habe. Siehe Anhang. Bild 2

Das erste Bild zeigt aktuell die Übersicht der Zählerwerte an. Tagesverbrauch etc. fehlt da dann noch.

Passt das dann so mit dem Programm?

VG
Thomas
Dateianhänge
2018-10-01 11_55_27-HomeMatic WebUI.png
2018-10-01 11_55_27-HomeMatic WebUI.png (13.77 KiB) 4782 mal betrachtet
2018-10-01 12_45_29-Homematic.png

joroehr
Beiträge: 67
Registriert: 20.11.2016, 22:38
Hat sich bedankt: 1 Mal

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 01.10.2018, 23:42

Setze mal den Zustand "bei Aktualisierung auslösen". Offensichtlich greift deshalb das Skript nicht.

VG

Johannes
Bildschirmfoto 2018-10-01 um 23.41.22.png
284 Kanäle in 117 Geräten

Antworten

Zurück zu „Projektvorstellungen“