Pythonscript Rückgabewert

Begonnen von SNX100, 11 Januar 2022, 17:31:19

Vorheriges Thema - Nächstes Thema

SNX100

Hallo zusammen,

erstmal vorweg: Ich habe schon so ziemlich alles im Netz abgesucht um mein Problem selbst zu lösen.
Vielleicht suche ich auch schlicht nach den falschen Sachen...

Ich lese per Pythonscript einen A/D Wandler aus und bekomme eine Temperatur als Rückgabewert.
Funktioniert alles sauber.

defmod at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = system("/usr/local/bin/temperatur.py &");;;;\
fhem("set Temperatur $rueckgabe;;;;");;;;\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value °C


Hiermit versuche ich jetzt den py script auszuführen und in den Dummy zu schreiben.
Rechtevergabe und Ausführbarkeit alles kein Problem...

Das Problem ist dass das at den korrekten Wert ausschliesslich ins Log schreibt und nicht in den Dummy. im Dummy bekomme ich immer nur -1 ausgegeben.

Abgesehen davon das ich den wert zwingend im Dummy benötige möchte ich ihn auf gar keinen Fall im Log, da die Temperatur alle 5 Sekunden gemessen wird und somit das Log sinnlos zumüllt...

Was mache ich hier falsch?

JoWiemann

Hallo,

system(...) gibt nur Erfolg/Fehler zurück. Mit qx(..) bekommst Du den Wert zurück.


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

rob

#2
Hi.

Und das
fhem("set Temperatur $rueckgabe;;;;");

sagt, führe Inhalt aus $rueckgabe als Befehl von Temperatur aus. Der Temp-Wert soll aber bestimmt kein Befehl sein, sondern höchstens ein Parameter zu einem Befehl ;)
Ferner ist für Temperatur kein Befehl definiert, den man mir set anwenden könnte.
Mit "ausschließlich ins Log schreibt" meinst Du ggf. ein ähnlichen Hinweis wie "Unknown argument ... blabla ".

Was passiert wenn Du stattdessen dies ausführen lässt?

fhem("setreading Temperatur temperature $rueckgabe");


Das sollte dort ein Reading "temperature" erzeugen und hoffentlich befüllen, sofern $rueckgabe einen sinnvollen Wert enthält - s. Jörgs Hinweis.

Die Semikolons schauen so aus, als sollte man auch welche weglassen  ;D

VG
rob

SNX100

Bislang sah mein Log so aus:

4.530332681017594
4.4664132210631555
4.498427833232571
4.530332681017594
4.466413221063251
4.530332681017594
4.656865641472049
4.562128327954523
4.498427833232571
4.625394254207271
4.562128327954333
4.625394254207271
4.498427833232762


Also super sauber alle 5 Sekunden die Temperatur...

Code geändert:

defmod at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = qx("/usr/local/bin/temperatur.py &");;\
\
my $dev = "Temperatur";;\
fhem "setreading $dev value $rueckgabe";;\
\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value


Log:

sh: 1: /usr/local/bin/temperatur.py &: not found
2022.01.11 20:13:58 3: setreading Temperatur value  : Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

2022.01.11 20:13:58 3: at_Temperatur_set: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

sh: 1: /usr/local/bin/temperatur.py &: not found
2022.01.11 20:14:03 3: setreading Temperatur value  : Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

2022.01.11 20:14:03 3: at_Temperatur_set: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.


qx wieder zu system geändert:

defmod at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = system("/usr/local/bin/temperatur.py &");;\
\
my $dev = "Temperatur";;\
fhem "setreading $dev value $rueckgabe";;\
\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value


Log:

2022.01.11 20:17:26 1: PERL WARNING: Argument "Solltemperatur:value" isn't numeric in subtraction (-) at (eval 8326) line 1.
2022.01.11 20:17:26 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
2022.01.11 20:17:26 1: PERL WARNING: Argument "Temperatur:value" isn't numeric in numeric le (<=) at (eval 8326) line 1.
2022.01.11 20:17:26 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
3.5230236012542746



geändert auf rob´s Code:

defmod at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = system("/usr/local/bin/temperatur.py &");;\
\
my $dev = "Temperatur";;\
fhem("setreading Temperatur temperature $rueckgabe");;\
\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value


