using asyncio in modbus_tcp#1019
Conversation
|
As discussed, we will stick with pymodbus 3.10. However, if you prefer, I can also update all plugins to 4.x. I have some time over the holidays. |
|
Sadly, I can't test this, but it sounds promising! |
|
Da gäbs jetzt seit 1.11 neue Funktionen für asyncio: https://smarthomeng.github.io/dev_doc/referenz/plugins/asyncio_support.html Und evtl. bietet es sich an, das modbus Plugin noch etwas zu vereinfachen mit den integrierten shng Methoden? |
|
Hhmm das mit dem async io hab ich garnicht gesehen... Eigentlich gehört es hier nicht her. Aber ich sehe in deinem Code ne Menge probleme, fehlende returns fehlende awaits... Z.b. awaits self.inverter_write(register Warum ? Bin gerade nur am Handy daher ist viel schreiben gerade schwer. Schön, dass es für den inverter ne python lib gibt. Ich würde aber sagen es ist einfacher die Modbusregister selber aus dem Datenblatt zu holen und das modbus plugin zu nehmen, statt nen eigenes Plugin dafür zu schreiben .. |
|
Ich denke auch das wir von dem ganzen Modbus Wirrwar eher wegkommen sollten als noch was neues dazuzudichten. |
|
@CaeruleusAqua was meinst du mit fehlenden returns? |
|
async def check_forstop(self): return True oder None.... (weil return für fehlt) Geht sicher auch so, schön ists aber nicht... |
|
Am Ende von jedem def:-Block wird implizit |
|
Schon klar, die Funktion sollte aber False zurückgeben und nicht None. Funktioniert trotzdem aber schön ist es nicht. Aber vielleicht bin auch nicht Pythonic genug ;-) |
|
Wenn der falsche Typ zurückgegeben wird, hast du völlig Recht. So im Detail habe ich nicht in den Code geschaut... |
Worauf beziehst du dich? |
|
Wahrscheinlich darauf, dass ein generelles ModBus-Plugin wartbarer und über die Breite stabiler gehalten werden kann, als gesonderte Plugins für jedes ModBus-angebundene Gerät zu erstellen... |
Offtopic, aber passend zum Thema 'Wirrwarr' : Hendrik (@henfri) hat zu pymodbus kurz vor Weihnachten einen recht interessanten Post geschrieben. Nachdem Jan Iversen seinen entsprechenden PR gemerged hat (siehe Github-Link im Post), ist es jetzt möglich, für jedes Plugin eine eigene pymodbus-Instanz zu verwenden. Somit kann es eine generelle pymodbus-shNG-Version geben, aber Plugins können individuell von dieser abweichen. Das sollte zumindest helfen, den gleichzeitigen Updatezwang aus der Vergangenheit (alle Plugins müssen gleichzeitig hochgezogen werden) zu entschärfen. Instanz der jeweils funktionierenden Version im Plugin 'festtackern' sollte reichen (?ggf alternatives pymodbus als Unterverzeichnis im Plugin mitliefern?). Natürlich hat das noch diverse andere Implikationen (Code-Aktualität, veraltete Bibliotheken, potentielle Inkompatibilitäten zwischen verschiedenen pymodbus- und Python-Versionen); aber zumindest ist es ein denkbarer Ausweg aus dem 'Chaos' und dem Updatezwang - also eine Tür, die vorher noch nicht offen war. /tom |
Ja, das würde ich eh gleich sehen.. ich hätte ja mal visioniert, Modbus ins SDP-Konstrukt zu bringen, aber ich denke, das ist mit asyncio und Co etwas zu kompliziert und wenig zielführend. Frage ist für mich nur.. das Plugin hier ist ja wirklich nur TCP. Was ist mit Modbus_RTU? Ließe sich das integrieren oder ist das eine ganz andere Sache? Das ist nämlich durch das huawei-solar Modul auch abgedeckt. Inwieweit hier noch andere Vorteile existieren, kann ich schwer abschätzen. Wenn "nichts", dann würde ich auch eher sagen, ein Zusammenführen mit Modbus-Plugin(s)? wäre ein guter Ansatz. |
Ich muss dazu sagen, dass das Plugin eigentlich von @CannonRS kommt. Würde aber auch vorschlagen, Infos zum Code am besten in meinem Repo weiterzuführen und uns hier lediglich darüber zu unterhalten, ob eigene Plugins für versch. Modbus-Geräte überhaupt Sinn machen und wenn ja wann. Die eine Zeile mit der IllegalAddress macht schon Sinn. Das Plugin liefert verschiedene Structs, aber je nach eingesetztem Gerät, sind trotzdem nicht alle Register vorhanden. Da kommt dann "Illegal" retour. Und damit das nicht jedes Mal abgefragt wird, kommt das in eine Skip Liste. |
PR Summary
Refactor the
modbus_tcpSmartHomeNG plugin to use the pymodbus Async API (AsyncModbusTcpClient) with a plugin-owned asyncio event loop (separate thread). All Modbus operations (connect/read/write) are now non-blocking.What changed
ModbusTcpClientwithAsyncModbusTcpClientcycle:None/0: no reads, no item updates> 0: buffer latest values, flush to items everycycleseconds (scheduler used only for flushing)< 0: write to items immediately (no buffering)Why this is useful