FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Arek am 05 März 2014, 13:55:51

Titel: WHILE-Schleife in FHEM realisieren
Beitrag von: Arek am 05 März 2014, 13:55:51
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
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: justme1968 am 05 März 2014, 14:05:35
dafür ist das das modul THRESHOLD da.

gruss
  andre
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 14:07:45
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)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Dirk am 05 März 2014, 14:10:45
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
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 14:37:44
Aktueller Spielstand in der Partie notify vs. threshold = 2:1 :P
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Arek 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.
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)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: justme1968 am 05 März 2014, 14:38:15
Lach
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 14:43:33
auch *lach*

Hey arek, beschäftige Dich bitte mal damit, was in fhem der Begriff "event" bedeutet. Dann dürfte Dir vieles klarer werden.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Dirk am 05 März 2014, 14:55:37
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.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Arek am 05 März 2014, 15:14:51
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).
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 15:18:59
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.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Dirk am 05 März 2014, 15:21:50
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.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 15:24:35
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 :)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Dirk am 05 März 2014, 15:26:44
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 :)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 15:32:32
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...
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag 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)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 15:40:57
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)
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Wernieman am 05 März 2014, 15:44:03
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.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: betateilchen am 05 März 2014, 15:45:50
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.
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Wernieman am 05 März 2014, 15:47:42
Ups ... hatte Deinen "ersten" Beitrag damit gemeint!
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Arek am 05 März 2014, 15:54:32
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?
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Dirk am 05 März 2014, 16:11:16
ZitatSo ungefähr?

Fast. Mach aus fhem("set Hilfreading <wert>") noch ein fhem("setreading Gerät_A Hilfreading <wert>")
Dann sollte es passen
Titel: Antw:WHILE-Schleife in FHEM realisieren
Beitrag von: Arek am 05 März 2014, 16:12:27
Alles klar und danke dir