[gelöst] Filter in DOIF funktioniert nicht richtig bei Auswertung Windrichtung

Begonnen von Burny4600, 10 Juli 2016, 10:39:09

Vorheriges Thema - Nächstes Thema

Burny4600

Ich möchte den nummärischen Wert einer Windrichtung herausfiltern um diesen unter DOIF weiter verwenden zu können, ohne das Perl Warnungen ausgibt.
Der Readingwert lautet ZB: Readings - wind_dir - 112 ESE
([WGR800:wspeed] > 20 and [WGR800:wind_dir] > 0 and [WGR800:wind_dir] < 200)
(set ZWS on)
DOELSE
(set ZWS off)

Ohne Filter bekomme ich die Meldung im Log:
2016.07.08 17:50:43 1: PERL WARNING: Argument "204 W" isn't numeric in numeric gt (>) at (eval 956241) line 1.


Um den nummärischen Wert zu Filtern habe ich folgende Definition ausgeführt.
([WGR800:wspeed] > 20 and [WGR800:wind_dir:d] > 0 and [WGR800:wind_dir:d] < 200)
(set ZWS on)
DOELSE
(set ZWS off)

Nur so funktioniert es auch nicht.
Mit dem Filter bekomme ich nun die Meldung im Log:
2016.07.10 10:32:26 1: PERL WARNING: Argument "1353 W" isn't numeric in numeric gt (>) at (eval 535808) line 1.

Nur das Argument kann zudem nicht stimmen!"1353 W"
Habe ich da im falschem Bereich angesetzt?
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Ellert

ZitatHabe ich da im falschem Bereich angesetzt?
Kann sein, wenn die Fehlermeldung aus einer anderen DOIF-Definition stammt.

ZitatNur das Argument kann zudem nicht stimmen!
Interessant wären die originalen Readings-Werte vom Fehlerfall und was im DOIF angekommen ist, also Listings von den Geräten.

Burny4600

Also im DOIF Listing der Geräte erscheint der Wert in dieser Form:
e_WGR800_wind_dir 112 ESE
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Ellert

Zitat"1353 W"
dieser Wert kommt dann nicht aus dem DOIF.

Wie schon gesagt, ein Listing der betroffenen Geräte im Fehlerzustand könnte weiter helfen.

Kennst Du den list-Befehl?

Burny4600

Meinst du das List des Windsensors?
Internals:
   CFGFN      /media/hdd/fhem/mycfg/Wetter/Wetterstation.cfg
   CODE       WGR800
   DEF        WGR800
   IODev      RFXtrx433E
   LASTInputDev RFXtrx433E
   MSGCNT     367
   NAME       WGR800
   NR         996
   RFXtrx433E_MSGCNT 367
   RFXtrx433E_RAWMSG 105602ffb00000160018000e0000000069
   RFXtrx433E_TIME 2016-07-10 19:30:15
   STATE      Richtung: 22 NNE ° | Geschwindigkeit: 5 km/h | mittlere Geschwindigkeit: 9 km/h
   TYPE       TRX_WEATHER
   Readings:
     2016-07-10 19:30:15   battery         ok 100%
     2016-07-10 19:30:15   rssi            6
     2016-07-10 19:30:15   rssi_dB         -72
     2016-07-10 19:30:15   state           W: 1.4 WA: 2.4 WD: 22 WDN: NNE BAT: ok
     2016-07-10 19:30:15   wavspeed        8.64
     2016-07-10 19:30:15   wind_avspeed    2.4
     2016-07-10 19:30:15   wind_dir        22 NNE
     2016-07-10 19:30:15   wind_speed      1.4
     2016-07-10 19:30:15   wspeed          5.04
Attributes:
   IODev      RFXtrx433E
   alias      Windgeschwindigkeit & Richtung (Oregon)
   event-min-interval .*:15
   event-on-change-reading wspeed,wind_speed,wavspeed,wind_avspeed,wind_dir,rssi,rssi_dB,battery
   group      Sensoren
   icon       weather_wind_speed
   room       OG1-Balkon,Rolllaeden,Wetterstation
   stateFormat {sprintf(
"Richtung: %s ° | Geschwindigkeit: %1.f km/h | mittlere Geschwindigkeit: %1.f km/h",
ReadingsVal($name,"wind_dir",0),
ReadingsVal($name,"wspeed",0),
ReadingsVal($name,"wavspeed",0))}
   userReadings wspeed:wind_speed.* {ReadingsVal($name,"wind_speed",0)*3.6},
wavspeed:wind_avspeed.* {ReadingsVal($name,"wind_avspeed",0)*3.6},
rssi_dB:rssi.* {(ReadingsVal("$name","rssi",0)*8)-120}


Ich nahm an das es aus der DOIF Verarbeitung kommt da nirgendwo anders die Winrichtung mit > oder < verarbeitet wird und Argumente dieser Art (204 W) nur der Windsensor produziert.
2016.07.08 17:50:43 1: PERL WARNING: Argument "204 W" isn't numeric in numeric gt (>) at (eval 956241) line 1.

List eines der vier DOIF's
Internals:
   CFGFN      /media/hdd/fhem/myprogram/Markise.pm
   DEF        ([WGR800:wspeed] > 20 and [WGR800:wind_dir:d] > 0 and [WGR800:wind_dir:d] < 200)
(set ZOBWM100D on)
DOELSE
(set ZOBWM100D off)
   NAME       ZOBWM100
   NR         4036
   NTFY_ORDER 50-ZOBWM100
   STATE      AUS
   TYPE       DOIF
   Readings:
     2016-07-10 19:36:19   Device          WGR800
     2016-07-10 19:29:57   cmd             2
     2016-07-10 19:29:57   cmd_event       WGR800
     2016-07-10 19:29:57   cmd_nr          2
     2016-07-10 19:36:19   e_WGR800_wind_dir 135 SE
     2016-07-10 19:36:19   e_WGR800_wspeed 6.12
     2016-07-10 19:29:57   state           cmd_2
     2016-07-10 19:30:15   wait_timer      10.07.2016 19:50:15 cmd_2 WGR800
   Condition:
     0          ReadingValDoIf($hash,'WGR800','wspeed','','',AttrVal($hash->{NAME},'notexist',undef)) > 20 and ReadingValDoIf($hash,'WGR800','wind_dir','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) > 0 and ReadingValDoIf($hash,'WGR800','wind_dir','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) < 200
   Devices:
     0           WGR800
     all         WGR800
   Do:
     0:
       0          set ZOBWM100D on
     1:
       0          set ZOBWM100D off
   Helper:
     event      wind_speed: 1.7,wind_avspeed: 1,wind_dir: 135 SE,battery: ok 100%,wspeed: 6.12,wavspeed: 3.6
     globalinit 1
     last_timer 0
     sleepdevice WGR800
     sleepsubtimer 0
     sleeptimer 1
     timerdev   WGR800
     timerevent wind_speed: 1.7,wind_avspeed: 1,wind_dir: 135 SE,battery: ok 100%,wspeed: 6.12,wavspeed: 3.6
     triggerDev WGR800
     timerevents:
       wind_speed: 1.7
       wind_avspeed: 1
       wind_dir: 135 SE
       battery: ok 100%
       wspeed: 6.12
       wavspeed: 3.6
     timereventsState:
       wind_speed: 1.7
       wind_avspeed: 1
       wind_dir: 135 SE
       battery: ok 100%
       wspeed: 6.12
       wavspeed: 3.6
     triggerEvents:
       wind_speed: 1.7
       wind_avspeed: 1
       wind_dir: 135 SE
       battery: ok 100%
       wspeed: 6.12
       wavspeed: 3.6
     triggerEventsState:
       wind_speed: 1.7
       wind_avspeed: 1
       wind_dir: 135 SE
       battery: ok 100%
       wspeed: 6.12
       wavspeed: 3.6
   Internals:
   Itimer:
   Readings:
     0           WGR800:wspeed WGR800:wind_dir
     all         WGR800:wspeed WGR800:wind_dir
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   alias      OG1 Balkon - Markise 100% offen - Karenzzeit Windgeschwindigkeit Süd > 20 kph
   devStateIcon initialize.*:control_minus EIN:ios-set_off-green AUS:general_aus@red
   do         always
   eventMap   cmd_1:EIN cmd_2:AUS
   group      Zähler
   icon       time_timer
   room       OG1-Balkon,Rolllaeden,_Timer
   wait       0:1200
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Ellert

Ja, um das genauer zu untersuchen, wäre es hilfreich, ein Listing des DOIF, den dazu gehörenden Logeintrag und das Geräte Reading zu vergleichen.

Wenn das DOIF spinnt, dann müsstest Du eine Fehlermeldung mit einer wind_dir im Log haben und zum gleichen Zeitpunkt ein Reading im DOIF und im Sensor. Und im DOIF ggf. auch eine Fehlermeldung, die wäre dann im Listing zu sehen.

Kannst Du den Fehler reproduzieren und die Listings erstellen?

Das passt auch irgendwie nicht zusammen:
Zitat
2016-07-10 19:30:15   wind_dir        22 NNE
2016-07-10 19:36:19   e_WGR800_wind_dir 135 SE

Burny4600

Werde das Log noch einmal löschen, da ständig diese Perl Warning Einträge das Log schon ziemlich aufgefüllt haben.

Morgen werde ich dies nochmals genauer ausloten um den Fehler einzugrenzen.
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Ellert

Vielleicht gibt es hilfreiche Informationen, wenn Du das globale Attribut stacktrace auf 1 setzt.

Burny4600

stacktrace habe ich jetzt ergänzt und auf 1 gesetzt.

