Modbus Problem ab core_2024.3.1 -> Network Relay ->Timeout value out of range

Mit dem Upgrade auf core_2024.3.1 Generic x86-64 kann ich mein 8-fach Netzwerk Relais, welches über Modbus TCP eingebunden ist, nicht mehr schalten. Ich habe das ganze Netz abgesucht und nur diesen Hinweis gefunden:

Es wird folgende Fehlermeldung generiert:

[139963467207616] Timeout value out of range
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 239, in handle_call_service
    response = await hass.services.async_call(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2319, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2356, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 905, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 975, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/template/switch.py", line 161, in async_turn_on
    await self.async_run_script(self._on_script, context=self._context)
  File "/usr/src/homeassistant/homeassistant/components/template/template_entity.py", line 562, in async_run_script
    await script.async_run(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1600, in async_run
    return await asyncio.shield(run.async_run())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 435, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 487, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 512, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 485, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 723, in _async_call_service_step
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 685, in _async_run_long_action
    return long_task.result()
           ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2319, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2356, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/modbus/modbus.py", line 184, in async_write_register
    await hub.async_pb_call(
  File "/usr/src/homeassistant/homeassistant/components/modbus/modbus.py", line 485, in async_pb_call
    result = await self.hass.async_add_executor_job(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/modbus/modbus.py", line 448, in pb_call
    result: ModbusResponse = entry.func(address, value, **kwargs)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pymodbus/client/mixin.py", line 150, in write_register
    return self.execute(
           ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pymodbus/client/base.py", line 390, in execute
    if not self.connect():
           ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pymodbus/client/tcp.py", line 168, in connect
    self.socket = socket.create_connection(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/socket.py", line 834, in create_connection
    sock.settimeout(timeout)
ValueError: Timeout value out of range

Wenn ich wieder downgrade auf core_2024.3.0 funktioniert alles einwandfrei und es gibt auch keine Timeout-Fehler.

Hat jemand ein ähnliches Problem und kennt einen Lösungsansatz?

Vielen Dank! Mich

Mit der neuen HA Version kam wohl auch eine neue Version vom pyModBus mit. Hatte das gleiche Problem mit der Huawei Solar Integration. Ein Update der Integration 2 Tage später brachte die Lösung.

Das ist eine direkte TCP-Verbindung und läuft nicht über eine Integration. Deshalb wird sich das Problem leider nicht so einfach lösen. Für mich wäre das böse, weil ich entweder das Relais rauswerfen müsste oder aber HA nicht weiter updaten kann.

Ich brauche jemanden unter Euch, der sich mit den Modbus-Protokollen auskennt und mir erklären kann, welche Parameter sich in modbus-py verändert haben, um diesen Timeout-Fehler abfangen zu können.

Ich habe schon mit allen möglichen Paramtern, die in der Anleitung unter Modbus - Home Assistant beschrieben sind, experimentiert.
Keine Chance bisher.

Trotzdem, vielen Dank, dass Du geantwortet hast.

Gruß von Mich

Hallo,

ich hänge mich auch mal hier rein ich habe das selbe Problem. Leider noch keine Lösung gefunden.

lg

Hat wahrscheinlich etwas hiermit zu tun: Issue warning modbus configuration when modbus configuration is empty by janiversen · Pull Request #112618 · home-assistant/core · GitHub

Wie sieht denn deine Modbus-Konfiguration in HA aktuell aus?

richtig, das hatte ich hier überlesen

Problemumgehung

Nach vielen Experimenten und der Codeverfolgung konnte dieses Problem durch das Hinzufügen einer Dummy-Entität umgangen werden.

Dies scheint nicht das gewünschte Ziel zu haben, eine Verbindung herzustellen, da die Dummy-Entität an einer nicht vorhandenen Adresse erstellt werden musste und tatsächlich zu anderen Kommunikationswarnungen führt.

hab bei mir jetzt eine Entität hinzugefügt und es funktioniert

modbus:
  - name: sma_wr
    type: tcp
    host: XXX.XXX.XXX.XXX
    port: 502
    sensors:
      - name: PV_Frequenz
        data_type: int32
        unit_of_measurement: "Hz"
        slave: 3
        address: 30803        
        scale: 0.01
        precision: 2

davor hatte ich nur die Verbindung ohne eines Sensors

Verstanden.

Noch eine Frage dazu: Muss für den Dummy-Sensor eine “echte” Verbindung gewählt werden?

Wenn ich beispielsweise schreibe:

    sensors:
      - name: Dummy
        data_type: int32
        unit_of_measurement: "Hz"
        slave: 500
        address: 900000       
       

Wobei der slave und die Adresse nicht wirklich existieren, würde das funktionieren?Oder muss da eine vorhandene Bank da sein?

Ich könnte das jetzt ausprobieren, aber ich müsste dann updaten und wieder rückwärts, wenn’s nicht funktioniert.
Wie ist Deine Einschätzung?

Vielen Dank für die Antwort!

Gruß von Mich

ich glaube das funktioniert auch ohne das die Adresse wirklich funktioniert, hab mir aber dann einen Modbus Adresse gesucht wo ich auch Werte zurück bekomme.

@Optihome schreibt hier auch das ein sensor eingetragen werden muss

Ich habe es jetzt mal mit einem Dummy probiert, aber das führt schon in der 2024.3.0, wo es bisher kein Problem gab, zu Störungen.

Ich poste mal meine aktuelle modbus-config, die bis 2024.3.0 ohne Probleme funktioniert hat:

modbus:
  - name: relay_hub
    type: tcp
    host: <xxx.xxx.xxx.xxx>
    port: <xxxx>


switch:
  - platform: template
    switches:
      # Relais 01
      # Ladesteckdosen 230V L1 Garagen
      relay_1:
        friendly_name: Switch01
        turn_on:
          - service: modbus.write_register
            data:
              address: 0
              hub: relay_hub
              slave: 1
              value: 256
        turn_off:
          - service: modbus.write_register
            data:
              address: 0
              hub: relay_hub
              slave: 1
              value: 512
        icon_template: mdi:numeric-1-box-outline

Ich habe also keine ausgesprochene Sensor-Definition stehen, aber modbus ist nicht “empty”, weil ja switches definiert sind. Oder verstehe ich das falsch?

Gruß von Mich

müsste der switch part nicht eingerückt auf Höhe von port: stehen?

Das steht so in meiner packages-Datei.

Eintrag in der configuration.yaml:

homeassistant:
  packages: !include_dir_named packages

Vielleicht ist in package-Dateien die Schreibweise anders. Auf jeden Fall funktioniert das mit dieser Schreibweise genau so unter unter 2024.3.0 und ab 2024.3.1 kommt ein Timeout-Fehler. Daran kann es also eher nicht liegen, oder?

Gruß von Mich

nein, da sollte die Schreibweise genauso sein…ich würde es mal eingerückt testen

Wenn ich es einrücke, dann meckert die Konfigurationsüberprüfung.

Meine Schreibweise ist also definitiv richtig.

Trotzdem, danke für den Hinweis. Hätte ja sein können…

Gruß von Mich

wahrscheinlich musst du dann das switch: und - platform: template weglassen.
In der Dokumentation steht es nämlich wie folgt:

# Example yaml: entities grouping
modbus:
  - type: tcp
    host: IP_ADDRESS_1
    port: 2020
    name: "modbus_hub"
    binary_sensors:
      - name: binary_sensor1
        address: 100
    climates:
      - name: "Watlow F4T"
        address: 200
    covers:
      - name: Door1
        address: 300
    fans:
      - name: Fan1
        address: 400
    lights:
      - name: light1
        address: 500
    sensors:
      - name: sensor1
        address: 600
    switches:
      - name: Switch1
        address: 700

Das ist die richtige Spur!

Ich habe mal das neu konfiguriert:

modbus:
  - name: relay_hub
    type: tcp
    host: <xxx.xxx.xxx.xxx>
    port: <xxxx>

    
    binary_sensors:
      - name: switch01_dummy
        address: 0
        slave: 1
        unique_id: my_relay_dummy

switch:
  - platform: template
    switches:
      # Relais 01
      # Ladesteckdosen 230V L1 Garagen
      relay_1:
        friendly_name: Switch01
        turn_on:
          - service: modbus.write_register
            data:
              address: 0
              hub: relay_hub
              slave: 1
              value: 256
        turn_off:
          - service: modbus.write_register
            data:
              address: 0
              hub: relay_hub
              slave: 1
              value: 512
        icon_template: mdi:numeric-1-box-outline

Ich habe jetzt ein Update auf 2024.3.3 gemacht und es kommt kein timeout-error mehr. Das Relay reagiert allerdings jetzt ziemlich träge, aber das müsste ich noch in den Griff bekommen können.
Wahrscheinlich muss ich das einfach auch noch richtig gruppieren und nicht über platform: template ansprechen.

Auf jeden Fall danke ich allen, die mir geantwortet haben.

Gruß von Mich

1 „Gefällt mir“

Um das noch zu vervollständigen:

Mein Problem war, dass tatsächlich keine ENTITÄT für den Modbus definiert war. In den bisherigen Workarounds, die zu dem Problem im Netz zu finden sind, ist immer von nicht definiertem “SENSOR” die Rede.

Es kommt also nicht darauf an, dass ein Sensor definiert sein muss, sondern es muss mindestens eine Entität vom Typ binary_sensors, climates, covers, fans. lights, sensors oder switches sein, damit der Timeout-Error ab 2024.3.1 nicht mehr auftritt.

Ein Template-Sensor, so wie ich den definiert hatte, wird NICHT als diesem Modbus-Hub zugeordnet erkannt und führt deshalb ab 2024.3.1 zu einem Timeout-Fehler, was in den HA-Versionen bisher toleriert wurde.

Die korrekte Syntax muss für mein Beispiel also lauten:

modbus:
  - name: relay_hub
    type: tcp
    host: <xxx.xxx.xxx.xxx>
    port: <xxx>

    switches:
      # Relais 01
      # Ladesteckdosen 230V L1 Garagen
      - name: relay_1
        address: 0
        slave: 1
        command_on: 256
        command_off: 512

Gruß von Mich

2 „Gefällt mir“

Zum Thema Modbus SMA habe ich seit vorhin auch ein Problem: Der Dienst scheint beendet zu sein, wie lässt er sich wieder starten? Vorausgegangen war ein mehrfacher Restart des HA weil das Netz weg war.
Diese Meldung bekomme im im HA Logfile:
2024-07-29 11:30:29.915 WARNING (MainThread) [homeassistant.components.modbus.modbus] modbus sma communication closed

Hast Du für den Host eine feste IP vergeben, oder holt sich der über DHCP von Deinem Router immer wieder eine neue?

Genau das passiert, wenn der Router bei Netzausfall neu bootet.

Was anderes wüsste ich jetzt nicht.

Gruß
Mich

Der Raspi bzw. Host des HA hat ne feste IP per DHCP. Der startete ja auch wieder. Aber ein paar Dienste wollten das nicht gleich mitmachen. Vor allem Sunspec (SMA) und eben der Modbus Client. Am Ende habe ich noch einen 4. Restart gemacht, dann war die Verbindung zum Wechselrichter per Modbus TCP wieder ok.
Fazit: Wenn ein oder zwei Neustarts nichts bringen, probiers ruhig noch öfters!