Arbeitszeiterfassung

Ein Raspberry Pi, eine handvoll NFC Chips, ein paar Zeilen PHP und Python Code und fertig ist die Arbeitszeiterfassung. So wie es Frau Nahles mag.

Hintergrund

Anfang 2015, pünktlich im neuen Jahr, trat das Mindeslohngesetz in Kraft. Damit einher ging die Nachweispflicht der Arbeitzeiten von Mitarbeitern. Ja ich hör' sie jetzt schon alles rufen: "Wir haben immer Arbeitszeiten protokoliert! Sollte jeder Angestellter eh schon immer machen" und und und...

Mag sein, wir taten es noch nicht. Also musste ein Lösung her. Excel-Tabellen? Irgendwelche fertige Software oder sogar Hardware?

  • Excel-Tabellen führen ist fad und wenig innovativ
  • nur Software ist gut für Arbeitzeiterfassung im Sinne von Tasktracking. Für die reineAnwesenheit mit, Pausen, Urlaub, Krankentage etc. ist es nicht unbedingt zweckmässig
  • vorhandene Hardware/Software-Lösungen sind teuer und unflexibel

Ziele

  • Hardware zur Erfassung von Kommen und Gehen (unabhängig von einem gestarten Arbeitsplatz-PC)
  • Software zur Erfassung der Tracks
  • Anzeigt der anwesenden Stunden, Urlaubs- und Krankentage, Notiz zum Tag
  • Nutzerverwaltung
  • Verwaltung der NFC-Chips/Karten

Idee

NFC Chips gibt es in vielen Formen und Farben. Die passiven Tags sind winzig, Platz beansprucht allein die recht große Antenne die denTag gleichzeitig induktiv mit Strom versorgt. Wie der Name Nearfield schon sagt, funktionieren die Chips nur in einem sehr kleinen Abstand zum Lesegerät. Jeder Chip hat eine eindeutige ID, vergleichbar mit einer Mac-Adresse. Einfache NFC Tags können keine Programme ausführen, wie es bei der Kommunikation zwischen 2 aktiven Partnern der Fall sein kann, aber beschrieben und ausgelesen werden. Ein NFC Tag für wenige Cent kann man formatieren und dann mit Nutzdaten beschreiben. Unsere Idee war, allein durch die immer auslesbare UID der Chips eine Identifizierung zu erreichen. Es genügt die einzelnen Tags den Personen zu zu ordnen, für weitere Daten gibt es keine Notwendigkeit. Das ermöglich es den Mitarbeitern, auch mit bereits vorhandenen NFC Elementen die Zeiterfassung zu nutzen.

Was wir brauchen ist ein kleiner Rechner, der immer aktiv sein soll, dabei wenig Strom braucht, einen NFC Leser betreiben kann und eine Hand voll kompatibler NFC Tags. Dazu einen 3 Zeiler Programmcode und das Projekt läuft.


Updates

22.01.15

Hardware kaufen

Man braucht nicht lange überlegen, bis man auf den Gedanken kommt einen Raspberry Pi für diese Zwecke zu gebrauchen. Ehrlich gesagt, stand wohl erst das Buzzword Raspberry PI im Raum und was könnte man damit lustiges anstellen... Da kam das Mindestlohngesetzt von Frau Nahles wie gerufen ;-)

Spass bei Seite. Die Hardware-Kosten sind überschaubar.

Hardware Kosten Bemerkung
Raspberry PI ca. 40 Euro  
NFC Shield ca. 45 Euro  
eine Hand voll NFC Chips unter 2 Euro pro Stück  
Gehäuse um die 10 Euro Leider gibt es kein fertiges Gehäuse wo das NFC-Shield mit rein passt.

 


18.02.15

Raspberry Pi einrichten / Hard- und Software konfigurieren

Nach dem der Raspberry dem Postboten aus den Hängen genommen worden ist. Muss dieser zuerst mal mit einem Betriebssystem bespielt werden. Es empfiehlt sich Raspbian oder eine andere, auf Debian basierende Distribution. Eine Anleitung und die nötigen Tools gibt es direkt bei der Raspberry Foundation:

https://www.raspberrypi.org/downloads/

Weiter wird davon ausgegangen, dass der Raspi ein laufendes Betriebssystem und Netzwerkverbindung hat. Eine grafische Oberfläche ist nicht notwendig.

Das NFC-Explorer-Shield von NXP (PNEV512R) ist ein Demoboard zum Experimentieren mit kontaktloser Kommunikation im Hochfrequenzbereich. Vor allem läuft es auf dem SPI Anschluss der Raspberrys und ist gut dikomentiert. Es gibt fertigen Code um das Gerät zu anzusprechen. Da sich jedoch keiner mit einem Bashscript oder gleich C Code beschäftigen wollte, war es ein großes Glück, dass es ein Projekt im Github gibt, welches einen Wrapper um die Bibliotheken in Python legt.

In einer fernen Zukunft wird das Gerät auch ein optisch gefälliges Gehäuse bekommen. Es bot sich also an, einen kleinen Piezo-Pieps zu verbauen und LEDs zu nutzen um dem Benutzer Feedback zu geben, ob was funktioniert und ob der Vorgang abgeschlossen ist. Der Piep und die LEDs werden über die frei bleibenden GPIOs Pins am Raspi gesteuert, was recht einfach mit Python zu machen ist. Leider ragt das NFC Shield über den GPIO-Port. Ohne ein passendes Flachbandkabel welches das Shield physikalisch vom Raspi hat man einige Probleme, noch Kabel für LED und Piep am Raspi unter zu bringen.

