Öldurchflusszähler für Homematic

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

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

Re: Öldurchflusszähler für Homematic

Beitrag von tomtom1307 » 26.10.2018, 09:58

Hallo Zusammen,

das freut mich das es nun mehr Aktivitäten zu diesem Thema gibt! Super und Herzlich Willkommen Flo.

Ich habe auch noch ein weiters Feature umgesetzt. Hierzu habe ich folgendes Skrip(Projekt) viewtopic.php?t=34725 noch eingebunden um somit die Verbrauchsdaten auch gleich in Kosten vorliegen zu haben.

Leider sind meine Programmier-Kenntnisse nicht gerade super ausgeprägt.

Ich habe das Skript von Yogie123 für den Olzähler angepasst und noch die Kostenberechnung für den gestrigen Tag ergänzt.
Cool wäre es jedoch wenn der Preis für das Heizöl von der CCU (Preis für Gas) übernommen werden würde. Ich habe einfach in dem Skript den Preis für das Heizöl fest hinterlegt und müsste es dann immer im Skript anpassen.
Des Weiteren ist das Skript nur auf die Ölkosten-Berechnung ausgelegt. Hier wäre auch eine Variante wie jmaus in seinem Berechnungsskript gemacht hat, von Vorteil. Somit wird am Anfang des Skript der Zählertyp angeschaut (Wasser, Strom, Öl, Gas) und danach individuell die Werte berechnet und dem Zählertyp wieder zugeordnet.

Falls Ihr die Kostenberechnung auch integrieren wollt und Ihr mehr Kenntnisse vom Programmieren habt, könntet Ihr Euch ja an dieser Optimierung mal versuchen. Man könnte die Kostenberechnung dann auch in das Skript von Johannes am Schluss integrieren und hat somit alles in einem Ablauf.

Anbei ein Screenshot meiner WEB UI für den Ölzähler
2018-10-26 09_56_59-HomeMatic WebUI.png
2018-10-26 09_56_59-HomeMatic WebUI.png (19.96 KiB) 2315 mal betrachtet
Das Skript kann ich auch bei Interesse auch zusenden. (Wie bindet man ein Skript) in einem Beitrag ein??

VG
Thomas

shooter
Beiträge: 81
Registriert: 04.09.2018, 18:41
Hat sich bedankt: 19 Mal
Danksagung erhalten: 3 Mal

Re: Öldurchflusszähler für Homematic

Beitrag von shooter » 19.11.2018, 09:01

Hallo Thomas,

danke für das Willkommenheißen...es gibt Neuigkeiten!

Ich habe inzwischen angefangen das Projekt umzusetzen.

Als Hardware nutze ich jetzt einen alter Raspberry Pi 1 und das angegebene Flowmeter.

Das Flowmeter zählt bereits (wenn auch nur Luft), soll demnächst mal mit Wasser getestet werden.

Zur Datenspeicherung nutze ich eine Maria-DB auf dem Pi. Später werde ich dann einfach die Zählwerte je 100ml an die Raspberrymatic übertragen und dort als Variable Setzen und loggen.

Weiterhin plane ich den Raspberry mit IOBrooker zu "bestücken" damit der auch ein bisschen mehr zu tun hat...

Der nächste Schritt betrifft erstmal meinen Monteur...der soll sich gedanken machen wie er den Sensor in die Heizölleitung bekommt.

