Jump to content

Recording Service und Standby / Aufwecken


Recommended Posts

Posted

Hallo Nutzer und Entwickler des Recording Service und DVBViewers,

 

wenn man den DVBViewer mit dem Recording Service (auf einem anderen Rechner) verbindet, funktioniert das mit dem "Wakeup On Lan" im Normalfall sehr gut, d.h. wenn ich den DVBViewer starte, wird auch relativ schnell der Rechner mit dem Recording Service aus dem Standby aufgeweckt und dann kann ich fernsehen, Timeraufnahmen ansehen, usw.

 

Wenn ich aber dann ein (lokales) Video / Musik oder Bilder abspiele, stoppt der DVBViewer ja den TV-Streaming-Abruf vom Recording Service. Das führt dazu, dass der RS Rechner sofort in den Schlafmodus geht. Der Recording Service hatte ja das Windows nur solange von seiner eigentlich fälligen Standby-Schaltung abgehalten, wie eine aktive Verbindung mit einem Client (DVBViewer) bestand.

 

Das führt natürlich zu dem etwas ärgerlichen Problem, dass nach Stopp oder errreichtem Ende des lokal abgespielten Videos ein Fehler auftritt, wenn ich wieder auf ein TV-Programm gehe (entweder manuell oder auch automatisch durch "Aktion nach Wiedergabe: LastChannel"). Da der Rechner mit dem Recording Service im Standby ist, muss ich erst den DVBViewer beenden und wieder neu starten, damit der Server wieder geweckt wird.

 

Ich habe zwar entdeckt, dass man als Aktion bei Stopp oder erreichtem Ende eines abgespielten Videos auch "Service Wake on LAN" auswählen kann, was dann tatsächlich den Server wieder weckt, aber man bleibt dann bei dem leeren Bildschirm (ohne Wiedergabe) und muss erst wieder ein Programm auswählen... und das darf man auch nicht zu früh machen, weil man warten muss bis der Server nach dem Wakeup Call wieder oben und ansprechbar ist.

 

Und bei Musikwiedergabe, Bilderwiedergabe, usw. gibt es diese Aktionen bei Stopp oder Ende der Wiedergabe gar nicht zu konfigurieren. Da muss man dann zwangsläufig beenden und neu starten oder sich durch das OSD unter System durchnavigieren, wo es auch ein Kommando zum manuellen Aufwecken gibt.

 

Kann man eine komfortablere Methode finden, um diese Situation (Standy während lokaler Video/Musik/Bilder-Wiedergabe) aufzufangen? Ideal wäre es, wenn der DVBViewer bei der Rückkehr auf ein Unicast Device (z.B. nach lokaler Videowiedergabe) jedes Mal wieder einen Wakeup senden würde und dann die in den Optionen für den Recording Service konfigurierte Wartezeit auf einen Stream wartet. Das wäre aber wohl mit einer Programmänderung verbunden.

 

Gäbe es andere Wege (evtl. durch ein Skript), dass man zumindest für (lokale) Videowiedergabe eine Aktion nach Wiedergabeende oder -stopp aufrufen kann, die einen Wakeup on LAN sendet, dann eine gewisse Zeit wartet und dann "Tune to Last Channel" durchführt? Ich kenne mich mit der Skripterstellung und den Möglichkeiten damit leider nicht so aus.

 

Grundsätzlich ist das Verhalten der sofortigen Standby-Schaltung, nachdem kein Client mehr verbunden ist, etwas prolematisch. Windows gibt ja normalerweise nach der letzten erkannten Aktivität durch einen Benutzer eine halbe Stunde Zeit, bevor in Standby-Modus gefahren wird. Ist aber diese halbe Stunde schon um und nur noch der Recording Service hält wegen einem laufenden Strem Windows davon ab, in den Standby zu schalten, dann fährt Windows sofort nach Freigabe durch den Recording Service in Standby... auch wenn man im DVBViewer nur für wenige Sekunden mal ein Video angespielt hat oder die TV-Wiedergabe beendet hatte. Gibt es dafür vielleicht eine konfigurierbare Nachlaufzeit im Recording Service, wo der RS auch nach dem Abmelden des DVBViewers (Clients) noch etwas abwartet, bevor er Windows in Standby fahren lässt? Oder dass man Windows dazu bekommt, dass die im System eingestellte halbe Stunde bis zum Standby immer erst dann (neu) zu laufen beginnt, wenn der Recording Service keine laufenden Streams oder Timeraufnahmen mehr hat (also die Blockierung des Standby-Modus aufhebt).

 

