NFC-Chips loggen für Zeiterfassung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo

    Ich bin neu hier im Forum, mein Name ist Michael, ich bin 39 Jahre jung und komme aus der Oberpfalz.
    Euer Forum hat mir schon viele Ideen gegeben, doch diesmal sitze ich auf dem Schlauch.

    Zuerst zum gedachten Projekt: Ich würde gerne für Einsatzkräfte unseres Rettungsdienstes Bereitschaftsstunden protokollieren, mittels NFC-Chip.
    Die Hardware steht und funktioniert, als NFC-Platine habe ich eine NXP elements14 (steht so drauf). Die Chips werden erkannt und ich kann damit auch schon ein bisschen was anfangen.
    Eine Zeiterfassungs-Software wie http://www.small.li habe ich getestet, funktioniert auch, allerdings nicht über 24 Uhr hinweg. Deshalb dachte ich vielleicht kann ich das ja über Python und ein LOG versuchen.

    Ich hab also mal versucht was aufzusetzen, was im Grunde auch schon funzt:


    Ich lege einen NFC-Chip auf, es piepst und die Chipnummer ist im Log, soweit so gut...

    Jetzt die Frage; kann ich:
    a) in mehrere LOG-Dateien schreiben (Chip-Nr. 123 in LOG-Datei 123, ChipNr. 456 in LOG-Datei 456) um es später leichter auszulesen?
    Log-Einstellungen aus dem Python-Handbuch habe ich schon getestet, da bekomme ich immer Syntax-Fehler
    b) im Code if uid = "123456": schreiben um den LOG-Text abzuändern?

    Code
    if uid is '123456':
                     print ('Hallo Michael, Deine Chipnummer:' +  uid)
                     logging.info('Michael:'  + uid)
                     time.sleep(3)
           if uid <> '123456':
                     print ('Hallo Fremder, Deine Chipnummer:' +  uid)
                     logging.info('Fremder Chip:'  + uid)
                     time.sleep(3)


    Wenn ich ein zweites if unter den ersten Block setze überspringt es mir den ersten Block und führt den zweiten aus, ein else brachte mir einen Syntax-Error

    Das alles ist wahrscheinlich etwas verwirrend geschrieben, ich hoffe man versteht mich.
    Ich weiß selbst dass das nicht die Top-Lösung wäre, doch was anderes fällt mir nicht ein bzw. weiß ich nicht wie ich es umsetzen kann (SQL o.ä.), dafür reichen meine Kenntnisse nicht aus...
    Eine Integration in FHEM habe ich auch schon versucht um vielleicht einen dummy mit den Chips zu steuern der dann geloggt wird, da scheitere ich allerdings an der Verbindung zu FHEM, die Anleitung in FHEM-Wiki bezieht sich auf andere Hardware und damit auch andere Befehle.

    Vielleicht ist ja jemand unter Euch der ein ähnliches Projekt erstellt hat.

    Vorab schon mal recht herzlichen Dank für Eure Gedanken.

    Liebe Grüße

    Michael

  • Wäre es nicht flexibler, die Daten in eine Datenbank zu schreiben? Das gibt dir später viel bessere und einfachere Möglichkeiten der Auswertung.

    Die If Struktur sollte grundsätzlich klappen. Schau mal in eine Befehlsreferenz - sicher nur ein kleiner Fehler im Detail. Ich sehe ihn auf die Schnelle auch nicht.
    Warum baust du hinter jede Prüfung ein Time.sleep() - willst du dein Programm mit Gewalt langsamer machen?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    • Offizieller Beitrag

    Hallo Pflasterbicker,

    zu b)

    Wäre nicht nötig, wenn Du Frage a) umsetzt und als Dateinamen die uid nimmst.

    Mit einer Datenbank wäre es aber zur Auswertung die bessere Lösung. In Python habe ich in der Richtung auch noch nichts gemacht.

    //Edit: War wieder einer schneller. ;)


  • Ja welche denn?

    Code
    pi@raspberry-pi-alarm:~ $ python scan2.py
     File "scan2.py", line 14
       def setup_logger(Michael, /home/pi/michael.log, level=logging.INFO):
                                 ^
    SyntaxError: invalid syntax
    pi@raspberry-pi-alarm:~ $


    Hab dann mal Anführungszeichen vor den Dateipfad, Syntaxfehler.
    Wenn ich die " durch einfach Striche ersetze kommt folgende Meldung

    Code
    pi@raspberry-pi-alarm:~ $ python scan2.py
     File "scan2.py", line 14
       def setup_logger(Michael,'/home/pi/michael.log', level=logging.INFO):
                                                     ^
    SyntaxError: invalid syntax
    pi@raspberry-pi-alarm:~ $

    Habe mehrere Logger erstellt, dabei kommt oben beschriebener Fehler, Logger hab ich noch nie auf diese Art erstellt, wahrscheinlich habe ich irgendwo einen Schreibfehler drin...


    Automatisch zusammengefügt:


    Wäre es nicht flexibler, die Daten in eine Datenbank zu schreiben? Das gibt dir später viel bessere und einfachere Möglichkeiten der Auswertung.

    Die If Struktur sollte grundsätzlich klappen. Schau mal in eine Befehlsreferenz - sicher nur ein kleiner Fehler im Detail. Ich sehe ihn auf die Schnelle auch nicht.
    Warum baust du hinter jede Prüfung ein Time.sleep() - willst du dein Programm mit Gewalt langsamer machen?

    Ich bin da echt noch Anfänger, hab den Code mit dem Time.sleep so übernommen und abgeändert. Ich nehme das mal raus, danke für den Tip !
    Automatisch zusammengefügt:


    Hallo Pflasterbicker,

    zu b)

    Wäre nicht nötig, wenn Du Frage a) umsetzt und als Dateinamen die uid nimmst.

    Mit einer Datenbank wäre es aber zur Auswertung die bessere Lösung. In Python habe ich in der Richtung auch noch nichts gemacht.

    //Edit: War wieder einer schneller. ;)

    Vielen Dank für den Tip hyle, zumindest bringt mich Dein Code ein Stück weiter.
    Zum Thema Datenbank, da hab ich noch nie was gemacht, da hab ich null Plan wie sowas geht... :s
    Automatisch zusammengefügt:

    [quote='hyle','http://test.forum-raspberrypi.de/forum/index.ph…8700#post278700']
    Hallo Pflasterbicker,

    zu b)

    Hab den Code gleich eingefügt bzw. eingearbeitet, da kommt dann folgende Meldung:

    [font="Menlo"]pi@raspberry-pi-alarm:~ $ python scan.py[/font]
    [font="Menlo"] File "scan.py", line 31[/font]
    [font="Menlo"] if uid != 43F2CF7F:[/font]
    [font="Menlo"] ^[/font]
    [font="Menlo"]SyntaxError: invalid syntax[/font]
    [font="Menlo"]pi@raspberry-pi-alarm:~ $ [/font]

    Auch wenn ich die Chip-Nr. in Anführungszeichen oder einfache Striche setze kommt die Meldung, der Unterschied der Fehlermeldungen liegt dann nur in der Position des Markers, der liegt dann nämlich auf dem Anführungszeichen am Ende

    Einmal editiert, zuletzt von Pflasterbicker (20. April 2017 um 18:21)

    • Offizieller Beitrag

    Sorry, so solltes laufen:


  • Sorry, so solltes laufen:

    Dankeschön, funzt ! :thumbs1:
    Kann man mehrere "if" untereinander machen?
    Praktisch für:
    if uid == deinenummer
    ....
    if uid == ihrenummer
    ....
    if uid == Seinenummer
    ....
    else:

    Weißt Du was ich meine?


  • Ja kann man, würde ich aber nicht machen. pack alle nummern in ein dictionary

    Code
    codes = {"1234":"meier","4567":"schmidt"}
    if uid in codes:
       print "hallo %s" %codes[uid]

    Hab ich mal so umgesetzt, kommt aber ein Syntaxfehler

    Ergebnis:

    [font="Menlo"]pi@raspberry-pi-alarm:~ $ python scan.py[/font]
    [font="Menlo"] File "scan.py", line 36[/font]
    [font="Menlo"] logging.info('%s:' + uid)[/font]
    [font="Menlo"] ^[/font]
    [font="Menlo"]SyntaxError: invalid syntax[/font]
    [font="Menlo"]pi@raspberry-pi-alarm:~ $ [/font]

    Edit: die Klammer war zu viel :) Danke
    Kann ich den Namen aus den Codes auch für das Logging ziehen? Wenn ich da beim Logging %s angebe wird auch tatsächlich %s geloggt....

    Einmal editiert, zuletzt von Pflasterbicker (20. April 2017 um 19:51)

    • Offizieller Beitrag

    Nimm mal für Printausgaben in denen Variablen stehen doppelte Ausführungszeichen. Also Gänsefüsschen "

    Grundsätzlich hätte ich noch eine Anregung. Du könntest die Logs aller Mitarbeiter in eine csv-Datei schreiben. Diese kann man in ein Tabellenprogramm z.B. Excell importieren der Übersichlichkeit und Weiterverarbeitun wegen. Falls Du später das Projekt um eine Datenbank z.B. MySQL erweitern willst, kanns Du die csv-Datei genauso leicht importieren. ;)


  • Nimm mal für Printausgaben in denen Variablen stehen doppelte Ausführungszeichen. Also Gänsefüsschen "

    Grundsätzlich hätte ich noch eine Anregung. Du könntest die Logs aller Mitarbeiter in eine csv-Datei schreiben. Diese kann man in ein Tabellenprogramm z.B. Excell importieren der Übersichlichkeit und Weiterverarbeitun wegen. Falls Du später das Projekt um eine Datenbank z.B. MySQL erweitern willst, kanns Du die csv-Datei genauso leicht importieren. ;)

    Das klingt toll :bravo2:
    Automatisch zusammengefügt:
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Kann ich den Namen aus der Codezeile auch für das Logging ziehen? Wenn ich da beim Logging %s angebe wird auch tatsächlich %s geloggt....[/font]

    Einmal editiert, zuletzt von Pflasterbicker (20. April 2017 um 20:04)

  • Hio,

    du hast mir ja bereits eine PN geschrieben, ich antworte dann mal hier damit jeder das lesen kann.

    Es gibt meiner Meinung nach 3 Ansätze die Daten zu sichern und "aufzubereiten":

    1) Du schreibst alle Lesevorgänge in eine Datei, jeder neue Scan in eine neue Zeile. Gefahr: Die Datei ist per Hand nicht mehr sauber zu lesen und extrem anstrengend zu prüfen. Möglichkeit: Jeder Nutzer bekommt eine eigene Datei die mit der UID des Tags verknüpft ist. Somit wäre jede Datei nur für eine Person.
    2) Du schreibst alle Lesevorgänge strukturiert in eine CSV-Datei. Diese kannst du vorher mit Kopfzeile anlegen, oder aber die Kopfzeile weglassen. Dabei können ALLE Nutzer in eine CSV-Datei, strukturiert geschrieben werden. Wenn du das ganze z.B. in Excel importierst, kannst du Filterfunktionen einfügen, sortieren, Formeln zur Stundenberechnung etc. erstellen. Problem: Ich bin mir nicht 100%ig sicher, ob man eine CSV-Datei so bauen kann, das Excel die "live" lesen kann. Es könnte also sein, dass du die Datei kopieren musst und dann jedes mal öffnen und einstellen, ich weiß nicht ob Formeln in der "Datensammeldatei" möglich sind, bzw. wie diese anzulegen sind.
    3) Du machst das ganze direkt mit einer Datenbank. Eine strukturierte Liste ist bereits eine Datenbank, ich würde aber für den Lernzweck eine größere Datenbank wie MySQL nehmen, wenn du wirklich Interesse hast daran zu arbeiten und evtl. spätere Projekte oder Ideen damit mal zu testen. Ich kenne deine Fähigkeiten anderer Programmierungen nicht, aber eine Datenbank ist im Prinzip sehr simple für einfache Dinge und du kannst damit nachher anstellen was du willst. Du kannst übrigens auch aus einer Datenbank eine CSV o.ä. exportieren.

    Du musst dir dann nur noch überlegen, wie du die Stundenberechnung machen willst. Bei einer Datenbank würde sich ein Webserver auf dem Pi anbieten, wo du eine kleine Internetseite zur Datenausgabe bastelst. Das können Tabellen, Berechnungen, Kalender, Liniengraphen, Diagramme jeglicher Art sein. Damit kann man viele tolle Spielereien anstellen um das "hübsch" aufzuarbeiten, druckbar zu machen, per Smartphone vom Sofa oder von jedem Laptop in der Wohnung (Heimnetz) anzusehen.

    Ich würde Variante 3 wählen, wenn das ganze nicht eilig ist und der Lernzweck im Vordergrund stehen soll. So eine Übung kann man immer brauchen und die Programmierung muss nicht sehr hübsch sein und ist meiner Meinung nach dank Anleitungen die aus der Internet-Steinzeit bestehen, wirklich sauber und Idiotensicher dokumentiert.

    • Offizieller Beitrag


    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Kann ich den Namen aus der Codezeile auch für das Logging ziehen? Wenn ich da beim Logging %s angebe wird auch tatsächlich %s geloggt....[/font]

    Auch dort/deshalb Gänsefüsschen.
    Automatisch zusammengefügt:
    Hallo JumpY,

    bin da fast ganz bei Dir. Einzig bei der grösseren DB als MySQL zu Lernzwecken verstehe ich Deine Intension nicht so ganz... :s

  • Ich würde auf jeden Fall eine Datenbank nehmen. Die Programmierung ist letztlich nicht aufwändiger als eine Dateiverwaltung und die Auswertungsmöglichkeiten sind vielfach schneller, komfortabler, flexibler, einfacher, schneller, ...
    Webanwendung macht alles nur komplizierter, da muss er noch html und das ganze drumherum lernen.
    Erstmal die Registrierung der Chips und Ablage der Daten in MySQL. Dann kann man die Auswertung ggf. erstmal mit Excel machen oder mit einer einfachen Abfrage aus Access oder eben ein Programm oder Webfrontend stricken. Das hat dann ja Zeit und kann sich entwickeln.
    Mit einem Dateisystem bist du festgenagelt und kannst nicht viel Gescheites damit anfangen.
    Du brachst wahrscheinlich erstmal nur eine Tabelle - nämlich die mit den Eintragungen der Chipregistrierungen. ChipID. Datum, Uhrzeit. Eine zweite Tabelle kann die Namen der Chipbesitzer enthalten: ChipID, Name. Das ist vorerst alles, was du brauchst.
    Das Speichern eines Registriersatzes in der Datenbank dürfte mit nicht mehr als 10 Zeilen Code zu Buche schlagen (vielleicht reichen auch vier).

    Zu Python und MySQL gibts jede Menge Infos im Web.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ich würde auf jeden Fall eine Datenbank nehmen.

    Ich ebenfalls. Wenn man denn erstmal apache, php und mysql zum Laufen gebracht hat, wird man es nicht mehr missen möchten.

    Zitat

    Zu Python und MySQL gibts jede Menge Infos im Web.

    Ich hab mal vor einiger Zeit hier im Beitrag #6 ein Mini-Python-Script gepostet, mit dem eine Tabelle angelegt, mit Daten gefüllt und wieder ausgelesen wird.

    Ansonsten ist das Schreiben in eine CSV-Datei die gleich dahinter 2.beste Wahl. Die läßt sich Anwender-freundlich mit Excel verarbeiten und kann später, wenn man denn doch auf eine Datenbank umschwenken möchte, problemlos dort importieren.

    Und die Kombination, an ggf. sogar mehreren Standorten jeweils, CSV-Dateien zu erzeugen, die dann als Tages-Abschluß gesammelt in die Datenbank gehen, ginge ja auch noch. Und man hat dann mit den CSV-Dateien auch quasi nebenbei ein Backup der Daten.

    Gruß, Michael

    • Offizieller Beitrag


    Die Programmierung ist letztlich nicht aufwändiger als eine Dateiverwaltung und die Auswertungsmöglichkeiten sind vielfach schneller, komfortabler, flexibler, einfacher, schneller, ...

    Mit einem Dateisystem bist du festgenagelt und kannst nicht viel Gescheites damit anfangen.

    Zu "komfortabler, flexibler, einfacher" kann ich nur für meine Erfahrungen in PHP sprechen. Wenn man eine *.csv in ein Array liest, ist das auch nicht sehr unkomfortabel, unflexibel oder schwerer als bei einer Datenbank.
    Die Älteren werden sich noch erinnern: Es gab mal Zeiten in denen Hostingpakete mit eigenen CGI/Perl/PHP richtig teuer waren. Für eine Datenbank musste man extra noch Kohle drauflegen. Da wurden von uns auf Kundenwunsch Gästebücher auf Dateibasis erstellt.

    Darüber das eine DB der beste Weg ist, sind wir uns einig. Das ist performanter und ressourcenschonender.

  • bin da fast ganz bei Dir. Einzig bei der grösseren DB als MySQL zu Lernzwecken verstehe ich Deine Intension nicht so ganz... :s


    Ich habe bislang nur mit MySQL als wirkliche Datenbank gearbeitet, deswegen die Empfehlung von mir. Ich weiß, dass es viele kleine Datenbankformen gibt, die dafür natürlich satt ausreichen und warscheinlich sogar schneller sind.


    Ich ebenfalls. Wenn man denn erstmal apache, php und mysql zum Laufen gebracht hat, wird man es nicht mehr missen möchten.


    So ist es bei mir gewesen. Ich habe es mehrfach auf anderen Wegen versucht und bin wegen der unendlichen Möglichkeiten immer wieder auf PHP zurückgefallen, womit ich die DB "hübsch" ausgewertet habe. Sicher gibt es einfacherere Sachen, oder Möglichkeiten die ohne PHP auskommen, aber die Dokumentation und Beispiele von PHP in Verbindung mit einer MySQL Datenbank sind einfach perfekt. Es gibt meiner Meinung nach nirgends eine ähnlich gut dokumentierte Hilfe, die zum lernen wirklich leicht fällt.


    Wenn's nicht zu umfangreich wird, bietet sich auch SQLite als Datenbank an. Das ist in Python gut unterstützt und erspart einem das Aufsetzen eines SQL-Servers.


    Richtig, kann man ebenfalls nehmen.
    Ich bin "früher" an eine Datenbank geraten, die eben MySQL war und mit PHP verarbeitet wurde. Das gleiche habe ich dann auf dem Pi umgesetzt, die Rechenleistung etc. auf dem kleinen Mann ist mehr als nur ausreichend dafür und es lässt sich sehr schön arbeiten.

    Ich würde immer wieder den größten Weg nehmen, also Python zum auslesen der Tags und damit direkt die Datensätze in der Datenbank erstellen, MySQL als Datenbanktyp und HTML/PHP zur Auswertung der Datenbank in ein nutzerfreundliches Format. Mein Pi läuft z.B. ohne "Display", ich weiß dann nicht, wie man eine "Website" basteln kann, die einem von jedem Standort und jedem Endgerät das ganze hübsch darstellt. Das ist für das Projekt sicherlich oversized, aber man kann es so super oft brauchen, dass es wirklich eine Überlegung Wert ist das zu lernen. Vielleicht hat man ja auch irgendwann sowieso Spaß an einer kleinen Website oder arbeitet mal irgendwo mit, dann helfen einem die Kenntnisse direkt weiter.

    Beispiel: Ich habe mal eine Messreihe an einer Heizung mit vielen Temperaturfühlern und "LED-Erfassung" gemacht. Das ganze habe ich Tagelang in Exceldateien ausgewertet und die Probleme gesucht. Anschließend habe ich das ganze mit verschiedenen "fertigen Codeteilen" in Graphen, Diagramme, etc. auf einem Webserver eingespielt. Damit war die Fehlersuche in 5 Minuten abgeschlossen und jeder Laie versteht direkt was gemeint ist und kann sich alles ansehen, sofern er sich dafür interessiert. Es war eine sehr simple Aufgabe, die sehr professionell (optisch) aussah.

    Jenachdem wie dringend es ist, können wir das "zusammen" machen. Ich habe eigentlich genau das gleiche schon fertig hier liegen, dass müsste nur etwas angepasst und verkürzt werden. Möchte dir das aber nicht einfach hinwerfen, da sprechen wir lieber gemeinsam drüber, dass du das auch verstehst und daran weiterarbeiten kannst.

    • Offizieller Beitrag

    Da habe ich Dich offenbar falsch verstanden, ich dachte Du meinst eine noch grössere DB als MySQL ohnehin schon ist.


    Ich habe bislang nur mit MySQL als wirkliche Datenbank gearbeitet, deswegen die Empfehlung von mir.

    So bin ich natürlich voll und ganz bei Dir! :thumbs1:

  • Zitat


    Da wurden von uns auf Kundenwunsch Gästebücher auf Dateibasis erstellt.


    Also, wie man die Auswertungsmöglichkeiten einer Select-Anweisung mit Bedingungen, Group- und Order-Klauseln in einem Text-Array schnell, bequem und einfach nachbildet, würde mich mal interessieren.
    Für ein Gästebuch reicht eine Textdatei locker aus, aber für die Auswertung Tausender Zugangsdaten würd ICH mich definitiv auf eine Datenbank festlegen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!