Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Brockmann

#150
Zitat von: Damian am 03 Juli 2014, 22:50:39
Parser ist eine Wissenschaft für sich.
Ich kümmere mich z. Zt. nur um "eckige Klammern" und schaue, ob zu jeder Klammer auf eine Klammer zu existiert, und kümmer mich in der Abfrage sonst um nichts :)
Danke für die Erklärung.

Und für DOIF und IF sowieso. Mancher Purist mag das für überflüssig halten, weil es ja auch vorher schon "irgendwie" ging.
Ich finde aber, dass beide wesentlich intuitivere und lesbarere Definitionen ermöglichen, weil man dabei seltener die FHEM-Ebene verlassen muss und sich auch deutlich weniger mit Semikolon, geschweiften Klammern und Anführungszeichen rumschlagen muss. Gerade der typische FHEM-Anwender, der nur hin und wieder mal etwas an seiner Konfiguration ergänzen oder optimieren möchte, ohne sich jedes Mal wieder in die Feinheiten der Syntax(en) einzuarbeiten, kann davon profitieren. Und auch der einfachere Zugriff auf Readings ist für mich ein Riesenfortschritt. :)

Das Konzept von DOIF muss man vielleicht noch etwas besser vermitteln, wie man hier im Thread sieht. Aber durch die Ergänzung von Zeitintervallen dürfte es auch nochmal stringenter und intuitiver werden.

Also, mach gerne weiter so!  ;)

Jens_B

Zitat von: Brockmann am 04 Juli 2014, 10:02:53
Das [16:01] sorgt dafür, dass das DOIF um 16:01 einmal getriggert wird.
Das deckt den Fall ab, dass ss_weather vor 16:00 Uhr erfolgt. Dann würde das DOIF sonst nämlich gar nicht schalten.

Danke für die Erläuterung :-).
Ich verstehe das DOIF Modul immer besser. @Damian danke für das DOIF; ich glaube es nimmt mir ein paar Dinge ab und erleichtert mir ein paar Definitionen
(Zur Zeit hab ich ja nur einige Rollladen und 3 Beleuchtungen, ich muß mich jetzt mal um die Oberfläche kümmern, damit er WAF erhöht wird ;)).

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

MaJu

Ich finde das DOIF sehr schön, habe es auch getestet, damit kann ich einiges zusammenfassen. Dabei fiel mir ein "Fehler" auf, leider eine zeitliche Verzögerung die unschön ist.