Vielleicht hat ja jemand ähnliche Probleme festgestellt und einen guten Workaround gefunden. Oder es gibt vielleicht einen kleinen Anstoß, an der einen oder anderen Stelle noch etwas im DVBViewer / Recording Service zu ändern.

 

Vielen Dank,

Chris

Posted

Du kannst am ende einer Video wiedergebe auch einen Script ausführen lassen.

 

Das geht auch über Command.vbs

http://de.DVBViewer.tv/wiki/Command.vbs

 

Da du aber in den Einstellungen nicht direkt einen ActionID eingeben kannst musst du dazu noch die actions.ini anpassen. Einfach am ende der Datei eine Zeile hinzufügen

MeinScript=33333

und dann in der Command.vbs für 33333 den eigenen Script ablegen.

Posted (edited)

Danke Euch für die Antworten.

 

Ich würde zunächst mal die Methode, die Tjod vorgeschlagen hat, versuchen. Also ein Skript in Command.vbs implementieren, das eine eigene ActionID hat und diese dann in die actions.ini eintragen.

 

Obwohl ich von VBScipt keine Ahnung habe, konnte ich mir mir aus vorhandenen Beispielen was zusammenstellen. Ob das wie erwartet funktioniert, kann ich aber im Moment nicht testen und würde die Auskenner unter Euch um kurzes Feedback bitten.

 

Also die erste (einfachere) Methode wäre, durch das Skript zunächst das vorhandene Kommando "Service Wake On LAN" (ActionID 8275) aufzurufen, dann einen Hinweistext auf dem Bildschrim auszugeben mit einer 5 Sekunden Wartezeit, dann das vorhandene Kommando "LastChannel" (ActionID 63) aufzurufen. Dann dieses eigene Skript in den DVBViewer Video Optionen als Aktion "nach Playback Ende" und "nach Playback Stopp" einstellen. Hier der Code:

 

sub main(ActionID)

   Select Case ActionID

       Case 33333
       'Bei ActionID 33333

           SendCommand(8275)
           'Action: Service Wake On LAN

           osd.showInfoinTVpic "Sende Wake On LAN zum Service-PC, bitte etwas Geduld",5000
           'Ausgabe der Meldung auf dem Bildschirm, wartet 5 Sekunden

           SendCommand(63)
           'Action: Last Channel

       Case Else
       'Bei allen anderen ActionIDs

           osd.showInfoinTVpic "No action in the Command.vbs for the ActionID " & ActionID,1000
           'Zeige die Text Information No action in the Command.vbs for the ActionID (ActionID)
           'für 1000 Millisekunden im DVBViewer an.

   End Select

end sub

 

Beser wäre natürlich, wenn man zuerst einen Ping zum Service-PC absetzt und wenn er noch lebt, dann gleich "LastChannel" aufruft, ansonsten wie im obigen Beispiel erst einen WOL schicken, 5 Sekunden warten mit Textausgabe, dann "LastChannel". Da bin ich mir aber nun überhaupt nicht sicher, ob das so funktioniert, zumal ich nicht weiß, ob OSD.ExecNewProcess den Return Code des ping zurückgibt. Hier das (laienhafte) Beispiel:

 

