Doif - Reading abfragen, das nicht immer existiert

Begonnen von Sidey, 17 Oktober 2015, 11:05:05

Vorheriges Thema - Nächstes Thema

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

igami

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
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Hans Franz

Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

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

In dieser Version http://forum.fhem.de/index.php/topic,46327.msg380929.html#msg380929 gibt es bereits das neue Attribut notexit.

Gruß

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

Fredi69

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
fhem auf Raspberry Pi 3
FRITZ!Box7490, Fritz!Box 3270 AP, 3xHMLAN, CUL868, nanoCUL 433 für IT, JeeLink für LaCrosse, HUE Bridge 2.0, Samsung UE46C8790 (STV), mehrere Homematic, Intertechno, Shelly und LaCrosse Komponenten

Sidey

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
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker