Übergabe von Variablen an ein Unterprogramm

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Benutzeravatar
tgw
Beiträge: 565
Registriert: 10.10.2013, 22:35
System: CCU
Wohnort: Recklinghausen
Hat sich bedankt: 36 Mal
Danksagung erhalten: 4 Mal

Übergabe von Variablen an ein Unterprogramm

Beitrag von tgw » 21.09.2021, 11:19

Hallo,
ich habe mich jetzt schlau gemacht, wie man in der CCU ein Programm als Unterprogramm starten kann. Findet man recht einfach und läuft mittels eines Scripts.
Damit habe ich umgesetzt, dass ich ein zentrales Programm baue, um eine Klimaanlage mittels URL-Befehl und CUxD mit einer Temperaturvorgabe und weiteren Parametern wie "Heizen/Kühlen" und "Wedeln" einzuschalten. Das erfolgt mittels Script.
Da ich aber nicht in allen Programmen, wo ich die Anlage einschalten möchte, immer wieder das selbe Script einbauen muss und bei einer eventuellen Änderung alle Programme anfassen muss, habe ich mit das als zentrales Programm abgelegt und rufe dieses Programm mittels Script aus einem anderen Programm auf.

DAs Script habe ich hier gefunden: https://technikkram.net/blog/2019/07/31 ... -aufrufen/

Die Scriptsteuerung für das Klimagerät sieht zum Beispiel so aus (Hier z.B. 22 Grad Vorgabe und "mode=" und "dir=".)

Code: Alles auswählen

string url="http://192.168.xxx.xxx/aircon/set_control_info?pow=1&mode=4&stemp=22&shum=0&f_rate=A&f_dir=3";
if ( (dom.GetObject(ID_DATAPOINTS)).Get("CUxD.CUX2801002:1.CMD_EXEC")) { 
dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801002:1.CMD_EXEC").State("wget -q -O - '"#url#"'");}
So weit, so gut, läuft alles.

Derzeit muss ich es aber so machen, dass ich für jede Temperaturvorgabe für die Klimaanlage ein eigenes Programm basteln muss. Eleganter wäre es natürlich, wenn ich die Temperatur oder auch andere Parameter vom ersten Programm an das zweite übergeben könnte. Dann würde ich nur ein Programm zur Ansteuerung der Klimaanlage benötigen und könnte die Parameter in dem ersten Programm definieren.

Das umzusetzen bin ich aber zu dumm. :-) Es müsste doch mit Variablen und Platzhaltern funktionieren, oder? Man müsste die Variablen aber auch für nachfolgende andere Befehle wieder überschreiben, oder?

Kann mir da jemand etwas Hilfe geben? :-)
Falls Infos fehlen, bitte fragen.
Viele Grüße aus Recklinghausen im Ruhrpott

Der TGW

CCU3 / Solaredge PV integriert / Daikin Klima WLAN integriert - gerne für Rückfragen offen.

Benutzeravatar
Baxxy
Beiträge: 10646
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 596 Mal
Danksagung erhalten: 2180 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von Baxxy » 21.09.2021, 11:25

tgw hat geschrieben:
21.09.2021, 11:19
Eleganter wäre es natürlich, wenn ich die Temperatur oder auch andere Parameter vom ersten Programm an das zweite übergeben könnte.
Lass doch vom ersten Programm die Parameter in SysVars speichern und lese sie mit dem zweiten Programm dann aus und sende sie an die Klimaanlage.

Grüße, Baxxy

Benutzeravatar
tgw
Beiträge: 565
Registriert: 10.10.2013, 22:35
System: CCU
Wohnort: Recklinghausen
Hat sich bedankt: 36 Mal
Danksagung erhalten: 4 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von tgw » 21.09.2021, 11:36

Baxxy hat geschrieben:
21.09.2021, 11:25
Lass doch vom ersten Programm die Parameter in SysVars speichern und lese sie mit dem zweiten Programm dann aus und sende sie an die Klimaanlage.

Grüße, Baxxy
Könntest Du mir dafür eine Musterzeile basteln bitte? :-) So weit bin ich noch nicht. Variablen ja, aber wo man sie im Script wie setzen muss.
Viele Grüße aus Recklinghausen im Ruhrpott

Der TGW

CCU3 / Solaredge PV integriert / Daikin Klima WLAN integriert - gerne für Rückfragen offen.

Benutzeravatar
Baxxy
Beiträge: 10646
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 596 Mal
Danksagung erhalten: 2180 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von Baxxy » 21.09.2021, 11:47

tgw hat geschrieben:
21.09.2021, 11:36
Musterzeile basteln
Am Nachmittag vielleicht. Du musst aber auch ein paar Fakten auf den Tisch legen. Speziell das Programm das die Parameter generiert (Sollwert usw.). Idealerweise so viele Informationen wie möglich. Vielleicht kann man die ganze Steuerung auch in nur ein Programm / Script packen.

Grüße, Baxxy

Benutzeravatar
tgw
Beiträge: 565
Registriert: 10.10.2013, 22:35
System: CCU
Wohnort: Recklinghausen
Hat sich bedankt: 36 Mal
Danksagung erhalten: 4 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von tgw » 21.09.2021, 12:00

Baxxy hat geschrieben:
21.09.2021, 11:47
tgw hat geschrieben:
21.09.2021, 11:36
Musterzeile basteln
Am Nachmittag vielleicht. Du musst aber auch ein paar Fakten auf den Tisch legen. Speziell das Programm das die Parameter generiert (Sollwert usw.). Idealerweise so viele Informationen wie möglich. Vielleicht kann man die ganze Steuerung auch in nur ein Programm / Script packen.

Grüße, Baxxy
Wir sind nicht auf der Flucht, es muss nicht Nachmittag sein. :-) Ich bin ja froh, wenn ich überhaupt irgendeinen Ansatz bekomme, den Rest bau ich mir schon.

Ich verstehe das mit den Fakten jetzt nicht wirklich. Die Schnittstelle ist nicht offengelegt vom Hersteller und ich bekomme die Zahlenwurst. Derzeit sind die Werte "temp", "mode", "dir" interessant. Alle anderen müssen einfach nur dabei stehen. OK, es gibt noch "pow", halt für an und aus.

Generiert wird nichts von irgendwem, ich bestimmt, welche Werte ich vorgebe, je nach Programm. Halt z.B. ich möchte bei überschüssiger Energie vom Solardach und bei vollem Akku einfach der Klimaanlage sage, sie soll den Raum für den Abend vorbereiten. 22 Grad, heizen, 3D-Wedeln. Das schreibe ich dann in das auslösende Script und übergebe es an das neutrale Programm mit den Variablen. Alle anderen Werte sind statisch, da teilweise nicht dokumentiert vom Hersteller, die habe ich selbst herausgefunden.

Hilft das?
Viele Grüße aus Recklinghausen im Ruhrpott

Der TGW

CCU3 / Solaredge PV integriert / Daikin Klima WLAN integriert - gerne für Rückfragen offen.

MichaelN
Beiträge: 9561
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von MichaelN » 21.09.2021, 12:29

Das aufrufen von Programmen aus anderen Programmen kann durchaus Nebenwirkungen haben.
Die WebUI-konforme Lösung wäre es ein Programm anzulegen, das auf die Änderung einer Systemvariablen reagiert und diese SV zu setzen um das Programm auszulösen.

Wie man SVs im Skript setzt, habe ich unter "undokumentierte Skript-Befehle" gezeigt. Siehe Signatur.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
tgw
Beiträge: 565
Registriert: 10.10.2013, 22:35
System: CCU
Wohnort: Recklinghausen
Hat sich bedankt: 36 Mal
Danksagung erhalten: 4 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von tgw » 21.09.2021, 12:38

MichaelN hat geschrieben:
21.09.2021, 12:29
Das aufrufen von Programmen aus anderen Programmen kann durchaus Nebenwirkungen haben.
Die WebUI-konforme Lösung wäre es ein Programm anzulegen, das auf die Änderung einer Systemvariablen reagiert und diese SV zu setzen um das Programm auszulösen.

Wie man SVs im Skript setzt, habe ich unter "undokumentierte Skript-Befehle" gezeigt. Siehe Signatur.
Mir ist jeder Weg recht, wie ich zuverlässig und störungsfrei zum Ziel komme. :-)
Die Idee dahinter habe ich verstanden. Schaue ich mir auch gerne mal an.

Hauptsache, ich konnte rüberbringen, was ich meine und ich weiß, wie ich in das auslösende Script meine Variablen mit welcher Syntax reinbekomme.
Viele Grüße aus Recklinghausen im Ruhrpott

Der TGW

CCU3 / Solaredge PV integriert / Daikin Klima WLAN integriert - gerne für Rückfragen offen.

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von Xel66 » 21.09.2021, 13:20

Ich persönlich halte solches direktes Starten von Programmen (und den Missbrauch lediglich als Container für durchzuführende Aktionen) als schlechten Programmierstil, weil dieser einem ganz schnell wieder auf die Füße fallen kann. Solche Programme muss man sowieso dann gegen automatisches Ausführen bei einem Reboot sichern (irgendeine Bedingung einfügen). Ohne Bedingung im WENN würden die Aktionen grundsätzlich bei Systemstart abgearbeitet. Hat man mehrere Programme angelegt, die die gleichen Aktoren ansprechen (siehe mein Beispiel weiter unten), dann gibt es ein heilloses Durcheinander mit entsprechenden Auswirkungen auf den Duty Cycle.

Dann kann man auch gleich einen vom Hersteller für diesen Fall vorgesehenen virtuellen Taster der CCU benutzen (oder eine Systemvariable setzen) und kann diesen in seinen Scripten oder Programmen zur Ausführung der Aktionen betätigen. Gegebenenfalls definierte zusätzliche Bedingungen werden dann auch berücksichtigt. Die Sicherung gegen unerwünschten Programmlauf bei Systemstart ist damit auch gleich erledigt, denn der Taster wird ja nicht betätigt, außer man hat in seinen anderen beteiligten Programmen die das im Normalfall tun, einen Fehler gemacht und beim Systemstart gültige Trigger angelegt. Das wäre aber dann auch bei einer direkten Ausführung so. Aber soll jeder machen, wie er will, denn man muss dann selbst mit den Auswirkungen solcher Würgarounds leben.

Um meinen Vorschlag zu verdeutlichen: Ich habe mehrer Programme angelegt, die meine Thermostate in bestimmte Betriebszustände schalten (ECO-Temperatur, Manuell OFF, Automatikbetrieb, Komfottemperatur usw.). Diese haben als Trigger einen sinnig bezeichneten virtuellen Taster. Möchte ich nun in irgendeinem Programm beispielsweise eben alle Thermostate in den Automatikbetrieb schalten, dann brauche ich in dem Programm nur diesen Taster betätigen lassen und die CCU kümmert sich um die Ausführung (solche Vorgehensweisen gibt es auch mit Direktverknüpfungen).

Den Automatikbetrieb schalte ich z.B. bei verschiedensten Anlässen (im jeweiligen Programm zu Beginn der Heizsaison, wenn ich tagsüber wegen Abwesenheit auf ECO abgesenkte hatte, wenn ich aus dem Urlaub komme, wenn die Außentemperatur während der Heizperiode (Übergangszeit) wieder unter 15°C fällt usw.) Alles separate Programme. Und alle haben in ihrem DANN nur den virtuellen Taster drin. Man braucht diese Aktion also nicht in jedem Programm hinterlegen, denn um die Ansteuerung der Thermostate kümmert sich das andere Automatik-Programm (vergleichsweise zum Starten per Script in dem anderen von mir bemängelten Konstrukt). Und das Schöne dran: möchte man von Hand (per App oder WebUI) mal alle Thermostate ansprechen (z.B. weil der LAG zu kühl ist), braucht man auch nur diesen virtuellen Taster betätigen. Das könnte man aber auch durch manuelles Ausführen des Programms.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
tgw
Beiträge: 565
Registriert: 10.10.2013, 22:35
System: CCU
Wohnort: Recklinghausen
Hat sich bedankt: 36 Mal
Danksagung erhalten: 4 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von tgw » 21.09.2021, 13:37

Ich möchte doch nur drei Variablen übergeben können. :-(

Wer Programme ohne Neustartabsicherung baut, hat wohl einen Grund dafür.
Viele Grüße aus Recklinghausen im Ruhrpott

Der TGW

CCU3 / Solaredge PV integriert / Daikin Klima WLAN integriert - gerne für Rückfragen offen.

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Übergabe von Variablen an ein Unterprogramm

Beitrag von Xel66 » 21.09.2021, 14:27

tgw hat geschrieben:
21.09.2021, 13:37
Ich möchte doch nur drei Variablen übergeben können. :-(
Kannst Du doch. Dann kannst Du aber auch das Setzen der Variablen als Trigger benutzen, um das Programm zu starten, welches dann die Aktionen in Abhängigkeit der Systemvariablen ausführt bzw. deren Inhalt an andere Geräte überträgt. Da braucht man das Programm doch nicht noch mal separat zu starten. Das Triggern von Programmen auf das Setzen von Systemvariablen ist eine dem System direkt innewohnende Funktionalität. Will man mehrere Systemvariablen ändern und darauf triggern, dann ist es zielführend, den Haken "retriggern" in dem jeweiligen Programm drin zu lassen und die Ausführung der Aktionen ggf. eine Sekunde zu verzögern.
tgw hat geschrieben:
21.09.2021, 13:37
Wer Programme ohne Neustartabsicherung baut, hat wohl einen Grund dafür.
Auch dafür gibt es sicherlich einen Anwendungszweck, wenn mir auch ad hoc keiner einfällt. Meist wird hier aber die (in ihrer Aussage falsche) Sau durchs Dorf getrieben, dass alle Programme beim Reboot gestartet werden. Und dem ist definitv nicht so. Sowas hat andere Ursachen und ist sachlich falsch, was sich allein schon durch einen Blick auf gesetzte Zeitstempel nach einem durchgeführten Neustart belegen lässt. Aber das führe ich hier jetzt nicht weiter aus. Dazu habe ich schon öfter geschrieben.

Gruß Xel66
Zuletzt geändert von Xel66 am 21.09.2021, 14:30, insgesamt 1-mal geändert.
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Antworten

Zurück zu „HomeMatic allgemein“