gelöst:in einer DOIF Abfrage Readings mit Wildcard abfragen ?

Begonnen von Aladin222, 09 Januar 2021, 09:39:58

Vorheriges Thema - Nächstes Thema

Aladin222

Hallo @all,

gerade bastel ich an einem DOIF welches auf Einträge im Kalender reagieren soll .
Die Readings auf die es mir ankommt sehen so aus :

tomorrow_001_summary Urlaub

wenn aber mehrere Eintrage am Tag existieren ,dann kann der Eintrag aber auch so ein :

tomorrow_003_summary Urlaub

Wie bekomme ich es hin , tomorrow_XXX_summary abzufragen ? Also egal wieviele tomorrow_summary´s es gibt ?

innerhalb der Abfrage möchte ich das ,immer wenn ein Eintrag "Urlaub" gefunden wird , das ein DOIF etwas nicht auslöst ...

[mySchicht:tomorrow_003_summary] eq "!Urlaub"


Das klappt soweit ,aber ich habe teilweise 5-6 Einträge im Kalendertag und dann müsste ich ja alle abfragen

[mySchicht:tomorrow_001_summary] eq "!Urlaub" and  [mySchicht:tomorrow_002_summary] eq "!Urlaub" and  [mySchicht:tomorrow_003_summary] eq "!Urlaub"



Damian

Zitat von: Aladin222 am 09 Januar 2021, 09:39:58
Hallo @all,

gerade bastel ich an einem DOIF welches auf Einträge im Kalender reagieren soll .
Die Readings auf die es mir ankommt sehen so aus :

tomorrow_001_summary Urlaub

wenn aber mehrere Eintrage am Tag existieren ,dann kann der Eintrag aber auch so ein :

tomorrow_003_summary Urlaub

Wie bekomme ich es hin , tomorrow_XXX_summary abzufragen ? Also egal wieviele tomorrow_summary´s es gibt ?

Indem du versucht auf die jeweiligen Readings zuzugreifen [myholidy:tomorrow003_summary,"kein Eintrag"], wenn sie "kein Eintrag" liefern, dann gibt es die nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

xenos1984

Falls du auf Einträge mit einem bestimmten Inhalt triggern willst - mit einem Event-Trigger sollte das gehen (ungetestet):

(["^calendar$:^tomorrow_.*_summary$"] eq "Urlaub")

http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

Damian

Zitat von: xenos1984 am 09 Januar 2021, 10:06:48
Falls du auf Einträge mit einem bestimmten Inhalt triggern willst - mit einem Event-Trigger sollte das gehen (ungetestet):

(["^calendar$:^tomorrow_.*_summary$"] eq "Urlaub")

http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

wenn du es getestet hättest, dann würdest du feststellen, dass es so nicht geht ;)

Eventtrigger liefern im Normalfall nur true oder false zum reinen Abfragen des Triggers.

Man kann tatsächlich auch den Inhalt des dazugehörigen Events zurückgeben, dann muss man kommagetrennt, ein Default-Wert angeben, für den Fall, dass eine Abfrage erfolgt ohne einen Trigger (z. B. wenn die Angabe mit einem logischen Operator mit anderen Triggern angegeben wird)

Zitat aus der Commandref zu DOIF

ZitatAllgemeine Ereignistrigger können ebenfalls so definiert werden, dass sie nicht nur wahr zum Triggerzeitpunkt und sonst nicht wahr sind, sondern Inhalte des Ereignisses zurückliefern. Initiiert wird dieses Verhalten durch die Angabe eines Default-Wertes.

Syntax:

["regex for trigger",<default value>]

Anwendungsbeispiel:

define di_warning DOIF ([":^temperature",0]< 0) (set pushmsg danger of frost $DEVICE)
attr di_warning do always


Ich vermute aber, dass er nicht auf den Trigger des Readings reagieren will, der findet ja bekanntlich um Mitternacht statt , sondern nur als reine Abfrage zu einem anderen Zeitpunkt und da würde es nicht funktionieren, da bei mehreren Treffern nicht nur ein Ergebnis, sondern mehrere zurückgegeben werden müssten.


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

Aladin222

#4
erstmal vielen Dank für eure Hilfe  ;D

@xenos1984


and ["^mySchicht$:^tomorrow_.*_summary$"] eq "Urlaub")


hat so erstmal nicht funktioniert :-(

@Damian ,

puhhh , mir raucht der Kopf :-) ....aber ich glaube verstanden zu haben warum es so nicht geht !

Aber :
"Indem du versucht auf die jeweiligen Readings zuzugreifen [myholidy:tomorrow003_summary,"kein Eintrag"], wenn sie "kein Eintrag" liefern, dann gibt es die nicht."
verstehe ich nicht .... meinst du damit , das ich wirklich alle tomorrow001_summary bis tomorrow003_summary abfragen muss , um bei evtl. 3 eintragen nach einem "Urlaub" zu suchen ?

Um sicher zu gehen das ich mich richtig ausgedrückt habe :

([14:00:00] and [mySchicht:tomorrow_001_summary] eq "FRÜH" and [?WeckerAutomatik] eq "on")
(set ECHO_G0911B0593930VFG alarm_normal 4:00) DOELSE

nun möchte ich dazu noch einbauen , das bei einem Eintrag im Kalendertag "Urlaub" eben kein Wecker gestellt wird :-)

