Öldurchflusszähler für Homematic

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

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

Re: Öldurchflusszähler für Homematic

Beitrag von Bachmann77 » 19.02.2019, 18:17

Ja irgendwie schon
Es zählt alles gleich hoch
image.jpeg

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

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 20.02.2019, 21:27

Irgendwo muss ein Fehler sein, da das Skript bei mir sowohl mit Strom als auch Oel läuft.

Setze doch mal die Variablen auf 0 zurück:

Code: Alles auswählen

dom.GetObject("Meine Systemvariable").State(0);
und kopiere nochmal meine Version des Skript rein:

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);
      }
    }
  }
}
Setze den initialen Zählerstand nochmal neu:

Code: Alles auswählen

! Skript um den initialen Referenzwert des Hausanschlusszaehlers
! der CCU mitzuteilen bzw. diesen zu aktualisieren.

string type = "Oel"; ! 'Strom', 'Wasser' oder 'Gas'
real value = XXX.XXX;  ! Zaehlerstand in kWh oder m3

! ACHTUNG: Ab hier KEINE Aenderungen mehr
object device = dom.GetObject("Hausanschluss-" # type);
if(device)
{
  string channel = "GAS_ENERGY_COUNTER";
  if(type == "Strom") { channel = "ENERGY_COUNTER"; }

  object counter = dom.GetObject("BidCos-RF." # device.Address() # ":1." # channel);
  if(counter)
  {
    real curValue = counter.Value();
    if(type == "Strom") { curValue = curValue / 1000.0; }    

    object c = dom.GetObject(type # " Referenz Zaehlerstand");
    c.State(value - curValue);
    WriteLine("Referenz Zaehlerstand wurde gesetzt auf: " # value - curValue);
  }
}
Hier darauf achten, dass der . ein 1000er Trenneichen ist.und prüfen, on der Referenzzählerstand korrekt übernommen wurde, indem die Ausgabe korrekt ist.
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 » 21.02.2019, 15:39

Doofe Frage...was gebe ich anstelle "Meine Systemvariable" ein?
Der Name aller Oelvariablen?
Also wenn der punkt ein 1000Trennzeichen ist, dann muss ich bei 240liter 0.240 eingeben?
Sorry...lieg grad mit grippe flach...da ist klares denke nicht sooo einfach :lol:

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

Re: Öldurchflusszähler für Homematic

Beitrag von joroehr » 23.02.2019, 16:26

In Anführungszeichen fügst du deine Variable ein. Lege dir ruhig mal eine Testvariable an und probiere etwas rum, bevor du live gehst. Dann weißt du auch genau, was wie zusammenhängt.
284 Kanäle in 117 Geräten

Antworten

Zurück zu „Projektvorstellungen“