OpenHAB 2 Exec Binding 2.0 Python Skript

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
D@ni€l
Beiträge: 5
Registriert: 19. Aug 2018 12:11
Answers: 0

OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von D@ni€l »

Hallo zusammen,

ich habe den Versuch gestartet auf Basis von folgender Doku ein Python Skript einzubinden.
https://www.openhab.org/addons/bindings/exec/

Mein Problem ist, dass an irgendeiner Stelle ein Fehler sein muss, da keine Berechnung und anzeige des Wassergehalts erfolgt.
Ich habe als Versuch alle Werte im Python Skript fest vorgegeben. Auch das funktioniert nicht.

Zunächst einmal mein Aufbau.
Ich habe openhab auf einem Raspi laufen. An den Raspi ist ein DHT22 und ein BMP180 angeschlossen. Zusätzlich habe ich ein NodeMCU als Außenstation mit einem DHT22. Per MQTT sende ich Temperatur und Feuchte an den Raspi. Dies funktioniert auch so weit ganz gut.
Mein Ziel ist es nun aus Temperatur Feuchte und Luftdruck den Wassergehalt zu berechnen. Die Berechnung wollte ich in einem Python Skript auf dem Raspi ablaufen lassen.

Hierzu habe ich folgende Dateien angelegt:
outdoorstation.items
outdoorstation.rules
outdoorstation.py
outdoorstation.sitemap
outdoorstation.things

Mir stellen sich nun zwei Fragen:
  • Habe ich in meinem Vorgehen bzw. vom Aufbau etwas grundsätzlich falsch gemacht?
  • Wie übergebe ich zwei Variablen an das Python Skript mittels %2$s
outdoorstation.items

Code: Alles auswählen

Group  Outdoorstation_Chart (System, Charts)
Number Outdoorstation_Chart_Period "Periode" (System)
Number Outdoorstation_Temperature "Temperatur [%.1f °C]" <temperature> {mqtt="<[mosquitto:Outdoor_Temperature:state:default]"}
Number Outdoorstation_Humidity    "Luftfeuchtigkeit [%.1f %%]" <humidity> {mqtt="<[mosquitto:Outdoor_Humidity:state:default]"}
Number Outdoorstation_Watercontent "Wassergehalt [%.1f g/kg]" <water> 

String Outdoorstation_Watercontent_Args {channel="exec:command:outdoorstation_watercontent:input"}
String Outdoorstation_watercontent_out {channel="exec:command:outdoorstation_watercontent:output"}
outdoorstation.rules

Code: Alles auswählen

rule "Livingroomstation Water content"
  when
     Item Outdoorstation_Temperature changed or Item Outdoorstation_Humidity changed or Item Livingroomstation_Pressure changed
     then
     Outdoorstation_Watercontent_Args.sendCommand(Outdoorstation_Temperature.toString)


    Outdoorstation_Watercontent.postUpdate(
        ( ( Float::parseFloat(Outdoorstation_watercontent_out.state.toString) as Number ) * 10 ) / 10
        )
end
outdoorstation.py

Code: Alles auswählen

import sys

if len(sys.argv) > 2:
    temperature = float(sys.argv[1])
    humidity = float(sys.argv[2])
    pressure = float(sys.argv[3])
    
    if humidity > 0 and pressure > 800 and temperature < 45 and humidity < 100:
        saturationpressure = 288.68 * (1.098 + temperature / 100)**8.02
        zaehler = 0.622 * (humidity / 100 * saturationpressure)
        nenner = pressure - saturationpressure * (humidity / 100)

        watercontent = zaehler / nenner * 1000

        print(watercontent)
outdoorstation.sitemap

Code: Alles auswählen

sitemap outdoorstation label="Balkon"
{
        Frame label="Außenklima" {
            Text item=Outdoorstation_Temperature
            Text item=Outdoorstation_Humidity
            Text item=Outdoorstation_Watercontent
            }
}
outdoorstation.things

