Seite 1 von 1

OH3 executeCommandLine

Verfasst: 9. Jan 2021 21:50
von MOO1812
Hallo,

ich habe seit ca. 2 Jahren OH2 am laufen und habe verschiedenste Dinge eingebunden.
Aktuell laufen über ein 433MHZ Gatway Rollladen und Steckdosen, diverse HUE Lampen, mein AV Receiver und eine Homematic Heizungsteuerung.
Aktuell habe ich mir ein OH3 Testsystem aufgesetzt und versucht alles Umzustellen. Es funktioniert alles außer die 433MHZ anbindung.
Früher habe ich das EXEC 1.x Binding verwendet. Dieses gibt es in OH3 nicht mehr. Deshalb habe ich es mit EXEC 3.0 Binding versucht,
das hat aber leider nicht geklappt. Also habe ich mit Sitemap, Items und Rules versucht die Rolladen mit executeCommandLine anzusteuern.
In OH2 bekomme ich das auch hin. Dort wird ein Python Script mit Parametern aufgerufen und das Gateway aus dem Script per UDP angesprochen.
Allerdings bin ich in OH3 mit der gleichen Rule und Anbindung gescheitert. Das Python Script wird zwar angesprochen läuft aber nicht.
Wenn ich das Pythonscript in der OH3 Umgebung über Putty direkt starte funktioniert es.
python /etc/openhab2/scripts/send2itgw433.py R1 STOP

Vielleicht hat hier einer ne Idee was ich noch machen könnte.

ITEM

Code: Alles auswählen

Rollershutter  RolladenBuero_V  "Rolladen Büro Virtuell"     <rollershutter>  ["Switchable"]
RULE

Code: Alles auswählen

rule "Rollladen Buero Virtuell " 
when 
    Item RolladenBuero_V received command
then 
    if (receivedCommand == UP) {
         executeCommandLine("python /etc/openhab2/scripts/send2itgw433.py R1 UP")
        } 
    else
    if (receivedCommand == DOWN) {
        executeCommandLine("python /etc/openhab2/scripts/send2itgw433.py R1 DOWN")
        } 
    else {
         executeCommandLine("python /etc/openhab2/scripts/send2itgw433.py R1 STOP")
        } 
end
SITEMAP

Code: Alles auswählen

sitemap TestSteckdose label="TestSteckdose"
{
    Frame {
            Default item=RolladenBuero_V    label="Rolladen Büro Virtuell"      
        }
}
Das hat in OH2 funktioniert... in OH3 bekomme ich folgende Fehlerausgabe.

Code: Alles auswählen

2021-01-09 20:41:19.109 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'TestSteckdose-1' failed: An error occurred during the script execution: array element type mismatch in TestSteckdose
Danke für Eure Hilfe und ANtwort.

Gruß aus Stuttgart
Marc

Re: OH3 executeCommandLine

Verfasst: 9. Jan 2021 23:46
von udo1toni
Zunächst einmal wäre es gut, Code sowie Konfiguration und Log-Ausgaben mit code-Tags zu versehen. Das geschieht gewöhnlich nicht automatisch (diesmal aber schon...)

Ich habe mich noch nicht mit Rules unter OH3 beschäftigt. Was mich aber wundert, ist die Fehlermeldung im Log, die gar nichts mit Deiner Rule zu tun haben scheint.

Laut Dokumentation von executeCommandLine musst Du die übergebenen Parameter getrennt angeben, nicht als Bestandteil des Befehls. Eventuell musst Du sogar das Script als Parameter angeben, falls python der Befehl ist. Eventuell musst Du python aber gar nicht voranstellen.

Eine andere Sache ist das mit dem Exec Binding. Das funktioniert komplett anders als exec1.

1. Du musst ein Thing pro Script anlegen. Paramter ist der Scriptaufruf, ein zu übergebender Parameter wird im Command String mit %2$s angegeben.
2. Es gibt verschiedene Channel für dieses Thing. Gewöhnlich wird man den input Channel verwenden und das Thing so konfigurieren, dass es das Script automatisch aufruft, wenn der input Channel gesetzt wird. Ein Start über den run Channel ist möglich, aber nur sinnvoll, wenn kein Parameter übergeben wird. Der run-Channel bleibt so lange im ON Zustand, wie das Script läuft.
3. es gibt eine whitelist, in der die Befehlszeilen gelistet werden müssen, damit openHAB sie ausführt. Dies ist ein Sicherheitsmerkmal, welches natürlich lästig ist :)