sub main(ActionID)

   Select Case ActionID

       Case 33333
       'Bei ActionID 33333

           PINGFlag = Not CBool(OSD.ExecNewProcess "ping.exe", "-n 1 -w 100 192.168.123.1", True, False)
           'Starte das externe Programm ping.exe,
           'übergibt Parameter -n 1 (1x Ping)
           'und Parameter -w 1 (0.1 Sekunde auf Antwort warten)
           'und IP-Adresse 192.168.123.1 (Service-PC)
           'warte bis ping.exe fertig ist
           'starte ping.exe nicht mit niedriger Windows Priorität
           'Return Code geht in Variable PINGFlag 

           If PINGFlag = True Then
          'bei erfolgreichem Ping (Server lebt)...

               SendCommand(63)
               'Action: Last Channel

           Else
           'bei nicht erfolgreichem Ping (Server schläft)...

               SendCommand(8275)
               'Action: Service Wake On LAN

               osd.showInfoinTVpic "Sende Wake On LAN zum Service-PC, bitte etwas Geduld",5000
               'Ausgabe der Meldung auf dem Bildschirm, wartet 5 Sekunden

               SendCommand(63)
               'Action: Last Channel

          End If

       Case Else
       'Bei allen anderen ActionIDs

           osd.showInfoinTVpic "No action in the Command.vbs for the ActionID " & ActionID,1000
           'Zeige die Text Information No action in the Command.vbs for the ActionID (ActionID)
           'für 1000 Millisekunden im DVBViewer an.

   End Select

end sub

 

Diese beiden Methoden würden aber dann nur nach Video-Playback greifen, oder geht das auch nach Musik- und Bildwiedergabe? Denn dort gibt es keine Optionen, wo man eine Standard-Aktion nach Wiedergabe-Stopp oder -Ende zuordnen kann. Hier wird wohl immer "LastChannel" ausgeführt? Oder kann man die vorhandene Action "LastChannel" global durch das eigene Skript ersetzen, was dann nach allen Wiedergaben greifen würde?

 

Danke schon mal,

viele Grüße,

Chris

Edited by chrisbu
Posted

So, die im vorigen Post genannten Beispiele waren leider Schrott und haben nicht funktioniert. :blush:

 

Jetzt habe ich was zusammengebaut, das erst mal funktioniert:

 

- Prüft, ob der Service-PC per Ping erreichbar ist

- Wenn ja, wird die Action "LastChannel" sofort ausgeführt

- Wenn nein, wird ein Wake On LAN an den Service-PC geschickt

- In einer Schleife wird jede Sekunde ein Ping an den Service-PC geschickt

- Wenn eine Antwort kommt, wird Schleife beendet und Action "Last Channel" ausgeführt

- Wenn innerhalb von 180 Sekunden keine Antwort kommt, wird Schleife auch beendet (Timeout)

 

Command.vbs:

 

sub main(ActionID)

   Select Case ActionID

       Case 33333 'Bei ActionID 33333...

           Dim WoLTarget, WoLTimeout, WoLTime, PingFlag

           WoLTarget  = "198.168.123.123" 'IP-Adresse des Service-PC
           WoLTimeout = 180               'Timeout für WoL

           Set WshShell = CreateObject("WScript.Shell") 'Shell Objekt erzeugen

           PingFlag = Not CBool(WshShell.run("ping -n 1 -w 100 " & WoLTarget, 0, False))
           'ein Ping an den Service-PC mit Wartezeit 0.1 Sekunde
           'Return Code geht in PingFlag 

           If PingFlag = True Then 'bei erfolgreichem Ping (Server lebt)...

               SendCommand(63) 'Action: Last Channel

           Else 'bei nicht erfolgreichem Ping (Server schläft)...

               SendCommand(8275) 'Action: Service Wake On LAN

               WoLTime = 0

               Do While PingFlag = False 'Schleife bis Ping erfolgreich (Server lebt)...

                   PingFlag = Not CBool(WshShell.run("ping -n 1 -w 1000 " & WoLTarget, 0, False))
                   'ein Ping an den Service-PC mit Wartezeit 1 Sekunde
                   'Return Code geht in PingFlag

                   WoLTime = WoLTime + 1 'Wartezeit um 1 Sekunde hochzählen

                   If WoLTime = WoLTimeout Then Exit Do 'Wenn Timeout erreicht, dann Schleife verlassen

               Loop

               SendCommand(63) 'Action: Last Channel

          End If

       Case Else 'Bei allen anderen ActionIDs

           osd.showInfoinTVpic "No action in the Command.vbs for ActionID " & ActionID, 1000
           'Zeige die Text Information No action in the Command.vbs for the ActionID (ActionID)
           'für 1000 Millisekunden im DVBViewer an.

   End Select

