alpha-x
Posts: 1
Joined: Sat Oct 21, 2017 7:20 pm

Tage zählen, reset, wieoft reset und Highscore der Tage

Sat Oct 21, 2017 7:52 pm

Hallo Forum,

ich bin der Neue!

Profil:
wenig Ahnung,
keine Programmierkenntnisse,
aber sehr lernfähig und
extrem motiviert.... alles zu lernen.

ich habe vor aus einem Raspy einen Vorfallzähler zu bauen.

Aufgabe: Ein Taster zum Starten, dann werden die Tage gezählt, kommt es zu einem Vorfall wird ein weiterer Taster zum Rückstellen gedrückt, die Tage beginnen bei Null, Vorfälle werden addiert, und ein "Highscore" der vorfallfreien Tage soll erstellt werden.
Die Anzeige soll auf einem Monitor angezeigt werden.

hey, hier kommt nun mei Profil ins Spiel...

ich habe momentan keine Ahnung wie ich das realisieren kann, aber mir ist klar: mit nem Raspy geht das! aber nur mit ausreichend Hilfe aus dem Forum)

danke für alle Tipps die ich kriegen kann....

lg Alpha-X

User avatar
mline
Posts: 883
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Sun Oct 22, 2017 12:45 pm

Hallo,

am besten lernst du erstmal die Grundkenntnisse einer Programmiersprache. Zum Beispiel python - bin zwar kein Freund davon aber es scheint sehr gut für das programmieren der Pi dokumentiert zu sein.
Es gibt zahlreiche Tutorials im Internet... aber du kannst auch das MagPi Magazin ( https://www.raspberrypi.org/magpi/ ) lesen. Die gibts gratis als PDF und soweit ich weiß gibts da ab dem ersten Magazin ein python Tutorial.
Den Umgang mit den GPIOs der Pi wirst du ebenfalls erlernen müssen.

Dein Programm macht im Grunde nichts weiter als bei jedem Tastendruck (Tasten Debouncing ist dann ein Thema!) das aktuelle Datum zu speichern bzw. eine Differenz des Zeitraumes zu errechnen.
Also beim Start wird das heutige Datum gespeichert... paar Tage vergehen und dann wird ein neues Datum gespeichert. Die Differenz ist dein "Tage ohne Vorfälle".
Das Ganze in einer Schleife und du hast deinen Vorfallzähler.

Die Anzeige am Display ist dann allerdings nicht mehr so einfach. Wird zwar auch Tutorials dafür geben aber vermutlich wird dein Programm dann kein "Einzeiler". Würd das dann schon eher in die Kategorie "Für Fortgeschrittene" einordnen.

*edit
Falls du das offizielle Display verwendest, ist vermutlich das TkInter Toolkit für python eine Option für dich.
<~~>

tommylee2k
Posts: 35
Joined: Mon May 08, 2017 6:23 am

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Mon Nov 06, 2017 2:39 pm

grundsätzlich ist das alles kein Problem, du brauchst halt ein wenig Programmierkenntnisse. Eine Lösung wäre z.B., daß du dir nen SQL-Server installierst, und jeden Vorfall per Script in eine Tabelle ( die man zunächst natürlich anlegen müsstest ) einträgst:

Code: Select all

insert into vorfaelle (datum) values ( now() );
eine Abfrage wieviele Vorfälle pro Tag passiert sind wäre dann etwas wie

Code: Select all

Select Datum, count(*) from Vorfaelle groupby Datum;
oder

Code: Select all

Select Datum, count(*) as cnt from Vorfaelle groupby Datum orderby cnt desc;
(sortiert nach deinem "highscore")

Das kannst du in so gut wie jeder Programmiersprache realisieren, mit manchen ist's aufwändiger, mit anderen weniger

crumble
Posts: 63
Joined: Sat Feb 07, 2015 7:34 pm

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Mon Nov 06, 2017 10:20 pm

Einen Anfänger SQL vorzuschlagen halte ich für gewagt. Ich würde auch erst mal zu Python3 raten, weil das auf dem Pi am verbreitesten ist und man am leichtesten Hilfe für findet. Anfängerfreundliche Beispiele, die einen Schalter abfragen findet man an jeder Ecke und muss sich nur um eine Sprache kümmern. Nicht gleich zwei auf einmal lernen und sich keine Gedanken um Dialekte machen.

Fuer den TO wird es ja eh schon schlimm werden, wenn er in die Untiefen der Datumsberechnung ersaeuft ;-) An der genauen Differenz zwischen zwei Tagen sind schon Generationen von Informatikern gescheitert. Da muss man sich nicht noch mit mehreren unterschiedlichen Datumsmethoden herum schlagen.

