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!!
Versuch mal shift, die eckige Klammer wird als Zeitangabe interpretiert.
(time() - time_str2num(ReadingsTimestamp($device, shift(split(":", $event)), 0))) < 900
Nein :(
da bekomme ich die Fehlermeldung:
Not an ARRAY reference at (eval 426272) line 1.
Dann so:
(time() - time_str2num(ReadingsTimestamp($device, {my ($reading,$value)=split(":", $event);;return $reading}, 0))) < 900
Ne meldet auch fehler :-[
syntax error at (eval 426803) line 1, at EOF syntax error at (eval 426803) line 1, near "$reading}"
Spiel mal ein bisschen mit der Syntax $reading;;}, () statt {}, usw.