Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

Neue HA-Integration: Shadow Control

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

    Hi,
    das habe ich eigentlich schon so gemacht. Ich habe SC um 2-3 sec. länger als die KNX (bzw. ETS). Spielt es eine Rolle, wie lange ich diese Zeit in der SC zu KNX überschreite?
    Reagiert SC auf dir Rückmeldung aus der ETS (Aktor) oder aus HA (KNX)?
    Ich schau mir das ganze nochmals genau an.

    Danke

    Kommentar


      Hallo,
      erst einmal danke für das tolle Addon.
      Ich habe damit allerdings folgendes Problem. Wenn ich in meiner configuration.xml die Konfiguration anlege bekomme ich beim Starten von HA folgende Fehlermeldung, wenn die Geräte bisher noch nicht existiert haben:
      Code:
      2026-02-20 14:52:26.027 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Debug log for instance 'Wohnzimmer Fenster' disabled.
      2026-02-20 14:52:26.028 INFO (MainThread) [shadow_control.wohnzimmer_fenster] === Starting manager lifecycle ===
      2026-02-20 14:52:26.029 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Adaptive brightness calculator initialized: latitude=47.7844669 (hemisphere: Northern)
      2026-02-20 14:52:26.030 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Starting timer for 15s, next modification scheduled for: 2026-02-20 14:52:41.030220+01:00
      2026-02-20 14:52:26.030 INFO (MainThread) [shadow_control.wohnzimmer_fenster] State change from NEUTRAL to DAWN_FULL_CLOSE_TIMER_RUNNING
      2026-02-20 14:52:26.030 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Initial calculation completed, switching to normal operation mode
      2026-02-20 14:52:26.942 WARNING (MainThread) [shadow_control.wohnzimmer_fenster] Manual movement detected on cover 'cover.fenster'! Old: 0.0% / 0.0°, New: 0.0% / 100.0°, Expected: 0.0% / 0.0° -> Activating auto-lock
      2026-02-20 14:52:26.943 WARNING (MainThread) [shadow_control.wohnzimmer_fenster] Activating auto-lock due to manual movement. Current position will be preserved: 0.0% height / 100.0° angle
      2026-02-20 14:52:26.943 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Auto-lock activated (state: LOCKED_BY_EXTERNAL_MODIFICATION)
      2026-02-20 14:52:28.973 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Successfully added 13 Shadow Control sensor entities for 'Wohnzimmer Fenster'.
      2026-02-20 14:52:39.778 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Canceling timer
      2026-02-20 14:52:39.778 INFO (MainThread) [shadow_control.wohnzimmer_fenster] State change from DAWN_FULL_CLOSE_TIMER_RUNNING to DAWN_NEUTRAL
      2026-02-20 14:52:41.468 INFO (MainThread) [shadow_control.wohnzimmer_fenster] Home Assistant started. Grace period of 30s active to prevent shutter movement during state restore.
      2026-02-20 14:52:41.483 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved (task: None)
      Traceback (most recent call last):
        File "/config/custom_components/shadow_control/__init__.py", line 261, in set_internal_entities_when_ready
          await hass.services.async_call(
          ...<4 lines>...
          )
        File "/usr/src/homeassistant/homeassistant/core.py", line 2817, in async_call
          response_data = await coro
                          ^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/core.py", line 2860, in _execute_service
          return await target(service_call)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 832, in entity_service_call
          single_response = await _handle_entity_call(
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
              hass, entity, func, data, call.context
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 904, in _handle_entity_call
          result = await task
                   ^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/components/number/__init__.py", line 106, in async_set_value
          raise ServiceValidationError(
          ...<8 lines>...
          )​
      homeassistant.exceptions.ServiceValidationError: out_of_range
      Wenn die Geräte bereits existieren, dann kommt der Fehler nicht.
      Man kann dann auch erkennen, dass die Konfiguration des Gerätes nicht vollständig übernommen wurde. Meisten werden alle BXX-Werte korrekt übernommen, allerdings nicht die DXX-Werte.

      Meine Konfiguration in der configuration.yaml sieht wie folgt aus:
      Code:
      shadow_control:
        - name: "Wohnzimmer Fenster"
          #
          # Configure shutter mode by entering 'mode1', 'mode2' or 'mode3'
          # All *_angle_* settings will be ignored on mode3
          facade_shutter_type_static: mode1
          #
          # List of cover entities to handle by this Shadow Control instance
          target_cover_entity:
            - cover.fenster
          #
          # Enable debug mode for way more log output
          debug_enabled: false
          #
          # =======================================================================
          # Dynamic configuration inputs
          #
          # Entity which holds the current brightness
          brightness_entity: sensor.hmip_slo_000d5f29add30d_beleuchtungsstarke
          # Entity which holds the current dawn brightness. See the description above.
          brightness_dawn_entity: sensor.dammerungswert_durchschnitt
          #
          # Entities holding the current sun position
          sun_elevation_entity: sun.sun
          sun_azimuth_entity: sun.sun
          #
          # Entities with next sunrise/sunset for adaptive brightness calculation
          sunrise_entity: sensor.sun_next_rising
          sunset_entity: sensor.sun_next_setting
          #
          # Entities to lock the integration
          lock_integration_manual: false
          lock_integration_with_position_manual: false
          #lock_integration_entity: input_boolean.d07_lock_integration
          #lock_integration_with_position_entity: input_boolean.d08_lock_integration_with_position
          #
          # Lock with position height and angle values if lock_integration_with_position is used
          # Range from 0-100 as percent values
          lock_height_manual: 0
          lock_angle_manual: 0
          #
          # Lock with position height and angle entities if lock_integration_with_position is used
          #lock_height_entity: input_number.lock_height_entity
          #lock_angle_entity: input_number.lock_angle_entity
          #
          # One of 'no_restriction', 'only_open' or 'only_close' must be given, if this option is used.
          # But in fact it makes no sense to configure something here as the shutter will not be moved
          # anymore as soon as the final position is reached. This option is mainly used at the
          # maintenance page of a configured instance, to temporarily restrict the movement manually.
          movement_restriction_height_manual: no_restriction
          movement_restriction_angle_manual: no_restriction
          #
          # Entities to restrict the movement direction
          #movement_restriction_height_entity:
          #movement_restriction_angle_entity:
          #
          # Entity to enforce the shutter positioning
          #enforce_positioning_entity: input_button.d13_enforce_positioning
          #
          # =======================================================================
          # General facade configuration
          facade_azimuth_static: 130
          facade_offset_sun_in_static: -50
          facade_offset_sun_out_static: 90
          facade_elevation_sun_min_static: 0
          facade_elevation_sun_max_static: 90
          facade_slat_width_static: 85
          facade_slat_distance_static: 70
          facade_slat_angle_offset_static: 0
          facade_slat_min_angle_static: 0
          facade_shutter_stepping_height_static: 5
          facade_shutter_stepping_angle_static: 5
          facade_light_strip_width_static: 0
          facade_shutter_height_static: 1280
          facade_neutral_pos_height_manual: 0
          facade_neutral_pos_angle_manual: 0
          #facade_neutral_pos_height_entity: input_number.facade_neutral_pos_height_entity
          #facade_neutral_pos_angle_entity: input_number.facade_neutral_pos_angle_entity
          facade_max_movement_duration_static: 43
          facade_modification_tolerance_height_static: 8
          facade_modification_tolerance_angle_static: 5
          #
          # =======================================================================
          # Shadow configuration
          #shadow_control_enabled_entity:
          shadow_control_enabled_manual: true
          #shadow_brightness_threshold_winter_entity:
          shadow_brightness_threshold_winter_manual: 70000
          #shadow_brightness_threshold_summer_entity:
          shadow_brightness_threshold_summer_manual: 50000
          #shadow_brightness_threshold_minimal_entity:
          shadow_brightness_threshold_minimal_manual: 20000
          #shadow_after_seconds_entity:
          shadow_after_seconds_manual: 15
          #shadow_shutter_max_height_entity:
          shadow_shutter_max_height_manual: 100
          #shadow_shutter_max_angle_entity:
          shadow_shutter_max_angle_manual: 80
          #shadow_shutter_look_through_seconds_entity:
          shadow_shutter_look_through_seconds_manual: 15
          #shadow_shutter_open_seconds_entity:
          shadow_shutter_open_seconds_manual: 15
          #shadow_shutter_look_through_angle_entity:
          shadow_shutter_look_through_angle_manual: 0
          #shadow_height_after_sun_entity:
          shadow_height_after_sun_manual: 0
          #shadow_angle_after_sun_entity:
          shadow_angle_after_sun_manual: 0
          #
          # =======================================================================
          # Dawn configuration
          #dawn_control_enabled_entity:
          dawn_control_enabled_manual: true
          #dawn_brightness_threshold_entity:
          dawn_brightness_threshold_manual: 180
          #dawn_after_seconds_entity:
          dawn_after_seconds_manual: 120
          #dawn_shutter_max_height_entity:
          dawn_shutter_max_height_manual: 100
          #dawn_shutter_max_angle_entity:
          dawn_shutter_max_angle_manual: 100
          #dawn_shutter_look_through_seconds_entity:
          dawn_shutter_look_through_seconds_manual: 120
          #dawn_shutter_open_seconds_entity:
          dawn_shutter_open_seconds_manual: 360
          #dawn_shutter_look_through_angle_entity:
          dawn_shutter_look_through_angle_manual: 50
          #dawn_height_after_dawn_entity:
          dawn_height_after_dawn_manual: 0
          #dawn_angle_after_dawn_entity:
          dawn_angle_after_dawn_manual: 0​
      Was mache ich falsch?
      Vielen Dank für euren Support!

      Ergänzung:
      Auch nach ein paar Stunden Laufzeit bekomme ich folgenden Fehler im Log:
      Code:
      2026-02-20 21:23:37.365 ERROR (SyncWorker_0) [homeassistant] Error doing job: Task exception was never retrieved (task: None)
      Traceback (most recent call last):
        File "/config/custom_components/shadow_control/__init__.py", line 261, in set_internal_entities_when_ready
          await hass.services.async_call(
          ...<4 lines>...
          )
        File "/usr/src/homeassistant/homeassistant/core.py", line 2817, in async_call
          response_data = await coro
                          ^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/core.py", line 2860, in _execute_service
          return await target(service_call)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 832, in entity_service_call
          single_response = await _handle_entity_call(
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
              hass, entity, func, data, call.context
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 904, in _handle_entity_call
          result = await task
                   ^^^^^^^^^^
        File "/usr/src/homeassistant/homeassistant/components/number/__init__.py", line 106, in async_set_value
          raise ServiceValidationError(
          ...<8 lines>...
          )
      homeassistant.exceptions.ServiceValidationError: <exception str() failed>​
      Zuletzt geändert von tobiby; Heute, 21:50.

      Kommentar


        Hallo Alex

        Zitat von Triaalex Beitrag anzeigen
        Ich habe SC um 2-3 sec. länger als die KNX (bzw. ETS).
        Was genau heisst "als die KNX"?


        Zitat von Triaalex Beitrag anzeigen
        ​Spielt es eine Rolle, wie lange ich diese Zeit in der SC zu KNX überschreite?
        Nein

        Zitat von Triaalex Beitrag anzeigen

        Reagiert SC auf dir Rückmeldung aus der ETS (Aktor) oder aus HA (KNX)?
        Aus SC-Sicht ist das ein Cover, da lässt sich nicht unterscheiden, woher welche Info kommt.

        Um nochmals etwas weiter auszuholen:

        Solange sich ein Cover bewegt, aktualisiert HA die Cover-Instanz mit pseudo-aktuellen Werten, um das Cover auf dem UI zu animieren. Bei KNX-Covers gibt es die Travelling-Time-Settings, mit denen sich konfigurieren lässt, wie lange eine Komplettfahrt dauert. Über diese Zeit hinweg bewegt sich der Slider somit auf dem UI. Auf KNX-Seite gibt es nun Aktoren, welche schon während der Fahrt Statusmeldungen zur Position schicken oder welche erst nach Abschluss der Fahrt die finale Position melden. Um das nun alles unter einen Hut zu bringen, muss in SC die Max movement duration konfiguriert werden, um all die Positionsmeldungen zu ignorieren, welche während der Bewegung des Covers eingehen. Wenn also das Cover von SC bewegt wird, wird der Max movement duration Timer gestartet und die Instanz "merkt" sich jeweils die letzte eingehende Positionsmeldung. Wenn der Timer abgelaufen ist, wird diese letzte Position mit der berechneten Position verglichen. Das gibt nun zwei Möglichkeiten. Gemeldete Cover-Position ist (unter Berücksichtigung der konfigurierbaren Toleranz natürlich)
        • gleich der berechneten Position: Alles gut, kein Auto-Lock
        • ungleich der berechneten Position: Während der Behang bewegt wurde, hat jemand eingegriffen und bspw. die Bewegung gestoppt -> Instanz geht in Auto-Lock
        Kommt eine Positionsaktualisierung bei der SC-Instanz an und es läuft kein Timer, dann erfolgt die Prüfung sofort und die Instanz geht ggf. sofort in den Auto-Lock.
        Kind regards,
        Yves

        Kommentar

        Lädt...
        X