Wir haben nun eine LED mit 2 Kabeln, einem Widerstand und das NFC-Shield. Diese Teilse werden mit dem Raspi verbunden. Das NFC Shield passt ziemlich genau auf den Raspi, verhindert in der Folge, ein käufliches Gehäuse zu verwenden. Der Piep hängt im Moment mal einfach in der Luft. Er ist mit einem freien GPIO-Pin und Masse verbunden. Nun kann der Raspi Strom bekommen. Es geht an das Einrichten der Software.

Das Projekt 'nxppy' auf Github enthält eine Setup-Routine, die alle notwendigen Komponenten beschafft, kompiliert und installiert. Es ist auch möglich nxppy einfach mit pip zu installieren. Das schaut so aus:

sudo pip install --upgrade nxppy

Da allerlei Komponenten wie WiringPI und die NXP-Libs geladen werden, dauert das ein wenig. Das Ein bauen aus dem Git-Repository ist ebenfalls einfach:

git clone https://github.com/svvitale/nxppy.git
cd nxppy
python setup.py build install

Das lädt ebenfalls alle nötigen Komponenten aus dem Netz, kompiliert den Code und installiert ihn. Daher sollte man als root arbeiten oder entsprechend mit sudo.

Es gibt nun alle benötigten Bibliotheken am Raspi und die Hardware ist zusammen gesteckt. Ein wichtiger Schritt kann noch fehlen, ohne den aber gar nichts passieren wird. SPI muss am Raspi aktiviert werden. Dazu muss man raspi-config bemühen und unter den advanced Options (8) bei SPI 2x "yes" wählen. Nun sollte das Board arbeiten und angesteuert werden können.


20.02.15

Python Code

Das nxppy Projekt auf Github zeigt ein einfaches Beispiel:

import nxppy
import time

mifare = nxppy.Mifare()

# Print card UIDs as they are detected
while True:
    try:
        uid = mifare.select()
        print(uid)
    except nxppy.SelectError:
        # SelectError is raised if no card is in the field.
        pass

    time.sleep(1)

Dies zeigt schon die nötigen Schritte um die UID einer Karte zu lesen. Dieses Beispiel ein wenig erweitert ergibt den Python-Code der benutzt wird um folgendes zu tun:

Abfrage der UID eines NFC Tags im Umfeld des Lesers.
Wenn eine UID gelesen werden kann, wird diese an eine URL geschickt. Die grüne LED (im Moment die, die im Raspi eingebaut ist) zeigt Feedback. Die rote LED blinkt, wenn das Script läuft. Das aufgerufene Ziel liefert in einem Feld im Header eine Zahl. Diese wird verwendet um die LED und den Piep entsprechend oft blinken/piepen lassen. So lassen sich Informationen vom Server an den NFC-Leser zurück schicken. 2x Piep dient im Moment für "OK". Es gibt Signale für "Server nicht erreichbar" und "unbekannte Karte". Das Python Script ist sehr einfach gehalten und sicher ausbaufähig. Es geht recht robust über Wochen und schreibt ein kleines Log.

https://github.com/solongo-devs/timr/tree/master/nfc

Der an der Wand befestigte Raspi ist nun ein Kartenlesegerät. Er schickt gelesene UIDs von NFC Geräten an einen Server. Das Ganze ist ausbaufähig mit einem schönem Gehäuse und vor allem der Möglichkeit, mehr Informationen an den Nutzer zu schicken. Es gibt 2x16 Zeilen Displays, wo als Beispiel:

Malthe GEHEN             8:43h
Saldo: + 445h    Urlaub: 4T

Zu lesen ist. Oder andere Informationen.


31.03.15

Software

Nachdem wir das kleine Stück Hardware dazu gebracht haben ein paar Signale zu senden, bedurfte es einer Gegenstelle die diese auswertet und entsprechend darstellt.

Wir benutzen das PHP-Framework symfony und ein Standard Bootstrap Theme. Raus kam ein Stückchen webbasierte Software mit der man folgende Sachen anstellen bzw. Daten ablesen kann:

  • Liste aller Angestellten
  • Hinzufügen und bearbeiten von Angestellten
  • Liste aller am System angemeldeten NFC-Chips/Cards/etc.
    • NFC Dinge fügen sich allein hinzu nach dem man diese initial an den NFC-Reader hält (unzugeordnet im System gelistet)
  • Verbinden von Angestellten und NFC Cards (mehrere Karten, Chips, Smartphone, Armbänder sind möglich pro Nutzer/Angestellter)
  • Liste der Timetracks
    • Manuelles hinzufügen von Timetracks
    • Setzen eines Status (Urlaub, Krank, Schule, etc.)
    • hinzufügen einer Notiz
  • Rudimentäre Auswertung
    • Stunden pro Monat
    • Durchschnitt pro Monat
    • Durchschnitt pro Jahr
    • Über-/Fehlstunden kummuliert aus Jahr (dabei werden Urlaub, Krankheit, Schule und halbe Tage berücksichtig)
  • Rudimentäre Rechte Verwaltung (bisher ohne Interface)

Das Projekt befindet sich auf github unter:

https://github.com/solongo-devs/timr/tree/master/timetracker


Hello World!