Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 22.09.2022, 18:37

Hallo zusammen,

ich bin leider kein Skripter. Ich kann Skripte lesen und verstehen, sie aber nicht entwickeln, deswegen habe ich die Hoffnung, das hier jemand in der Lage ist mir zu helfen.

Ich habe drei Daikin Klimaanlagen. Diese kann man per http abfragen:
Ich würde gerne den aktuellen Verbrauch je Klimaanlage in eine Variable schreiben, damit ich diese dann in Cux Highchart übertragen kann.
Außerdem hätte ich gerne in einer weiteren Variablen den Monatsgesamtverbrauch und in einer weiteren Variablen den Jahresgesamtverbrauch.

So das ich pro Klimaanlage 3 Variablen habe, die ich mit diesen Werten s.u. befüllen kann. bzw. mit einem Gesamtergebnis.

Ich hoffe mir kann jemand helfen.
Danke

Hintergrundwissen hier: https://github.com/openhab/openhab-addons/issues/6115

Code: Alles auswählen

http://192.168.99.35/aircon/get_day_power_ex
ergibt z.B.: ret=OK,curr_day_heat=0/0/0/0/0/13/7/4/2/0/0/0/0/0/0/1/0/0/0/0/3/4/0/0,prev_1day_heat=0/0/0/0/0/4/3/2/3/2/0/3/0/0/0/0/0/0/0/0/3/4/5/1,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

http://192.168.99.35/aircon/get_week_power
ergibt:
ret=OK,today_runtime=197,datas=100/100/100/100/0/100/100

http://192.168.99.35/aircon/get_year_power
ergibt:
ret=OK,previous_year=2/2/2/2/2/3/3/3/3/2/2/4,this_year=5/4/3/3/3/3/3/4/2
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tyfys » 22.09.2022, 19:37

Hallo

Hier mal ein Beispiel, wie ich es für den Jahresverbrauch gemacht hätte:

Code: Alles auswählen

!die WriteLine-Statements können im Live-Betrieb weg.

!Daten vom Geräte holen
var url =  "http://192.168.99.35/aircon/get_year_power"
string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
! folgende Zeile  muss im Echtbetrieb weg.
stdout ="ret=OK,previous_year=2/2/2/2/2/3/3/3/3/2/2/4,this_year=5/4/3/3/3/3/3/4/2"; 

WriteLine(stdout);
WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems;
    string year;
    string monthval;
    real yearval = 0;

    foreach(elems, stdout.Split(",")) {
        WriteLine(elems.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems.StrValueByIndex("=", 0) == "this_year") {
            year = elems.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            WriteLine(year);
            foreach(monthval, year.Split("/")) {
                yearval = yearval + monthval.ToFloat();
            }
        }
    };
    WriteLine(yearval);
    var varname = "Jahresgesamtverbrauch";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname).State(yearval);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName = "Jahresgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName);
    if (SVObj) {
        SVObj.State(yearval);
    }
}
Bei den anderen beiden Werten hab ich nicht erkannt wie die zu sehen sind , bzw was du da erwartest.

Aber vielleicht hilft dir mein Beispiel da auch weiter und kannst es entsprechend anpassen.
Gruß
Harry

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 23.09.2022, 14:38

Hallo Harry,

SUPER!!!
Vielen Dank für diese Idee...
Basierend darauf habe ich das Skript angepasst und es funktioniert.
Aber du kannst ja mal rüber gucken, ob man das verbessern kann.
Ich bin dir jedenfalls MEGA Dankbar. das hätte ich alleine nicht hin bekommen.

Code: Alles auswählen

!die WriteLine-Statements können im Live-Betrieb weg.

!Daten vom Geräte holen
var DaikinKind2 = "http://192.168.99.36/aircon/get_day_power_ex";
var DaikinKind1 = "http://192.168.99.33/aircon/get_day_power_ex";
var DaikinEltern = "http://192.168.99.28/aircon/get_day_power_ex";
var DaikinWZ = "http://192.168.99.27/aircon/get_day_power_ex";
var DaikinWG = "http://192.168.99.35/aircon/get_day_power_ex";

