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

TCL(?)-Script erstellung, Heizungsdaten auslesen

Beitrag von massel » 14.11.2021, 12:16

Moin zusammen,
es geht darum, dass ich ein Script benötige, das Heizungsdaten auslesen kann.<br/>
Ich habe mich gestern ausführlich in die Thematik eingelesen. Ich glaube verstanden zu haben , dass ein TCLScript so etwas leisten könnte.
Ich muss aber der Realität ins Auge blicken: Ich kann so etwas nicht programmieren und benötige daher eure Hilfe.

Konkret ist es so:
Ziel: Die Heizungsdaten sollen ausgelesen werden und als Systemvariable in der CCU3 gespeichert werden, damit die Heizkörper in Abhängigkeit dieser Variablen gesteuert werden können.
Es läuft für die Heizung ein CMI mit UVR16x2. Dieses gibt eine CGI Seite aus, auf die hier lokal mit Anmeldung zugegriffen werden kann:

Sieht so aus:

Code: Alles auswählen

T.Speicher oben
68.5 °C
T.Speicher mitte
64.2 °C
T.Speicher unten
52.9 °C
T.Kollektor
12.8 °C
T.Walltherm Wasser
67.7 °C
T.Rauchgas
140.1 °C
T.Heizkreis VL 1
(...)
Quelltext:

Code: Alles auswählen

<div id="pos0" >
T.Speicher oben</div>
<div id="pos1" >
68.5 °C</div>
<div id="pos2" >
T.Speicher mitte</div>
<div id="pos3" >
64.2 °C</div>
<div id="pos4" >
T.Speicher unten</div>
<div id="pos5" >
52.9 °C</div>
<div id="pos6" >
T.Kollektor</div>
<div id="pos7" >
12.8 °C</div>
<div id="pos8" >
T.Walltherm Wasser</div>
<div id="pos9" >
67.7 °C</div>
<div id="pos10" >
T.Rauchgas</div>
<div id="pos11" >
140.1 °C</div>
<div id="pos12" >
T.Heizkreis VL 1</div>
(...)
Wer könnte mir wie helfen? Gibt's hier freiwillige Programmierer oder verdient ihr euch ein bisschen was dazu durch so Leutchen wie mich?
Freue mich über eure Antworten. Viele Grüße
Zuletzt geändert von alchy am 15.11.2021, 21:14, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

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

Beitrag von MartinMatic » 14.11.2021, 13:39

Moinmoin,

um mal einen Anfang zu machen ;-) joa, dass müsste sich mit einem bunten Strauß aus Stringoperationen zusammenschnippeln lassen :D
Das Ganze kommt vermutlich von einer fixen IP-Adresse, die irgendwo lokal in Deinem Heimnetz ist?
Was man im Hinterkopf behalten sollte: Das Ganze muss ja von der CCU zyklisch immer wieder abgearbeitet werden. D.h. die Aktualisierungsintervalle sollten besser nicht zu kurz gewählt werden, damit die CCU auch noch mal zu was anderem kommt.

Grüße

Martin

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 » 14.11.2021, 15:23

Hi MartinMatic,
Manche ähnliche Programme fragen die Daten alle 60 Sekunden ab. Mir würde es alle 10 Minuten reichen. Es geht darum, dass nach dem Abbrand des wasserführenden Ofens manche Heizkörper schließen sollen, damit die im Puffer gesammelte Wärme später noch für Küche und Bäder zur Verfügung steht. So können wir das Anspringen der Gastherme verzögern.
Könntest du mir dabei helfen?

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

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

Beitrag von MartinMatic » 14.11.2021, 15:31

Ok, verstehe. Bei einer CCU3 sollte das ressourcenmäßig auch eher weniger problematisch sein.

Um mal irgendwo zu starten:
Diese CGI-Seite bzw. der Quelltext kommt vermutlich von einer fixen IP-Adresse, die irgendwo lokal in Deinem Heimnetz ist?
Wie schaut es mit Deinen Grundkenntnisssen aus? Programme und Systemvariablen anlegen müsstest Du schon mal gemacht haben.

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 » 14.11.2021, 18:25

MartinMatic hat geschrieben:
14.11.2021, 15:31
Diese CGI-Seite bzw. der Quelltext kommt vermutlich von einer fixen IP-Adresse, die irgendwo lokal in Deinem Heimnetz ist?
Ja, genau. Mit Benutzername und Passwort zu erreichen unter "http://cmi/schematic_files/2.cgi"
MartinMatic hat geschrieben:
14.11.2021, 15:31
Deinen Grundkenntnissse?
Ja, Systemvariablen und einfache Programme erstellen kann ich, lerne immer wieder neues dazu.
Ich arbeite gerne mit Excel und lege dort recht komplexe Berechnungen z.B. für unsere Energiekosten an.
Das Prinzip ist ja ähnlich. Bei Excel entnehme ich den Wert einer Tabelle und füge ihn an anderer Stelle ein.
Hier muss ich nun zusätzlich zwei Systemgrenzen überwinden. Da habe ich zu wenig Kenntnis um es anzulegen, könnte mir aber vorstellen bestehende Bausteine zusammenzufügen.

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 » 14.11.2021, 20:59

Hallo

Meine Ideen zu deinem Problem.

In den div id="pos?" mit den geraden Zahlen steht der Wertname.
in den nachfolgenden div id="pos?" mit den ungeraden Zahlen der eigentliche Wert.
(0=Null zählt in diesem Falle zu den geraden Zahlen)

Ich habe deinen Quelltext mal im Fenster Skript testen verarbeitet.

Code: Alles auswählen


