TCL(?)-Script erstellung, Heizungsdaten auslesen

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

massel
Beiträge: 15
Registriert: 14.11.2021, 11:51
System: CCU
Hat sich bedankt: 1 Mal

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von massel » 15.11.2021, 22:49

Hi,
ja das war blöd von mir nicht den ganzen Quelltext zu posten...

Code: Alles auswählen

<html><head></head><body><div id="pos0">
T.Speicher oben</div>
<div id="pos1">
77.0 °C</div>
<div id="pos2">
T.Speicher mitte</div>
<div id="pos3">
75.4 °C</div>
<div id="pos4">
T.Speicher unten</div>
<div id="pos5">
75.4 °C</div>
<div id="pos6">
T.Kollektor</div>
<div id="pos7">
6.4 °C</div>
<div id="pos8">
T.Walltherm Wasser</div>
<div id="pos9">
81.5 °C</div>
<div id="pos10">
T.Rauchgas</div>
<div id="pos11">
135.0 °C</div>
<div id="pos12">
T.Heizkreis VL 1</div>
<div id="pos13">
38.6 °C</div>
<div id="pos14">
T.Heizkreis VL 2</div>
<div id="pos15">
9999.9 °C</div>
<div id="pos16">
T.Außen</div>
<div id="pos17">
7.3 °C</div>
<div id="pos18">
Zusatzfühler 1</div>
<div id="pos19">
76.6 °C</div>
<div id="pos20">
Zusatzfühler 2</div>
<div id="pos21">
9999.9 °C</div>
<div id="pos22">
Eingang potentialfrei HK 1</div>
<div id="pos23">
AUS</div>
<div id="pos24">
Eingang potentialfrei HK 2</div>
<div id="pos25">
AUS</div>
<div id="pos26">
Walltherm Pumpe</div>
<div id="pos27" class="changex2" adresse="10040DA0187">
Auto/EIN</div>
<div id="pos28">
Zuluftklappe</div>
<div id="pos29" class="changex2" adresse="10140DA0187">
Auto/EIN</div>
<div id="pos30">
Solarpumpe</div>
<div id="pos31">
Thermostat 1</div>
<div id="pos32" class="changex2" adresse="10440DA0187">
Auto/AUS</div>
<div id="pos33" class="changex2" adresse="10240DA0187">
Auto/AUS</div>
<div id="pos34">
Rauchgassauger</div>
<div id="pos35" class="changex2" adresse="10540DA0187">
Auto/AUS</div>
<div id="pos36">
Zirkulationspumpe</div>
<div id="pos37" class="changex2" adresse="10640DA0187">
Auto/AUS</div>
<div id="pos38">
Mischer-Heizkreis 1</div>
<div id="pos39" class="changex2" adresse="10740910187">
Auto</div>
<div id="pos40">
Mischer-Heizkreis 2</div>
<div id="pos41" class="changex2" adresse="10940910187">
Auto</div>
<div id="pos42">
Heizkreispumpe 1</div>
<div id="pos43" class="changex2" adresse="10B40DA0187">
Auto/EIN</div>
<div id="pos44">
Heizkreispumpe 2</div>
<div id="pos45" class="changex2" adresse="10C40DA0187">
Auto/AUS</div>
<div id="pos46">
Thermostat 2</div>
<div id="pos47">
Thermostat 3</div>
<div id="pos48" class="changex2" adresse="10F40DA0187">
Auto/AUS</div>
<div id="pos49" class="changex2" adresse="10E40DA0187">
Auto/AUS</div>
<div id="pos50">
Eingänge:
</div>
<div id="pos51">
Ausgänge: 
</div>
<div id="pos52" class="durchsichtig" onclick="location.href='schema.html#1'">
</div>
</body></html>
oder vom Script testen ausgelesen:

Code: Alles auswählen