string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # DaikinWG # "'",  & stdout,  & stderr);

! folgende Zeile  muss im Echtbetrieb weg.
!stdout ="ret=OK,curr_day_heat=0/0/0/0/0/4/3/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/6/4/3/1/0/0/0/0/0/1/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/1/1/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/1/1/0/1/1/0/0/0/0/0/0/0/0/0/0";

!WriteLine(stdout);
!WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems1;
    string days1;
    string monthval1;
    real days1val1 = 0;

    foreach(elems1, stdout.Split(",")) {
        !WriteLine(elems1.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems1.StrValueByIndex("=", 0) == "curr_day_heat") {
            days1 = elems1.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days1);
            foreach(monthval1, days1.Split("/")) {
                days1val1 = days1val1 + monthval1.ToFloat();
            }
        }
    };
     foreach(elems1, stdout.Split(",")) {
        !WriteLine(elems1.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems1.StrValueByIndex("=", 0) == "curr_day_cool") {
            days1 = elems1.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days1);
            foreach(monthval1, days1.Split("/")) {
                days1val1 = (days1val1 + (monthval1.ToFloat())/10);
            }
        }
    };  
  	days1val1 = (days1val1*100);
   WriteLine("Tagesgesamtverbrauch Daikin Wintergarten in Watt: " # days1val1);
    var varname1 = "Tagesgesamtverbrauch Daikin WinterGarten in Watt";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname1).State(days1val1);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName1 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName1);
    if (SVObj) {
        SVObj.State(days1val1);
    }
}

!die WriteLine-Statements können im Live-Betrieb weg.

string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # DaikinWZ # "'",  & stdout,  & stderr);

!WriteLine(stdout);
!WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems2;
    string days2;
    string monthval2;
    real days2val2 = 0;

    foreach(elems2, stdout.Split(",")) {
        !WriteLine(elems2.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems2.StrValueByIndex("=", 0) == "curr_day_heat") {
            days2 = elems2.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days2);
            foreach(monthval2, days2.Split("/")) {
                days2val2 = days2val2 + monthval2.ToFloat();
            }
        }
    };
     foreach(elems2, stdout.Split(",")) {
       ! WriteLine(elems2.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems2.StrValueByIndex("=", 0) == "curr_day_cool") {
            days2 = elems2.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
           ! WriteLine(days2);
            foreach(monthval2, days2.Split("/")) {
                days2val2 = (days2val2 + (monthval2.ToFloat())/10);
            }
        }
    };  
  	days2val2 = (days2val2*100);
   WriteLine("Tagesgesamtverbrauch Daikin Wohnzimmer in Watt: " # days2val2);
    var varname2 = "Tagesgesamtverbrauch Daikin Wohnzimmer in Watt";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname2).State(days2val2);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName2 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName2);
    if (SVObj) {
        SVObj.State(days2val2);
    }
}

string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # DaikinEltern # "'",  & stdout,  & stderr);

!WriteLine(stdout);
!WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems3;
    string days3;
    string monthval3;
    real days3val3 = 0;

    foreach(elems3, stdout.Split(",")) {
        !WriteLine(elems3.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems3.StrValueByIndex("=", 0) == "curr_day_heat") {
            days3 = elems3.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days3);
            foreach(monthval3, days3.Split("/")) {
                days3val3 = days3val3 + monthval3.ToFloat();
            }
        }
    };
     foreach(elems3, stdout.Split(",")) {
        !WriteLine(elems3.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems3.StrValueByIndex("=", 0) == "curr_day_cool") {
            days3 = elems3.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
           ! WriteLine(days3);
            foreach(monthval3, days3.Split("/")) {
                days3val3 = (days3val3 + (monthval3.ToFloat())/10);
            }
        }
    };  
  	days3val3 = (days3val3*100);
    WriteLine("Tagesgesamtverbrauch Daikin Elternschlafzimmer in Watt: " # days3val3);
    var varname3 = "Tagesgesamtverbrauch Daikin DaikinEltern in Watt";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname3).State(days3val3);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName3 = "Tagesgesamtverbrauch_3";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName3);
    if (SVObj) {
        SVObj.State(days3val3);
    }
}