Hier mal der Code, vielleciht für den ein oder anderen interessant (ACHTUNG, noch nicht an den Sensor angepasst, d.H. der Zählt irgendwas aber keine Liter / Milliliter!

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf8 
 
import time
import RPi.GPIO as GPIO
import MySQLdb
 
# Zählweise der Pins festlegen
GPIO.setmode(GPIO.BCM)
 
# Pin 18 (GPIO 24) als Eingang festlegen
GPIO.setup(17, GPIO.IN)
#, pull_up_down = GPIO.PUD_UP)
 
# Schleifenzähler

i = 0
liter = 0.0

db = MySQLdb.connect("localhost", "root", "pi", "homematic")
curs = db.cursor()

 
# Ereignis-Prozedur für Eingang HIGH
def doIfLow(channel):
    # Zugriff auf Variable i und liter ermöglichen
    global i
    global liter
    # Schleifenzähler erhöhen
    # 10000 = 1 L; 1000 = 0,100 L
    i += 1
    if i == 100:
    	liter += 0.10
    	i = 0
    	print (str(liter) + " Liter")
    	writeValue()

#Werte in Datenbank schreiben
def writeValue ():
    global liter
    try:
        curs.execute ("INSERT INTO oil_count (count) VALUES (%f) " % (liter))
        # %d platzhalter für Zahl, %s Platzhalter für String
        db.commit()
        #print("Wert in Datenbank geschrieben")
    except:
        print ("Error. Rolling Back")
        db.rollback()

def readValue():
    global liter
    curs.execute("SELECT count FROM oil_count WHERE timestamp =(SELECT MAX(timestamp) FROM oil_count)")
    for dsatz in curs:
        liter = float(dsatz[0])
        print ("Wert aus Datenbank gelesen:" + str(liter) + " Liter")
           
               
# Ereignis deklarieren GPIO17 
GPIO.add_event_detect(17, GPIO.FALLING, callback = doIfLow, bouncetime = 10)


 
# Eigentlicher Programmablauf
try:
  readValue()
  while 1:    # Loop until users quits with CTRL-C
      time.sleep(0.1) 
except KeyboardInterrupt:
    # Reset GPIO settings
    GPIO.cleanup()
Datenbankaufbau:
Name: homematic
User: root

Tabelle: oil_count
Spalten: timestamp (Schlüssel), count (float)

Viele Grüße,

Flo

Bachmann77
Beiträge: 66
Registriert: 06.03.2018, 11:10

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 13.01.2019, 12:02

Guten Tag zusammen

ich benötige mal wieder eure Hilfe :)
Ich habe den Ölzähler erfolgreich im letzten Jahrinstalliert und mich an die vorangegangenen Einstellungen gehalten...denke ich :)

Nun habe ich jedoch folgendes Problem:
Wenn der Brenner läuft, zeigt es mir den aktuellen Durchfluss an...passt also soweit.
Was jedoch nicht passt, sind die folgende Daten:
heute, letzte Woche, letztes Jahr usw. hier wird immer nur aufaddiert und nicht tages-, wochen- oder monatsweise unterschieden.
Kann mir hier jemand helfen? Der Ölstand zum 31.12.2018 war z.b. 164.52Liter

Anbei noch die Screenshot sämtlicher Einstellungen etc.

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);
      }
    }
  }
}
Vielen Dank für eure Hilfe
Mfg Tom
Dateianhänge
3.JPG
2.JPG
1.JPG

Bachmann77
Beiträge: 66
Registriert: 06.03.2018, 11:10

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 15.01.2019, 09:52

niemand eine Idee woran es liegen könnte?
Besten Dank für eure Hilfe

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

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 15.01.2019, 10:05

Lief das Skript bisher korrekt? Wenn nein, solltest du dir im Detail die Bezeichnung der Systemvariablen anschauen. Ist hier sich sicher alles korrekt angelegt?

VG

Johannes
284 Kanäle in 117 Geräten

Bachmann77
Beiträge: 66
Registriert: 06.03.2018, 11:10

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 06.02.2019, 11:21

Hallo Johannes

Besten Dank für deine Nachricht. Ne, es lief bis jetzt nicht wirklich richtig.
Ich habe mir nun alles nochmal mehrmals angesehen....ich finde den Fehler einfach nicht :(

Übersehe ich etwas?
Besten Dank für eure Hilfe
LG Tom

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

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 09.02.2019, 22:42

Poste bitte die angelegten Variablen. Ich könnte wetten, dass der Bock dort steckt...
284 Kanäle in 117 Geräten

Bachmann77
Beiträge: 66
Registriert: 06.03.2018, 11:10

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 10.02.2019, 12:40

Hallo Johannes

hier die gewünschten Variablen.
2.JPG
1.JPG

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

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 10.02.2019, 22:42

Deine Einstellungen passen soweit. Hast du dich an das Vorgehen bei der Refrenzzählerstandseingabe gehalten? Mich wunder der fast identische Wert bei der letzten Ablesung und dem Verbrauch heute.

Da schient irgendwas nicht zu stimmen.

VG

Johannes
284 Kanäle in 117 Geräten

Bachmann77
Beiträge: 66
Registriert: 06.03.2018, 11:10

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 11.02.2019, 15:33

Denkst Du ich sollte die Referenzwerte nochmal neu setzen?
Irgendwo gabs da ne Anleitung für....nur wo?!? :)

Antworten

Zurück zu „Projektvorstellungen“