Shell Aufruf in FHEM starten und als Reading speichern

Begonnen von choetzu, 24 September 2018, 14:47:39

Vorheriges Thema - Nächstes Thema

choetzu

Guten Tag,
ich möchte lediglich die Raspi-Temperatur regelmässig auslesen und als Reading speichern. Klar, da gäbe es SYSMON. SYSMON ist mir aber zu gewaltig. Ich will ja nur die Temperatur. ;)

In der Shell gebe ich folgendes ein

vcgencmd measure_temp

zurück kommt:
temp=52.6'C

und genau dies möchte ich via FHEM lösen und auch als Reading speichern. Geht das überhaupt? Ich habe mich da etwas umgesehen, bin aber nicht auf die Lösung gekommen.

{qw("vcgencmd measure_temp &") }

geht nicht, da krieg ich folgendes zurück

&

:) Danke für die Hilfe.

Lg c
Raspi3, EnOcean, Zwave, Homematic

CoolTux

Da musst Du schon auf Perl gehen. Eine kleine myUtils Funktion


my $rasptemp = qx(vcgencmd measure_temp);
readingsSingleUpdate($defs{'dummyNAMEinFHEM'},READINGNNAME,$rasptemp,1)


Fertig
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

Beta-User

Die andere Alternative wäre, nur ein shell-script aufzurufen und das dann via telnet das Ergebnis an FHEM übergeben zu lassen (sofern das qx zu lange dauern sollte und FHEM blockiert):

https://forum.fhem.de/index.php/topic,88398.msg808685.html#msg808685
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

choetzu

Zitat von: CoolTux am 24 September 2018, 14:56:30
Da musst Du schon auf Perl gehen. Eine kleine myUtils Funktion


my $rasptemp = qx(vcgencmd measure_temp);
readingsSingleUpdate($defs{'dummyNAMEinFHEM'},READINGNNAME,$rasptemp,1)


Fertig

danke, das würde ich gerne probieren. Baue ich das in 99_myUtils.pm ein. Wie folgt:


sub Raspitemp($) {
my $rasptemp = qx(vcgencmd measure_temp);
readingsSingleUpdate($defs{'dummyNAMEinFHEM'},READINGNAME,$rasptemp,1)
}


Ist das korrekt? Und erstell ich dann ein Dummy mit diesem Userreading? Korrekt?

Ich habs nicht getestet, da ich etwas Respekt von myUtils habe.

Zitat von: Beta-User am 24 September 2018, 15:26:56
Die andere Alternative wäre, nur ein shell-script aufzurufen und das dann via telnet das Ergebnis an FHEM übergeben zu lassen (sofern das qx zu lange dauern sollte und FHEM blockiert):

https://forum.fhem.de/index.php/topic,88398.msg808685.html#msg808685


diese Variante ist vermutlich noch etwas komplizierter, oder?
Raspi3, EnOcean, Zwave, Homematic

Wzut

Zitat von: choetzu am 24 September 2018, 14:47:39
{qw("vcgencmd measure_temp &") }
Tipp : ersteinmal {qx(vcgencmd measure_temp) } in der FHEM Kommandozeile testen.
I.d. R. wird das mit einem "VCHI initialization failed" quittiert da der User fhem nicht die nötigen Rechte hat.
aber "{qx(cat /sys/class/thermal/thermal_zone0/temp)}"  sollte dem User einen gültigen Wert zurück geben der dann nur noch durch 1000 geteilt werden muß.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

choetzu

Zitat von: Wzut am 24 September 2018, 20:06:49
Tipp : ersteinmal {qx(vcgencmd measure_temp) } in der FHEM Kommandozeile testen.
I.d. R. wird das mit einem "VCHI initialization failed" quittiert da der User fhem nicht die nötigen Rechte hat.

So ist es! Man könnte aber auch fhem die nötigen Rechte geben, oder?

aber "{qx(cat /sys/class/thermal/thermal_zone0/temp)}"  sollte dem User einen gültigen Wert zurück geben der dann nur noch durch 1000 geteilt werden muß.

Das klappt bestens. Dann muss mich ch das nur noch in ein Reading vepacken...  danke
Raspi3, EnOcean, Zwave, Homematic

CoolTux

Zitat von: choetzu am 24 September 2018, 20:01:42
danke, das würde ich gerne probieren. Baue ich das in 99_myUtils.pm ein. Wie folgt:


sub Raspitemp($) {
my $rasptemp = qx(vcgencmd measure_temp);
readingsSingleUpdate($defs{'dummyNAMEinFHEM'},READINGNAME,$rasptemp,1)
}


Ist das korrekt? Und erstell ich dann ein Dummy mit diesem Userreading? Korrekt?

Ich habs nicht getestet, da ich etwas Respekt von myUtils habe.

diese Variante ist vermutlich noch etwas komplizierter, oder?

Sieht gut aus. Ich würde aber dafür eine eigene 99_myUtils nehmen.
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

choetzu

Zitat von: CoolTux am 24 September 2018, 20:20:38
Sieht gut aus. Ich würde aber dafür eine eigene 99_myUtils nehmen.

wenn ich 99_myUtil_Raspitemp.pm erstelle, dann kommt folgende Meldung:

Bareword "READINGNAME" not allowed while "strict subs" in use at ./FHEM/99_myUtils_Raspitemp.pm line 22.

Ignorieren?

Raspi3, EnOcean, Zwave, Homematic

choetzu

Hmm, ich bring das nicht zum laufen.. das Userreading wird nicht korrekt angelegt.

Zitatattr Test userReadings temp { Raspitemp() }

Passiert nix. Auch wenn ich den Zustand des Dummies ändere.
Raspi3, EnOcean, Zwave, Homematic

CoolTux

