WHILE-Schleife in FHEM realisieren

Begonnen von Arek, 05 März 2014, 13:55:51

Vorheriges Thema - Nächstes Thema

Arek

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

justme1968

dafür ist das das modul THRESHOLD da.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

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)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

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

betateilchen

Aktueller Spielstand in der Partie notify vs. threshold = 2:1 :P
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Arek

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)

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

auch *lach*

Hey arek, beschäftige Dich bitte mal damit, was in fhem der Begriff "event" bedeutet. Dann dürfte Dir vieles klarer werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

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.

Arek

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

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.

betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dirk

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

betateilchen

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...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!