Page 1 sur 2

[Python] Utilisation de lecteur de badge RFID USB

Publié : 04 janv. 2016, 20:49
par orbnu
Bonjour,

Voulant jouer à une époque avec un lecteur RFID USB, je me suis décidé à l'utiliser comme système d'activation/désactivation de mon alarme.

N'ayant pas trouvé beaucoup de documentation sur comment le faire, ci-dessous la méthode que j'ai employée.

Matériel utilisé :
  • Un raspberry pi 2 avec Debian 8.2 (boot sur systemd)
  • Un lecteur RFID USB 125 KHz EM4100 (trouvable sur internet pour quelques euros)
  • des badges/cartes rfid (trouvables pour trois fois rien sur internet)
Le lecteur RFID est positionné à coté de la porte d'entrée. Ce lecteur est reconnu automatiquement comme un clavier, lequel simule la saisie d'un code (10 chiffres). Il faut donc : intercepter les codes capturés (mon rpi est autonome, et n'a pas d'autre clavier branché), et envoyer le bon événement.

Etape 1 : interception du lecteur.

sous Debian 8.2, on est en systemd. N'ayant pas trop de maîtrise de cela et n'utilisant pas de clavier, je me suis contenté de patcher les scripts de tty :
Dans le fichier system/serial-getty@.service, remplacer la ligne

Code : Tout sélectionner

ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
par :

Code : Tout sélectionner

ExecStart=-/bin/openvt -c 2 -f -s -w -- /home/pi/badgelisten.py
Et redémarrer le service : sudo systemctl restart



Note : dans des versions en sysvinit, il suffit d'éditer /etc/rc.local en modifiant :

Code : Tout sélectionner

1:2345:respawn:/sbin/getty 115200 tty1
Par :

Code : Tout sélectionner

1:2345:respawn:/bin/openvt -c 2 -f -s -w -- /home/pi/badgelisten.py

Etape 2 : script python
Dans domoticz, créer un device virtuel de type texte, nommé "badge"

Il suffit alors d'écrire le script suivant dans /home/pi/badgelisten.py :

Code : Tout sélectionner

#!/usr/bin/python
import httplib

conn = httplib.HTTPConnection("localhost:8080")
badge = raw_input("Badge : ")
conn.request("GET","/json.htm?type=command&param=udevice&idx={idx}&nvalue=0&svalue={txt}".format(idx=20,txt=badge))

(remplacer 20 par l'id du device badge)

Il suffit alors d'intercepter le changement de device via un script, et le code du badge entré peut être lu.

Re: utilisation de lecteur de badge RFID USB

Publié : 05 janv. 2016, 02:07
par vil1driver
Salut,

Merci du partage ;)

Re: utilisation de lecteur de badge RFID USB

Publié : 19 juil. 2019, 09:44
par Datawolf
[Mode déterrage=On]
Salut,
Je m'intéresse à la notion de présence pour activer une alarme avec Domoticz.
(en fait limitée pour l"instant aux détecteurs d'ouverture mais petit à petit...)

Si j'ai bien compris ta solution est filaire ? (ie lecteur RFID connecté en USB à la box domotique)
As-tu trouvé une solution sans fil depuis ?

@+
Datawolf

Re: utilisation de lecteur de badge RFID USB

Publié : 19 juil. 2019, 21:17
par mercusot
Directement en Z-Wave avec le mini keypad de Zipato et les puces RFID qui vont avec. Mais on n'est plus dans les mêmes budgets j'imagine.

Re: utilisation de lecteur de badge RFID USB

Publié : 22 juil. 2019, 09:36
par Datawolf
Je prévois toujours de me lancer dans une solution "MySensors".
Alors pourquoi pas un lecteur RFID lowcost connecté à un arduino :?:
Mais je n'en suis pas encore là: d'abord les cameras, ensuite la récupération de ma sirène...

Re: utilisation de lecteur de badge RFID USB

Publié : 19 juin 2020, 12:11
par jisse
Bonjour je déterre le sujet...
je fais tourner un lecteur de badge sous rasberry (wifi) avec requêtes http vers domoticz...j'ai des scripts si ça vous tente.
Je l'avais fait precedement sous arduino avec les codes aussi...je transmets si cela vous intéresse.

Re: utilisation de lecteur de badge RFID USB

Publié : 19 juin 2020, 13:28
par vil1driver
Salut,

Part du postulat que ça intéresse ;)

Re: utilisation de lecteur de badge RFID USB

Publié : 24 juin 2020, 11:40
par jisse
ok alors c'est parti
part contre, je ne sais pass pourquoi, mais ce script est particulierement gourmand en CPU
Si quelqu’un remarque une modification à faire pour eviter ce probleme, je suis preneur

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf8 -*-
 
import RPi.GPIO as GPIO
import MFRC522
import signal
import time
import requests
import urllib
import json
############# Parametres #################################


#~~~~~~~~~~ Parametres Domoticz ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
domoticz_ip="192.xxx.xxx.xxx"
domoticz_port="8080"
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# IDX de Domoticz
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# remplacer XXX par votre idx de votre widget
dummy_idx={'tagMachin': 195}

dummy_idx1={'tagTruc': 242}

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print ("Ctrl+C captured, ending read.")
    continue_reading = False
    GPIO.cleanup()
 
# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)
 
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
 
# Welcome message
print ("Lancement script autorisation")
print ("Press Ctrl-C to stop.")
 
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
    
    # Scan for cards    
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
 
    # If a card is found
    if status == MIFAREReader.MI_OK:
        print ("Card detected")
    
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()
 
    # If we have the UID, continue
    if status == MIFAREReader.MI_OK:
 
        # Print UID
        print ("Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])+','+str(uid[4]))  
        # This is the default key for authentication
        key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
        
                
        # Select the scanned tag
        MIFAREReader.MFRC522_SelectTag(uid)
       

        
        #ENTER Your Card UID here
        my_uid = [xxx.xxx.xxx.xxx] 
        my_uid1 =[yyy.yyy.yyy.yyy]
        
                
        #Check to see if card UID read matches your card UID
        if uid == my_uid:                #OK if matching UIDs
                 requete='http://NOM_UTILISATEUR:MOT_DE_PASSE@'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=switchlight&idx='+str(dummy_idx['tagMachin'])+'&switchcmd=On&level=0'
                 urllib.urlopen(requete)

                 print("Access validé")
                 print("lancement de la requete")
                 time.sleep(5)
                 print("pret")
                                        
                                       
        

        #Check to see if card UID read matches your card UID
        if uid == my_uid1:                #OK if matching UIDs
                 requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=switchlight&idx='+str(dummy_idx1['tagTruc'])+'&switchcmd=On&level=0'
                 urllib.urlopen(requete)

                 print("Access validé")
                 print("lancement de la requete")
                 time.sleep(5)
                 print("pret")
                   
            
        
##        # Authenticate
##        status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
##
##        # Check if authenticated
##        if status == MIFAREReader.MI_OK:
##            MIFAREReader.MFRC522_Read(8)
##            MIFAREReader.MFRC522_StopCrypto1()
##        else:
##            print "Authentication error"

Re: utilisation de lecteur de badge RFID USB

Publié : 24 juin 2020, 16:59
par Keros
Mets s'il te plait ton code entre les balises "code" avec le bouton </>, se sera plus lisible.

Code : Tout sélectionner

Ton code s'affichera comme ceci 

Re: utilisation de lecteur de badge RFID USB

Publié : 25 juin 2020, 09:39
par jisse
Ok la modif est faite...