end sub

 

actions.ini:

 

...am Ende der Datei:
LastChannel w/ WoL=33333

 

Und dann in den Optionen -> Videos für Aktion nach Playback Ende und Aktion nach Playback Stopp die Action "LastChannel w/ WoL" ausgewählt.

 

Das scheint wie erwartet zu funktionieren.

 

Ein paar Fragen hätte ich aber noch, um das noch komfortabler zu gestalten...

 

- Wie kann ich die IP-Adresse und das WoL Timeout aus den DVBViewer Optionen auslesen, damit ich sie nicht fest im Skript angeben muss?

 

- Wie kann ich während der Wartezeit auf das WoL ein Bild (z.B. "wait.jpg") auf dem TV-Screen ausgeben? Leider geht die Textausgabe per osd.showInfoinTVpic während der Wartezeit nicht, weil die Videowiedergabe ja schon beendet ist und noch kein laufendes TV-Bild da ist. Mit der Ausgabe eines Bildes könnte man stattdessen auf die Wartezeit hinweisen. Oder geht doch Textausgabe auf anderem Wege?

 

- Kann man diese Action nicht nur nach einer Videowiedergabe, sondern auch nach einer Musik- oder Bildwiedergabe aufrufen? Ggf. die vorhandene Action "LastChannel" global durch diese ersetzen? Oder ginge das auch über channelchange.vbs (also, wird channelchange.vbs nicht nur beim Umschalten, sondern auch am Ende einer Video-, Musik-, Bildwiedergabe ausgeführt, wenn wieder automatisch auf den letzten gesehenen Kanal "LastChannel" geschaltet wird)?

 

Wenn ich eine optimierte Lösung habe, werde ich die hier noch mal posten. ;)

 

Danke und Gruß,

Chris

Posted

So, jetzt habe ich es aber ganz gut hinbekommen, auch mit Auslesen der Parameter aus der Konfig.

 

Folgendes Skript (Command.vbs) macht folgendes:

 

- Prüfen, ob in den DVBViewer Optionen der Recording Service aktiviert ist und ob dort auch Wake on LAN aktiviert ist

 

- Wenn nicht, dann überpringe den Rest und führe gleich die Action "LastChannel" aus

 

- Wenn ja, dann sende zunächst einen Ping mit kurzer Wartezeit an den Service-PC (IP-Adresse aus den DVBViewer Optionen ausgelesen)

 

- Falls dieser antwortet, ist er (noch) nicht im Standby und es wird die Action "LastChannel" ausgeführt

 

- Falls dieser nicht antwortet, ist er während der lokalen Videowiedergabe in Standby gefahren und muss nun geweckt werden

 

- Zum Aufwecken wird zunächst die Action "Service Wake On LAN" aufgerufen und dann eine Schleife durchlaufen, in der jede Sekunde ein Ping an den Service-PC gesendet wird, so lange, bis dieser antwortet, also mit dem Wakeup fertig ist

 

- Ist die Antwort eingetroffen oder die in den DVBViewer Optionen konfigurierte maximale Wartezeit für WoL verstrichen, wird die Action "Last Channel" ausgeführt

 

Hier der Code (Command.vbs):

 

Function Ping(PingTarget, PingWait)

   On Error Resume Next

   Set WshShell = CreateObject("WScript.Shell")

   Ping = Not Cbool(WshShell.Run("ping -n 1 -w " & PingWait & " " & PingTarget, 0, True))