Log:

3.380402979119625
3.3083109472244177
3.5583571528596445
3.2720669970831877
3.2720669970831877
3.5230236012542746


Aber egal bei was, der Dummy bleibt immer auf -1

Otto123

#4
Hi,

ohne warten (&) geht es nicht :) und der Syntax ist falsch! qx verträgt keine Hochkommas -> qx("Befehl") -> qx(Befehl)
qx("/usr/local/bin/temperatur.py &")
Probier es erstmal in der FHEM Kommandozeile
{qx(/usr/local/bin/temperatur.py)}

Falls Du meine Notiz lesen willst :)

Alles in allem mit set magic :)
defmod at_Temperatur_set at +*00:00:05  setreading Temperatur value {(qx(/usr/local/bin/temperatur.py))}

Das nächste Problem könnte noch die Umgebung (Pfade usw) sein. Aber wenn der Shebang im py Script ordentlich sollte es gehen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

SNX100

#5
Aus der Kommandozeile gibt er

3.1625346667786434

aus...

bei
defmod at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = qx("/usr/local/bin/temperatur.py &");;\
\
my $dev = "Temperatur";;\
fhem("setreading Temperatur temperature $rueckgabe");;\
\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value


Log:

sh: 1: /usr/local/bin/temperatur.py &: not found
2022.01.11 20:49:35 3: setreading Temperatur temperature  : Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

2022.01.11 20:49:35 3: at_Temperatur_set: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.


Dummy unverändert.

Kommandozeile:

setreading Temperatur value {(qx(/usr/local/bin/temperatur.py))}

Füllt den Dummy mit 3......

Code geändert auf:

defmod at_Temperatur_set at +*00:00:05 {\
\
fhem("setreading Temperatur value {(qx(/usr/local/bin/temperatur.py))}");;\
\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value °C


jetzt wird der Wert super in den Dummy geschrieben... (nebenbei vielleicht ein schneller Tip wie ich das auf 2 Dezimalstellen verkürzen kann?)

Aber das Log:

2022.01.11 21:10:33 1: PERL WARNING: Argument "Temperatur:value" isn't numeric in numeric le (<=) at (eval 10422) line 1.
2022.01.11 21:10:33 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}

Otto123

#6
2 Stellen
{sprintf "%.2f", 3.12345678}

Der Code steht wo?
{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
Sieht für mich wie frei erfunden aus ;) sollte das ReadingsNum() werden?

und die Zeile in den Müll!
my $rueckgabe = qx("/usr/local/bin/temperatur.py &");;\

Und wenn Du bei Perl Code im at bleiben willst, dann nimmst Du nicht set magic ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

SNX100

#7
defmod at_Temperatur_set at +*00:00:05 {\
fhem("setreading Temperatur value {sprintf "%.2f", (qx(/usr/local/bin/temperatur.py))}");;\
}\


kann ich nicht abspeichern. Fehlermeldung syntaxerror...

defmod Heizungssteuerung notify Temperatur:value:.*\
\
{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
attr Heizungssteuerung room Überwachung

setstate Heizungssteuerung 2022-01-11 21:25:48
setstate Heizungssteuerung 2022-01-11 16:51:14 state active
setstate Heizungssteuerung 2022-01-11 21:25:48 triggeredByDev Temperatur
setstate Heizungssteuerung 2022-01-11 21:25:48 triggeredByEvent value: 2.93980080900099\



set magic sagt mir noch nichts... soweit bin ich leider nocht nicht bei in fhem...

rob

#8
sh: 1: /usr/local/bin/temperatur.py &: not found
Ist einmal das Problem mit qx und in den Codes fehlen ein paar Klammern.
Ich habe das mal kurzerhand nachgestellt. Bitte kopiere die Datei z.B. nach /opt/fhem/FHEM/temperatur.py
Dort dann
chown fhem:dialout temperatur.py

Anschließend die Defis ändern:
define Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value

define at_Temperatur_set at +*00:00:05 {\
\
my $rueckgabe = qx("/opt/fhem/FHEM/temperatur.py");;\
\
my $dev = "Temperatur";;\
fhem("setreading Temperatur temperature $rueckgabe");;\
\
}\


Bei mir kommt im Device der Tempwert damit raus.

Edit: Sehe grad Ottos Hinweise, deshalb bitte obiges Beispiel nur bezogen auf den Eingangspost beziehen. Die darauf folgenden Optimierungshinweis sind trotzdem wichtig.
@Otto: sorry, wollte nicht reingrätschen  :-X

Otto123

#9
suchst Du in Doku https://fhem.de/commandref_DE.html
hab das Kind doch explizit genannt :) ein set mit {(Perlcode)} beachte die Klammern!!! nennt sich set magic

