E-Mail senden bei bestimmter Temperatur?

Begonnen von DatRaspi, 17 Mai 2017, 11:32:47

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

Zitat
Ich würde das gerne so programmieren, dass sie nur automatisch einfährt, wenn sie auf ,,10" ausgefahren ist.
Bei allen anderen Werten soll diese Funktion deaktiviert werden.

Dann einfach statt '!=0' im elsif '==10' schreiben, dann passiert das Einfahren nur bei pct 10, so wie du im Text geschrieben hast...

Ob es tatsächlich GENAU das ist was du willst musst du wissen... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MandelHL

#61
Hallo noch mal,

ich möchte die Funktion der automatischen Markisensteuerung noch mehr automatisieren.

Mit der derzeitigen Steuerung fährt die Markise ausschließlich bei Stand "10" temperaturgesteuert aus und ein, was auch so sein soll:
defmod HM_70A1CA_notify_1 notify HM_70A1CA:temperature:.* {if ($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10 )\
   {fhem("set Markise pct 10");;\
     DebianMail('XXX@XXX.XX','Hitzewarnung - Markise fährt aus','Achtung, die Temperatur hat 42 Grad erreicht! Die Markise fährt aus.')}\ elsif ($EVTPART1 <= 30 and ReadingsNum('Markise','pct',99) == 10 )\{fhem("set Markise pct 0");;\
      DebianMail('XXX@XXX.XX','Entwarnung - Markise fährt ein','Die Temperatur ist wieder unter 30 Grad. Die Markise fährt wieder ein!')}\ } attr HM_70A1CA_notify_1 alias Markise Hitze-Automatik attr HM_70A1CA_notify_1 appOptions { \
"template": "switch",\
"home": true,\
"sortby": "2",\
"setup": {\
"status": \
{\
    "bar": [\
        "state:inactive:0:#DE3A1F:success", \
        "state:active:100:success" \
    ]\
        },\
"main": \
[{\
"leftBtn": "mdi-power-off" ,\
"leftClick": ["state::inactive"],\
"text": \
[\
"state:inactive:deaktiviert" ,\
"state:active:aktiviert" ,\
"state::%s"\
],\
"rightBtn": "mdi-power-on" ,\
"rightClick": ["state::active"]\
}] \
}\
}\
\

attr HM_70A1CA_notify_1 group Markise
attr HM_70A1CA_notify_1 room Markise
attr HM_70A1CA_notify_1 sortby ,,2"
attr HM_70A1CA_notify_1 webCmd active:inactive


Damit das aber nicht alle 10 Minuten passiert, stelle ich den Schalter bei sonnigem Wetter dann immer manuell auf "inactive".

Ich würde das jetzt aber gerne so einstellen, dass keine manuelle Deaktivierung mehr vorgenommen werden muss.

Wenn die Markise auf "pct 10" steht, die Helligkeit des Devices "Wetterstation" unter <=240 ist oder es nach 19 Uhr ist, soll die Markise einfahren.

Mein Problem ist in diesem Fall, dass ich mehrere Bedingungen habe und das deshalb nicht hinbekomme.

Oder ist es vielleicht sogar empfehlenswert, das in die "99_myUtils.pm" auszulagern und da die Abfrage vorzunehmen?

Eine Frage habe ich noch zum ReadingsNum:
ReadingsNum('Markise','pct',0) < 10 )
ReadingsNum('Markise','pct',99) == 10 )


Ich habe verstanden, dass der dritte Wert in den Klammern der default Wert ist. Ist es aber in meinem Fal überhaupt wichtig, welche Zahl da steht?
Es geht mir nur darum, das zu verstehen. Es funktioniert ja einwandfrei.

Danke und Grüße
Mandel

Otto123

Hi,

ist doch aber analog zu den anderen?
($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10 )
($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10  and (ReadingsNum('Wetterstation','Helligkeit',0) <= 240 or $hour >= 19))

Der Defaultwert wird häufig dafür genommen um Fehler zu behandeln, da Du das nicht tust kann darin stehen was will.

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

MandelHL

Danke, Otto.

Aber ich denke, das ist nicht das, was ich meine.

Derzeit sieht es so aus:
($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10 )

Das bedeutet, wenn die Temperatur mindestens 42 Grad ist und die Markise pct weniger als 10 ist, mache dieses und jenes.

