Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

MaJu

Dann kannst du es auch zusammenfassen und kürzer schreiben:
([dunkel] eq "on" and ([geofency:currLoc_Mitch] eq "Garten" or [CUL_HM_FB_Markus_light:?to] or [CUL_HM_FB_Simone_light:?to] or [FS21_5b090:?toggle] or [Klingel1:?on])) (set CUL_HM_Gartenlicht on)
Beachte, dass das Licht IMMER eingeschalten ist/wird, wenn bei Dunkelheit dein Geafancy-Status "Garten" ist. Du musst also für "zu Hause" einen anderen Geofancy-Status haben. Und: Soll das Licht auch angehen, wenn du aus dem Haus raus in den Garten gehst? Das wäre aktuell der Fall. Wie geht das Licht dann aber aus?
Erlebnisreiche Grüße aus Leipzig!

Mitch

Zitat von: MaJu am 14 Januar 2015, 10:29:53
Dann kannst du es auch zusammenfassen und kürzer schreiben:
([dunkel] eq "on" and ([geofency:currLoc_Mitch] eq "Garten" or [CUL_HM_FB_Markus_light:?to] or [CUL_HM_FB_Simone_light:?to] or [FS21_5b090:?toggle] or [Klingel1:?on])) (set CUL_HM_Gartenlicht on)

mit nur OR hat es nicht funktioniert, deswegen die Verknüfungen in Klammern.

Zitat von: MaJu am 14 Januar 2015, 10:29:53
Beachte, dass das Licht IMMER eingeschalten ist/wird, wenn bei Dunkelheit dein Geafancy-Status "Garten" ist. Du musst also für "zu Hause" einen anderen Geofancy-Status haben. Und: Soll das Licht auch angehen, wenn du aus dem Haus raus in den Garten gehst? Das wäre aktuell der Fall. Wie geht das Licht dann aber aus?

Der Geofancy Status "Garten" ist auch wirklich nur, wenn ich mit Handy am gartentor stehe (dort ist ein iBeacon), das passt also so.

Das Licht geht automatisch aus. Der entsprechende HM Aktor ist so programmiert, dass er bei einem on immer einen on-for-timer schaltet.
FHEM im Proxmox Container

MaJu

Zitat von: Mitch am 14 Januar 2015, 11:56:51
mit nur OR hat es nicht funktioniert, deswegen die Verknüfungen in Klammern.
Hast du OR auch mit den kompletten Bedingungen getestet? Denn die auf der Vorseite genannte Version war ohne Bedingungen, du hattest dort einfach Devices aufgeführt ohne festzulegen, was geprüft werden soll.

Um die Definitionen übersichtlich zu halten, habe ich bei mir auch eine solche verschachtelte AND-und-OR-Verbindung bei einem DOIF im Einsatz und es funktioniert (nach Anlaufschwierigkeiten).

Das gute ist, dass man in einer DOIF-Definition mit Zeilenumbrüchen arbeiten kann, um es übersichtlich zu halten. Wenn man später nochmal ran muss, guckt es sich einfach leichter, wenn jedes DOELSEIF etc. einer Leerzeile folgt.
Erlebnisreiche Grüße aus Leipzig!

moonsorrox

ich habe mich jetzt auch mal an ein weiteres DOIF gemacht und habe schon ein paar Funktionen integriert, nur so ganz funktioniert es noch nicht und ich weiß nicht wie weiter.

Folgendes soll es können/machen:
Dummy welches mir sagt steuere das DOIF
1. FHEM - automatisch zu sunset/sunreise siehe Definition
2. Beschattung - habe ich in einem 2. DOIF gelöst nach dem Bsp. aus der commandref
3. Aus - Rollladen fährt nicht, bekomme ich irgendwie nicht hin

Code zu FHEM und Aus:
Ich meine es geht alles bis auf das ich die "Aus" Funktion nicht hinbekomme, immer wenn ich das Dummy umschalte, fährt der Rollladen hoch, oder versucht es..!
Was mache ich da falsch mit der Funktion "Aus" oder besser wie löse ich es anders..?

