Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Invers

Vielen Dank. Ich werde das ausprobieren.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Otto

Hallo,
ein tolles Modul!

Ich habe meine Rollos umgestellt, aber auch sehr viele Bedingungen vor:

der einfache code ist der:
define di_Rollo_WZ_mitte DOIF ([Bewegungsmelder1:brightness]>110 and [07:00-07:45|12345] or [08:30|7]) (set Rollo_WZ_mitte:FILTER=level!=100 on) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [17:00-22:00]|01234) (set Rollo_WZ_mitte:FILTER=level!=0 off) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [20:00-22:30]|56) (set Rollo_WZ_mitte:FILTER=level!=0 off)

Jetzt sollen noch für Sommer und Winter unterschiedliche Zeiten gelten und brightness auch für den Teil or [08:30|7]

Sollte man das alles in eine DOIF oder aufteilen in mehrere

Gruß Otto
Gruss Otto

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

docker - homematic

Damian

Zitat von: Otto am 11 September 2014, 20:24:22
Hallo,
ein tolles Modul!

Ich habe meine Rollos umgestellt, aber auch sehr viele Bedingungen vor:

der einfache code ist der:
define di_Rollo_WZ_mitte DOIF ([Bewegungsmelder1:brightness]>110 and [07:00-07:45|12345] or [08:30|7]) (set Rollo_WZ_mitte:FILTER=level!=100 on) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [17:00-22:00]|01234) (set Rollo_WZ_mitte:FILTER=level!=0 off) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [20:00-22:30]|56) (set Rollo_WZ_mitte:FILTER=level!=0 off)

Jetzt sollen noch für Sommer und Winter unterschiedliche Zeiten gelten und brightness auch für den Teil or [08:30|7]

Sollte man das alles in eine DOIF oder aufteilen in mehrere

Gruß Otto

Um unnötiges Schalten zu Vermeiden, sollte alles in ein Modul und dann nach Möglichkeit nur ein on- und ein off-Kommando.

so sieht z. B. meine Definition aus:

([Helligkeit] eq "on" and [06:25-08:00|8]) or [09:00|7])
  ((set R_W_S,R_W_W[1-3] on))
DOELSEIF ([Helligkeit] eq "off")
  ((set R_W_S,R_W_W[1-3] off))


Wenn du sehr unterschiedliche Definitionen für Winter bzw. Sommer haben möchtest, dann kannst du auch zwei Module definieren und je nach Jahreszeit mit disable zwischen beiden switchen oder ein Sommer/Winter-Flag mit abfragen. Aber das muss jeder für sich entscheiden.

Gruß

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

maxritti

Hallo zusammen,


ich hätte da mal eine Frage zum DOIF.
Und zwar steuere ich meine Rollos anhand des Ertrags meiner Photovoltaikanlage. Ich glaube das habe ich hier schon mal geschrieben :)

Heute sagte man mir, dass der Rollo ein wenig verrückt gespielt hat.

Zum Status:

Folgendes DOIF habe ich definiert um einen Rollo an der Terrasse zu steuern:

Internals:
   CFGFN
   DEF        ([mySL:Pac_avg] >= 2100) (set EG_wz_RO_TerrasseRechts 0) DOELSEIF ([mySL:Pac_avg] >= 1501) (set EG_wz_RO_TerrasseRechts 30) DOELSE (set EG_wz_RO_TerrasseRechts 100)
   NAME       di_CheckSonneRechts
   NR         145
   NTFY_ORDER 50-di_CheckSonneRechts
   STATE      cmd_3
   TYPE       DOIF
   CHANGETIME:
   Helper:
     Dblog:
       Cmd_event:
         Mydblog:
           TIME       1410874307.33259
           VALUE      mySL
       Cmd_nr:
         Mydblog:
           TIME       1410874307.33259
           VALUE      3
       State:
         Mydblog:
           TIME       1410874307.33259
           VALUE      cmd_3
   Readings:
     2014-09-16 15:31:47   cmd_event       mySL
     2014-09-16 15:31:47   cmd_nr          3
     2014-09-16 16:46:50   e_mySL_Pac_avg  1191
     2014-09-16 15:31:47   state           cmd_3
     2014-09-16 09:44:31   wait_timer      no timer
   Condition:
     0          ReadingValDoIf('mySL','Pac_avg','') >= 2100
     1          ReadingValDoIf('mySL','Pac_avg','') >= 1501
   Devices:
     0           mySL
     1           mySL
     all         mySL
   Do:
     0          set EG_wz_RO_TerrasseRechts 0
     1          set EG_wz_RO_TerrasseRechts 30
     2          set EG_wz_RO_TerrasseRechts 100
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
   Readings:
     0           mySL:Pac_avg
     1           mySL:Pac_avg
     all         mySL:Pac_avg
   State:
Attributes:
   group      doif
   verbose    5
   wait       900

   
Mit dem wait 900 wollte ich vermeiden, dass der Rollo Achterbahn fährt, sofern der Ertrag der PV Anlage meinen Schwellwert erreicht hat und dort drüber oder drunter rutscht.

Aber irgendwie scheint das mMn heute so gegen 15:30 nicht funktioniert zu haben.
Das grüne ist die Stellung des Rollos. Die rosa Linien sind die Schwellwerte, wo der Rollo entsprechend runter oder hoch gehen soll.

Hat dazu jemand eine Idee, warum der Rollo da um 15:30 so oft hoch und runter gegangen ist?

Eigentlich hätte ich erwartet, dass der um 15:28 hoch fährt, weil Pac_avg unter den Schwellwert gerutscht ist. Dann sollte erst mal dank wait 900 15 Minuten Ruhe sein. Stattdessen geht der um 15:30 wieder runter um dann um 15:33 wieder hoch zu fahren.

Brockmann

Zitat von: maxritti am 16 September 2014, 16:52:42
Hat dazu jemand eine Idee, warum der Rollo da um 15:30 so oft hoch und runter gegangen ist?
Eigentlich hätte ich erwartet, dass der um 15:28 hoch fährt, weil Pac_avg unter den Schwellwert gerutscht ist. Dann sollte erst mal dank wait 900 15 Minuten Ruhe sein. Stattdessen geht der um 15:30 wieder runter um dann um 15:33 wieder hoch zu fahren.
Gegen 15:30 hat der Wert um 1500 oszilliert, also war mal Bedingung 2 und mal Bedingung 3 erfüllt.
Das wait-Attribut hast Du aber nur für Bedingung 1 gesetzt. Wenn das bei allen drei Bedingungen nur verzögert reagieren soll, müsste das
attr <...> wait 900:900:900
lauten.

maxritti

Cool, das geht ja mal wieder schneller hier als die Polizei erlaubt :)
Das erklärt natürlich einiges. Ich werde es direkt mal umstellen.

Danke Dir.

maxritti

Ich noch mal. Ich kann zwar gerade das Problem von gestern nicht prüfen, da die Sonne momentan dauerhaft scheint.
Aber mir ist gerade noch was anderes aufgefallen.

Irgendwie habe ich den Eindruck, dass das wait 900:900:900 die Schaltvorgänge um 15 Minuten verzögert.
So sollte es ja nicht sein. Es sollte so sein, wenn Pac_avg einen Wert X überschritten hat, den Rollo auf Wert Y zu setzen.
Und dann erst mal 15 Minuten nichts zu machen, egal was mit Pac_avg passiert.

So um 10:47 hat Pac_avg den Wert 1500 erreicht, aber der Rollo geht erst um 11:02 runter.

Brockmann

Zitat von: maxritti am 17 September 2014, 12:00:37
Irgendwie habe ich den Eindruck, dass das wait 900:900:900 die Schaltvorgänge um 15 Minuten verzögert.
Ja, exakt das macht das wait-Attribut. Es wartet beim Eintreten einer Bedingung, ob diese über einen Zeitraum x unverändert wahr bleibt und führt erst dann die Aktion aus. So ist das wait-Attribut (derzeit) definiert. Damian hat aber schon angedeutet, das wait-Attribut in der nächsten Version zu erweitern, so dass auch das möglich sein sollte, was Du meinst, also Aktion sofort ausführen, aber dann erstmal x Sekunden nichts mehr tun.

Damian

#473
Zitat von: Brockmann am 17 September 2014, 12:08:59
Ja, exakt das macht das wait-Attribut. Es wartet beim Eintreten einer Bedingung, ob diese über einen Zeitraum x unverändert wahr bleibt und führt erst dann die Aktion aus. So ist das wait-Attribut (derzeit) definiert. Damian hat aber schon angedeutet, das wait-Attribut in der nächsten Version zu erweitern, so dass auch das möglich sein sollte, was Du meinst, also Aktion sofort ausführen, aber dann erstmal x Sekunden nichts mehr tun.

