Daten über seriellen Port verarbeiten - Empfehlung für Lösungsweg?

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

    ich habe an meinem Raspberry einen Arduino via USB angeschlossen, der Temperaturdaten via serieller Konsole an den Pi übermittelt.

    In meinen Tests habe ich ein recht ordentliches Python3-Script erstellt, dass diese seriellen Daten abgreift und sie an ein PHP-Script im Web übergibt, dass diese dann weiterverarbeitet und in eine Datenbank packt.

    Dummerweise kratzt mir das Python3-Script unregelmäßig ab und ich bekomme es nicht ordentlich gelöst, sodass ich mich nach einfacheren Alternativen umschaue.

    Eine ist, die seriellen Daten in eine Datei zu schreiben und dann ggf. von einem PHP-Script direkt weiterzuverarbeiten. Was mich dabei etwas stört ist, dass ich aus der angelegten Textdatei auch Werte rauslöschen muss - sonst wird das File ja regelmäßig größer. Und hier habe ich den Verdacht, dass es zu Konflikten führt, wenn das PHP-Script gerade Werte aus der Datei ausließt und eine Zeile löscht, und in diesem Moment Daten per COM ankommen und in das File geschrieben werden sollen.

    Geht es ggf. irgendwie, dass ich ankommende Daten via ttyACM0 direkt an ein lokales PHP-Script weiterreiche? Also quasi... cat xxx > datei.php? Oder etwas in dieser Richtung?

  • Daten über seriellen Port verarbeiten - Empfehlung für Lösungsweg?? Schau mal ob du hier fündig wirst!


  • In meinen Tests habe ich ein recht ordentliches Python3-Script erstellt, dass diese seriellen Daten abgreift und sie an ein PHP-Script im Web übergibt, dass diese dann weiterverarbeitet und in eine Datenbank packt.

    Bevor man sich mit einem Workaround beschäftigt wärs vielleicht gut das Script zu sehen um ggf das Problem beheben zu können - oder möchtest du unbedingt wechseln :huh:

    Geht es ggf. irgendwie, dass ich ankommende Daten via ttyACM0 direkt an ein lokales PHP-Script weiterreiche? Also quasi... cat xxx > datei.php? Oder etwas in dieser Richtung?

    Wie dbv schon sagte: Wieso schreibst du nicht einfach direkt in die Datenbank, wieso der Weg über PHP?

  • Hallo,

    okay, ich hätte vielleicht etwas weiter ausholen sollen...
    Begonnen hat mein "Projekt" damit, dass ich batteriebetriebene Funk-Temperatursensoren basteln wollte, weil es da nichts günstiges zu kaufen gab. Habe dann kleine Funksender auf ATTiny84-Basis mit DHT22-Sensoren gebastelt, die über die billigen 433 Mhz-Sender von eBay ihre Daten als Textstring an einen Arduino Ethernet schicken.
    Da da die Möglichkeiten beschränkt sind, habe ich die Daten an ein PHP-Webscript übergeben, dass diese dann geprüft hat (alle Werte da, Werte im richtigen Bereich, etc.).

    Das Webscript hat mir also die Daten konsolidiert und geprüft und in eine MySQL-Datenbank geschrieben. Meine Arbeit ging dann über ein PHP-Chartframework weiter, in dem ich hübsche Charts generiere:
    pchart-demo.png

    Da der Arduino Ethernet logischerweise kein WLan-Gerät ist und ich ihn daher nicht zentral in der Wohnung aufstellen konnte, bekam ich bei dem ein oder anderen Sensor Probleme bei der Funkreichweite.

    Ich begann damit zu experimentieren, wie ich einen normalen Arduino UNO an einen Raspberry Pi bekomme, der dann die Daten via 433 Mhz empfängt und weiterverarbeitet. Den RPI bekomme ich via WLAN eingebunden und kann ihn zentral aufstellen.

    In einer sehr langen Wochenend-Aktion und mit Hilfe einiger Leute aus einem Python-Forum habe ich - ohne Python Vorwissen - folgendes Script zusammengeschustert, was zur Hälfte auf Halbwissen basiert aber zumindest augenscheinlich seinen Zweck erfüllt.

    Mir kam dann selbst die Idee, dass das Python-Script die Daten doch auch in die Datenbank selbst schreiben könnte, neben der bis dato Funktion Sie nur nach Möglichkeit zu konsolidieren und an das Webscript zu übergeben. Diese Funktion habe ich testweise ZUSÄTZLICH mit eingebaut - sprich, ursprünglich hatte dann das Script die Daten an mein Webscript übergeben und Testweise in eine lokale MySQL-Datenbank gepackt.
    Momentan ist der Part mit dem Direkt-in-DB-schreiben auskommentiert - das Script ist nicht fertig, wie gesagt, ein Zwischenschritt:

    Das Script und die Arbeit an diesem Projekt habe ich aktiv 12/2013 betrieben. Nun hat mich die Lust wieder gepackt, und ich habe alles aus dem Schrank hervorgeholt.

    Weshalb ich nun von dem Pyhton3-Script und dem direkten Insert in eine DB über Python weg wollte: Ich wollte mich eigentlich nie mit Python3 beschäftigen; projektbedingt ging es primär um PHP und meine lustigen Charts.
    Obiges Script ist also aus einer Notlösung heraus entstanden, und jetzt - nach 8 Monaten - tue ich mich etwas schwer, wieder rein zu kommen.

    Daher war mein Gedankengank, um "im Kern" bei der Sache zu bleiben, die empfangenen seriellen Daten irgendwie direkt an PHP zu schicken - da kenne ich mich etwas besser aus und habe innerhalb meines Projekts auch mehr damit zu tun, bedingt durch die Statistiken/Grafiken.

    Wenn es da natürlich keine stabile Lösung gibt, werde ich natürlich bei der Python3-Lösung bleiben (müssen).

    Das Problem, das ich aktuell mit obigen Script habe: Es schmiert unregelmäßig ab.
    Es wird, wie oben steht, via crontab beim booten gestartet und verrichtet dann seine Arbeit fehlerfrei. Auch das Logging funktioniert prima.
    Nur irgendwann sehe ich in den Charts, dass seit XX Stunden keine Daten mehr vom Sensor gemeldet wurden - und prüfe dann den Pi: der Python3-Prozess ist nicht mehr da; das Script muss also abgeschmiert sein.

    Ich war, wie gesagt, nicht so tief drin, aber ich vermute es muss möglich sein, alle auftretenden Exceptions die das Script zum Absturz bringen irgendwie zu loggen.

    Habt ihr vielleicht eine Idee? :)

    • Offizieller Beitrag

    Zuerst würde ich das Script mal in nem Screen starten, dort kann es vor sich hin scripten und du kannst normal weiterarbeiten, wenn es dann wieder mal stirbt, verbindest du zur screen session und schaust nach welchen Fehler er geworfen hat.

    Mal Komplett OT: welches Chart-Framework ist das?

  • Mal so bzgk des Codes gefragt:

    In der main methode

    führt das Script den Code weiter aus, auch wenn eine Exception geworfen wurde...

    Das halte ich für gefährlich, da der Wert der Variable received_serial_data - hm, ja wie ist der wohl?

    M.E. sollte der Arbeitscode innerhalb der try: - Anweisung stehen und wird nur dann ausgeführt, wenn gültige Daten vorliegen...

    Vielleicht ist das das Absturz-Problem ?

    PS:
    Die weiter oben stehende try/except Anweisung führt zum gleichen Problem...


  • Zuerst würde ich das Script mal in nem Screen starten, dort kann es vor sich hin scripten und du kannst normal weiterarbeiten, wenn es dann wieder mal stirbt, verbindest du zur screen session und schaust nach welchen Fehler er geworfen hat.

    Mal Komplett OT: welches Chart-Framework ist das?

    Gute Idee; werde ich mal ausprobieren.
    Es handelt sich um pChart (http://www.pchart.net/); bin da iwann drüber gestolpert. Hatte nie was mit solchen Diagrammen zu tun; zum Glück gibts da auch so eine Art Chart-Builder mit der man sich einen Demo-Code via GUI zusammenstellen kann.
    Habe ich mir dann so formatiert, dass es mir passt - und den Demo-Code dann "weiter verfeinert" - natürlich Leienhaft; aber meine Charts werden erstellt und schauen - für meinen Anwendungsfall - hübsch genug aus :)

    Das mit dem Verschieben der Arbeitsanweisungen in den Try:-Code macht Sinn - warum ich das nicht getan habe, weiß ich nicht so recht :) Ich bessere mal nach...

  • Das kommt mir alles irgendwie ziemlich bekannt vor, abgesehen vom python Code :cool:

    Was hier etwas Offtopic ist aber ich dennoch fragen wollen würde:

    Welche billigen 433 Mhz-Sender von eBay hast du denn verwendet und wie sieht dein Sketch auf dem ATtiny84 aus?
    Und wie hast du die Stromversorgung gelöst?

    Würde mich freuen wenn du dieses Projekt im EntwicklungsThread meiner Signatur mit den anderen Interessierten teilen würdest :thumbs1:

  • Wenn das Script bis vor kurzem "recht ordentlich" gearbeitet hat, sollte zunächst geprüft werden, welche Änderungen an diesem Script seitdem für die abstürze verantwortlich sein könnten.


  • Das kommt mir alles irgendwie ziemlich bekannt vor, abgesehen vom python Code :cool:

    Was hier etwas Offtopic ist aber ich dennoch fragen wollen würde:

    Welche billigen 433 Mhz-Sender von eBay hast du denn verwendet und wie sieht dein Sketch auf dem ATtiny84 aus?
    Und wie hast du die Stromversorgung gelöst?

    Würde mich freuen wenn du dieses Projekt im EntwicklungsThread meiner Signatur mit den anderen Interessierten teilen würdest :thumbs1:

    Hi, die Kurzfassung:
    ATTiny84, 3x AAA, div. Sensoren (idR DHT22) mit "billigen" 433 Mhz Sender/Empfängern von eBay (China).
    Die erweiterte Fassung - bin zwischenzeitlich zwar weiter und nute den Arduino Ethernet nicht mehr, aber dort findest du schonmal meine Basis-Scripts und Erläuterungenr:
    http://www.3bm.de/2013/11/24/att…t-uebermitteln/

    Zitat

    Wenn das Script bis vor kurzem "recht ordentlich" gearbeitet hat, sollte zunächst geprüft werden, welche Änderungen an diesem Script seitdem für die abstürze verantwortlich sein könnten.


    Ich meinte damit, dass das Script bisher während der Entwicklung funktioniert hat - die Programmabbrüche traten gelegentlich auf, ich konnte jedoch keine Ursache finden.

    Einmal editiert, zuletzt von neovanmatix (6. August 2014 um 20:46)

Jetzt mitmachen!

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