End Function

sub main(ActionID)

   Select Case ActionID

       Case 33333 'Bei ActionID 33333...

           Dim WoLTarget, WoLTimeout, WoLTime

           If (GetSetupValue("Service", "Enabled", "") = "1") And (GetSetupValue("Service", "WOL", "") = "1") Then
           'Wenn Recording Service und Wake on LAN in settings.xml enabled sind...

               WoLTarget  = Split(GetSetupValue("Service", "Adress", ""), ":")
                            'WoLTarget(0) = settings.xml: IP-Adresse des Service-PC
                            'WoLTarget(1) = settings.xml: Port des Webservice

               WoLTimeout = CInt(GetSetupValue("Service", "WOLWait", ""))
                            'WoLTimeout = settings.xml: Wartezeit für WoL

               Set WshShell = CreateObject("WScript.Shell") 'Shell Objekt erzeugen

               If Ping(WoLTarget(0), 100) = False Then
               'ein Ping an den Service-PC mit Wartezeit 0.1 Sekunde
               'bei nicht erfolgreichem Ping (Server schläft)...

                   SendCommand(8275) 'Action: Service Wake On LAN

                   osd.showInfoinTVpic "Sende Wake On LAN zum Service-PC, bitte etwas Geduld", 10000
                   'Ausgabe der Meldung als Text auf dem Bildschirm (über OSD) für 10 Sekunden

                   WoLTime = 0

                   Do While Ping(WoLTarget(0), 700) = False
                   'Ping an den Service-PC mit Wartezeit 0.7 Sekunden
                   'in einer Schleife bis Ping erfolgreich (Server lebt)...

                       WoLTime = WoLTime + 1 'verstrichene Wartezeit um 1 Sekunde hochzählen

                       If WoLTime = WoLTimeout Then Exit Do 'Wenn Timeout erreicht, dann Schleife verlassen

                   Loop

               End If

           End If

           SendCommand(63) 'Action: Last Channel

       Case Else 'Bei allen anderen ActionIDs

           osd.showInfoinTVpic "No action in the Command.vbs for ActionID " & ActionID, 1000
           'Zeige die Text Information No action in the Command.vbs for the ActionID (ActionID)
           'für 1000 Millisekunden im DVBViewer an.

   End Select

end sub

 

Und dann wie gesagt in der actions.ini eine eigene Action dafür anlegen:

 

...am Ende der Datei
LastChannel w/ WoL=33333

 

Zuguterletzt noch in den DVBViewer Optionen "Videos" für Aktion Playback Stopp: "LastChannel w/ WoL" und Aktion Playback Ende: "LastChannel w/ WoL" einstellen.

 

Dann funktioniert das so, dass nach Abspielen eines Videos (wie bei "LastChannel") sofort auf den letzten (vom Recording Service) empfangenen Kanal zurückgeschaltet wird, aber eben nur wenn der Serive-PC noch aktiv ist. Wenn er bereits in Standby gefahren ist, wird ein Wake On LAN hingeschickt und erst auf den letzten empfangenen Kanal zurückgeschaltet, wenn der Service-PC wieder vollständig aufgeweckt ist. Funktioniert gut!

 

Allerdings, falls das jemand ausprobieren möchte, könnte es eventuell unter Windows Vista oder Windows 7 zu Problemen kommen. Ich habe das unter Windows XP SP3 erfolgreich getestet, meine aber irgendwo gelesen zu haben, dass der Ping-Befehl bei Vista und Win7 keine korrekten Return-Codes liefert, was bei der Auswertung des Ergebnisses im Skript zu Fehlern führen kann. Vielleicht kann das jemand nach einem Test unter Vista oder Win7 bestätigen.

 

Das ist zumindest jetzt meine Lösung als "Workaround" für die Standby-Problematik während Videowiedergabe. Vieleicht kann der DVBViewer das irgendwann auch mal von sich aus. ;)

×
×
  • Create New...