Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: Puschel74 am 05 Juli 2014, 17:56:37
Hallo,

ah, das meinst du.

Ja das stimmt.
Daher habe ich das in meinen Codes bereits abgefangen  ;)

Grüße

genau, und deswegen programmiert sich jeder seine if-Abfragen, obwohl man für solch einen Standardfall meiner Meinung nach, mit einem Einzeiler auskommen müsste.

Gruß

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

Puschel74

Hallo,

das
ZitatDaher habe ich das in meinen Codes bereits abgefangen
war mal wieder etwas zu kurz gedacht von mir.

Ich hab die Meldezeiten der Bewegungsmelder auf die on-for-timer-Zeiten der Aktoren abgestimmt.
Wenn der Aktor on-for-timer 120 Sekunden hat dann meldet der Bewegungsmelder frühestens nach 115 Sekunden wieder wenn er noch eine Bewegung erkennt.
Ich hab auch Aktoren die on-for-timer 1920 Sekunden haben (FS20 kann nur so "krumme" Werte wenn es länger geht) - der Badezimmerventilator ist einer davon.
Da meldet der Bewegungsmelder auch nur alle x Sekunden (ich muss nochmal nachschauen wann genau) eine erkannte Bewegung.

Ob das mit allen Bewegungsmelder ght weiß ich nicht und denke ich mal nicht.
Aber FS20-BM können dahingehend eingestellt werden.
Ich denke mal das HM-BW das auch können.
Das würde ja auch im Hinblick auf die Batterielebensdauer Sinn machen nicht alle a Sekunden eine erkannte Bewegung zu melden (wobei a die kürzeste Zeit im BM ist).

Von daher wäre es auch besser den BM dahingehend zu programmieren und du müstest dir wieder keinen Kopf machen wie du das im DOIF abfangen kannst  ;)

Grüße
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.

Damian

#182
Zitat von: Puschel74 am 05 Juli 2014, 21:45:31
Hallo,

daswar mal wieder etwas zu kurz gedacht von mir.

Ich hab die Meldezeiten der Bewegungsmelder auf die on-for-timer-Zeiten der Aktoren abgestimmt.
Wenn der Aktor on-for-timer 120 Sekunden hat dann meldet der Bewegungsmelder frühestens nach 115 Sekunden wieder wenn er noch eine Bewegung erkennt.
Ich hab auch Aktoren die on-for-timer 1920 Sekunden haben (FS20 kann nur so "krumme" Werte wenn es länger geht) - der Badezimmerventilator ist einer davon.
Da meldet der Bewegungsmelder auch nur alle x Sekunden (ich muss nochmal nachschauen wann genau) eine erkannte Bewegung.

Ob das mit allen Bewegungsmelder ght weiß ich nicht und denke ich mal nicht.
Aber FS20-BM können dahingehend eingestellt werden.
Ich denke mal das HM-BW das auch können.
Das würde ja auch im Hinblick auf die Batterielebensdauer Sinn machen nicht alle a Sekunden eine erkannte Bewegung zu melden (wobei a die kürzeste Zeit im BM ist).

Von daher wäre es auch besser den BM dahingehend zu programmieren und du müstest dir wieder keinen Kopf machen wie du das im DOIF abfangen kannst  ;)

Grüße

ja, der Teufel steckt oft im Detail. Dennoch möchte ich mal aufzeigen, wie man so etwas jetzt schon mit DOIF ohne eigene Timer-Verwaltung realisieren kann.

Fall 1 Bewegungsmelder sendet on bei Bewegung und kurz danach wieder off. Hier kommt man mit zwei Zeilen aus.

define DI_BM DOIF ([BM] eq "on)(set Licht on)DOELSE(set Licht off)
attr DI_BM wait 0:10


Das Licht geht an und bleibt an, solange Bewegungsmelder innerhalb von 10 Sekunden immer wieder on liefert, ansonsten geht es nach 10 Sekunden aus (das Licht wird immer nur einmal per on bzw. off geschaltet).

Fall 2  Bewegungsmelder sendet nur on bei Bewegung

define bm_dum dummy

define DI_bm_dum DOIF ([BM])(set bm_dum on,set bm_dum off)
attr DI_bm_dum do always

define DI_BM DOIF ([bm_dum] eq "on")(set Licht on)DOELSE(set Licht off)
attr DI_BM wait 0:10


Hier habe ich einen dummy dazwischen geklemmt, der mir das fehlende "off" liefert.

Es sind zwar keine Einzeiler, ich denke aber einfacher als selbst mit Timern bzw. mit at, if, sleep etc. zu hantieren.

Gruß

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

RoBra81

Zitat von: Damian am 05 Juli 2014, 17:26:15
Du hast meine Frage nicht genau beantwortet, wann 51200 kommt und wann 0. Ich gehe mal davon aus, dass bei Bewegung 51200 kommt, dann würde mit:

define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200") (set OG.hf.LI.Treppe on-for-timer 5)
attr OG.hf.LI.Xxx.DI do always


dein Treppenlicht bei erster Bewegung angehen und bei jeder weiteren Bewegung innerhalb von 5 Sekunden, um weitere 5 Sekunden verlängert und wenn keine Bewegung innerhalb von 5 Sekunden kommt wieder ausgehen.

Das war´s.

Das war's leider nicht. In einem längeren Beitrag (http://forum.fhem.de/index.php/topic,23833.msg181415.html#msg181415) habe ich mein Szenario beschrieben (und auch was 51200 und 0 bedeutet). Mit deinem Einzeiler hätte ich zwei Probleme: Zum einen würde das Licht nur einmal angehen und nach 5 Sekunden aus, da mein Bewegungsmelder bei Bewegung ein Relais schließt und erst bei "Keine Bewegung" wieder öffnet. Zum anderen möchte ich ja wie in meinem Beitrag beschrieben auch noch die Taster mit einbinden, welche die Lampen für x Minuten anschalten sollen - wenn ich dann z.B. nach einem on-for-timer 300 durch den Taster ein on-for-timer 5 durch den Bewegungsmelder schicke, geht das Licht aus...

Daher bin ich wieder bei meinen 6 mehr oder weniger umfangreichen notifies (Bewegungsmelder ein/aus, 2 Taster lang/kurz), die ich eben testweise durch 1 DOIF ersetzen wollte...

Ronny

RoBra81

Zitat von: Puschel74 am 05 Juli 2014, 16:48:50
Melde dich doch einfach mal dort und frag Dirk (das ist glaube ich der Modulautor) ob er on-/off-for-timer in das Modul einbauen könnte.
...
Die Modulautoren müssen nur danach gefragt/darauf hingewiesen/darum gebeten werden.

Die Frage an Dirk hat schon jemand im April gestellt und leider bis jetzt keine Antwort bekommen :(

RoBra81

Zitat von: krikan am 05 Juli 2014, 16:55:18
on-for-timer geht bereits jetzt, wenn Du den Umweg über readingsProxy gehst http://www.fhemwiki.de/wiki/ReadingsProxy .

Ich habe die readingsProxy jetzt mal ausprobiert und es funktioniert - danke für den Tipp. ABER: Es bringt mir leider nichts: Ich kann zwar nun on-for-timer für meine Homematic-Wired Geräte nutzen, bekomme aber nicht heraus, wie lange es noch dauert, bis das Gerät abgeschaltet wird. Und damit funktioniert meine Bewegungsmelder-Schalter-Logik nicht mehr...

Brockmann

Zitat von: RoBra81 am 06 Juli 2014, 14:17:20
Daher bin ich wieder bei meinen 6 mehr oder weniger umfangreichen notifies (Bewegungsmelder ein/aus, 2 Taster lang/kurz), die ich eben testweise durch 1 DOIF ersetzen wollte...
Mal unabhängig von DOIF oder notify, warum trennst Du nicht die beiden Fälle:

Fall 1: Das Licht wird per Taster für x Minuten angeschaltet
Fall 2: Das Licht für per Bewegungsmelder für y Sekunden angeschaltet

Bau Dir für beide Fälle jeweils eine komplett eigenständige Lösung. Wenn Fall 1 eintritt, deaktivierst Du die Behandlung von Fall 2 für die Dauer von Fall 1 per disable-Attribut oder indem Du solange die entsprechenden Events wegfilterst. Dann kann der Bewegungsmelder auslösen so viel er will, das brauchst Du gar nicht zu beachten. Fall 2 wird dann y Sekunden vor Ablauf der x Minuten wieder aktiviert und kann so notfalls nahtlos übernehmen, damit das Licht auch im Fall der Fälle nicht ausgeht.

Klingt auf den ersten Blick vielleicht komplizierter, ist in der praktischen Umsetzung aber vermutlich einfacher.

satprofi

Jetzt hab ich dein modul geschnallt. Danke dafür!
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

krikan

ZitatIch kann zwar nun on-for-timer für meine Homematic-Wired Geräte nutzen, bekomme aber nicht heraus, wie lange es noch dauert, bis das Gerät abgeschaltet wird.
Könnest Dir mal on-till anschauen. Das entstehende "at deviceName+_till" lässt sich auswerten und mit modify anpassen.

Damian

#189
Zitat von: RoBra81 am 06 Juli 2014, 14:17:20
da mein Bewegungsmelder bei Bewegung ein Relais schließt und erst bei "Keine Bewegung" wieder öffnet

genau das hast du vorher aber nicht beschrieben, aber sei es drum.
Nur um einen notify gegen DOIF auszutauschen und weiterhin mit IF-Abfragen zu arbeiten, lohnt der Aufwand meiner Meinung nach nicht - da würde ich bei deiner bisherigen Konstruktion bleiben, da sie offenbar zuverlässig funktioniert.

Dennoch auch für dich ein Vorschlag, wie man die Wait-Timer in DOIF nutzen könnte:



define schalter_d dummy

define di_Schalter DOIF ([Schalter] =~/short/ )
  (set schalter_d short, set schalter_d short_off)
DOELSEIF ([Schalter] =~/long/)
(set schalter_d long, set schalter_d long_off)

attr di_Schalter do always

define di_Licht DOIF ([schalter_d] eq "short" or [schalter_d] eq "long")
  (set Licht on)
DOELSEIF ([schalter_d] eq "short_off")
  (set Licht off)
DOELSEIF ([schalter_d] eq "long_off")
  (set Licht off )
DOELSEIF ([BM] eq "on" and [Licht] eq "off")
(set Licht on)
DOELSEIF ([BM] eq "off")
(set Licht off)

attr di_Licht wait 0:60:1800:0:10


Die Peudonamen musst du natürlich deinen entsprechend anpassen.

Gruß

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

cruser1800

Ich habe leider auch ein kleines Problem. DOIF arbeitet leider nicht immer den ersten Teil ab, obwohl die Bedingungen alle Wahr sind. Der zweite Teil DOELSIF wird leider nie abgearbeitet. Die Bedingung ist 1.

([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>65 and [Thermostat_Wohnzimmer:measured-temp]>22 and [002_Fenster_TR] eq "closed" and $hms gt "12:00" and $hms lt "20:30") (set Jalousie_TR 40,set Jalousie_dummy 40,set Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1) (set Jalousie_TR hoch,set Jalousie_dummy hoch,set Verschattung_dummy 0)

Was mache ich falsch?

Danke für die Hilfe

Gruß Lutz

Damian

Zitat von: cruser1800 am 06 Juli 2014, 21:42:56
Ich habe leider auch ein kleines Problem. DOIF arbeitet leider nicht immer den ersten Teil ab, obwohl die Bedingungen alle Wahr sind. Der zweite Teil DOELSIF wird leider nie abgearbeitet. Die Bedingung ist 1.

([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>65 and [Thermostat_Wohnzimmer:measured-temp]>22 and [002_Fenster_TR] eq "closed" and $hms gt "12:00" and $hms lt "20:30") (set Jalousie_TR 40,set Jalousie_dummy 40,set Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1) (set Jalousie_TR hoch,set Jalousie_dummy hoch,set Verschattung_dummy 0)

Was mache ich falsch?

Danke für die Hilfe

Gruß Lutz

Das hatten wir schon mal. Hier scheint eine Rekursion zu sein, die wird von FHEM unterbunden. set Verschattung_dummy 1 im ersten Kommando löst wohl kein Event aus für das zweite Kommando. Das musst du anders realisieren. Da habe ich leider keinen Einfluss drauf.

Gruß

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

der-Lolo

Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1

solltest du dann nicht auf

([Verschattung_dummy]=1

prüfen?

Damian

#193
Version 1.4 im ersten Post.

-status "disabled" eingebaut
-Ein cmd-Status wird nur noch dann für einen nicht existierenden ELSE-Fall gesetzt, wenn es nur den DOIF-Fall gibt. Das grundsätzliche Setzen eines cmd-Status für nicht existierenden ELSE-Fall war ungünstig und machte die Wait-Timer-Steuerung zunichte. Das Beispiel im Post #190 würde z. B. mit Version 1.3 nicht funktionieren.

Gruß

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

satprofi

hallo.
ich habe auch kleines problem wo ich keine lösung finde.
ich schalte die klima ab einen bestimmten wert ein. das klappt auch.
jetzt möchte ich aber , wenn dieser wert bis zu einem anderen wert nicht unterschritten wird die klima weiterlaufen lassen.
wie realisiert man das mit DOIF ?

z.b.  ab 1500W klima on, unter 1000W klima off.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram