Jump to content
nuts

Erweitertes Beenden v2 / Extended Exit v2

Recommended Posts

Tüftler

Ok, ich stehe jetzt an der Stelle das die Aufnahmen im RS einen Standby zugewiesen bekommen sollen.

Ich benötige also einen processtask, richtig?

Wie sieht sowas aus, hast du ein Beispiel dafür?

Share this post


Link to post
nuts

Aufgaben kannst du so erstellen: http://de.DVBViewer.tv/wiki/Optionen_Service_-_Aufgaben

Dort kannst du mein verlinktes Skript einbinden oder einen der schon definierten Befehle verwenden.

 

Die gewünschte Aufgabe dann als Standardaufgabe nach jeder Aufnahme hinterlegen:

http://de.DVBViewer.tv/wiki/Optionen_Service_-_Aufnahmen#Aufgabe_nach_Aufnahme

 

Für mein Skript (processtaskEX) eine passende Sektion wäre meiner Meinung nach:

[standby]
checkprocesslist=1
checkrecording=1
checkrecordingRS=1
processtask=Standby

 

 

Plus die Aktionen die du sonst vor einem Standby ausführen willst.

 

P.S. Aufruf: %\ProcessTasksEX.exe -standby

Share this post


Link to post
Tüftler

ProcessTasksEX bekomme ich als Aufgabe nicht gestartet, sehe ich auch am Log!

Extended Exit geht ohne Probleme.

Eine erstellte Verknüpfung mit Standby geht dagegen auch bei ProcessTasksEX

1.png2.png

 

Ansonsten bräuchte ich noch eine Möglichkeit um eine aktive Wiedergabe (WindowManager.isOverlay) abzufragen, da der RS ja bei mir lokal ist.

Share this post


Link to post
nuts

Und was steht im Log (von ProcessTasksEX)?

 

Also du beendest den DVBViewer nicht vor dem Standby?

 

Sieht bei dir dann z.B. so aus:

 

Erweitertes Beeenden Skript erkennt laufende Aufnahme

=> DVBViewer Wiedergabe wird beendet

 

Aufgabe nach Aufnahmen

=> aktiver Prozess DVBViewer.exe wird gefunden

=> kein standby

Edited by nuts

Share this post


Link to post
Tüftler

Na nix da nicht gestartet wird, oder meinst du vom RS?

Share this post


Link to post
nuts

Aktiviere mal das erweiterte Log (ExtendedLog=1).

 

edit\ Meine das Log vom Skript selbst.

Edited by nuts

Share this post


Link to post
Tüftler

Das ExtendedLog ist an

Man kann auch die Aufgabe im Webinterface nicht zu einer Aktion überreden.

Share this post


Link to post
nuts

Hm und wenn du das Skript einfach mal so (im Benutzerkonto) ausführst?

 

Könnte mir noch vorstellen, dass das Skript ausversehen noch aktiv ist.

Überprüfe mal den Taskmanager.

 

Echt komisch.

Bevor da irgendwas schief gehen kann müssten einige Einträge im Log da sein.

Edited by nuts

Share this post


Link to post
Tüftler

Sie scheint noch aktiv zu sein obwohl ich sie im Taskmanager nicht sehe. Wollte die exe löschen und da meckert er.

Ich starte den Rechner mal neu

Share this post


Link to post
nuts

Hm ich sehe was da schief läuft ... :(

Beim ersten Start öffnet das Skript die gerade erstellte INI und wartet bis der Benutzer die INI bearbeitet hat und wieder geschlossen hat.

 

Wenn der erste Start gleich im Benutzerkonto erfolgt sieht der Benutzer davon natürlich nichts und das Skript hängt in einer endlosschleife.

Sorry mein Fehler ... lade heute abend eine neue Version hoch.

 

Beim zweiten Start sollte es jetzt aber auch so funktionieren.

Share this post


Link to post
Tüftler

Glaube nicht das es das ist da ich die ini gesehen habe.

Ich hatte im Log ein paar COM Fehler drin komme jetzt grade aber nicht an die Logs. Möglicherweise hängt es deshalb fest?

Ich kann aber erst später wieder testen.

Share this post


Link to post
nuts

Nee klar.

Im Systemkonto bekommst du die nie zu sehen, kannst die INI weder bearbeiten noch schließen.

 

Das die INI beim ersten Versuch gestartet wird sollte die Einrichtung erleichtern, aber aus dem Systemkonto ist sowas natürlich grober Unsinn.

Ich ändere das. :)

edit\ http://www.DVBViewer.tv/forum/topic/51926-processtasksex/

 

Die COM-Fehler dürften nur kommen wenn der DVBViewer nicht erreichbar ist.

Das ist nicht schlimm.

Edited by nuts

Share this post


Link to post
Tüftler

Hm,

ich hatte das so verstanden

Extended Exit.ini:

checkrecordingRS=StandbyRS -> bedeutet wenn eine Aufnahme im RS erkannt wird wechselt er zu Extended Exit_config.ini zum Eintrag [standbyRS]

 

Extended Exit_config.ini:

[standbyRS]

processtask=StandbyEX

 

das passiert aber nicht. Bitte erkläre das nochmal genauer, ich stehe auf dem Schlauch :wassat:

Share this post


Link to post
nuts

Wie sieht das Log dazu aus?

 

In dem Fall müsste der Task "StandbyEX" (custom Task den du selbst im RS anlegen musst) aufgerufen werden.

 

P.S. Dank der Diskussion mit dir habe ich etwas besser verstanden wie man mit einem lokalen RS umgehen muss. Ich werde am Wochenende mal ausformulieren wie ich mir das genau vorstelle und entsprechende Beispiele posten.

Share this post


Link to post
Tüftler

Anbei mal eine komplette Beschreibung des Testszenarios:

  • Aufnahme im Viewer gestartet
  • Beenden angewählt, dein Extended Exit wird in Sektion Standby gestartet
  • mein Script wird ausgeführt und die Aufnahme landet im RS
  • Zurück in dein Script und Wiedergabegraph wird geschlossen
  • Datenbank wird per processtask aufgefrischt
  • 20s Wartezeit gesetzt damit die Aufnahme wirklich im RS ist
  • Prüfung auf Aufnahme im RS, dann weiter in Sektion StandbyRS
  • in StandbyRS zum Test erneut mein Script aufrufen (erzeugt beim Start eine MessageBox), nichts passiert
  • stattdessen macht er im Standby Script weiter, schätze mal mit checkrecordingRS=1, was ich dann abbreche
Der angelegte StandbyEX prozesstask (ProcessTaskEX.exe standby) wird jetzt vom RS auch ausgeführt aber wegen dem gleichen Problem mit dem Sektionen anspringen nicht richtig ausgeführt.

In der ProcessTaskEX_actions.ini Sektion [standby] springe ich mit checkrecording=isrecording in ProcessTaskEX_config Sektion [isrecording], was auch nicht geht. Noch dazu wird der Eintrag Key=Value immer wieder von selbst eingetragen, womit dein script laut log nichts anfangen kann. Ich denke aber das habe ich nicht richtig verstanden mit den Einträgen, oder?

Edited by Tüftler

Share this post


Link to post
nuts

Ok ich Schau mir das mal an.

Share this post


Link to post
nuts

Ok ich sehe ich das Problem.

Liegt an dem "blöden" einheitlichen Variablentyp in autoit. :(

 

Ich lad bald ein Update hoch.

Share this post


Link to post
Tüftler

Das ist in VBS nicht besser, ich bastle schon 3 Tage daran herum eine Aufnahme aus dem Timeshiftpuffer sicher zu händeln und muss überall extra deklarieren ob string, integer, long etc.

Außerdem muss man echte Klimmzüge machen wenn man einen Zeitwert formatieren möchte, allein dafür sind schon 2 extra Funktionen notwendig.

Share this post


Link to post
nuts

Ja das Problem kenn ich auch. Mit den Skriptsprachen muss man viel von hand machen ...

 

Ich stelle mir den Ablauf mit einem lokalen RS so vor:


Extended Exit:

 

[standby]

checktimeshift=1 => um die Sektion abzubrechen falls timeshift aktiv ist (alternativ dein Skript)

instantrec=120 => alle Sofortaufnahmen mit +120min an den RS schicken (EPG Endzeit bau ich noch ein) => Alternativ dein Skript

checkrecording=1 => hier dürfte jetzt nie ein escape auftreten (kann man sich daher auch sparen)

checkrecordingRS=isrecording => Dialogabfrage ob man überhaupt weitermachen will, falls ja ruft bei einem Konfikt "isrecording" auf um alle Befehle, die die Aufnahme nicht gefährden abzuarbeiten

....

deine Befehlabfolge falls kein Konfikt auftreten sollte (Datenbank auffrischen, DVBViewer schließen, Eventghost schließen, Standby auslösen usw.)

....

[isrecording]

deine Befehlsfolge die trotz laufenden Aufnahmen Sinn machen


ProcessTaskEx:

 

[standby]

checkprocesslist=1 => überprüft ob ein Prozess in der Liste aktiv ist um den PC nicht herunterzufahren falls ein Benutzer aktiv ist (sollte der DVBViewer nie geschlossen werden muss "DVBViewer.exe" aus der Liste natürlich entfernt werden.

checkrecordingRS=1 => überprüft ob laufende Aufnahmen aktiv sind und bricht die Sektion ab (alternativ umleiten in eine Custom Sektion wie beim Exended Exit)

....

deine Befehlabfolge falls kein Konfikt auftreten sollte (Datenbank auffrischen, usw.)

....

processtask=Standby => ruft den eigenen Standbybefehl vom Recordingservice auf. Ein aktiver DVBViewer Client dürfte jetzt eine Meldung bekommen und kann so diesen Vorgang noch abbrechen.

Den Punkt müsstest du mal testen. Ansonsten muss ich mir da noch was einfallen lassen.

 

ProcesstaskEX soll dann nach jeder Aufnahme ausgeführt werden um falls möglich den Standby auszuführen!

 

Deckt das so alles ab? Oder braucht es noch weitere Behandlungen?

Dein Skript kann ich wie gesagt noch direkt einbauen, aber das wird heute leider nix mehr.

 

P.S. Wenn du willst kann ich dir meine autoit Funktion für die TDateTime Konvertierung zukommen lassen.

Edited by nuts

Share this post


Link to post
nuts

Anbei eine neue Testversion. edit\ Neuste Version im Startpost

Edited by nuts

Share this post


Link to post
Tüftler

Ja das Problem kenn ich auch. Mit den Skriptsprachen muss man viel von hand machen ...

 

Ich stelle mir den Ablauf mit einem lokalen RS so vor:

 

 

 

 

 

ProcesstaskEX soll dann nach jeder Aufnahme ausgeführt werden um falls möglich den Standby auszuführen!

 

Deckt das so alles ab? Oder braucht es noch weitere Behandlungen?

Dein Skript kann ich wie gesagt noch direkt einbauen, aber das wird heute leider nix mehr.

 

P.S. Wenn du willst kann ich dir meine autoit Funktion für die TDateTime Konvertierung zukommen lassen.

Danke dir ich teste dann später.

Für die TDateTime Konvertierung habe ich jetzt eh schon alles drin, das läuft und da mache ich auch nichts mehr dran.

Timeshiftaufnahme abfangen klappt jetzt auch, das Script muss ich aber noch putzen und lade das dann neu hoch.

 

Was noch gebraucht wird ist Windowmanger.isOverlay um zu prüfen ob der lokale DVBViewer nach einer RS Aufnahmefunktion noch in Betrieb ist, denke ich.

Share this post


Link to post
Tüftler

Was noch ein Problem ist das ich DVBViewer nicht aus der Checkliste entfernen kann, die wird dann mit diesem Eintrag neu erstellt

Share this post


Link to post
nuts

Stimmt ich muss die Einträge in der DefaultINI rausnehmen.

Download nochmal aktualisiert.

 

"Windowmanger.isOverlay"

Kann man sich das nicht sparen, wenn der RS eigene Standbybefehl verwendet wird?

Dort müsste im DVBViewer dann eine Meldung kommen ob der PC wirklich in den Standby versetzt werden soll.

Ich kann das mit meinem TV-Server nur schlecht testen.

Share this post


Link to post
Tüftler

Würde schon gehen aber man kann auch schon vorher prüfen ob noch eine Wiedergabe läuft und so auf das Senden von standby gleich ganz verzichten.

Lassen wir es erstmal so, da ich denke das eine reine Audiowiedergabe damit nicht erschlagen werden würde.

Share this post


Link to post
Tüftler

So aktuelles Script im Anhang, Aufnahme aus Timeshift sollte jetzt auch sicher behandelt werden.

kurze Erläuterung:

Ist eine Aufnahme aus dem Timeshiftpuffer aktiv wird ermittelt wieviel Zeit zwischen aktueller Wiedergabeposition und dem Timeshiftende besteht.

Die Differenzzeit wird durch 18 geteielt, zum Timeshiftende gesprungen und das Script pausiert solange.

Dies soll ein sicheres Schreiben ermöglichen, falls es sich um ein langsames Speichermedium handelt. Ich habe mit einer Datenrate von 30Mbyte/s gerechnet.

Script gibt es jetzt hier > http://www.DVBViewer.tv/forum/topic/48512-erweitertes-beenden-v2-extended-exit-v2/page-6#entry386101

 

Zur Ermittlung einer Wiedergabe im DVBViewer ist WindowManager.isOverlay natürlich völliger Schwachsinn, richtig wäre OSD.isPlaying :whistle:

Edited by Tüftler

Share this post


Link to post
nuts

Ok ich schaus mir mal an.

Zur Ermittlung einer Wiedergabe im DVBViewer ist WindowManager.isOverlay natürlich völliger Schwachsinn, richtig wäre OSD.isPlaying :whistle:

Das war mir klar. :)

Einbauen würde sich sowas leicht lassen.

 

P.S. Wenn alles klappt würde ich mich freuen wenn du mal deine Beispielkonfig. für ein Setup mit lokalem RS anhängen würdest.

Edited by nuts

Share this post


Link to post
Tüftler

Achtung, da ist noch ein Fehler in meinem Script, habe zuviel aufgeräumt! Muss ich heute Abend nochmal ran.

Bin mit deinen Scripts noch nicht ganz durch, scheint aber zu funktionieren. Ich melde mich.

Share this post


Link to post
Tüftler

Anbei das überarbeitete Script: instantrecord.zip

 

Zum Austesten deiner beiden Scripte komme ich heute wohl wieder nicht, Aufnahmen laufen gerade.

Share this post


Link to post
nuts

Ok habs soweit durchgeschaut.


Ich schau mal das ich das direkt in mein Skript übersetze.

Einen Vorschlag wie der Befehl heissen soll?

 

P.S. Wenns ok ist (will mit meinen beschränkten "Skills" da nicht ungefragt den Klugscheisser spielen :D ) hätte ich auch ein paar Anmerkungen zu deinem Skript was den Programmierstil angeht.

Edited by nuts

Share this post


Link to post
Tüftler

Nur zu, ich mach das ja als Hobby, du kannst mich damit also nicht beleidigen :shifty:

Zum Namen fällt mir jetzt nichts brauchbares ein.

Share this post


Link to post
nuts

Bei mir ists auch nur Hobby, aber ein paar Dinge wurden mir anders gelernt.

 

1. Die do until Schleife:

Um durch ein Array oder eine "Collection" zu loopen würde ich eine For ... next bzw. For ... in Schleife verwenden.

Das geht auch rückwärts (z.B. step -1)

For i=10 to 0 step -1

....

next

Das macht den Code imho deutlich lesbarer.

 

2. Aus deinem Skript:

do until i < 1
InstantRecordingHandle
If CInt(DVBViewer.TimerManager.Item(Timernumber).ChannelNr) <> CInt(DVBViewer.Datamanager.Value("#ChannelNr_InstantRecording"&Timernumber)) Then
DVBViewer.Datamanager.Value("#ChannelNr_InstantRecording"&Timernumber) = ""
i = i - 1
Timernumber = Timernumber - 1
End If
WScript.Sleep(250)
loop

DVBViewer.TimerManager.Item(Timernumber).ChannelNr) => hier holst du dir in jeder Schleifenwiederholung die ganze Collection

Gewollt ist das soweit ich das überblickt habe nicht.

Besser so (Pseudo-Code):

dim DVBViewer, timermanager, count

 

DVBViewer=GetDVBVObject(DVBViewer)

timermanager=DVBViewer.timermanager

count=timermanager.count

for i=0 to count -1

timermanager.item.(i).ChannelNr

next

 

3. Globale Variablen in Funktionen ändern.

Mache ich auch ständig falsch, aber das sollte man, denke ich, möglichst vermeiden.

Besser die Variablen je nach Bedarf in der Hauptschleife zuordnen und die Funktion den gewünschten Wert zurückgeben lassen.

Sonst gibt das Spaghetti-Code (s. meine Scripte :lol: ) den man in einem Jahr nurnoch schwer lesen kann.

Edited by nuts

Share this post


Link to post
Tüftler

Und würgt die Aufnahme ab? Das wäre aber böse ...

Am besten der Powerknopf ruft innerhalb des DVBViewers mein Extended Exit Skript auf und außerhalb ALT+F4.

Falls iMon das so zulässt.

 

P.S. Der RS geht doch nur in den Away-Modus wenn während einer Aufnahme der Standby ausgelöst wurde.

Durch welche Aktion wird das ausgelöst? Durch den Power-knopf?

Nein, wenn der PC durch eine Aufnahme des RecService geweckt wird startet er ohne dass die Grafikausgabe aktiviert wird.

Wenn ich jetzt eine Taste der Fernbedienung drücke wird auch die Grafikausgabe gestartet und der Desktop erscheint.

Extended_Exit startet mir aber nicht den Viewer. Grund ist offensichtlich das dass HID-Gerät (Fernbedienung) kein Signal wie

PBT_APMRESUMESUSPEND auslösen kann. In der Systemsteuerung fehlt auch die Energieoption "Gerät kann.....".

 

Anders wenn ich eine Taste auf der USB-Tastatur drücke dort kommt es, zumindest reagiert dein Script.

 

Prinzipiell kann ich jede Taste auf den Powerknopf anlernen nur müsste Extended_Exit dann sowohl auf PBT_APMRESUMESUSPEND als auch auf einen Tastenbefehl reagieren können. Alt+F4 lässt zwar das "Power-Menü" erscheinen aber es erfolgt keine Reaktion durch dein Extended_Exit Script.

Gut wäre bspw. wenn es auch auf "Desktop anzeigen" also Windows+m reagieren könnte.

Share this post


Link to post
nuts
Extended_Exit startet mir aber nicht den Viewer. Grund ist offensichtlich das dass HID-Gerät (Fernbedienung) kein Signal wie

PBT_APMRESUMESUSPEND auslösen kann. In der Systemsteuerung fehlt auch die Energieoption "Gerät kann.....".

 

Anders wenn ich eine Taste auf der USB-Tastatur drücke dort kommt es, zumindest reagiert dein Script.

Hm das wundert mich jetzt schon etwas.

Meine MCE Remote ist auch ein HID-Device und PBT_APMRESUMESUSPEND wird abgefeuert.

 

Wenn du den PC aus dem richtigen Standby holst (über die Power-Taste) kommt die Nachricht an oder (=> "Resume" Sektion)?

Edited by nuts

Share this post


Link to post
nuts

Anbei mal ein Testskript für WM_POWERBROADCAST.

Kannst du das mal bei den Versuchen mitlaufen lassen und das log posten?

 

P.S. Das Debug-Skript nicht im Systemkonto starten!

WM_POWERBROADCAST_debug.zip

Edited by nuts

Share this post


Link to post
Tüftler

Anbei zwei Tests:

iMon Powertaste angelernt auf WinDesktop = startet im Viewer Modus dein Script, sonst wird "Desktop" gesendet

  • Viewer war in Betrieb und dein Script wird gestartet, schließt den Viewer
  • PC wird über die Powertaste der Fernbedienung gestartet (hierbei wird über die Platine das PWR-Signal gesendet!)
  • es kommt die Resume Meldung
  • Viewer wieder über dein Script schließen und Standby
  • Aufwachen durch RecService Aufnahme, PC läuft, Bild ist nicht an
  • Powertaste der Fernbedinung drücken, Desktop erscheint aber keine Resume Meldung!
iMon Powertaste angelernt auf Standby = startet im Viewer Modus dein Script, sonst wird "Standby" gesendet
  • Viewer war in Betrieb und dein Script wird gestartet, schließt den Viewer
  • Aufwachen durch RecService Aufnahme, PC läuft, Bild ist nicht an
  • Powertaste der Fernbedinung drücken, Standby wird gesendet und ausgeführt -> Aufnahme im Ar...!
  • schnell wieder über den Powerknopf starten
  • es kommt die Resume Meldung
Startup
7618.07391885668
1  -  hwnd=0x004105D0
1  -  msg=536
1  -  lParam0x00000000
2013/04/13 13:29:49  -  1  -   wParam=PBT_APMSUSPEND=0x00000004
2  -  hwnd=0x004105D0
2  -  msg=536
2  -  lParam0x00000000
2013/04/13 13:30:53  -  2  -   wParam=PBT_APMRESUMEAUTOMATIC=0x00000012
3  -  hwnd=0x004105D0
3  -  msg=536
3  -  lParam0x00000000
2013/04/13 13:32:10  -  3  -   wParam=PBT_APMSUSPEND=0x00000004
4  -  hwnd=0x004105D0
4  -  msg=536
4  -  lParam0x00000000
2013/04/13 13:32:28  -  4  -   wParam=PBT_APMRESUMEAUTOMATIC=0x00000012
5  -  hwnd=0x004105D0
5  -  msg=536
5  -  lParam0x00000000
2013/04/13 13:32:28  -  5  -  wParam=PBT_APMRESUMESUSPEND=0x00000007
Edited by Tüftler

Share this post


Link to post
nuts

Hm das ist wohl eine iMon Eigenart.

 

Also müsste mein Skript die "Resume" Sektion auf eine Tastenkombination ausführen?

Welche wäre dafür geeignet? Strg+R?

Share this post


Link to post
Tüftler

Na ja, zusätzlich zumindest. Wenn er mit der Fernbedienung aus dem Standby kommt passt das ja.

Evtl. kannst du auch nur auf den Tatsenbefehl warten wenn er aus Resumeautomatic kommt.

 

Welche Taste du nimmst ist mir eigentlich egal, anlernen kann ich alles (bis zu 3 Tasten-Kombinationen hintereinander).

 

Ich hatte auch versucht eine Kombi mit Maustaste zu senden (Makrobefehl) aber auch dort wird kein Resume ausgelöst.

Ansich ist die Software recht mächtig, aber einen Stolperstein findet man wohl immer.

Share this post


Link to post
nuts

Ok so machen wir es.

Sobald PBT_APMRESUMEAUTOMATIC ankommt wird ein Hotkey (Strg+r) registriert, der ebenso die Sektion "Resume" aufrufen kann.

 

Anbei eine neue Testversion. edit\ Neuste Version im Startpost

Edited by nuts

Share this post


Link to post
Tüftler

erstmal danke für deine Mühe,

 

Im Anhang das Log, Strg+r klappt irgendwie noch nicht

Edited by Tüftler

Share this post


Link to post
nuts

Hm okay. Jetzt blöd weil ich das bei mir nicht testen kann. Muss ich mal schaun.

Share this post


Link to post

Join the conversation

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

Guest
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...