Also du darfst natürlich nicht eins zu eins übernehmen. Ich habe nur Platzhalter verwendet als Beispiel.

readingsSingleUpdate($defs{'dummyNAMEinFHEM'},'temperature',$rasptemp,1)
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

Wzut

Zitat von: choetzu am 24 September 2018, 20:14:48
Man könnte aber auch fhem die nötigen Rechte geben, oder?
Wieder Radio Erwian, im Prinzip ja, aber das werde ich nicht im Anfängerforum diskutieren und damit die Jehova Rufer wecken und Popcorn auspacken lassen :)
Aber ich wundere mich schon etwas über den Aufwand der hier getrieben wird. Eigene Utils , mit nur einer Funktion die Übergabeparamter hat und dann doch alles hardcoded macht ? Und dann wird das Ganze nicht mal in einem at oder notify eingesetzt sondern in einem userReading ?
Also wenn schon userReading, dann ganz primitiv als Einzeiler :
attr <name> userReadings Raspi_Temp {my $t = qx(cat /sys/class/thermal/thermal_zone0/temp);; sprintf("%.1f",$t/1000)}
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

choetzu

Zitat von: Wzut am 25 September 2018, 08:54:36
Wieder Radio Erwian, im Prinzip ja, aber das werde ich nicht im Anfängerforum diskutieren und damit die Jehova Rufer wecken und Popcorn auspacken lassen :) Aber ich wundere mich schon etwas über den Aufwand der hier getrieben wird. Eigene Utils , mit nur einer Funktion die Übergabeparamter hat und dann doch alles hardcoded macht ? Und dann wird das Ganze nicht mal in einem at oder notify eingesetzt sondern in einem userReading ?
Also wenn schon userReading, dann ganz primitiv als Einzeiler :
attr <name> userReadings Raspi_Temp {my $t = qx(cat /sys/class/thermal/thermal_zone0/temp);; sprintf("%.1f",$t/1000)}

super, danke. wie würdest du denn sowas "schlank" lösen? Mit deiner Lösung funktioniert es sehr gut, ich muss einfach schauen, dass ich das Device regelmässig update.

Zitat von: CoolTux am 25 September 2018, 05:53:18
Also du darfst natürlich nicht eins zu eins übernehmen. Ich habe nur Platzhalter verwendet als Beispiel.

readingsSingleUpdate($defs{'dummyNAMEinFHEM'},'temperature',$rasptemp,1)

danke. Kannst du mir hier weiter helfen? Wenn mein Dummy TEST und das Reading Raspi_Temp heisst, was genau muss ich denn im Userreading schreiben? Ich komm da nicht drauf und habe nun auch schon mal meine FHEM zum Absturz gebracht. Danke.. ich möchte es verstehen. Danke.
Raspi3, EnOcean, Zwave, Homematic

CoolTux

Zitat von: choetzu am 25 September 2018, 12:05:38
super, danke. wie würdest du denn sowas "schlank" lösen? Mit deiner Lösung funktioniert es sehr gut, ich muss einfach schauen, dass ich das Device regelmässig update.

danke. Kannst du mir hier weiter helfen? Wenn mein Dummy TEST und das Reading Raspi_Temp heisst, was genau muss ich denn im Userreading schreiben? Ich komm da nicht drauf und habe nun auch schon mal meine FHEM zum Absturz gebracht. Danke.. ich möchte es verstehen. Danke.

Das ist kein userreading sondern eine myUtils Funktion. Aber ich denke mal mit userreading bist Du besser ausgehoben. Musst nur einen Trigger finden damit das Device mit dem userreading ein Event wirft.
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

Wzut

Zitat von: choetzu am 25 September 2018, 12:05:38
ich muss einfach schauen, dass ich das Device regelmässig update.

danke. Kannst du mir hier weiter helfen? Wenn mein Dummy TEST und das Reading Raspi_Temp heisst, was genau muss ich denn im Userreading schreiben?
userReading : Die Lösung bietet sich an wenn du bereits ein Device hast das regelmäßig neue Werte bekommt und die SysTemp einfach noch als Bonbon dazu geben willst.

Bei der Lösung in der 99_xxx würde ich die Funktion ändern :

sub Raspitemp($) {
my $name = shift;
my $rasptemp = qx(cat /sys/class/thermal/thermal_zone0/temp);
readingsSingleUpdate($defs{$name},"state",sprintf("%.1f",$rasptemp/1000),1);
}


dazu noch einen Dummy anlegen z.B. mit Namen Test. (hast du ja aber wohl schon)
und wenn er unbedingt ein extra Reading Raspi_Temp haben soll, dann halt das "state" durch "Raspi_Temp" ersetzen.

Als nächstes brauchst du ein at das zyklisch aufgerufen wird (z.B. alle Minute) und den Dummy mit dem aktuellen Wert füttert.
define at_rt at +*00:01:00 { Raspitemp("Test"); }

Als einzigen Vorteil dieser aufwändigen Lösung sehe ich nur das du recht flexibel bist wann du den Wert aktualisierst, aber selbst dann könnte man die paar Zeilen Code der Funktion auch hart direkt ins at oder notify packen. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

choetzu

Zitat von: Wzut am 25 September 2018, 13:04:38
Als nächstes brauchst du ein at das zyklisch aufgerufen wird (z.B. alle Minute) und den Dummy mit dem aktuellen Wert füttert.
define at_rt at +*00:01:00 { Raspitemp("Test"); }


danke. Da krieg ich die Fehlermeldung

Missing right curly or square bracket at (eval 179408) line 1, at end of line
syntax error at (eval 179408) line 1, at EOF

Unknown command }, try help.


Also irgendeine Klammer scheint zu fehlen.
Raspi3, EnOcean, Zwave, Homematic