Um das ganze zu testen habe ich für morgen einen Tag Urlaub in den Kalender eingetragen :

([10:40:00] and [mySchicht:tomorrow_001_summary] eq "Frei" and [?WeckerAutomatik] eq "on" and [mySchicht:tomorrow_003_summary] eq "Urlaub")
(set ECHO_G000RA0784450MUW speak das ist ein Test) DOELSE

funktioniert soweit auch prima , aber wie gesagt müsste ich das dann im Beispiel ja so machen:

([10:40:00] and [mySchicht:tomorrow_001_summary] eq "Frei" and [?WeckerAutomatik] eq "on" and [mySchicht:tomorrow_001_summary] eq "Urlaub" and [mySchicht:tomorrow_002_summary] eq "Urlaub" and [mySchicht:tomorrow_003_summary] eq "Urlaub")
(set ECHO_G000RA0784450MUW speak das ist ein Test) DOELSE


geht das echt nicht eleganter ?

Damian

Zitat von: Aladin222 am 09 Januar 2021, 10:33:19
erstmal vielen Dank für eure Hilfe  ;D

@xenos1984


and ["^mySchicht$:^tomorrow_.*_summary$"] eq "Urlaub")


hat so erstmal nicht funktioniert :-(

@Damian ,

puhhh , mir raucht der Kopf :-) ....aber ich glaube verstanden zu haben warum es so nicht geht !

Aber :
"Indem du versucht auf die jeweiligen Readings zuzugreifen [myholidy:tomorrow003_summary,"kein Eintrag"], wenn sie "kein Eintrag" liefern, dann gibt es die nicht."
verstehe ich nicht .... meinst du damit , das ich wirklich alle tomorrow001_summary bis tomorrow003_summary abfragen muss , um bei evtl. 3 eintragen nach einem "Urlaub" zu suchen ?

ja, z. B.

[mySchicht:tomorrow_001_summary,""] eq "Urlaub" or [mySchicht:tomorrow_002_summary,""] eq "Urlaub" or [mySchicht:tomorrow_003_summary,""] eq "Urlaub"


usw.

Aber DOIF wäre nicht DOIF, wenn es nicht noch ein Ass im Ärmel hätte :)

([?#"^mySchicht$":"^tomorrow":$_ eq "Urlaub"] > 0)

siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation

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

Aladin222

Mega !

das funzt *freu

...auch wenn ich zugeben muss ,das ich es nicht ganz verstehe :-)

Ganz lieben Dank !

Damian

Zitat von: Aladin222 am 09 Januar 2021, 11:21:22
Mega !

das funzt *freu

...auch wenn ich zugeben muss ,das ich es nicht ganz verstehe :-)

Ganz lieben Dank !

ist aber alles in der Commandref erklärt https://fhem.de/commandref_DE.html#DOIF_aggregation:

[<function>:<format>:"<regex device>:<regex event>":<reading>|"<regex reading>":<condition>,<default>]

hier:

([?#"^mySchicht$":"^tomorrow":$_ eq "Urlaub"] > 0)

Bedeutung der Angaben:

?  kein Trigger
<function> # Anzahl der Treffer
"<regex device>:<regex event>"  "^mySchicht$" welches Device
"<regex reading>" "^tomorrow" welche Readings
<condition> $_ eq "Urlaub"  der Inhalt des jeweiligen Readings wird auf "Urlaub" geprüft




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

Aladin222

#8
@Damian ,

danke dir ! ...denke ich hab es gerafft :-)

DOIF ist einfach mächtig !

Dazu hätte ich direkt noch eine Frage ,wenn ich darf :

<condition> $_ eq "Urlaub"  der Inhalt des jeweiligen Readings wird auf "Urlaub" geprüft

-gibt es eine Möglichkeit ,hier direkt mehrere Konditionen zu prüfen ? Also etwa so :

([?#"^mySchicht$":"^tomorrow":$_ eq "Urlaub","AFZ","Demo3"] > 0)



Damian

Zitat von: Aladin222 am 09 Januar 2021, 11:54:38
@Damian ,

danke dir ! ...denke ich hab es gerafft :-)

DOIF ist einfach mächtig !

Dazu hätte ich direkt noch eine Frage ,wenn ich darf :

<condition> $_ eq "Urlaub"  der Inhalt des jeweiligen Readings wird auf "Urlaub" geprüft

-gibt es eine Möglichkeit ,hier direkt mehrere Konditionen zu prüfen ? Also etwa so :

([?#"^mySchicht$":"^tomorrow":$_ eq "Urlaub","AFZ","Demo3"] > 0)


Das ist Perl, da kannst du alles in der Perl-Syntax abfragen, was du willst:


([?#"^mySchicht$":"^tomorrow":$_ eq "Urlaub" or $_ eq "AFZ" or $_ eq "Demo3"] > 0)


Die Platzhalter sind ja in der Commandref beschrieben:

ZitatIn der Aggregationsbedingung können alle in FHEM definierten Perlfunktionen genutzt werden. Folgende Variablen sind vorbelegt und können ebenfalls benutzt werden:

$_ Inhalt des angegebenen Readings (s.o.)
$number Nach Zahl gefilteres Reading
$name Name des Devices
$TYPE Devices-Typ
$STATE Status des Devices (nicht das Reading state)
$room Raum des Devices
$group Gruppe des Devices


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