PS: Keine Angst. Für den Hausgebrauch sind die meisten Datumsfunktionen einfach zu benutzen. Erst recht, wenn man eh nur mit vollen Tagen rechnen möchte. Wenn man es genauer braucht, gerät man recht schnell in obskure Probleme, an die man als Normalbürger nicht denkt. Wenn man sich damit genauer beschäftigt, weiss man immerhin, warum die Bahn lieber den Sommer-/Winterzeitwecsel aussitzt.

tommylee2k
Posts: 35
Joined: Mon May 08, 2017 6:23 am

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 7:06 am

Einen Anfänger SQL vorzuschlagen halte ich für gewagt. Ich würde auch erst mal zu Python3 raten
Sql ist keine Zauberei, im Gegenteil. Und sein Task ist nun wirklich eine reine Datenhaltung, warum also nicht gleich das passende Tool nehmen - wenn er wirklich programmieren lernen will, dann kommt er sowieso an Sql nicht vorbei.

Allein der Aufwand für die Datenhaltung. in SQL ist alles erledigt indem du die Tabelle anlegst

Code: Select all

create table events ( event datetime ) ;
und als "Programmieraufwand" 2 Zeilen SQL!
eine die einträgt

Code: Select all

insert into events(event)  values(now());
kein rumhantieren mit Datumsfunktionen, kein Ausrechnen wann der nächste Tag beginnt, etc pp


und eine die ihm seinen Report bastelt

Code: Select all

select date(event),count(*) from events group by (date(event));
Das ganze kann er auch easy per bash-script ausgeführen, das würde dann so aussehen:

Code: Select all

mysql -u<seinUser> -p<seinPasswort> -e "insert into events(event) values(now());"
Es gibt nun wirklich keinen Grund das Rad jedesmal neu zu erfinden.

Wenn das in Phython einfacher geht zeig her deine Lösung, ich lass mich gern belehren,

User avatar
mline
Posts: 883
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 8:24 am

crumble wrote:
Mon Nov 06, 2017 10:20 pm
An der genauen Differenz zwischen zwei Tagen sind schon Generationen von Informatikern gescheitert.
Müssen Anfänger gewesen sein. Unixtimestamp speichern. Hat der Unixtimestamp 86400 Sekunden mehr, ist ein Tag vergangen.
Wenn du dein System mit NTP aktualisierst, brauchst dich nichtmal um Schaltsekunden oder so Mist kümmern.
tommylee2k wrote:
Tue Nov 07, 2017 7:06 am
Sql ist keine Zauberei, im Gegenteil.
SQL ist für so ein Projekt nicht notwendig. So ein Datenbankserver braucht Systemresourcen... und das nicht knapp. Dann kommt noch der Programmieraufwand dazu.
Wenn du die Zeitstempel in eine Textdatei speicherst, reicht das vollkommen. Wer es noch Speicher- und Platzsparend will, kann ja zum Beispiel immer nur die letzten 50 Zeitstempel speichern. Das ganze Zeilenweise eingelesen und schon hast du deine Daten. Völlig unkompliziert, schnell und Resourcenschonend
<~~>

smartifahrer
Posts: 211
Joined: Sat Feb 13, 2016 8:10 am

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 9:27 am

