FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: SNX100 am 11 Januar 2022, 17:31:19

Titel: Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 17:31:19
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?
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: JoWiemann am 11 Januar 2022, 18:36:25
Hallo,

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


Grüße Jörg
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: rob am 11 Januar 2022, 18:41:15
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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 20:24:40
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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 20:42:42
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 (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html) 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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 20:51:49
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") }}
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 21:13:49
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 ;)
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 21:22:37
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...
Titel: Antw:Pythonscript Rückgabewert
Beitrag 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
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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 21:30:48
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")
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: rob am 11 Januar 2022, 21:35:16
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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 21:44:57
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...
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 21:48:34
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
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 21:55:51
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????
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 21:58:52
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?
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 22:07:16
Bei der Geschichte ist ja die IST-Temperatur dank deiner Hilfe jetzt sauber im Dummy...

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

setstate Temperatur 3.16 °C
setstate Temperatur 2022-01-11 22:00:31 value 3.16


Logischerweise habe ich auch eine einstellbare SOLL-Temperatur

defmod Solltemperatur dummy
attr Solltemperatur group Einstellungen
attr Solltemperatur room Start
attr Solltemperatur stateFormat state °C
attr Solltemperatur webCmd :41:40:39:38:37:36:35:34:33:32:31:10

setstate Solltemperatur 39 °C
setstate Solltemperatur 2022-01-05 10:33:57 state 39


diese darf um einen einstellbaren Wert abweichen

defmod Temperaturtoleranz dummy
attr Temperaturtoleranz group Einstellungen
attr Temperaturtoleranz room Start
attr Temperaturtoleranz stateFormat state °C
attr Temperaturtoleranz webCmd :0.5:1:1.5

setstate Temperaturtoleranz 1 °C
setstate Temperaturtoleranz 2021-11-14 15:26:44 state 1


Wenn die IST-Temperatur <= Soll-Temperatur - Toleranz dann schalte

defmod Heizung RPI_GPIO 26
attr Heizung active_low yes
attr Heizung direction output
attr Heizung group Geräte,
attr Heizung room Start
attr Heizung webCmd toggle

setstate Heizung off
setstate Heizung 2022-01-11 22:03:15 Pinlevel low
setstate Heizung 2022-01-11 16:51:14 state off


an. Sonst wenn IST-Temperatur >= Soll-Temperaur + Toleranz schalte die Heizung ab.
Das sieht momentan so aus:

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

setstate Heizungssteuerung 2022-01-11 22:05:36
setstate Heizungssteuerung 2022-01-11 16:51:14 state active
setstate Heizungssteuerung 2022-01-11 22:05:36 triggeredByDev Temperatur
setstate Heizungssteuerung 2022-01-11 22:05:36 triggeredByEvent value: 3.13


Bis jetzt nur unterer Wert...

Später kommt noch dazu das die Heizung (3KW Durchlauferhitzer) nur tags über laufen darf wegen der PV Anlage:

defmod Nachts_automatisch_heizen dummy
attr Nachts_automatisch_heizen group Einstellungen
attr Nachts_automatisch_heizen room Start
attr Nachts_automatisch_heizen webCmd :ja:nein

setstate Nachts_automatisch_heizen ja
setstate Nachts_automatisch_heizen 2021-11-14 14:50:13 state ja


defmod Sonnenaufgang dummy
attr Sonnenaufgang group Info,
attr Sonnenaufgang room Start
attr Sonnenaufgang sortby 4,

setstate Sonnenaufgang 07:44:32
setstate Sonnenaufgang 2022-01-11 00:05:00 state 07:44:32


defmod Sonnenuntergang dummy
attr Sonnenuntergang group Info,
attr Sonnenuntergang room Start
attr Sonnenuntergang sortby 5,

setstate Sonnenuntergang 17:20:11
setstate Sonnenuntergang 2022-01-11 00:05:00 state 17:20:11



Tags = 1 Stunde nach Sonnenaufgang bis 1 Stunde vor Sonnenuntergang

Dies soll aber auch noch wählbar sein...

defmod Nachts_automatisch_heizen dummy
attr Nachts_automatisch_heizen group Einstellungen
attr Nachts_automatisch_heizen room Start
attr Nachts_automatisch_heizen webCmd :ja:nein

setstate Nachts_automatisch_heizen ja
setstate Nachts_automatisch_heizen 2021-11-14 14:50:13 state ja


Und die Heizung darf natürlich niemals Laufen wenn der Wasserstand zu niedrig ist...

defmod Wasserstand RPI_GPIO 12
attr Wasserstand devStateIcon off:zisterne_100 on:zisterne_10
attr Wasserstand direction input
attr Wasserstand group Info,
attr Wasserstand poll_interval 0.05
attr Wasserstand room Start
attr Wasserstand sortby 1,

setstate Wasserstand on
setstate Wasserstand 2022-01-11 22:18:54 Pinlevel high
setstate Wasserstand 2022-01-11 22:18:54 state on


und wenn die Heizung an ist muss natürlich die Zirkulationspumpe laufen

