Jump to content

Aufgabe oder Programm/Batch VOR Timer-Aufnahme ausfrühen?


carmen.vvl

Recommended Posts

Hallo,

hier https://www.DVBViewer.tv/forum/topic/65183-webrequest-vor-geplanter-aufnahme-ausführen wurde sowas schon mal angesprochen, ohne richtiges Ergebnis. Ich würde gerne meinen 4-fach SAT>IP Server nicht mehr 24/7 laufen lassen, sondern nur noch abends (zeitgesteuert), bei Bedarf tagsüber manuell aber eben auch bei gelegentlich Aufnahmen zur Unzeit, dann lieber automatisch.

Das in dem o.g. Thread vorgeschlagene pollen der Status-Seite kann ja bestenfalls eine Krücke sein, gibt es keinen offiziellen Weg, eine Aufgabe oder ein Kommando vor einer Aufnahme bzw. mit dem Start auszuführen? Wie macht es denn das Tray-Icon?

 

BTW: zum Schalten würde ich einen Shelly einsetzen, da reicht ein 'get' im LAN.

Link to comment

Dein Problem ist eigentlich weniger das EINschalten, sondern mehr das AUSschalten nach der Aufnahme.

 

Stell Dir vor, Du hast 2 Aufnahmen laufen, die erste ist beendet und das "after recording" Skript sagt dem Shelly brav "BESCHEID".

Schon macht es KLICK und der Rest der zweiten Aufnahme ist abgeschnitten.

 

Das ist also ausgeprochen suboptimal, Du bräuchtest schon einen mehr intelligenteren Ansatz.

 

Vielleicht kann man das mit einer separaten "Aufgabe" im DMS lösen, aber ich hab keine Ahnung, in welchem Umfang die auf die Daten (sprich "Timerliste") zugreifen können. Im Prinzip zeigt der DMS ja schon im Webinterface "nächste Aufnahme am..." an, die Info müsste man abgreifen und zusätzlich noch "im Moment laufen X Aufnahmen".

Daraus kann man dann ein Skript oder Programm machen das

 

  • warte, bis die nächste Aufnahme innerhalb von 30min ansteht.
  • Schalte Shelly EIN
  • warte, solange noch Aufnahmen laufen
  • wenn keine weitere ansteht, dann schalte Shelly AUS
  • fang von vorne an

 

Es gibt aber noch viele andere Situationen, bei denen Dein Ansatz scheitert, weil der DMS "mal eben einen Tuner braucht" aber kein Timer existiert. Z.B. EPG Updates, oder SAT-IP Clients die Live TV gucken wollen. Da müsstest Du immer irgendwie Rücksicht drauf nehmen... das wird schwierig.

 

Edited by Trill Ian
Link to comment

Im Grunde bräuchte man hier keine Aktion vor/nach einer Aufnahme, sondern vor Initialisierung eines RTSP Netzwerkgerätes durch den DMS und nach dessen Freigabe.

 

Oder noch besser vor Initialisierung des ersten von mehreren RTSP Netzwerkgeräten (d.h. wenn noch kein anderes in Verwendung ist) und nach Freigabe des letzten (d.h. wenn kein weiteres mehr in Verwendung ist).

 

Link to comment

@Trill Ian:

Danke für Deine Hinweise, ausschalten wäre aber nicht mein erstes Thema, wenn der SAT>IP Server nach einer mittäglichen Aufnahme ein paar Stunden 'an' bleibt, wäre mir das egal. Recht hast Du insoweit, dass der interne Timer des Shelly für die abendliche 'Kernzeit' ungeeignet ist, denn der würde z.B. um 0:30 Uhr gnadenlos ausschalten. EPG-Update läuft bei mir Timer-gesteuert um 18:30, kein Problem, überlappende Aufnahmen in der Nacht eher selten.

Ein Zugriff auf den 'Rot'-Status des Tray-Icons würde das aber 'erschlagen'.

 

@Griga:

Das wäre natürlich die ultimative Lösung!

 

Einen anderen Ansatz gäbe es noch über den 'Wach'-Status des Servers, der auch nicht mehr durchläuft (aber außer DRS noch andere Aufgaben hat): es gibt wohl definierte Events, die nur nach Reaktivierung aus dem Ruhezustand auftreten und eine Windows-Aufgabe triggern können:
https://administrator.de/forum/pc-aus-ruhezustand-und-skript-ausfuehren-493740.html

(insbesondere letzter Post)

Link to comment

