Pythonscript Rückgabewert

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

Vorheriges Thema - Nächstes Thema

SNX100

#15
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.

Otto123

#16
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):
ReadingsNum('Devicename','Readingsname',Ersatzwert)
ReadingsNum('Temperatur','value',0)

Bekommst Du das allein hin? ;D
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

#17
{ 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.

Otto123

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
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

JensS

#19
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

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

SNX100

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.

Wernieman

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 ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

SNX100

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?

Wernieman

Zitat*\{
Fehlendes Freizeichen?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

SNX100

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

Otto123

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
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

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?

Otto123

#27
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
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

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.

Otto123

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 :)
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