Es werden sich im Laufe der Zeit sicherlich noch einige Erweiterungen für das DOIF-Modul ergeben. Man kann aber jetzt schon für das Herunterfahren wait auf 0 Minuten und für das Hochfahren auf z. B. auf 30 Minuten stellen. Allerdings hat sich gerade bei der Beschattung bei mir auch das Abwarten vor dem ersten Schalten bewährt. Denn, wenn die Sonne alle 14 Minuten für ein Paar Minuten den Zustand wechselt, dann bewegt sich bei mir gar nichts - was ich gut finde.

Gruß

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

maxritti

Irgendwie drehe ich mich gerade ein wenig im Kreis.

Vom Prinzip klappt das mit dem wait und dem verzögertem Schalten nach Werteänderung ja ganz gut.
Ich habe zur Terrasse ein Fenster, wo das ganz gut klappt.
Nun gibt es aber noch eine Terassentür wo ein Türkontakt dran. D.h., der Rollo soll sich nur bewegen, wenn die Türe zu ist.
Angenommen der Rollo an der Tür ist wegen hoher Sonne ganz zugefahren, jemand macht die Tür auf, dann wäre es schick, wenn der Rollo direkt hochfahren würde.
Dank wait wartet der aber noch die eingestellte Zeit.

Oder aber der Rollo ist oben und die Türe auf. Jetzt macht man die Türe zu, dann sollte der bei Sonneneinstrahlung runter fahren. Aber auch da passiert logischerweise dank wait erst mal nichts.

Bekommt man das mit dem DOIF überhaupt hin, was ich mir da gedacht habe?

Brockmann

Zitat von: maxritti am 17 September 2014, 17:15:39
Bekommt man das mit dem DOIF überhaupt hin, was ich mir da gedacht habe?
Du könntest zusätzliche Bedingungen für den Türkontakt einfügen und bei denen die wait-Zeit auf 0 setzen. Du müsstest dabei auf die Reihenfolge achten, so dass die Bedingungen, die durch Änderungen am Türstatus getriggert werden, vor den allgemeineren Bedingungen stehen. Ist schon etwas komplizierter, sollte aber machbar sein.

knochenmuehle

([05:15-23:59] and [geofancy:currLoc_Susie] eq "home" or [geofancy:currLoc_Arthur]  eq "home") (set He_Zirkulationspumpe on) DOELSE (set He_Zirkulationspumpe off)

warum wird hier nicht zu den Anfangs- bzw Endzeiten ein bzw.  ausgeschaltet? Zwischendurch wenn keiner zu Hause ist, wird geschaltet.

Andreas

Damian

Zitat von: knochenmuehle am 19 September 2014, 17:45:38
([05:15-23:59] and [geofancy:currLoc_Susie] eq "home" or [geofancy:currLoc_Arthur]  eq "home") (set He_Zirkulationspumpe on) DOELSE (set He_Zirkulationspumpe off)

warum wird hier nicht zu den Anfangs- bzw Endzeiten ein bzw.  ausgeschaltet? Zwischendurch wenn keiner zu Hause ist, wird geschaltet.

Andreas

da war wohl Arthur zuhause ;)

dann eher:

([05:15-23:59] and ([geofancy:currLoc_Susie] eq "home" or [geofancy:currLoc_Arthur]  eq "home")) (set He_Zirkulationspumpe on) DOELSE (set He_Zirkulationspumpe off)


Gruß

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

knochenmuehle


Damian

Zitat von: knochenmuehle am 20 September 2014, 08:24:31
Danke, jetzt läufts!

Nur mal zur Info für Nicht-Programmierer: "and" hat höhere Priorität als "or", wenn also zuerst die or-Verknüpfung ausgewertet werden soll und dann die and-Verknüpfung, dann muss man die or-Verknüpfung klammern. Das hat aber weniger etwas mit DOIF zu tun, sondern gilt für Perl und andere Programmiersprachen und entspricht der Regel "Punkt- (and) vor Strich(or) -Rechnung", denn mathematisch gesehen, steckt nichts anderes dahinter.

Gruß

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