Posts by U32

    Hallo liebe Raspi-Freunde!


    Ich möchte mit diesem Posting nochmal um eure Hilfe bitten.

    Zur Erinnerung:

    Ich betreibe einen Raspberry Pi 3B als Wetterstation. Ein Sensor dieser Wetterstation soll dieser Windrichtungssensor sein:


    30565-pasted-from-clipboard-png


    Da dieser seine Daten über das RS485-Protokoll sendet, habe ich mir noch diesen RS485-HAT für den Raspi gekauft:


    30566-pasted-from-clipboard-png


    Weiterhin benötigt der Sensor eine Betriebsspannung von 12 V, weshalb er ein eigenes Netzteil hat.


    Für mein Python-Programm habe ich mir zunächst mit


    sudo pip3 install pymodbus


    die pimodbus-Library installiert.


    Danach habe ich für das eigentliche Script recherchiert.



    Das der Port 4 zum umschalten des Berriebsmodus (senden/empfangen) verwendet werden soll habe ich aus dem Handbuch des RS485-HATs von Waveshare

    (Siehe Seite 2 letzte Zeile in der Tabelle)

    Das der Port dann zum Empfangen auf "LOW" gesetzt werden muss habe ich von DeaD_EyE.


    Die Verbindungsparameter habe ich aus der Doku für den Sensor (Seite 4 Punkt 1.3 Communication Interface).

    Bezüglich des auszulesenden Registers steht in der Doku zwar nur, dass ausschließlich der Funktionscode 0x03 verwendet wird

    (und dieser wird dann mit "Read Data register" erklärt), aber sowohl DeaD_EyE als auch dieses Youtube-Video

    weisen auf den Typ "read_holding_registers" hin.



    Zu den Parametern dieses Registers:

    Adress: Laut Doku Seite 9 Punkt 4.3 gibt es zwei Register. 0x00 und 0x01.

    Wenn ich nun die Windrichtung in ° haben möchte, müsste ich demnach die Adresse 0x01 auswählen.


    Count: Anschließend bleibt noch der Wert für Count, dieser ist in dem YT-Clip so erklärt, dass dieser die Anzahl der auszulesenden Register angibt.

    Da ich nur den Wert für für die Windrichtung haben möchte, müsste dieser Wert also auch auf 0x01 stehen.


    Unit: In der Doku zum Sensor steht auf Seite 9 Punkt 4.2 das die Adresse des Transmitters 0x01 ist (factory default).

    Weiterhin entnehme ich sowohl der Doku, als auch dem YT-Clip, dass wenn nur ein Device im Netz ist, der Wert für Unit auf 0x01 gesetzt werden muss.


    Kurzum: Wenn ich die Logik richtig verstanden habe, müsste in meinem Fall überall eine 1 stehen.


    Und trotzdem funktioniert der Sch... nicht!

    Ich habe dann aus purer Verzweifelung anhand dieser Matrix...


    EN_485 address count unit Checked
    LOW 0 0 0 X
    LOW 0 0 1 X
    LOW 0 0 2 X
    LOW 0 1 0 X
    LOW 0 1 1 X
    LOW 0 1 2 X
    LOW 0 2 0 X
    LOW 0 2 1 X
    LOW 0 2 2 X
    LOW 1 0 0 X
    LOW 1 0 1 X
    LOW 1 0 2 X
    LOW 1 1 0 X
    LOW 1 1 1 X
    LOW 1 1 2 X
    LOW 1 2 0 X
    LOW 1 2 1 X
    LOW 1 2 2 X
    LOW 2 0 0 X
    LOW 2 0 1 X
    LOW 2 0 2 X
    LOW 2 1 0 X
    LOW 2 1 1 X
    LOW 2 1 2 X
    LOW 2 2 0 X
    LOW 2 2 1 X
    LOW 2 2 2 X
    HIGH 0 0 0 X
    HIGH 0 0 1 X
    HIGH 0 0 2 X
    HIGH 0 1 0 X
    HIGH 0 1 1 X
    HIGH 0 1 2 X
    HIGH 0 2 0 X
    HIGH 0 2 1 X
    HIGH 0 2 2 X
    HIGH 1 0 0 X
    HIGH 1 0 1 X
    HIGH 1 0 2 X
    HIGH 1 1 0 X
    HIGH 1 1 1 X
    HIGH 1 1 2 X
    HIGH 1 2 0 X
    HIGH 1 2 1 X
    HIGH 1 2 2 X
    HIGH 2 0 0 X
    HIGH 2 0 1 X
    HIGH 2 0 2 X
    HIGH 2 1 0 X
    HIGH 2 1 1 X
    HIGH 2 1 2 X
    HIGH 2 2 0 X
    HIGH 2 2 1 X
    HIGH 2 2 2 X


    ...alle möglichen Kombinationen ausprobiert.

    Leider immer mit der selben Fehlermeldung als Ergebnis. :(


    Das schlimme daran ist ja, dass es es schon Mal funktioniert hat und ich Vollpfosten die falsche Datei gelöscht habe (nämlich die mit dem richtigen CODE).


    Hat vielleicht irgendjemand noch eine Idee woran es liegen könnte?

    Oder hat jemand vielleicht im Netz noch jemand anderes gesehen, der die gleiche Konstellation verwendet?


    Ich bin für jeden Hinweis dankbar!!!


    Beste Grüße und ein schönes Wochenende!

    U32

    First Things First:

    :danke_ATDE: D A N K E ! :bravo2:


    Ok, deine Erklärung klingt logisch. Und erhlich gesagt, hatte ich selbst schon den Fall dass ein Programm nicht funktioniert, wenn ein verwendetes Modul nicht im Verzeichnis liegt.

    In meinem Fall lag die BME280.py im User-Verzeichnis und nicht im Unterordner "Wetterstation".

    Was ich nun aber nicht verstehe, warum hat dann der Weg über IDLE funktioniert?

    Die Datei war doch in dem Fall auch nicht vorhanden (oder zumindest nicht da, wo sie sein sollte).


    Vielen Dank auch nochmal an Dennis89 !

    Ausgabe von ls -la ~/Projekte/Wetterstation:


    Was meinst du mit Anleitung? Ich habe keine Anleitung benutzt, jedenfalls nicht wissentlich.

    Fakt ist, dass Du Under-voltage detected! Meldungen in Deinen Logs hast. Was nun genau zu wenig Strom bekommt, kann man da nicht sagen. Verbeiß Dich mal nicht zu sehr in WLAN oder USB.


    Ich hatte vor ein paar Jahren auch mit dem Mysterium zu tun. Da hatte ich mir mit einem RPi (1)B ein Webradio gebaut. Der hatte noch kein WLAN an Bord und benötigte dafür einen Edimax-USB-Stick. Das WLAN funktionierte, aber siehe hier: RPi B Display-LED flackern

    Moin hyle !

    Es gibt Neuigkeiten bei diesem Problem:

    Ich habe das "Under-Voltage-Problem" gelöst.

    Leider kann ich es mir nicht wirklich rational erklären, fakt ist aber, die Meldung ist weg.

    Ich habe gelesen, dass es bei crontab sinnvoll ist, nicht gewünschte Mail-Benachrichtigungen nach dev/null zu verschieben.

    Und siehe da, nach dem ich die Zeilen im crontab angepasst hatte, war die Warnung weg.

    Und die CPU-Last ging von 44 - 52% auf 27 - 32 % zurück.


    Ich wollte mich schon freuen, als am nächsten Morgen der Job immer noch lief, doch leider ist der Cronjob dann abends wieder plötzlich stehen geblieben.


    Fazit:

    - Under-Voltage-Warnung weg.

    - Cronjob bleibt immernoch unvermittelt stehen...


    Verd..t! :@

    Hallo Dennis89 !


    WOW! Erstmal viel Dank, dass du dir die Zeit genommen hast, das alles durchzugehen und umzubauen!

    Die Sache mit den Konstanten, Variablen und Klassen werde ich mir merken. Für mich als "Rookie" und "Feierabend-Programmierer" ist das Selbststudium nicht immer einfach - aber das ist ein anderes Thema...


    Die Sache mit den Exception habe ich mir jetzt doch mal an den Monitor geklebt. Darauf hat mich hyle glaube ich schon das 2. Mal aufmerksam gemacht und langsam wird's peinlich. :blush:


    Ich bin euch wirklich sehr dankbar für eure Tipps, die sind wirklich immer sehr hilfreich und sie bringen mich auch jedes Mal ein Stückchen weiter,

    aber mein konkretes Problem besteht auch nach den Änderungen weiterhin.


    Auch wenn ich den von dir optimierten CODE nehme, funktioniert er unter IDLE3 direkt und tadellos, ohne, dass ich etwas ändern musste.

    Starte ich eben genau dieses Programm mit "python3" in der Shell bekomme ich eine Fehlermeldung und ich kann mir nicht erklären, warum.


    Fehlermeldung via Shell:

    In der Zwischenzeit habe ich gefunden, wo die IDLE-Version angezeigt wird.



    Es wird also Python3 verwendet.


    Bin noch immer ratlos.

    Was wird denn via Shell unter python3 anders gemacht/interpretiert als mit IDLE?

    Damit hatte ich noch nie Probleme.


    Viele Grüße

    U32

    Was mir gerade noch eingefallen ist, da ich mich früher fragte was das soll, aber Idle nie verwendete... es gibt Idle (Python2) und es gibt Idle3 (Python3). Welches verwendest Du?


    Vielleicht hilft eine neue Datei mit dem Inhalt help() auszuführen. Da könnte die verwendete Python-Version angezeigt werden, aber ich rate da nur. :conf:

    IDLE3 => Soweit wusste ich es schon. Dachte es gäbe ein Kommando, mit dem man die genaue Version zurückbekommt.

    Das entfernen von except brachte keinen Unterschied.

    Aber das starten mit python via shell brachte eine andere Fehlermeldung:

    Code
    pi@raspi:~/Projekte/Wetterstation $ python LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 6, in <module>
        import bme280
    ImportError: No module named bme280
    pi@raspi:~/Projekte/Wetterstation $ 

    Dann lass die Zeile "d = " weg, bzw. kommentiere diese aus. Vermutlich müssen aber alle Referenzen weg, sonst kommt die Fehlermeldung nur an anderer Stelle. Startet IDLE das Skript denn auch mit python3?


    Edit: Zu spät.

    Hallo hyle , daxb ,

    wie kann ich das (sicher) überprüfen? Ich bin der Meinung, ich habe nur Python3 installiert.

    Hi daxb !


    Gesagt - getan
    Diese Änderung...

    bringt diesen Output in IDLE....

    und leider genau den selben Output mit der Shell...

    Code
    pi@raspi:~/Projekte/Wetterstation $ python3 LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 42, in <module>
        d = (tpk1*math.log(h/100)+((tpk2*t)/(tpk1+t)))/(tpk3-math.log(h/100)-((tpk3*t)/(tpk1+t)))
    NameError: name 'h' is not defined
    pi@raspi:~/Projekte/Wetterstation $ 

    Erstmal Danke für die schnelle Antwort.

    Ich muss zugeben, dass ich auch nichts anderes erwartet habe, denn "h" ist ja eigentlich definiert, sonst würde es unter IDLE ja auch nicht laufen.

    Ich bin echt ratlos und habe so gar keinen Anhaltspunkt.

    :helpnew:

    Moin!
    Ich fürchte ich brauche mal wieder eure Hilfe.

    Ich habe eine Python-Script mit IDLE geschrieben (siehe CODE).

    Dieses Programm funktioniert auch gut, wenn man es unter IDLE laufen lässt.

    Siehe output:

    Code
    ============ RESTART: /home/pi/Projekte/Wetterstation/LuftCron.py ============
    (22.38, 1001.3223773280776, 51.2430526923437)
    02.10.2021        18:03:17
    Temperatur:       22.4 °C
    Luftdruck:        1001.4 hPa
    Luftfeuchtigkeit: 51.2 % RH
    Taupunkt:         11.8 °C
    >>> 

    Wieso bekomme ich nun eine Fehlermeldung, wenn ich eben dieses Programm in der Shell ausführe?

    Fehlermeldung:

    Code
    pi@raspi:~/Projekte/Wetterstation $ python3 LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 39, in <module>
        d = (tpk1*math.log(h/100)+((tpk2*t)/(tpk1+t)))/(tpk3-math.log(h/100)-((tpk3*t)/(tpk1+t)))
    NameError: name 'h' is not defined
    pi@raspi:~/Projekte/Wetterstation $ 

    Warum ist jetzt "h" plötzlich nicht mehr defined?

    Das Programm läuft doch eigentlich!

    Ich blick's einfach nicht.

    Kann mir einer von euch helfen?


    Vielen Dank und beste Grüße

    U32

    Die Meldung habe ich aber auch, wenn der Job läuft.

    Ich werde aus der Sache einfach nicht schlau! :wallbash:

    Wird wahrscheinlich wieder so'ne "Fehler-durch-fummeln-beseitigt" Nummer. ;(


    Werde mich mal wieder mehr auf den Sensor als Fehlerquelle konzentrieren...

    Hallo Dennis89 !


    Konntest du mit meinem Hinweis etwas anfangen?

    Ich vermute den Fehler in der Kombination aus GPIO-Setup und/oder Konfiguration des holding_registers, da mit dieser Kombi das entsprechende Register (mit dem gewünschten Wert) ausgelesen werden können sollte.

    Tut es aber leider nicht und ich bekomme die erwähnte Fehlermeldung, statt eines Wertes (z.b. 270, 60, etc.).

    Daher also meine Vermutung.


    Beste Grüße

    Michael

    Moin hyle !


    Das verwendete Netz ist normal so.

    Zum Thema Netzteil:

    Ich hatte ja zuvor ein original Raspberry Netzteil. Das hatte aber "nur" 2,5 A und daher habe ich es getauscht.


    Und noch ein ganz wichtiger Punkt:

    Die anderen Jobs laufe ja erfolgreich weiter.
    Der Job für die Windgeschwindigkeit läuft beispielsweise jede Minute (!) und liefert zuverlässig Daten seit der Einschaltung.
    Das ist der Punkt der mich schier wahnsinnig macht. :@ Es ergibt keinen Sinn.

    Die Sache mit dem Netzteil > zu wenig Strom > WLAN aus , etc. klingt ja plausibel.

    Aber dann dürften die anderen Jobs doch auch keine Daten mehr in meine DB schreiben können (so ohne Netzwerk), oder habe ich da einen Denkfehler?


    Vielen Dank und beste Grüße

    U32

    Hallo hyle ,


    Hier mal ein Auszug aus dem Logfile:

    Um 19:45 Uhr wurde der Job zuletzt erfolgreich ausgeführt.

    Etwas später gibt es dann wohl aber ein Problem mit dem WLAN-Interface:


    Und wieder etwas später scheint das Problem wieder behoben...



    Kannst du die Einträge irgendwie interpretieren?


    Vielen Dank und beste Grüße

    U32