Wenn ich die Anwendung Alpha-X etwas weiter spinne würde ich eher zu MySQL raten. Das ganze kombiniert mit Apache, PHP um z.B. phpMyAdmin als Webbasierte Datenbankoberfräche zu nutzen. Wie das alles eingerichtet wird findet sich in unzähligen Turorials im Netz.

Ich könnte mir vorstellen, dass die Anwendung einfach gestartet wird und dann jeden "Vorfall" in der Datenbank vermerkt. Also Datum+Uhrzeit eventuell Art des Vorfalls. Per SQL-Abfrage + Programmcode lässt sich dann der "Highscore" für beliebige Zeiträume über die gespeicherten Daten ermitteln. Je länger (Zeitraum) die Anwendung die Vorfälle erfasst und auswerten soll desto eher lohnt sich somit die Datenbank.

Ich stimme mline zu, dass zusäzliche Systemresourcen gebraucht werden. Wenn der Pi aber sonst nichts Rechenintensives macht, spielt das keine Rolle.

Wie crumble richtig bemerkt steigt hier natürlich der Lernaufwand. Ich denke der Aufwand lohnt sich aber und vereinfacht das ganze wenn die Anwendung wie von mir Beschrieben weiter gedacht wird.

1. Daten in eine Datei speichern kann gerade für Anfänger ziemlich schwer werden (z.B. Datenformat).
2. Auch die Auswertung der Daten hat so seine Tücken in der Umsetzung. Die Datumsberechnung wurde ja schon angesprochen.
3. Auswertungen wie sie Alpha-X möchte lassen sich mit einen SQL-Befehl berechnen ohne sich groß gedanken um Datumsberechnungen machen zu müssen oder lange die Daten aus der Datei auszuwerten.

Wenn es rein bei der Aufgabe bleibt wie von Alpha-X beschrieben, kann das natürlich auch mit einer Datei realisiert werden.

Alpha-X, was denkst du von den bisher vorgeschlagenen Ansätzen zu deiner Aufgabe? In welche Richtung soll es gehen?

crumble
Posts: 63
Joined: Sat Feb 07, 2015 7:34 pm

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 4:54 pm

>Hat der Unixtimestamp 86400 Sekunden mehr, ist ein Tag vergangen.

Und schon hast Du die Schaltsekunden nicht beruecksichtigt: https://www.ptb.de/cms/ptb/fachabteilun ... unden.html

Etwas groesser wird die Abeichung durch Sommer/Winterzeit. Immerhin mittelt sich das uebers Jahr wieder raus ;)

Das mag bei dem Projekt hier zu vernachlaessigen sein, aber es kann einem auch ganz uebel treffen. Erst recht wenn man in der Schule hoechstens mal etwas von einem Schaltjahr gehoert hat, ploetzlich zwei Programme mit demselben Zeitstempel unterschiedliche Tage anzeigen.

Zu Problemen mit Rechenungenauigkeiten kommt es bei Systemen, die mit Fliesskommazahlen arbeiten. Tage sind Vorkommastellen, die Uhrzeit wird als Bruch eines Tages dargestellt. Damit kann man theoretisch super schnell und extrem schoen rechnen. Wenn da nicht die interne IEEE Abbildung waere. Sobald man Stueckzahl*Arbeitszeit auf ein Datum addiert, hat man fuer ein und dieselbe Datum/Zeit Kombination auf einmal unterschiedliche Zeitstempel und man muss diese normieren. Denn die Klasse macht natuerlich intern den schnellen Vergleich ueber das Double und nimmt nicht die langsame Umrechnung in einem String, dem man vom Debuger vorgesetzt bekommt.

Bis jetzt hat man nur fortschreitende Zaehler gehabt, die in sich recht endeutig sind, wenn sie denn ueber verschiedene Rechner wirklich synchron waeren. In der Praxis hat man es dann mit CSV-Dateien und Logfiles von nicht synchronizierten Systemen zu tun, die Datum und Zeit als Text ausgeben. Viel Spass bei einem 24/7 Betrieb. Erst recht bei unterschiedlichen Zeitzonen von denen ein Teil auch noch Sommer/Winterzeit mit einrechnet.

