FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Riquelme² am 29 April 2016, 10:06:50

Titel: DOIF Reading aus Event bestimmen
Beitrag von: Riquelme² am 29 April 2016, 10:06:50
Hallo!!
Ich versuche zur Zeit ein Überwachung AP states unseres unifi (http://fhem.de/commandref.html#Unifi) zu erstellen.
Es soll ein error Reading erstellt werden wenn der state eines Access Point länger als 15 min nicht ok meldet.

Eine ähnliche Überwachung habe ich bereits für die battery Readings von HomeMatic Komponenten:

define HomeMatic_batter_error DOIF
(["^HM_:battery.*low"] and
[$DEVICE:battery:sec] < 900
)(
  sleep 900; trigger $DEVICE battery low
)
DOELSEIF
(["^HM_:battery.*low"] and
[$DEVICE:battery] eq "low" and
[$DEVICE:battery:sec] >= 900
)(
  setreading $DEVICE error battery
)
DOELSEIF
(["^HM_:battery.*ok"] and
[$DEVICE:error] eq "battery"
)(
  deletereading $DEVICE error
)

attr HomeMatic_batter_error do always


Für die AccessPoints wird jeweils ein Reading im Device unifi angelegt

Internals:
   DEF        <ip> <port> <username> <password> 30 default 4
   NAME       unifi
   NOTIFYDEV  global
   NR         18
   NTFY_ORDER 50-unifi
   STATE      connected
   TYPE       Unifi
   Helper:
     Dblog:
       [...]
   Readings:
     2016-04-29 09:26:39   -AP_1.0.010_clients 1
     2016-04-29 09:26:39   -AP_1.0.010_essid [...]
     2016-04-29 09:26:39   -AP_1.0.010_locate off
     2016-04-29 09:26:39   -AP_1.0.010_state ok
     2016-04-29 09:26:39   -AP_1.1.150_clients 4
     2016-04-29 09:26:39   -AP_1.1.150_essid [...]
     2016-04-29 09:26:39   -AP_1.1.150_locate off
     2016-04-29 09:26:39   -AP_1.1.150_state ok
     2016-04-29 09:26:39   -AP_1.1.240_clients 2
     2016-04-29 09:26:39   -AP_1.1.240_essid [...]
     2016-04-29 09:26:39   -AP_1.1.240_locate off
     2016-04-29 09:26:39   -AP_1.1.240_state ok

Ein Event für eine AP state Reading:

2016-04-29 09:26:39 Unifi unifi -AP_1.1.240_state: ok


Zuerst wollte ich das Event am : teilen und das Alter des Readings abfragen;

define Unifi_APstate_error DOIF
(["^unifi$:-AP.*_state"] and
[unifi:(split(":", $event))[0]:sec] < 900
)

Dabei erhalte ich die Fehlermeldung:

Unifi_APstate_error DOIF: unknown expression format: ", $event))[0])}:sec

Mein zweiter Ansatz war

define Unifi_APstate_error DOIF
(["^unifi$:-AP.*_state"] and
(time() - time_str2num(ReadingsTimestamp($device, (split(":", $event))[0], 0))) < 900
)

Hierbei bekomme ich die Fehlermeldung

perl error in condition: EventDoIf('^unifi$',$hash,'-AP_.*_state',0) and (time() - time_str2num(ReadingsTimestamp($device, (split(":", $event))DOIF_time_once($hash,$hash->{timer}{0},$wday,""), 0))) < 900 : syntax error at (eval 425815) line 1, near ")DOIF_time_once"


Im Ausführungsteil wird die Differenz jedoch korrekt berechnet:

define Unifi_APstate_error DOIF
(["^unifi$:-AP.*_state"])(
  set $SELF diff (time() - time_str2num(ReadingsTimestamp($device, (split(":", $event))[0], 0)))
)


Nun die eigentliche Frage:
Wie muss die Perl Bedingung angegeben werden?

Danke!!
Titel: Antw:DOIF Reading aus Event bestimmen
Beitrag von: Ellert am 29 April 2016, 10:32:59
Versuch mal shift, die eckige Klammer wird als Zeitangabe interpretiert.
(time() - time_str2num(ReadingsTimestamp($device, shift(split(":", $event)), 0))) < 900



Titel: Antw:DOIF Reading aus Event bestimmen
Beitrag von: Riquelme² am 29 April 2016, 11:04:13
Nein :(
da bekomme ich die Fehlermeldung:

Not an ARRAY reference at (eval 426272) line 1.
Titel: Antw:DOIF Reading aus Event bestimmen
Beitrag von: Ellert am 29 April 2016, 13:03:37
Dann so:
(time() - time_str2num(ReadingsTimestamp($device, {my ($reading,$value)=split(":", $event);;return $reading}, 0))) < 900
Titel: Antw:DOIF Reading aus Event bestimmen
Beitrag von: Riquelme² am 29 April 2016, 13:50:08
Ne meldet auch fehler  :-[

syntax error at (eval 426803) line 1, at EOF syntax error at (eval 426803) line 1, near "$reading}"
Titel: Antw:DOIF Reading aus Event bestimmen
Beitrag von: Ellert am 29 April 2016, 16:00:04
Spiel mal ein bisschen mit der Syntax $reading;;}, () statt {}, usw.