Per RFID Website aufrufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Hallo zusammen,

ich bin nicht ganz so fit in Python, generell aber tiefere Kenntnisse in Software Entwicklung.
Ich möchte mit meinem kleinen Projekt, auf einem Raspberry mit einem Touch Display eine Website aufrufen, scannt eine Person seinen RFID Token, öffnet das Python Skript eine weitere URL und übergibt die ID des RFID Token.

Das ganze habe ich mal mit Selenium und dem Chromium Browser realisiert.

Ich würde gern meinen Code mal hier Teilen, mit der Bitte um Hinweis, ob der Code so ok ist und was ich definitiv noch anpassen muss. Ich denke da grade an Error Handling.
Ich würde auch gern das Skript abbrechen, falls der Browser geschlossen wird.

Code: Alles auswählen

#!/usr/bin/env python

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import time
import mouse
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

reader = SimpleMFRC522()
signalPIN = 12
GPIO.setup(signalPIN, GPIO.OUT)


def initBrowser():
    chrome_options = Options()
    chrome_options.add_argument("kiosk")
    chrome_options.add_experimental_option("useAutomationExtension", False)
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

    browser = webdriver.Chrome(options=chrome_options)
    global_browser = browser
    browser.get('http://localhost/')
    return browser


# small funktion to change current page in browser
def navigate(browser, url):
    if browser is None:
        print('navigation not available')
    else:
        browser.get(url)

def beep():
    GPIO.output(signalPIN, 1)
    time.sleep(0.1)
    GPIO.output(signalPIN, 0)


try:
    print('Browser wird geöffnet')
    browser = initBrowser()

    while (True):
        id, text = reader.read()
        beep()
        mouse.move(1,0,False,1)
        uid_string = str(id)
        url = 'http://localhost/scantoken/' + uid_string
        print('Rufe Seite: "' + url + '" auf')
        navigate(browser, url)

except KeyboardInterrupt:
    GPIO.cleanup()
    raise


Vielen Dank
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen und Funktionen schreibt man komplett klein, KONSTANTEN groß. `as` bei Import ist zum Umbenennen von Namen da, GPIO wird aber gar nicht umbenannt.
Aller Code gehört in Funktionen, es gibt üblicherweise eine Funktion main, die das Hauptprogramm enthält.
`global_browser` wird nie benutzt. Die Klammern um (True) sind unnötig. Strings setzt man nicht mit + zusammen, sondern nutzt Formatstrings.
`cleanup` sollte immer am Ende aufgerufen werden, nicht nur bei Ctrl+C.

Code: Alles auswählen

from RPi import GPIO
from mfrc522 import SimpleMFRC522
import time
import mouse
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

SIGNAL_PIN = 12

def initBrowser():
    chrome_options = Options()
    chrome_options.add_argument("kiosk")
    chrome_options.add_experimental_option("useAutomationExtension", False)
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

    browser = webdriver.Chrome(options=chrome_options)
    global_browser = browser
    browser.get('http://localhost/')
    return browser


# small funktion to change current page in browser
def navigate(browser, url):
    if browser is None:
        print('navigation not available')
    else:
        browser.get(url)


def beep():
    GPIO.output(SIGNAL_PIN, 1)
    time.sleep(0.1)
    GPIO.output(SIGNAL_PIN, 0)


def main():
    try:
        reader = SimpleMFRC522()
        GPIO.setup(SIGNAL_PIN, GPIO.OUT)

        print('Browser wird geöffnet')
        browser = initBrowser()

        while True:
            id, text = reader.read()
            beep()
            mouse.move(1, 0, False, 1)
            url = f'http://localhost/scantoken/{id}'
            print(f'Rufe Seite: "{url}" auf')
            navigate(browser, url)
    finally:
        GPIO.cleanup()


if __name__ == "__main__":
    main()
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich habe den Code mal bisschen verändert.

Wie Namen aussehen sollen, ist ja schon geklärt worden.
Möglicherweise ist nicht alles angepasst.

Den Code auf Modulebene habe ich in die Funktion main gepackt.
Die Initialisierung des GPIO in setup_gpio, dass in main aufgerufen wird.
Dann wird in main die RFID-Reader-Instanz erzeugt. Da es nur in main benötigt wird,
muss man das den anderen Funktionen auch nicht übergeben.

Der try...except-Block wird auch kürzer, da nur main() im try-block aufgerufen wird.
In setup_gpio wird gpio.cleanup mittels atext.register registriert. Bevor der Interpreter beendet wird, werden die registrierten Funktionen aufgerufen.

Achja, GPIO habe ich nach gpio umbenannt, da gpio ein Modul ist und Module kleingeschrieben werden.

Dann habe ich den Code noch mal durch shed und ruff gejagt.

Code: Alles auswählen

#!/usr/bin/env python3

import atexit
import time
from urllib.parse import urljoin

import mouse
import RPi.GPIO as gpio
from mfrc522 import SimpleMFRC522
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

SIGNAL_PIN = 12


def setup_gpio():
    gpio.setup(SIGNAL_PIN, gpio.OUT)
    atexit.register(gpio.cleanup)


def init_browser():
    chrome_options = Options()
    chrome_options.add_argument("kiosk")
    chrome_options.add_experimental_option("useAutomationExtension", False)
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

    browser = webdriver.Chrome(options=chrome_options)
    browser.get("http://localhost/")
    return browser


def navigate(browser, url):
    if browser is None:
        print("navigation not available")
    else:
        browser.get(url)


def beep():
    gpio.output(SIGNAL_PIN, 1)
    time.sleep(0.1)
    gpio.output(SIGNAL_PIN, 0)


def main():
    setup_gpio()
    reader = SimpleMFRC522()
    print("Browser wird geöffnet")
    browser = init_browser()

    while True:
        uid, text = reader.read()
        beep()
        mouse.move(1, 0, False, 1)
        url = urljoin("http://localhost/scantoken", str(uid))
        print(f'Rufe Seite: "{url}" auf')
        navigate(browser, url)


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pass

sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Mega, vielen Dank für den Support!! Auch gleich noch was zu Python mit aufgeschnappt.
Antworten