defmod Zirkulation RPI_GPIO 5
attr Zirkulation active_low yes
attr Zirkulation direction output
attr Zirkulation group Geräte,
attr Zirkulation room Start
attr Zirkulation webCmd toggle

setstate Zirkulation off
setstate Zirkulation 2022-01-11 22:20:37 Pinlevel low
setstate Zirkulation 2022-01-11 16:51:14 state off


Das sind soweit die wichtigsten Elemente meiner Whirlpoolsteuerung.
Wer auch mal auf so eine Idee kommt kann das natürlich gerne verwenden.
Sobald ich alles am laufen habe stelle ich auch gerne den kompletten Code zur Verfügung.
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 11 Januar 2022, 22:45:15
Ich habe ja schon gefragt und Du sollst es ja lernen: :)

Wer hat sich das ausgedacht? Tipp ReadingsNum ;) -> commandref

Du vergleichst hier Textketten mit einem numerischen Operator
{ if ( "Temperatur:value" <= ("Solltemperatur:value"-"1") ) { fhem("set Heizung on") }}
Sol liest man Werte aus in Perl (in der commandref (https://fhem.de/commandref_DE.html#perl)):
ReadingsNum('Devicename','Readingsname',Ersatzwert)
ReadingsNum('Temperatur','value',0)

Bekommst Du das allein hin? ;D
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 11 Januar 2022, 23:48:54
{ if ( ReadingsNum('Temperatur','value',0) <= ReadingsNum('Solltemperatur','value',0) - ReadingsNum('Temperaturtoleranz','value',0)) { fhem("set Heizung on;; set Zirkulation on") }}

Zitat von: Otto123 am 11 Januar 2022, 22:45:15

Bekommst Du das allein hin? ;D


Scheinbar nicht...
Schaltet nichts.
Vielleicht ist es auch schon zu spät für heute.
Zumindest bleibt das Log jetzt leer...
Ich vermute mal es wird jetzt immer mit den Ersatzwerten gerechnet weil keine Values erkannt werden. Ist auch noch nicht ganz sauber.
Da muss ich mich aber erst morgen ran setzen.

Auf jeden Fall hast Du mir wirklich sehr geholfen. Vielen herzlichen Dank und erstmal gn8. Morgen gehts weiter.



UPDATE:

{ if ( ReadingsNum('Temperatur','value',0) <= ReadingsNum('Solltemperatur','state',0) - ReadingsNum('Temperaturtoleranz','state',0) && "Wasserstand" eq "off") { fhem("set Heizung on;; set Zirkulation on") }}

jetzt scheint es zu gehen.
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 12 Januar 2022, 08:33:47
Guten Morgen,

ja ich hatte nicht richtig geschaut: in einem Dummy setzt Du value in den anderen nur state.

das hier "Wasserstand" eq "off"ist aber immer false. Das sind einfach wieder nur zwei Strings die verglichen werden. ::)

Mach nicht 3 dummies, mach einen mit mehreren Readings. Arbeite mit setreading ...  ;)

Gruß Otto
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: JensS am 12 Januar 2022, 11:32:26
Nur mal als Gedanke/Tipp - das Script würde ich standalone laufen lassen und MQTT2Server als Datenübergabepunkt nutzen.
Das schont die Ressourcen von FHEM.
https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php (https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php)

Gruß Jens
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 12 Januar 2022, 12:04:00
Danke für den Tip Jens, aber für mich persönlich ist das noch nichts. Das ist mein erstes Projekt was ich mit Steuerungen mache und ich muss mich in jedes Soft- und Hardwaredetail neu einarbeiten was immer recht Zeitaufwändig ist. Da diese Woche meine letzte Urlaubswoche ist bleibt nur noch Zeit für Feintuning.
Und was die Resourcen angeht... Das Herzstück ist ein Pi4b der sonst absolut nichts macht. Das ist ja schon mit Kanonen auf Spatzen geschossen, daher denke ich muss ich mir da grade keine Gedanken machen.
Unter anderen Umständen ist das mit Sicherheit sinnvoll und vielleicht gehe ich da irgendwann mal dran, aber momentan muss er erstmal laufen.
Wenn jemand so ein ähnliches Projekt nachmachen möchte und sich etwas besser auskennt ist das sicher zu empfehlen.
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Wernieman am 12 Januar 2022, 12:12:20
Ein Scrript, bei dem Du direkt die Werte per Kommandozeile übergiebst, blockiert FHEM, solange es läuft. Wenn Du es im Hintergrund (&) laufen lässt, blockiert es zwar FHEM nicht, kann aber auch keine Werte übergeben.

Insofern ist eine Übergabe per MQTT2, TELNET oder direkt WEB längerfristig zu überlegen und optimaler ....
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 12 Januar 2022, 19:38:06
Ich werde noch wahnsinnig...

Zitat aus dem FhemWiki:

define statusFenster notify fensterKontakt(Oben|Unten):(open|closed) {
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')
       { fhem 'set Terrassentuer open' }
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')
       { fhem 'set Terrassentuer closed' }
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'open' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'closed')
       { fhem 'set Terrassentuer tilted' }
