Kann man eine neue Systemvariable von aussen definieren?

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von jmaus » 05.02.2016, 23:42

funkleuchtturm hat geschrieben: [...]
Hat jemand eine Idee, was ich falsch mache ?? ... oder einen anderen Lösungsansatz?
Schau dir mal folgende Zeilen meines Source Codes von hm_pdetect (http://homematic-forum.de/forum/viewtop ... 18&t=23907) bei Github an:

https://github.com/jens-maus/hm_pdetect ... ct.sh#L280

Zu sehen ist da eine bash Funktion die eigentlich genau das machen sollte was du willst. Sie erlaubt von ausserhalb einer CCU einfach über HTTP POST requests an http://<CCU>:8181/tclrega.exe ein HomeMatic script als string zu schicken der dann eben die dort definierte Systemvariable anlegen sollte. Implementiert dort habe ich das für Zeichenketten, Bool-Variablen und Enum-Listen.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
funkleuchtturm
Beiträge: 2368
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von funkleuchtturm » 06.02.2016, 11:28

Hallo Jens,
Danke für Deinen Hinweis, aber als schwacher Softwerker habe ich so meine Probleme mit dem Nachvollziehen Deiner komplexen Bash-Programmierung. Deshalb konnte ich eine Lösung für mich noch nicht davon ableiten. Ich verstehe aber das so, daß auf der CCU ein Bash-Schnipsel läuft, was die Systemvariablen anlegt. Ich will aber mit der Remote HM-Skript-Schnittstelle ein HM-Skript auf die CCU schicken und ausführen lassen.

Vielleicht nochmal zur Verdeutlichung , was ich möchte:

Mit dem folgenden bekannten Befehl kann die Systemvariable meineSys_variable1 beispielsweise auf 1 gesetzt werden :

Code: Alles auswählen

http://<CCU-IP>:8181/blabla.exe?antwort= GetObject("meineSys_variable1").State(1)
Wenn ich nun zwei oder mehr Abfragen bzw. Befehle hintereinander abschicken möchte :

Code: Alles auswählen

http://<CCU-IP>:8181/blabla.exe?antwort= GetObject("meineSys_variable1").State(1);antwort= GetObject("meineSys_variable2").State(0)
dann wird immer nur der erste Befehl ausgeführt.

Ein Abschicken und Ausführen einer Aneinanderrreihung von HM-Skript Befehlen funktioniert dieser Weg also nicht.

Einzelne HM-Skript -Befehle kann man abschicken aber nicht eine Sequenz von Befehlen bzw. ein komplettes HM-Skript.

... das muß doch irgendwie gehen :twisted:
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von jmaus » 06.02.2016, 23:31

funkleuchtturm hat geschrieben:Hallo Jens,
Danke für Deinen Hinweis, aber als schwacher Softwerker habe ich so meine Probleme mit dem Nachvollziehen Deiner komplexen Bash-Programmierung. Deshalb konnte ich eine Lösung für mich noch nicht davon ableiten. Ich verstehe aber das so, daß auf der CCU ein Bash-Schnipsel läuft, was die Systemvariablen anlegt. Ich will aber mit der Remote HM-Skript-Schnittstelle ein HM-Skript auf die CCU schicken und ausführen lassen.

[...]

Einzelne HM-Skript -Befehle kann man abschicken aber nicht eine Sequenz von Befehlen bzw. ein komplettes HM-Skript.
Doch das geht und das macht genau mein shell script auch wenn du es eben nicht auf der CCU ausführen lässt sondern auf einem remote system im selben LAN der CCU. Im Prinzip kannst du folgendes beispielhaft mal auf einem Linux System fern der CCU probieren. Einfach dazu auf dem Linux System in einer shell das folgende nacheinander ausführen:

Code: Alles auswählen

$ postbody="string v='testVar';boolean f=true;string i;foreach(i,dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedIDs()){if(v==dom.GetObject(i).Name()){f=false;}};if(f){object s=dom.GetObject(ID_SYSTEM_VARIABLES);object n=dom.CreateObject(OT_VARDP);n.Name(v);s.Add(n.ID());n.ValueType(ivtString);n.ValueSubType(istChar8859);n.DPInfo('Kommentar');n.State('');dom.RTUpdate(false);}"

$ wget -q -O - --post-data "${postbody}" "http://<CCU>:8181/tclrega.exe
Das sollte dir demonstrieren wie das ganze funktioniert und das es nicht über einen simplen URL Aufruf geht sondern eben über einen HTTP POST request. D.h. du musst deine HM-Skript-Anweisungen in einen string verpacken und diese dann an tclrega.exe als POST request senden und schwups führt die CCU genau das aus. Uns der Beispiel script (hier in variable 'postbody' verpackt) legt hier z.B. eine String-Variable an. In meinem Skript kannst du an folgenden stellen folgendes einsehen:
Hoffe das macht es nun klarer das genau das ist was du suchen solltest.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

BadenPower

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von BadenPower » 07.02.2016, 00:10

Hierzu hätte ich eine spezielle Frage:

Was macht das

Code: Alles auswählen

dom.RTUpdate(false);
eigentlich genau?

Und was passiert, wenn der übergebene Parameter "true" wäre?


.

Benutzeravatar
funkleuchtturm
Beiträge: 2368
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von funkleuchtturm » 07.02.2016, 12:04

jmaus hat geschrieben:D.h. du musst deine HM-Skript-Anweisungen in einen string verpacken und diese dann an tclrega.exe als POST request senden und schwups führt die CCU genau das aus.
Danke für Deine Erläuterungen. Das habe ich verstanden!
Von einem Linux-Rechner auf einen anderen Linux-Rechner(CCU) einen post-request abzusetzen geht offensichtlich relativ einfach.

Wo ich nun mit der entsprechenden Umsetzung auf meinem Arduino kämpfe, ist:
Wie setze ich eine post-request anstelle des bisher einfachen get-requests in der Arduino-Sprache ab.
Die Recherchen in den Foren zeigen, daß das geht aber relativ komplex ist . Bisher läuft das leider bei mir (noch) nicht. Ich muß einfach weiter suchen und testen.

Das Problem ist oft, daß irgendwo ein Punkt und Komma darüber entscheidet, ob´s funktioniert oder nicht. :mrgreen:

Auch wenn die Lösung noch nicht da ist, Danke für deinen Input!
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
funkleuchtturm
Beiträge: 2368
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von funkleuchtturm » 07.02.2016, 16:18

Ich versuche jetzt erst mal mit dem Firefox-Browser händisch den POST-request richtig abzusetzen.
Mit dem einfachen Ziel die Systemvariable "Anwesenheit" zu setzen, versuche ich die folgende HM-Skriptzeile per POST-request abzuschicken:

Code: Alles auswählen

var x = dom.GetObject("Anwesenheit").State(1);
In die Adresszeile des Browsers gebe ich ein...

Code: Alles auswählen

http://192.168.178.41:8181/POST tclrega.exe HTTP/1.1 Content-type: application/x-www-form-urlencoded Connection: Close Content-Length: 46 var x = dom.GetObject("Anwesenheit").State(1);
und erhalte als Ergebnis:

Code: Alles auswählen

<xml><exec>/POST tclrega.exe HTTP/1.1 Content-type: application/x-www-form-urlencoded Connection: Close Content-Length: 46 var x = dom.GetObject("Anwesenheit").State(1);</exec><sessionId/><httpUserAgent>User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0</httpUserAgent></xml>
Das ist aber wohl nicht richtig, denn die Systemvariable "Anwesenheit wird nicht aktualisiert.

Hm... :?:

Mit dem vergleichbaren GET-request funktioniert natürlich alles richtig:

Code: Alles auswählen

http://192.168.178.41:8181/GET bla.exe? x=dom.GetObject("Anwesenheit").State(1)
... aber das hilft ja leider nicht weiter ?
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von Familienvater » 07.02.2016, 16:23

Hi,

ich bin mir nicht sicher, ob Du ohne ein HTML-Formular oder so einen POST auslösen kannst, das sind unterschiedliche "Funktionen" im HTTP-Protokoll.

Der Familienvater

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von jmaus » 07.02.2016, 16:28

Familienvater hat geschrieben: ich bin mir nicht sicher, ob Du ohne ein HTML-Formular oder so einen POST auslösen kannst, das sind unterschiedliche "Funktionen" im HTTP-Protokoll.
Gebau so ist es. So einfach (vom firefox-browser aus) geht das nicht. Dafür brauch man schon wget oder curl. Wundert mich das es sowas unterm nen arduino nicht geben soll?!? Was läuft denn da für ein OS drauf?
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
funkleuchtturm
Beiträge: 2368
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von funkleuchtturm » 07.02.2016, 16:56

Auf dem Arduino wird einfach nur eine Art C#-Code ausgeführt. Das OS ist Arduino-eigen.

In einer Hochsprache ist das Absetzen eines POST-Request sicher kein Problem. Aber mit dem Arduino kann man eben einfach sehr hardwarenah programmieren.
Man hat aber den Nachteil, daß komplexe Netzwerk-Kommunikation sehr mühsam ist. Sog. Libraries machen zwar vieles einfacher, aber zum Absetzen eines POST-Request muß ich einen Befehls-String über den Arduino-Befehl client.print an den Server absetzen. Und da dachte ich, daß man das doch sicher auch mit dem Browser simulieren kann.
Genauso mache ich es ja mit dem Absetzen eines Get-Requests.
Ich versteh den Unterschied (noch!) nicht.
... ich bekomme ja mit der Methode eine xml-Antwort; nur nicht die richtige!
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Kann man eine neue Systemvariable von aussen definieren?

Beitrag von Black » 07.02.2016, 17:17

wenn ein aus mehreren befehelen (zeilen) bestehendes script an 8181 übergeben willst, probier mal spasseshalber die simikolons, die sonst in einem hm-script immer drinstehen am zeilenende, wegzulassen und die strings direkt cia append anzuhängen

das hier ist ne sequenz aus aus einem python programm von mir, wo auf dem rasppi ein wetter script läuft und die aufbereiteten daten dann an die ccu2 gehen

Code: Alles auswählen

cmd = 'dom.GetObject("Wetter-Temperatur").State(' + str (self.v_temp) + ')'
        cmd+= 'dom.GetObject("Wetter-Luftfeuchte").State(' + str (self.v_relHum) + ')'
        cmd+= 'dom.GetObject("Wetter-Bedingungen").State("' + self.v_weather + '")'
        cmd+= 'dom.GetObject("Wetter-Windgeschwindigkeit").State(' + str (self.v_windspeed) + ')'
        cmd+= 'dom.GetObject("Wetter-Windboeen").State(' + str (self.v_maxspeed) + ')'
        cmd+= 'dom.GetObject("Wetter-Aktualisierung").State("' + self.v_timestamp + '")'
        cmd+= 'dom.GetObject("Wetter-Windrichtung").State("' + self.v_winddirstr + '")'
        cmd+= 'dom.GetObject("Wetter-Windbedingungen").State("' + self.v_windstring + '")'
wie du siehst, keine symikolons nach den homematik script befehlen

der string geht dann via http post an die ccu


und das tuts so seit monaten

gruss, Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

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