Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Mitch

Nochmal eine Frage dazu:

wenn ich mehrere Bedingungen verketten möchte, wie bekomme ich das hin?
Es soll quasi folgendes gelten:

Wenn SCHALTER=off UND DEVICE1=on ODER SCHALTER=off UND DEVICE2=on ODER ....

Also immer wieder der Schalter, aber immer mit einem anderen Device.

Ich hatte folgendes probiert:

define test DOIF ([SCHALTER] eq "off" and [DEVICE1] eq "on" or [DEVICE2] eq "on"...

und

define test DOIF ([SCHALTER] eq "off" and [DEVICE1] eq "on" or [SCHALTER] eq "off" and [DEVICE2] eq "on" or [SCHALTER] eq "off" and ...

Geht so eine "Verschachtelung" überhaupt in einen DOIF??

Wollte damit eine Vielzahl notifys löschen.
FHEM im Proxmox Container

maxritti

Da musst du mMn einfach ein paar Klammern spendieren:

define test DOIF ([SCHALTER] eq "off" and ([DEVICE1] eq "on" or [DEVICE2] eq "on" or [DEVICE3] eq "on"...))

Spartacus

Hallo,
ich möchte mit einem LangDruck auf einen Taster einen Aktor toggeln. Allerdings soll dieser in der Einschaltzeit begrenzt sein und automatisch abschalten, falls man es vergisst.

([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "off") (define later at +00:05:00 set outdoorlight off, set outdoorlight on)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "on") (delete later, set outdoorlight off)


Soweit geht das auch mit dem "define later", allerdings hat das Ganze einen Haken. Wenn cmd1 ausgeführt wird und das "later" den Aktor abschaltet, bleibt das DOIF im cmd1 stehen. Das heißt, das erneute Einschalten wird nicht getriggert.

Hat jemand einen Tipp, bzw. kann man das auch einfacher lösen, ohne ein "later" zu definieren?

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

Mitch

Zitat von: maxritti am 13 Januar 2015, 17:36:01
Da musst du mMn einfach ein paar Klammern spendieren:

define test DOIF ([SCHALTER] eq "off" and ([DEVICE1] eq "on" or [DEVICE2] eq "on" or [DEVICE3] eq "on"...))

Danke, das war der richtige Hinweis.

Allerdings habe ich noch ein kleines Problem.

Dies ist die DEF:
(([dunkel] eq "on" and [geofency:currLoc_Mitch] =~ "arrived") or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DDB3_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_24BFB1_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DCB2_open]) or ([dunkel] eq "on" and [FS21_5b090]) or ([dunkel] eq "on" and [Klingel1])) (set CUL_HM_Gartenlicht on)

Nun schaltet aber das Gartenlicht auch ein, wenn NUR "dunkel" angeht.
(Zur Info: dunkel wird von sunset/sunrise geschalten.)

Darf doch eigentlich nicht sein? dunkel ist ja immer mit einer zweiten Bedingung mit AND verknüpft?
FHEM im Proxmox Container

maxritti

Mach doch mal ein "list meinDOIF" wenn nur "dunkel" auf "on" ist.

Mitch

gemacht:

Internals:
   CFGFN
   DEF        (([dunkel] eq "on" and [geofency:currLoc_Mitch] =~ "arrived") or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DD4F_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_24BFB5_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DC6A_open]) or ([dunkel] eq "on" and [FS21_5b090]) or ([dunkel] eq "on" and [Klingel1])) (set CUL_HM_Gartenlicht on)
   NAME       Gartenlicht.Activator
   NR         4439
   NTFY_ORDER 50-Gartenlicht.Activator
   STATE      cmd_1
   TYPE       DOIF
   CHANGETIME:
   Readings:
     2015-01-13 18:56:52   cmd_event       dunkel
     2015-01-13 18:56:52   cmd_nr          1
     2015-01-13 18:56:52   e_dunkel_STATE  on
     2015-01-13 18:56:52   state           cmd_1
   Condition:
     0          (InternalDoIf('dunkel','STATE','') eq "on" and ReadingValDoIf('geofency','currLoc_Mitch','') =~ "arrived") or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_26DD4F_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_24BFB5_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_26DC6A_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('FS21_5b090','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('Klingel1','STATE',''))
   Devices:
     0           dunkel geofency CUL_HM_HM_RC_Key4_2_26DD4F_open CUL_HM_HM_RC_Key4_2_24BFB5_open CUL_HM_HM_RC_Key4_2_26DC6A_open FS21_5b090 Klingel1
     all         dunkel geofency CUL_HM_HM_RC_Key4_2_26DD4F_open CUL_HM_HM_RC_Key4_2_24BFB5_open CUL_HM_HM_RC_Key4_2_26DC6A_open FS21_5b090 Klingel1
   Do:
     0          set CUL_HM_Gartenlicht on
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           dunkel:STATE CUL_HM_HM_RC_Key4_2_26DD4F_open:STATE CUL_HM_HM_RC_Key4_2_24BFB5_open:STATE CUL_HM_HM_RC_Key4_2_26DC6A_open:STATE FS21_5b090:STATE Klingel1:STATE
     all         dunkel:STATE CUL_HM_HM_RC_Key4_2_26DD4F_open:STATE CUL_HM_HM_RC_Key4_2_24BFB5_open:STATE CUL_HM_HM_RC_Key4_2_26DC6A_open:STATE FS21_5b090:STATE Klingel1:STATE
   Readings:
     0           geofency:currLoc_Mitch
     all         geofency:currLoc_Mitch
   State:
   Timerfunc:
   Trigger:
Attributes:
   DbLogExclude .*
   do         always
   verbose    0


und jetzt?  :-[
FHEM im Proxmox Container

Brockmann

Zitat von: Mitch am 13 Januar 2015, 18:57:12
und jetzt?  :-[

Jetzt machst Du daraus erstmal:

([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) (set CUL_HM_Gartenlicht on)


Ist das gleiche in kürzer und lesbarer.
Dann hast Du da jede Menge Bedingungen der Form ([CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) ohne einen Vergleich oder ähnliches drin. Die sind doch eigentlich immer wahr, egal was für einen State das Device hat. Was willst Du damit erreichen?

cotecmania

Hallo,

wie kann man denn aus einem Ereignis, das einen String liefert, nur einen bestimmten Teil (Zahl) davon verwenden ?
define DI_StromNOK DOIF ([CUL_EM_1:cum_day] > 10) ...
cum_day liefert "CUM_DAY: 6.542 CUM: 63610.375 COST: 0.00"

Ich habe mit split versucht den Teil2 des strings (6.542) zu extrahieren, bin aber klaeglich gescheitert ...

Folgende regexp wuerde mir die Zahl filtern : (?<=CUM_DAY: )(.*)(?= CUM:)

Wie baue ich das ein ?

Das Beispiel in der commandref (:d) verstehe ich nicht :
ZitatFiltern nach Zahlen
Es soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:
define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)
Gruss
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Mitch

Zitat von: Brockmann am 13 Januar 2015, 20:08:29
Jetzt machst Du daraus erstmal:

([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) (set CUL_HM_Gartenlicht on)


Ist das gleiche in kürzer und lesbarer.
Dann hast Du da jede Menge Bedingungen der Form ([CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) ohne einen Vergleich oder ähnliches drin. Die sind doch eigentlich immer wahr, egal was für einen State das Device hat. Was willst Du damit erreichen?

Im Prinzip will ich folgendes machen:

die eine Bedingung muss sein, dass dunkel an ist
wenn dann enweder einer der Fernbedienungen (CUL_HM_HM_RC_Key4_2_xxxxxx_open) gedrückt wird ODER mein Handy am Eingang ODER der Schalter FS21_xxx ODER die Klingel gedrückt wird
soll das Licht angehen.

Ich möchte also jedes Event von den FBs, der Klingel und dem Schalter abfangen.

Gerade beim Schalter kann on, off, dim up, dim down oder toggle kommen (je nach dem, wer wie lange und wie oft drückt)
FHEM im Proxmox Container

Damian

Zitat von: cotecmania am 13 Januar 2015, 20:25:33
Hallo,

wie kann man denn aus einem Ereignis, das einen String liefert, nur einen bestimmten Teil (Zahl) davon verwenden ?
define DI_StromNOK DOIF ([CUL_EM_1:cum_day] > 10) ...
cum_day liefert "CUM_DAY: 6.542 CUM: 63610.375 COST: 0.00"

Ich habe mit split versucht den Teil2 des strings (6.542) zu extrahieren, bin aber klaeglich gescheitert ...

Folgende regexp wuerde mir die Zahl filtern : (?<=CUM_DAY: )(.*)(?= CUM:)

Wie baue ich das ein ?

Das Beispiel in der commandref (:d) verstehe ich nicht :Gruss

define DI_StromNOK DOIF ([CUL_EM_1:cum_day:d] > 10) ...

Hast du bestimmt noch nicht probiert, sonst hättest du die regexp-Überlegung sparen können.

:d entspricht (-?\d+(\.\d+)?)

Was das bedeutet wirst du schon selbst herausfinden, da du dich mit regexp offensichtlich schon beschäftigt hast  ;) .

Gruß

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

Damian

Zitat von: Spartacus am 13 Januar 2015, 17:36:48
Hallo,
ich möchte mit einem LangDruck auf einen Taster einen Aktor toggeln. Allerdings soll dieser in der Einschaltzeit begrenzt sein und automatisch abschalten, falls man es vergisst.

([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "off") (define later at +00:05:00 set outdoorlight off, set outdoorlight on)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "on") (delete later, set outdoorlight off)


Soweit geht das auch mit dem "define later", allerdings hat das Ganze einen Haken. Wenn cmd1 ausgeführt wird und das "later" den Aktor abschaltet, bleibt das DOIF im cmd1 stehen. Das heißt, das erneute Einschalten wird nicht getriggert.

Hat jemand einen Tipp, bzw. kann man das auch einfacher lösen, ohne ein "later" zu definieren?

Christian

Was spricht gegen do always in diesem Fall?

Die Abfrage:

[outdoorlight] eq "off" bzw. [outdoorlight] eq "on"

würde ich mit [?outdoorlight] ... definieren (wegen unnötiger Selbsttriggerung)

Was spricht gegen on-for-timer statt at?

Gruß

Damian


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

Spartacus

Hallo Damian,
vielen Dank für Deine Antwort. Das "do always" hatte ich eigentlich eingebaut, aber offenbar das Attribut nicht gespeichert! Es geht jetzt!

Ich toggle testweise das Dummy device "outdoorlight" und damit funzt ein "on-for-timer" nicht, da der state bei eingeschaltetem Device nicht "on" , sondern "on-for-timer 60" ist.

([sKurzerLangerDruck_UL:?partial_1] and [?outdoorlight] eq "off") (set outdoorlight on-for-timer 60)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [?outdoorlight] eq "on") (outdoorlight off)


Ein richtiges Device scheint aber den state "on" zu vergeben...also sollte das jetzt auch funktionieren!
Ich denke immer noch zu kompliziert....aber mit DOIF kann man (fast) jedes Problem lösen!

Schönen Abend noch,
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

Brockmann

Zitat von: Mitch am 13 Januar 2015, 20:43:46
die eine Bedingung muss sein, dass dunkel an ist
wenn dann enweder einer der Fernbedienungen (CUL_HM_HM_RC_Key4_2_xxxxxx_open) gedrückt wird ODER mein Handy am Eingang ODER der Schalter FS21_xxx ODER die Klingel gedrückt wird
soll das Licht angehen.

Genau das macht der Code ja auch. Problem ist nur: Wenn dunkel angeht, sind die anderen Bedingungen immer wahr, weil es eben keine echten Bedingungen sind. Deshalb wird die Aktion ausgeführt, wenn dunkel auf an geht.

Zitat von: Mitch am 13 Januar 2015, 20:43:46
Ich möchte also jedes Event von den FBs, der Klingel und dem Schalter abfangen.

Dann schau Dir in der Commandref zu DOIF mal den Abschnitt "Ereignissteuerung über Auswertung von Events an". Das sollte genau die Lösung für diese Aufgabe sein.
Beachte aber, dass manche Devices auch von sich aus zyklisch senden bzw. Batteriemeldung absetzen usw. Eventuell sollte man also nicht wirklich auf ALLE Events reagieren, sondern nur auf bestimmte. Dazu musst Du Dir ggf. eine passende Regular Expression basteln.

MaJu

Versuche mal, deine umständlichen Bezeichnungen umzubenennen. Damit blickst du vor allem selbst besser durch.
Einfach rename CUL_HM_HM_RC_Key4_2_26DD4F_open Lass_dir_einen_neuen_Namen_einfallen

Das mit dem _open am Ende wundert mich. Ist das schon ein Event/Befehl, oder tatsächlich der Name des Device? Ansonsten kannst du dir auch mit einer Gegenteil-Auswertung helfen, damit wird auf alles reagiert was nicht diesem Status entspricht: ([Klingel1] ne "mausetot")

Welche Events werden denn erzeugt? Insbesondere auch bei FS21_5b090 und Klingel1? Mit dem Fragezeichen werden nur Events getriggert, kein Status. Wenn Geräte häufiger senden, solltest du den Status auswerten.

Als Denkanstoß von mir (bitte die Events anpassen):
([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open:?open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open:?open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open:?open] [FS21_5b090:?on]) or [Klingel1:?on]) (set CUL_HM_Gartenlicht on)
Erlebnisreiche Grüße aus Leipzig!

Mitch

Danke euch vielmals.

Habe jetzt etwas umgebaut:
(([dunkel] eq "on" and [geofency:currLoc_Mitch] eq "Garten") or ([dunkel] eq "on" and [CUL_HM_FB_Leoni_light:?to]) or ([dunkel] eq "on" and [CUL_HM_FB_Markus_light:?to]) or ([dunkel] eq "on" and [CUL_HM_FB_Simone_light:?to]) or ([dunkel] eq "on" and [FS21_5b090:?toggle]) or ([dunkel] eq "on" and [Klingel1:?on])) (set CUL_HM_Gartenlicht on)

Werde dann mal heute Abend testen, wenn ich Zuhause bin.
FHEM im Proxmox Container