RFID-Tags sind inzwischen für wenige Euro zu bekommen und so liegt es nahe, RFID-Karten oder Schlüsselanhänger zur Steuerung verschiedener Programmabläufe im eigenen Smarthome einzusetzen. Denkbar ist beispielsweise die Steuerung der Musikanlage via RFID-Karten (wie hier: https://youtu.be/AvCseOQidSw), die Steuerung und Verrechnung einer von mehreren Anwendern benutzten privaten Elektroauto-Ladesäule oder Kaffeemaschine.
Wir benötigen für unseren RFID-Reader nur einen kleinen Microcontroller in Form eines ESP8266 Prozessors und ein Mifare 522 RFID-Modul. Beides zusammen ist inklusive Versand aus China unter 10 Euro zu bekommen - beispielsweise bei AliExpress. (vgl. 2)
/*
Wichtig dabei zu wissen: RFID-Tags sind heute einfach zu klonen, somit eignen sie sich nicht ohne weitere Absicherung zur Steuerung des Zutritts in sensible Bereiche. (vgl. 1)
Das System könnte aber beispielsweise versteckt verbaut werden und über den Miniserver nur bei Anwesenheit eines Benutzers im Geofence mit Strom versorgt werden. Somit wäre der RFID-Leser nur verwendbar, wenn sich ein Bewohner dem Objekt nähert. Die Bootzeit des ESP8266 liegt bei etwa einer Sekunde - ist also nahezu verzögerungsfrei. Via Miniserver ließe sich zusätzlich via Ping überwachen ob der ESP angeschaltet ist - und somit eine externe Stromversorgung feststellen und Einbruch-Alarm auslösen.
Das System könnte aber beispielsweise versteckt verbaut werden und über den Miniserver nur bei Anwesenheit eines Benutzers im Geofence mit Strom versorgt werden. Somit wäre der RFID-Leser nur verwendbar, wenn sich ein Bewohner dem Objekt nähert. Die Bootzeit des ESP8266 liegt bei etwa einer Sekunde - ist also nahezu verzögerungsfrei. Via Miniserver ließe sich zusätzlich via Ping überwachen ob der ESP angeschaltet ist - und somit eine externe Stromversorgung feststellen und Einbruch-Alarm auslösen.
Wir benötigen für unseren RFID-Reader nur einen kleinen Microcontroller in Form eines ESP8266 Prozessors und ein Mifare 522 RFID-Modul. Beides zusammen ist inklusive Versand aus China unter 10 Euro zu bekommen - beispielsweise bei AliExpress. (vgl. 2)
Als erstes muß das Modul an den ESP8266 angeschlossen werden und die Stromversorgung sichergestellt werden.
Die nachfolgende, von mir in fritzing erstellte Skizze zeigt die nötigen Verbindungen:
Nach der Verkabelung geht es ans Aufspielen der Software - genauer um das Flashen der Firmware des ESPs. Hierfür kann unter Windows das Programm Arduino Create verwendet werden, das um ein Modul zur Kommunikation mit einem ESP8266 erweitert werden muß. Zusätzlich muss die Library für den 522er RFID-Leser sowie für die WLAN IP Kommunikation installiert werden (via "Manage Libraries").
Mit dem so konfigurierten Arduino Create kann über USB der ESP8266 mit unserem Programm ("Sketch") geflasht werden.
Hier der Sketch:
/*
* ----------------------------------------------------------------------
* Program to read new NUID from a PICC to serial und via UDP (WiFi)
* ----------------------------------------------------------------------
* https://circuits4you.com/2018/10/03/rfid-reader-rc522-interface-with-nodemcu-using-arduino-ide/
*
* RC522 Interfacing with NodeMCU
*
* Typical pin layout used:
* ----------------------------------
* MFRC522 Node
* Reader/PCD MCU
* Signal Pin Pin
* ----------------------------------
* RST/Reset RST D1 (GPIO5)
* SPI SS SDA(SS) D2 (GPIO4)
* SPI MOSI MOSI D7 (GPIO13)
* SPI MISO MISO D6 (GPIO12)
* SPI SCK SCK D5 (GPIO14)
* 3.3V 3.3V 3.3V
* GND GND GND
*/
#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "SSID des WLANs";
const char* password = "WLAN passwort";
constexpr uint8_t RST_PIN = 5; // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 4; // Configurable, see typical pin layout above
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];
WiFiUDP Udp;
unsigned int localUdpPort = 5020; // local port to listen on
char incomingPacket[255]; // buffer for incoming packets
char replyPacket[] = "Hi there! Got the message :-)"; // a reply string to send back
void setup()
{
Serial.begin(115200);
SPI.begin(); // Init SPI bus
rfid.PCD_Init(); // Init MFRC522
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println(F("This code scan the MIFARE Classsic NUID."));
Serial.println(F("Using the following key:"));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println("");
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
Udp.begin(localUdpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
void loop()
{
// Look for new cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( ! rfid.PICC_ReadCardSerial())
return;
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
Serial.println(rfid.PICC_GetTypeName(piccType));
// Check is the PICC of Classic MIFARE type
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
rfid.uid.uidByte[1] != nuidPICC[1] ||
rfid.uid.uidByte[2] != nuidPICC[2] ||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
Serial.println(F("A new card has been detected."));
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.println(F("The NUID tag is:"));
Serial.print(F("In hex: "));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print(F("In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
}
else Serial.println(F("Card read previously."));
printHex(rfid.uid.uidByte, rfid.uid.size); // Auch bekannte Karte wird ausgegeben
Serial.println(F(""));
// ab hier eingefügt für RFID output
Udp.beginPacket("192.168.0.1", 1234); // IP und Port des LOXONE Miniservers
Udp.write(rfid.uid.uidByte, rfid.uid.size);
Udp.endPacket();
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}
Nach dem Upload kann die serielle Ausgabe im Monitor des Arduino Create debugged werden. Funktioniert hier die Erkennung der Tags, kann in der LOXONE Config der Bereich virtuelle Eingänge ausgewählt werden und dann im UDP-Monitor die Ausgabe beobachtet werden. Hier wird nun die ID der Tags per UDP-Paket übertragen. Nun kann man einen virtuellen Eingang erstellen, mit der IP und Port des ESP8266. Darunter dann pro Tag einen Befehl bestehend aus der ID des Tags im Attribut "Befehlserkennung" und aktiviert die Option "als Digitaleingang verwenden".
Jetzt braucht man den virtuellen Befehl nur mehr mit seiner gewünschten Funktion/Logik verbinden.
Viel Spaß beim nachbauen!
2 www.aliexpress.com
Weiterführende Literatur:
3 https://www.hackster.io/smerkousdavid/arduino-ethernet-rfid-card-reader-1ffdee
4 https://lazyzero.de/elektronik/esp8266/rfid_mqtt/start
5 https://www.loxforum.com/forum/faqs-tutorials-howto-s/21162-rfid-reader-arduino-ethernet-rc522
6 https://www.instructables.com/id/ESP32-With-RFID-Access-Control/
Weiterführende Literatur:
3 https://www.hackster.io/smerkousdavid/arduino-ethernet-rfid-card-reader-1ffdee
4 https://lazyzero.de/elektronik/esp8266/rfid_mqtt/start
5 https://www.loxforum.com/forum/faqs-tutorials-howto-s/21162-rfid-reader-arduino-ethernet-rc522
6 https://www.instructables.com/id/ESP32-With-RFID-Access-Control/
Hallo
AntwortenLöschenIst es möglich in diesem Sketch auch die originalen Loxone RFID-Tag´s zu implementieren.
Bei mir kommt jetzt die Fehlermeldung
"PICC type: PICC compliant with ISO/IEC 14443-4
Your tag is not of type MIFARE Classic."
Würde mich über eine positive Antwort freuen.
Lg
Philipp
Hallo Philipp,
Löschendie Hardware sollte alle RFID_Tags von Mifare unterstützen. Soweit ich sehe sind auch die LOXONE RFID Tags von Mifare, allerdings mit der aktuelleren Desfire Verschlüsselung.
Der Sketch hier unterstützt nur die Classic Versionen.
Ich würde an Deiner Stelle nach einem Sketch suchen, der Desifre Karten auslesen kann; wenn man den Auslese-Teil im Sketch oben dann mit einem passenden aus einem anderen Sketch ersetzt, sollte die Funktion gegeben sein. Kannst Du mit folgendem Sketch die Loxone Tags auslesen?
https://arduino-projekte.webnode.at/meine-projekte/zugangskontrolle-mit-rfid-1/uid-sak-type/
Liebe Grüße
Nico