TVheadend Aufnehme Sensor

Hallo Leute,

Ich benutze seit längerem diesen Sensor um in Home Assistant die geplanten aufnahmen zu zeigen und die tv Steckdose zu schalten.
Seit einer weile funktioniert der Sensor leider nicht mehr. Kann mir jemand sagen was da faul ist?

Moin,

wirlich, wenn ich in der Werkstatt anrufe und sage, In meinem Auto, funktioniert etwas nicht, könntest Du damit etwas anfangen?

Was funktioniert nicht und welche Meldungen kommen, wie ist das ganze eingerichtet, was bedeutet eine Weile?
Was hast Du vor dem, funktioniert der Sensor nicht, gemacht, Updates?
Ist ein Backup vorhanden und beim Zurückspielen geht es wieder?

Dieser HACS ist seit drei Jahren nicht mehr angefasst worden, kann also gut sein, dass das Ding nicht mehr mit dem aktuellen Home Assistant

  • Core 2024.9.3
  • Supervisor 2024.09.1
  • Operating System 13.1
  • Frontend 20240909.1
    Spielen möchte, aber ohne, dass Du uns mehr Informationen schenkst, kann man nicht helfen

VG
Bernd

P.S.: lesenswert, da haben sich die Macher/Betreiber des Forums mühe gegeben

Sorry das sollte schon vorhin hochgeladen werden.

Und ja ich hab immer alle Updates gemacht. Leider weis ich nicht mehr nach welchem es nicht mehr funktioniert hat.

Im Dashboard zeigt es an das die Entität nicht mehr verfügbar ist.

Moin,

das kann ja mehrere Ursachen haben, findest Du etwas in den Logs (Protokollen), was auf eine mögliche Ursache schließen läst?


Hat sich vielleicht die IP geändert vom tvheadend?

VG
Bernd

Ja da steht das.

logger:%20homeassistant.components.sensor%0AQuelle%3A%20helpers/entity_platform.py:361%0AIntegration:%20Sensor%20(Dokumentation,%20Probleme)%0AErstmals%20aufgetreten:%2007:25:10%20(1%20Vorkommnisse)%0AZuletzt%20protokolliert:%2007:25:10%0A%0AError%20while%20setting%20up%20tvh_rec%20platform%20for%20sensor%0ATraceback%20(most%20recent%20call%20last):%0A%20%20File%20%22/usr/src/homeassistant/homeassistant/helpers/entity_platform.py%22,%20line%20361,%20in%20_async_setup_platform%0A%20%20%20%20await%20asyncio.shield(awaitable)%0A%20%20File%20%22/usr/local/lib/python3.12/concurrent/futures/thread.py%22,%20line%2058,%20in%20run%0A%20%20%20%20result%20=%20self.fn(*self.args,%20**self.kwargs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/config/custom_components/tvh_rec/sensor.py%22,%20line%2087,%20in%20setup_platform%0A%20%20%20%20HtsSensor(%0A%20%20File%20%22/config/custom_components/tvh_rec/sensor.py%22,%20line%20106,%20in%20__init__%0A%20%20%20%20self._data%20=%20self._fetch(self._auth,%20self._url,%20self._cnt)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/config/custom_components/tvh_rec/sensor.py%22,%20line%2019,%20in%20fetch_data%0A%20%20%20%20r%20=%20requests.post('%25s/api/dvr/entry/grid_upcoming'%20%25%20url,%20data=d,%20auth=a)%0A%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/api.py%22,%20line%20115,%20in%20post%0A%20%20%20%20return%20request(%22post%22,%20url,%20data=data,%20json=json,%20**kwargs)%0A%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/api.py%22,%20line%2059,%20in%20request%0A%20%20%20%20return%20session.request(method=method,%20url=url,%20**kwargs)%0A%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/sessions.py%22,%20line%20589,%20in%20request%0A%20%20%20%20resp%20=%20self.send(prep,%20**send_kwargs)%0A%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/sessions.py%22,%20line%20710,%20in%20send%0A%20%20%20%20r%20=%20dispatch_hook(%22response%22,%20hooks,%20r,%20**kwargs)%0A%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/hooks.py%22,%20line%2030,%20in%20dispatch_hook%0A%20%20%20%20_hook_data%20=%20hook(hook_data,%20**kwargs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/auth.py%22,%20line%20276,%20in%20handle_401%0A%20%20%20%20_r%20=%20r.connection.send(prep,%20**kwargs)%0A%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/requests/adapters.py%22,%20line%20667,%20in%20send%0A%20%20%20%20resp%20=%20conn.urlopen(%0A%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py%22,%20line%20716,%20in%20urlopen%0A%20%20%20%20httplib_response%20=%20self._make_request(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py%22,%20line%20416,%20in%20_make_request%0A%20%20%20%20conn.request(method,%20url,%20**httplib_request_kw)%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/urllib3/connection.py%22,%20line%20244,%20in%20request%0A%20%20%20%20super(HTTPConnection,%20self).request(method,%20url,%20body=body,%20headers=headers)%0A%20%20File%20%22/usr/local/lib/python3.12/http/client.py%22,%20line%201336,%20in%20request%0A%20%20%20%20self._send_request(method,%20url,%20body,%20headers,%20encode_chunked)%0A%20%20File%20%22/usr/local/lib/python3.12/http/client.py%22,%20line%201377,%20in%20_send_request%0A%20%20%20%20self.putheader(hdr,%20value)%0A%20%20File%20%22/usr/local/lib/python3.12/site-packages/urllib3/connection.py%22,%20line%20224,%20in%20putheader%0A%20%20%20%20_HTTPConnection.putheader(self,%20header,%20*values)%0A%20%20File%20%22/usr/local/lib/python3.12/http/client.py%22,%20line%201313,%20in%20putheader%0A%20%20%20%20if%20_is_illegal_header_value(values%5Bi%5D):%0A%20%20%20%20%20%20%20%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%5E%0ATypeError:%20expected%20string%20or%20bytes-like%20object,%20got%20'NoneType'%0A

Die ip hat sich nicht geändert die ist fest vergeben. Und tv schauen über die tvheaden App oder Plex funktioniert einwandfrei.

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Moin,

erst einmal Danke für den Teil aus dem Log, jetzt aber zum großen Aber, womit hast Du das denn ausgeschnitten, das ist ja voll von irgendwelchen html gedönse.
Das muss ich mir jetzt erst einmal in ein vernünftiges Format bringen, damit man da was lesen kann :wink:
Kann etwas dauern.

VG
Bernd

Das hab ich einfach in der App auf den kopieren Button gedrückt. Kann dir das auch noch mal versuchen anders zu kopieren.

Logger: homeassistant.components.sensor
Quelle: helpers/entity_platform.py:361
Integration: Sensor (Dokumentation, Probleme)
Erstmals aufgetreten: 07:25:10 (1 Vorkommnisse)
Zuletzt protokolliert: 07:25:10

Error while setting up tvh_rec platform for sensor
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 361, in _async_setup_platform
    await asyncio.shield(awaitable)
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tvh_rec/sensor.py", line 87, in setup_platform
    HtsSensor(
  File "/config/custom_components/tvh_rec/sensor.py", line 106, in __init__
    self._data = self._fetch(self._auth, self._url, self._cnt)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tvh_rec/sensor.py", line 19, in fetch_data
    r = requests.post('%s/api/dvr/entry/grid_upcoming' % url, data=d, auth=a)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/api.py", line 115, in post
    return request("post", url, data=data, json=json, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/sessions.py", line 710, in send
    r = dispatch_hook("response", hooks, r, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/hooks.py", line 30, in dispatch_hook
    _hook_data = hook(hook_data, **kwargs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/auth.py", line 276, in handle_401
    _r = r.connection.send(prep, **kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/requests/adapters.py", line 667, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 716, in urlopen
    httplib_response = self._make_request(
                       ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/urllib3/connectionpool.py", line 416, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 244, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.12/http/client.py", line 1336, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.12/http/client.py", line 1377, in _send_request
    self.putheader(hdr, value)
  File "/usr/local/lib/python3.12/site-packages/urllib3/connection.py", line 224, in putheader
    _HTTPConnection.putheader(self, header, *values)
  File "/usr/local/lib/python3.12/http/client.py", line 1313, in putheader
    if _is_illegal_header_value(values[i]):

:crayon:by HarryP:
. Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)
. Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Moin,

also genau mit dem von Dir erstellten sensor ist etwas nicht ok.
Das wurde auch vor zwei Wochen, schon auf Github per Issue gemeldet, ich denke, das warst Du :wink:

Dann gehe ich davon aus, dass es hier eine Inkompatibilität zum aktuellen HA gibt, das der Entwickler, oder ein anderer im Sourcecode fixen muss

Ich bin in den Dingen noch nicht so gut, aber soweit ich das berschaue, nutzt Du auch noch die alte Form
grafik
Das sollte nach neustem Standard aber so aussehen

template:
  - sensor:
      - name: "Temperature"
        unit_of_measurement: "°C"
       ..

Das kann man heute auch gut mittel UI in HA machen

Ob das jetzt alles zusammenhängt, kann ich nicht beurteilen, da müsstest Du einen Versuch starten.

VG
Bernd

Morgen Bernd,

Erst mal danke für deine Hilfe.

Aber ich denke erst muss mal dieser Sensor funktionieren.

sensor:
   - platform: tvh_rec    
     name: rec    
     username:     
     password:    
     url: http://10.100.1.3:9981   
     scan_interval: 120    
     count: 3    

Der ander übernimmt ja dann nur die Daten von dem.
Ich denke mal hier haut irgendwas mit der Sensor.py nicht mehr hin. Nur leider hab ich davon absolut keine Ahnung :frowning:

Moin,

ja, das habe ich auch geschrieben :slight_smile:
Dass da der Entwickler etwas machen muss, nur scheint das Repository seit 2 - 3 Jahre verweist zu sein.
In die sensor.py habe ich schon hineingeschaut, aber dazu muss ich auch noch viel lernen, und ganz ohne Kommentare im Code ist halt alles nicht so einfach.

Tut mir leid, dass ich nicht weiter helfen konnte.

VG
Bernd

P.S.: Das sind ja die Zeilen, in der sensor.py` die angemeckert werden

  File "/config/custom_components/tvh_rec/sensor.py", line 87, in setup_platform
    HtsSensor(
  File "/config/custom_components/tvh_rec/sensor.py", line 106, in __init__
    self._data = self._fetch(self._auth, self._url, self._cnt)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tvh_rec/sensor.py", line 19, in fetch_data
    r = requests.post('%s/api/dvr/entry/grid_upcoming' % url, data=d, auth=a)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Ich hab mal bissel rum probiert und ich denke es liegt daran das der sensor nicht die daten aus Homeassistant abgreifen kann.

Error while setting up tvh_rec platform for sensor
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 366, in _async_setup_platform
    await asyncio.shield(awaitable)
  File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/tvh_rec/sensor.py", line 87, in setup_platform
    HtsSensor(
    ~~~~~~~~~^
        config.get(CONF_URL),
        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
        config.get(CONF_REC_COUNT),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Das scheint das hauptproblem zu sein.

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Moin,

ich müsste mir hier erst alles wieder anlesen, um den Kontext zu verstehen :slight_smile:

Nein das sind keine Daten in HA, sondern die URL kann nicht aufgelöst werden

config.get(CONF_URL),

Aber wie gesagt, aus dem Thema bin ich aktuell raus, dazu müsste ich von vorne anfangen.

Dann eine Bitte, Code, oder Logtext, bitte immer in Code-Tags </> dann liest es sich besser :wink:
grafik

VG
Bernd

Na ja das sind ja die daten die in der configuration.yaml hinterlegt werden.

sensor:
  - platform: tvh_rec
    name: rec
    username: test
    password: test
    url: http://10.100.1.3:9981
    scan_interval: 120
    count: 3

Moin,

wie geschrieben, bin da aktuell nicht im Thema, muss ich, wenn Zeit ist erst einmal wieder anschauen.

VG
Bernd

P.S.: @syrincs schon mal hier nachgelesen?

das ist ist nicht wichtig solange der erste Sensor nicht funktioniet der die API von tvheadend ausliest.

Der Template sensor ist dann nur für die abbildung ob gerade eine Aufnahme läuft.

Ich hab den Sensor nun umgestellt auf REST.

  - platform: rest
    name: rec1
    resource: http://10.100.1.3:9981/api/dvr/entry/grid_upcoming
    username: patrick
    password: Toto1234
    method: GET
    headers:
      Content-Type: application/json
    value_template: "{{ value_json.total }}"
    json_attributes:
      - entries
      
  
  - platform: template
    sensors:
      rec_aktiv:
        value_template: >-
          {% set entries = state_attr('sensor.rec1', 'entries') %}
          {% if entries %}
            {% set sorted_entries = entries | sort(attribute='start') %}
            {% set entry = sorted_entries[0] %}
            {% set airdate = entry.start %}
            {% set runtime = entry.duration %}
          
            {% if airdate and runtime is not none %}
              {% set target_timestamp_start = airdate %}
              {% set target_timestamp_end = target_timestamp_start + runtime * 60 %}
              {% set current_timestamp = as_timestamp(now()) %}
            
              {% if current_timestamp >= target_timestamp_start - 420 and current_timestamp <= target_timestamp_end + 240 %}
                Aufnahme läuft
              {% else %}
                keine Aufnahme
              {% endif %}
            {% else %}
              keine Aufnahme
            {% endif %}
          {% else %}
            keine Aufnahme
          {% endif %}
        friendly_name: "Aufnahme aktiv"