if ( ReadingsVal('fensterKontaktOben', 'state', 'undef') eq 'closed' && ReadingsVal('fensterKontaktUnten', 'state', 'undef') eq 'open')
       { fhem 'set Terrassentuer undef' }
}


Mein Code:

defmod Heizungssteuerung notify Temperatur:value:.*\{
if ( ReadingsNum('Temperatur','value',0) <= ReadingsNum('Solltemperatur','state',0) - ReadingsNum('Temperaturtoleranz','state',0) )
       { fhem("set Heizung on;; set Zirkulation on") }
if ( ReadingsNum('Temperatur','value',0) >= ReadingsNum('Solltemperatur','state',0) + ReadingsNum('Temperaturtoleranz','state',0) )
       { fhem("set Heizung off;; set Zirkulation off") }
}


ergibt eine Fehlermeldung "IF: no left bracket: "...
Ich verstehs einfach nicht... wo ist denn der Unterschied?
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Wernieman am 12 Januar 2022, 19:57:35
Zitat*\{
Fehlendes Freizeichen?
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 12 Januar 2022, 20:07:38
defmod Heizungssteuerung notify Temperatur:value:.* {\
if ( ReadingsNum('Temperatur','value',0) <= ReadingsNum('Solltemperatur','state',0) - ReadingsNum('Temperaturtoleranz','state',0) )\
{fhem("set Heizung on;; set Zirkulation on")}\
if ( ReadingsNum('Temperatur','value',0) >= ReadingsNum('Solltemperatur','state',0) + ReadingsNum('Temperaturtoleranz','state',0) )\
{fhem("set Heizung off;; set Zirkulation off")}\
}


::) läuft... dankeschön
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 12 Januar 2022, 20:12:22
Zitat von: SNX100 am 12 Januar 2022, 19:38:06
Ich werde noch wahnsinnig...

Ganz ruhig bleiben.

Schlechtes Beispiel im Wiki. Den Code kann man komplett in die FHEM Kommandozeile werfen, aber eben nicht in eine mehrzeilige Raw DEF

Dein Code ist genau so und noch mehr Schrott - wie Werner sagt und noch mehrzeilg. :o

Der letzte Code ist gut :)

Ich schreibe noch was ins Wiki ;)

Gruß Otto
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 13 Januar 2022, 20:52:58
Das Notify reagiert zwar auf Temperaturänderung, aber wenn man die Solltemperatur verändert muss es ja auch reagieren.
Daher habe ich ein wenig gegoggeld wie man mehrere Devices mit dem Notify abfragt.
Habe sowas in der Art gefunden:

defmod Heizungssteuerung notify Temperatur:value:.*|Solltemperatur:state:.* {\
\
if ( ReadingsVal('Heizung', 'state', 'undef') eq 'off' && \
     ReadingsNum('Temperatur','value',0) <= ReadingsNum('Solltemperatur','state',0) - ReadingsNum('Temperaturtoleranz','state',0) )\
   {fhem("set Heizung on")}\
\
if ( ReadingsVal('Heizung', 'state', 'undef') eq 'on' && \
     ReadingsNum('Temperatur','value',0) >= ReadingsNum('Solltemperatur','state',0) + ReadingsNum('Temperaturtoleranz','state',0) )\
   {fhem("set Heizung off")}\
\
}


funktioniert aber nicht... warum?
Klar, Layer 8 Fehler...
Wie wäre es denn richtig?
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 13 Januar 2022, 21:04:39
ich denke Du willst ReadingsNum('Solltemperatur','state',0) - ReadingsNum('Temperaturtoleranz','state',0) und ReadingsNum('Solltemperatur','state',0) + ReadingsNum('Temperaturtoleranz','state',0) extra klammern?

Also erst subtrahieren und dann vergleichen. Ich bin nicht sicher... https://perldoc.perl.org/perlop#Operator-Precedence-and-Associativity
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 13 Januar 2022, 21:51:32
Nein nein...
das läuft alles wunderbar.
Mir geht es um die erste Zeile

Vorher:
defmod Heizungssteuerung notify Temperatur:value:.* {\

Alles läuft wunderbar, Notify reagiert auf die Temperatur.

Nachher:
defmod Heizungssteuerung notify Temperatur:value:.*|Solltemperatur:state:.* {\

Alles läuft wunderbar, Notify reagiert auf die Temperatur aber nicht auf das Ändern der Solltemperatur.

Sprich: dieses eine Notify soll auf 2 Eventgeber reagieren.
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: Otto123 am 13 Januar 2022, 22:01:50
das setzen von state erzeugt keinen Event mit state :)
https://fhem.de/commandref_DE.html  suche nach addStateEvent

Zwei Lösung: notify mit addStateEvent ausstatten oder ein Reading setzen. Wie schon gesagt: nimm einen Dummy statt 3 oder 4 :)
Titel: Antw:Pythonscript Rückgabewert
Beitrag von: SNX100 am 14 Januar 2022, 10:21:49
notify mit addStateEvent ausstatten

war jetzt erstmal die Lösung.
Dankeschön