Funkdaten an Mysql senden

  • Hallo Zusammen

    Ich habe mir mit einem Arduino eine Funkwetterstation gebaut welche autonom mit Batterien im garten angebracht wird. Sie misst regelmäßig Temperatur, Luftfeuchte, Regen, und Helligkeit. Die Daten setzt Sie verschlüsselt per Funk an meinen Pi ab und geht danach wieder für 8 Minuten in den Sleep.

    Der Raspi empfängt die Daten mit den 433Utils. Das alles funktioniert wunderbar. Allerdings bleibe ich jetzt an meinen wirklich mangelhaften C++ Kenntnissen hängen. Die Datei RFSniffer möchte ich nun so umschreiben, dass dieser wenn Werte empfangen werden, diese in eine Mysql Datenbank schreibt, welche auf meinem NAS Server läuft.

    Vielleicht noch zu Info: Die Daten welche gesendet werden kommen verschlüsselt. Anhand dem Code kann später herausgefunden werden für welche Daten der übermittelte Wert steht.

    Um nicht falsch verstanden zu werden. Ich verlange nicht nach einer Komplettlösung. Ich erhoffe mir mit diesem Beitrag aber einen Wegweiser für den richtigen Lösungsweg mit dem Hintergedanke, dass ich mich zwar in vielen Programmiersprachen auskenne ausser in C++ ;)

    Hier meine RFSniifer:


    Vielen Dank schon Mal

    Gruss GL

  • Dann benutz doch kein C++. Fuer eine so simple Aufgabe.

    Stattdessen zB mit Python's subprocess-Modul den RFSniffer aufrufen, Ausgabe verarbeiten und in die DB schreiben.

  • Ich habe ein bisschen fehlinterpretiert wie RFSniffer funktioniert - das soll wohl dauerhaft laufen. Aber so wuerde ich das machen:

    Dieser Python-Code liest die Ausgabe von /tmp/test ein, ein kleines Test-C-Programm, dass ich geschrieben habe.

    Und das sieht so aus:

    Das Wichtige sind die printf und fflush-Aufrufe. Wenn du also RFSniffer so schreibst, dass er

    - eine Zeile mit dem gewuenschten Datum ausgbit, inklusive Newline!!! Also dem "\n" am Ende
    - danach seine Standardausgabe flushed


    dann kannst du das wie oben in Python einlesen, und dann weiterverarbeiten. In Python ist MySQL wirklich kinderleicht, da findet google dir Tonnen an Infos.

  • Hallo Deets

    Vielen Herzlichen Dank für deinen Aufwand.

    Allerdings muss ich irgendwas nicht richtig verstanden haben.

    Ich habe soeben (bevor ich am RFSniffer rum bastle) dein Testscript bei mir versucht.

    Alledrdings werden mir folgende Fehler beim asuführen angezeigt:

    Ausführen vom Phytonscript:

    Code
    ./test2.py: Zeile 1: Syntaxfehler beim unerwarteten Wort `('
    ./test2.py: Zeile 1: `def main():'

    beim direkten Ausführen vom C++ Script:

    Code
    ./test2.cpp: Zeile 4: Syntaxfehler beim unerwarteten Wort `('
    ./test2.cpp: Zeile 4: `int main()'

    Was bei mir noch anders ist. ich habe beide Dateien im selben Ordner und im Phytonscript den Verweis von "/tmp/test" auf "test2.cpp" geändert.

    Kannst du mir hier vieleicht nochmals kurz aushelfen? ich bin dir wirklich schon seeeeehr Dankbar für deinen bisherigen Input.

  • Wenn du den RFSniffer schon zum laufen gebracht hast - dann sollte dir doch eigentlich aufgefallen sein, dass man den kompilieren muss. Das gilt natuerlich auch fuer test.cpp. Das kann an nicht direkt ausfueheren. Sondern muss es zB mit "gcc -o /tmp/test /tmp/test.cpp" uebersetzen.

    Und der "Syntaxfehler beim unerwarteten Wort (" klingt auch komisch - wie fuehrst du das denn aus?!?!?


  • Wenn du den RFSniffer schon zum laufen gebracht hast - dann sollte dir doch eigentlich aufgefallen sein, dass man den kompilieren muss. Das gilt natuerlich auch fuer test.cpp. Das kann an nicht direkt ausfueheren. Sondern muss es zB mit "gcc -o /tmp/test /tmp/test.cpp" uebersetzen.

    Und der "Syntaxfehler beim unerwarteten Wort (" klingt auch komisch - wie fuehrst du das denn aus?!?!?

    Hallo deets

    Uuuups da wusste ich wohl noch weniger über C++ als gedacht. War eigentlich logisch ;)

    Somit funktioniert das Cpp Script schon mal und zählt munter vor sich her.

    Das phyton File habe ich mit chmod +x ausführbar gemacht und führe es dann mit ./test2.py aus.

    gibt es noch andere Möglichkeiten?

    Sorry für meine Unwissenheit. Deshalb habe ich mich auch nach langem überlegen hier gemeldet (ist immer meine letzte Option, will normal alles selbst herausfinden / ergoogeln;) )

    Gruss GL


    Edit: uuuups das waren ja die Bash scripts :/
    mit Python test2.py erscheint folgendes:

    Code
    Traceback (most recent call last):
      File "test2.py", line 12, in <module>
        main()
      File "test2.py", line 2, in main
        p = subprocess.Popen(
    NameError: global name 'subprocess' is not defined

    Einmal editiert, zuletzt von mc-gl (12. Juli 2016 um 22:39)

  • So einfach geht's dann nicht. Du brauchst entweder ein "shebang" - das ist die erste Zeile, die mit

    #!

    anfangen muss, und danach den Interpreter angibt. Im ganzen fuer Python ueblicherweise (unter Linux)

    #!/usr/bin/python

    Oder einfach "python skript.py" eingeben.


  • So einfach geht's dann nicht. Du brauchst entweder ein "shebang" - das ist die erste Zeile, die mit

    #!

    anfangen muss, und danach den Interpreter angibt. Im ganzen fuer Python ueblicherweise (unter Linux)

    #!/usr/bin/python

    Oder einfach "python skript.py" eingeben.

    Hallo Deets

    Hast du bemerkt dass ich noch ein edit vorgenommen habe?

  • Nein, aber jetzt. Und schau dir mal genau mein Skript an, und dann deines. Da muss es einen kritischen Unterschied geben.

  • Aaaahaa

    Beim Scrollen ist die erste Zeile im Script "import subprocess" nicht angezeigt worden und somit nicht mitgekommen.

    Nun passiert beim ausführen auch was allerdings nicht viel. Die Console wird Schwarz, bzw wird mit Nichts gefüllt. Beim Abbruch mit Ctrl+C erschein diese Meldung:

    Code
    ^CTraceback (most recent call last):
      File "test2.py", line 14, in <module>
        main()
      File "test2.py", line 10, in main
        print(data)
    KeyboardInterrupt
    close failed in file object destructor:
    sys.excepthook is missing
    lost sys.stderr


    Wenn ich den Code richtig verstehe müsste dort doch jetzt gezählt werden genau wie wenn ich das CPP Script selbst ausführe. Oder Irre ich mich?
    Automatisch zusammengefügt:
    Okay und wieder weiter:

    nun erhalte ich nur noch den Fehler

    Code
    Traceback (most recent call last):
      File "test2.py", line 14, in <module>
        main()
      File "test2.py", line 6, in main
        stdout=subprocess.PIPE,
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory

    Einmal editiert, zuletzt von mc-gl (12. Juli 2016 um 22:59)

  • Also ich hab's gerade noch mal probiert - auch auf dem PI (vorher "nur" mein Mac, aber unix ist unix in diesen Dingen), und da geht's.

    Bitte pruef noch mal, ob du die Pfade zu den richtigen Programmen angeben hast. Ich vermute dein rumgebastel hat das verhackstueckt. Du musst den vollen Pfad, der an subprocess.Popen uebergeben wird, auch so in der Shell eingeben koennen - und dann muss da hochgezaehlt werden. Also /tmp/test, oder wohin auch immer du das Programm kompiliert hast.


  • Also ich hab's gerade noch mal probiert - auch auf dem PI (vorher "nur" mein Mac, aber unix ist unix in diesen Dingen), und da geht's.

    Bitte pruef noch mal, ob du die Pfade zu den richtigen Programmen angeben hast. Ich vermute dein rumgebastel hat das verhackstueckt. Du musst den vollen Pfad, der an subprocess.Popen uebergeben wird, auch so in der Shell eingeben koennen - und dann muss da hochgezaehlt werden. Also /tmp/test, oder wohin auch immer du das Programm kompiliert hast.

    Hallo Deets


    Vielen Lieben Dank für deine Unterstützung.

    Ich konnte das Projekt heute zu ende bringen.
    Die Daten der Wetterstation werden nun mit deiner Script Hilfe in meine DB geschrieben.

    Es war tatsächlich ein Pfad Problem. Ich habe nicht bemerkt, dass du den Pfad absolut gesetzt hast und habe somit bei mir den Pfad relativ gehalten. Dumm... :blush:


    So sieht nun mein Pyhton Script aus:

    Und Hier RFSniffer:

    Für die die es interessiert, hier der Arduino Code:

    Es ist natürlich noch nicht der definitve Code. Da muss ich noch ein paar Sachen ändern. Aber Immerhin kommen die Daten nun an.

    Vielen Dank nochmals. Und sorry für meine Flüchtigkeitsfehler. :danke_ATDE:

    Gruss GL

Jetzt mitmachen!

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