<div id="pos0" >
T.Speicher oben</div>
<div id="pos1" >
77.0</div>
<div id="pos2" >
T.Speicher mitte</div>
<div id="pos3" >
75.4</div>
<div id="pos4" >
T.Speicher unten</div>
<div id="pos5" >
75.4</div>
<div id="pos6" >
T.Kollektor</div>
<div id="pos7" >
6.4</div>
<div id="pos8" >
T.Walltherm Wasser</div>
<div id="pos9" >
80.6</div>
<div id="pos10" >
T.Rauchgas</div>
<div id="pos11" >
132.6</div>
<div id="pos12" >
T.Heizkreis VL 1</div>
<div id="pos13" >
43.5</div>
<div id="pos14" >
T.Heizkreis VL 2</div>
<div id="pos15" >
9999.9</div>
<div id="pos16" >
T.Außen</div>
<div id="pos17" >
7.3</div>
<div id="pos18" >
Zusatzfühler 1</div>
<div id="pos19" >
76.8</div>
<div id="pos20" >
Zusatzfühler 2</div>
<div id="pos21" >
9999.9</div>
<div id="pos22" >
Eingang potentialfrei HK 1</div>
<div id="pos23" >
OFF</div>
<div id="pos24" >
Eingang potentialfrei HK 2</div>
<div id="pos25" >
OFF</div>
<div id="pos26" >
Walltherm Pumpe</div>
<div id="pos27" class="changex2" adresse="10040DA0187">
Auto/EIN</div>
<div id="pos28" >
Zuluftklappe</div>
<div id="pos29" class="changex2" adresse="10140DA0187">
Auto/EIN</div>
<div id="pos30" >
Solarpumpe</div>
<div id="pos31" >
Thermostat 1</div>
<div id="pos32" class="changex2" adresse="10440DA0187">
Auto/AUS</div>
<div id="pos33" class="changex2" adresse="10240DA0187">
Auto/AUS</div>
<div id="pos34" >
Rauchgassauger</div>
<div id="pos35" class="changex2" adresse="10540DA0187">
Auto/AUS</div>
<div id="pos36" >
Zirkulationspumpe</div>
<div id="pos37" class="changex2" adresse="10640DA0187">
Auto/AUS</div>
<div id="pos38" >
Mischer-Heizkreis 1</div>
<div id="pos39" class="changex2" adresse="10740910187">
Auto</div>
<div id="pos40" >
Mischer-Heizkreis 2</div>
<div id="pos41" class="changex2" adresse="10940910187">
Auto</div>
<div id="pos42" >
Heizkreispumpe 1</div>
<div id="pos43" class="changex2" adresse="10B40DA0187">
Auto/EIN</div>
<div id="pos44" >
Heizkreispumpe 2</div>
<div id="pos45" class="changex2" adresse="10C40DA0187">
Auto/AUS</div>
<div id="pos46" >
Thermostat 2</div>
<div id="pos47" >
Thermostat 3</div>
<div id="pos48" class="changex2" adresse="10F40DA0187">
Auto/AUS</div>
<div id="pos49" class="changex2" adresse="10E40DA0187">
Auto/AUS</div>
<div id="pos50" >
Eingänge:
</div>
<div id="pos51" >
Ausgänge: 
</div>
<div id="pos52" class="durchsichtig" onClick="location.href='schema.html#1'">
</div>
Hatte die "Code"-Funktion noch nicht gekannt und wollte nicht alles vollschreiben 🙄 sorry

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 16.11.2021, 14:29

Hallo massel
massel hat geschrieben:
15.11.2021, 22:49
Hatte die "Code"-Funktion noch nicht gekannt und wollte nicht alles vollschreiben 🙄 sorry
NP

Ich hatte noch einen kleinen Fehler im Skript zum Variablen schreiben.Da war mir eine Klammer verschütt gegangen.

Hier nun noch mal die beiden Versionen,allerdings nur für die Temperatur angaben ( bis Zusatzfühler 2).

Die Variablen anlisten:

Code: Alles auswählen

!Variablen und Werte für die ersten 21 Werte
string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von=0;
integer bis =21;
integer ix;
string  stdout;
string  stderr;
string  suche = '<div id="pos';
string  such2 = '</div>';
string  index;
string  wert;
string  sysvar;
real    sv_value;

string stdout = '<div id="pos0">T.Speicher oben</div><div id="pos1">77.0 °C</div><div id="pos2">T.Speicher mitte</div><div id="pos3">75.4 °C</div><div id="pos4">T.Speicher unten</div><div id="pos5">75.4 °C</div><div id="pos6">T.Kollektor</div><div id="pos7">6.4 °C</div><div id="pos8">T.Walltherm Wasser</div><div id="pos9">81.5 °C</div><div id="pos10">T.Rauchgas</div><div id="pos11">135.0 °C</div><div id="pos12">T.Heizkreis VL 1</div><div id="pos13">38.6 °C</div><div id="pos14">T.Heizkreis VL 2</div><div id="pos15">9999.9 °C</div><div id="pos16">T.Außen</div><div id="pos17">7.3 °C</div><div id="pos18">Zusatzfühler 1</div><div id="pos19">76.6 °C</div><div id="pos20">Zusatzfühler 2</div><div id="pos21">9999.9 °C</div><div id="pos22">Eingang potentialfrei HK 1</div><div id="pos23">AUS</div><div id="pos24">Eingang potentialfrei HK 2</div><div id="pos25">AUS</div><div id="pos26">Walltherm Pumpe</div><div id="pos27" class="changex2" adresse="10040DA0187">Auto/EIN</div><div id="pos28">Zuluftklappe</div><div id="pos29" class="changex2" adresse="10140DA0187">Auto/EIN</div><div id="pos30">Solarpumpe</div><div id="pos31">Thermostat 1</div><div id="pos32" class="changex2" adresse="10440DA0187">Auto/AUS</div><div id="pos33" class="changex2" adresse="10240DA0187">Auto/AUS</div><div id="pos34">Rauchgassauger</div><div id="pos35" class="changex2" adresse="10540DA0187">Auto/AUS</div><div id="pos36">Zirkulationspumpe</div><div id="pos37" class="changex2" adresse="10640DA0187">Auto/AUS</div><div id="pos38">Mischer-Heizkreis 1</div><div id="pos39" class="changex2" adresse="10740910187">Auto</div><div id="pos40">Mischer-Heizkreis 2</div><div id="pos41" class="changex2" adresse="10940910187">Auto</div><div id="pos42">Heizkreispumpe 1</div><div id="pos43" class="changex2" adresse="10B40DA0187">Auto/EIN</div><div id="pos44">Heizkreispumpe 2</div><div id="pos45" class="changex2" adresse="10C40DA0187">Auto/AUS</div><div id="pos46">Thermostat 2</div><div id="pos47">Thermostat 3</div><div id="pos48" class="changex2" adresse="10F40DA0187">Auto/AUS</div><div id="pos49" class="changex2" adresse="10E40DA0187">Auto/AUS</div><div id="pos50">Eingänge:</div><div id="pos51">Ausgänge: </div><div id="pos52" class="durchsichtig" onclick="location.href=\'schema.html\#1\'"></div>';
system.Exec("wget --no-check-certificate -q -O - '" # url # "'" , &stdout, &stderr);
stdout = stdout.ToLatin();
stdout = stdout.Replace(" °C", "");

foreach(index, system.GenerateEnum(von, bis))
{
    var such1 = suche # index;
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    ix = index.ToInteger() % 2;
    if (ix == 0)
    {
        sysvar = wert.Replace(" ", "");
        Write("SysVarName: " # sysvar);
    }
    else
    {
        sv_value = wert.ToFloat();
        WriteLine("    mit   Wert: " # sv_value);
    }
}

Variablen ausgeben:

Code: Alles auswählen

string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von = 0;  !erste div id pos nr
integer bis = 21; !letzte div id pos nr
integer ix;
string  stdout;
string  stderr;
string  suche = '<div id="pos';
string  such2 = '</div>';
string  index;
string  wert;
string  sysvar;
real    sv_value;

system.Exec("wget --no-check-certificate -q -O - '" # url # "'" , &stdout, &stderr);
stdout = stdout.ToLatin();
stdout = stdout.Replace(" °C", "");

foreach(index, system.GenerateEnum(von, bis))
{
    var such1 = suche # index ;
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">")+1);
    ix = index.ToInteger() % 2;
    if (ix == 0)
    {
        sysvar = wert.Replace(".", "").Replace(" ", "");
    }
    else
    {
        sv_value = wert.ToFloat();
        object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
        if (svdp)
        {
            svdp.State(sv_value);
        }
    }
}
Noch ein paar Fragen zur Verarbeitung der restlichen Werte.
Du willst diese in der CCU haben, um sie dort noch weiter zu verwerten in einem CCU-Programm.
Z.B. so: wenn T.Speicherunten grösser 22 Grad , dann mach das und das oder wenn WallthermPumpe gleich Auto/Ein dann mach dies und das.

Es dürfen die dann nur als Zahlen, Logikwerte oder Werteliste angelegt werden.
Dann muss man wissen, was da alles so kommen kann.
OFF bzw. ON, Auto/EIN bzw. Auto/AUS und ???


und brauchst du hiervon auch etwas

Code: Alles auswählen

Thermostat 2</div>
<div id="pos47" >
Thermostat 3</div>
<div id="pos48" class="changex2" adresse="10F40DA0187">
Auto/AUS</div>
<div id="pos49" class="changex2" adresse="10E40DA0187">
Auto/AUS</div>
<div id="pos50" >
da passt die vorherige Logik leider nicht....
Gruß
Harry

massel
Beiträge: 15
Registriert: 14.11.2021, 11:51
System: CCU
Hat sich bedankt: 1 Mal

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von massel » 17.11.2021, 19:07

Moin nochmal,
ich habe das Script eingegeben, aber leider aktualisiert er die Variablen nicht.
Es ist doch von der Logik her so, dass das Script nur in die Variablen schreibt, die in der CCU3 auch vorher schon angelegt worden sind, oder?
Das Zeitmodul steht auf "ganztägig, Zeitintervall alle 1 Minuten"
Hier sind die Variablen und das Programm. Hab ich noch was falsch eingestellt?

Was da noch an Daten von den Schaltzuständen der Pumpe kommen kann muss ich mal in Ruhe durchgucken. Ich schätze es ist OFF, Auto/EIN, Auto/AUS.
Dateianhänge
FE84E2FF-2FB2-4850-8D65-E48D290540C9.jpeg
01E47CF7-4D93-4650-A8EC-722DC3D8FE98.jpeg

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 17.11.2021, 20:09

Hallo massel.

Ich Blödmann hab die Erzeugung der Variablennamen nicht in beiden Skripts identisch gehabt.

Wenn du im Skript Variablen ausgeben:
dieses Statement

Code: Alles auswählen

sysvar = wert.Replace(".", "").Replace(" ", "");
gegen dieses Statement tauschst

Code: Alles auswählen

sysvar = wert.Replace(" ", "");
sollte es nun endlich auch mit dem Füllen der Variablen klappen.

massel hat geschrieben:
17.11.2021, 19:07
Zeitintervall alle 1 Minuten
Das scheint mir doch etwas knapp zu sein. Die Verarbeitung auf meiner CCU2 dauert schon ein Weilchen.

Hattest du nicht geschrieben:
massel hat geschrieben:
14.11.2021, 15:23
Mir würde es alle 10 Minuten reichen
Zu den anderen Werten..
massel hat geschrieben:
17.11.2021, 19:07
Was da noch an Daten von den Schaltzuständen der Pumpe kommen kann muss ich mal in Ruhe durchgucken. Ich schätze es ist OFF, Auto/EIN, Auto/AUS.
Da schlage ich dann vor, du legst die als Variablentyp Logikwert an.
Als Wertebezeichung für wahr dann ON bzw Auto/EIN
und für falsch dann OFF bzw Auto/AUS


Dann fehlt nur noch deine Meinung zu Thermostat 2 und Thermostat 3
Gruß
Harry

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 17.11.2021, 21:18

Hallo massel


Noch einen Block gefunden, der eine andere Reihenfolge hat.

Code: Alles auswählen

<div id="pos30" >
Solarpumpe</div>
<div id="pos31" >
Thermostat 1</div>
<div id="pos32" class="changex2" adresse="10440DA0187">
Auto/AUS</div>
<div id="pos33" class="changex2" adresse="10240DA0187">
Auto/AUS</div>
Brauchst du da etwas von, wenn ja, wie gehört das zusammen.

Gilt auch noch für den bereits aufgegeben Block :

Code: Alles auswählen

<div id="pos46" >
Thermostat 2</div>
<div id="pos47" >
Thermostat 3</div>
<div id="pos48" class="changex2" adresse="10F40DA0187">
Auto/AUS</div>
<div id="pos49" class="changex2" adresse="10E40DA0187">
Auto/AUS</div>
aber prüft das in Ruhe - nur nicht hudeln :mrgreen:
Gruß
Harry

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 19.11.2021, 19:27

Hallo massel

Hier einmal die vorläufigen Endversionen :mrgreen:

Es werden alle Werte verarbeitet, bis auf die letzten Positionen, wo kein Wert erkennbar ist.
<div id="pos50" >
Eingänge:
</div>
<div id="pos51" >
Ausgänge:
</div>
<div id="pos52" class="durchsichtig" onClick="location.href='schema.html#1'">
</div>

hier das Skript zum Anlisten der Variablennamen:

Code: Alles auswählen

! CMI-Heizungsdaten  Systemvariablennamen anlisten
!**************************************************************
! Variablen und Werte für die ersten 29 ids   und   34-45
! Variablen mit Temperaturangaben anlegen als Variablentyp Zahl
! Variablen nicht mit Temperaturangaben anlegen als Variablentyp Logikwert  ( wahr = an  / falsch = aus
!**************************************************************

string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von = 0;  !erste div id pos nr
integer bis = 29; !letzte div id pos nr
integer ix;
string  stdout;
string  stderr;
string  suche = '<div id="pos';
string  such2 = '</div>';
string  index;
string  wert;
string  sysvar;
real    sv_value;

system.Exec("wget --no-check-certificate -q -O - '" # url # "'" , &stdout, &stderr);
if (stdout.Length() == 0 )
{
   stdout = '<div id="pos0">T.Speicher oben</div><div id="pos1">77.0 °C</div><div id="pos2">T.Speicher mitte</div><div id="pos3">75.4 °C</div><div id="pos4">T.Speicher unten</div><div id="pos5">75.4 °C</div><div id="pos6">T.Kollektor</div><div id="pos7">6.4 °C</div><div id="pos8">T.Walltherm Wasser</div><div id="pos9">81.5 °C</div><div id="pos10">T.Rauchgas</div><div id="pos11">135.0 °C</div><div id="pos12">T.Heizkreis VL 1</div><div id="pos13">38.6 °C</div><div id="pos14">T.Heizkreis VL 2</div><div id="pos15">9999.9 °C</div><div id="pos16">T.Außen</div><div id="pos17">7.3 °C</div><div id="pos18">Zusatzfühler 1</div><div id="pos19">76.6 °C</div><div id="pos20">Zusatzfühler 2</div><div id="pos21">9999.9 °C</div><div id="pos22">Eingang potentialfrei HK 1</div><div id="pos23">AUS</div><div id="pos24">Eingang potentialfrei HK 2</div><div id="pos25">AUS</div><div id="pos26">Walltherm Pumpe</div><div id="pos27" class="changex2" adresse="10040DA0187">Auto/EIN</div><div id="pos28">Zuluftklappe</div><div id="pos29" class="changex2" adresse="10140DA0187">Auto/EIN</div><div id="pos30">Solarpumpe</div><div id="pos31">Thermostat 1</div><div id="pos32" class="changex2" adresse="10440DA0187">Auto/AUS</div><div id="pos33" class="changex2" adresse="10240DA0187">Auto/AUS</div><div id="pos34">Rauchgassauger</div><div id="pos35" class="changex2" adresse="10540DA0187">Auto/AUS</div><div id="pos36">Zirkulationspumpe</div><div id="pos37" class="changex2" adresse="10640DA0187">Auto/AUS</div><div id="pos38">Mischer-Heizkreis 1</div><div id="pos39" class="changex2" adresse="10740910187">Auto</div><div id="pos40">Mischer-Heizkreis 2</div><div id="pos41" class="changex2" adresse="10940910187">Auto</div><div id="pos42">Heizkreispumpe 1</div><div id="pos43" class="changex2" adresse="10B40DA0187">Auto/EIN</div><div id="pos44">Heizkreispumpe 2</div><div id="pos45" class="changex2" adresse="10C40DA0187">Auto/AUS</div><div id="pos46">Thermostat 2</div><div id="pos47">Thermostat 3</div><div id="pos48" class="changex2" adresse="10F40DA0187">Auto/AUS</div><div id="pos49" class="changex2" adresse="10E40DA0187">Auto/AUS</div><div id="pos50">Eingänge:</div><div id="pos51">Ausgänge: </div><div id="pos52" class="durchsichtig" onclick="location.href=\'schema.html\#1\'"></div>';
}

stdout = stdout.ToLatin();
stdout = stdout.Replace(" °C", "");
stdout = stdout.Replace("Auto/AUS" , "0");
stdout = stdout.Replace("Auto/EIN" , "1");
stdout = stdout.Replace("Auto" , "0");
stdout = stdout.Replace("OFF" , "0");
stdout = stdout.Replace("ON" , "1");
stdout = stdout.Replace("AUS" , "0");
stdout = stdout.Replace("EIN" , "1");


! Variablen und Werte für die ersten 29 ids   und   34-45
integer loop = 0;

while (loop < 2)
{

    foreach(index, system.GenerateEnum(von, bis))
    {
        var such1 = suche # index;
        wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
        wert = wert.Substr(wert.Find(">") + 1);
        ix = index.ToInteger() % 2;
        if (ix == 0)
        {
            sysvar = wert.Replace(" ", "");
            Write("SysVarName: " # sysvar);
        }
        else
        {
            sv_value = wert.ToFloat();
            WriteLine("    mit   Wert: " # sv_value);
        }
    }
    loop = loop + 1;
    von = 34;
    bis = 45;
}


!ausserhalb der anderen Logik
! das id pos - Paar getrennt durch "[" , Paare durch ";" getrennt
string sucharr = "30[32;31[33;46[48;47[49";

foreach(index, sucharr.Split(";"))
{
    var such1 = suche # index.StrValueByIndex("[", 0);

    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sysvar = wert.Replace(" ", "");
    Write("SysVarName: " # sysvar);

    var such1 = suche # index.StrValueByIndex("[", 1);
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sv_value = wert.ToFloat();
    WriteLine("    mit   Wert: " # sv_value);

}


und hier das zum Ausgeben der Werte in die angelegten Systemvariablen.

Code: Alles auswählen

! CMI-Heizungsdaten  ausgeben in Systemvariablen
!**************************************************************
! Variablen mit Temperaturangaben anlegen als Variablentyp Zahl
! Variablen nicht mit Temperaturangaben anlegen als Variablentyp Logikwert  ( wahr = an  / falsch = aus
!**************************************************************

string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von = 0;  !erste div id pos nr
integer bis = 29; !letzte div id pos nr
integer ix;
string  stdout;
string  stderr;
string  suche = '<div id="pos';
string  such2 = '</div>';
string  index;
string  wert;
string  sysvar;
real    sv_value;

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

stdout = stdout.ToLatin();
stdout = stdout.Replace(" °C", "");
stdout = stdout.Replace("Auto/AUS" , "0");
stdout = stdout.Replace("Auto/EIN" , "1");
stdout = stdout.Replace("Auto" , "0");
stdout = stdout.Replace("OFF" , "0");
stdout = stdout.Replace("ON" , "1");
stdout = stdout.Replace("AUS" , "0");
stdout = stdout.Replace("EIN" , "1");


! Variablen und Werte für die ersten 29 ids   und   34-45
integer loop = 0;

while (loop < 2)
{
    foreach(index, system.GenerateEnum(von, bis))
    {
        var such1 = suche # index;
        wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
        wert = wert.Substr(wert.Find(">") + 1);
        ix = index.ToInteger() % 2;
        if (ix == 0)
        {
            sysvar = wert.Replace(" ", "");
        }
        else
        {
            sv_value = wert.ToFloat();
            object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
            if (svdp)
            {
                svdp.State(sv_value);
            }
        }
    }
    loop = loop + 1;
    von = 34;
    bis = 45;
}


!ausserhalb der anderen Logik
! das id pos - Paar getrennt durch "[" , Paare durch ";" getrennt
string sucharr = "30[32;31[33;46[48;47[49";

foreach(index, sucharr.Split(";"))
{
    var such1 = suche # index.StrValueByIndex("[", 0);
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sysvar = wert.Replace(" ", "");

    var such1 = suche # index.StrValueByIndex("[", 1);
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sv_value = wert.ToFloat();
    object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
    if (svdp)
    {
        svdp.State(sv_value);
    }

}

Gib mir gelegentlich Bescheid, ob alles so hinhaut
oder ob noch etwas geändert werden soll bzw. du noch Fragen dazu hast .
Gruß
Harry

massel
Beiträge: 15
Registriert: 14.11.2021, 11:51
System: CCU
Hat sich bedankt: 1 Mal

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von massel » 21.11.2021, 22:54

Hallo Tyfys,
ich bin schwer beeindruckt von der Mühe, die du dir machst. Danke!
Leider funktioniert auch das letzte Skript noch nicht so, dass es dir Werte in die Variablen schreibt. Egal welche ich angebe, anscheinend erreicht das Werte Ausgeben Skript (das 2.) die Variablen nicht.
Das Skript zum Anlisten funkioniert... Muss ich noch irgendwas einstellen oder installieren auf der CCU?

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 21.11.2021, 23:36

Hallo massel.

Danke für die Blumen.
Aber wenn man einmal dabei ist....
Man hat ja irgendwo auch so ein paar Routinen.

Ich kann ja nur mit den Test Daten spielen, die du mir bereit gestellt hast.

Und da hab ich mal die Variable T.HeizkreisVL1 angelegt.
massel.png
massel.png (5.63 KiB) 1208 mal betrachtet
Bei mir klappt's also.

Ich hab bei mir im 2.Skript natürlich diese Statemens nach system.Exec("wget... eingefügt, sonst kann ich ja nichts testen.

Code: Alles auswählen

system.Exec("wget --no-check-certificate -q -O - '" # url # "'" , &stdout, &stderr);
if (stdout.Length() == 0 )
{
   stdout = '<div id="pos0">T.Speicher oben</div><div id="pos1">77.0 °C</div><div id="pos2">T.Speicher mitte</div><div id="pos3">75.4 °C</div><div id="pos4">T.Speicher unten</div><div id="pos5">75.4 °C</div><div id="pos6">T.Kollektor</div><div id="pos7">6.4 °C</div><div id="pos8">T.Walltherm Wasser</div><div id="pos9">81.5 °C</div><div id="pos10">T.Rauchgas</div><div id="pos11">135.0 °C</div><div id="pos12">T.Heizkreis VL 1</div><div id="pos13">38.6 °C</div><div id="pos14">T.Heizkreis VL 2</div><div id="pos15">9999.9 °C</div><div id="pos16">T.Außen</div><div id="pos17">7.3 °C</div><div id="pos18">Zusatzfühler 1</div><div id="pos19">76.6 °C</div><div id="pos20">Zusatzfühler 2</div><div id="pos21">9999.9 °C</div><div id="pos22">Eingang potentialfrei HK 1</div><div id="pos23">AUS</div><div id="pos24">Eingang potentialfrei HK 2</div><div id="pos25">AUS</div><div id="pos26">Walltherm Pumpe</div><div id="pos27" class="changex2" adresse="10040DA0187">Auto/EIN</div><div id="pos28">Zuluftklappe</div><div id="pos29" class="changex2" adresse="10140DA0187">Auto/EIN</div><div id="pos30">Solarpumpe</div><div id="pos31">Thermostat 1</div><div id="pos32" class="changex2" adresse="10440DA0187">Auto/AUS</div><div id="pos33" class="changex2" adresse="10240DA0187">Auto/AUS</div><div id="pos34">Rauchgassauger</div><div id="pos35" class="changex2" adresse="10540DA0187">Auto/AUS</div><div id="pos36">Zirkulationspumpe</div><div id="pos37" class="changex2" adresse="10640DA0187">Auto/AUS</div><div id="pos38">Mischer-Heizkreis 1</div><div id="pos39" class="changex2" adresse="10740910187">Auto</div><div id="pos40">Mischer-Heizkreis 2</div><div id="pos41" class="changex2" adresse="10940910187">Auto</div><div id="pos42">Heizkreispumpe 1</div><div id="pos43" class="changex2" adresse="10B40DA0187">Auto/EIN</div><div id="pos44">Heizkreispumpe 2</div><div id="pos45" class="changex2" adresse="10C40DA0187">Auto/AUS</div><div id="pos46">Thermostat 2</div><div id="pos47">Thermostat 3</div><div id="pos48" class="changex2" adresse="10F40DA0187">Auto/AUS</div><div id="pos49" class="changex2" adresse="10E40DA0187">Auto/AUS</div><div id="pos50">Eingänge:</div><div id="pos51">Ausgänge: </div><div id="pos52" class="durchsichtig" onclick="location.href=\'schema.html\#1\'"></div>';
}
Deshalb solltest du dieses noch einmal im Fenster Skript testen ausführen:

Code: Alles auswählen

string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer ix;
string  stdout;
string  stderr;

system.Exec("wget --no-check-certificate -q -O - '" # url # "'" , &stdout, &stderr);
WriteLine(stdout);
Um zu prüfen ob der Abruf erfolgreich ist und etwas ausgegeben wird.


Allerdings macht mich das etwas stutzig:
massel hat geschrieben:
21.11.2021, 22:54
dass es dir Werte in die Variablen schreibt. Egal welche ich angebe,
Was meinst du mit Egal welche ich angebe ?


Eigentlich müsstest Du im Skript nichts ändern - nur die Systemvariablen anlegen, die du haben willst.
Gruß
Harry

massel
Beiträge: 15
Registriert: 14.11.2021, 11:51
System: CCU
Hat sich bedankt: 1 Mal

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von massel » 23.11.2021, 21:49

Tyfys hat geschrieben:
21.11.2021, 23:36
dass es dir Werte in die Variablen schreibt. Egal welche ich angebe,
Was meinst du mit Egal welche ich angebe ?
Sorry, ich meinte "Egal, welche in anlege". Ich muss ja diese Variablen mit den korrekt lautenden Namen im System angelegt haben, damit dein Skript den aktuellen Wert dort speichern kann.
Ich habe mal ein paar Screenshots gemacht. Vielleicht ist ja irgendwo noch irgendwas falsch eingegeben...
Oder brauche ich noch ein Plugin dafür?

Das angehängte Script habe ich getestet. Es greift auf den Quelltext der CMI Datenseite zu.

VG

ps.
https://www.mediafire.com/file/u7c7musr ... 2.cgi/file
hier ist das cgi file hochgeladen.
Dateianhänge
F1EB8E6E-D316-4F96-8DF9-0AAB2C775D4F.png
CF780500-0FE2-4D3D-BE16-B45FAD9605AC.png
8497D593-BDD6-41EA-8CC1-FD33B57F678B.jpeg
A938BFFE-2450-4ED9-BF69-05C1D9809816.jpeg

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

Re: TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von Tyfys » 23.11.2021, 22:51

Hallo massel.

Vorweg: Du solltest dir mal die Servicemeldung anschauen - evt. ist da Handlungsbedarf.


Nun zu den CMI Daten.
Mindestens die Variable T.HeizkreisVL1 ist ja auch richtig angelegt und müsste gefüllt werden.
( BTW: Du könntest bei den Grad Angaben noch die Masseinheit °C mit angeben).

Lass nun dieses Skript einmal im Fenster Skript testen ausführen und poste mir das Ergebnis in CodeTags.
Ich hab da noch Ausgaben eingebaut.

Code: Alles auswählen

! CMI-Heizungsdaten  ausgeben in Systemvariablen
!**************************************************************
! Variablen mit Temperaturangaben anlegen als Variablentyp Zahl
! Variablen nicht mit Temperaturangaben anlegen als Variablentyp Logikwert  ( wahr = an  / falsch = aus
!**************************************************************

string  url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von = 0;  !erste div id pos nr
integer bis = 29; !letzte div id pos nr
integer ix;
string  stdout;
string  stderr;
string  suche = '<div id="pos';
string  such2 = '</div>';
string  index;
string  wert;
string  sysvar;
real    sv_value;

system.Exec("wget --no-check-certificate -q -O - '" # url # "'",  & stdout,  & stderr);
if (stdout.Length() == 0)
{
    WriteLine("keine Daten empfangen");
    if (stderr.Length() > 0)
    {
        WriteLine("Fehlermeldung vom Server: " # stderr);
    }
    quit;
}
else
{
    WriteLine(stdout);
}

stdout = stdout.ToLatin();
stdout = stdout.Replace(" °C", "");
stdout = stdout.Replace("Auto/AUS" , "0");
stdout = stdout.Replace("Auto/EIN" , "1");
stdout = stdout.Replace("Auto" , "0");
stdout = stdout.Replace("OFF" , "0");
stdout = stdout.Replace("ON" , "1");
stdout = stdout.Replace("AUS" , "0");
stdout = stdout.Replace("EIN" , "1");


! Variablen und Werte für die ersten 29 ids   und   34-45
integer loop = 0;

while (loop < 2)
{
    foreach(index, system.GenerateEnum(von, bis))
    {
        var such1 = suche # index;
        WriteLine("Element: " # such1);
        wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
        wert = wert.Substr(wert.Find(">") + 1);
        ix = index.ToInteger() % 2;
        if (ix == 0)
        {
            sysvar = wert.Replace(" ", "");
            WriteLine("VariablenName: " # sysvar);
        }
        else
        {
            sv_value = wert.ToFloat();
            WriteLine("VariablenWert: " # sv_value);
            object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
            if (svdp)
            {
                svdp.State(sv_value);
                WriteLine("Variable: " # sysvar # " gespeichert mit Wert " # sv_value);
            }
            else
            {
                WriteLine("Variable: " # sysvar # " nicht angelegt für Wert " # sv_value);
            }
        }
    }
    loop = loop + 1;
    von = 34;
    bis = 45;
}


!ausserhalb der anderen Logik
! das id pos - Paar getrennt durch "[" , Paare durch ";" getrennt
string sucharr = "30[32;31[33;46[48;47[49";

foreach(index, sucharr.Split(";"))
{
    var such1 = suche # index.StrValueByIndex("[", 0);
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sysvar = wert.Replace(" ", "");

    var such1 = suche # index.StrValueByIndex("[", 1);
    wert = stdout.Substr(stdout.Find(such1) + such1.Length()).Substr(0, (stdout.Substr(stdout.Find(such1) + such1.Length()).Find(such2)));
    wert = wert.Substr(wert.Find(">") + 1);
    sv_value = wert.ToFloat();
    object svdp = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar);
    if (svdp)
    {
        svdp.State(sv_value);
        WriteLine("Variable: " # sysvar # " gespeichert mit Wert " # sv_value);
    }
    else
    {
        WriteLine("Variable: " # sysvar # " nicht angelegt für Wert " # sv_value);
    }
}
Ist jedenfalls gediegen, dass bei dir nix klappt.
Zuletzt geändert von Tyfys am 25.11.2021, 20:50, insgesamt 1-mal geändert.
Gruß
Harry

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“