Habe den Fehler eingrenzen können.
Diese Warnung wird definitiv vom Signalduino hervor gerufen.
Ebenso das die Winrichtung mehr als 360° aufgelöst wird.

Danke jedenfalls für die Hilfe.
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Burny4600

Es muss doch irgendetwas an DOIF mit dem Windsensor faul sein.
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

automatisierer

Zitat von: Ellert am 10 Juli 2016, 17:12:26
Kann sein, wenn die Fehlermeldung aus einer anderen DOIF-Definition stammt.
Interessant wären die originalen Readings-Werte vom Fehlerfall und was im DOIF angekommen ist, also Listings von den Geräten.

das list des DOIF ist ok, aber du schreibst: "eines von vier" also gibt es da wohl noch mehr. Dann mach doch mal von allen ein list.

Bei Versuch das ganze nachzustellen, ist mir aufgefallen, das DOIF zwar eine Warnung "... isn't numeric..." raushaut, aber dennoch der entspechende Befehl ausgeführt wird.
Also
"7W" < "8" ergibt die Fehlermeldung und der zur Bedingung gehörende Befehl wird ausgefürt
"10W" < "8" ergibt die Fehlermeldung und der zur Bedingung gehörende Befehl wird nicht ausgefürt

also "übersieht" DOIF das W einfach...

Also funktionieren müssten deine DOIF's trotz der Fehlermeldung. Und in einem deiner DOIF's wird wohl der Filter ':d' fehlen, was zu der Warnmeldung führt.



Burny4600

#11
Alle vier Bedingungen sind ähnlich aufgebaut.
Das stimmt schon, das DOIF die Bedingungen richtig abarbeitet.
Mir wurde nur angeraten diese Perl Warnungen zu behandeln, da diese für andere sporadisch auftretend Fehler verantwortlich sein können.

([WGR800:wspeed] > 20 and [WGR800:wind_dir:d] > 200 and [WGR800:wind_dir:d] < 360)
(set ZWN on)
DOELSE
(set ZWN off)

([WGR800:wspeed] > 20 and [WGR800:wind_dir:d] > 0 and [WGR800:wind_dir:d] < 200)
(set ZWS on)
DOELSE
(set ZWS off)

([WGR800:wspeed] > 20 and [WGR800:wind_dir:d] > 100 and [WGR800:wind_dir:d] < 250)
(set ZOBWM100D on)
DOELSE
(set ZOBWM100D off)

([WGR800:wspeed] > 30 and [WGR800:wind_dir:d] > 0 and [WGR800:wind_dir:d] < 200)
(set ZOBWM50D on)
DOELSE
(set ZOBWM50D off)

Bei allen vier Bedingungen ist das Attribut wait mit 0:1200 definiert.

@automatisierer
Zitat"7W" < "8" ergibt die Fehlermeldung und der zur Bedingung gehörende Befehl wird ausgefürt
"10W" < "8" ergibt die Fehlermeldung und der zur Bedingung gehörende Befehl wird nicht ausgefürt
Da wird ja doch etwas von DIOF laut deinem Test nicht ausgeführt.
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Burny4600

Gibt es schon Erkenntnisse um diese Perl Fehlermeldungen zu beheben.

Diese müllen das LOG zu, und sind eine unnütze Belastung für das System.
LG Chris

Raspberry Pi 2-5, Bullseye Lite, Bookworm Lite
Schnittstellen: 1-Wire, FHEM2FEHEM, HM-MOD-UART, LAN, Modbus, MQTT, nanoCUL, RFXtrx433E, SIGNALduino, ser2net
Devices: APC, Eastron, FS20, IT, Homematic, MQTT, PV-(DEYE, EPEVER, FRONIUS), Resol-VBUS, S.USV, TEK603, WMR200, YouLess

Damian

Zitat von: Burny4600 am 15 Juli 2016, 08:47:48
Gibt es schon Erkenntnisse um diese Perl Fehlermeldungen zu beheben.

Diese müllen das LOG zu, und sind eine unnütze Belastung für das System.

Um die Quelle einzukreisen: Deaktiviere über das Attribut disable alle DOIF, die die Windrichtung auswerten. Wenn die Meldung immer noch kommt, dann hast du einen übersehen. Wenn die Meldung nicht mehr kommt, dann kannst ein DOIF zum testen definieren:

([WGR800:wind_dir:d] > 200) (set bla on)

und dann schaust du, ob die Meldung kommt. Wenn sie nicht kommt, dann kommt es nicht von dieser Abfrage.

Gruß

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

Ellert

Zitat von: Burny4600 am 15 Juli 2016, 08:47:48
Gibt es schon Erkenntnisse um diese Perl Fehlermeldungen zu beheben.

Diese müllen das LOG zu, und sind eine unnütze Belastung für das System.

Du könntest Dir auch ein Userreading im Sensor anlegen und das im DOIF nutzen:

wind_dir_num:wind_dir.* {ReadingsNum("WGR800","wind_dir", -999)}