Erster Schritt erfolgreich: Einen Shelly schalten nach dem Aufwachen aus dem Ruhezustand funktioniert mit diesem Trigger:

 

image.png.3f22b9daf957e54607dc8214fbe75a84.png

 

Aufgerufen wird wget.exe mit der url des Shelly http://192.168.xxx.yyy/relay/0?turn=toggle, das würde auch bei einer nächtlichen Timer-Aufnahme klappen. Ein entsprechendes Windows-Ereignis beim Runterfahren in den Ruhezustand scheint es aber nicht zu geben...

Solange Lights-Out für den Ruhezustand verantwortlich ist, würde es mit einer Benutzer-definierten Aktion gehen, die zuerst wget aufruft und dann den Ruhezustand mit shutdown /h herbei führt.

 

Ein weiterer Shelly ist bestellt 😉

Edited by carmen.vvl
Link to comment

Vielleicht verstehe ich Dein Problem nicht. Ich habe verstanden:

Du hast einen PC als Server auf dem der Mediaserver läuft und Aufzeichnungen macht.

Damit er nicht die gesamte Zeit vor sich hin brummt willst Du ihn per Netzimpuls einschalten und am Ende aller Aufnahmen (sofern die nächste Aufnahme nicht in x-Minuten stattfindet) ausschalten.

Mit dieser API hier kannst Du Dir alle Informationen besorgen (sowohl wann er wieder eingeschaltet werden soll auch wann der Server ausgeschaltet wird)

http://<serveraddr>:8089/api/status2.html

Beschreibung gibt es hier.

 

https://en.DVBViewer.tv/wiki/Recording_Service_web_API

 

Jedenfalls liefert der Aufruf mit

<timercount>0</timercount>
<reccount>0</reccount>
<nexttimer>153814</nexttimer>
<nextrec>153814</nextrec>

alle Informationen die Du brauchst.

In diesem Fall gibt es derzeit keine aktiven Timer und keine aktiven Recordings. Als nächstes wird in 153814 Sekunden was passieren. Also muss der Server in etwas mehr als 42 Stunden eingeschaltet werden und nach Ende der Aufnahme sollte ein neuer Status geholt werden um zu entscheiden was passieren soll (warten oder ausschalten).

Zwischendurch sollte auch mal Zeit für EPG geplant werden (vielleicht alle 24 Stunden) diese Aufgabe kann dann mit

/api/epg.html?lvl=2[&channel={epgchannelID}][&start={floatDateTime}][&end={floatDateTime}][&search={term}&options={options}]

gestartet werden.

Der Code zum herunter fahren sollte auf dem Server ausgeführt werden - es gibt soweit ich weiß eine entsprechende Möglichkeit eine Routine nach Abschluss jeder Aufnahme zu starten. In diesem Programm sollte vor den herunter fahren der Status geholt, berechnet usw. und auf ein anderes System im Netz per Netzfreigabe übertragen werden oder der Server schickt eine Email an Dich oder wie auch immer. Aufgrund dieser Informationen  kann dann der nächste Start geplant werden.

Ich kenne Möglichkeiten von Shelly nicht. Wenn Du dem sagen kannst (in meinem Beispiel) : Schalte den Schalter des Servers in 42 Std. und 30 Minuten ein und boote das System wäre das alles was notwendig ist.

Link to comment

Hallo DetlefM,

es geht nicht um dem Windows-PC, der (auch) als DRS arbeitet, sondern um den 'Sat-Receiver', den SAT>IP-Server von 'Grundig', also das Interface zwischen Sat-LNB und LAN. Der verbraucht mit gut 10 Watt fast soviel wie der PC bei ruhenden Platten. Das Powermanagement des PC ist bereits geregelt, aber diese Box läuft bislang noch 24/7.

Link to comment
49 minutes ago, carmen.vvl said:

Hallo DetlefM,

es geht nicht um dem Windows-PC, der (auch) als DRS arbeitet, sondern um den 'Sat-Receiver', den SAT>IP-Server von 'Grundig', also das Interface zwischen Sat-LNB und LAN. Der verbraucht mit gut 10 Watt fast soviel wie der PC bei ruhenden Platten. Das Powermanagement des PC ist bereits geregelt, aber diese Box läuft bislang noch 24/7.

Nun das ändert nichts. Außer das eben aufgrund der API Aufrufe der Sat-Receiver an- bzw. ausgeschaltet werden muss. Ich bin mir wie geschrieben nicht sicher ob der Mediaserver eine Aktion durchführen kann. Falls nicht dann könntest Du halt meinen MediaServerTray hernehmen und eine entsprechende OnRecordEnd.cmd dort hinterlegen. https://github.com/detlefm/MediaServerTray

Link to comment

Im Prinzip müsstest du doch einfach auf das Herunterfahren des Windows PCs überwachen - oder ?

Das sind ein paar Zeilen Code. Hab ich auch schon fertig in meinem Programmen 😉

Dann sind alle Aufnahmen abgeschlossen.

Das kann man überwachen und beim Ausschalten einen http Request senden.

Aufwachen würde auch gehen. Wenn der PC an geht, Request senden. Machst du mit Wget.

Hab mir ein Programm geschrieben um die medindatenbank immer auf den jeweiligen aktiven PC zu kopieren und wieder zurück

zu kopieren damit ich die Positionen des Film hab.

Im Prinzip ist dein Problem ähnlich, nur, dass du einen Shelly schalten willst.

Edited by YARD2
Link to comment

@YARD2:

Genau, das war mein erster Ansatz, ohne auf 'Innereien' Recording Service zugreifen zu müssen, das funktioniert im Prinzip schon - getestet mit dem Shelly der Außenbeleuchtung...

 

@DetlefM:

Ja, nein, per API kann man sicher alles rausfinden, mit Programmieren ist bei mir aber mit einfachen Skripten das Ende erreicht. Dein MediaServerTray sieht aber spannend aus, leider weiß ich mit Deiner Github-Seite nicht wirklich etwas anzufangen. Mit der Forum-Suche finde ich zwar weitere Artikel von Dir, wo Du auch auf Github verweist, es wird auch mal eine MediaServerTray.exe erwäht, die sehe ich aber nirgends. Sicher gibt es irgendwo eine ausführlichere Beschreibung davon?

Link to comment
14 minutes ago, carmen.vvl said:

@YARD2:

Genau, das war mein erster Ansatz, ohne auf 'Innereien' Recording Service zugreifen zu müssen, das funktioniert im Prinzip schon - getestet mit dem Shelly der Außenbeleuchtung...

 

@DetlefM:

Ja, nein, per API kann man sicher alles rausfinden, mit Programmieren ist bei mir aber mit einfachen Skripten das Ende erreicht. Dein MediaServerTray sieht aber spannend aus, leider weiß ich mit Deiner Github-Seite nicht wirklich etwas anzufangen. Mit der Forum-Suche finde ich zwar weitere Artikel von Dir, wo Du auch auf Github verweist, es wird auch mal eine MediaServerTray.exe erwäht, die sehe ich aber nirgends. Sicher gibt es irgendwo eine ausführlichere Beschreibung davon?

Nun ich könnte mich hinsetzen und etwas mehr Doku schreiben aber das würde Dir nur zur Hälfte weiter helfen.

Wenn Du schon jetzt zum richtigen Zeitpunkt Deinen Mediaserver PC ausschaltest dann soll der ja auch nur den SAT-IP Server ausschalten und wenn der PC eingeschaltet wird dann soll halt auch der SAT-IP Server eingeschaltet werden. Das ist natürlich eine Sache die über die Aufgabenplanung leicht zu erledigen ist. Nach Start sowas passieren und beim Runterfahren. Eigentlich nur ein Webrequest an Deinen Shelly Schalter (halt an oder aus).

Link to comment
37 minutes ago, carmen.vvl said:

@YARD2:

Genau, das war mein erster Ansatz, ohne auf 'Innereien' Recording Service zugreifen zu müssen, das funktioniert im Prinzip schon - getestet mit dem Shelly der Außenbeleuchtung...

Wenn es doch schon mit der Außenbeleuchtung geht, wo ist dann das Problem ?

Das kannst du doch dann einfach auf den SAT>IP umsetzen

Edited by YARD2
Link to comment
vor 22 Stunden schrieb YARD2:

wo ist dann das Problem ?

...dass der Shelly für den SAT>IP zwar bestellt, aber noch nicht geliefert ist.

 

Oben hatte ich angedeutet, dass der Server außer dem Recording Service auch noch andere Aufgaben hat, d.h. er läuft auch zu Zeiten, wo der DRS nichts zu tun hat und der SAT>IP nicht gebraucht wird. Die Lösung über den Wachzustand des Server ist zwar viel besser als 24/7, es ginge aber noch besser.

 

Was ich nicht ganz verstehe: genau so, wie der DRS am Ende einer Aufnahme eine Aufgabe triggern kann, wäre es doch sicher leicht machbar, dass auch zu Beginn einer Aufnahme zu ermöglichen. Die Suche im Forum zeigt mir, dass sowas schon aus verschiedensten Gründen gesucht wurde, Pollen der Web-API ist doch Gefrickel.

Link to comment
vor 41 Minuten schrieb carmen.vvl:

Was ich nicht ganz verstehe: genau so, wie der DRS am Ende einer Aufnahme eine Aufgabe triggern kann, wäre es doch sicher leicht machbar, dass auch zu Beginn einer Aufnahme zu ermöglichen.

 

Weil es sich bei externen Tasks um asynchrone Prozesse handelt, die jedoch in diesem Fall mit dem DMS synchronisiert werden müssten. D.h. der DMS müsste mit dem Start der Aufnahme warten, bis die Task erfolgreich ausgeführt ist. Und da fangen die Probleme an... sowas ist überhaupt noch nicht vorgesehen.

 

Einfacher wäre ein Mechanismus, bei dem zu bestimmten Gelegenheiten eine GET Request mit einer vorkonfigurierten URL an einen Server abgesetzt wird. Weiter geht es erst, wenn die Antwort kommt oder nach einem Timeout. Der Empfänger könnte dann verzögern, bis er meint, es wäre ausreichend erledigt.

 

Link to comment

Ein get wäre ja genau das, was ich brauchen würde! Ansonsten ein default-timeout von z.B. 10 s mit der Möglichkeit, irgendwie ein anderes anzugeben. Der SAT>IP braucht natürlich auch Zeit hochzufahren, aber der DRS würde ja wiederholt neu tunen, wenn noch nichts kommt.

Link to comment

Ich hab dir mal schnell was geschrieben.

Schick mir mal ne PM, dann kann ich es dir zukommen lassen zum Testen.

PS. Wie lange dauert der SATIP Server zum booten ?

Link to comment

Anscheinend ist die Status-Anfrage auf 'auf 'recording' hier nicht geeignet: bei ausgeschaltetem SAT>IP-Server wechselt der DRS offenbar nie in den Staus recording! Der taucht wohl erst auf, wenn der DRS eine Quelle für die Aufnahme gefunden hat.

'Recording' wäre also nur zum Ausschalten nach dem Ende aller laufenden Aufnahmen sinnvoll, zum Einschalten geht es dann wohl nur mit einer Auswertung von 'nexttimer'.

Link to comment
Am 19.4.2022 um 13:35 schrieb Griga:

Weil es sich bei externen Tasks um asynchrone Prozesse handelt, die jedoch in diesem Fall mit dem DMS synchronisiert werden müssten. D.h. der DMS müsste mit dem Start der Aufnahme warten, bis die Task erfolgreich ausgeführt ist. Und da fangen die Probleme an...

Wie wäre es denn mit einer Option, beim Anlegen eines (Aufnahme-)Timers automatisch einen weiteren - zwei Minuten früher - zu erstellen, mit der externen Task 'SAT>IP ein'. Wenn der Shelly schon eingeschaltet ist, ist es egal, wenn die zwei Minuten vorher schon in der Vergangenheit liegen, sitzt der Mensch sehr wahrscheinlich schon davor und der SAT>IP ist eh an. Aber verschiedene Timer, die sich überlappen (könnten), sind doch kein Problem?

Falls der Shelly sein WLAN verloren hat oder sonstwie nicht reagiert, kann es der DRS eh nicht ändern...

Link to comment

Mir persönlich ist es lieber wenn der Mediaserver möglichst schlank, responsive und gut wartbar ist/bleibt. Ich bin also immer ein Freund von externen Lösungen falls der Mediaserver die Informationen dafür hergibt.

Und hier wäre das am einfachsten halt alle x Minuten (wie wärs mit 30) per Aufgabenplanung den Nexttimer abzufragen und wenn der innerhalb der nächsten 45 Minuten liegt dann wird einfach der SAT-IP Server eingeschaltet. Die richtige Wahl der Minuten (hier 30/45) ist eine Frage des Geschmacks.

Der Mediaserver macht am Ende des Tages auch nichts anderes als nach dem Nexttimer zu schauen und zu pollen.

Hier was zur Aufgabenplanung und alle x Minuten https://administrator.de/forum/aufgabenplanung-alle-30-minuten-ausser-zwischen-19-h-und-20-h-140117.html?msclkid=b4af90a9c62011ec89ea3173cbf95c1e

 

Link to comment

Ja, ich habe von YARD2 ein kleines Programm bekommen, quasi eine Komplettlösung mit GUI, das den Nexttimer abfragt, per ping den SAT>IP Server checkt, bei Bedarf direkt per get den Shelly einschaltet und nach der erwarteten Bootzeit erneut pingt. Das funktioniert nach kleinen Anpassungen in ersten Tests, allerdings ist es als normales Vordergrund-Programm konzipiert, klappt aber auch, wenn ich es per Aufgabensteuerung 'bei Systemstart' ohne Anmeldung starte. Es läuft also permanent mit, die Poll-Intervalle und Wartezeiten sind einstellbar.

Details sollte besser YARD2 selbst beschreiben.

vor 7 Stunden schrieb DetlefM:

...per Aufgabenplanung den Nexttimer abzufragen...

Das finde ich auch einen charmanten Ansatz - ich könnte mir ein Progrämmchen vorstellen, das ich in einem Batch/Skript z.B. mit dem Parameter '30' aufrufe und ich bekomme eine '1' zurück, wenn laut nexttimer innerhalb der nächsten 30 Minuten eine Aufnahme (oder EPG Update, ...) ansteht, sonst eine '0' (und irgendwas anderes, falls die Abfrage fehlschlägt). Das wäre ja nicht nur für meinen Zweck nutzbar sondern sicher noch für vieles andere - aber eben in einem einfachen Batch.

 

Ja, es gibt anscheinend Tools, die Parameter-gesteuert xml auswerten können, einfach ist aber anders...

Link to comment
  • 1 month later...
On 4/27/2022 at 9:56 PM, carmen.vvl said:

...
Das finde ich auch einen charmanten Ansatz - ich könnte mir ein Progrämmchen vorstellen, das ich in einem Batch/Skript z.B. mit dem Parameter '30' aufrufe und ich bekomme eine '1' zurück, wenn laut nexttimer innerhalb der nächsten 30 Minuten eine Aufnahme (oder EPG Update, ...) ansteht, sonst eine '0' (und irgendwas anderes, falls die Abfrage fehlschlägt). Das wäre ja nicht nur für meinen Zweck nutzbar sondern sicher noch für vieles andere - aber eben in einem einfachen Batch.

...

Ich habe mal sowas als Powershell Script implementiert.

https://github.com/detlefm/ms_nextaction

 

Ich habe es nicht ausgiebig getestet. Und ob die Exit Codes gut gewählt sind - da bin ich mir auch nicht sicher weil beim Parsen von XML bzw. dem Webrequest natürlich auch Fehler passieren können und ich die Exit Codes dieser Routinen nicht erkundet habe.

Schlecht ist auch (aber da kann ich nichts machen) dass der Mediaserver nicht den nächsten geplanten Zeitpunkt für das EPG Update von sich gibt. Es könnte also der Fall eintreten, dass immer wieder dieser Abruf  verzögert wird weil er noch nicht begonnen hat aber eigentlich demnächst stattfinden soll.

Ich würde eher die Version mit dem Returnwert nutzen aber natürlich kann man auch die Exitcodes nehmen.

 

Jedenfalls der Aufruf wäre ms_nextaction.ps1  http://localhost:8089 -Minutes 30 -UseExitCodes

Wobei -Minutes entbehrlich ist wenn man 30 Minuten will und der Switch -UseExitCodes braucht man nur wenn man auf exit codes setzt.

Hier ist die Kurzfassung (ohne Kommentar) zum Durchlesen:

Param(
    [Parameter(Mandatory=$true)][string[]] $ServerUrl, $Minutes = 30, [switch] $UseExitCode = $false
)

$response = Invoke-WebRequest "http://$ServerUrl/api/status2.html" 
if ($response -and $response.StatusCode -eq 200){
    [xml]$data = $response.Content
    if ($data){
        $seconds = $Minutes * 60
        if ($data.status.timercount -gt 0 -or $data.status.reccount -gt 0 -or $data.status.epgudate -gt 0 ){
            if ($UseExitCode){
                exit 2
            }
            return 2
        }
        if ($data.status.nexttimer -le $seconds -or $data.status.nextrec -le $seconds ){
            if ($UseExitCode){
                exit 1
            }
            return 1
        }
        if ($UseExitCode){
            exit 0
        }
        return 0
    } else {
        if ($UseExitCode){
            exit -2
        }
        -2
    }
} else {
    if ($UseExitCode){
        exit -1
    }
    -1
}

 

Edited by DetlefM
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...