Datumsmethoden sind nicht trivial und man kann ueber jedes Projekt froh sein, bei dem Genauigkeit keine Rolle spielt.

Wer Emacs mag, hat die volle Auswahl an exotischen Kalenderfunktionen inklusive einer gedruckten Doku: https://www.amazon.de/Calendrical-Calcu ... lculations. Ich glaube LISP wurde noch nicht vorgeschlagen :mrgreen:

crumble
Posts: 63
Joined: Sat Feb 07, 2015 7:34 pm

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 5:59 pm

>1. Daten in eine Datei speichern kann gerade für Anfänger ziemlich schwer werden (z.B. Datenformat).

Das Datenformat waere recht einfach: In der ersten Zeile den Zeitstemel vom letzten Tastendruck, darunter ein zweidimensionales Array mit dem Zaehler und einem Zeitstempel.

Python kann das Array sortieren. In der ersten Version laesst man das Array beliebig gross werden, danach kann man es auf die obersten 10 Eintrage beschraenken.

Eventuell bekommt man so etwas sogar mit Scratch hin und sieht gleich eine halbwegs graphische Darstellung von dem was man macht.

Wenn man stumpf die Taste in einer Schleife abfragt, ist das fuer einen Anfaenger gut zu verstehen. Der armen CPU eine Pause zu goennen, kann man sich dann spaeter anschauen.

Die HTML/CSS/PHP/SQL/WebServer Loesung haette natuerlich den Vorteil, dass man leichter zu einer ansprechenden Oberflaeche kommt. Dafuer ist bei ihr die Lernkurve sehr Steil. Ausserdem muss man mit ihr noch immer irgendwie auf den Schalter abfragen und die Seite neu aufbauen. Mir faellt da gerade nur F5 als Anfaenger freundliche Loesung ein.

User avatar
mline
Posts: 883
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 6:38 pm

crumble wrote:
Tue Nov 07, 2017 4:54 pm
>Hat der Unixtimestamp 86400 Sekunden mehr, ist ein Tag vergangen.

Und schon hast Du die Schaltsekunden nicht beruecksichtigt: https://www.ptb.de/cms/ptb/fachabteilun ... unden.html...
Die Zeile darunter hast du wohl nicht mehr gelesen.

*edit
Wird zu kompliziert hier. Ich bin raus. Sorry @ TO. Trotzdem viel Spaß beim programmieren.
<~~>

smartifahrer
Posts: 211
Joined: Sat Feb 13, 2016 8:10 am

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Tue Nov 07, 2017 8:13 pm

Das Datenformat mag in der Programmiersprache einfach zu sein. Aber wie in der Datei speichern. Binär, serialisiert, CSV...
Warum nicht per Python ein Wert in die Datenbank speichern.

Z.B mit einer Tabelle mit 3 Spalten:
id: Integer mit Autoincrement
zeitpunkt: Datetime
vorfall: integer oder Varchar je nachdem was gespeichert werden soll

Anzulegen mit den Befehl:

CREATE TABLE `vorfaelle` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`zeitpunkt` datetime DEFAULT NULL,
`vorfall` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

EinVorfall wird mit dem folgenden SQL-Befehl eingetragen:
insert ('zeitpunkt','vorfall') values (now(), x); x steht hier für den "Vorfall", z.B. Welche Taste gedrückt wurde usw.

In Python sollte das mit 10-20 Zeilen Code realisierbar sein. Oder?

Das schöne ist das Mysql mit dem Datetime Typ die ganze Zeitproblematik erledigt. Im Insert-Befehl steht z.B. now(). Dies ist ein Befehl an Mysql die aktuelle Zeit (Datum+Uhrzeit) einzufügen. Das Script muss also weder die Zeit noch das Datenformat kennen also gar nicht kennen.

