868 MHz Funkverbindung zwischen Raspberry Pi und Arduino mit RFM69HCW - Parsen von empfangenen Datenpaketen bzw. deren Inhalt

  • Super, danke fürs Posten des Codes. :danke_ATDE:


    Jetzt muss ich mich selber zitieren:

    Die Python Implementierung kannte ich bisher nicht, finde sie aber echt klasse.

    Naja.

    Ich habe sofort einen RFM69CW (ohne H) an meinen Raspi 1 Model B angeschlossen und bin auch sofort auf Probleme Gestossen:

    1. Den Port 29 für den Reset gibts am Raspi 1 nicht. Ist trivial, man muss halt beim Deklarieren der Instanz noch ein resetPin=15 hinzufügen (Port ist egal solange er auf dem Raspi 1 existiert).

    2. Den reset Pin brauchts nicht, man kann den dafür vorgesehenen Code ohne Weiteres rausloeschen.

    3. set_power_level(self, percent) in radio.py: Die Angabe in Prozent ist voelliger Schwachsinn, das kann sich nur jemand ausgedacht haben der von HF keine Ahnung hat. Die Skala ist nämlich logarithmisch, nicht linear. Wenn man "70" Prozent angibt, kommt man auf Power Level 22. Das ist 9 dB unter dem maximalen Pegel, also 1/4 der Leistung, nicht 70% :wallbash:

    4. Ein echter und folgenreicher Fehler ist diese Zeile:

    self.powerLevel = int( round(31 * (percent / 100))) in Zeile 158 in radio.py. Da die Variable percent ausdrücklich als Integer Wert deklariert wird (warum eigentlich?), wird aus der Division percent/100 eine Integer Division also 70/100 = 0. Tippe mal im interaktiven Python Modus "70/100" ein, dann weisst du was ich meine. Das heisst am Ende sendest du IMMER mit Power Level 0, was etwa -18 dBm entspricht und deine Reichweite ziemlich einschränkt. Man sollte (MUSS!!!) die Zeile so abändern:

    self.powerLevel = int( round(31 * (percent / 100.0))). Jetzt wird eine Floating Point Division draus, und gut ist's. Das mit den Prozent würde ich aber auch am liebsten sofort ändern, siehe Punkt 3.)

    Wenn du natürlich 100 Prozent eingibst, bekommst du maximale Leistung, weil die Integerdivision 100/100= 1 ergibt.


    Code
    1. Python 2.7.3 (default, Nov 24 2017, 21:13:24)
    2. [GCC 4.6.3] on linux2
    3. Type "help", "copyright", "credits" or "license" for more information.
    4. >>> 70/100
    5. 0
    6. >>> 70/100.0
    7. 0.7
    8. >>>

    So, jetzt bin ich aber leider überfragt wie es von hier aus weitergeht. In der Bibliothek ist ein heftiger Bug, den muss man korrigieren. Als "quick and dirty"

    Loesung ist mir bisher nur eingefallen, die Bibliothek an Ort und Stelle zu modifizieren. Sie steht bei mir hier:

    /usr/local/lib/python2.7/dist-packages/RFM69

    Mit dem Editor nano hab ich aus 100 100.0 gemacht und schon habe ich die gewünschte Leistung am Spektrum Analyzer.


    Die High-Power Modi sind aber auch in diesem Treiber nicht richtig umgesetzt, siehe hier:

    Mein Blog

  • Hallo,


    Zitat

    wird aus der Division percent/100 eine Integer Division also 70/100 = 0

    Das ist die Implementierung bei Python 2: Integer durch Integer immer gleich Integer. Damit muss man bei Python 2 entsprechend arbeiten.


    Python 3 hat das Verhalten nicht mehr, das ist Integer durch Integer gleich Float, wenn die Division nicht glatt aufgeht.


    BTW: warum wird hier eigentlich Python 2 verwendet? Das ist ja bekanntlich bald EOL. Gibt's die Bibliothek nicht für Python 3?


    Gruß, nosiefloor

  • <OT>

    Python 3 hat das Verhalten nicht mehr, das ist Integer durch Integer gleich Float, wenn die Division nicht glatt aufgeht.

    Danke für den Hinweis aber ich finds blöd. In C war und ist das 50 Jahre lang kein Thema und jetzt das. Was mach ich in Python3 wenn ich eine Integer Division explizit WILL?

    Also ich werd mit Python3 immer noch nicht warm...


    Gibt's die Bibliothek nicht für Python 3

    weiss nicht. Laut pypi.org schon.

    pip install rpi-rfm69

    Dann ist die Lib in Python 2.7, aber nicht in 3.2. Da sich die Bibliothek in Python2.7 installiert, ist das definitiv ein Bug. Und 70/100.0 ist kompatibel mit beiden Versionen, ist also m.E. die anzustrebende Lösung.

    Was muss ich tun um die Bibliothek für Python3 zu installieren? Ich probiers gerne aus.


    </OT>

  • Hallo,


    Zitat

    Danke für den Hinweis aber ich finds blöd. In C war und ist das 50 Jahre lang kein Thema und jetzt das.

    Beschwerden dazu kannst du gerne bei den Core-Developern von Python loswerden. Da das Ende von Python 2 aber absehbar ist, ist das wahrscheinlich Zeitverschwendung...


    Zitat

    Was mach ich in Python3 wenn ich eine Integer Division explizit WILL?

    Das hier:

    Python
    1. >>> 10/3
    2. 3.3333333333333335
    3. >>> 10//3
    4. 3
    5. >>>


    Zitat

    Also ich werd mit Python3 immer noch nicht warm...

    Tja... dann lauf dich mal besser warm oder wechsel die Programmiersprache. Python 2.7 ist die letzte unterstützt Python 2 Version, die ist nach aktuellen Stand der Dinge am 1.1.2020 EOL.


    Zum Python-Modul rpi-rfm69: das hat laut- PyPi Alpha-Status -> Kein Wunder, dass das Bug hat. Lt. Doku Seite des Projekts wird explizit nur Python 2 unterstützt -> damit sind die Tage des Moduls wohl auch gezählt...


    Gruß, noisefloor


    Gruß, noisefloor

  • Danke für die Einführung in Python3.

    Python 2.7 ist die letzte unterstützt Python 2 Version, die ist nach aktuellen Stand der Dinge am 1.1.2020 EOL.

    Macht es dann "plopp" und keines meiner zahlreichen Skripte funktioniert dann noch? - Nein du hast schon recht. Ich habe bereits einige meiner Module Python3 kompatibel gemacht, das geht meistens recht flott.


    Lt. Doku Seite des Projekts wird explizit nur Python 2 unterstützt

    Also als unterstützte Sprachen wird bei mir neben Python 2.7 auch Python 3, Python3.5 und Python 3.6 aufgeführt. Dass das Modul explizit nur Python 2 unterstützt sehe ich nirgends. Ich finde es auch "zu Fuss" wenn ich mir die Liste der Python3 Module anzeigen lasse. Muss also auch unter Python3 laufen, was ich gerne ausprobieren moechterte.


    funktioniert pip3 install rpi-rfm69?

    nein.

    Habe apt-get install python3-pip durchgeführt.

    Danach pip3 install rpi-rfm69

    Fehlermeldung:

    -bash: pip3: command not found


    Ich muss dazu sagen, dass ich mit Wheezy arbeite :blush:, Bisher gabs auf dem alten Klepper keine Veranlassung das zu ändern.

  • pip3 installiert module bei einem Benutzer:
    Wenn das Modul als root installiert wurde,

    und du als Benutzer pi dann python3 ... aufrufst findet er das Modul nicht.

  • Hallo,


    Zitat

    Also als unterstützte Sprachen wird bei mir neben Python 2.7 auch Python 3, Python3.5 und Python 3.6 aufgeführt.

    Aha, ok, thx. In der Doku zum Projekt ist "nur" die Installation für Python 2.7 erklärt, dass es auch mit P3 läuft steht da zumindest explizit nicht. Hab's jedenfalls nicht gesehen.


    Gruß, noisefloor

  • Danke erst mal. Mann da kommt man vom 100sten ins 1000ste. Mit User Rechten hat das nichts zu tun, eher mit veraltetem OS.

    Das hat dann letztendlich, mit zahlreichen Warnungen, funktioniert:

    pip-3.2 install rpi-rfm69 -i https://pypi.python.org/simple/

    Die -i Option ist irgendwie nicht dokumentiert, braucht man aber weil pypi von http auf https umgestellt wurde.

  • Hi, nurazur


    hatte leider die letzten tage mit 3D-Modellen zu tun, da ich wie gesagt gerade Bachelorarbeit schreibe und es zeitlich bisschen eng wird.


    Hier der Code ohne Multiprozessing. Funktioniert alles soweit und tut was es soll.


    Ein Paar Dinge wie das mit os statt subprocess muss ich noch ändern.


    Aktuell bin ich gerade dran noch ein Funkthermometer mit einem Arduino Pro Mini und einem DHT22 hinzuzufügen. Funktioniert auch soweit, nur das Senden des Temperaturwertes vom Arduino funktioniert noch nicht ganz.