Vorstellung loxMqttRelay: Docker-fähiges MQTT-Gateway "light"

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Deepflash
    LoxBus Spammer
    • 08.06.2021
    • 220

    #16
    bin gerade am Aufsetzen von dem Ganzen und habe nun eine kleine Frage:
    Wenn ich es richtig verstanden habe, nimmt loxmqttrelay alle VIs vom Miniserver und schaut am MQTT-Broker nach passenden Werten.
    Wozu müssen dann eigentlich noch Topics oder Filter definiert werden? Um den Pool zu verkleinern, in dem gesucht wird?

    Kommentar


    • Acidcliff
      Acidcliff kommentierte
      Kommentar bearbeiten
      Wenn du die Miniserver-Sync-Funktion benutzt dann ist das richtig - dann brauchst du theoretisch gar keine Filter/Topics mehr setzen.
      Theoretisch könntest du mit "#" auf alle topics subscriben und loxmqttrelay übernimmt den Rest.

      Da das filtern aber erst im letzten Schritt stattfinden kann, erreichst du typischerweise eine bessere Performance, wenn du zumindest die Subscriptions klug aussuchst. Den größten Effekt wird es immer haben, wenn du über die Subscriptions so wählst, dass Topics, die JSON-Payload enthalten, aber ohnehin verworfen werden würden, ausgeschlossen werden. Die sind am rechenintensivsten.

      Wenn du es simpel halten willst, kannst du es aber quasi auch komplett generisch lassen. Das Relay ist wirklich sehr performant.

    • Deepflash
      Deepflash kommentierte
      Kommentar bearbeiten
      aber welchen Vorteil bringt es mit Topic Subscriptions oder Whitelists zu arbeiten, wenn es doch das MiniServer-Sync-Feature gibt:
      Automatic Configuration Sync

      Enable automatic synchronization with your Miniserver's configuration:

      [miniserver]
      sync_with_miniserver = true

      When enabled, the relay will:

      Automatically load Miniserver configuration on startup
      Update the topic whitelist based on Miniserver inputs
      Resync when Miniserver configuration changes

      Caution: This function will assume that every Virtual Input is a possible target for forwarding mqtt messaages.

    • Acidcliff
      Acidcliff kommentierte
      Kommentar bearbeiten
      Einerseits um das letzte bisschen Performance rauszuholen.
      Andererseits (und das war meine hauptsächliche Motivation beides anzubieten) ist die Interaktion mit der Miniserver-Config eigentlich kein von Loxone offiziell vorgesehener Weg. Ich dachte mir, dass sich nicht jeder wohl fühlen wird ein fremdes Programm auf die eigene Konfiguration loszulassen.
  • Deepflash
    LoxBus Spammer
    • 08.06.2021
    • 220

    #17
    noch etwas: offenbar ist der UDP-Port bereits durch das MQTT Gateway vom Loxberry besetzt. Gibt es einen eleganten Weg, das frei zu bekommen?

    Kommentar


    • Deepflash
      Deepflash kommentierte
      Kommentar bearbeiten
      - Antwort: einfach im MQTT Gateway einen anderen Port eintragen

    • <Andreas>
      <Andreas> kommentierte
      Kommentar bearbeiten
      Entweder in den Gateway Settings des loxberrys den "Gateway UDP in-port" ändern oder in Docker einen anderen setzen, dann müsstest du aber auch die Adresse in der Config ändern (zu spät 🙈)
      Zuletzt geändert von <Andreas>; 03.09.2025, 10:45.
  • Deepflash
    LoxBus Spammer
    • 08.06.2021
    • 220

    #18
    also was soll ich sagen, bin nun auch ein- bzw. umgestiegen ohne separaten Broker.
    Das Ergebnis lässt sich sehen (ganz am Ende). Sieht an und für sich nicht so drastisch aus, entscheidend ist aber, dass die ständigen Spikes in der CPU-Nutzung in HTOP komplett weg sind und auch meine IKEA MQTT Lampe mit Display nun flüssig funktioniert. Davor war das furchtbar.. die Zeilen nie synchron, mal gar nicht, mal alles auf einmal... Manchmal haben die schaltbaren Steckdosen einfach nicht reagiert - funktioniert nun prima :-) Vielen Dank an der Stelle auch für die Unterstützung beim einrichten.Klicke auf die Grafik für eine vergrößerte Ansicht

Name: grafik.png
Ansichten: 356
Größe: 132,8 KB
ID: 468529

    Kommentar


    • challo
      challo kommentierte
      Kommentar bearbeiten
      Ich hab auch einfach den loxberry Broker weiter am laufen. Die topics mit vielen Daten bzw. Json laufen über das relay und Dinge mit Transformation oder Umwandlung laufen weiter über loxberry. Funktioniert super bei mir.

    • Acidcliff
      Acidcliff kommentierte
      Kommentar bearbeiten
      Also wenn es nur um die eingebauten Mapper und Transformatoren geht ist es ziemlich überbordend den Loxberry noch laufen zu lassen, oder?
      Da wäre node-red vermutlich die deutlich schlankere/schnellere und durch die Plugins auch erweiterbarere Lösung.

      Ich glaube auch rein architekturell ist es sinnvoll allzuviel "Magie" auf den Transportwegen zu vermeiden

    • challo
      challo kommentierte
      Kommentar bearbeiten
      Hab noch mehr auf dem loxberry laufen. Ansonsten würde ich auch nodered nehmen....
  • <Andreas>
    LoxBus Spammer
    • 07.03.2023
    • 445

    #19
    Hey,

    Das Realy läuft nach wie vor top, ohne einen einzigen ausfall

    Ich wollte fragen ob du es möglich machen könntest MQTT 5 User Properties beim Loxone Ausgang zu übertragen?
    Ich gebe da gern unter anderen die Einheit mit um später mehr Übersicht zu haben

    Danke & Gruß
    Andreas

    Kommentar

  • <Andreas>
    LoxBus Spammer
    • 07.03.2023
    • 445

    #20
    Danke erst einmal für die schnelle Umsetzung wirklich super was du da leistest

    Hab hier aber noch ein kleines Problem, der Container startet in der aktuellen Version nicht mehr Logs bekomme ich auch keine
    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: image.png
Ansichten: 223
Größe: 54,6 KB
ID: 485710

    Ein wenig habe ich schon geforscht, vermutungen angestellt
    rustc_flags=["-C", "target-cpu=x86-64-v3"]
    AVX2 unterstützt meine CPU noch nicht, ich hab gesehen du hast einen fallback eingebaut, evtl. greift der nicht vollständig?

    Kommentar


    • <Andreas>
      <Andreas> kommentierte
      Kommentar bearbeiten
      Bei der neusten Version leider das gleiche Bild, bekomme auch keine weiteren logs

      Kann ich etwas machen um dir weitere Informationen zukommen zu lassen?

    • Acidcliff
      Acidcliff kommentierte
      Kommentar bearbeiten
      Leider kannst du vermutlich gerade nicht mehr tun um Logs zu generieren. Liegt daran, wann genau das XML Modul geladen wird.

      Versuch mal die neuste Version. Am besten direkt gegen den neusten Tag gehen statt auf lastest, damit nicht zufällig was aus dem Cache geholt wird: acidcliff/loxmqttrelay:49709b6aa820868f91cab9c275a917d29165d 73c (Achtung, das Forumsystem fügt hier gerne mal ein Leerzeichen beim Tag hinzu - sollte eigentlich ohne sein)

      Ich hoffe ich hab zumindest das Logging jetzt vorziehen können um mehr zu erfahren (und env variable LOG_LEVEL=DEBUG sollte zumindest für den Test gesetzt sein).

    • <Andreas>
      <Andreas> kommentierte
      Kommentar bearbeiten
      2026-06-06 13:15:38,512 INFO [loxmqttrelay.utils] platform=Linux 4.4.302+ arch=x86_64 (x86=True, avx2=False)

      Also läuft vielen Dank!

      Mein Nas ist mittlerweile in die Jahre gekommen wollte mal Influxdb3 hosten das machte auch schon Probleme, möchte den Neukauf aber noch ein paar Jahre hinauszögern
  • schildkroete
    Extension Master
    • 22.09.2021
    • 103

    #21
    Ich wollte nur kurz ein Danke und Feedback da lassen - bin gestern von Loxberry auf das Relay umgestiegen. War sehr schnell erledigt und tut genau das, was es soll - Top! Danke für die Zeit, die Du da reingesteckt hast.

    Kommentar

    • schildkroete
      Extension Master
      • 22.09.2021
      • 103

      #22
      Eine Frage kam mir gerade: Ich habe ein paar Sonoff-Buttons, die beim Klick ein solches "Event" feuern. Per Zigbee2MQTT landet das dann auf einem Topic.

      Code:
      {
         "action":"double",
         "battery":100,
         "last_seen":"2026-06-26T11:19:01+02:00",
         "linkquality":102,
         "update":{
            "installed_version":8704,
            "latest_release_notes":null,
            "latest_source":null,
            "latest_version":8704,
            "state":"idle"
         },
         "voltage":3000
      }

      Bei dieser Art von "Events" müsste es aber ja so sein, dass die Nachricht beim Lesen verschwindet. Sonst kann ich nicht erkennen, ob der Button "nochmal" gedrückt wurde. Im Loxberry Gateway gabs dafür eine Option (weiß gerade nicht mehr, wie sie hieß).

      Im Moment hab ich das dann als "zigbee2mqtt_device_eg_kueche_button_action" virtueller Texteingang in Loxone drin. Da kommt dann halt "double" an. Aber der Status bleibt dann natürlich bestehen.

      Wie würde man das hier lösen?
      Zuletzt geändert von schildkroete; In den letzten 3 Wochen.

      Kommentar


      • schildkroete
        schildkroete kommentierte
        Kommentar bearbeiten
        Ich hab das jetzt mit einem Script innerhalb von iobroker gelöst, der dann UDP Signale an Loxone schickt.

      • Acidcliff
        Acidcliff kommentierte
        Kommentar bearbeiten
        Stimmt - das Relay macht das nicht, da ich möglichst keine intransparente Logik ins Relay packen wollte/will.

        An deiner Stelle hätte ich das in Loxone selbst abgebildet:

        Virtueller Texteingang erhält Nachricht -> Nachgelagerter Flow danach sendet über virtuellen Ausgang deinen gewünschten Resetwert auf den Topic "zigbee2mqtt_device_eg_kueche_button_action"

        So hättest du keine Abhängigkeit zu einem Drittsystem wie Biobroker

        Wahrscheinlich aber besser (aber ohne es selbst mal probiert zu haben):
        Zigbee2Mqtt hat ein Setting, das vermutlich genau das macht, was du hier zu lösen versuchst. Es heißt "legacy_action_sensor" und ist definiert als: "Home Assistant legacy actions sensor, when enabled a action sensor will be discoverd and an empty `action` will be send after every published action. (Default: false)"

      • schildkroete
        schildkroete kommentierte
        Kommentar bearbeiten
        Danke für den Impuls!

        Das Zigbee2MQTT Feature ist nur global und laut Doku deprecated. "Note that this feature is deprecated and will be removed in the future. It's recommended to use the MQTT device trigger instead."

        Die Loxone Variante kann man natürlich machen, das stimmt schon. Ich habe iobroker eh im Einsatz, insofern ist mir die Abhängigkeit eher egal.
    • Prof.Mobilux
      Supermoderator
      • 25.08.2015
      • 5470

      #23
      Im Loxberry Gateway heißt die Option "Reset After send".
      LoxBerry: https://wiki.loxberry.de/start

      Kommentar

      • schildkroete
        Extension Master
        • 22.09.2021
        • 103

        #24
        Irgendwie habe ich immer nach ein paar Tagen das Problem, dass einzelne Topics/VI nicht mehr übertragen werden, während andere aber einwandfrei funktionieren. Ein Neustart von loxmqttrelay löst das Problem dann erstmal.

        Im Log tauchen die nicht funktionieren Topics gar nicht auf, die fehlen komplett.

        Der einzig auffällige Log-Eintrag ist folgender, der immer mal wieder kommt.

        Code:
        2026-07-02 15:23:16,294 ERROR [loxwebsocket.lox_ws_api] Error using existing token. Error hasing token. Unexpected content in Loxone response.. Trying to acquire new token...
        2026-07-02 15:23:18,067 ERROR [loxwebsocket.lox_ws_api] Connection closed unexpectedly with unknown code: 1000
        2026-07-02 15:23:18,067 INFO [loxwebsocket.lox_ws_api] Reconnect attempt 2 of 0
        2026-07-02 15:23:18,067 INFO [loxwebsocket.lox_ws_api] Waiting for 15 seconds before retrying...
        Kann ich irgendwie mit weiteren Infos helfen, um das Problem zu identifizieren?

        Kommentar


        • Acidcliff
          Acidcliff kommentierte
          Kommentar bearbeiten
          Code 1000 bedeutet normalerweise, dass der Miniserver die Verbindung planmäßig geschlossen hat. Das wäre eigentlich nur der Fall bei einem Restart, Update oder wenn der Heartbeat aus irgendeinem Grund nicht funktioniert und der MS die Verbindung deshalb planmäßig schließt.

          Bin mal gespannt, ob bei dem Lasttest was rauskommt. Klingt nicht nach einer Lastthematik (zumindest was das Relay angeht), weil sowas eher nicht immer die gleichen Topics "fallen" lassen würde. Zudem würde vermutlich eher der MS in die Knie gehen, bevor das Relay zu schwitzen beginnt (famous last words ).

          Denke du solltest mal folgende Sachen prüfen
          - Prüfe, ob die Werte, die du erwartest, wirklich am Relay ankommen (LOG_LEVEL auf DEBUG setzen) -> Falls nicht: Schau an einem MQTT Broker oder einem MQTT Explorer, ob die Werte tatsächlich an deinem Broker ankommen und versendet werden. Falls die dort ankommen/versendet werden können es eigentlich nur noch Verbindungsprobleme vom Relay zum Broker sein (in einem normalen Netzwerk sehr unwahrscheinlich) oder es sind aus irgendwelchen Gründen die falschen subscriptions gesetzt
          - Falls die Werte ankommen, aber nicht weitergeleitet werden müsste es an den Filteroptionen liegen. Neben den offensichtlichen Filter-Holpersteinen könnte es insb. dann unerwartete Verhalten geben, wenn sich die Payload signifikant ändert. Bspw. wenn manchmal ein normaler Wert und manchmal ein JSON Payload gesendet wird und JSON-Expansion aktiviert ist.

        • schildkroete
          schildkroete kommentierte
          Kommentar bearbeiten
          Ich habe tatsächlich zwei Bugs im Lasttest identifizieren können, die im Testszenario zwischen 5 und 17% Nachrichtenverlust erzeugt haben. Den Fix teste ich lokal mal ein zwei Tage, dann schicke ich Dir einen PR.

        • Acidcliff
          Acidcliff kommentierte
          Kommentar bearbeiten
          Hab mir deine Analyse mal angeschaut. Danke, dass du dir da die Mühe gemacht hast.
          30k Nachrichten mit unlimitierter Rate - also auf einen Schlag - über den HTTP-Pfad zu schicken statt über den Websocket-Pfad ist schon sehr abstrakt.

          Der Lasttest zeigt, dass der Burst von 10-20k Nachrichten scheinbar fehlerfrei funktionieren (was imo schon an ein Wunder grenzt ) und die Drops erst ab 30k auftreten. Natürlich kann man das mit Connection Pooling und Retries lösen - das hebt Limit dann von 30k auf irgendeinen anderen Wert - maybe sogar mehrere 100k. Aber es fügt Komplexität (bspw. hab ich bewusst keine Retry-Logik) hinzu, die keinen Payoff hat, weil der MS vermutlich schon die 20k nicht ansatzweise verarbeiten könnte.

          Jetzt wo wir drüber reden ... langfristig würde ich überlegen, ob ich den HTTP-Pfad ganz zugunsten des WebSockets droppe. Eigentlich ist er eher deshalb drin, weil es damit einfacher ist Mocks/Debugging zu betreiben als das ich glauben würde, dass es eine gute Idee wäre, dass jemand das Relay im HTTP Modus betreibt.

          Laut deinen Error-Logs verwendest du bei dir den Websocket-Pfad, oder? Dann dürfte die Anpassung des HTTP-Pfads dein Problem auch nicht beheben.
      • Deepflash
        LoxBus Spammer
        • 08.06.2021
        • 220

        #25
        so aus Neugier: in Loxberry 4.0 wurde das MQTT Gateway überarbeitet. Lohnt sich da noch der Weiterbetrieb des loxmqttrelay, hat das schonmal jemand verglichen?

        Kommentar


        • Acidcliff
          Acidcliff kommentierte
          Kommentar bearbeiten
          Nach meiner Einschätzung hat sich am Entscheidungspunkt zwischen dem Loxberry MQTT Gateway und dem Relay nichts groß geändert:
          - Das MQTT-Gateway hat einen weiterhin einen höheren Funktionsumfang (Deduplikation, Resend, UDP-Send, etc.) und die angenehme Vollintegration in Loxberry
          - Das Relay ist weiterhin was Features angeht puristischer und Performance-orientierter (bspw. setzt das MQTT Gateway weiterhin auf HTTP statt Websocket und auf super-schnelle C/Rust-Routinen) - wobei das neue MQTT Gateway durch den Umstieg auf Python & Concurrency vermutlich CPU-optimierter agieren sollte als früher

          Also weiterhin ist das Relay eher was für Puristen und Performance-Geeks - der Rest der Welt wird weiterhin mit dem LB-MQTT-Gateway bedient, glücklich und zufrieden sein

        • <Andreas>
          <Andreas> kommentierte
          Kommentar bearbeiten
          Für mich ist die MQTT Verfügbarkeit recht wichtig und da ist eine Installation in Docker einfach stabiler und benötigt beinahe keine Wartung, Neuinstallation ist auch mit einen Befehl in weniger als einer Minute erledigt

          Wenn mal wieder ein irgend ein Loxberry Plugin amok läuft und z.B. den Speicher vollmüllt muss man die Ursache erst einmal finden
          Zuletzt geändert von <Andreas>; In den letzten 2 Wochen.
      • Prof.Mobilux
        Supermoderator
        • 25.08.2015
        • 5470

        #26
        Zum Vergleich mit dem LoxBerry Gateway V2: Deepflash:

        Ich denke die Zielgruppe ist eine andere, wie Acidcliff ja schon geschrieben hat. Das LoxBerry Gateway legt Wert auf eine einfache Bedienung und maximale Kompatibilität, das MQTT-Gateway "light" setzt auf eine minimalistische Umsetzung mit maximaler Performance ohne "Overhead".

        Ein paar Kommentare von mir zum Gateway V2:

        "CPU Last vom neuen Gateway ist besser aber immer noch hoch" - keine Ahnung wo <Andreas> diese Aussage aufgeschnappt hat - sie ist falsch. Richtig ist, dass die CPU Last mit parallelen Übertragungen steigt (was logisch ist....), da das Gateway 100% asynchron arbeitet. Ansonsten liegt die CPU Last im minimalen Grundrauschen. Das Gleiche dürfte auch für das MQTT-Gateway "light" gelten.

        Das LoxBerry Gateway V2 ist in Python mit asyncio geschrieben. Alle Aufgaben (wie z. B. JSON expand) laufen in eigenen Threads. Das stellt eine ordentliche Skalierbarkeit sicher, ist aber sicherlich durch Python nicht mit C/Rust vergleichbar.

        Das LoxBerry Gateway V2 arbeitet asynchron und wurde bzgl. Verarbeitungsgeschwindigkeit optimiert - die Übertragung eines Wertes vom Eingang zum Ausgang im Gateway dauert im Schnitt < 5 ms (150 abonnierte Werte, Übertragung HTTP). Die Übertragungsart kann auch auf UDP umgestellt werden, was weiteren Performancegewinn bringen dürfte. Bei < 5 ms habe ich da bei meiner Installation aber keinen Bedarf gesehen, zumal dann der Miniserver durch die notwenbdige Befehlserkennung etwas mehr belastet wird. Wie sich im Vergleich Websocket schlägt weiß ich nicht. Das kann das LoxBerry Gateway in der Tat nicht.

        Das LoxBerry Gateway V2 (wie auch schon das Gateway V1) verzögert die Übertragung von zu vielen parallelen Übertragungen an den Miniserver, da ansonsten der Miniserver überlastet und neu startet. Ob das bei Websocket ein Problem ist weiß ich nicht, bei HTTP und UDP ist es so. Daher halte ich Testszenarien, wo 20.000 Werte parallel an den Miniserver übertragen werden, auch für völlig belanglos.

        Läuft irgendein Dienst (oder Plugin) auf dem LoxBerry amok, zieht das nicht nur das Gateway sondern das gesamte System inklusive Mosquitto mit sich. Das ist systembedingt. Lässt sich aber lösen, wenn man einen dedizierten LoxBerry nur für das Gateway und den Mosquitto laufen lässt (z. B. in einer VM). Docker ist da aber natürlich schlanker.
        Zuletzt geändert von Prof.Mobilux; In den letzten 2 Wochen.
        LoxBerry: https://wiki.loxberry.de/start

        Kommentar


        • schildkroete
          schildkroete kommentierte
          Kommentar bearbeiten
          Da bin ich bei dir 🙃 weißt du wo die Grenze ist, das der MS an Anfragen pro Sekunde verkraftet? Bei mir wird nämlich ca alle 4min die Websocket Verbindung vom MS terminiert und ich frage mich noch ein wenig warum. An zu viel Traffic kann es eigentlich kaum liegen... 🤔

        • Prof.Mobilux
          Prof.Mobilux kommentierte
          Kommentar bearbeiten
          Bei HTTP verzögern wir parallele Requests 10 ms - jeweils nur eine HTTP Verbindung zum MS offen. Das haben wir im Gateway V1 mal ermittelt, ob das eine harte Grenze ist oder für den Miniserver V2 überhaupt noch gilt, weiß ich nicht. Da es aktuell nicht stört, haben wir es so belassen. Für Websocket gilt das aber sicherlich nicht - das ist ja eine komplett unterschiedliche Übertragungsart.

          Bei UDP übertragen wir maximal 220 Werte in einem Rutsch. Ich glaube das war/ist eine Beschränkung in der maximalen Länge der Nachricht. Aber wie gesagt: Die theoretisch 220 übertragenen Werte muss der Miniserver dann per Befehlserkennung wieder auseinander dröseln, was auf dem Miniserver Performance kostet.
          Zuletzt geändert von Prof.Mobilux; In den letzten 2 Wochen.

        • <Andreas>
          <Andreas> kommentierte
          Kommentar bearbeiten
          Bei einen test von mir war die CPU Last schon im zweistelligen Bereich, aber ich muss zugeben das diese Messung in einer VM wohl nicht aussagekräftig oder vergleichbar ist

          hab meinen anderen Post bearbeitet war übertreiben
          Zuletzt geändert von <Andreas>; In den letzten 2 Wochen.
      • Acidcliff
        Dumb Home'r
        • 06.09.2021
        • 21

        #27
        Zitat von Prof.Mobilux
        "CPU Last vom neuen Gateway ist besser aber immer noch hoch" - keine Ahnung wo diese Aussage aufgeschnappt hat - sie ist falsch. Richtig ist, dass die CPU Last mit parallelen Übertragungen steigt (was logisch ist....), da das Gateway 100% asynchron arbeitet. Ansonsten liegt die CPU Last im minimalen Grundrauschen. Das Gleiche dürfte auch für das MQTT-Gateway "light" gelten.

        ...

        Das LoxBerry Gateway V2 arbeitet asynchron und wurde bzgl. Verarbeitungsgeschwindigkeit optimiert - die Übertragung eines Wertes vom Eingang zum Ausgang im Gateway dauert im Schnitt < 5 ms (150 abonnierte Werte, Übertragung HTTP). Die Übertragungsart kann auch auf UDP umgestellt werden, was weiteren Performancegewinn bringen dürfte. Bei < 5 ms habe ich da bei meiner Installation aber keinen Bedarf gesehen, zumal dann der Miniserver durch die notwenbdige Befehlserkennung etwas mehr belastet wird. Wie sich im Vergleich Websocket schlägt weiß ich nicht. Das kann das LoxBerry Gateway in der Tat nicht.
        Die Verbrauche und Verarbeitungsgeschwindigkeit sollten beide (sehr) niedrig sein - das Relay ist aber von der Architektur her so, dass es deutlich geringere CPU Last bei schnellerem Durchsatz haben sollte:
        - Es macht schlichtweg weniger (bspw. kein Dedup)*
        - Aggressiveres Caching
        - Schnellere (dafür zugegebenermaßen tlw. exotische) Algorithmen bspw. für die JSON-Expansion
        - Hotpath maßgeblich in C/Rust
        - Weniger Stellen mit I/O Overhead
        - Tlw. schnellere Bibliotheken auch in Python
        Sollte aber nicht überbewertet werden - wir sprechen hier vll von einer Optimierung von 5 auf 1-2 ms und, dass das Gateway irgendwo bei 1-3% auf einem normalen Rechner und das Relay bei 0,x% liegt.
        Ich hatte das Relay auch dahingehend optimiert, dass es öfter niedrigere C-States freigibt. Das war in der alten Gateway-Version relativ suboptimal und jetzt vll besser.

        *der Subprocess-Transformer Pfad bei den UDP Eingängen dürfte bspw. ziemlich teuer sein so wie er aktuell umgesetzt ist. Wenn Andreas das nutzt und viele ausgehende Nachrichten hat, könnte das eine Erklärung sein.

        Btw. einige der Performancevorteile wären auch im MQTT-Gateway mit wenigen Anpassungen umsetzbar (es sei denn man will RPI<=2 weiterhin unterstützen):
        - uvloop statt der standard-asyncio-Eventloop
        - orjson statt der Standard-json-lib
        - gmqtt statt aiomqtt

        Zitat von Prof.Mobilux
        Das LoxBerry Gateway V2 ist in Python mit asyncio geschrieben. Alle Aufgaben (wie z. B. JSON expand) laufen in eigenen Threads. Das stellt eine ordentliche Skalierbarkeit sicher, ist aber sicherlich durch Python nicht mit C/Rust vergleichbar.
        Asyncio macht die Sache concurrent, aber nicht multithreaded. Das heißt, dass an anderen Tasks gearbeitet wird, wenn ein anderer Task gerade auf I/O-Operationen warten muss (bspw. das Versenden über HTTP). Sowohl das Relay als auch das Gateway sind "nur" concurrent. Das ist auch gut so - Multithreading wäre vom Overhead höher als jeder Nutzen, den man dadurch hätte. Ehrlich gesagt muss man auch sagen, dass die Concurrency in diesem Anwendungsfall wahrscheinlichst mehr Overhead als nutzen bringt, da die interne Arbeitsweise der meisten (Python) MQTT, UDP und Websocket-Clients intern so geartet ist, dass Nachrichten defacto sequentiell kommen und das, was Relay/Gateway machen so trivial/schnell ist, dass eine Parallelisierung nicht wirklich was bringt. Aber ich tue mir auch schwer es im Relay fallen zu lassen.

        Zitat von Prof.Mobilux
        Das LoxBerry Gateway V2 (wie auch schon das Gateway V1) verzögert die Übertragung von zu vielen parallelen Übertragungen an den Miniserver, da ansonsten der Miniserver überlastet und neu startet. Ob das bei Websocket ein Problem ist weiß ich nicht, bei HTTP und UDP ist es so.
        Wäre mal interessant zu testen Per se braucht der Websocketkanal ja keine nachgelagerte Befehlserkennung wie UDP, hat deutlich weniger Overhead als der HTTP Pfad und Belegt nur einen Kanal/Portslot auf dem Miniserver. So weit ich das beurteilen kann Loxone kein Multiplexing, daher kommen alle Nachrichten beim Miniserver auch immer sequenziell an, sodass aufgrund von Parallelität über Websocket eigentlich keine Überlastung da sein sollte. Wenn, dann könnte es sein, dass der MS intern einen Schutz gegen zu viele Befehle je Zeiteinheit hat. Müsste man mal testen - vll jemand der eine stabilere Verbindung hat als Schildkröte

        Nebenbei:
        Zwei Kernunterschied haben wir hier noch nicht angesprochen:
        - Das Relay ist standalone - heißt, wer kein Loxberry benutzt/benutzen will, weil er/sie bspw. keine Plugins braucht, kann das so relativ schlank via Docker machen.
        - Der Miniserver-Sync macht den Konfigurationsaufwand etwas geringer

        Falls ihr irgendwann überlegen solltet Websocket im Loxberry anzubieten - ich hab die Kommunikation mit dem Miniserver als separate Lib ausgelagert. Sollte sich theoretisch gut in das Gateway einfügen: https://github.com/Jakob-Gliwa/loxwebsocket

        Kommentar

        • Prof.Mobilux
          Supermoderator
          • 25.08.2015
          • 5470

          #28
          Zitat von Acidcliff
          Btw. einige der Performancevorteile wären auch im MQTT-Gateway mit wenigen Anpassungen umsetzbar (es sei denn man will RPI<=2 weiterhin unterstützen):
          - uvloop statt der standard-asyncio-Eventloop
          - orjson statt der Standard-json-lib
          - gmqtt statt aiomqtt
          Das schaue ich mir nochmal an - Danke!

          Falls ihr irgendwann überlegen solltet Websocket im Loxberry anzubieten - ich hab die Kommunikation mit dem Miniserver als separate Lib ausgelagert. Sollte sich theoretisch gut in das Gateway einfügen: https://github.com/Jakob-Gliwa/loxwebsocket
          Das wäre tatsächlich interessant, haben wir als Issue schon "jahrelang" offen, uns aber nie daran versucht.
          LoxBerry: https://wiki.loxberry.de/start

          Kommentar

          Lädt...