string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # DaikinKind1 # "'",  & stdout,  & stderr);
! folgende Zeile  muss im Echtbetrieb weg.
!stdout ="ret=OK,curr_day_heat=0/0/0/0/0/13/9/8/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/19/14/11/5/0/0/0/0/0/0/0/0/0/0/0/0/3/7/0,curr_day_cool=2/2/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0"; 

!WriteLine(stdout);
!WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems4;
    string days4;
    string monthval4;
    real days4val4 = 0;

    foreach(elems4, stdout.Split(",")) {
        !WriteLine(elems4.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems4.StrValueByIndex("=", 0) == "curr_day_heat") {
            days4 = elems4.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days4);
            foreach(monthval4, days4.Split("/")) {
                days4val4 = days4val4 + monthval4.ToFloat();
            }
        }
    };
     foreach(elems4, stdout.Split(",")) {
        !WriteLine(elems4.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems4.StrValueByIndex("=", 0) == "curr_day_cool") {
            days4 = elems4.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days4);
            foreach(monthval4, days4.Split("/")) {
                days4val4 = (days4val4 + (monthval4.ToFloat())/10);
            }
        }
    };  
  	days4val4 = (days4val4*100);
    WriteLine("Tagesgesamtverbrauch Kind1in Watt: " # days4val4);
    var varname4 = "Tagesgesamtverbrauch Daikin Kind1in Watt";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname4).State(days4val4);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName4 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName4);
    if (SVObj) {
        SVObj.State(days4val4);
    }
}

string stdout;
string stderr;
system.Exec("wget --no-check-certificate -q -O - '" # DaikinKind2 # "'",  & stdout,  & stderr);
! folgende Zeile  muss im Echtbetrieb weg.
!stdout ="ret=OK,curr_day_heat=0/0/0/0/0/13/9/8/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/19/14/11/5/0/0/0/0/0/0/0/0/0/0/0/0/3/7/0,curr_day_cool=2/2/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0"; 

!WriteLine(stdout);
!WriteLine(stderr);

!Empangene Daten verarbeiten / aufsummieren
if (stdout.StartsWith("ret=OK")) {
    string elems5;
    string days5;
    string monthval5;
    real days5val5 = 0;

    foreach(elems5, stdout.Split(",")) {
        !WriteLine(elems5.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems5.StrValueByIndex("=", 0) == "curr_day_heat") {
            days5 = elems5.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days5);
            foreach(monthval5, days5.Split("/")) {
                days5val5 = days5val5 + monthval5.ToFloat();
            }
        }
    };
     foreach(elems5, stdout.Split(",")) {
        !WriteLine(elems5.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems5.StrValueByIndex("=", 0) == "curr_day_cool") {
            days5 = elems5.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(days5);
            foreach(monthval5, days5.Split("/")) {
                days5val5 = (days5val5 + (monthval5.ToFloat())/10);
            }
        }
    };  
  	days5val5 = (days5val5*100);
    WriteLine("Tagesgesamtverbrauch Daikin Kind2 in Watt: " # days5val5);
    var varname5 = "Tagesgesamtverbrauch Daikin Kind2 in Watt";
    !Variable als Zahl angelegt
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(varname5).State(days5val5);

    !Schreiben über Variablen für Systemvariablennamen und neuem Wert
    string SysVarName5 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName5);
    if (SVObj) {
        SVObj.State(days5val5);
    }
}
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tyfys » 23.09.2022, 17:08

