Seite 1 von 1

Per RFID Website aufrufen

Verfasst: Dienstag 2. Mai 2023, 09:53
von matze1708
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

Re: Per RFID Website aufrufen

Verfasst: Dienstag 2. Mai 2023, 12:49
von Sirius3
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()

Re: Per RFID Website aufrufen

Verfasst: Dienstag 2. Mai 2023, 13:09
von DeaD_EyE
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


Re: Per RFID Website aufrufen

Verfasst: Mittwoch 3. Mai 2023, 07:57
von matze1708
Mega, vielen Dank für den Support!! Auch gleich noch was zu Python mit aufgeschnappt.