Hallo zusammen,
ich möchte, wenn ein Reading des Geräts A einen bestimmten Wert (zB "schalten") ein Gerät B einschalten aber nur solange Gerät A diesen Wert hat bzw bis er ihn nicht mehr hat. Andere Werte des Readings dürfen keinen Einfluss auf Gerät B haben. Dafür wäre meines Erachtens eine While-Schleife am besten geeignet, jedoch habe ich gelesen, dass While-Schleifen in FHEM nicht funktionieren würden, weil FHEM singlethreaded ist.
Gibt es dafür eine saubere Lösung?
Gruß Arek
dafür ist das das modul THRESHOLD da.
gruss
andre
fhem Standardfunktionalität.
Wenn Gerät A den Zustand "schalten" annimmt, wird ein Event ausgelöst.
Wenn Gerät A einen anderen Zustand als "schalten" annimmt, wird wieder/auch ein Event ausgelöst.
Die Lösung für Deine Aufgabe nennt sich notify.
Damit triggerst Du auf einen auftretenden event und kannst dann in der Ausführung prüfen, was am Gerät "A" passiert ist.
@andre: lass doch die Leute erstmal die Grundprinzipien verstehen 8)
Hallo Arek,
Dafür reicht ein einfache Notify mit einem dahintergeschaltetem if aus.
So in etwa:
define <name> notify <Gerät_A:regex> {\
if (ReadingsVal("Gerät_A", "Reading_des_Gerät_A", '') eq "schalten") {\
fhem("set Gerät_B ein");;\
} else {
fhem("set Gerät_B aus");;\
}
Gruß
Dirk
Aktueller Spielstand in der Partie notify vs. threshold = 2:1 :P
Notify reicht eben nicht aus, denn ein anderer Wert würde Gerät B ausschalten, aber Gerät B soll nicht auf andere Werte reagieren, sondern nur auf "schalten" und so lange bis der Wert nicht mehr besteht.
Zitat von: betateilchen am 05 März 2014, 14:07:45
Wenn Gerät A den Zustand "schalten" annimmt, wird ein Event ausgelöst.
Wenn Gerät A einen anderen Zustand als "schalten" annimmt, wird wieder/auch ein Event ausgelöst.
Es soll aber kein Event ausgelöst werden, wenn Gerät A einen anderen Zustand annimmt, sondern nur wenn vorher "schalten" angenommen wurde.
Sinn der Sache:
Ich habe HM-TC-IT-WM-W-EU Wandthermostate mit Schaltaktoren für die Fußbodenheizung in Betrieb. Die Wandthermostate habe eine Boost-Funktion. Bei Betätigung schaltet der Modus auf den Wert "Boost" und behält ihn für eine eingestellte Zeit. Leider funktioniert diese Funktion seitens HM nicht mit Schaltaktoren. Ich möchte sie aber trotzdem nutzen, denn wenn meine Freundin kalte Füße hat, kann sie durch einmaliges Betätigen der Taste dafür sorgen, dass der Boden aufgewärmt wird ohne den ganzen Raum aufzuheizen. Mit einem notify würde nun bei jedem Wechsel des Modus (manu oder auto) den Schaltaktor betätigen. Hier fehlt der Trigger (boost).
Threshold funktioniert doch nur mit numerischen Werten (Temperatur, Luftfeuchtigkeit)
Lach
auch *lach*
Hey arek, beschäftige Dich bitte mal damit, was in fhem der Begriff "event" bedeutet. Dann dürfte Dir vieles klarer werden.
Zitat von: arek1912 am 05 März 2014, 14:37:55
Notify reicht eben nicht aus, denn ein anderer Wert würde Gerät B ausschalten, aber Gerät B soll nicht auf andere Werte reagieren, sondern nur auf "schalten" und so lange bis der Wert nicht mehr besteht.
Was für einen Wert willst du denn nun Auswerten? Unten sprichst du von "Reading"
"mein" Notify unten reagiert durch das if genau auf ein bestimmtes Reading
ZitatEs soll aber kein Event ausgelöst werden, wenn Gerät A einen anderen Zustand annimmt, sondern nur wenn vorher "schalten" angenommen wurde.
Du kannst dir dafür auch eigene Readings als "Hilfsvariable" setzen und zusätzlich im if auswerten.
Readings für mode sind: auto,manu,boost,party
Wenn mode=boost soll Aktor geschaltet werden bis mode nicht mehr den Wert hat. Mit einer einfachen If-Else Struktur sollte es nicht funktionieren, da die Else Struktur immer ausgeführt würde, wenn notify eine Änderung des readings erkennt (zB von auto zu manu).
zu einem bei einem Homematic Regler gibt es immer auch einen boost-Dauer. Du weisst also schon bei Starten des boost (=event 1), wann sich der Zustand SPÄTESTENS wieder ändert (=event 2). Und wenn der mode sich vorher ändert, bekommt fhem das auch mit ( = event 3)
Du kannst also JEDE Änderung abfangen. Mit einem notify. Punkt.
Zitat von: Arek am 05 März 2014, 15:14:51
Wenn mode=boost soll Aktor geschaltet werden bis mode nicht mehr den Wert hat. Mit einer einfachen If-Else Struktur sollte es nicht funktionieren, da die Else Struktur immer ausgeführt würde, wenn notify eine Änderung des readings erkennt (zB von auto zu manu).
Daher der Vorschlag eines Readings als "Hilfsvariable". Das kannst du setzen wenn mode = "boost" und nur wenn das gesetzt ist führst du für jeden anderen Wert des Readings deine Aktion aus. Das Hilvsreading musst du dann aber wieder zurück setzen.
Zitat von: Dirk am 05 März 2014, 15:21:50
Daher der Vorschlag eines Readings als "Hilfsvariable".
Das Spiel können wir auch zu dritt spielen. Notify und threshold hatten wir ja schon, ich werfe jetzt mal die structure in den Raum. Eine structure mit einem einzigen Element wäre automatisch genau die Hilfsvariable :)
Zitat von: betateilchen am 05 März 2014, 15:24:35
Eine structure mit einem einzigen Element wäre automatisch genau die Hilfsvariable :)
Du kannst auch noch ein Dummy benutzen :)
Ja, aber die structure hat gegnüber dem dummy den Vorteil, dass sie sich selbst zurücksetzt.
Mir fallen auch noch userreading und stateFormat ein...
Ich glaube, sein Hauptproblem ist, das er nicht versteht, das FHEM Eventgesteuert. Und er muss ja auch nur bei jedem Event auf Zustände Prüfen (wie auch immer).
Ob er es jetzt mit 1 oder mehreren "Events" erledigt ... das ist ein anderes Thema ;o)
Zitat von: Wernieman am 05 März 2014, 15:40:08
Ich glaube, sein Hauptproblem ist, das er nicht versteht, das FHEM Eventgesteuert
das hab ich doch ganz am Anfang schon gesagt - und massiven Widerspruch geerntet 8)
nicht von MIR! 8)
Bin doch immer Unschuldig ;D
Außerdem hast Du es etwas "verklausuliert" ... ich wollte es einfach nur mal auf den Punkt bringen.
Zitat von: Wernieman am 05 März 2014, 15:44:03Außerdem hast Du es etwas "verklausuliert
was ist denn daran verklausuliert?
Zitat von: betateilchen am 05 März 2014, 14:43:33
beschäftige Dich bitte mal damit, was in fhem der Begriff "event" bedeutet. Dann dürfte Dir vieles klarer werden.
Ups ... hatte Deinen "ersten" Beitrag damit gemeint!
Zitat von: Wernieman am 05 März 2014, 15:40:08
Ich glaube, sein Hauptproblem ist, das er nicht versteht, das FHEM Eventgesteuert. Und er muss ja auch nur bei jedem Event auf Zustände Prüfen (wie auch immer).
Ob er es jetzt mit 1 oder mehreren "Events" erledigt ... das ist ein anderes Thema ;o)
Ich weiß wie FHEM funktioniert...
Mein Problem war die Umsetzung, aber Dirk hat mir einen für mich nachvollziehbaren Tipp gegeben:
if (ReadingsVal("Gerät_A", "Reading_des_Gerät_A", '') eq "boost") {\
fhem("set Gerät_B ein");;\
fhem("set Hilfreading ein");;\
} elsif ((ReadingsVal("Gerät_A", "Reading_des_Gerät_A", '') ne "boost") and (ReadingsVal("Hilfsreading", "state", '') eq "on") {\
fhem("set Gerät_B aus");;\
fhem("set Hilfreading aus");;\
So ungefähr?
ZitatSo ungefähr?
Fast. Mach aus
fhem("set Hilfreading <wert>")
noch ein
fhem("setreading Gerät_A Hilfreading <wert>")
Dann sollte es passen
Alles klar und danke dir