Deine Zeile bedeutet doch:
($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10  and (ReadingsNum('Wetterstation','Helligkeit',0) <= 240 or $hour >= 19))

Wenn die Temperatur mindestens 42 Grad beträgt und die Helligkeit niedriger 240 ist oder es später als 19 Uhr ist, mache dieses oder jenes.

Der erste Befehl passt da schon.

Allerdings kommt nach
($EVTPART1 >= 42 and ReadingsNum('Markise','pct',0) < 10 )
die Bedingung, nämlich:

Fahre die Markise auf pct 10 aus
{fhem("set Markise pct 10");;\
und lasse sie da solange, bis die Helligkeit von 240 unterschritten wird oder es mindestens 19 Uhr ist.

Das soll aber nur gelten, wenn sich die Markise auf pct 10 befindet, da diese sonst auch bei allen anderen Positionen aus- und einfährt.

Mir fällt dabei auf, dass ich dann mit den 30 Grad gar nicht mehr arbeiten muss.

ich würde das dann so eintragen:
elsif (ReadingsNum('Wetterstation','Helligkeit',0) <= 240 or $hour >= 19 and ReadingsNum('Markise','pct',99) == 10 )\

Ist das so richtig?

Viele Grüße
Mandel

Otto123

Bedenke:
das and dies or jenes and alles ist etwas anderes als das and (dies or jenes) and alles
ich hatte verstanden es soll entweder dunkel oder spät sein wenn es 10 ist, in deiner Lösung ist es (10 und spät) oder es ist dunkel. Also bei dunkel ist der Zweig wahr.
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

MandelHL

#65
Danke Dir. Das ist wie Punktrechnung vor Strichrechnung.

elsif (ReadingsNum('Wetterstation','Helligkeit',0) <= 240 or $hour >= 19 and ReadingsNum('Markise','pct',99) == 10 )\

Das heißt, das ist von den Klammern her falsch?

https://perldoc.perl.org/perlop#Operator-Precedence-and-Associativity
Das sehe ich mir mal an. Danke.

Otto123

#66
Zitat von: MandelHL am 11 Juni 2021, 13:08:05
Das heißt, das ist von den Klammern her falsch?
Ja mMn schon. Da sind ja keine für die Operatoren :)
Als ganz grobe Regel für den Hinterkopf: Bei Mischung aus and und or muss man nachdenken und den or Teil meistens einklammern  ;)
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

MandelHL

elsif (ReadingsNum(('Wetterstation','Helligkeit',0) <= 240 or $hour >= 19) && ReadingsNum('Markise','pct',99) == 10 )\

Dann würde ich denken, dass es so richtig ist. Ich habe jetzt "and" durch && ersetzt.

So dürfte das passen, oder?

Beta-User

Zitat von: MandelHL am 11 Juni 2021, 13:46:03
Dann würde ich denken, dass es so richtig ist. Ich habe jetzt "and" durch && ersetzt.
Ist etwas besser, aber:
Zitat von: Otto123 am 11 Juni 2021, 13:24:19
Als ganz grobe Regel für den Hinterkopf: Bei Mischung aus and und or muss man nachdenken und den or Teil meistens einklammern  ;)
Noch eine "grobe Regel" als Ergänzung:
Immer "&&" statt "and" bzw. "||" statt "or" (und kein "not", dafür "!"). Der "Text" ist zwar einfacher zu lesen, aber wenn man (unbeabsichtigt) mischt, kommen uU. komische Ergebnisse raus...

So eine "knackige" Erkläung bekommt man dafür nicht so recht, aber ggf. mal das hier nach http://perlcritic.com/ einfügen und mit mind. "stern" analysieren lassen:
if ($a > $b and $c < $d && $e < $f) {
};

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

Otto123

Zitat von: MandelHL am 11 Juni 2021, 13:46:03
Dann würde ich denken, dass es so richtig ist. Ich habe jetzt "and" durch && ersetzt.
Na jetzt habe ich was gemacht  ;D
Du hast zusätzlich eine Klammer um or gemacht, damit passt das auf alle Fälle - aber wie Beta-User sagt: nicht mischen, das erhöht die Komplexität :)
Also entweder durchgängig die Worte nehmen and or not oder besser durchgängig die Zeichen && || !
Für mich fühlen sich die Worte geschmeidiger an - aber ich weiß die Empfehlung ist anders ;)
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

Beta-User