Bei mir sind fürs Licht Stromstoßschalter in der Wohnung verbaut (also 12V-Taster als Lichtschalter, im Schaltkasten sind dann Stromstoßschalter, die bei einem 12V-Stromstoß über den daran angeschlossenen Umsetzer die Lampe ein/aus schalten.
Am Raspberry habe ich ein PiFace. Zum Schalten des Lichts muss das Relais für den Stromstoßschalter zur Simulation eines Tasterdrucks nur kurz anziehen und gleich danach wieder loslassen. Ansonsten brummt es mächtig im Schrank, weil der Stromstoßschalter einen Dauerstrom bekommt.

Um das Licht zu schalten, wird über ein anderes DOIF "set Licht_[...] schalten" gesendet, welches mit dem nachfolgenden DOIF umgesetzt werden soll:
([Licht_Flur] eq "schalten") (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)
DOELSEIF
([Licht_Kammer] eq "schalten") (set PIFACE 1 1,sleep 0.01,set PIFACE 1 0)
DOELSEIF
([Licht_Kueche] eq "schalten") (set PIFACE 2 1,sleep 0.01,set PIFACE 2 0)
DOELSEIF
([Licht_Bad] eq "schalten") (set PIFACE 3 1,sleep 0.01,set PIFACE 3 0)
DOELSEIF
([Licht_Katzenzimmer] eq "schalten") (set PIFACE 4 1,sleep 0.01,set PIFACE 4 0)
DOELSEIF
([Licht_Schlafzimmer] eq "schalten") (set PIFACE 5 1,sleep 0.01,set PIFACE 5 0)


Also: Relais anziehen, 0,01 Sekunde warten (ich habe es anfangs mit 0,5 (bzw. 0.5) probiert und hatte das gleiche Ergebnis) und anschließend das Relais loslassen.

Das Problem: Das Relais wird mehr als nur 0,01 Sekunden gehalten, sondern etwa 5 Sekunden. Vorher hatte ich für jede Lampe ein eigenes Notify, da hatte es halbwegs funktioniert (es war nie mehr als 1 Sekunde).
Und: Wenn ich den alle Lampen schalte und deshalb für alle Lampen der Schaltbefehl kommt, dann werden nacheinander erst alle Relais angezogen, kurz gewartet, und danach nacheinander wieder losgelassen. Die Relais sind damit ca. 10 Sekunden unter Strom. Die Stromstoßschalter quittieren das mit einem kräftigen Brummton, der nicht gesund klingt.

Warum kommen hier so lange Pausen rein bzw. wie bekomme ich die raus?
Erlebnisreiche Grüße aus Leipzig!

Brockmann

Zitat von: MaJu am 04 Juli 2014, 13:59:47
Warum kommen hier so lange Pausen rein bzw. wie bekomme ich die raus?
Kann es sein, dass Du bei Deinem bisherigen notify-Konstrukt das Perl-sleep verwendet hast? Das unterscheidet sich, weil es FHEM für den gewählten Zeitraum komplett anhält und dann weiterlaufen lässt.
Davon wird zwar allgemein abgeraten, aber in diesem speziellen Fall könnte es sinnvoll sein.
Das FHEM-Perl ist non-blocking, also läuft FHEM während des Sleep weiter und arbeitet seine Queue weiter ab. Davon hängt es dann ab, wann das DOIF wieder an der Reihe ist, denke ich.
Und wenn das DOIF gleich für mehrere Lichter getriggert wird, könnte das den beschriebenen Effekt erklären.

RoBra81

Hallo,

ich habe mein Treppenhauslicht mit notifies gebaut und wollte das nun testweise mit DOIF umbauen. Dabei bin ich auf folgendes Problem gestoßen: Sobald der Bewegungsmelder eine Bewegung erkennt, wird das Licht eingeschaltet und ein at für das Ausschalten definiert, sofern dieses noch nicht existiert anderenfalls wird es modifiziert. Und hier liegt mein Problem: zur Definition des DOIF exisitiert das notify natürlich noch nicht, was bei der Definition von DOIF einen Fehler generiert und kein DOIF definiert.

Gibt es hierfür eine Lösung?

Ronny

Damian

Zitat von: RoBra81 am 04 Juli 2014, 15:16:47
Hallo,

ich habe mein Treppenhauslicht mit notifies gebaut und wollte das nun testweise mit DOIF umbauen. Dabei bin ich auf folgendes Problem gestoßen: Sobald der Bewegungsmelder eine Bewegung erkennt, wird das Licht eingeschaltet und ein at für das Ausschalten definiert, sofern dieses noch nicht existiert anderenfalls wird es modifiziert. Und hier liegt mein Problem: zur Definition des DOIF exisitiert das notify natürlich noch nicht, was bei der Definition von DOIF einen Fehler generiert und kein DOIF definiert.

Gibt es hierfür eine Lösung?

Ronny

Wie sieht dein Konstrukt genau aus? Das kann man evtl. anders definieren.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: MaJu am 04 Juli 2014, 13:59:47

Das Problem: Das Relais wird mehr als nur 0,01 Sekunden gehalten, sondern etwa 5 Sekunden. Vorher hatte ich für jede Lampe ein eigenes Notify, da hatte es halbwegs funktioniert (es war nie mehr als 1 Sekunde).
Und: Wenn ich den alle Lampen schalte und deshalb für alle Lampen der Schaltbefehl kommt, dann werden nacheinander erst alle Relais angezogen, kurz gewartet, und danach nacheinander wieder losgelassen. Die Relais sind damit ca. 10 Sekunden unter Strom. Die Stromstoßschalter quittieren das mit einem kräftigen Brummton, der nicht gesund klingt.

Warum kommen hier so lange Pausen rein bzw. wie bekomme ich die raus?

Schau zunächst wie lange die Pausen sind, wenn du in der Kommandozeile Folgendes eingibst:

IF (1) (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

RoBra81

Hier mein notify:


define OG.hf.BM.Treppe.not.inaktiv notify OG.hf.BM.Treppe.*51200.* IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
  define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
  attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
  IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
  (
    modify OG.hf.LI.Treppe.at.off +00:00:05
  )
)
;
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
  define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
  attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
  IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
  (
    modify OG.hf.LI.Schuhschrank.at.off +00:00:10
  )
)


... und folgendes DOIF wollte ich daraus machen:


define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200")
(
  IF (!$defs{'OG.hf.LI.Treppe.at.off'})
  (
    define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
    attr OG.hf.LI.Treppe.at.off room Hausflur
  )
  ELSE
  (
    IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
    (
      modify OG.hf.LI.Treppe.at.off +00:00:05
    )
  )
  ,
  IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
  (
    define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
    attr OG.hf.LI.Schuhschrank.at.off room Hausflur
  )
  ELSE
  (
    IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
    (
      modify OG.hf.LI.Schuhschrank.at.off +00:00:10
    )
  )
)
DOELSEIF ([OG.hf.BM.Treppe:sensor] eq "0")
(
  set Test an
)

Damian

Zitat von: RoBra81 am 04 Juli 2014, 15:44:36
Hier mein notify:


define OG.hf.BM.Treppe.not.inaktiv notify OG.hf.BM.Treppe.*51200.* IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
  define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
  attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
  IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
  (
    modify OG.hf.LI.Treppe.at.off +00:00:05
  )
)
;
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
  define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
  attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
  IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
  (
    modify OG.hf.LI.Schuhschrank.at.off +00:00:10
  )
)


... und folgendes DOIF wollte ich daraus machen:


define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200")
(
  IF (!$defs{'OG.hf.LI.Treppe.at.off'})
  (
    define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
    attr OG.hf.LI.Treppe.at.off room Hausflur
  )
  ELSE
  (
    IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
    (
      modify OG.hf.LI.Treppe.at.off +00:00:05
    )
  )
  ,
  IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
  (
    define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
    attr OG.hf.LI.Schuhschrank.at.off room Hausflur
  )
  ELSE
  (
    IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
    (
      modify OG.hf.LI.Schuhschrank.at.off +00:00:10
    )
  )
)
DOELSEIF ([OG.hf.BM.Treppe:sensor] eq "0")
(
  set Test an
)


Ist schon lustig zu sehen, was ihr da so alles programmiert. So hast du mit DOIF kaum einen Vorteil gegenüber einem notify. Wann liefert bei dir der Sensor 51200 und wann 0?  So etwas sollte man eigentlich als Zweizeiler hinbekommen.

Gruß

Damian


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Brockmann

Zitat von: RoBra81 am 04 Juli 2014, 15:44:36
Hier mein notify:
Wenn ich das Szenario richtig verstehe, sind die Schalter direkt mit dem Bewegungsmelder gepeered, werden also unabhängig von FHEM direkt geschaltet, wenn der Bewegungsmelder anspringt?
Und das notify/DOIF soll dafür sorgen, dass sie nach x Minuten ohne weiteren Kontakt des Bewegungsmelders wieder ausgehen?

Ohne die genauen Details zu kennen: Könnte man nicht ganz einfach bei jedem Auslösen des Bewegungsmelders ein set OG.hf.LI.Treppe on-for-timer 300 hinterschicken. Dann kümmert sich FHEM selbst um das AT, was nach fünf Minuten ohne weitere Ereignisse abschaltet. Das wäre dann die ganz simple Lösung - unabhängig von Notify oder DOIF.

Bombjack

Meine DOIF Jalousie-Steuerung kam an den sonnigen Tagen gestern und heute erstmals erfolgreich zum Einsatz. Allerdings tauchen die Events immer doppelt im Log auf, jemand eine Idee warum?

Mein DOIF:

define DI_sz_Jalousie DOIF ([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and [sz_Jalousie] eq "on" and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] eq "teilweise wolkig")) (set sz_Jalousie 30) DOELSEIF ([myTwilight:compasspoint] eq "west" and [sz_Jalousie] eq "30") (set sz_Jalousie on)

Log von gestern heute:

2014.07.03 10:45:27 3: CUL_HM set sz_Jalousie 30
2014.07.03 10:45:27 3: CUL_HM set sz_Jalousie 30
2014.07.03 18:21:04 3: CUL_HM set sz_Jalousie on
2014.07.03 18:21:04 3: CUL_HM set sz_Jalousie on
2014.07.03 21:43:56 3: CUL_HM set sz_Jalousie off
2014.07.04 05:45:00 3: CUL_HM set sz_Jalousie on
2014.07.04 10:36:14 3: CUL_HM set sz_Jalousie 30
2014.07.04 10:36:14 3: CUL_HM set sz_Jalousie 30

Puschel74

#161
Hallo,

ZitatAllerdings tauchen die Events immer doppelt im Log auf, jemand eine Idee warum?
Nein, nicht immer.