Hallo Tomiliy

Das hast du doch prima adaptiert.
Und auf die Schnelle hätte ich es in etwa auch so gemacht.

Optimieren könnte man dies jetzt noch - weil ja 5 x get_day_power_ex -Daten verarbeitet werden -
indem man das alles in eine Schleife packt.
Dann käme die Hauptroutine nur 1x vor.

Mir ist jetzt nur aufgefallen:
Du hast jetzt diese Zeilen

Code: Alles auswählen

    string SysVarName5 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName5);
    if (SVObj) {
        SVObj.State(days5val5);
    }
mit ..verbrauch_1 vier mal drin
und ein mal mit ..verbrauch_3

Code: Alles auswählen

    string SysVarName3 = "Tagesgesamtverbrauch_3";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName3);
    if (SVObj) {
        SVObj.State(days3val3);
    }
Ist das so gewollt?

In der jetzigen Form überschreibst du jedes mal für Tagesgesamtverbrauch_1 den vorherigen Wert.
Am Skriptende wird dann der Wert für "Tagesgesamtverbrauch Daikin Kind2 in Watt:" dort stehen.

Wenn du allerdings in Tagesgesamtverbrauch_1 die Summe aller Verbraucher haben willst
musst du noch eine Variable im Skript definieren
und dort nach jeden Abschnitt den Wert dazu addieren.
zB.

Code: Alles auswählen

string stdout;
string stderr;
integer Tagesgesamtverbrauch=0;
.....
Tagesgesamtverbrauch = Tagesgesamtverbrauch  + days1val1;
....
Tagesgesamtverbrauch = Tagesgesamtverbrauch  + days2val2;
...
!usw....

! und NUR am Ende dann  einmal  ausgeben.
    string SysVarName5 = "Tagesgesamtverbrauch_1";
    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName5);
    if (SVObj) {
        SVObj.State(Tagesgesamtverbrauch);
    }
Gruß
Harry

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 23.09.2022, 17:19

:D
Vielen Dank :-)
Ich werde deinen Tipp noch umsetzten und vielleicht hilft unser Skript ja noch anderen begeistertet Daikin Benutzern.
Ich danke dir jedenfalls ganz dolle Harry.. Ohne dich hätte ich es nicht hin bekommen.
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tyfys » 23.09.2022, 20:47

Hallo Tomiliy

Ich hab mir das noch mal angeschaut.

Herausgekommen ist nun die Version, die die Daten einer Abfrage ( hier "get_day_power_ex" ) für mehrere Geräte nun in einer Schleife verarbeitet.
Bin kein Freund von redundantem Code - obwohl es manchmal die schnellere Lösung bringt.

Code: Alles auswählen

!Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage
!2.Version

!Daikin Stromverbrauchszahlen
string url_cmd =  "/aircon/get_day_power_ex";
string url_beg =  "http://192.168.99.";
!IP-Adressen und  in der selben Reihenfolge   - Semikolon getrennt
string ip_arr = "36;33;28;27;35";
string room_arr = "Kind2;Kind1;Eltern;Wohnzimmer;Wintergarten";
!SystemVariablenname setzt sich zusammen aus SysVar_beg  + room + SysVar_end
string SysVar_beg ="Tagesgesamtverbrauch Daikin ";
string SysVar_end =" in Watt";
string SysVarTotal ="Tagesgesamtverbrauch Daikin Total in Watt";  !

!**********************************************
!ab hier nichts mehr zu ändern
!**********************************************
integer Tagesgesamtverbrauch=0;
string url = "";
string SysVarName="";
string index;
string stdout;
string stderr;
integer divisor;


!IP - Adressen nacheinander verarbeiten

