DOIF ([device:reading] exists)??

Begonnen von roman1528, 11 November 2015, 11:42:51

Vorheriges Thema - Nächstes Thema

roman1528

Moin.
Mein GDS wird mit
define at_gds_rereadcfg at +*01:00:00 get gds rereadcfg
aktualisiert und mit
define notify_gds_readalerts notify gds get gds alerts 103241000
werden die alerts für meine Region geholt.

Desweiteren wird mit
define doif_gds_alert DOIF ([gds:a_count] >= 1) (set gds_alert_dummy yes) DOELSE (set gds_alert_dummy no)
ein Dummy für die Alarmierung in FTUI gesetzt.

Nun ist es ja so, dass nicht immer alerst für meine Region vorhanden sind und DOIF gibt
2015.11.11 11:30:12 2: doif_gds_alert: reading does not exist: [gds:a_count]
aus.

Kann ich mit DOIF erst abfragen ob das Reading existiert?
define doif_gds_alert DOIF ([gds:a_count] [exists] and [gds:a_count] >= 1) (set gds_alert_dummy yes)........

Oder wie kann ich das am besten lösen?
i3-10305T 4x3GHz;8GB RAM;250GB & 1TB NVMe:
FHEM 6.2;FTUI;8" Tablet's+Fully;NsPanelPro;HUE;ESPRGBWW;HM(CCU3);Duofern; ASC;MQTT(Tasmota);netatmo;SONOS;eBus;DbLog;XiaomiDevice;NUT;ModbusAttr

RPi3+: FHEM 6.2;I²C;GPIO;RFID;G-Tag;XiaomiBTLESens
RPi3: FHEM 6.2;DIY Relais-Board;I²C;GPIO;RFID;Photovoltaik

Loredo

Würde mich auch interessieren wie man die Fehlermeldungen ignorieren kann, dass ein bestimmtes Reading (gerade) nicht vorhanden ist...
Besser wäre natürlich, wenn das GDS Modul zumindest die Readings a_valid und a_count immer bereitstellen würde... vielleicht kann man sich mit einem userreading behelfen?
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Wuppi68

mache doch nach dem define vom gds ein setreading(gds, a_count, "0")

dann gibt es das reading ja auch wirklich :-)
FHEM unter Proxmox als VM

Loredo

bringt halt nix, wenn das gds Modul das Reading beim nächsten alert-Lauf wieder löscht.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

frank

bei einem anscheinend "langweiligen" notify gäbe es die situation erst gar nicht. kein reading => kein event => keine aktion.
aber doif wäre nicht doif, wenn das nicht mit doif funktioniert.  ;)
vermutlich ein paar fragezeichen (event-handling) spendieren.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Damian

Zitat von: frank am 24 November 2015, 16:35:57
bei einem anscheinend "langweiligen" notify gäbe es die situation erst gar nicht. kein reading => kein event => keine aktion.
aber doif wäre nicht doif, wenn das nicht mit doif funktioniert.  ;)
vermutlich ein paar fragezeichen (event-handling) spendieren.

sollte so funktionieren:

define doif_gds_alert DOIF ([gds:?a_count] and [?gds:a_count] >= 1) (set gds_alert_dummy yes)........

Gruß

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

Loredo

#6
Danke, Damian.

Das funktioniert allerdings aus mehreren Gründen nicht:

1. Das GDS Modul scheint für jedes neu erstellte Reading ein eigenes Event zu erstellen (Single-Update). Zu der Zeit, wo a_valid ein Event erzeugt, gibt es a_count noch nicht.
Das führt dann leider dazu, dass ein DOIF erstmal auf "on" gesetzt wird und direkt danach wieder auf "off" (siehe mein Beispiel weiter unten).
--> das GDS Modul muss eigentlich ein Bulk-Update für alle Readings zusammen machen. Und natürlich wäre es klug die Readings a_count und a_valid nie zu löschen, sondern nur zu aktualisieren.
@betateilchen  :-[

2. Ich habe noch immer das Problem, dass [abc:?reading] bei mir nicht direkt mit einer Auswertung funktioniert und ich es immer mit einem "and [?abc:reading] eq "123"" kombinieren muss. Da funktionieren bei mir ne Menge Automationen seit einigen Wochen schon nicht mehr, weil ich es noch nicht geschafft habe alle ~50 (ineinander verschachtelten) DOIF daraufhin zu prüfen... als ich sie mal erstellt hatte gingen die alle wie vorgesehen (ich nutze DOIF auch extensiv dafür über cmdState Status-Dummys zu erstellen).

Hier ist der Anfang eines DOIF, welches ich erstellt habe, um später Nachrichten zu versenden und gleichzeitig eine Anzeige für Oberflächen zu haben.


define di_gds_alerts DOIF
(
   [gds:?a_valid] == 1
)

DOELSEIF
(
   [gds:?a_valid] == 0 and
   [?gds:a_count] != 0
)

DOELSE


attr di_gds_alerts cmdState on|standby|off


Es funktioniert so allerdings nicht, weil eben die Events nicht alle zusammen kommen.
So wiederum funktioniert es einigermaßen, bringt aber natürlich die Fehler mit dem temporär fehlenden a_* Readings (oder eben dauerhaft, wenn mal gar keine Warnung vorliegt).


define di_gds_alerts DOIF
(
   [gds:a_valid] == 1
)

DOELSEIF
(
   [gds:a_valid] == 0 and
   [gds:a_count] != 0
)

DOELSE


attr di_gds_alerts cmdState on|standby|off




EDIT:
Auch ne aktuelle Lösung ist nur auf a_count zu triggern - da gibt es a_valid schon:



define di_gds_alerts DOIF
(
   [?gds:a_valid] == 1
   [gds:?a_count] != 0
)

DOELSEIF
(
   [?gds:a_valid] == 0 and
   [gds:?a_count] != 0
)

DOELSE


attr di_gds_alerts cmdState on|standby|off


In meiner Kopflogik würde ich aber zuerst auf a_valid prüfen und danach bei a_count schauen - naja  ;)
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Zitat von: frank am 24 November 2015, 16:35:57
bei einem anscheinend "langweiligen" notify gäbe es die situation erst gar nicht. kein reading => kein event => keine aktion.


Notify ist dafür halt nur bedingt geeignet, weil a_valid auch 0 sein kann und a_count trotzdem >=1. Nämlich in dem Fall wenn es eine Vorabinfo gibt. Man möchte also immer beide Werte zusammen betrachten und für sowas ist DOIF dann eben gleich viel besser geeignet (siehe mein Beispiel oben ;))
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Zusatz:
Man muss derzeit auch noch ein "attr di_gds_alerts wait 2:2:2" setzen.
Ansonsten springt das DOIF kurz auf "off", weil das Löschen des a_count Readings offenbar ebenfalls ein Event auslöst und somit das DOIF triggert.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

#9
Wenn ein Reading nicht vorhanden ist, dann wird kein Befehl ausgeführt, die Abarbeitung wird abgebrochen und es ändert sich kein Zustand des Moduls, alles andere halte ich nicht für sinnvoll.

Das einzige Problem, was ich sehe ist, dass diese Trigger als Fehler geloggt werden. Man könnte in diesem Fall einfach nur das Error-Reading zur Information für die Nachvollziehbarkeit füllen, aber keinen Log-Eintrag erzeugen.


Im Übrigen, da die Auswertung der Bedingung im DOIF-Modul vom Perl-Interpreter vorgenommen wird, wird bei AND-Verknüpfung der weitere Teil einer Bedingung nicht mehr überprüft, sobald der erste nicht wahr ist.

Gruß

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

Loredo

Zitat von: Damian am 27 November 2015, 19:48:47
Wenn ein Reading nicht vorhanden ist, dann wird kein Befehl ausgeführt, die Abarbeitung wird abgebrochen und es ändert sich kein Zustand des Moduls, alles andere halte ich nicht für sinnvoll.


Nope, da gibts dann sowas im Log:




2015.11.27 19:13:11 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30097) line 1.
2015.11.27 19:13:23 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30176) line 1.
2015.11.27 19:13:45 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30242) line 1.
2015.11.27 19:14:23 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30389) line 1.
2015.11.27 19:15:33 1: PERL WARNING: Argument "" isn't numeric in numeric ne (!=) at (eval 30633) line 1.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Damian

Zitat von: Loredo am 27 November 2015, 19:50:37

Nope, da gibts dann sowas im Log:




2015.11.27 19:13:11 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30097) line 1.
2015.11.27 19:13:23 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30176) line 1.
2015.11.27 19:13:45 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30242) line 1.
2015.11.27 19:14:23 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 30389) line 1.
2015.11.27 19:15:33 1: PERL WARNING: Argument "" isn't numeric in numeric ne (!=) at (eval 30633) line 1.


Bei mir führt

DOIF ([bladevice:bla]>20 and [Trigger])(...)

zu einer Fehlermeldung
Zitatreading does not exist: [bladevice:bla]
und keiner Ausführung, wenn Trigger triggert.

Gruß

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

CoolTux


userReadings alerts { ReadingsVal( "dwdWetterdienst", "a_valid", "0" ); }, alertsCount { ReadingsVal( "dwdWetterdienst", "a_count", "0",); }


So mach ich das.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

RidcuIIy

Hi,

ich möchte nochmal den Threadgrund aufgreifen:

ZitatDamian:Wenn ein Reading nicht vorhanden ist, dann wird kein Befehl ausgeführt, die Abarbeitung wird abgebrochen und es ändert sich kein Zustand des Moduls, alles andere halte ich nicht für sinnvoll.

Das kommt darauf an was man machen möchte. Ich fände es auch gut wenn ein Fehlen eines readings über DOIF abgefragt werden kann, das ist in diesem Fall absichtlich. Ich  triggere einen Hauptschalter auf Presence lan-ping was eher schlecht funktioniert und möchte anstelle dessen über Modul FRITZBOX auslesen ob die Geräte eingeloggt sind. Hier wird ein Reading FritzBox:MacAdresse ausgegeben.
FRITZBOX löscht jedoch dieses Reading wenn die Endgeräte nicht mehr angemeldet sind.
Die Lösung per PRESENCE via Script über 99_myutils.pm kenne ich und würde diese im Notfall auch nutzen, fände jedoch eine Möglichkeit, DOIF auch zu triggern wenn ein Reading nicht vorhanden ist, in dieser und auch ein paar anderen Konstellationen nützlich da ich mir ein paar Zwischenschritte spare. DOIF wäre hier viel eleganter und würde meine Codeentropie senken :)
Gibt es da keine Lösung? 

Laffer72

Hallo,

ich gehe auch über die das Reading mit der MAC-Adresse mit dem FRITZBOX-Modul. Die Anwesenheit habe ich mit einem DOIF im Residents -Modul gesetzt, aber auch das Problem des fehlenden Readings bei Abwesenheit.
Ich habe das über ReadingProxy-Modul gelöst.

define HandyAnwesend readingsProxy Fritzbox:mac_xx_xx_xx_xx_xx_xx

Ist das Reading nicht vorhanden habe ich im state "inactive" stehen. Das DOIF frägt jetzt "HandyAnwesend" ab.

Hab ich jetzt schon länger im Gebrauch und funktioniert tadellos.

Hoffe ich konnt ein bisserl helfen

Reinhard
Raspberry Pi Rev.B, FB7390 (FHEM2FHEM), Sonos, Smarter Coffee
Osram Lightify:2m LED-Streifen, 5m-LED-Streifen, Gartenspot, Surface 28W, Classic E14,E27, Classic RGBW E27, PAR16 GU10, Plug
CUL868:FS20-ST, FS20-DI, FS20-FMS, FS20-ES1
HMUSB:HM-Sec-RHS,HM-Sec-MDIR2
Jeelink868:TX-29-IT, TFA30.315