Problem ESP8266, RFID Reader PN532 - Karten-ID wird mehrfach gesendet

Begonnen von niels330, 11 April 2018, 14:48:24

Vorheriges Thema - Nächstes Thema

niels330

Moinmoin,

aufbauend auf diesem (leider schon ein Jahr alten Thread) https://forum.fhem.de/index.php?topic=70447.0 stellt sich auch mein Problem wie folgt dar:

Ich habe ein ESP8266 mit ESPEasy geflasht und einen PN532 RFID Reader daran angeschlossen. Das ganze kommuniziert über Wlan mit meiner auf einem Pi3 laufenden FHEM Instanz und schaltet bei erfolgreichem Auslesen eines bestimmten RFID-Tags (bzw dessen UID) einen Türklicker. Soweit so gut, funktioniert an sich ganz gut, aber hat einen entscheidenden Haken.

Das notify sieht so aus:
define ESPEasy_notify_Tag1 notify ESPEasy_ESP_Easy_RFIDScanner:Tag:.XXXXXXXXXX {fhem "set Zimmertur off"}
attr ESPEasy_notify_Tag1 room ESPEasy


Nun zum Haken: Nach erfolgreichem Schalten des Relais, welches den Türklicker öffnet passiert etwas seltsames: ca 2-4 Minuten später (leider unregelmäßig, aber meist in diesem Zeitraum) wird erneut das Reading "Tag:.XXXXXXXXXX" in FHEM empfangen und entsprechend noch mal der Türklicker betätigt. Das passiert sogar, wenn ich das ESP nach erstmaligem Öffnen vom Strom nehme oder reboote. Scheint also ein Problem auf FHEM-Seite zu sein. In oben genanntem Thread wird das Problem sehr ähnlich geschildert, jedoch bleiben sämtliche Lösungsansätze aus selbigem ohne Erfolg.

Jemand hier ne Idee, wie man das "entsprellen" könnte? Bei Bedarf poste ich gerne die entsprechenden Stellen aus dem Eventmonitor.

Gruß
Niels

niels330

Ich wieder,

alternativ hätte ich noch die Idee, statt des "state"-Readings das "Tag"-Reading in einem Notify weiterzuverarbeiten. Ich habe nämlich eben festgestellt, dass nach den 2-4 Minuten lediglich das State-Reading mit "Tag: XXXXX" erneuert wird. Das "Tag"-Reading liest sauber die UID aus und gibt diese nur einmal weiter. da gibt es kein "refresh" nach ein paar Minuten.

Allerdings bin ich noch ziemlich unerfahren mit FHEM und deshalb schon froh überhaupt ein notify zum laufen zu bekommen. Kann mir jemand verraten, wie ich es in dem o.g. notify schaffe anstatt des State Readings das Tag reading weiterzuverwerten?

Gruß Niels

Tueftler1983

Poste mal ein list vom RFID Reader bzw dem ESP damit man die genauen Reading namen hat dann kann man dir bestimmt Helfen

niels330

Hier mal screenshots von allem, was das device so hergibt... Danke!

Otto123

Hallo Niels,

dank Eventmonitor ist das eigentlich ganz einfach.
https://wiki.fhem.de/wiki/Event_monitor

Einfach beim Event zuschauen was passiert, die richtige Zeile markieren und notify erzeugen.

Eventuell hilft auch das attribut event-on-change-reading.

Gruß Otto

P.S. Ein list ist kein Screenshot!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

niels330

Zitat von: Otto123 am 11 April 2018, 17:36:31
Hallo Niels,

dank Eventmonitor ist das eigentlich ganz einfach.
https://wiki.fhem.de/wiki/Event_monitor

Einfach beim Event zuschauen was passiert, die richtige Zeile markieren und notify erzeugen.

Eventuell hilft auch das attribut event-on-change-reading.

Gruß Otto

P.S. Ein list ist kein Screenshot!

Moin,

Danke, ich dachte es mir schon, allerdings konnte ich so auf die Schnelle nichts mit List anfangen, deshalb habe ich Screenshots hochgeladen, sollte ja auch seinen Zweck erfüllen :)

Den Eventmonitor habe ich beobachtet, allerdings finde ich dort den Grund für das doppelt auslösen nicht. es erscheint nach 2-4 Minuten einfach erneut die Zeile mit dem State-Reading "Tag: xxxxxx". Deshalb der Ansatz, wie man denn das notify entsprechend anpasst um eben nicht "state" auszulesen, sondern das "Tag" Reading direkt verwertet. Event-on-change-reading hatte ich schon ausprobiert. Ändert nichts an dem Problem, leider.

Poste nachher nochmal auszüge vom Eventmonitor.

Beste Grüße
Niels

Otto123

Zitat von: niels330 am 11 April 2018, 17:46:35
deshalb habe ich Screenshots hochgeladen, sollte ja auch seinen Zweck erfüllen :)
Nein, ein list ist etwas völlig anderes. Zum einen stehen mehr Informationen drin, zum anderen sind Screenshots viel schlechter lesbar als ein list.

Du brauchst die Events nicht zu posten, wenn es keinen Event mit dem Tag Reading gibt wird es nichts mit dem notify. Wenn es einen Event gibt lässt Du Dir dein notify vom Eventmonitor einfach modifizieren.

Zitatallerdings finde ich dort den Grund für das doppelt auslösen nicht. es erscheint nach 2-4 Minuten einfach erneut die Zeile mit dem State-Reading
Naja das ist der Grund warum das notify zweimal auslöst.

Und dein Versuch mit event-on-change-reading 0 ist großer Käse. Wie kommst Du auf die Idee? Was soll die 0 dort?
.* wäre für alle Readings
state wäre für state
Tag wäre für Tag
usw.

Der Syntax steht immer in der Doku und wird nicht frei erfunden!  :-X

Zitatevent-on-change-reading
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings". Wenn gesetzt, erzeugen nur Veränderungen der gelisteten "readings" ein Ereignis. Wenn die aktualiserten Werte der gelisteten "readings" identisch sind, wird kein Ereignis generiert.
Wenn hinter dem Namen eines "readings" eine :Schwelle angegeben ist, wird das Event nur getriggert wenn die Änderung grösser als diese Schwelle ist.
Die unterschiedlichen Bedeutungen von event-on-update-reading und event-on-change-reading sind folgende:
Wenn beide Attribute nicht gesetzt sind erzeugt jede Aktualisierung eines jeden "readings" eines Gerätes ein Ereignis.
Wenn eines der Attribute gesetzt ist, erzeugen nur Updates oder änderungen von "readings" die in einem der Attribute gesetzt sind ein Ereignis.
Wenn ein "reading" in event-on-update-reading aufgeführt ist, erzeugt eine Aktualisierung ein Ereignis unabhängig ob das "reading" auch in event-on-change-reading aufgelistet ist.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tueftler1983

Hallo

Wenn ich das richig sehe fragst du mit deinem Notify aber auch das Reading Tag ab, bin zwar nicht der notify experte aber
ESPEasy_ESP_Easy_RFIDScanner:Tag:.XXXXXXXXXX bezieht sich auf das Reading nur der . vor dem code also das .XXXXX erretiert mich, heißt der punkt nicht das es bei jedem Code reagieren soll?

Otto123

Nein, ein notify fragt erstmal kein Reading ab, es reagiert auf einen Event!

Der Punkt steht für "match auf jedes Zeichen" aber erstmal genau auf ein Zeichen.
Also max reagiert genau auf max, m.x reagiert auch auf max, mex, mix oder m x - oder was auch immer vorn mit m und hinten mit x  ;D
Ein * würde sagen: reagiere auf beliebig viele Zeichen die vor dem Stern stehen, also
a* würde auf a oder aa oder aaa usw reagieren - .* reagiert dann sozusagen auf alles.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frank

mit event-on-change-reading=0 hätte es eigentlich keine events geben dürfen. ausser für das reading "0".
vielleicht ist auch das modul hier nicht "sauber" programmiert.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Tueftler1983