foreach(index, (system.GenerateEnum(0, web.webGetValueListCount(ip_arr) - 1))) {
    url = url_beg # web.webGetValueFromList(ip_arr, index) # url_cmd;
    !WriteLine(url);
    SysVarName = SysVar_beg # web.webGetValueFromList(room_arr, index) # SysVar_end;
    !WriteLine(SysVarName);

    system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
    !folgende Zeile muss im Echtbetrieb weg.
    !stdout = "ret=OK,curr_day_heat=0/0/0/0/0/13/9/8/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/19/14/11/5/0/0/0/0/0/0/0/0/0/0/0/0/3/7/0,curr_day_cool=2/2/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0";
    !WriteLine(stdout);
    !WriteLine(stderr);

    !Empfangene Daten verarbeiten / aufsummieren
    if (stdout.StartsWith("ret=OK")) {
        string elems;
        string day;
        string hourval;
        real day_total = 0.000;
        foreach(elems, stdout.Split(",")) {
            !WriteLine(elems.StrValueByIndex("=", 0));
            !links vom Gleichheitszeichen
            if ((elems.StrValueByIndex("=", 0) == "curr_day_cool") || (elems.StrValueByIndex("=", 0) == "curr_day_heat")) {
                day = elems.StrValueByIndex("=", 1);
                !rechts vom Gleichheitszeichen
                divisor = (web.webGetValueFromList("1;10", (elems.StrValueByIndex("=", 0) == "curr_day_cool").ToInteger())).ToInteger();
                !WriteLine(day);
                foreach(hourval, day.Split("/")) {
                    day_total = (day_total + (hourval.ToFloat()) / divisor);
                }
            }
        };
        day_total = (day_total * 100);
        Tagesgesamtverbrauch = Tagesgesamtverbrauch + day_total;
        WriteLine(SysVarName  # ":  " # day_total);
    }

    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName);
    if (SVObj) {
        SVObj.State(day_total);
    } else {
        WriteLine('Variablenname "'#SysVarName #'" ist falsch oder Systemvariable nicht angelegt ');
    }

}

!zum Schluss die Summe aller Verbräuche ausgeben
WriteLine(SysVarTotal # ": " # Tagesgesamtverbrauch);
object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarTotal);
if (SVObj) {
    SVObj.State(Tagesgesamtverbrauch);
} else {
    WriteLine('Variablenname "'#SysVarTotal #'" ist falsch oder Systemvariable nicht angelegt ');
}
Kannst ja mal versuchen, ob du damit auch klar kommst.

PS: "isch abe ga keine Auto äää Daikin" :mrgreen:


Edit: Definitione day_total korrigiert
Zuletzt geändert von Tyfys am 22.06.2023, 18:52, insgesamt 1-mal geändert.
Gruß
Harry

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 23.09.2022, 23:45

Hallo Harry....
Saugeile Arbeit.
Ich hab das Skript kopiert, eingefügt und es lief sofort anstandslos (Nachdem ich noch die fehlende Systemvariable hinzugefügt habe).
Vielen Dank!!! Du bist mein Skript Gott!!

Das war hervorragende Arbeit. WOW!
Und das i-Tüpfelchen ist eben das optimierte Skript.
Ich bin echt neidisch.. das würde ich auch gerne können....

Jetzt freu ich mich jeden Tag an meinen Verbrauchswerten...
Danker dir

gruß
Thomas
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tyfys » 24.09.2022, 10:45

Hallo Thomas

Freut mich auch, dass ich dir helfen konnte.


Da ich eh das noch im Kopf hatte und es mir ja auch Spaß macht
habe ich das Ganze dann auch noch angepasst für eine Version get_week_power :

Code: Alles auswählen

!Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage
!Beitrag von Tomiliy » 22.09.2022, 18:37

!2.Version
!Daikin Stromverbrauchszahlen
string url_cmd =  "/aircon/get_week_power";
string url_beg =  "http://192.168.99.";
!IP-Adressen und  in der selben Reihenfolge   - Semikolon getrennt
string ip_arr = "36;33;28;27;35";
string room_arr = "Kind2;Kind1;Eltern;Wohnzimmer;Wintergarten";
!SystemVariablenname setzt sich zusammen aus SysVar_beg  + room + SysVar_end
string SysVar_beg ="Wochengesamtverbrauch Daikin ";
string SysVar_end =" in Watt";
string SysVarTotal ="Wochengesamtverbrauch Daikin Total in Watt";  !

!**********************************************
!ab hier nichts mehr zu ändern
!**********************************************
integer Wochengesamtverbrauch=0;
string url = "";
string SysVarName="";
string index;
string stdout;
string stderr;
integer divisor;


!IP - Adressen nacheinander verarbeiten

foreach(index, (system.GenerateEnum(0, web.webGetValueListCount(ip_arr) - 1))) {
    url = url_beg # web.webGetValueFromList(ip_arr, index) # url_cmd;
    !WriteLine(url);
    SysVarName = SysVar_beg # web.webGetValueFromList(room_arr, index) # SysVar_end;
    !WriteLine(SysVarName);

    system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
    !folgende Zeile muss im Echtbetrieb weg.
    !stdout ="ret=OK,today_runtime=197,datas=100/100/100/100/0/100/100";  
    !WriteLine(stdout);
    !WriteLine(stderr);

    !Empfangene Daten verarbeiten / aufsummieren
    if (stdout.StartsWith("ret=OK")) {
        string elems;
        string week;
        string dayval;
        real week_total = 0.000;
    foreach(elems, stdout.Split(",")) {
        !WriteLine(elems.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems.StrValueByIndex("=", 0) == "datas") {
            week = elems.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            !WriteLine(week);
            foreach(dayval, week.Split("/")) {
                week_total = week_total + dayval.ToFloat();
            }
        }
    };
        week_total = (week_total * 100);
        Wochengesamtverbrauch = Wochengesamtverbrauch + week_total;
        WriteLine(SysVarName  # ":  " # week_total);
    }

    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName);
    if (SVObj) {
        SVObj.State(week_total);
    } else {
        WriteLine('Variablenname "'#SysVarName #'" ist falsch oder Systemvariable nicht angelegt ');
    }

}

!zum Schluss die Summe aller Verbräuche ausgeben
WriteLine(SysVarTotal # ": " # Wochengesamtverbrauch);
object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarTotal);
if (SVObj) {
    SVObj.State(Wochengesamtverbrauch);
} else {
    WriteLine('Variablenname "'#SysVarTotal #'" ist falsch oder Systemvariable nicht angelegt ');
}
und eine Version für get_year_power :

Code: Alles auswählen

!Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage
!Beitrag von Tomiliy » 22.09.2022, 18:37

!2.Version
!Daikin Stromverbrauchszahlen
string url_cmd =  "/aircon/get_year_power";
string url_beg =  "http://192.168.99.";
!IP-Adressen und  in der selben Reihenfolge   - Semikolon getrennt
string ip_arr = "36;33;28;27;35";
string room_arr = "Kind2;Kind1;Eltern;Wohnzimmer;Wintergarten";
!SystemVariablenname setzt sich zusammen aus SysVar_beg  + room + SysVar_end
string SysVar_beg ="Jahresgesamtverbrauch Daikin ";
string SysVar_end =" in Watt";
string SysVarTotal ="Jahresgesamtverbrauch Daikin Total in Watt";  !

!**********************************************
!ab hier nichts mehr zu ändern
!**********************************************
integer Jahresgesamtverbrauch=0;
string url = "";
string SysVarName="";
string index;
string stdout;
string stderr;
integer divisor;


!IP - Adressen nacheinander verarbeiten

foreach(index, (system.GenerateEnum(0, web.webGetValueListCount(ip_arr) - 1))) {
    url = url_beg # web.webGetValueFromList(ip_arr, index) # url_cmd;
    !WriteLine(url);
    SysVarName = SysVar_beg # web.webGetValueFromList(room_arr, index) # SysVar_end;
    !WriteLine(SysVarName);

    system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
    !folgende Zeile muss im Echtbetrieb weg.
    !stdout ="ret=OK,previous_year=2/2/2/2/2/3/3/3/3/2/2/4,this_year=5/4/3/3/3/3/3/4/2";  
    !WriteLine(stdout);
    !WriteLine(stderr);

    !Empfangene Daten verarbeiten / aufsummieren
    if (stdout.StartsWith("ret=OK")) {
        string elems;
        string year;
        string monthval;
        real year_total = 0.000;
    foreach(elems, stdout.Split(",")) {
        WriteLine(elems.StrValueByIndex("=", 0));  ! links vom Gleichheitszeichen
        if (elems.StrValueByIndex("=", 0) == "this_year") {
            year = elems.StrValueByIndex("=", 1);    ! rechts vom Gleichheitszeichen 
            WriteLine(year);
            foreach(monthval, year.Split("/")) {
                year_total = year_total + monthval.ToFloat();
            }
        }
    };
        year_total = (year_total * 100);
        Jahresgesamtverbrauch = Jahresgesamtverbrauch + year_total;
        WriteLine(SysVarName  # ":  " # year_total);
    }

    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName);
    if (SVObj) {
        SVObj.State(year_total);
    } else {
        WriteLine('Variablenname "'#SysVarName #'" ist falsch oder Systemvariable nicht angelegt ');
    }

}

!zum Schluss die Summe aller Verbräuche ausgeben
WriteLine(SysVarTotal # ": " # Jahresgesamtverbrauch);
object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarTotal);
if (SVObj) {
    SVObj.State(Jahresgesamtverbrauch);
} else {
    WriteLine('Variablenname "'#SysVarTotal #'" ist falsch oder Systemvariable nicht angelegt ');
}

Evtl. muss du bei diesen beiden Statements den Faktor 100 ändern / auf 1 setzen / rausnehmen.
week_total = (week_total * 100);
year_total = (year_total * 100);


Vielleicht hast du es auch schon selbst erledigt, dann kannst du die ja vergleichen.
Falls nicht, dann kannst du es ja gebrauchen........


Edit: Definitionen week_total und year_total korrigiert
Zuletzt geändert von Tyfys am 22.06.2023, 18:50, insgesamt 1-mal geändert.
Gruß
Harry

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 16.06.2023, 15:41

Hallo,

seit ein paar Tagen funktioniert das Skript nicht mehr.
Zu diesem Zeitpunkt sollte die .35 schon irgendwas um 9KW anzeigen. Angezeigt wird aber 1600 und ich weiß nicht warum. Hat jemand eine Idee? Ist irgendwo ein fehler im Skript? Wie gesagt, das Skript lief über Monate sehr gut

Code: Alles auswählen

http://192.168.xx.35/aircon/get_day_power_ex
ret=OK,curr_day_heat=0/0/0/0/0/10/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/13/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/0/0/0/0/0/0/0/3/15/15/16/16/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/4/14/14/13/13/14/14/13/14/10/0/0/0/0/0

http://192.168.xx.36/aircon/get_day_power_ex
ret=OK,curr_day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1/0/0/0/1/0/0

http://192.168.xx.33/aircon/get_day_power_ex
ret=OK,curr_day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

http://192.168.xx.28/aircon/get_day_power_ex
ret=OK,curr_day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

http://192.168.xx.27/aircon/get_day_power_ex
ret=OK,curr_day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,curr_day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/1/0/0/0/0/0/0/0/0/0/1/0/0

Code: Alles auswählen

!Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage
!2.Version

!Daikin Stromverbrauchszahlen
string url_cmd =  "/aircon/get_day_power_ex";
string url_beg =  "http://192.168.xx.";
!IP-Adressen und  in der selben Reihenfolge   - Semikolon getrennt
string ip_arr = "36;33;28;27;35";
string room_arr = "1;2;3;4;5";
!SystemVariablenname setzt sich zusammen aus SysVar_beg  + room + SysVar_end
string SysVar_beg ="Tagesverbrauch ";
string SysVar_end ="";
string SysVarTotal ="Tagesgesamtverbrauch Daikin Total";  !

!**********************************************
!ab hier nichts mehr zu ändern
!**********************************************
integer Tagesgesamtverbrauch=0;
string url = "";
string SysVarName="";
string index;
string stdout;
string stderr;
integer divisor;


!IP - Adressen nacheinander verarbeiten

foreach(index, (system.GenerateEnum(0, web.webGetValueListCount(ip_arr) - 1))) {
    url = url_beg # web.webGetValueFromList(ip_arr, index) # url_cmd;
    !WriteLine(url);
    SysVarName = SysVar_beg # web.webGetValueFromList(room_arr, index) # SysVar_end;
    !WriteLine(SysVarName);

    system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
    !folgende Zeile muss im Echtbetrieb weg.
    !stdout = "ret=OK,curr_day_heat=0/0/0/0/0/13/9/8/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_heat=0/0/0/0/0/19/14/11/5/0/0/0/0/0/0/0/0/0/0/0/0/3/7/0,curr_day_cool=2/2/2/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0,prev_1day_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0";
    !WriteLine(stdout);
    !WriteLine(stderr);

    !Empfangene Daten verarbeiten / aufsummieren
    if (stdout.StartsWith("ret=OK")) {
        string elems;
        string day;
        string hourval;
        real day_total = 0;
        foreach(elems, stdout.Split(",")) {
            !WriteLine(elems.StrValueByIndex("=", 0));
            !links vom Gleichheitszeichen
            if ((elems.StrValueByIndex("=", 0) == "curr_day_cool") || (elems.StrValueByIndex("=", 0) == "curr_day_heat")) {
                day = elems.StrValueByIndex("=", 1);
                !rechts vom Gleichheitszeichen
                divisor = (web.webGetValueFromList("1;10", (elems.StrValueByIndex("=", 0) == "curr_day_cool").ToInteger())).ToInteger();
                !WriteLine(day);															  
                foreach(hourval, day.Split("/")) {
                    day_total = (day_total + (hourval.ToFloat()) / divisor);
                }
            }
        };
        day_total = (day_total * 100);
        Tagesgesamtverbrauch = Tagesgesamtverbrauch + day_total;
        WriteLine(SysVarName  # ":  " # day_total);
    }

    object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName);
    if (SVObj) {
        SVObj.State(day_total);
    } else {
        WriteLine('Variablenname "'#SysVarName #'" ist falsch oder Systemvariable nicht angelegt ');
    }

}

!zum Schluss die Summe aller Verbräuche ausgeben
WriteLine(SysVarTotal # ": " # Tagesgesamtverbrauch);
object SVObj = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarTotal);
if (SVObj) {
    SVObj.State(Tagesgesamtverbrauch);
} else {
    WriteLine('Variablenname "'#SysVarTotal #'" ist falsch oder Systemvariable nicht angelegt ');
}
object o = dom.GetObject("Tagesverbrauch 1");
object p = dom.GetObject("Tagesverbrauch 2");
object q = dom.GetObject("Tagesverbrauch 3");
object r = dom.GetObject("Tagesverbrauch 4");
object s = dom.GetObject("Tagesverbrauch 5");
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(o.Name()#";"#o.Value());
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(p.Name()#";"#p.Value());
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(q.Name()#";"#q.Value());
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(r.Name()#";"#r.Value());
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(s.Name()#";"#s.Value());

--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Script zu Abfrage des Stromverbrauchs einer Daikin Klimaanlage

Beitrag von Tomiliy » 18.06.2023, 11:27

...keiner Zeit oder eine Idee, warum das Skript plötzlich nicht mehr richtig zählt?
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Antworten

Zurück zu „HomeMatic allgemein“