Shell-Command ausführen und JSON-Response in Readings anbieten?

Begonnen von bgewehr, 14 Januar 2018, 12:40:43

Vorheriges Thema - Nächstes Thema

bgewehr

Hallo,

habe ein python-Script, welches über CarNet mein Auto auslesen (und hoffentlich bald auch Befehle senden kann)!

Aufruf per CMDline und Antwort als JSON:


python vw_carnet_web.py retrieveCarNetInfo

/-/vehicle-info/get-vehicle-details
{"vehicleDetails":{"lastConnectionTimeStamp":["14.01.2018","11:05"],"distanceCovered":"8.657","range":"300","serviceInspectionData":"630 Tag(e) / 21.400 km","oilInspectionData":"630 Tag(e) / 21.400 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}



Welches fhem-Modul könnte ich dafür nehmen, um mein Auto auf diese Weise als device zu integrieren?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

KernSani

Schau dir mal HTTPMOD an. Du kannst aber auch mal im Forum suchen, da gibt es ein paar Beiträge zu CarNet.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

bgewehr

httpmod ist ja an sich ganz gut, ich bräuchte aber shellCommandMod...

Mit

define on_testdummy_act testdummy.* {
my $result='python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py retrieveCarNetInfo';;
set testdummywert = $result;;
}


bekomme ich jedenfalls nicht das stdout des scriptaufrufes in testdummywert, sondern nichts.

Was mache ich falsch?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

CoolTux

https://perldoc.perl.org/functions/qx.html
http://www.perlmonks.org/?node_id=928192

Ausserdem geht der set Befehl auf Perlebene nicht. Du musst dazu die Funktion fhem() aufrufen und den gesamten Befehl, also Set bla bla als Wert übergeben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

bgewehr

Super, das hat nun geklappt:


testdummy.* {
my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py retrieveCarNetInfo";;
fhem "set testdummywert = $result";;
}


Nun nur noch den JSON parsen...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

bgewehr

Ich habe es jetzt mal nach einem fhem Update mit expandJSON versucht, dabei stürzt mir aber immer das ganze fhem so dermaßen ab, dass ich es nur mit einem kompletten reboot wiederbeleben kann.

sudo killall perl geht nicht, sudo systemctl stop fhem ebenfalls nicht, nur sudo reboot bringt was...

Das Modul wirkt eigentlich super, aber vielleicht scheitert es auch an der Struktur meines JSON:


{"vehicleDetails":{"lastConnectionTimeStamp":["14.01.2018","16:56"],"distanceCovered":"8.677","range":"250","serviceInspectionData":"629 Tag(e) / 21.400 km","oilInspectionData":"629 Tag(e) / 21.400 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

CoolTux

Warum machst du es nicht mit encode_json? Ruf es innerhalb eines evals auf dann stürzt auch FHEM nicht ab.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dev0

@bgewehr:
Ich hab es mit Deinem JSON String getestet und kein Problem:

define d dummy

define j expandJSON d:json:.*

setreading d json {"vehicleDetails":{"lastConnectionTimeStamp":["14.01.2018","16:56"],"distanceCovered":"8.677","range":"250","serviceInspectionData":"629 Tag(e) / 21.400 km","oilInspectionData":"629 Tag(e) / 21.400 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}

list d
Internals:
   CFGFN     
   NAME       d
   NR         749
   STATE      ???
   TYPE       dummy
   READINGS:
     2018-01-16 17:44:49   errorCode       0
     2018-01-16 17:44:49   json            {"vehicleDetails":{"lastConnectionTimeStamp":["14.01.2018","16:56"],"distanceCovered":"8.677","range":"250","serviceInspectionData":"629 Tag(e) / 21.400 km","oilInspectionData":"629 Tag(e) / 21.400 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}
     2018-01-16 17:44:49   vehicleDetails_distanceCovered 8.677
     2018-01-16 17:44:49   vehicleDetails_oilInspectionData 629 Tag(e) / 21.400 km
     2018-01-16 17:44:49   vehicleDetails_range 250
     2018-01-16 17:44:49   vehicleDetails_serviceInspectionData 629 Tag(e) / 21.400 km



Es werden allerdings nur die JSON Objekte und nicht die Arrays dekodiert. Arrays habe ich noch nicht implementiert, wenn dann würde ich vermutlich auch nur den vollständigen Array-String in das jeweilige Reading schreiben. Sonst müßte das Modul raten, in welcher Reihenfolge...

@CoolTux: expandJSON ruft decode_json in einem eval auf.

bgewehr

Hab Perl 5.20 und JSON per cpan installiert. Muss ich sonst noch was berücksichtigen?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

dev0

Nein, nicht das ich wüsste. Es sind die gleichen Voraussetzungen wie bei Dienem 70_JSONREADINGS.pm Modul. Die Core-Routine beruht ja auch auf Deinem toReadings(), wenn auch etwas angepasst...

bgewehr

Mit Verbose 5 become ich folgendes Ergebnis kurz vor dem endgültigen Absturz (oder einer Schleife, das Ding ist nur mit Neustart wiederzubeleben):


018.01.17 18:14:31 5: expandJSON testdummyexpand: Yield decode: HASH(0x3010ad0) | testdummywert | json | {"vehicleDetails":{"lastConnectionTimeStamp":["17.01.2018","18:06"],"distanceCovered":"9.013","range":"890","serviceInspectionData":"626 Tag(e) / 21.000 km","oilInspectionData":"626 Tag(e) / 21.000 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

#12
Also: das expandJSON funktioniert, aber nicht dann wenn zuvor ein notify den JSON-Wert an das Dummy-Device geliefert hat. Löse ich durch Modifikation des State readings per set dummy 1 schon das notify aus, welches vom expandJSON erzeugt wird? Dann jedenfalls wird der String sauber in Readings zerlegt.

Also ist mein Problem mit knallhartem, blockierenden Absturz von FHEM eine Kombination aus meinem setreading im Notify und dem Notify im expandJSON. Beide Komponenten für sich arbeiten einwandfrei, in der Kombination dann der Absturz.

Irgendwelche Ideen?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

dev0

Kann ich nicht nachstellen:

define d dummy
define t dummy
define j expandJSON d:json:.*
define n notify t setreading d json {"vehicleDetails":{"lastConnectionTimeStamp":["17.01.2018","18:06"],"distanceCovered":"9.013","range":"890","serviceInspectionData":"626 Tag(e) / 21.000 km","oilInspectionData":"626 Tag(e) / 21.000 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}
trigger t on

list d
...
   READINGS:
     2018-01-18 08:20:00   errorCode       0
     2018-01-18 08:20:00   json            {"vehicleDetails":{"lastConnectionTimeStamp":["17.01.2018","18:06"],"distanceCovered":"9.013","range":"890","serviceInspectionData":"626 Tag(e) / 21.000 km","oilInspectionData":"626 Tag(e) / 21.000 km","showOil":true,"showService":true,"flightMode":false},"errorCode":"0"}
     2018-01-18 08:20:00   vehicleDetails_distanceCovered 9.013
     2018-01-18 08:20:00   vehicleDetails_oilInspectionData 626 Tag(e) / 21.000 km
     2018-01-18 08:20:00   vehicleDetails_range 890
     2018-01-18 08:20:00   vehicleDetails_serviceInspectionData 626 Tag(e) / 21.000 km


Funktioniert das Beispiel bei Dir?
Falls das gezeigte Beispiel nicht dem entspricht was Du meintest, dann bitte etwas Nachstellbares (mit Dummies) posten, damit ich es untersuchen kann.

ZitatLöse ich durch Modifikation des State readings per set dummy 1 schon das notify aus, welches vom expandJSON erzeugt wird?
Das hängt von der regex des expandJSON Device ab. Wenn Du wie in meinem Beispiel nur das Reading "json" angibst, dann nicht.

Sind Deine fhem.pl / 91_notify.pm halbwegs aktuell?

bgewehr

fhem.pl und der Rest sind von einem Update von Vorgestern.

Ich glaube, die Sache mit dem Python Script macht den Unterschied:


define on_testdummy_act testdummy.* {
my $result = qx "python /home/bananapi/carnet/volkswagen-carnet-client/vw_carnet_web.py retrieveCarNetInfo";;
fhem "set testdummywert = $result";;
}


Ich baue mal einen weiteren dummy "data_changed" dazwischen und triggere davon den expandJSON.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868