setreading Temperatur value {(sprintf "%.2f", qx(/usr/local/bin/temperatur.py))}

@rob Das hier dürfte mMn nicht funktionieren qx("/opt/fhem/FHEM/temperatur.py")
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rob

Zitat von: Otto123 am 11 Januar 2022, 21:30:48
@rob Das hier dürfte mMn nicht funktionieren qx("/opt/fhem/FHEM/temperatur.py")
Es tut. Aber frag mich nicht warum :D

SNX100

Langsam, langsam... ihr kommt grade durcheinander...

ich gebe jetzt mal den aktuellen Stand:

defmod at_Temperatur_set at +*00:00:05 {\
fhem("setreading Temperatur value {(qx(/usr/local/bin/temperatur.py))}");;\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value °C

setstate Temperatur 2.864446681110174\
°C
setstate Temperatur 2022-01-11 21:38:18 value 2.864446681110174\


Log:

2022.01.11 21:39:28 1: PERL WARNING: Argument "Temperatur:value" isn't numeric in numeric le (<=) at (eval 12058) line 1.
2022.01.11 21:39:28 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}


Dummy noch zu viele Dezimalstellen...
wenn ich versuche das so zu ändern:

defmod at_Temperatur_set at +*00:00:05 {\
fhem("setreading Temperatur value {(sprintf "%.2f", qx(/usr/local/bin/temperatur.py))}");;\
}\


defmod Temperatur dummy
attr Temperatur group Info,
attr Temperatur room Start
attr Temperatur sortby 1,
attr Temperatur stateFormat value °C


kann ich es nicht abspeichern wegen der Fehlermeldung: syntax error at (eval 12222) line 2, near ".2f"

Zitat von: rob am 11 Januar 2022, 21:29:49
sh: 1: /usr/local/bin/temperatur.py &: not found
Ist einmal das Problem mit qx und in den Codes fehlen ein paar Klammern.
Ich habe das mal kurzerhand nachgestellt. Bitte kopiere die Datei z.B. nach /opt/fhem/FHEM/temperatur.py

Hatte sich schon erledigt... das war nur ein Prob mit Coderesten...

Otto123

#12
aber bei SNX100 wird das Script ja gefunden und ausgeführt - also das ist nicht das Problem

weil Du hartnäckig bist! Du musst natürlich die inneren " schützen
fhem("setreading Temperatur value {(sprintf \"%.2f\", qx(/usr/local/bin/temperatur.py))}");;\

@rob probiere bitte in der FHEM Kommandozeile
{qx("ls fhem.cfg")}
{qx(ls fhem.cfg)}und schau danach ins LogFile
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

SNX100

Zitat von: Otto123 am 11 Januar 2022, 21:48:34

weil Du hartnäckig bist! Du musst natürlich die inneren " schützen
fhem("setreading Temperatur value {(sprintf \"%.2f\", qx(/usr/local/bin/temperatur.py))}");;\

Sorry, möchte nicht beratungsresistent wirken, ich komme aufgrund meiner mangelnden Kenntnisse nur nicht ganz so schnell hinterher und "/'%)]}... ist alles noch ein wenig verwirrend.

Aber die Verkürzung funktioniert im Dummy super.

Bliebe noch das Log...

2022.01.11 21:50:36 1: PERL WARNING: Argument "Temperatur:value" isn't numeric in numeric le (<=) at (eval 12692) line 1.
2022.01.11 21:50:36 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}


" isn't numeric ".... warum????

Otto123

Du hast meine Frage nicht beantwortet:
Zitat von: Otto123 am 11 Januar 2022, 21:13:49
Der Code steht wo?
{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
Sieht für mich wie frei erfunden aus ;) sollte das ReadingsNum() werden?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz