RFID Reader mit Wiegand 26 Schnittstelle an ESP8266 betreiben

Hallo zusammen,
ich möchte euch hier meine Umsetzung eines Wiegand 26 RFID-Lesers an einem ESP8266 vorstellen. Das ganze ist auch bei mir nie aus der Bastelecke raus gekommen da es beim ersten Versuch gleich funktionierte und seitdem nicht mehr angepackt wurde :smiley:

  • [li]Funktionsbeschreibung:
    [/li]Ein RFID Reader ist über seine Wiegand 26 Schnittstelle an einem ESP8266 (WEMOS D1mini) angeschlossen. Auf dem ESP läuft die Software easyESP mit konfiguriertem RFID Device. Sobald der Reader ein Signal bekommt wird es im ESP aufbereitet und über WLAN an einen Server Socket in IPS weitergeleitet. Dort durchläuft es zwei Splitter-Instanzen (Es geht bestimmt auch mit einer…) und landet letztendlich in einem Auswerteskript welches entscheidet ob der Key zugelassen ist oder nicht. Ab dann kann ich damit verschiedene Sachen machen (lassen).
  • [li]Schaltung:
    [/li]
    Da der RFID Reader ein 5V Signal sendet und der ESP nur max 3,3V verträgt, habe ich den Signalpegel mittels Spannungsteiler auf verträgliche 3,15V gedrosselt.
    ACHTUNG!
    Ich bin mir nicht sicher ob alle RFID-Reader bzw. ob die Wiegand 26 Schnittstellen grundsätzlich mit 5V arbeiten. Deshalb vorher lieber messen. Mein Reader arbeitet mit 12V und gibt eben 5V raus.

[ul][li]ESP Konfiguration:
[/li]

Die ESP Konfiguration habe ich von der Seite: RFID - Let’s Control It

Die Software easyESP nach Anleitung auf dem ESP installieren und einrichten.
-WLAN
-IP Adresse (ggf. DHCP)
-Passwort
-unter Config / main Settings das Protocol auf „Domoticz HTTP“ stellen und bei „Controller IP“ die Adresse von IPS eintragen
esp_config1.png

Unter Device legen wir nun ein RFID Device an:
esp_device1.png

Damit ist der ESP erstmal fertig konfiguriert.

[/ul]

  • [li]Konfiguration in IPS:
    [/li]

    [li]In IPS legen wir als erstes unter I/O Instanzen ein Server Socket an und konfigurieren es.
    [/li]ips_server_socket.png

    [li]Dann habe ich die erste Splitter Instanz angelegt und (in meinem Fall) wie folgt konfiguriert.
    [/li]ips_splitter1.png

    Um den hinteren Teil des Datagramms zu schneiden lasse ich noch eine zweite Splitter-Instanz drüberlaufen.
    ips_splitter2.png

    Die vorigen beiden Schritte sind sicherlich auch schöner zu realisieren aber wie bereits geschrieben war das für mich ein „Fire an forget“ Thema :D.


    [li]Nun benötigen wir noch einige Variablen und ein Auswerteskript welches bei Eintreffen eines Datagramms aufgerufen wird.
    [/li]Ich habe die Variablen wie folgt aufgebaut:


    Erklärung:
    letzte Aktivität (String)= Wird zur Darstellung im WF benötigt
    Schlüssel aktiv (Boolean) = Variable welche über WF geschaltet werden kann falls der Schlüssel verloren geht o.ä…
    ID_Boris (String) = Beinhaltet die ID meines RFID-Chips.

    [li]Dann bauen wir uns ein Skript zur Auswertung:
    [/li]
    <? date_default_timezone_set("Europe/Berlin"); $timestamp = time(); $datum = date("d.m.Y",$timestamp); $uhrzeit = date("H:i",$timestamp); $set_date = ($datum.' - '.$uhrzeit.' Uhr'); if ($_IPS['SENDER'] == "RegisterVariable") { $IRF_leser = $_IPS['VALUE']; SetValueString(56075 /*[RFID\Datenpuffer]*/, $IRF_leser); //echo " RFID-Karte Nr.: "; //echo $IRF_leser; $Zulass1=getvaluestring(21409 /*[RFID\Boris\Schlüssel aktiv\ID_Boris]*/); $Zulass1_status=getvalue(28042 /*[RFID\Boris\Schlüssel aktiv]*/); If (($Zulass1 == $IRF_leser) && ($Zulass1_status == true)) { setValueBoolean(20153 /*[RFID\open]*/,true); SetValueString(36879 /*[RFID\Boris\letzte Aktivität]*/,$set_date); If (GetvalueBoolean(20030 /*[Homematic\Räume\Treppenhaus\Keymatic\STATE]*/) == false) { HM_WriteValueBoolean(39258 /*[Homematic\Räume\Treppenhaus\Keymatic]*/, "OPEN", true); SetValue(59152 /*[RFID\letzte Meldung]*/,"Boris hat die Haustür entriegelt"); IPS_RunScript(14892 /*[Telegram\Telegram: RFID\Send: RFID ]*/); } else { HM_WriteValueBoolean(39258 /*[Homematic\Räume\Treppenhaus\Keymatic]*/, "STATE" , false); SetValue(59152 /*[RFID\letzte Meldung]*/,"Boris hat die Haustür verriegelt"); IPS_RunScript(14892 /*[Telegram\Telegram: RFID\Send: RFID ]*/); } } else { } setValueBoolean(20153 /*[RFID\open]*/,false); } ?>


    [li]Als letztes kommt dann die Registervariable welche das Ergebnis der zweiten Splitterinstanz an das Auswerteskript übergibt.
    [/li]

##ENDE##

Hier ist zur jeweiligen Anpassung sicherlich etwas Fummelei nötig aber so als Grundgerüst oder Starthilfe tut es allemal.

Viele Grüße und viel Erfolg
Boris

Cool danke für die Info.
Da ich mir mal zum Spielen zwei ESP8266 und einen ESP32 gekauft hab, wäre das jedenfalls mal eine Sache zum ausprobieren…

Gesendet von meinem SM-G935F mit Tapatalk