Zitat von: Otto123 am 11 Juni 2021, 14:12:33
Für mich fühlen sich die Worte geschmeidiger an
...kann ich nachvollziehen, ich war auch mal "unless"-fanboy ;D ...
Aber spätestens, wenn man erfolgreich zwei oder drei Bedingungen in unless reingebastelt hat, stellt man dann mit ziemlicher Sicherheit dann "irgendwann" später fest, dass man was ergänzen muss, aber dass da ja eine "oder"-Negation drin ist, und hat definitiv keinen Plan mehr davon, was das ganze denn eigentlich sollte....?!?
Kurz: es ist unwartbar!
(Ich habe da noch ein ganz spezielles "unless" in einem fremden Modul im Kopf, von dem ich beim gemeinsamen Überarbeiten ausdrücklich die Finger gelassen habe, weil ich schlicht bis auf den heutige Tag nicht mit letzter Genauigkeit verstehe, was da warum (nicht) passieren soll; dem Maintainer ging es ähnlich...).

Ergo: Raus (!) mit "and", "or" "not" und "unless" wo es einem vor die Flinte läuft... Ist auf die Dauer einfacher, wenn man sich mal dran gewöhnt hat.
(Dasselbe gilt übrigens für "zu viele" Klammern: Wenn eine (logische) Klammer irgendwo steht, sollte sie eine Bedeutung haben).

Just my2ct.
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

MandelHL

Ich bekomme leider eine Fehlrmeldug, mit der ich nichts anzufangen weiß

Auf
elsif (ReadingsNum(('Wetterstation','Helligkeit',0) <= 240 || $hour >= 19) && ReadingsNum('Markise','pct',99) == 10 )\
bekomme ich die Meldung
Not enough arguments for main::ReadingsNum at (eval 37805) line 4, near "19) "

Welches Argument fehl denn da?

Beta-User

Zitat von: MandelHL am 11 Juni 2021, 16:13:14
Ich bekomme leider eine Fehlrmeldug, mit der ich nichts anzufangen weiß
Du solltest einen Editor mit "syntax-highlighting" (wie codemirror für FHEMWEB) verwenden, dann ist das Klammern zählen bzw. erkennen, was zu was gehört deutlich einfacher:

Zitat
elsif (ReadingsNum(('Wetterstation','Helligkeit',0) <= 240 || $hour >= 19) && ReadingsNum('Markise','pct',99) == 10 )\
Du bist m.E. beim "Verteilen"  Verrutscht:
elsif ( ( ReadingsNum('Wetterstation','Helligkeit',0) <= 240 || $hour >= 19 ) && ReadingsNum('Markise','pct',99) == 10 )\
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

MandelHL

Hallo mal wieder,

das mit dem Aus- und Einfahren der Markise bei bestimmter Temperatur oder bestimmter Helligkeit klappt super.

Nun würde ich mir noch gerne eine E-Mail schicken lassen, wenn die Windstärke 9 bft bzw. 75 km/h erreicht.

Die Beiträge #61, #62 und #63 fassen zusammen, wie die Programmierung derzeit aussieht.

Ich weiß jetzt allerdings nicht, wo und wie ich die Programmierung für die E-Mail bei Erreichen der genannten Windstärke programmiert werden muss.
Das Wie würde ich aus der obengenannten Programmierung ableiten. Aber über das Wo bin ich mir nicht bewusst.

Danke für Eure Hilfe,
Mandel

MadMax-FHEM

Zitat von: MandelHL am 18 August 2021, 10:14:15
Hallo mal wieder,

das mit dem Aus- und Einfahren der Markise bei bestimmter Temperatur oder bestimmter Helligkeit klappt super.

Nun würde ich mir noch gerne eine E-Mail schicken lassen, wenn die Windstärke 9 bft bzw. 75 km/h erreicht.

Die Beiträge #61, #62 und #63 fassen zusammen, wie die Programmierung derzeit aussieht.

Ich weiß jetzt allerdings nicht, wo und wie ich die Programmierung für die E-Mail bei Erreichen der genannten Windstärke programmiert werden muss.
Das Wie würde ich aus der obengenannten Programmierung ableiten. Aber über das Wo bin ich mir nicht bewusst.

Danke für Eure Hilfe,
Mandel

Wäre deutlich einfacher du würdest ein aktuelles list posten...
...ansonsten müssen wir zusammensuchen (mit der Gefahr es doch anders "zusammenzubauen" wie du es tatsächlich hast)... :-\

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)