veraltetes, doppeltes Userreading

Begonnen von asti, 01 September 2018, 19:58:53

Vorheriges Thema - Nächstes Thema

asti

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.

CoolTux

Bitte ein list aller betreffenden Devices. So sieht man gar nichts
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

asti

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:


CoolTux

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" ;
}

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

asti

#4
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!