Morgen,
ich mache gerade meine Ersten Schritte in FHEM und Versuche gerade einen Dummy Schalter zu schalten sobald meine Wetterstation eine Temperatur größer 25 anzeigt. Die Wetterstation gibt mir folgenden Status:
STATE T: 25.2 H: 58
Ich habe auch schon ein Notify angelegt das schalten soll sobald T größer 20 ist:
define DUMMYEIN notify Wetterstation:T:>20 set mySwitch1 on
Was mache ich falsch?
https://wiki.fhem.de/wiki/Notify (https://wiki.fhem.de/wiki/Notify)
Hier ist deine Antwort versteckt. Ziemlich weit unten gibt es Beispiele.
Warum kein DOIF statt notify
Beispiel:
(([10:00-12:00]) and ([Temp_Pool:temperature] < 30) and ([Temp_Solar:temperature] > 30)) (set Pumpenprogramm heizung)
Gesendet von meinem SM-G960F mit Tapatalk
Hallo,
für alle die das gleiche Problem haben, ich habe es mit einem Timer gelöst (ich weiß ist noch ausbaufähig).
Lösung:
define DUMMYEIN WeekdayTimer mySwitch1 78|00:01|on 78|23:59|off (ReadingsVal("MEINGERÄT","temperature",0) >= 20)
Man muss nur beachten das der Timer nicht sofort losrennt. Erst wenn es das nächste mal zutrifft. Bedeutet, jetzt aktiviert beginnt es erst im am nächsten Tag um 00:01 Uhr.
Will man es soft schalten muss der Befehl so aussehen:
define DUMMYEIN WeekdayTimer mySwitch1 78|aktuelleZeit +2|on 78|23:59|off (ReadingsVal("MEINGERÄT","temperature",0) >= 20)
Dann startet er jetzt + 2 Minuten. Man muss jetzt nur noch die Zeiten wieder anpassen.
Zitat von: slako am 26 August 2019, 07:03:09
Hallo,
für alle die das gleiche Problem haben, ich habe es mit einem Timer gelöst (ich weiß ist noch ausbaufähig).
Lösung:
define DUMMYEIN WeekdayTimer mySwitch1 78|00:01|on 78|23:59|off (ReadingsVal("MEINGERÄT","temperature",0) >= 20)
Man muss nur beachten das der Timer nicht sofort losrennt. Erst wenn es das nächste mal zutrifft. Bedeutet, jetzt aktiviert beginnt es erst im am nächsten Tag um 00:01 Uhr.
Will man es soft schalten muss der Befehl so aussehen:
define DUMMYEIN WeekdayTimer mySwitch1 78|aktuelleZeit +2|on 78|23:59|off (ReadingsVal("MEINGERÄT","temperature",0) >= 20)
Dann startet er jetzt + 2 Minuten. Man muss jetzt nur noch die Zeiten wieder anpassen.
Das ist aber nicht sonderlich elegant und sehr statisch, da im Abstand von 24 Stunden die Temperatur ausgewertet wird. Das eigentlich wichtige Ereignis der Temperaturüberschreitung wird hier gar nicht wahrgenommen.
Hab ich hinterher auch gemerkt :P Hast mir aber in meinen anderen Beitrag schon super geholfen ;D
Ne. Ein Anfänger hat eine Idee und weiß nicht warum sie nicht funktioniert. Jetzt lassen wir ihn mal bei der Idee und bringen sie zu Ende.
Zitat von: slako am 25 August 2019, 07:57:19
Die Wetterstation gibt mir folgenden Status:
STATE T: 25.2 H: 58
Vielleicht ist die zum Verständnis wesentliche Information erst mal gar nicht offensichtlich: Viele ereignisbasierte Aktionen, ob durch notify oder DOIF "bearbeitet", richten sich der Einfachheit halber nach dem STATE - das ist hier aber wenig hilfreich. Vielmehr dürfte die Wetterstation zusätzlich readings mit den Namen
temperature und
humidity liefern, deren Werte dann rein numerisch sind und damit besser auszuwerten.
Statt Deines Eingangsbeispiels solltest Du also eher an
define DUMMYEIN notify Wetterstation:temperature >20 set mySwitch1 on
denken.
Nur: Das funktioniert so
nicht, weil ein notify in der Auslösebedingung keine numerische Auswertung vornimmt, sondern nur durch ein Ereignis getriggert wird. Zwar gibt es wie in dem im zweiten Beitrag genannten Wiki-Artikel diese Konstruktion für "alles über 75", aber das ist einfach zu kompliziert.
Die Lösung: Dein Notify reagiert auf jede Temperaturmeldung. Und im Ausführungsteil wird auf den Wert geprüft. Also
define DUMMYEIN notify Wetterstation:temperature IF ([Wetterstation:temperature] > 25) (set mySwitch1 on)
Das sollte jetzt zunächst einmal klappen - allerdings hat es einen gewissen Schönheitsfehler:
Jeder gemeldete Temperaturwert über 25 Grad wird einen Schaltbefehl senden. Im Falle eines LaCrosse-Sensors können das bis zu 12 Befehle in der Minute werden, über Stunden, Tage, ... völlig unnötige Last ...
Stattdessen wäre so etwas wie eine "Zustandswippe" hilfreich - und sowas möchte man ja vermutlich auch erreichen: Bei Temperaturen über 25 Grad wird eingeschaltet, bei Temperaturen unter (sagen wir) 24 Grad wieder aus. Und ganz ohne viele Verrenkungen und Hilfskonstrukte ist Damians DOIF dann eine sehr elegante Lösung:
define di_Temperatursteuerung DOIF ([Wetterstation:temperaure] > 25) (set mySwitch1 on) DOELSEIF ([Wetterstation:temperaure] < 24) (set mySwitch1 off)
Ein DOIF wechselt zwischen den definierten Zuständen, wenn die betreffende Auswertung stimmt. Das heißt: Steigt die Temperatur erstmals über 25 Grad, wird es den ersten "Zweig" einnehmen und den damit verbundenen Schaltbefehl senden. Alle weiteren höheren Temperaturen werden dafür sorgen, dass das DOIF in diesem Zweig bleibt, aber der Schaltbefehl wird nicht erneut ausgeführt.
Sollte der zweite Schaltzweig nicht erwünscht sein, kann man mit ein paar einfachen Zusätzen erreichen, dass das DOIF den Einschaltbefehl wie ein Notify mehrfach sendet, aber die Häufigkeit der Aussendung lässt sich ebenso sehr einfach regeln oder begrenzen (etwa alle 10 Minuten, insgesamt 3x, ...)
Das ist einer der Gründe, warum manche Leute hier ein DOIF für viele Aufgaben geeigneter halten als ein notify ... (Glaubenskriegfrage!)
edit: Das Problem wurde inzwischen in einem anderen Thread gelöst ... deswegen ist es eigentlich immer gut, mit einer Frage in einem Thread zu bleiben.
Aber vielleicht konnte ich erhellen, warum der Wechsel zu DOIF eine gute Idee ist ...
Hallo Pfriemler,
bin begeistert von deiner Antwort :) Besser gehts nicht !!! ;D Hast ja nicht nur mir geholfen sonder auch noch jeden anderen Anfänger ;D ;D ;D ;D ;D ;D