FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: bgewehr am 04 Februar 2018, 10:17:12

Titel: setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 04 Februar 2018, 10:17:12
Hallo,

ich habe einen DOIF, der einen Fehler ausgibt:


define carnetAct DOIF ([carnetHeating] eq "VENTILATION_on") {
my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation";
fhem "setreading carnetHeating cmdResult $result";
}
DOELSEIF
([carnetHeating] eq "HEATING_on") {
my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessHeating";
fhem "setreading carnetHeating cmdResult HEATING_on_executed";
}
DOELSEIF
([carnetHeating] eq "AUTO") {fhem "setreading carnetHeating cmdResult AUTO_executed";
}
DOELSEIF
([carnetHeating] eq "off") {
my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py stopRemoteAccessHeating";
fhem "setreading carnetHeating cmdResult stop_executed";
}


ich erhalte im DOIF den Fehler:


error
{ my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation"; fhem "setreading carnetHeating cmdResult $result"; }: Usage: setreading <name> <reading> <value> where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.


das $myresult is leider etwas komplex:


/-/profile/check-security-level
{"errorCode":"1","errorType":"CORE.INSUFFICIENT_SEC_LEVEL"}
/-/rah/quick-start
{"errorCode":"1","errorType":"RAH.INSUFFICIENT_SEC_LEVEL"}


Wenn ich einen festen Wert angebe wie in den unteren ELSEIFs, dann geht das.

Also Frage: Wie kann ich das Ergebnis meines Shellcommands an das Reading schreiben?
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: MadMax-FHEM am 04 Februar 2018, 11:08:42
Wie sieht denn $result im "komplexen Fall" aus?

Wenn es nicht ein "simpler Wert" ist, evtl. \"$result\"

Gruß, Joachim
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 04 Februar 2018, 12:11:45
Das Problem scheint woanders zu liegen. Die Variable ist im Moment einfach leer, weil offensichtlich der shellcommand Befehl gar nicht ausgeführt wird. Daher meckert das setreading, weil es keinen Wert bekommt.

Also neue Frage: Warum wird mein qx nicht korrekt ausgeführt? In einem notify hat das schon mal funktioniert...
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 04 Februar 2018, 12:24:42
Habe nun mal das Ergebnis in eine log Datei umgelenkt. Das shellcommand wird ausgeführt, aber das Ergebnis kommt beim doif nicht an.

Also Frage: Gibt es bei DOIF für qx etwas besonderes zu berücksichtigen?
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: MadMax-FHEM am 04 Februar 2018, 14:57:55
Die Frage dann besser zum Unterforum DOIF/Hilfsmodule verschieben...

Nutze DOIF nicht (wirklich) daher kann ich da nicht helfen...

Allerdings kann fhem "consolenbefehle" auch ohne qx aufrufen...
qx ist ja dann eher perl!?

https://forum.fhem.de/index.php?topic=12611.0

Oder wie immer: commandref

Gruß, Joachim
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: Otto123 am 04 Februar 2018, 15:14:04
Das was Du versuchst hat doch mit DOIF erstmal nix zu tun? Auf Console geht Dein Befehl, dann probiere doch stück für stück weiter:
Alles in der FHEM Kommanozeile
"python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation"
{qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation"}
{my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation";return $result}

Bedenke, die erste Variante ist NonBlocking von Hause aus, bei allen anderen musst Du Dich kümmern, dass FHEM nicht stehen bleibt.

Gruß Otto

Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 04 Februar 2018, 19:39:47
nonBlocking wäre super, die erste Variante führt das Script auch aus, wenn ich es in die fhem Kommandozeile eingeben, aber leider nicht innerhalb des doif commands.

Sobald die {} drum sind, wird der Befehl nicht mehr aufgerufen. In keinem Log steht irgendein Fehler.

Also Frage: Wie triggert man einen non blocking shellcmd von doif aus?
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: Otto123 am 04 Februar 2018, 19:53:53
Glaub ich Dir nicht :)
Ich habe eine Datei /opt/fhem/willi.txt die ist so erzeugt {system ("echo 'echo Test' > willi.txt")}
Jetzt mach ich mir ein DOIF
defmod di_Test DOIF ([19:48]) ("cat willi.txt")

Und dann steht zur Ausführungszeit in meinem Logecho Test

Also bei DOIF keine Besonderheiten?!

Gruß Otto
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: amenomade am 04 Februar 2018, 19:59:00
([Bedingung])
    ("python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation")


Aber ich habe ein Verständnisproblem: du willst ein "nonBlocking", aber du möchtest trotzdem das Ergebnis dann nutzen???
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 04 Februar 2018, 20:28:36
Nein, dann verzichte ich auf das Ergebnis, wenn ich nonBlocking haben kann ;-)). Wäre schön gewesen, den errorcode zu bekommen, um zu prüfen, ob die Ausführung erfolgreich war. Wenn nicht, stehe ich ja doch wieder vor dem kalten Auto... Vielleicht sende ich ihn mir per mqtt hinterher, dann ist das alles nonBlocking.

Das hier funktioniert:


([carnetHeating] eq "VENTILATION_on") (
"python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessVentilation >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",
setreading carnetHeating currentState VENTILATION_on
)
DOELSEIF
([carnetHeating] eq "HEATING_on") (
"python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py startRemoteAccessHeating >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",
setreading carnetHeating currentState HEATING_on
)
DOELSEIF
([carnetHeating] eq "AUTOMATIC") ()
DOELSEIF
([carnetHeating] eq "off") (
"python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py stopRemoteAccessHeating >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",
setreading carnetHeating currentState off
)


Jedesmal, wenn ich jetzt in Apple Home oder Elgato Eve den Thermostat des Autos auf heizen oder kühlen oder stop oder Automatic (to be done) stelle, wird das passende Python Script ausgeführt, das dem CarNet die passenden Befehle liefert. Nun müssen wir "nur" noch den security error beim Senden der Befehle mit SPIN überwinden (ich glaube, dass da Cookies nicht korrekt gesetzt werden - oder sowas).

Dank Euch habe ich genau das erreicht, was ich wollte.

Vielen Dank!
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: Petrosilius Zwackelmann am 24 November 2018, 16:57:10
Hallo bgewehr,
gerne würde ich auch die Heizung in meinem GTE über FHEM einschalten ....
Ich komme aber nicht dahinter, welche Grundvoraussetzungen erforderlich sind um das Skript zu benutzen.
Ich hatte bisher nichts mit Python und MQTT gemacht deswegen habe ich folgendes auf meinem Raspberry nachinstalliert.

sudo apt-get install python-dev python-rpi.gpio
sudo apt-get install mosquitto mosquitto-clients
sudo cpan install Net::MQTT:Simple
sudo cpan install Net::MQTT:Constants




Möglicherweise habe ich aber einen falschen Client installiert, da die letzte Fehlermeldung nach einem patho mqtt clinent sucht...

Traceback (most recent call last):
  File "/opt/fhem/carnet/volkswagen-carnet-client/vw_carnet_web.py", line 16, in <module>
    import lib_mqtt as MQTT
  File "/opt/fhem/carnet/volkswagen-carnet-client/lib_mqtt.py", line 11, in <module>
    import paho.mqtt.client as mqtt
ImportError: No module named paho.mqtt.client



kannst du mir hier weiterhelfen oder deine cfg hier mal veröffentlichen?

Danke
Gruß Manuel
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: Petrosilius Zwackelmann am 26 November 2018, 21:48:14
Hallo bgewehr,

ich bin nun ein wenig weiter gekommen...
Folgende Pakete habe ich nun nachinstalliert und somit keine Fehlermeldungen mehr...


sudo apt-get install python-pip -y
sudo pip install paho-mqtt
sudo pip install requests


Bei verbose 5 bekomme ich folgende LOG Einträge:
0
2018.11.26 21:34:08 4: WEB_192.178.168.52_49824 POST /fhem?cmd.carnetHeating=set%20carnetHeating%20HEATING_on&room=carnet&XHR=1&fw_id=10757; BUFLEN:0
2018.11.26 21:34:08 5: Cmd: >set carnetHeating HEATING_on<
2018.11.26 21:34:08 4: dummy set carnetHeating HEATING_on
2018.11.26 21:34:08 5: Starting notify loop for carnetHeating, 1 event(s), first is HEATING_on
2018.11.26 21:34:08 5: End notify loop for carnetHeating
2018.11.26 21:34:08 4: WEB: /fhem?cmd.carnetHeating=set%20carnetHeating%20HEATING_on&room=carnet&XHR=1&fw_id=10757 / RL:20 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/


Das carnetFhem.log File wird angelegt bleibt aber ohne Einträge.


Kannst du mir hier weiterhelfen?

MfG
Manuel
Titel: Antw:setreading nach shellcommand mit $result in DOIF
Beitrag von: bgewehr am 12 Januar 2019, 23:30:52
Tut mir leid, Manuel, ich habe diese Posts leider völlig übersehen. Schau bitte hier für die Details:
https://forum.fhem.de/index.php?topic=83090.0#lastPost