([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(6000,"07:30","08:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
DOELSEIF ([{sunset("CIVIL",2200,"17:30","22:30")}]) (set RollladenSZ down 30)
DOELSE (set RollladenSZ on)
DOELSEIF([RolloSZmodus] eq "Aus")(set RollladenSZ off)


Code zu Beschattung:
funktioniert soweit, später kommt mein Aussensensor da rein, MeinWetter war nur zum testen
([RolloSZmodus] eq "Beschattung" and ([MeinWetter:temperature] > 24 and [07:00-{sunset_abs()}])) (set RollladenSZ down 80) DOELSE (set RollladenSZ up 40)


Nachtschicht - noch gar nicht integriert, dass möchte ich in ein eigenes DOIF schreiben, weil ich mehrere Fahrten zu verschiedenen Zeiten und verschiedene Prozente haben möchte (kommt danach ran)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Otto123

kann sein ich durchblicke die Logik nicht auf die Schnelle, aber kommt er überhaupt in das letzte DOELSEIF wenn der Eintritt RolloSZmodus auf "FHEM" steht?
Entweder "FHEM" oder "Aus" -- oder???
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

der-Lolo

@moonsorrox:
Ich glaube nicht das ein DOELSE vor dem letztem DOELSEIF stehen darf

Damian

Zitat von: der-Lolo am 15 Januar 2015, 07:19:30
@moonsorrox:
Ich glaube nicht das ein DOELSE vor dem letztem DOELSEIF stehen darf

Das glaube ich auch nicht. Zitat aus der Commandref:

+ Es können beliebig viele DOELSEIF-Angaben gemacht werden, sie sind, wie DOELSE am Ende der Kette, optional

Abgesehen davon vermisse ich den Ausführungsteil von der ersten Bedingung.

Gruß

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

Otto123

Zitat von: Damian am 15 Januar 2015, 10:21:12
Das glaube ich auch nicht. Zitat aus der Commandref:

+ Es können beliebig viele DOELSEIF-Angaben gemacht werden, sie sind, wie DOELSE am Ende der Kette, optional

Abgesehen davon vermisse ich den Ausführungsteil von der ersten Bedingung.

Gruß

Damian
Das glaube ich auch, ich würde die Bedingung umstellen, so das erstmal was gemacht wird und nicht das nichts gemacht wird. Vielleicht kann man auch die erste Anweisung als leer Klammer setzen. Ich zitiere mal die Commandref:

define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)

Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch das Device beinhalten.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

moonsorrox

Zitat von: Damian am 15 Januar 2015, 10:21:12
Abgesehen davon vermisse ich den Ausführungsteil von der ersten Bedingung.

welche Bedingung meintest du..? die 1. ist doch FHEM oder habe ich das jetzt falsch verstanden

Ich war aber nicht untätig und habe nun umgebaut und denke jetzt habe ich es richtig:
Zwei Test mit jetziger Uhrzeit habe ich gemacht

([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(0,"07:30","18:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
    (set RollladenSZ up 30)
DOELSEIF ( [RolloSZmodus] eq "FHEM" and ([{sunset("CIVIL",14000,"20:30","22:20")}|0123456]))
    (set RollladenSZ down 30)
DOELSEIF([RolloSZmodus] eq "Aus")()


hier könnte ich eigentlich als weiteres DOELSEIF auch die Beschattung dazu bauen, richtig..?
In dem ich einfach dieses drunter setze:
DOELSEIF([RolloSZmodus] eq "Beschattung" and ([MeinWetter:temperature] > 24 and [07:00-{sunset_abs()}])) (set RollladenSZ down 80) DOELSE (set RollladenSZ up 40)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

MaJu

Das DOELSEIF([RolloSZmodus] eq "Aus")() kannst du weglassen. Warum prüfst du, wenn du dann doch nichts ausführen lässt?

Bei deinem vorherigen Beispiel war am Anfang auch nur eine Prüfung, aber nichts was zu tun ist, sondern gleich danach ein DOELSEIF.

Mit dem letzten DOELSE wird IMMER auf 40% gesetzt, wenn keines der anderen Bedingungen wahr ist.

Im Prinzip ist DOIF wie if-then-else bei Excel. Nur dass man hier if-then;if-then;if-then;if-then setzen kann und auch else wegbleiben kann.
Erlebnisreiche Grüße aus Leipzig!

moonsorrox

Zitat von: MaJu am 15 Januar 2015, 15:46:23
Das DOELSEIF([RolloSZmodus] eq "Aus")() kannst du weglassen. Warum prüfst du, wenn du dann doch nichts ausführen lässt?
recht haste, klar wenn keiner der drei FHEM, Beschattung oder Nachtschicht wahr ist macht er auch nichts  ;) Danke
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Otto123

Ich meinte dies (siehe Zitat) da wird in der ersten Zeile viel getestet aber nichts gemacht.
Zitat von: moonsorrox am 14 Januar 2015, 19:19:14
([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(6000,"07:30","08:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
DOELSEIF ([{sunset("CIVIL",2200,"17:30","22:30")}]) (set RollladenSZ down 30)
DOELSE (set RollladenSZ on)
DOELSEIF([RolloSZmodus] eq "Aus")(set RollladenSZ off)


Jetzt hast Du umgestellt und nach dem Test wird das Rollo auf 30 gesetzt.  :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MaJu


@moonsorrox
Bitte schau dir nochmal den Aufbau von DOIF an. So wie du schreibst, hast du das Prinzip noch nicht ganz erfasst.

In die erste Runde Klammer schreibst du eine Bedingung, in die zweite Runde Klammer schreibst du den Befehl der ausgeführt werden soll wenn diese Bedingung wahr ist.

(Nur) Wenn die erste Bedingung nicht wahr ist, kannst du mit DOELSEIF auf eine zweite Bedingung prüfen lassen und wieder einen Befehl geben was zu tun ist wenn die Bedingung erfüllt ist.

Wenn die erste und die zweite Bedingung nicht erfüllt sind, kannst du auf eine dritte prüfen lassen und so weiter.
Und ganz zum Schluss kannst du FHEM mit DOELSE sagen was es tun soll wenn keine der Bedingungen erfüllt ist. Das musst du aber nicht.

Es macht einfach absolut keinen Sinn zu prüfen ob RolloSZmodus auf AUS ist, wenn keine Aufgabe gestellt wird insofern die Bedingung erfüllt wurde.
Erlebnisreiche Grüße aus Leipzig!

moonsorrox

#1138
Das mit den Fahrten in Prozent ist gewollt, der Rollladen soll früh morgens nicht ganz hoch fahren, weil die Sonne da so ungünstig steht...!  ;)

Zitat von: MaJu am 15 Januar 2015, 17:45:41
@moonsorrox
Bitte schau dir nochmal den Aufbau von DOIF an. So wie du schreibst, hast du das Prinzip noch nicht ganz erfasst.
ja das ist auch nicht so einfach, ein wenig habe ich mir aus schon vorhandene DOIF abgeschaut, aber begreifen ist die andere Sache ;)

Zitat von: MaJu am 15 Januar 2015, 17:45:41
(Nur) Wenn die erste Bedingung nicht wahr ist, kannst du mit DOELSEIF auf eine zweite Bedingung prüfen lassen und wieder einen Befehl geben was zu tun ist wenn die Bedingung erfüllt ist.
soweit ich das verstanden habe prüfe ich ja in der ersten Bedingung auf Wochentag und in der zweiten eben ob Wochenende ist, richtig..?
Das funktioniert, eigentlich habe das eben nochmal mit aktueller Zeit probiert

Zitat von: MaJu am 15 Januar 2015, 17:45:41
Wenn die erste und die zweite Bedingung nicht erfüllt sind, kannst du auf eine dritte prüfen lassen und so weiter.
Und ganz zum Schluss kannst du FHEM mit DOELSE sagen was es tun soll wenn keine der Bedingungen erfüllt ist. Das musst du aber nicht.
aber DOELSE wird nicht zwingend am Ende gebraucht, oder.? das habe ich ja bei dem neuen umgestellten Code nicht.
Habe noch mal in der commandref geschaut da ist das auch nicht immer der Fall und in meinen funktionierenden DOIF auch nicht.

Zitat von: MaJu am 15 Januar 2015, 17:45:41
Es macht einfach absolut keinen Sinn zu prüfen ob RolloSZmodus auf AUS ist, wenn keine Aufgabe gestellt wird insofern die Bedingung erfüllt wurde.
ja das ist mir klar, das kann ich  raus nehmen, weil ich erkläre es mal so wie ich es verstanden habe...

Wenn das Dummy auf "Aus" steht und das DOIF fragt ab und findet kein "FHEM" dann sind die Bedingungen nicht wahr und es passiert auch nichts, also wird nichts geschaltet, richtig..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Spartacus

Hallo,
ich möchte hier erreichen, dass outdoorlight immer mindestens 30min eingeschaltet wird, bzw. nicht einschaltet, wenn zwischen Sonnenuntergang und fixer Abschaltzeit weniger als 30min liegen.

(
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30|56] or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:00")}-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-02:00] and [?hl.01.Feiertag] eq "Silvester")
(set outdoorlight on)
DOELSE (set outdoorlight off)


Das funktioniert so halbwegs mit diesem Code, hat aber einen Haken. Im Sommer ist es um 21:30 teilweise noch zu hell für eine Gartenbeleuchtung und es macht eigentlich keinen Sinn das Licht einzuschalten; hier wird aber spätestens um 21:30 bzw. 21:00 eingeschaltet, egal wie dunkel es ist. Da die Abschaltzeit immer fix sein soll, kann ich nicht mit "wait" arbeiten; geht bei Zeiten m.E. sowieso nicht.

Wichtig ist, dass ich aber eine Mindestbrenndauer erreichen will, die von der Ausschaltzeit abzuziehen ist. Der Trigger zum Einschalten kommt dann, wenn "Ausschaltzeit"-"Mindestbrenndauer"<= "Sonnenuntergang(dunkel)" ist.

Hat jemand eine Idee, wie man das am Besten umsetzt?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R