Hallo allerseits,
Ich glaube ich stehe gerade auf dem Schlauch.
Ich möchte mit Doif ein reading abfragen, das nicht immer existiert.
Zuerst dachte ich, dass ich es über den ? Operator mache, aber wenn das reading gelöscht wird, erzeugt das keinem Event mehr.
Also habe ich gedacht ich frage das Reading direkt ab.
Ich habe eine Anweisung Doif unf eine Doelse.
Meine Idee war, wenn das Reading nicht existiert, oder den falschen Wert hat, dann wird Doelse ausgeführt.
Klappt aber nicht, wenn das Reading nicht existiert läuft Doif in einen Fehler.
Gibt es da einen Trick, oder muss ich das Reading mit einem perl Befehl AttrVal abfragen?
Hintergrund, ich möchte vom Fritzbox Modul den Status einer mac Adresse abfragen. Wenn das System nicht mehr verbunden ist, wird das Reading gelöscht.
Grüße Sidey
Zitat von: Sidey am 17 Oktober 2015, 11:05:05
Hallo allerseits,
Ich glaube ich stehe gerade auf dem Schlauch.
Ich möchte mit Doif ein reading abfragen, das nicht immer existiert.
Zuerst dachte ich, dass ich es über den ? Operator mache, aber wenn das reading gelöscht wird, erzeugt das keinem Event mehr.
Also habe ich gedacht ich frage das Reading direkt ab.
Ich habe eine Anweisung Doif unf eine Doelse.
Meine Idee war, wenn das Reading nicht existiert, oder den falschen Wert hat, dann wird Doelse ausgeführt.
Klappt aber nicht, wenn das Reading nicht existiert läuft Doif in einen Fehler.
Gibt es da einen Trick, oder muss ich das Reading mit einem perl Befehl AttrVal abfragen?
Hintergrund, ich möchte vom Fritzbox Modul den Status einer mac Adresse abfragen. Wenn das System nicht mehr verbunden ist, wird das Reading gelöscht.
Grüße Sidey
Wenn das Reading nicht triggern soll, dann kannst du mit der Perlfunktion ReadingsVal arbeiten.
Gruß
Damian
Hi Damian,
ja das dachte ich mir. Ich hab zwar AttrVal geschrieben, meinte aber ReadingVal.
Es gibt ja auch noch ReadingValDoIf, wobei mir der Unterschied nicht klar ist.
Wie dem auch sei. Ohne Trigger bekomme ich das doif ja aber wohl nicht ans Laufen oder?
Dann müsste ich mir wohl ein userreading erstellen, den Wert mittels ReadingVal dort hinein speichern und dann das auslesen. Korrekt?
Alternativ kann ich natürlich auch einen dummy dafür anlegen.
Grüße Sidey
Zitat von: Sidey am 17 Oktober 2015, 22:10:54
Hi Damian,
ja das dachte ich mir. Ich hab zwar AttrVal geschrieben, meinte aber ReadingVal.
Es gibt ja auch noch ReadingValDoIf, wobei mir der Unterschied nicht klar ist.
Wie dem auch sei. Ohne Trigger bekomme ich das doif ja aber wohl nicht ans Laufen oder?
Dann müsste ich mir wohl ein userreading erstellen, den Wert mittels ReadingVal dort hinein speichern und dann das auslesen. Korrekt?
Alternativ kann ich natürlich auch einen dummy dafür anlegen.
Grüße Sidey
Du kannst auch auf ein Event des Readings triggern [<device>:?<reading>]
Gruß
Damian
Hi Damian,
Zitat von: Damian am 17 Oktober 2015, 23:26:37
Du kannst auch auf ein Event des Readings triggern [<device>:?<reading>]
Ja, das ist in der Theorie auch genau die Lösung, welche die Anforderungen erfüllt. Ist das Reading gelöscht, dann wird auch kein event ausgelöst und es gibt keinen Fehler.
Bevor es gelöscht wird, erhält das reading ja auch noch einem anderen wert und erzeugt den notwendigen event.
Ich hatte das schon getestet und was soll ich sagen. Der Event war da, aber es Wurde nicht ausgelöst. :(
Ich probiere das jetzt aber noch mal aus.
Schon mal vielen Dank. Das Modul ist wirklich gut.
Grüße Sidey
Hi Damian,
ich brauche noch mal Hilfe..
Habe jetzt auf Event Trigger umgestellt.
Im Eventlog taucht auch schön der gesuchte event auf:
2015-10-18 22:00:23 FRITZBOX fb7490 mac_BC_AE_C5_97_1C_4F: Thor
Ich frage auch genau diesen Event ab:
([fb7490:?mac_BC_AE_C5_97_1C_4F] eq "Thor")
Vom Prinzip taucht der Event auch im Modul auf, aber die Bedingung wird nicht als Wahr erkennt und somit wird auch der Befehl nicht ausgeführt.
Kann es sein, dass DOIF was gegen "_" hat?
Hier mal alle Daten zu meinem DOIF:
Internals:
DEF ([fb7490:?mac_BC_AE_C5_97_1C_4F] eq "Thor") (set kz.Heizung_Clima controlManu 20.5)
DOELSE (set kz.Heizung_Clima controlMode auto)
NAME kz.anwesend
NR 349
NTFY_ORDER 50-kz.anwesend
STATE abwesend
TYPE DOIF
Readings:
2015-10-18 22:00:23 Device fb7490
2015-10-18 10:30:22 cmd_event fb7490
2015-10-18 10:30:22 cmd_nr 2
2015-10-18 22:00:23 e_fb7490_events box_rateDown: 55.152 box_rateUp: 4.681 mac_BC_AE_C5_97_1C_4F: Thor mac_78_D6_F0_D4_BD_6E: android-fdc45a82fd1c613a box_model: FRITZ!Box 7490 [avm] box_powerRate: 58 box_cpuTemp: 54 lastReadout: 199 values captured in 3.10 s
2015-10-18 10:30:22 state abwesend
Condition:
0 EventDoIf('fb7490',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'mac_BC_AE_C5_97_1C_4F') eq "Thor"
Devices:
0 fb7490
all fb7490
Do:
0:
0 set kz.Heizung_Clima controlManu 20.5
1:
0 set kz.Heizung_Clima controlMode auto
Helper:
globalinit 1
last_timer 0
sleeptimer -1
triggerDev fb7490
triggerEvents:
box_rateDown: 55.152
box_rateUp: 4.681
mac_BC_AE_C5_97_1C_4F: Thor
mac_78_D6_F0_D4_BD_6E: android-fdc45a82fd1c613a
box_model: FRITZ!Box 7490 [avm]
box_powerRate: 58
box_cpuTemp: 54
lastReadout: 199 values captured in 3.10 s
Internals:
Itimer:
Readings:
State:
Trigger:
all fb7490
Attributes:
cmdState anwesend|abwesend
room Kinderzimmer
verbose 5
Grüße Sidey
Zitat von: Sidey am 18 Oktober 2015, 22:19:50
Hi Damian,
ich brauche noch mal Hilfe..
Habe jetzt auf Event Trigger umgestellt.
Im Eventlog taucht auch schön der gesuchte event auf:
2015-10-18 22:00:23 FRITZBOX fb7490 mac_BC_AE_C5_97_1C_4F: Thor
Ich frage auch genau diesen Event ab:
([fb7490:?mac_BC_AE_C5_97_1C_4F] eq "Thor")
Vom Prinzip taucht der Event auch im Modul auf, aber die Bedingung wird nicht als Wahr erkennt und somit wird auch der Befehl nicht ausgeführt.
Kann es sein, dass DOIF was gegen "_" hat?
Event-Abfragen sind zum Triggerzeitpunkt wahr, also 1 und sonst nicht wahr, also 0.
Daher wird einfach nur
([fb7490:?mac_BC_AE_C5_97_1C_4F])
angegeben.
Gruß
Damian
Hi Damin,
vielen Dank. Ich habe es jetzt über den event gelöst. So funktioniert es nun.
Eine kleine Frage dennoch.
Wenn ich zwei Bedingungen prüfe z.B. so:
( [fb7490:?mac_BC_AE_C5_97_1C_4F] && [fb7490:mac_BC_AE_C5_97_1C_4F] eq "Thor")
Ist es dann so, wie in Perl, dass zuerst die 1. Bedingung erfüllt sein muss und erst danach die 2. Bedingung geprüft wird?
Grüße Sidey
Warum wertest du das Event nicht weiter aus?
( [fb7490:?mac_BC_AE_C5_97_1C_4F..Thor])
Die Beiden Punkte sollten das ": " ersetzten können.
Grüße
igami
Hi Igami,
super Tip. Irgendwie habe ich dauernd verdrängt, dass es nur eine regex ist.
Eigentlich müsste auch der Doppelpunkt angegeben werden könnten.
[fb7490:?mac_BC_AE_C5_97_1C_4F:.Thor]
oder noch einfacher, wenn sich mal die MAC Adresse ändern sollte:
[fb7490:?mac_.*Thor]
Grüße Sidey
Hi,
ich muss diese alte Themea noch mal aufwärmen.
Ich stehe erneut vor dem gleichen Problem. Ich möchte ein Reading abfragen, welches aber nicht immer existiert.
Die Reaktion auf ein Event hilft mir in diesem Fall aber nicht weiter.
Ich möchte folgendes realisieren:
Wenn receiver = an und TV = aus dann schicke receiver in standby
Das Reading TV kann ich nur abfragen, wenn der TV eingeschaltet ist.
Folgendes habe ich probiert:
([ET9x00:power] eq "on" and [fb7490:mac_00_A0_96_DC_8E_94] ne "tvb3118d9bfe36") ()
Kommt natürlich: reading does not exist: [fb7490:mac_00_A0_96_DC_8E_94]
Ich habe auch probiert mittels ReadingsVal das Reading abzufragen,
([ET9x00:power] eq "on" and [{ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}] ne "tvb3118d9bfe36") ()
aber dann bekomme ich die Fehlermeldung:
DOIF: the function "ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")" must return a timespec and not inactive.: {ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}
Wie frage ich jetzt das Vorhandensein eines Readings ab?
Grüße Sidey
Evtl. so (http://forum.fhem.de/index.php/topic,47080.msg388397.html#msg388397).
Gruß
Hans
Zitat von: Sidey am 17 Januar 2016, 00:44:10
Hi,
ich muss diese alte Themea noch mal aufwärmen.
Ich stehe erneut vor dem gleichen Problem. Ich möchte ein Reading abfragen, welches aber nicht immer existiert.
Die Reaktion auf ein Event hilft mir in diesem Fall aber nicht weiter.
Ich möchte folgendes realisieren:
Wenn receiver = an und TV = aus dann schicke receiver in standby
Das Reading TV kann ich nur abfragen, wenn der TV eingeschaltet ist.
Folgendes habe ich probiert:
([ET9x00:power] eq "on" and [fb7490:mac_00_A0_96_DC_8E_94] ne "tvb3118d9bfe36") ()
Kommt natürlich: reading does not exist: [fb7490:mac_00_A0_96_DC_8E_94]
Ich habe auch probiert mittels ReadingsVal das Reading abzufragen,
([ET9x00:power] eq "on" and [{ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}] ne "tvb3118d9bfe36") ()
aber dann bekomme ich die Fehlermeldung:
DOIF: the function "ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")" must return a timespec and not inactive.: {ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}
Wie frage ich jetzt das Vorhandensein eines Readings ab?
Grüße Sidey
In dieser Version http://forum.fhem.de/index.php/topic,46327.msg380929.html#msg380929 gibt es bereits das neue Attribut
notexit.
Gruß
Damian
Zitat von: Sidey am 17 Januar 2016, 00:44:10
Hi,
ich muss diese alte Themea noch mal aufwärmen.
Ich stehe erneut vor dem gleichen Problem. Ich möchte ein Reading abfragen, welches aber nicht immer existiert.
Die Reaktion auf ein Event hilft mir in diesem Fall aber nicht weiter.
Ich möchte folgendes realisieren:
Wenn receiver = an und TV = aus dann schicke receiver in standby
Das Reading TV kann ich nur abfragen, wenn der TV eingeschaltet ist.
Folgendes habe ich probiert:
([ET9x00:power] eq "on" and [fb7490:mac_00_A0_96_DC_8E_94] ne "tvb3118d9bfe36") ()
Kommt natürlich: reading does not exist: [fb7490:mac_00_A0_96_DC_8E_94]
Ich habe auch probiert mittels ReadingsVal das Reading abzufragen,
([ET9x00:power] eq "on" and [{ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}] ne "tvb3118d9bfe36") ()
aber dann bekomme ich die Fehlermeldung:
DOIF: the function "ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")" must return a timespec and not inactive.: {ReadingsVal("fb7490","mac_00_A0_96_DC_8E_94","inactive")}
Wie frage ich jetzt das Vorhandensein eines Readings ab?
Grüße Sidey
Wie hast Du es denn jetzt gelöst, ich möchte einfach eine Anzeige haben ob ein bestimmtes Gerät online ist oder nicht.
Danke
Ich habe es so gemacht:
([fb7490:?mac_.*Computer]) (set ....)
DOELSE (set ....)
Damit reagiert das DOIF auf ein Event in dem z.B. "mac_BC_AE_CA_E7_FC_42: Computer" auftaucht.
Für die Fritzbox habe ich das Attribut "event-on-update-reading" mit dem Wert "mac_.*" versehen, damit jedesmal, wenn sich etwas an den MAC-Adressen ändert auch ein Reading geändert wird. Dabei wird zum Glück dann auch ein Event generiert.
Grüße Sidey
Zitat von: Sidey am 26 September 2016, 23:30:16
Ich habe es so gemacht:
([fb7490:?mac_.*Computer]) (set ....)
DOELSE (set ....)
Damit reagiert das DOIF auf ein Event in dem z.B. "mac_BC_AE_CA_E7_FC_42: Computer" auftaucht.
Für die Fritzbox habe ich das Attribut "event-on-update-reading" mit dem Wert "mac_.*" versehen, damit jedesmal, wenn sich etwas an den MAC-Adressen ändert auch ein Reading geändert wird. Dabei wird zum Glück dann auch ein Event generiert.
Grüße Sidey
Bitte statt
?mac.*Computer
"mac.*Computer"
angeben. Das Fragezeichen ist veraltet und wird bei Ereignisangaben irgendwann nicht mehr unterstützt.