RPi Node-RED, Python, MQTT client.subscribe, client.loop_start()

  • Auf einem 1,3“ OLED Display möchte ich mit meinem LIRC gesteuerten Internet-Radio Programm auch Benzinpreise anzeigen. Diese Preise werden auf einem anderen RPi mit Node-Red mit einem

    http-Request, alle 5 Minuten, geholt und über MQTT out auch an einem ESP8266 mit ESPEasy angezeigt.

    Noch benutze ich für mein Internet-Radio-Programm Python 2.7 und Jessi. Mit der Umstellung auf Buster und Python 3 bin ich wegen LIRC bisher gescheitert.


    Mein Testprogram mqtt_test.py zeigt die all 5 Minute in

    Code
     def on_message(client, userdata, msg):

    den Preis als: Bpreise = „E10: Jet 1,179 Oil! 1,189“

    Als gelegtlicher Python trial and error Benutzer brauche ich mal eine Hinweis, wie die Preise

    in der while True(): Loop

    ankommen und verabeitet werden können.

    Grüße aus Hamburg bei 29°C, Thomas

  • Die Zeile


    if Bpreise <> " ":


    ist nutzlos, weil in der Zeile davor ein String fuer Bpreise zusammengebaut wird, der diese Bedingung niemals nicht erfuellt. Kannst du dir also auch sparen.


    Und dein Grundproblem hier ist, dass dein Programm notwendigerweise ereignisbasiert ist. Es gibt einen mainloop, der mit loop_start gestartet wird. Und alles, was dein Programm danach machen kann und soll, ist nur auf Ereignisse reagieren. Alles was du also tun willst, musst du notwendigerweise in der Behandlung eines solchen Ereignisses durchfuehren.


    Du kannst auch aus einer Behandlung eines Ereignisses dementsprechend nichts zurueckgeben. Wo soll das hin?


    Dein konkretes Problem ist aber doch voellig simpel geloest: in deiner Ereignisbehandlung kannst du doch auch den Wert speichern.

  • in deiner Ereignisbehandlung kannst du doch auch den Wert speichern.

    Mir ist nicht klar was eine Ereignisbehandlung ist.

    Ist on_message(client) das Ereignis?


    Code
    def on_message(client, userdata, msg):
       print(msg.topic + " " + str(msg.payload))  # Alle 5 Minuten kommen die Preise

    Wie kommt dann str(msg.payload) all 5 Minuten zur Anzeige?

    Eine Zwischenspeicherung muß erfolgen, weil immer all Zeilen geschrieben werden.

    D.H. ein Sender oder Titel könnte sich ändern und sollte sofort angezeigt werden.

    Ich weiß also immer noch nicht, wie ich die Preise in die Pgm, Loop bekomme?

    Vielleicht git es da eine konkreteren Tipp.

    Grüße, Thomas

  • on_message wird bei einem Ereignis (neue Nachricht, auf Englisch: on Message) aufgerufen. Und was auch immer du darin mit dem Ereignis tust, ist die Behandlung desselben.


    Wenn das alle 5 Minuten kommt, dann wird das daran liegen, dass irgendwer alle 5 Minuten diese Nachricht schickt. Was anderes ist mE nicht möglich.


    Und du magst ja immer alles auf einmal schreiben wollen, aber das ändert nichts daran, dass du das innerhalb oder durch die Ereignisbehandlung ausgelöst machen musst. Du kannst da nix zurückgeben. Und wenn die Nachricht eh nur alle 5 Minuten kommt, hat’s du doch endlos Zeit, die alten Werte einzulesen, den neuen anzuhängen, und wieder alles weg zu schreiben.


    Der letzte Ansatz und Code dazu sind unverständlich. Die waren nicht im Ursprünglichen Code, und “Pgm, Loop” ist Kauderwelsch.