Brauche bitte Hilfe bei vdr-plugin-restfulapi: PUT mit Python

  • Hallo,


    ich versuche gerade mir über das vdr-plugin-restfulapi und Python meinen VDR zu steuern. Ich habe mit folgendem Code die Timer auslesen können und dann auch erfolgreich für meine Zwecke aufbereitet:

    Code
    import requests
    url = "http://xxx:8009/timers.json"
    response = requests.get(url)

    "xxx" ist natürlich dann meine Adresse - aber ich bekomme die Timer und kann sie weiter verarbeiten.:thumbup:


    Aber jetzt will ich einen der Timer ändern, z.B. auf inaktiv setzen - und da komme ich nicht weiter: Ich bin leider weder Python-Profi noch kenne ich mich mit Restful API aus. Und was ich im Internet gefunden hatte, hat mich bislang auch nicht weiter gebracht...


    Aus der Doku zu vdr-plugin-restfulapi:

    Code
    Updating Timers
    PUT http://<ip>:<port>/timers
    Required Body Parameters: timer_id - the id of the timer
    
    Example Request (including HTTP-Header):
    PUT /timers HTTP/1.1
    Content-Length: 81
    Connection: close
    timer_id=C-71-71-61920:0:1324681200:1400:1615&start=2015&stop=2230


    Ich versuche:

    Code
    import requests
    url = "http://xxx:8009/timers"
    payload = {"id": "S19.2E-1-1089-12003:0:1642374000:1600:1605", "is_active": False}
    response = requests.put(url, data = payload)

    Beim Ausführen bekomme ich in Python:

    Code
    raise ConnectionError(err, request=request)
    requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

    Ich glaube sogar, dass der VDR dabei kurz einen Neustart macht...


    Wie oben geschrieben: Das lesen der Timer ist kein Problem und natürlich setze ich für "id" immer die gerade gelesene "id" des Timers - aber PUT bekomme ich nicht hin...


    Was mache ich falsch?


    Vielen Dank!

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Was mache ich falsch?

    Der Name für die Timer-ID ist timer_id, nicht id und is_active muss man als Integer-Wert als flags übergeben also z.B.:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Einmal editiert, zuletzt von seahawk1986 ()

  • Erstmal vielen Dank!


    Aber ich bekomme noch den gleichen Fehler. Und in deinem Coding finde ich nicht, wo ich mitgebe, dass ich "is_active" ändern möchte - denn als nächstes möchte ich ja auch mal andere Werte ändern, z.B. "priority" oder "weekdays"... Oder ist "is_active" eine Ausnahme, weil es ja nicht um einen Wert, sondern um den ganzen Timer geht? Wie müsste PUT dann für z.B. "priority" aussehen?


    Mein aktuelles Coding:

    Code
    import requests
    
    url = "http://xxx:8009/timers"
    params = {"timer_id": "S19.2E-1-1089-12003:0:1642374000:2000:2005", "flags": int(False) }
    r = requests.put(url, data = params)
    r.raise_for_status()


    Und ich bekomme wieder den Fehler:

    Code
    raise ConnectionError(err, request=request)
    requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))


    Vielen Dank!

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Nutzt du python3 oder python2 und welche Unterversion davon?

    Und in deinem Coding finde ich nicht, wo ich mitgebe, dass ich "is_active" ändern möchte - denn als nächstes möchte ich ja auch mal andere Werte ändern, z.B. "priority" oder "weekdays"... Oder ist "is_active" eine Ausnahme, weil es ja nicht um einen Wert, sondern um den ganzen Timer geht?

    In der Dokumentation (sollte unter http://xxx:8009/info.html vom restfulapi-Plugin abrufbar sein steht dazu:

    Zitat

    Optional Body Parameters are the ones you use to create the timer and now want to update

    Welche Parameter da genau unterstützt werden, findet man am schnellsten im Quellcode heraus: https://github.com/yavdr/vdr-p…lob/master/timers.cpp#L46 ff. - das könnte man dann z.B. so umsetzen - das Skript deaktiviert alle aktiven Timer bzw. reaktiviert die inaktiven und ändert dabei die Priorität und die update_timer Methode sollte die restlichen Felder aktualisieren können, wenn man ihr entsprechende Argumente mitgibt:


    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Ah, vielen Dank, ok, ich glaube die Sache mit dem Ändern von Werten habe ich verstanden - sobald das Deaktivieren eines bestimmten Timers funktioniert, probiere ich das dann aus. Die Doku hatte ich gefunden - und den Link auf den Quell-Code sehe ich mir dann mal an!


    D.h. es bleibt erstmal noch mein Fehler, der das alles verhindert... Ich verwende Python 3.10.1:

    Code
    C:\Users\X>python
    Python 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.

    Und ich entwickle in Eclipse 2021-12 (4.22.0) mit "PyDev for Eclipse 9.2.0.202110311311".

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Welche Version des restfulapi-Plugins nutzt du? Und was passiert, wenn du das Python-Skript mal ohne den Umweg über Eclipse aufrufst (nicht, dass da irgendwelche Proxies dazwischen gehängt werden)?

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Version des Plugins: "vdr-plugin-restfulapi 1:0.2.6.5-13+2.4.7.220.3" (von der MLD System Information von meinem VDR)


    Ich habe das Test-Script gerade direkt aus der Windows cmd.exe mit "python test.py" gestartet -> Exakt die gleiche Meldung...


    Ich hatte es ja oben schon angedeutet - und jetzt bin ich sicher: Der Aufruf verursacht einen Neustart des VDR. Ich hatte den Ton gerade gemutet und nach dem Aufruf des Skripts höre ich plötzlich aus dem Nebenzimmer den TV... Aber in /var/log/messages habe ich keinen Eintrag vom Plugin gefunden, ausser den vom Neustart:

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Ah - dann ist das Problem, dass die MLD nicht den aktuellen Git-Stand paketiert, weil der nicht getagged wurde - dadurch fehlt dieser Commit: https://github.com/yavdr/vdr-p…6e250273c026495f5f13d59c1


    Ich habe das gerade mal nachgeholt - jetzt müsste noch jemand vom MLD-Team dafür sorgen, dass das Paket neu gebaut wird, falls das nicht automatisch passiert.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Super, vielen Dank für Deine Bemühungen und für Deine Zeit!


    Ich werde beim MLD mal vorsichtig nachfragen :)

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Kurze Rückmeldung: Das MLD-Team war super-schnell und jetzt hat es gerade auf Anhieb funktioniert!


    Vielen Dank!

    :)

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Falls es Fragen zum RestfulApi gibt bin ich gerne behilflich. Ich habe mich wegen meiner App damit ausführlich beschäftigt und viel durch Probieren herausgefunden, was nicht unbedingt gleich ersichtlich ist:


    • Eine fehlende timer_id bedeutet neuer Timer
    • Aktiv/Inaktiv/VPS etc. wird durch das Flagfeld gesetzt und bitweise interpretiert. 0/1 = inaktiv/aktiv, 4 = vps.
    • Die timer_id änderst sich nahezu bei jeder Änderung eines Parameters


    rbrt

  • Vielen Dank für das Angebot! Bis jetzt habe ich Channels, Timers und Epg (Events) gelesen; das Ändern von Timern hatte ich bislang nur getestet, aber noch nicht "produktiv" verwendet. Aber ich mache das ja im Wesentlichen, weil ich ein bisschen mit Python spielen möchte :)

    • Die timer_id änderst sich nahezu bei jeder Änderung eines Parameters

    Das bringt mich gerade zum Nachdenken: D.h. ich habe in meinem Python eine Liste mit Timern, ändere einen mit PUT (z.B. aktiv/ inaktiv oder die Stop-Zeit) und will den gleichen Timer wieder ändern -> Dann muss ich zuerst die Timer aus der API neu laden und mit meinen bestehenden Timern in der Liste vergleichen, um die neue timer_id zu bekommen? Danke für den Hinweis!

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Eine andere Zeit ändert definitiv die timer_id. Darin findet sich u.a. die Start/Stopzeit. Ich war da ziemlich verzweifelt und habe es so gelöst: Die RestfulApi gibt glücklicherweise den neuen Timer zurück, soweit ich mich erinnere aber unvollständig. irgendwas fehlte da immer. Mit der zurückgegebenen timer_id konnte ich aber herausfinden, ob es ein "neuer" Timer ist und habe dann den Timer nochmals geholt. Es gibt ja dafür extra einen Aufruf (http://url/timers/timerid.json)

  • Hi rbrt,

    weiß Du zufällig auch, wie sich der aktuelle Kanal abfragen lässt, oder bei einer Wiedergabe den Namen der Aufnahme?

    Interessant wäre auch der Fortschritt der Sendung bzw. der Wiedergabe.

    Es ist zwar schon eine Weile her, dass ich mich damit beschäftigt hatte, aber damals fand ich dafür keine Lösung, und konnte auch nicht (ohne riesen Aufwand) ergründen, wo das in den Restfullapi Sourcen nachgepflegt werden kann.

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • weiß Du zufällig auch, wie sich der aktuelle Kanal abfragen lässt, oder bei einer Wiedergabe den Namen der Aufnahme?

    Der aktuelle Kanal bzw. die momentan abgespielte Aufnahme purzeln bei der Info mit raus - also z.B.:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Danke, das mit der Wiedergabe hilft schon mal.

    Beim Kanal habe ich mich falsch ausgedrückt. Ich meinte den Sendernamen und die Programm Speicherplatz Nummer. Halt die Infos die beim drücken der OK Taste angezeigt werden.

    Und dann fehlt mir halt noch die Fortschritts Info.

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • Damit ich auch mal etwas halbwegs sinnvolles beitragen konnte:

    So wie ich das sehe, bekommt man aus "http://xxx:8009/channels.json" über "channel_id" mit "name" den Sendernamen und mit "number" die Speicherplatz Nummer. Bzgl. Fortschritts Info kann ich leider nichts sagen...

    VDR:

    MLD 5.5 (Testing)

    Hardware:

    Intel Core i5-10500 auf ASUS TUF Gaming H470-Pro mit 8GB

    Asus GeForce GT 1030 2GB (SoftHDDevice)

    Digital Devices 2x DuoFlex S2 v4A

    Flirc

    System: SSD // Daten: HDD WD RedPlus

    ---

    Rudimentäre Linux-Kenntnisse sind vorhanden - aber nicht wirklich belastbar...


    ;( Achtung: Linux Newbie...! :saint:
    ...auch nach über 19 Jahren noch...

  • Und dann fehlt mir halt noch die Fortschritts Info.

    Dazu muss man sich dann im Sender-EPG die laufende Sendung suchen und anhand deren Startzeit, Dauer und der aktuellen Uhrzeit den Fortschritt errechnen - also z.B. so mit jq:

    Code
    $ GET http://yavdr08:8002/events/T-8468-12547-802.json?chevents=1 | jq -r '(now - .events[0].start_time)/.events[0].duration'
    0.5893904163042705

    Der Kanalname kommt dabei übrigens auch mit:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    3 Mal editiert, zuletzt von seahawk1986 ()

  • Schade. Vielleicht is das ja noch was für die ToDo Liste dieses Plugins, diese Infos mit bereitzustellen. Die Infos werden benötigt um ein OSD nachzubilden.

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • Die Infos werden benötigt um ein OSD nachzubilden.

    Das geht mit dem osd2web-Plugin einfacher - und durch die Websocket-Verbindung, über die der Server Updates pushen kann, bekommt der Client gleich mit, wenn sich etwas geändert hat.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!