DOIF Reading aus Event bestimmen

Begonnen von Riquelme², 29 April 2016, 10:06:50

Vorheriges Thema - Nächstes Thema

Riquelme²

Hallo!!
Ich versuche zur Zeit ein Überwachung AP states unseres 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!!

Ellert

Versuch mal shift, die eckige Klammer wird als Zeitangabe interpretiert.
(time() - time_str2num(ReadingsTimestamp($device, shift(split(":", $event)), 0))) < 900




Riquelme²

Nein :(
da bekomme ich die Fehlermeldung:

Not an ARRAY reference at (eval 426272) line 1.

Ellert

Dann so:
(time() - time_str2num(ReadingsTimestamp($device, {my ($reading,$value)=split(":", $event);;return $reading}, 0))) < 900

Riquelme²

Ne meldet auch fehler  :-[

syntax error at (eval 426803) line 1, at EOF syntax error at (eval 426803) line 1, near "$reading}"

Ellert

Spiel mal ein bisschen mit der Syntax $reading;;}, () statt {}, usw.