Das passiert aber wenn von den Bedingungen mehr als eine triggert (und das ist zwangsläufig der Fall) und dann auch noch wahr ist.

Schau dir mal deine Liste an:
Zitat([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and [sz_Jalousie] eq "on" and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] eq "teilweise wolkig"))
Ich vermute das wäre in einem normalen notify das regexp auf das das notify triggern soll.

Grüße

Edith: Grad gesehen - and [sz_Jalousie] eq "on"
Das müsste eigentlich dazu führen das das DOIF nur einmal die Jalousie auf 30 setzt  :o
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

RoBra81

Zitat von: Damian am 04 Juli 2014, 16:20:07
Ist schon lustig zu sehen, was ihr da so alles programmiert. So hast du mit DOIF kaum einen Vorteil gegenüber einem notify. Wann liefert bei dir der Sensor 51200 und wann 0?  So etwas sollte man eigentlich als Zweizeiler hinbekommen.

Gruß

Damian

Hat mich auch eine Menge Gehirnschmalz gekostet  :)

Ich kann ja mal das ganze Szenario posten, damit es verständlicher wird: Ich habe im Flur zwei Lampen, einen Bewegungsmelder und zwei Taster. Wenn der Bewegungsmelder eine Bewegung erkennt (Sensor 0) wird über ein Notify (das habe ich hier nicht gepostet) das Licht in Abhängigkeit von der Dämmerung angemacht und gegebenenfalls vorhandene Timer (at) die das Licht ausschalten würden gelöscht, wenn diese eine Restzeit kleiner 10 bzw. 5 Sekunden haben (beide Lampen haben einen eigenen Ausschalttimer, da ich diese unterschiedlich lange anlassen möchte). Erkennt der Bewegungsmelder keine Bewegung mehr wird mit dem gezeigten notify ein Timer (at) definiert, um die Lichter auszuschalten. Dies passiert aber ebenfalls nur, wenn noch kein Timer definiert ist oder dieser eine Restzeit kleiner 10 bzw. 5 Sekunden hat. Hintergrund ist, dass ich über die Taster  ebenfalls das Licht anschalten und Timer zum abschalten definiere, die für 1 bzw. 30 Minuten laufen (kurzer oder langer Tastendruck).

Der Grund, dass ich hierfür diese ausgefallenen ("lustigen") notifies nutze ist, dass ich Homematic-Devices (CUL) nutze, die kein on-for-timer unterstützen...

Bombjack

ZitatNein, nicht immer.

Das einfache on und off morgens und abends wird über ein at getriggert, hätte ich weglassen sollen. Die DOIF Events tagsüber kommen bisher immer doppelt.

ZitatDas passiert aber wenn von den Bedingungen mehr als eine triggert (und das ist zwangsläufig der Fall) und dann auch noch wahr ist.

Ich glaube jetzt habe ich es verstanden. Das Auf und Zufahren wird durch MyTwilight angetriggert und anschliessend löst die Positionsveränderung selbst erneut einen Trigger aus, da ich die Position im DOIF mit abfrage - richtig? Hmm aber wie könnte ich das vermeiden? Wenn ich das weglasse gibt es auch mehrfach Schaltbefehle, da die MyTwilight Aktualisierungsintervalle recht kurz sind.

MaJu

Zitat von: Damian am 04 Juli 2014, 15:41:02
Schau zunächst wie lange die Pausen sind, wenn du in der Kommandozeile Folgendes eingibst:
IF (1) (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)

Hallo Damian, danke für die Hilfe. Dies ergibt die gleiche Verzögerung. Gefühlt etwas schneller geht "set PIFACE 0 1;sleep 0.01;set PIFACE 0 0", das kann aber auch täuschen.

Ich hatte gestern nicht nur bei den jetzigen 2 Lampen von notify auf DOIF umgestellt, sondern auch weitere Lampen und damit weitere DOIFs angelegt. Eventuell wurde das System dadurch allgemein etwas träge.

Da in der Abarbeit scheinbar ohnehin eine Pause gemacht wird, habe ich den sleep-Befehl komplett rausgenommen. Und komisch, jetzt werden bei den Lampen nacheinander die Relais einzeln vollständig angesprochen, also erst ein Relais angezogen und losgelassen, danach das nächste angezogen und losgelassen und so weiter.
Damit kann ich sehr gut leben.
Erlebnisreiche Grüße aus Leipzig!