Hallo,
ich beiße mir jetzt seit geraumer Zeit die Zähne an fhem aus - mit mehr oder, aktuell weniger Erfolg.
Absicht ist: wenn ein Fensterkontakt "open" sendet und mein Handy "absent" erkannt wird, soll die bot message rausgehen.
Problem ist die "Verallgemeinerung auf alle Fenster und die Verknüpfung mit der Presence...
Wahrscheinlich nur ein Syntaxfehler, aber ich hab jetzt gefühlt 98 Varianten probiert und komme nicht weiter.
Vielleicht hat jemand einen Lösungsvorschlag für mich, DANKE im voraus ;)
define di_window_open DOIF ([Window|Fenster] eq "Open" and [Meik_Handy] eq "absent") (set fhem_mg64_bot message di Balkontuer oder Fenster offen)
PS: Die ganzen Proficodings die man im Forum findet möchte ich nicht nutzen - meine Hoffnung war DOIF so zu verstehen, daß ich möglichst viele Problemstellungen damit "erschlagen" kann.
ZitatDie ganzen Proficodings die man im Forum findet möchte ich nicht nutzen - meine Hoffnung war DOIF so zu verstehen, daß ich möglichst viele Problemstellungen damit "erschlagen" kann.
Das kannst du auch mit Hilfe von DOIF, nur nicht aufgeben.
Meistens liegt es nur an Kleinigkeiten.
Schau mal nach, ob der Status von denen Fesntern wirklich "Open" ist und nicht "open".
Viel Erfolg!
Gruß
Thomas
Danke für die schnelle Antwort,
ich hab beides schon probiert - ohne Erfolg.
Aktuell zeigt DOIF folgenden Fehlerstatus:
timer_1_c1 error: Wrong timespec Window: either HH:MM:SS or {perlcode}
interpretiert die gerade Klammer wohl als Zeitangabe...
Dein Window|Fenster wird von DOIF als wochentags wiederholung erkannt, nicht als oder.
Versuche ([Fenster] eq "open" or [Window] eq "open")
Ciao, MN
Hallo, hab Fenster komplett rausbekommen, immer noch die Fehlermeldung...
Zitat[Window|Fenster]
Die mehrfache Angabe von Devicces/Readings ist in dieser Form nicht erlaubt, s. http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
also entweder
(([Window] eq "Open" or [Fenster] eq "Open") and [Meik_Handy] eq "absent") (set ..)
oder, wie hier beschrieben: http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
statt
[Window|Fenster] eq "Open"
dies
["Window|Fenster:Open"]
ZitatHallo, hab Fenster komplett rausbekommen, immer noch die Fehlermeldung...
Poste mal die Listings der Geräte di_window_open, Window, Fenster
Werd ich ausprobieren, in deinem Code ist auf jeden Fall eine runde Klammer mehr als bei mir. Danke erst mal. Melde morgen, ob es funktioniert hat.
Gesendet von meinem YOGA Tablet 2-830L mit Tapatalk
Mojn Mojn,
danke noch mal für die Hilfestellungen gestern.
Ich hab mal noch ein bißchen experimentiert und bin jetzt soweit gekommen:
funktioniert jetzt:
define di_window_open DOIF (([EG_Buero_Fenster:Window] eq "Open") and [Meik_Handy] eq "present") (set fhem_mg64_bot message Buero Fenster offen)
Die Ursache warum "Window" nicht ausgewertet wurde, war: ich hatte zuvor mit Notify rumexperimentiert.
Weil die Meldungen in 2 Minutenabständen wiedeholt wurden hab ich:
attr EG_Buero_Fenster event-on-change-reading state
konfiguriert = Meldung nur noch bei Wechsel von "state" auf "open" + keine readings mehr.
Damit komme ich soweit klar, daß ich für jedes Fenster jetzt ein eigenes Notify mit der passenden Benachrichtigung konfigurieren kann,
hat ja auch den Charme, daß ich sehe welches Fenster offen steht ;)
Unklar ist mir aber immer noch warum die Angabe ["indow"] nicht wie beschrieben als Platzhalter funktioniert...
Schönes Rest-Wochenende an alle
ZitatUnklar ist mir aber immer noch warum die Angabe ["indow"] nicht wie beschrieben als Platzhalter funktioniert...
Was konkret meinst Du damit? Wo ist das beschrieben? Wie sieht Deine Definition aus?
Ich zitiere mal aus Caommand Referenz für DOIF:
"Beispiele für Regex-Angaben:
["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten "
dementsprechend hatte ich gedacht:
define di_window_open DOIF ((["indow"] eq "Open") and [Meik_Handy] eq "present") (set
müßte für alle Devices die indow enthalten während Meik_Handy present die Meldung anstossen...
ich glaub ich hab´s jetzt...
indow ist eigentlich das Reading, nicht das Device?
korrekt?
Ja, also [":indow"] müsste klappen. Du könntest auch $DEVICE und $EVENT in der Nachricht nutzen, um das auslösende Gerät anzuzeigen
der : nach den Anführungszeichen trennt und verweist darauf, daß indow im Reading enthalten sein muß - korrekt?
Wo müßte ich dann $DEVICE oder $EVENT angeben?
Zitatder : nach den Anführungszeichen trennt und verweist darauf, daß indow im Reading enthalten sein muß - korrekt?
Ja.
ZitatWo müßte ich dann $DEVICE oder $EVENT angeben?
Im set- Befehl, etwa so:
set message "Das $DEVICE ist $EVENT"
hab mal folgendes getestet:
define di_window_open_EG_Buero DOIF (([":indow] eq "Open") and [Meik_Handy] eq "present") (set fhem_mg64_bot message $DEVICE ist $EVENT)
keine Meldung
Wo ist das rechte Anführungszeichen?
berechtigter Einwand ;D jetzt hab ich auch:
matched_event_c1_1 +
e_Meik_Handy_STATE present
aber keine Meldung
Git es Fehlermeldungen im Log?
Poste mal ein Listing des DOIF mit list <DOIFname>
Internals:
DEF (([":indow"] eq "Open") and [Meik_Handy] eq "present") (set fhem_mg64_bot message $DEVICE ist $EVENT)
NAME di_window_open_EG_Buero
NR 122
NTFY_ORDER 50-di_window_open_EG_Buero
STATE cmd_2
TYPE DOIF
Readings:
2016-04-24 17:26:26 Device OG_Sabrina_Balkontuer
2016-04-24 15:21:37 cmd_event EG_Buero_Fenster
2016-04-24 15:21:37 cmd_nr 2
2016-04-24 17:00:02 e_EG_Buero_Fenster_Window Closed
2016-04-24 15:13:50 e_Meik_Handy_STATE present
2016-04-24 17:26:26 matched_event_c1_1 Window: Closed
2016-04-24 15:21:37 state cmd_2
2016-04-24 17:07:18 timer_1_c1 error: Wrong timespec ":indow: either HH:MM:SS or {perlcode}
Condition:
0 (EventDoIf('',$hash,'indow',0) eq "Open") and InternalDoIf($hash,'Meik_Handy','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "present"
Devices:
0 Meik_Handy
all Meik_Handy
Do:
0:
0 set fhem_mg64_bot message $DEVICE ist $EVENT
1:
Helper:
event Window: Closed
globalinit 1
last_timer 0
sleeptimer -1
timerdev OG_Sabrina_Balkontuer
timerevent Window: Closed
triggerDev OG_Sabrina_Balkontuer
timerevents:
Window: Closed
Reliability: ok
Battery: ok
Closed
triggerEvents:
Window: Closed
Reliability: ok
Battery: ok
Closed
Internals:
0 Meik_Handy:STATE
all Meik_Handy:STATE
Itimer:
Readings:
Regexp:
0:
0 :indow
All:
0 :indow
State:
Trigger:
Attributes:
room DOIF,Zentral
sieht für mich wirr aus, sorry
Trotzdem vielen Dank für Deine Geduld
([":indow"] eq "Open") ist falsch, da Du auf Events triggerst, ein Event ist nur wahr oder falsch, also [":indow: Open"]
hat 1x funktioniert: "EG_Buero_Fenster ist Window: Open"
Jetzt sehe ich in den Readings auch den Presence Status nicht mehr...
Schau mal hier: http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
ZitatJetzt sehe ich in den Readings auch den Presence Status nicht mehr...
Hat sich wohl noch nicht wieder gemeldet ;)
das Handy wird "present" angezeigt taucht aber im doif nicht mehr auf,
das Fenster wurde geschlossen und wieder geöffnet - die Readings und Statusänderungen hab ich im Event Monitor beobachtet,
für mein Verständnis müßte jetzt ja auch eine Meldung "EG_Buero_Fenster ist Window: Closed" kommen.
poste ein Listing des DOIF
Ich will dir ja nicht den ganzen Sonntag versauen ;)
ich hab jetzt mal folgendes Coding probiert:
define di_window_open_EG_Buero DOIF (([":indow: Open"]) and [Meik_Handy] eq "present") (set fhem_mg64_bot message $DEVICE ist $EVENT)
attr di_window_open_EG_Buero do always
= funktioniert soweit, daß jetzt verschiedene Fenster gemeldet haben - halt bei jeder Statusabfrage
ein DOELSE am Ende hat nicht funktioniert
ggf. das Triggern für [Meik_Handy] eq "present" ausschalten, sonst gibt es auch eine Meldung für die Statusaktualisierung des Telefons.
[?Meik_Handy] eq "present"
http://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Stati_ohne_Trigger
und ggf. bei den Fenstern das Attribut event-on-change-reading setzen.
fürs Handy kommen keine Meldungen, aber jedes offene Fenster halt alle 3 Minuten... nervt schon ein bißchen ;)
Wegen der Überschneidung, hier noch mal:
und ggf. bei den Fenstern das Attribut event-on-change-reading setzen.
wenn ich das richtig verstanden habe muß ich die readings die triggern sollen kommagetrennt hinzufügen - korrekt?
Zitat von: mg64 am 24 April 2016, 19:06:44
Ich will dir ja nicht den ganzen Sonntag versauen ;)
ich hab jetzt mal folgendes Coding probiert:
define di_window_open_EG_Buero DOIF (([":indow: Open"]) and [Meik_Handy] eq "present") (set fhem_mg64_bot message $DEVICE ist $EVENT)
attr di_window_open_EG_Buero do always
= funktioniert soweit, daß jetzt verschiedene Fenster gemeldet haben - halt bei jeder Statusabfrage
ein DOELSE am Ende hat nicht funktioniert
Es ist wichtig zu wissen, das Eventabfragen ohne Device-Spezifikation keinen DOELSE-Fall produzieren, denn sonst würde jedes andere Event in FHEM sofort den ELSE-Fall ausführen.
Das bedeutet umgekehrt, dass ein ELSE-Fall nur bei Eventabfragen der Form [<Device>:"<regex>"] existieren kann.
Gruß
Damian
Ja, das ist richtig.
Alternativ kannst Du auch, einen weiteren Bedingungszweig einfügen, dann ohne do always:
([":indow: Open"] and [Meik_Handy] eq "present") (set fhem_mg64_bot message $DEVICE ist $EVENT)
DOELSEIF ([":indow: Closed"])
Du bekommst dann eine Meldung beim ersten geöffneten Fenster und beim Schliessen eines Fensters, für ein noch geöffnetes Fenster (bei Statusaktualisierung), bis alle Fenster geschlossen sind
VIELEN VIELEN DANK
für die Hilfe und den Sonntags-Workshop
Viel gelernt, Sch..ßwetter genutzt und jetzt scheint es so zu funktionieren wie geplant...
Aktuell hab ich noch ein paar LOVF, werd ich mal beobachten,
falls alles läuft schließ ich das Thema morgen mit gelöst ab.