Seite 1 von 1

MQTT subscribe multiple topics

Verfasst: Sonntag 22. Oktober 2023, 07:59
von chris8
Hallo zusammen,

ich komme aktuell nicht weiter und benötige euer Hilfe.
Es gibt die Möglichkeit mehrere MQ Channel's mit einem mal auszulesen. Also pro Sekunde 4 Chanels gleichzeitig zu lesen.

In meinen bisherigen test script bekomme ich nur pro Sekunden einen Wert zurück und das ist zu langsam.

Code: Alles auswählen

def mqs(mq_chn):
    """_summary_

    Args:
        mq_chn (string): Channel auf dem MQ Server.

    Returns:
        float: Ist der Wert vom abgefragtem Channel im MQ.
    """
    msg = subscribe.simple(mq_chn, hostname="192.168.23.27",
                        auth={'username':"xxxxx", 'password':"xxxxxx"})
    print("%s" % (msg.payload))
    #print(msg.topic+" message Wert ist: {}".format(msg.payload.decode("utf-8")))
    Wertzaehler = format(msg.payload.decode("utf-8"))
    Wertzaehler = float(Wertzaehler)
    Wertzaehler = round(Wertzaehler,2)
    return Wertzaehler
In der Doku steht was von einer Liste. Hatte ich porbiert geht aber nicht.

Code: Alles auswählen

(function) def simple(
    topics: str | list[str],      <------------------------------- Hier beschrieben!!!!
    qos: int = 0,
    msg_count: int = 1,
    retained: bool = True,
    hostname: str = "localhost",
    port: int = 1883,
    client_id: str = "",
    keepalive: int = 60,
    will: _Msg | None = None,
    auth: _Auth | None = None,
    tls: _TLS | None = None,
    protocol: int = 4,
Für eure Hilfe wäre ich sehr dankbar.

Gruß
Christoph

Re: MQTT subscribe multiple topics

Verfasst: Sonntag 22. Oktober 2023, 08:43
von Sirius3
Wenn Du regelmäßig Nachrichten empfangen willst, dann ist subscribe.simple halt der falsche Weg. Da mußt Du mit Events arbeiten.

Benutze keine Abkürzungen. Was soll mqs denn bedeuten? mqchn ist deutlich schwieriger zu lesen als channel.
"%s" ist nichts anderes als ein kompliziert geschriebenes str(), das `print` implizit ja schon aufruft.
Variabelnnamen werden generell klein geschrieben, Wertzaehler ist zudem das einzige deutsche Wort. Bleibe bei einer Sprache, idealerweise englisch.
Ein Aufruf von `format` ist selten sinnvoll, mit nur einem Argument aber totaler Quatsch.
Runden sollte man erst bei der Ausgabe, durch Angabe des entsprechenden Formatstrings.
Literale Strings, die wichtige Informationen enthalten, sollten als Konstante am Anfang der Datei definiert werden, nicht mitten in Funktionensaufrufen.
Das ganze könnte also besser so aussehen:

Code: Alles auswählen

MQ_HOSTNAME = "192.168.23.27"
MQ_AUTHORIZATION = {'username':"xxxxx", 'password':"xxxxxx"}

def read_counter_from_channel(channel):
    message = subscribe.simple(channel,
        hostname=MQ_HOSTNAME,
        auth=MQ_AUTHORIZATION
    )
    print(message.payload)
    counter = float(message.payload.decode("utf-8"))
    return counter

Re: MQTT subscribe multiple topics

Verfasst: Sonntag 22. Oktober 2023, 12:42
von chris8
Danke für deine Tipps. Werde ich in Zukunft beachten und anpassen.
Doch wie kann in deinem Beispiel eine Liste mit topics mitgeben?

z.B.:

Code: Alles auswählen

mqtttopics = ["vzlogger/data/chn2/raw","vzlogger/data/chn3/raw","vzlogger/data/chn4/raw"]
Das laut Doku laufen müsste.

Re: MQTT subscribe multiple topics

Verfasst: Sonntag 22. Oktober 2023, 13:04
von Sirius3
Und was funktioniert nicht, wenn Du eine Liste an Topics angibst?
Du bekommst weiterhin nur jeweils eine Nachricht. So ist das nunmal bei `simple`.