Beim Abfragen stehen dann jede Menge Ausgabeformate und funktionen zur Verfügung. Sogar Tagesweise die Anzahl der Vorfälle zu summieren ist ein Kinderspiel.

Z.B. liefert der folgende Befehl drei Werte aus der Tabelle Jahr, Tag im Jahr und die Anzahl der Vorfälle an diesem Tag:
select year(zeitpunkt) as jahr, dayofyear(zeitpunkt) as tagimjahr, count(*) as anzvorfaelle from vorfaelle group by jahr,tagimjahr
Alles ohne Schaltjahr, Zeitzone usw. zu berücksichtigen.

Im Browser läst sich ein automatisches neuladen mit HTML realisieren. Im Head der Seite vorfaelle.html einfach z.B. <meta http-equiv="refresh" content="5; URL=http://meine-domain.de/vorfaelle.html"> eintragen und schon wird die Adresse nach 5 Sekunden neu geladen.

tommylee2k hatte es so in etwa auch vorgeschlagen.

Hier mal ein Linz zu einem ähnlichen Projekt/Tutorial
https://tutorials-raspberrypi.de/lokale ... tenlogger/

tommylee2k
Posts: 35
Joined: Mon May 08, 2017 6:23 am

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Thu Nov 09, 2017 10:25 am

mline wrote:
Tue Nov 07, 2017 6:38 pm
*edit
Wird zu kompliziert hier. Ich bin raus. Sorry @ TO. Trotzdem viel Spaß beim programmieren.
Ich hör immer nur "viel zu aufwändig", "geht doch in <irgendeine_Programmiersprache> genauso fix", nur kommt keiner mal auf die Idee, daß auch in Code zu gießen und hier zu posten. Ich zweifle noch immer, daß es "mal eben so" in python geht, inclusive Dateiverwaltung, Datumsfunktionen, Sortierung, Gruppierung nach Datum etc.

Das mag alles einzeln gesehen vielleicht für einen halbwegs geübten Programmierer kein Problem sein, nur für einen völligen Neuling definitiv eine Nummer zu hoch, imo - man sieht ja, das bereits die 86400 für völlige Verwirrung sorgt.


Genau aus dem Grund hab ich die zwei EIN-ZEILER in Sql empfohlen.

crumble
Posts: 63
Joined: Sat Feb 07, 2015 7:34 pm

Re: Tage zählen, reset, wieoft reset und Highscore der Tage

Thu Nov 09, 2017 7:58 pm

Unter garantie kein schöner Python Code

Das hier liest ein 2S arry aus einer Datei, hänt ein neues Element an, sortiert es und schreibt es wieder in die Datei.

Noch einmal so viel Code und man hat den Event Zaehler fertig und hat eine etwas huebschere Ausgabe Alles Python 3 mit bord mitteln. Fuer die GPIOs braucht es dann noch die standard Raspberry Pi Biliotheken

Code: Select all

import pickle
import datetime
import os.path

# Dateiname 
file_name = 'test.dat'

# Fülle die Datei mit einer leeren Top Ten, wenn sie nicht existiert
if os.path.exists(file_name) == False:
        a = []
        for e in range(10):
                a.append([0, datetime.datetime.now()])

        with open(file_name, 'wb') as fh:
                pickle.dump(a, fh)

# Lese sie Top Ten aus der Datei
with open('test.dat', 'rb') as fh:
        a = pickle.load(fh)

# gib sie rzZeilenweise aus.
for eintrag in a:
        print(eintrag)

# hänge ein neues Event an => Top 11
a.append([99, datetime.datetime.now()])

# sortiere die Top 11 absteigend nach den Tagen
a = sorted(a, key=lambda x: x[0], reverse=True)

# Mache aus der Top 11 wieder eine Top 10.
a = a[:-1]

# Schreibe die Top 10
with open(file_name, 'wb') as fh:
        pickle.dump(a, fh)

~                               

Return to “Deutsch”

Who is online

Users browsing this forum: No registered users and 6 guests