integer von=0;
integer bis =11;
integer ix;
string stdout;
string suche = '<div id="pos';
string such2 = '</div>';
string index;
string wert;
string sysvar;
real    sv_value;

stdout ='<div id="pos0" >T.Speicher oben</div><div id="pos1" >68.5 °C</div><div id="pos2" >T.Speicher mitte</div><div id="pos3" >64.2 °C</div><div id="pos4" >T.Speicher unten</div><div id="pos5" >52.9 °C</div><div id="pos6" >T.Kollektor</div><div id="pos7" >12.8 °C</div><div id="pos8" >T.Walltherm Wasser</div><div id="pos9" >67.7 °C</div><div id="pos10" >T.Rauchgas</div><div id="pos11" >140.1 °C</div>';
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)));
ix = index.ToInteger() % 2;
if ( ix == 0 ) {
sysvar = wert.Replace(" ","");
Write("SysVarName: "# sysvar);}
else {
sv_value = wert.ToFloat();
WriteLine("    mit   Wert: " #sv_value);
}
}
Da wird dann ausgeworfen welche Systemvariablen angelegt werden müssten
und welcher Wert dazu gehört.
Ich hab die Namen etwas angepasst werden, weil Leerzeichen im Namen finde ich unüblich.
Wenn dir das nicht gefällt, einfach dieses Statement löschen : sysvar = wert.Replace(" ","");


Wenn du dann die entsprechenden Systemvariablen angelegt hast ( nur die du haben willst)
kannst du dieses Skript in ein Programm einbinden, was im gewünschten Interval abgerufen werden kann:

Code: Alles auswählen

string url = "deine Abruf-url";
integer von=0;
integer bis =11;
integer ix;
string stdout;
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)));
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); }
}
}
Wenn keine anderen Vorschläge kommen, die dir besser gefallen, hast du schon mal eine Anregung, wie es klappen könnte.
Gruß
Harry

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

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

Beitrag von MartinMatic » 15.11.2021, 00:20

Ja, so ungefähr wär ich das auch angegangen. Was mir im letzten Post von massel noch aufgefallen ist, war:
Mit Benutzername und Passwort zu erreichen unter (...)
D.h. wohl offenbar, bevor die Abfrage des Quellcodes über die URL möglich ist, muss ein Login durchgeführt werden!?

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, 20:29

MartinMatic hat geschrieben:
15.11.2021, 00:20
Ja, so ungefähr wär ich das auch angegangen. Was mir im letzten Post von massel noch aufgefallen ist, war:
Mit Benutzername und Passwort zu erreichen unter (...)
D.h. wohl offenbar, bevor die Abfrage des Quellcodes über die URL möglich ist, muss ein Login durchgeführt werden!?
Ja das ist richtig, zur Zeit lautet der Zugang "admin" und das PW ebenfalls "admin"

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, 21:08

Tyfys hat geschrieben:
14.11.2021, 20:59
Hallo

Meine Ideen zu deinem Problem.

(...)

Wenn keine anderen Vorschläge kommen, die dir besser gefallen, hast du schon mal eine Anregung, wie es klappen könnte.
Moin Tyfys,
danke für die Codes! Ich habe das jetzt so verstanden:
den ersten füge ich einfach ein, um die "Namen" zu erhalten, die ich als Systemvariable in Homematic anlegen soll.
Da fehlen mir aber noch ein paar Daten? Außentemperatur ist z.B. nicht angezeigt und der Zustand der Heizungspumpen wäre auch interessant ("Auto/Aus" und "Auto/Ein")

Der zweite Code ist dann der, den ich ins Programm eingeben soll, damit die Werte in den Variablen erscheinen?
Das habe ich auch gescahfft, aber die angelegte Variable "T.Speicheroben" bleibt bei 0.0*C
Ich habe beim Script eine "Fehlerprüfung" entdeckt. Diese gibt folgendes aus:

Code: Alles auswählen

Error 1 at row 24 col 10 near ^ {
sv_value = wert.ToFloat();
object svdp=dom.GetObject(ID_SYSTEM_VARIABLES).Get
Error 1 at row 24 col 10 near ^ {
sv_value = wert.ToFloat();
object svdp=dom.GetObject(ID_SYSTEM_VARIABLES).Get
Error 1 at row 24 col 10 near ^ {
sv_value = wert.ToFloat();
object svdp=dom.GetObject(ID_SYSTEM_VARIABLES).Get
Parse following code failed:
string url = "http://admin:admin@192.168.178.95/schematic_files/2.cgi";
integer von=0;
integer bis =11;
integer ix;
string stdout;
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)));
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); }
}
}


Was habe ich falsch gemacht?

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 » 15.11.2021, 22:22

Hallo massel.

Dein Quelltext endete ja mit "(...)".
Ich nehme an, dass da dann die fehlenden Werte folgen.
massel hat geschrieben:
15.11.2021, 21:08
Zustand der Heizungspumpen wäre auch interessant ("Auto/Aus" und "Auto/Ein")
Das wird wohl auch noch folgen.

Lass doch dieses script noch mal im Fenster Skript testen laufen

Code: Alles auswählen

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

system.Exec("wget --no-check-certificate -q -O - '"#url#"'" , &stdout, &stderr)
stdout = stdout.ToLatin();
stdout=stdout.Replace(" °C", "");
WriteLine(stdout);
und stelle die Ausgabe dann hier in Code-Tags rein.

Mir scheint, da kommt ein Wert den ich nicht erwartet hatte ( z.B. "Auto/Aus" und "Auto/Ein" usw),
ging bisher nur von Gradzahlen aus
Gruß
Harry

Antworten

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