Nochmals zu Punkt 1: Falls Du dem Script mehrere Parameter übergeben willst, so musst Du das im Input Channel vorher entsprechend aufbereiten, also einen String mit allen Parametern (getrennt durch ein Leerzeichen) erzeugen und diesen String in den Input Channel schreiben.
Das Exec Binding unterstützt ausschließlich String als relevante Channel (in und out), es ist also nicht gut für Rollershutter geeignet.

Eine Alternative wäre, das Python Script dahingehend umzuschreiben, dass es mit mqtt arbeitet. Das hört sich schlimm an, ist es aber nicht. Vorteil: Du kannst es in openHAB ohne Rules lösen. Je nach Funktionsumfang des Originalscripts kann es auch sein, dass Du plötzlich viel mehr steuern kannst, weil es leicht ins Script eingebaut werden kann.

Re: OH3 executeCommandLine

Verfasst: 10. Jan 2021 15:14
von MOO1812
Hallo,

erstmal viele Dank für deine Antwort und für das Formatieren meines Codes. :)
Ich verspreche es das nächste Mal besser zu machen. :lol:
Dein Tip mit den Aufruf als Parameter und einzelnen Args aus der Rule hat funktioniert.
Hatte da gestern zwar rumgetestet, aber nie den Python Aufruf vom eigentlichen Script getrennt. :roll:

Code: Alles auswählen

executeCommandLine("python", "/etc/openhab/scripts/send2itgw433.py", "R1", "DOWN")
Jetzt kann ich meine Rollladen und Steckdosen wieder über OH3 ansteuern und das EXEC Binding brauch ich gar nicht mehr.

Gruß aus Stuttgart
Marc

Re: OH3 executeCommandLine

Verfasst: 24. Jan 2021 21:54
von StarOnDavid
Hänge mich hier mal dran weil ich ebenfalls mit 'executeCommandLine' ein kleines problem habe. Oder sollte ich lieber ein neues Thema öffnen? (bin neu hier)

Kurz mein Szenario OH3 auf einem A20-OLinuxino-MICRO mit Armbian. Ich möchte eine Heizungssteuerung realisieren. Zum steuern der Heizkreise (Wandheizung) kommen Stellmotoren zum Einsatz diese werden über Relais geschaltet.

Zu diesem Zweck habe ich mir ein kleines Python Script geschrieben dem ich als Argumente den Pin Name und die Zeit in Sekunden übergebe. Das Script funktioniert prima wenn ich es von der Kommandozeile aus ausführe. Das OpenHAB GPIO Binding ist für den RasPi und deshalb keine Option.

Die Heizkreise sollen in Abhängigkeit von aktueller Raumtemperatur und der eingestellten Soll-Temperatur geschaltet werden. Als müssen entsprechende Rules her. Daraufhin bin ich auf diesen Thread hier gestossen, da ich anfangs den selben Fehler mit den 'Leerzeichen' drin hatte.

Zum Testen habe ich mir erst mal ein Switch Item erstellt und auf der Sitemap eingebunden.

Test Item

Code: Alles auswählen

Switch relais1 "Relais 1" 
Test Rule

Code: Alles auswählen

rule "Relais1 to ON"

when
    Item relais1 changed to ON
then
    executeCommandLine("python3.9", "/etc/openhab/scripts/relaisOnByTime.py", "PB3", "2")
    logInfo("heizkreisventile.rules", "Relais 1 geschaltet")
end
Mit dem selben Befehl auf der Kommandozeile läuft es ...

Code: Alles auswählen

python3.9 /etc/openhab/scripts/relaisOnByTime.py PB3 2
Die Ausgabe in der Kafka Konsole -> log:tail ist wie erwart, wenn man den Switch anschaltet:

Code: Alles auswählen

[INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'relais1' changed from OFF to ON
[INFO ] [e.model.script.heizkreisventile.rules] - Relais 1 geschaltet
Aber das Python Script wird nicht ausgeführt!

Hat einer en Tipp?

Re: OH3 executeCommandLine

Verfasst: 25. Jan 2021 08:42
von udo1toni
Also, ich würde erwarten, dass der Befehl nur python heißt, nicht python3.9.