DIY Raspberry Pi Stechuhr mit NFC - Teil 2
Die Fortsetzung unseres Neos/Flow Meetups zur Entwicklung einer mit NFC gesteuerten Raspberry Pi Stechuhr lies, im Vergleich zum korrespondierenden Blog-Post, nicht lange auf sich warten. Entschuldigung für die Verzögerung!
Recap Teil 1
In Teil 1 unserer Raspberry-Pi-Bastelaktion trafen wir auf ein unerwartetes Problem:
- Lesen eigens beschriebener Chips mit dem NFC-Modul RFID RC522
Nach über 4h abendlicher Bastelei waren wir nicht in der Lage dies schnell zu beheben.
Zur Erinnerung und Auffrischung geht es hier zu Teil 1 der Raspberry Pi Stechuhr.
Während des zweiten Bastel-Abends trafen wir auf weitere technische Herausforderungen, die wir fernab solcher Veranstaltungen und parallel zur Entstehung von Teil 2 lösen mussten.
Problem 1: Auslesen eigens beschriebener RFID-Chips mit NFC-Modul RFID RC522
In Teil 1 kamen wir zu dem Schluss, uns nach einer neuen NFC Bibliothek zum Auslesen der Chips umzuschauen, da die ursprünglich verwendete unsere selbstbeschriebenen im NDEF Format nicht lesen konnte.
Nachdem wir einige Nächte darüber geschlafen hatten, fiel uns eine einfachere Lösung ein - die interne Seriennummer der RFID-Chips.
Jeder RFID-Chip besitzt eine eineindeutige Seriennummer. Diese lesen wir nun aus und ordnen sie innerhalb des Flow Controllers dem jeweiligen Sandstormer zu.
Da es sich bei dieser Zuordnung um keine sicherheitsrelevanten Informationen wie bspw. Passwörter oder SSH-Keys handelt, nutzten wir kurzerhand die settings.yaml
Problem 2: Browser gezielt steuern
Update 2020
Aus sicherheitstechnischen Gründen hat Mozilla sämtliche Extensions entfernt, die Remote-Code ausführen. Dies betrifft auch das von uns genutzte Add-On. Deshalb haben wir diesen Part an die aktuellen Gegebenheiten angepasst. Die aktualisierte Lösung findet ihr hier:
DIY Raspberry Pi Stechuhr mit NFC (Teil 3)
-----------------------------------------------------------------------------------------------------------------------
Analog unserer bisherigen Zeiterfassung soll auch der Raspberry Pi bei Anhalten des individuellen RFID Chips die korrespondierende Zeiterfassungs-Website des Sandstormers öffnen.
Standardmäßig ist es jedoch nicht möglich einzelne Browsertabs zu steuern und sie neue URLs aufrufen zu lassen, wie in unserem Fall nötig. Der Browser kann lediglich beim initialen Start oder Öffnen eines neuen Tabs eine spezifische URL öffnen. Da der Raspberry Pi durch seine weniger potente Hardware jedoch sehr lange brauch, um Firefox zu schließen und wieder zu starten, ist dies keine Option für den operativen Betrieb. Auch das Öffnen dutzender Tabs verlangsamt den Pi sukzessive und macht ihn damit unbrauchbar.
Die Lösung liefert das Addon Remote Control for Firefox. Es erweitert den Raspberry Pi Firefox um die benötigte Funktionalität. Via Telnet schicken wir JS Code an den Pi, die die Seite laden bzw. neuladen lassen.
Der angepasste Python Code sieht nun folgendermaßen aus:
Problem 3: Kubernetes
Parallel zum Projekt zogen wir unsere komplette Infrastruktur um. Statt Heroku setzen wir nun auf Kubernetes.
Unser Intranet ist durch einen SSO (Single Sign-on) geschützt, welches bisher keine Ausnahmen für externe Zugriffe außerhalb der bekannten Strukturen erlaubte. Dahingehend mussten wir unsere Nginx Ingress Controller Konfiguration anpassen.
Dabei haben wir einige Stolpersteine mitgenommen. In der Konfiguration wurde "ssl: true" aus der Build-Variablen entfernt. Dies hatte zur Folge, dass der "tls"-Block aus Ingress entfernt wurde und es daher keine SSL-Konfiguration gab.
Der 2. Ingress muss darüber hinaus auch als SSL markiert werden, was den Einsatz von "kubernetes.io/tls-acme" notwendig macht sowie den "tls:"-Block, der sagt, für welche Domains Zertifikate ausgestellt werden sollen.
Erschwert wurde das Gesamtkonstruktut dadurch, dass Kube-Lego deprecated ist und auf Kubernetes 1.9 nicht mehr supported wird. Dahingehend mussten wir alternativ erst auf cert-manager updaten.
Problem 4: Skript im Autostart
Last but not least - Der Pi soll ohne weiteres Zutun unsererseits nach einem Neustart von alleine wieder einsatzbereit sein. Dafür wurde Firefox in den Autostart gesetzt und unser eigener System Service frankWalter.service implementiert (s.u.)
Um den System Service ausführen zu können, wird ein neuer Benutzer benötigt. Dabei ist auch darauf zu achten, dass der Nutzer die Rechte hat den Code ausführen zu dürfen.
Raspberry Pi Installation
- Kopieren von timeClock.py und MFRC522.py nach /utl/
- Kopieren von frankWalter.service nach /etc/systemd/system
- Leserechte für timeClock.py für User einrichten
- Firefox installieren: sudo apt-get install firefox-esr
- Addon Remote Control for Firefox installieren
- systemctl daemon-reload
- systemctl enable frankWalter
- systemctl start frankWalter
- Firefox in den Autostart integrieren
- Fertig!
Fertig!
Die Zeiterfassung eines jeden Sandstormers lässt sich nun bequem per RFID-Chip starten und stoppen!
Für weitere Fragen stehen wir euch gern zur Verfügung!