Code: Alles auswählen

Thing exec:command:outdoorstation_watercontent "Wassergehalt" [command="/etc/openhab2/scripts/outdoorstation.py %2$s", transform="REGEX((.*?))", interval=60, timeout=10, autorun=true]
Ich hoffe ich habe keine wichtigen Informationen vergessen.

Vielen Dank für eure Anregungen.

Gruß Daniel

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von udo1toni »

Ich kenne mich mit python nicht aus, aber für mich sieht das Script irgendwie unvollständig aus.
Läuft das Script denn, wenn Du es händisch aufrufst?

Wenn Du das Script mittels Exec Binding verwenden willst, musst Du zwingend den Interpreter aufrufen, und das Script als Parameter übergeben, also sowas wie

Code: Alles auswählen

command="/usr/bin/python /etc/openhab..."
wobei der Pfad hier nur beispielhaft ist, Du musst schauen, wo der Interpreter wirklich liegt.

Du hast das Exec Binding so konfiguriert, dass das script alle 60 Sekunden aufgerufen wird, was aber sinnlos ist, da es ja einen Input über die Rule erhält. Der erste Punkt ist hier, den interval wegzulassen, damit das Script nur dann ausgeführt wird, wenn es auch einen Wert erhält.

Weiterhin hast Du Exec so konfiguriert, dass das Script automatisch ausgeführt wird, wenn sich der Input ändert. Das ist im Prinzip der korrekte Ansatz, aber in der Rule schreibst Du den Input und greifst unmittelbar darauf den Output ab, das wird schief gehen, weil das Script ja auch eine gewisse Zeit zur Abarbeitung braucht. Der zweite Punkt ist also, dem run-Channel ein Item zuzuweisen, damit Du innerhalb der Rule prüfen kannst, ob das Script noch ausgeführt wird, und erst dann den Wert über Output abzuholen, wenn das Script fertig ist. In der offiziellen Dokumentation ist dazu ein komplettes Beispiel angegeben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

D@ni€l
Beiträge: 5
Registriert: 19. Aug 2018 12:11
Answers: 0

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von D@ni€l »

Vielen Dank für deine Anwort.

Zunächst wenn ich das Skript über ssh aufrufe liefert es mir ein Ergebnis.

Den Teil mit dem Interpreter verstehe ich nicht ganz. Was ein Interpreter ist ist mir vollkommen klar allerdings wundert mich, dass ich diesen aufrufen muss. Ich habe nämlich bereits ein Skript im Einsatz welches mir die DHT22 und BMP180 Werte abfrägt. Dieses Funktioniert ohne Probleme und ohne aufruf eines Interpreters.

Wo müsste ich denn den Aufruf einfügen?

Bezüglich des automatischen Ausführens, so habe ich diesen Teil gelöscht.
Außerdem habe ich die Items und die Rules Dateien um die Verzögerung ergänzt.

Items

Code: Alles auswählen

// state of the execution, is running or finished
Switch Outdoorstation_Watercontent_State {channel="exec:command:outdoorstation_watercontent:run"}
Rules

Code: Alles auswählen

rule "Livingroomstation Water content"
  when
     Item Outdoorstation_Temperature changed or Item Outdoorstation_Humidity changed or Item Livingroomstation_Pressure changed
     then
     Outdoorstation_Watercontent_Args.sendCommand(Outdoorstation_Temperature.toString)
     
     // wait for the command to complete
     // State will be NULL if not used before or ON while command is executed
     while(Outdoorstation_Watercontent_State.state != OFF){
         Thread::sleep(500)
      }


    Outdoorstation_Watercontent.postUpdate(
        ( ( Float::parseFloat(Outdoorstation_watercontent_out.state.toString) as Number ) * 10 ) / 10
        )
end
Bis jetzt leider keinen positiven Effekt.

D@ni€l
Beiträge: 5
Registriert: 19. Aug 2018 12:11
Answers: 0

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von D@ni€l »

Habe mir gerade mal noch die Logdatei angesehen. Ich bekomme die Meldung:

2018-08-19 17:05:49.968 [ERROR] [hab.binding.exec.handler.ExecHandler] - An exception occurred while executing '/etc/openhab2/scripts/outdoorstation.py 26' : 'Cannot run program "/etc/openhab2/scripts/outdoorstation.py": error=13, Keine Berechtigung'
Ich verstehe das ehrlich gesagt nicht.

Ich hatte über SSH: sudo chmod +x /etc/openhab2/scripts/outdoorstation.py die Berechtigung erteilt.Zumindest habe ich es gelernt, dass es so funktioniert.

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von udo1toni »

Aber wem hast Du de Berechtigung erteilt? Wer ist der Eigentümer der Datei? Wenn schon wäre ein

Code: Alles auswählen

sudo chmod +x ugo /etc/openhab2/scripts/outdoorstation.py 
oder alternativ ein

Code: Alles auswählen

sudo chmod 755 /etc/openhab2/scripts/outdoorstation.py 
(drei Bits pro Besitzer,Gruppe und alle anderen. 1=ausführen,2=schreiben,4=lesen ->> 755 bedeutet also, der Eigentümer darf alles, Gruppe und alle anderen dürfen ausführen und lesen)
Ansonsten werden python Scripte vom Python Interpreter ausgeführt, und normalerweise muss man den Aufruf mit angeben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

D@ni€l
Beiträge: 5
Registriert: 19. Aug 2018 12:11
Answers: 0

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von D@ni€l »

Vielen Dank für deinen Tipp mit der Berechtigung. Die Befehle die ich bisher in Foren gelesen habe scheinen nicht funktioniert zu haben.
Habe deinen zweiten Befehl verwendet. Jetzt wird das Skript ausgeführt.

Ein Frage habe ich dann aber doch noch zu OpenHAB. Ich habe leider hierzu nichts in der Doku bzw. in Foren gefunden.

Und zwar geht es um die Übergabe von Input an das Skript. Zum Test habe ich bis jetzt einen Konstanten Wert vorgegeben. Allerdings müsste ich drei Variablen übergeben. Gemäß der Doku funktioniert die Übergabe von Variablen wie folgt:

Code: Alles auswählen

Thing exec:command:yourcommand [ command="<YOUR COMMAND> %2$s", interval=0, autorun=false ]
%2$s ist so weit ich verstehe der Platzhalter für die Variable. Wie aber funktioniert es mit mehreren Variablen? Ich habe hierzu leider kein Beispiel im Netz gefunden.

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von udo1toni »

So ist es. Das Problem ist, dass Du nur ein Item übergeben kannst, also kannst Du auch nur eine Variable übergeben.

Allerdings... (ich habe das aber noch nicht ausprobiert), könntest Du versuchen, alle Variablen hintereinander in einen String zu packen (mit Leerzeichen zwischen den einzelnen Parametern, die dürfen dann natürlich keine Leerzeichen enthalten) und dann diesen String in das Item zu laden, welches mit dem Input Channel verbunden ist. Wenn es gut läuft, wird der Item-Status einfach so übergeben und Du bekommst einen Aufruf mit mehreren Variablen, wenn es schlecht läuft, setzt openHAB Anführungszeichen drum rum. Dann müsstest Du das Script, welches die Parameter erwartet, entsprechend anpassen, dass es den zweiten Parameter auseinander nimmt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

D@ni€l
Beiträge: 5
Registriert: 19. Aug 2018 12:11
Answers: 0

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von D@ni€l »

Vielen Dank für die Idee mit dem String. Es hat tatsächlich funktioniert. Werde morgen noch um meine Lösung für alle die vor dem gleichen Problem stehen ergänzen.

Benutzeravatar
udo1toni
Beiträge: 15244
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: OpenHAB 2 Exec Binding 2.0 Python Skript

Beitrag von udo1toni »

Super!
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten