Script zum Stromverbrauch

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Benutzeravatar
mirochen
Beiträge: 43
Registriert: 25.01.2019, 18:13

Script zum Stromverbrauch

Beitrag von mirochen » 30.01.2019, 12:29

Hallo zusammen,

hier ein Script, das alle aktuellen Verbräuche und die aufgelaufenen Kosten ermittelt und in Systemvariablen speichert.

Dafür müssen leider alle Geräte im Gewerk "Stromverbraucher" abgelegt werden, ich habe (noch) keine Möglichkeit gefunden, grundsätzlich sämtliche Geräte der CCU abzufragen (Geräte innerhalb eines Gewerkes abzurufen ist kein Problem, aber so "gibt ma alle" habe ich nicht gefunden - kennt ihr eine Möglichkeit?).

Systemvariablen (alle als "Zahl"):
  • Stromverbrauch bisher: Gesamtverbrauch bisher in kWh
  • Stromkosten bisher: Gesamtstromkosten bisher in EUR
  • Strom aktueller Verbrauch: "Brandaktueller" Gesamtverbrauch in W
  • Stromverbrauch gestern: Verbrauch von gestern
Das erste lasse ich jede Stunde laufen...

Code: Alles auswählen

! Alle Stromverbrauchen müssen im Gewerk "Stromverbraucher" sein
var myAssembly = dom.GetObject("Stromverbraucher");

! Variablen initialisieren
string itemID;
real counter;
real currentW;
string prevID = "";
real strompreis = 0.258;

! Alle Geräte durchgehen
foreach(itemID, myAssembly.EnumUsedIDs()) {

    ! Gerätedetails & Schnittstelle holen
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());
    var interface = dom.GetObject(item.Interface());

    ! Name, Adresse und Kanal auslesen
    string interface_name = interface.Name();
    string device_address = device.Address();
    device_address = device_address.StrValueByIndex(":", 0);
    string channel_name = interface_name # "." # device_address # ":6.ENERGY_COUNTER";
    string channel_name2 = interface_name # "." # device_address # ":6.POWER";
    var channel = dom.GetObject(channel_name);
    var channel2 = dom.GetObject(channel_name2);

    if ((channel) && (channel_name != prevID)) {
      !WriteLine(channel_name);
      !WriteLine(channel.Value());
      counter = counter + channel.Value();
      currentW = currentW + channel2.Value();
      prevID = channel_name;
    } else {
      channel_name = interface_name # "." # device_address # ":7.ENERGY_COUNTER";
      channel_name2 = interface_name # "." # device_address # ":7.POWER";
      channel = dom.GetObject(channel_name);
      channel2 = dom.GetObject(channel_name2);
      if ((channel) && (channel_name != prevID)) {
        !WriteLine(channel_name);
        !WriteLine(channel.Value());
        counter = counter + channel.Value();
        currentW = currentW + channel2.Value();
        prevID = channel_name;
      } else {
        channel_name = interface_name # "." # device_address # ":2.ENERGY_COUNTER";
        channel_name2 = interface_name # "." # device_address # ":2.POWER";
        channel = dom.GetObject(channel_name);
        channel2 = dom.GetObject(channel_name2);
        if ((channel) && (channel_name != prevID)) {
          !WriteLine(channel_name);
          !WriteLine(channel.Value());
          counter = counter + channel.Value();
          currentW = currentW + channel2.Value();
          prevID = channel_name;
        }
      }
    }

}

real kwh = counter / 1000.0;
real kosten = kwh * strompreis;

!WriteLine("Strom verbraucht " # counter # " Wh");
!WriteLine("Strom verbraucht " # kwh.ToString() # " kWh");
!WriteLine("Stromkosten bisher " # kosten.ToString() # " EUR");
!WriteLine("Aktueller Verbrauch " # currentW.ToString() # " W");

dom.GetObject("Stromverbrauch bisher").State(kwh);
dom.GetObject("Stromkosten bisher").State(kosten);
dom.GetObject("Strom aktueller Verbrauch").State(currentW);

real gestern = dom.GetObject("Stromverbrauch gestern").Value();
real heute = kwh - gestern;

dom.GetObject("Stromverbrauch heute").State(heute);
Viel Spaß damit!

Erweiterung:

Täglich um 23:59 lasse ich folgendes Script laufen, das liefert mir meinen täglichen Verbrauch... einen einzigen Tag braucht das Script als Vorlauf, d.h. beim allerersten Lauf liefert es die bisherigen Gesamtkosten als "Tagesverbrauch". Erst ab dem zweiten Tag funktioniert es dann, hoffentlich :D

Code: Alles auswählen

! Gestrigen Verbrauch vom Gesamtverbrauch abziehen: Heutiger Verbrauch
real gestern = dom.GetObject("Stromverbrauch gestern").Value();
real heute = dom.GetObject("Stromverbrauch bisher").Value() - gestern;

! STROMPREIS ANPASSEN!!!!!

real heuteEur = heute * 0.258;

! STROMPREIS ANPASSEN!!!!!

! Info raus :D
string msg = "Stromkosten bisher " # dom.GetObject("Stromkosten bisher").Value().ToString(2) # " EUR, heute " # heuteEur.ToString(2) # " EUR";

dom.GetObject("Telegram").State(msg);

! Heutiger Verbrauch ist damit der "gestriger", damit wir morgen
! wiederum den Tageszuwachs erfassen können
dom.GetObject("Stromverbrauch gestern").State(heute);
Signatur hat Urlaub

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“