Hallo in die Runde,
nachdem ich bisher auf jede meiner Fragen eine Antwort im Forum gefunden habe, stehe ich nun aber im Wald.
Ich habe einen RFID-522 Leser an einem NodeMCU.
Dort läuft die Firmware https://github.com/omersiar/esp-rfid
Die Software meldet fleißig über MQTT den Zustand des Kartenlesers als ein String:
{"type":"access","time":1535822592,"isKnown":"false","access":"Denied","username":"Unknown","uid":"c431f0e1"}
Den zerpflücke ich und weise jeden Teilstring den ich benötige einem UserReading zu.
Z.B:
attr RFID01 userReadings uid_42 { (split '"',(split ':',(split ',',ReadingsVal("RFID01","uid",0))[3])[1])[1]}
Dieser uid_42 gibt nun den Status "Denied" oder "Always" zurück.
Der plan war dieses Userreading als Trigger für ein Notify zu benutzen.
Wenn nun aber zweimal die gleiche Person zutritt will, ist es ungünstig auf Änderung dieses UserReading uid_42 einen Notify aufzubauen, da es sich in diesem Fall nicht ändert.
Daher werte ich die Änderung des Zeitstempel aus (Im Beispiel "1535822592"). Das ist bei jedem Request anders.
Hier mein Device:
defmod RFID01 MQTT_DEVICE
attr RFID01 IODev RasPi01
attr RFID01 subscribeReading_uid /RFID_01
attr RFID01 userReadings uid_42 { (split '"',(split ':',(split ',',ReadingsVal("RFID01","uid",0))[3])[1])[1]} ,\
\
uid_2 { (split ',',ReadingsVal("RFID01","uid",0))[1]} , \
uid_22 { (split ':',ReadingsVal("RFID01","uid_2",0))[1]} , \
uid_22 { localtime(ReadingsVal("RFID01","uid_22",0))}
Das Notify soll auf Änderung der Zeit (uid_22) reagieren,
wenn uid_42 = "Always", ein Dummy-Device auf "Acces" setzen
und gleichzeitg ein Device at_RFID01 starten, der den Dummy in 3sec wieder "Denied"
defmod n_RFID01 notify RFID01:uid_22:.* \
{\
if (ReadingsVal("RFID01","uid_42","Denied") eq "Always") \
{\
fhem "set d_RFID01 Access" ;;\
fhem "defmod at_RFID01 at +00:00:03 set d_RFID01 Denied" ;;\
}\
}
Jetzt mein Problem:
Das Reading uid_42 wird zweimal gesendet. Einmal mit einem alten Wert, und dann mit dem korrekten Wert aus dem aktuellen Lesevorgang des RFID-Lesers.
Das bedeutet folgt nach einer Person mit "Access" mit eigentlich "Denied", so erhält er dennoch Zutritt, da der vorherige Accesswert als erster Wert an das notify übermittel wurde.
Der folgende "richtige" Wert "Denied" geht unter, da der Dummy schon "Access" gewährt hat. Andersrum genauso.
Nachlesbar im LOG:
Person mit Zutritt (Nach einer Person mit Zutritt):
2018-09-01 19:44:43 MQTT_DEVICE RFID01 uid_42: Always <= Wert von vorhergehender Person!!!!!
2018-09-01 19:44:43 MQTT_DEVICE RFID01 uid_42: Always
folgende Person ohne Zutritt:
2018-09-01 19:45:24 MQTT_DEVICE RFID01 uid_42: Always <= alter Wert!!!!!
2018-09-01 19:45:24 MQTT_DEVICE RFID01 uid_42: Denied
Wieder Person mit Zutritt:
2018-09-01 19:46:01 MQTT_DEVICE RFID01 uid_42: Denied <= alter Wert!!!!!
2018-09-01 19:46:01 MQTT_DEVICE RFID01 uid_42: Always
Ob NOTIFY oder DOIF spielt keine Rolle. Das Problem ist der alte Reading-Wert
Warum wird das alte Userreading mit übergeben?
Wie kann ich das verhindern?
Oder wie kann ich dem Notify sagen, das das erste Reading zu ignorieren ist?
Ich hoff es ist halbwegs verständlich.
Bitte ein list aller betreffenden Devices. So sieht man gar nichts
An dem soll's nicht fehlen
MQTT RFID_Empfänger:
Internals:
IODev RasPi01
NAME RFID01
NR 245
STATE Access
TYPE MQTT_DEVICE
qos *:0
retain *:0
READINGS:
2018-09-01 17:16:35 state Access
2018-09-01 19:46:01 transmission-state incoming publish received
2018-09-01 19:46:01 uid {"type":"access","time":1535823960,"isKnown":"true","access":"Always","username":"CardBlue","uid":"609e6a89"}
2018-09-01 19:46:01 uid_2 "time":1535823960
2018-09-01 19:46:01 uid_22 Sat Sep 1 19:46:00 2018
2018-09-01 19:46:01 uid_42 Always
message_ids:
publishSets:
sets:
subscribe:
/RFID_01
subscribeExpr:
^\/RFID_01$
subscribeQos:
/RFID_01 0
subscribeReadings:
/RFID_01:
cmd
name uid
Attributes:
IODev RasPi01
subscribeReading_uid /RFID_01
userReadings uid_42 { (split '"',(split ':',(split ',',ReadingsVal("RFID01","uid",0))[3])[1])[1]} ,
uid_2 { (split ',',ReadingsVal("RFID01","uid",0))[1]} ,
uid_22 { (split ':',ReadingsVal("RFID01","uid_2",0))[1]} ,
uid_22 { localtime(ReadingsVal("RFID01","uid_22",0))}
Dazugehöriges Notify:
Internals:
DEF RFID01:uid_22:.*
{
if (ReadingsVal("RFID01","uid_42","Denied") eq "Always")
{
fhem "set d_RFID01 Access" ;;
fhem "defmod at_RFID01 at +00:00:03 set d_RFID01 Denied" ;;
}
}
NAME n_RFID01
NOTIFYDEV RFID01
NR 246
NTFY_ORDER 50-n_RFID01
REGEXP RFID01:uid_22:.*
STATE 2018-09-01 19:46:01
TYPE notify
READINGS:
2018-09-01 19:20:19 n_uid_22 Sat Sep 1 19:20:04 2018
2018-09-01 19:10:45 n_uid_42 Always
2018-09-01 19:20:19 state active
Attributes:
Dein userReadings triggert ja auf alle Events des Devices, also auch auf die Events des userReadings.
Ausserdem setzt du zweimal die uid 22
uid_22 { (split ':',ReadingsVal("RFID01","uid_2",0))[1]} ,
uid_22 { localtime(ReadingsVal("RFID01","uid_22",0))}
Probiere mal so
userReadings uid_42:uid:.* { (split '"',(split ':',(split ',',ReadingsVal("RFID01","uid",0))[3])[1])[1]} ,
uid_2 { (split ',',ReadingsVal("RFID01","uid",0))[1]} ,
uid_22 { (split ':',ReadingsVal("RFID01","uid_2",0))[1]} ,
uid_22 { localtime(ReadingsVal("RFID01","uid_22",0))}
ich habe die doppelte 22 drin gelassen, musst du wissen.
Das Notify kann man noch schöner machen.
if (ReadingsVal("RFID01","uid_42","Denied") eq "Always")
{
fhem "set d_RFID01 Access;sleep 3; set d_RFID01 Denied" ;
}
Hallo CoolTux,
das notify habe ich abgeändert. Ist jetzt bei gleicher Funktion kompakter!
Die Readings habe ich jetzt auch nur einmal definiert:
userReadings uid_42 { (split '"',(split ':',(split ',',ReadingsVal("RFID01","uid",0))[3])[1])[1]} ,
uid_22 { localtime((split ':',(split ',',ReadingsVal("RFID01","uid",0))[1])[1])}
Gleiches Ergebnis:
Zuerst wird das alte Reading ausgewertet, dann das neue. Mit dem Effekt, folgt eine nicht berechtigte Person einer berechtigten, bekommt die nicht berechtigte Person Zugang über den alten Wert der berechtigten Person:
2018-09-02 09:52:56 MQTT_DEVICE RFID01 uid_42: Always <= alter Wert
2018-09-02 09:52:56 MQTT_DEVICE RFID01 uid_22: Sun Sep 2 09:52:50 2018 <= altes Datum
2018-09-02 09:52:56 MQTT_DEVICE RFID01 uid: {"type":"access","time":1535874775,"isKnown":"false","access":"Denied","username":"Unknown","uid":"b4faf0e1"}
2018-09-02 09:52:56 MQTT_DEVICE RFID01 uid_42: Denied <= richtiger, neuer Wert
2018-09-02 09:52:56 MQTT_DEVICE RFID01 uid_22: Sun Sep 2 09:52:55 2018 <= neues Datum
Warum wird hier zweimal getriggert?
Mir fehlen die Ideen!