also sollte sein notify wenn es nur auf den einen Tag mit der id 1234567 reagieren soll doch so aussehen:
define ESPEasy_notify_Tag1 notify ESPEasy_ESP_Easy_RFIDScanner:Tag:1234567 {fhem "set Zimmertur off"}
attr ESPEasy_notify_Tag1 room ESPEasy
attr ESPEasy_notify_Tag1 event-on-update-reading Tag


dann sollte es nur Reagieren wenn das Reading neu erzeugt wird oder

frank

im prinzip ja, aber in der regex noch ein punkt vor die id. denn da gibt es ein leerzeichen. und die perl klammern inklusive fhem befehl sind unnötig.
define ESPEasy_notify_Tag1 notify ESPEasy_ESP_Easy_RFIDScanner:Tag:.1234567 set Zimmertur off
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

niels330

Zitat von: Tueftler1983 am 11 April 2018, 19:36:19
also sollte sein notify wenn es nur auf den einen Tag mit der id 1234567 reagieren soll doch so aussehen:
define ESPEasy_notify_Tag1 notify ESPEasy_ESP_Easy_RFIDScanner:Tag:1234567 {fhem "set Zimmertur off"}
attr ESPEasy_notify_Tag1 room ESPEasy
attr ESPEasy_notify_Tag1 event-on-update-reading Tag


dann sollte es nur Reagieren wenn das Reading neu erzeugt wird oder

Das mit dem event-on-update-reading funktioniert aber nicht als attribut des notifys oder hab ich grad nen denkfehler? Das muss ich dann als Attribut des Scanners definieren:

attr ESPEasy_ESP_Easy_RFIDScanner event-on-update-reading Tag

so?

niels330

Internals:
   DEF        192.168.0.241 80 espBridge ESP_Easy_RFIDScanner
   ESP_BUILD  20100
   ESP_SLEEP  0
   ESP_UNIT   0
   HOST       192.168.0.241
   IDENT      ESP_Easy_RFIDScanner
   INTERVAL   300
   IODev      espBridge
   LASTInputDev espBridge
   MSGCNT     1
   NAME       ESPEasy_ESP_Easy_RFIDScanner
   NOTIFYDEV  global
   NR         499
   NTFY_ORDER 50-ESPEasy_ESP_Easy_RFIDScanner
   PORT       80
   STATE      Tag: 226093XXXX
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    0.82
   espBridge_MSGCNT 1
   espBridge_TIME 2018-04-11 19:59:06
   Readings:
     2018-04-11 19:59:06   Tag             226093XXXX
     2018-04-04 03:38:40   presence        present
     2018-04-11 19:59:06   state           Tag: 226093XXXX
   Helper:
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   303
         TRIGGERTIME 11.04.2018 20:03:54
     Received:
       Tag        1523469546.22412
Attributes:
   IODev      espBridge
   Interval   300
   event-on-change-reading .*
   group      ESPEasy Device
   presenceCheck 0
   readingSwitchText 1
   room       ESPEasy
   setState   3

hier mal die list vom Device ESPEasy_ESP_Easy_RFIDScanner

niels330

Zitat von: Otto123 am 11 April 2018, 17:36:31
Hallo Niels,

dank Eventmonitor ist das eigentlich ganz einfach.
https://wiki.fhem.de/wiki/Event_monitor

Einfach beim Event zuschauen was passiert, die richtige Zeile markieren und notify erzeugen.

Eventuell hilft auch das attribut event-on-change-reading.

Gruß Otto

P.S. Ein list ist kein Screenshot!

ich habe dem Device nun ein attr Event-on-change-reading .* gesetzt. Zweites mal Klicken bleibt aus - gut. Problem dann allerdings, dass er auch bei zukünftigen Scans der selben RFID-Karte nichts mehr macht, da ja immer wieder die selbe UID im Reading auftaucht und er erst wieder schaltet, wenn eine andere definierte UID einer anderen Schlüsselkarte eingelesen wird. Das kanns ja auch eher nicht sein  ;D