Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Morg
    antwortet
    suspend wird in der bisherigen Art nicht implementiert bleiben. Da Plugins sowieso idealerweise neustartbar sind, nutzen wir stattdessen stop() und run().

    Dass das Plugin bei aktivem Item nicht startet, ist derzeit nicht implementiert; das ließe sich bei entsprechendem Bedarf aber ohne großen Aufwand nachrüsten.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Suspend ist neu und ich kenne die gensue Funktion nicht.
    run() und stop() tun seit Anbeginn von smarthome.py genau das, was Du beschrieben hast. Diverse Plugins haben das aber nicht sauber implementiert. Bei denen ist ein Teil des Codes, der in run() gehört in der init Routine. Diese lassen sich ohne neustart von SmartHomeNG nicht neu starten.

    Einen Kommentar schreiben:


  • ivande
    antwortet
    mit suspend() kann ich das Plugin anhalten und es bleibt während der Laufzeit von SH und bei einem Neustart von SH suspendet.

    Mi stop() kann ich das plugin anhalten und es startet bei Neustart von SH (oder mit run()) wieder?


    oder sollte stop() und suspend() das selbe bewirken - Plugin wird angehalten - und wenn ein suspend_item definiert ist bleibt das plugin auch nach dem SH-Neustart suspendet?
    Zuletzt geändert von ivande; 26.06.2024, 21:16.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Nein, wenn Du ein Plugin nach dem Neustart nicht starten möchtest, musst Du es in der etc/plugin.yaml disablen.

    stop() und run() wirken bewusst nur auf aktuell geladene Plugins.

    Einen Kommentar schreiben:


  • ivande
    antwortet
    developer_mode​:

    wenn das plugin gestopt wird und daraufhin sh neu gestartet wird, wird die run-Funktion beim Start wieder ausgeführt. Sollte ein gestopptes Plugin nicht auch nach dem Neustart von SH gestoppt bleiben?

    SH hab ich als master laufen,...
    Zuletzt geändert von ivande; 26.06.2024, 19:13.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Wenn Du für das Admin Modul den developer_mode auf True konfigurierst, hast Du in der Plugin Liste zu jedem Plugin zusätzliche Buttons, mit denen Du das Plugin stoppen und starten kannst.

    developer_mode kannst Du entweder in der GUI (System/System Konfiguration) oder in der Datei etc/module.yaml konfigurieren. Anschließend neu starten.
    Zuletzt geändert von Msinn; 25.06.2024, 20:02.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Gut, danke!

    Ähm... mit <plugin>.stop() bzw. <plugin>.start()? ;-)

    Entweder aus einer Logik oder von der Konsole aus. In der UI ist das meines Wissens noch nicht implementiert...

    Einen Kommentar schreiben:


  • ivande
    antwortet
    guten morgen,

    mir fällt jetzt nichts ein, was gegen stop und run spricht.
    Gibt es jetzt schon eine Möglichkeit das Plugin zu stoppen und su starten? evtl. in der SH-debug-Version?

    Gruß Ivan

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Moin,

    aufgrund von geplanten Änderungen am SmartPlugin überlegen wir, die suspend-Funktionalität anzupassen. Die Änderungen würden sich insoweit auswirken, dass das Plugin nicht "stummgeschaltet" wird (wie jetzt in suspend), sondern angehalten (über stop()) und entweder von Hand oder per Item mit run() wieder gestartet wird.

    Das setzt voraus, dass das Plugin "restartable" ist, also bei stop() alles Notwendige aufräumt und bei run() alles Notwendige wieder startet, ohne dass init(), parse_item() o.ä. notwendig wäre.
    Das heißt insbesondere, dass bei zusätzlichen Threads diese in run() neu erstellt werden müssen (und nicht gestartet), da Threads aufgrund eines Fehlers (?) in Python nicht neugestartet werden können.

    Dazu wäre die Frage: gibt es Funktionen, die das Plugin bei suspend() ausführen (können) soll? Oder würde stop/run für euch den gleichen Zweck erfüllen?

    Wenn wir das umsetzen, kann ich bei den ggf. notwendigen Änderungen gern unterstützen.

    Gruß
    Sebastian

    Einen Kommentar schreiben:


  • whe
    antwortet
    habs gerade getestet: enforce_update reicht.
    Code:
    2024-06-03  22:54:27 DEBUG    plugins.modbus_tcp_dev powerjames@: update_item:Charge-Target-State value:0 regToWrite: HoldingRegister.112.1
    2024-06-03  22:54:27 INFO     plugins.modbus_tcp_dev powerjames@: connected to ModbusTcpClient 192.168.178.72:502
    2024-06-03  22:54:27 DEBUG    plugins.modbus_tcp_dev powerjames@: write 0 to HoldingRegister.112.112 (address.slaveUnit) dataType:uint16
    2024-06-03  22:54:55 DEBUG    plugins.modbus_tcp_dev powerjames@: update_item:Charge-Target-State value:0 regToWrite: HoldingRegister.112.1
    2024-06-03  22:54:55 INFO     plugins.modbus_tcp_dev powerjames@: connected to ModbusTcpClient 192.168.178.72:502
    2024-06-03  22:54:55 DEBUG    plugins.modbus_tcp_dev powerjames@: write 0 to HoldingRegister.112.112 (address.slaveUnit) dataType:uint16​

    Einen Kommentar schreiben:


  • ivande
    antwortet
    Zitat von whe Beitrag anzeigen
    wie kann ich denn am einfachsten feststellen, ob Register in die Wallbox geschrieben werden.
    wenn modbus_tcp im DEBUG, dann siehst du im log diese drei Einträge, wenn das Register geschrieben wird:

    Code:
    2024-06-03 21:58:45 CEST DEBUG    __init__          CP Server Thread-18 logomb@: update_item:VM0 value:20 regToWrite: HoldingRegister.0.1  --  (__init__.py:update_item:405)
    2024-06-03 21:58:45 CEST DEBUG    __init__          CP Server Thread-18 logomb@: connected to ModbusTcpClient 192.168.0.80:502  --  (__init__.py:update_item:408)
    2024-06-03 21:58:45 CEST DEBUG    __init__          CP Server Thread-18 logomb@: write 2000.0 to HoldingRegister.0.0 (address.slaveUnit) dataType:uint16  --  (__init__.py:__write_Registers:456)​
    oder im admin-interface unter "registers to write" steht bei last_write die Uhrzeit wann das letze mal gesendet

    Einen Kommentar schreiben:


  • whe
    antwortet
    Zitat von ivande Beitrag anzeigen
    reicht enforce_update nicht aus dass SH auch ein nicht verändertes Item Triggert und das Register dann gesendet wird?
    Danke, das hatte ich gerade auch überlegt.
    in meinem log ist ja nur ein item-trigger, der beim zyklischen lesen wohl das item überschreibt.
    ich versuche es morgen noch mal mit "enforce_update".
    wie kann ich denn am einfachsten feststellen, ob Register in die Wallbox geschrieben werden.
    Zitat von ivande Beitrag anzeigen
    Hast du einen log vom zyklischen Senden - dieser log stamm doch nur vom zyklischen Lesen?
    ja, da stehen aber nicht die Werte drin, die gelesen werden.
    vielleicht kann ich es auch im Webif über den Zeitstempel erkennen.

    Einen Kommentar schreiben:


  • ivande
    antwortet
    enforce_update reicht auch, dass SH auch ein nicht verändertes Item sendet.

    hab enforce_change bei mir getestet:
    das Item wird zyklisch mit dem gleichen Wert geschrieben (vom cyklischen-modbus-lesen) aber es wird dabei nicht erneut der selbe wert über den modbus gesendet, wenn das Item-Update vom pugin selber kommt.



    Hast du einen log vom zyklischen Senden - dieser log stamm doch nur vom zyklischen Lesen?
    Zitat von whe Beitrag anzeigen
    Code:
    items.carstate Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0 - caller: modbus_tcp_dev_powerjames
    Zuletzt geändert von ivande; 03.06.2024, 21:06.

    Einen Kommentar schreiben:


  • whe
    antwortet
    Jetzt habe ich doch noch ein Problem mit den Updates.
    meine Wallbox hat ein Register "Charge-Target-State" mit dem ich Änderungen durchführen muss, je nach Inhalt ändert die Wallbox Werte, die ich über andere Register (vorher) übertrage. Wenn ich jetzt mehrfach den gleichen Wert ändern muss, enthält dieses Register mehrfach hintereinander den gleichen Wert.
    Das scheint SHNG aber nur zu schreiben, wenn ich im item "enforce_change" angebe.
    wenn ich das mache, schreibt das Plagin aber auch cyclisch dieses Register und nicht nur wenn ich das item ändere.
    Code:
    2024-06-03  19:39:16 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    2024-06-03  19:40:16 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    2024-06-03  19:41:17 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    2024-06-03  19:42:17 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    2024-06-03  19:43:17 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    2024-06-03  19:44:18 INFO     items.carstate      Item Change: Aussen.Garage.PowerJames.chargetargetstate = 0  -  caller: modbus_tcp_dev_powerjames
    Zuletzt geändert von whe; 03.06.2024, 19:25.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    Zitat von whe Beitrag anzeigen
    Mir ist beim debuggen noch aufgefallen, dass bei jedem cycle ein connect gemacht wird.
    Ich hatte damals im Trovis-Plugin das Connect anfangs auch nur beim Start - war unpraktisch.
    Wann auch immer eines der beteiligten Geräte (Endgerät, Adapter, Router/DNS Server, Netzwerkschnittstelle) neu gestartet wurde, musste man einen connect() initiieren.
    Die dazu notwendigen Routinen zur Prüfung waren mehr Aufwand, als ein regelmäßiges connect/disconnect.
    Hab das dann entsprechend auch auf jeden Poll umgestellt - ist transparenter, kostet nicht wirklich Last, und ist ohne Neustart stabil, sobald alle Geräte wieder da sind ...

    /tom

    Einen Kommentar schreiben:

Lädt...
X