Ankündigung

Einklappen
Keine Ankündigung bisher.

Ruhezustand möglich wenn TV aus geht?

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ruhezustand möglich wenn TV aus geht?

    Hallo zusammen,

    nach etwas stöbern bin ich auch auf dieses nette Forum gestoßen und hoffe das Ihr mir helfen könnt .

    Nach langem überlegen hab ich mir nun auch nen Mac Mini gekauft um ein HTPC im Wohnzimmer einzurichten. Installation usw. lief ja alles ohne Probs 10.8 hab ich gestern mal drauf gemacht, was allerdings nicht zwingend notwendig war...egal!

    Mein Problem ist...wenn man das überhaupt als Problem darstellen kann, das ich gerne hätte das mein Mac in Ruhemodus geht, sobald der TV aus geht (per TV Sleepfunktion) also während eig. noch ein Strom von Daten läuft...in meinem Fall z.B. Plex.

    Szenario: Abends noch per Plex ein Film gestartet und die Standardeinstellung von ca. 30 min (evtl. durch Script?) sagt: "Horch...wenn TV aus ist, gehste pennen!" - quasi wenn kein Signal per HDMI reinkommt = Gute N8! Da ich halt immer gerne beim TV gucken einpenne und mir nicht das standard TV Programm angucken will.

    Ob das möglich ist, weiß ich halt nicht. - Alternativ könnte ich sog. Sleeperapps installieren...womit ich mich aber auch noch net beschäftigt habe...da diese Wunschvorstellung doch wesentlich angenehmer wäre .

    Ausstattung:

    MM 2.5 i5 2011 angschlossen per HDMI
    QNAP NAS
    40" Sony Bravia
    etc. (diese Geräte tun diesem "Problem" nix zur Sache

    Zusätzlich noch eine andere Frage:

    Kann man den Mac in Ruhemodus schicken (nach festgelegter Zeit) obwohl BT Geräte angemeldet sind und ihn auch mit diesen aufwecken? - Den Punkt in der BT Systemeinstellung hab ich gefunden bez. "Ruhezustand beenden", aber wenn ich den Haken rausmach kann ich leider den Mac auch nicht mit den BT Geräten aufwecken.
    Bisher hab ich nur eine der beiden Versionen immer hingekriegt :( .

    So ich hoffe ich habe das einigermaßen verständlich beschrieben .

    Thx im voraus.

    Gruß

    Walter

  • #2
    Hallo Walter,

    das wird so leider nicht gehen. Dafür bräuchte es HDMI CEC, welches vom Mac jedoch nicht unterstützt wird. Aus gutem Grund, denn nicht jeder TV Hersteller implementiert CEC gleich.

    Das Ganze liesse sich aber evtl. über ein Standby Script erledigen. Der Mini könnte dann z.B. 15 Minuten nach Filmende in den Standby gehen. Hier gibt es einen Thread dazu: Klick! Du müsstest dann eigentlich nur genau beschreiben, welche Programme bei Dir zum Einsatz kommen. Wenn es sich nur um Plex und evtl. EyeTV handelt, dann ist das kein Problem. Ich würde Dir das Script entsprechend anpassen.

    lg

    Michael

    P.S.: Willkommen bei uns
    HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

    Kommentar


    • #3
      Wie lifeflow schon gesagt hat, erfordert das CEC, welches am Computer nicht umgesetzt werden kann. Man müsste zudem noch genau die Herstellerspezifischen Codes wissen. Das ist ein endloses und frustrierendes Thema. Besser wäre hier, bei Bedarf ein Skript zu starten, welches nach einer bestimmten Zeit den Mini in den Schlaf schickt.
      Meine Hardware: iPhone 6 Plus 128GB spacegrau; iPad Retina 64GB 3G + 16GB 3G; MacBook 12" 1,2GHz, 512GB SSD; MacBook Air 5,2 13" 1,8GHz i5, 128GB SSD, 4GB RAM; Amazon FireTV; Amazon Fire Stick
      Tuner: Elgato NetStream 4Sat
      PayTV-Hardware: 1x UniCam, 1x Diablo Cam LAN; Smargo Smartreader v2; OSCAM@RaspBerry Pi
      Airplay Lautsprecher: Sonos PlayBar; 2x Sonos Play:1; 1x Sonos Play:3
      Server: Qnap TS-653A mit 5x Hitachi Deskstar 7K4000 4TB HDD

      Kommentar


      • #4
        Hi,

        danke euch beiden erstmal für die Antworten und Hilfe.

        Auf dein Angebot würde ich gerne zurückkommen Michael, allerdings sind da noch ein paar Verständnisfragen diesbez.

        So wie ich das in dem anderen Fred verstanden habe, prüft das Script also ob irgendwas läuft, richtig?

        Kann das dann trotzdem so geschrieben werden das es erkennt wann ich es auch wirklich benötige...denn ich guck ja auch so mal über Plex ohne das ich will das es in Standby geht , oder müsste ich das dann immer sep. starten?

        EyeTV will ich auch implementieren...allerdings eig. nur als Aufnahmegerät für meine Tochter die sich ab und an irgendeine Kinderserie anschauen will wenn sie mal nicht da ist. - Ist also atm net so wichtig... aber es soll noch kommen...wie und in welchem umfang EYETV dann was autpmatisch machen soll weiß ich auch noch net.

        Also das Script sollte ca. so aussehen:

        MM bleibt solange an und arbeitsbereit solang man was macht...INET - Mails, FOTO, Bildbearbeitung, Filme (PLEX, VLC), Itunes für Mukke, etc.
        MM SOLL aber (ohne großen Aufwand wenn es geht ) wenn ich abends ins Bett gehe (wie oben beschrieben) nach ca. 30-60 min in Standby gehen - so stell ich meistens den Sleeper im TV ein. - Keine Ahnung ob das zuviel verlangt ist vom Script in diesen Bereichen zu unterscheiden oder ob ich in dem Falle des schlafen gehens dann noch was starten müsste - Aber hierzu könnte ich ja auch noch alternativ eine APP installen die dann nach bestimmter Zeit die Kiste ausmacht. - Allerdings müsste ich hierzu nochmal LION installen da die Apps noch nicht auf ML umgebaut wurden. <- ISt aber auch net so wild atm.

        Wie ist das mit der BT Maus und der Tastatur kann man das auch mit einem Script lösen das sie den MM aus dem Ruhestand holen aber nicht daran hindern ihn in Ruhestand zu schicken?

        Sorry für die vielen Fragen .

        Thx und Gruß

        Walter

        Kommentar


        • #5
          Hallo Walter,

          für so ein Script gibt es mehrere Möglichkeiten, und leider auch ein paar Einschränkungen. Damit das zuverlässig funktioniert, müssen die zu überwachenden Programme ihren Status melden. Im Falle von Plex oder iTunes z.B., muss das Programm mitteilen können ob es gerade etwas abspielt. Bei Plex ist das kein Problem. iTunes würde sich auch in den Griff bekommen lassen, sofern es ich nicht um LAN Streaming handelt. Bei iNet, Mails, Foto bin ich mir jedoch fast sicher, dass sich da nichts machen lässt. Hier kann ich nur ermitteln, ob ein Programm gestartet ist. Das würde für Dich bedeuten, dass Du immer alle Programme vollständig beenden müsstest - keine gute Lösung. Wir könnten aber einen ganz anderen Ansatz verfolgen.

          Wenn ich Dich richtig verstanden habe, dann geht es Dir hauptsächlich um die Abendstunden. Hier gäbe es mehrere Lösungsansätze. Ich könnte das Script so schreiben, dass es z.B. nur Plex und EyeTV überwacht. Am Abend startest Du das Script, bevor Du einen Film anschaust. Das Script merkt, wenn die Plex Wiedergabe beendet wurde und fährt den Mini in den Standby.

          Eine andere Variante wäre, dass das Script immer im Hintergrund läuft, aber der Standby nur zu vorgerückter Stunde aktiviert wird. Also z.B. nach 22:00 Uhr. In diesem Fall wäre kein manueller Eingriff von Deiner Seite nötig. Das Script würde am Abend den Status von Plex, EyeTV und evtl. iTunes überprüfen. Bei Inaktivität wird der Mini in den Standby geschickt.

          Man könnte das Script auch mit einem bestimmten Programm verknüpfen, z.B. mit Plex. Also in der Art:

          Wenn Plex nach 20:00 Uhr gestartet wird, dann aktividert sich auch das Script. Es prüft die Aktivitäten von Plex, iTunes und EyeTV. Bei Inaktivität: Standby.

          Das wären so meine ersten Vorschläge. Was meinst Du dazu? Ich werde aber auf jeden Fall mal noch überprüfen, ob ich die anderen Programme auch noch in die Auswertung aufnehmen kann.

          Wenn der Standby über das Script getriggert wird, dann wird dieser auch nicht durch Bluetooth Geräte verhindert. Es wäre jedoch möglich, dass der Mini ungewollt durch ein BT Gerät aufgeweckt wird. Das lässt sich leider nicht verhindern. Es sein denn, mann deaktiviert diese Option in den Systemeinstellungen.

          lg

          Michael
          HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

          Kommentar


          • #6
            Hallo Michael,

            vielen Dank für die Mühe, da ich vom scripten keinen Plan habe inwiefern sowas "Mühe" macht, bin ich da leider ein Laie drin . Trotzdem "Dickes Danke" schonmal vorab.

            1. Spielt es eine Rolle wenn Eyetv noch nicht installiert ist - also für das Script - nicht das das eine Fehlermeldung bringt irgendwo, da es mom. EYETV noch nicht findet?

            2. Wäre es möglich das das Script z. B. checkt...Mal angenommen ich gucke tagsüber PLEX und penn ein, - Script läuft an und checkt nach einer bestimmten Zeit, ca. 5 min Plex - "In Plex hat sich die letzten 5 min nix getan (nach beendetem Film wohlbemerkt) OK - schicke ich den MM in Ruhezustand! - Dann würde es theor. die Zeit überbrücken sollte ich nachmittags mal "einpennen" und müsste nicht nacht best. Uhrzeit erst starten und ich hätte es perm. am laufen - und wenn ich doch noch andere Folgen oder Filme gucken will dürfte es da Script ja nicht stören da ich ja eine neue Aktivität begonnen habe.

            Ich denke wenn man Eyetv und Plex erstmal integriert sollte das langen. Da ich abends eig. kein iTunes starte. - Alternativ bleiben immer noch andere Macs und iDevices zur Verfügung.

            3. BT hab ich deaktiviert und alternativ eine nicht Apple Maus drangefeuert die per Funk läuft die würde dann erst bei Bewegung den MM aufwecken...aber ich kann da ja dann mit dem Script und beiden BT Devices mal testen.

            Die standard Einstellungen mit "Energie sparen" langt ja eig. für den normalen Gebrauch...habs auf 1 min gestellt da er ja nicht immer läuft bzw. an ist von daher braucht er eig. nie lange an zu sein.

            Thx und Gruß

            Walterx

            Kommentar


            • #7
              Hallo Walter,



              Zitat von Tauruz Beitrag anzeigen
              1. Spielt es eine Rolle wenn Eyetv noch nicht installiert ist - also für das Script - nicht das das eine Fehlermeldung bringt irgendwo, da es mom. EYETV noch nicht findet?
              Ja, das würde eine Fehlermeldung geben. Ist aber kein Problem. Ich liefere Dir eine EyeTV Dummy App mit. Also ein kleines Programm ohne Funktion, wleches den Namen der EyeTV Anwendung trägt. Das ist ausreichend. Wenn Du EyeTV dann irgendwann installierst, musst Du nur die Dummy App vorher löschen. Auf diese Weise kann ich den EyeTV Code gleich im Script lassen.

              2. Wäre es möglich das das Script z. B. checkt...Mal angenommen ich gucke tagsüber PLEX und penn ein, - Script läuft an und checkt nach einer bestimmten Zeit, ca. 5 min Plex - "In Plex hat sich die letzten 5 min nix getan (nach beendetem Film wohlbemerkt) OK - schicke ich den MM in Ruhezustand! - Dann würde es theor. die Zeit überbrücken sollte ich nachmittags mal "einpennen" und müsste nicht nacht best. Uhrzeit erst starten und ich hätte es perm. am laufen - und wenn ich doch noch andere Folgen oder Filme gucken will dürfte es da Script ja nicht stören da ich ja eine neue Aktivität begonnen habe.
              Im habe schon mal etwas für Dich vorbereitet. Im Anhang findest Du ein Archiv mit folgendem Inhalt:

              - checkidle.app
              - EyeTV.app

              checkidle.app ist das erwähnte Script als direkt ausführbare Datei. EyeTV.app ist das Dummy File für die noch nicht vorhandene EyeTV Anwendung. Kopiere beide Dateien in den Programme Ordner. Starte nun zunächst die EyeTV.app. Nachdem Du die Warnung "Wurde aus dem Internet geladen..." quittiert hast, sollte ein Popup mit der Meldung "Hallo Welt" aufgehen. Mehr macht diese App nicht. Nun kannst Du die checkidle App starten. Auch hier musst Du die Warnmeldung quittieren.

              Das Script läuft nun permament im Hintergrund. Nach ca. 5 Minuten solltest Du die Datei "CheckIdle.txt" in Deinem Home Ordner vorfinden. Hier landen in Zukunft alle Logeinträge des Scripts.

              Das Script läuft endlos. Mit jedem Durchlauf werden folgende Punkte getestet:


              1. Plex

              - Ist Plex aktiv?
              - Wird gerade etwas abgespielt?

              Der Check, ob etwas abgespielt wird, wiederholt sich 5 mal. Jede Wiederholung ist um 1 Minute verzögert. Das entspricht einer Verzögerung von 5 Minuten. Wird innerhalb der 5 Minuten keine Aktivität festgestellt, dass wird der Sleep freigegeben.


              2. EyeTV

              - Ist EyeTV aktiv?
              - Ist EyeTV die Anwendung im Vorgergrund?
              - Zeichnet EyeTV gerade auf?

              Wenn EyeTV im Vordergrund ist, dann kann man davon ausgehen, dass gerade Live-TV oder eine Aufzeichnung angeschaut wird. In diesem Fall wird ein Sleep verhindert. Auch dann, wenn gerade eine Aufzeichnung durchgeführt wird. Wenn nichts davon zutrifft, oder EyeTV gar nicht gestartet ist, dcann wird der Standby freigegeben.

              3. iTunes

              - Ist iTunes Aktiv?
              - Wird gerade etwas abgespielt?

              Hier gelten die gleichen Anmerkungen wie bei Plex. iTunes wird nach den selben Regeln behandelt.


              Das Script selbst läuft endlos, wie bereits gesagt. Jeder Durchlauf des Scripts ist um 5 Minuten verzögert, damit es nicht eine permanente Last erzeugt. Daraus ergibt sich folgende Rechnung:

              5 Minuten Verzögerung Hauptscript + 5 Minuten Verzögerung Check Plex + 5 Minuten Verzögerung Check iTunes = 15 Minuten.

              Der Mini wird also nach ca. 15 Minuten Inaktivität in Plex, iTunes und EyeTV in den Standby gehen (+/- 5 Minuten Toleranz). Sollte der Mini innerhalb von 3 Minuten wieder aus dem Sleep werwachen, dann wird von einem ungeplanten Wakeup ausgegangen. In diesem Fall wird der Slepp erneut getriggert.

              Andere Programme, wie z.B. Mail, iPhoto, etc. werden dabei noch nicht berücksichtigt! Das bedeutet: wenn Du in einer anderen Anwendung als den 3 überwachten arbeitest, dann merkt das Script davon nichts. Der Mini geht nach Ablauf der Tests ohne Vorwarnung in den Standby!

              Und noch ein Hinweis: das Script lässt sich nur durch das "Sofort beenden" Menü (Tasten ALT + CMD + ESC) beenden.


              Teste das doch erst mal so. Ich werde weiter nach Möglichkeiten suchen, andere Programme einzubinden (z.B. Mail, Safari, ...). Sobald (falls) ich dazu eine Idee habe, werde ich das Script ausbauen

              lg

              Michael

              P.S.: Das Script ist in dieser Form noch nicht ausführlich getestet. Bitte gib Bescheid ob alles funktioniert.

              Archiv.zip
              HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

              Kommentar


              • #8
                Hallo Michael,

                erstmal danke für deine Mühen...ich werde es evtl. heut abend mal testen oder spät morgen...da ich die nxt 2 days frei hab.

                Werde auf jedenfall Rückmeldung geben.

                Thx und Gruß

                Walter

                Kommentar


                • #9
                  So hab es doch schonmal checken können...

                  Was mir aufgefallen ist das es nach PLEX MEDIA SERVER sucht...also nach ein paar Minuten...Sry ich meinte natürlich nur PLEX - der Server läuft auf dem NAS - auf dem Mac läuft nur der Client, den ich auch nicht auswählen kann, denn der ist ausgegraut sobald dieses Fenster danach fragt.

                  Gruß

                  Walter

                  Kommentar


                  • #10
                    Hallo Walter,

                    welche Plex Version verwendest Du? Verstehe ich das richtig, der Plex Mediaserver läuft direkt auf dem NAS? Versuch es mal mit der Script Version aus dem Anhang. Hier habe ich den Code für den lokalen PMS entfernt.

                    lg

                    Michael

                    checkidle.app.zip
                    HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

                    Kommentar


                    • #11
                      Hi Michael,

                      alsoo. Ich benutze den neuesten Plex fürn Mac 9.5.3 (Client) - richtig der Plex Server läuft auf dem QNAP Nas.

                      Script läuft nun an und fragt auch nicht nach Plex.

                      Was mir aufgefallen ist, das er alles checkt wie er auch soll und dann auch auf jeden Fall in Standby nach 5 min geht...allerdings macht er auch keinen Unterschied ob ich mit der Maus oder Tastatur irgendeine Eingabe mache. d.h. wenn das script eh 24/7 läuft wäre das ein nerviges Prozedere. In deinem Text stand aber das er immer wieder 5 min checkt, oder meintest du nur wenn Plex laufen würde das es ca 15-20 min dauert?

                      Diesen "unerwarteten" Abbruch innerhalb 3 min kannst du ruhig ausschalten…Netzwerkpings hatte ich ausgeschaltet damit er nicht dadurch geweckt wird und das Script schaltet auch dann wunderbar in Standby auch wenn BT Geräte an sind…und vor allem läßt der MM sich dann auch wieder durch diese aufwecken…also das funkt gut.

                      Kann man das implementieren das er auf die eingabe von Maus und Tastatur registriert?

                      Gruß

                      Walter

                      Kommentar


                      • #12
                        Hallo Walter,

                        hier zeigen sich eindeutig die Schwächen des Scripts. Es war ursprünglich für reine Mediacenter Systeme entworfen. Da wird normalerweise nicht mit Tastatur / Maus gearbeitet und es kommen i.d.R. nur wenige Programme zum Einsatz. EyeTV, Plex & Co. lassen sich prima per Applescript belauschen. Mail, Safari usw. sind hier sehr schweigsam. Wir probieren es aber trotzdem mal.

                        Den 5 Minuten Check (5 Durchläufe) bei Plex und iTunes gibt es nur wen eine der Anwendungen gestartet ist. Ziel des Scripts ist es, das System bei Nichtgebrauch so schnell wie möglich in den Standby zu bekommen. Im Idealfall (keine der Anwendungen Plex, iTunes, EyeTV ist gestartet) geht der Mini also 5 Minuten nach dem Start des Scripts in den Standby. Die Zeit verlängert sich jeweils um 5 Minuten, wenn die Anwendunge Plex oder iTunes gestartet sind. EyeTV hat keinen Einfluss darauf. Denn bei EyeTV spielt es keine Rolle, ob etwas abgespielt wird. Der Standby wird in jedem Fall verhindert, wenn EyeTV im Vordergrund ist oder eine Aufzeichnung läuft.

                        Im Anhang findest Du eine neue Scriptversion. Den 2. Standby Trigger (bei Wakeup innerhalb 3 Minuten) habe ich entfernt. Ausserdem habe ich eine Auswertung eingebaut, die eine Aktivität von Maus / Tastatur erkennen sollte. Es gibt jetzt also die zusätzliche Bedingung, dass der Standby nur dann getriggert wird wenn Maus und Tastatur 5 Minuten lang nicht benutzt wurden.

                        Der Code ist aber noch experimentell. Ich weiss auch nicht, ob das mit Bluetooth Peripheriegeräten klappt. Testen kann ich das nicht, da ich USB Eingabegeräte benutze.. Also bitte mal ausprobieren

                        lg

                        Michael

                        checkidle.app.zip
                        HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

                        Kommentar


                        • #13
                          Hi Michael,

                          So läuft es richtig gut...auch mit den BT Geräten ist es genauso wie ich wollte. Also brauhc ich keine andere Hardwa mehr dazukaufen.
                          Das einzige was mich nur wundert ist das der Trigger immer unterschiedlich startet...kann man das irgendwie nachvollziehen? Also manchmal ab ca 7-8 min dann manhmal etwas früher...ist das beabsichtigt?

                          Ist es ein großer Aufwand noch weitere Apps reinzubauen...denn letztens beim Film gucken über VLC ist der natürlich in den Standby gegangen .

                          aber ich würde evtl. in Zukunft noch weitere Apps hinzufügen...kann ich das dann ggfls. auch selber machen?

                          Aber so läuft es schon mal super.

                          thx vielmals.

                          Gruss

                          Walter

                          Kommentar


                          • #14
                            Hallo Walter,

                            Zitat von Tauruz Beitrag anzeigen
                            So läuft es richtig gut...auch mit den BT Geräten ist es genauso wie ich wollte.
                            Das freut mich sehr

                            Das einzige was mich nur wundert ist das der Trigger immer unterschiedlich startet...kann man das irgendwie nachvollziehen?
                            Das ist zwar nicht beabsichtigt, aber durchaus normal. Die unterschiedlichen Zeiten ergeben sich aus dem Aufbau des Scripts.

                            Das Script selbst läuft in einer Endlosschleife. Jeder Durchlauf ist um 5 Minuten verzögert. D.h. das Script läuft durch und erledigt alle eingebauten Checks (Plex, iTunes. etc.). Anschliessend verharrt es für 5 Minuten in Starre. Dann läuft es erneut durch, usw. Wenn Du jetzt z.B. in Plex einen Film schaust und die Wiedergabe beendest, dann ist Plex zwar gestartet aber idle. Sobald die 5 Minuten Hauptverzögerung abgelaufen sind, würde das Script dies beim Plex Check erkennen und dort den fünfmaligen Idle Check durchführen. Diese Zeit muss zur Hauptverzögerung dazugezählt werden. Gleiches gilt, wenn iTunes gestartet ist. Auch hier wird ein fünfmaliger Check durchgeführt. Wann der Mini nun in den Standby geht, hängt ganz davon ab welche Programme gestartet sind, und an welcher Stelle in der Hauptverzögerung Du auf "Stopp" gedrückt hast.

                            Ein Bespiel:

                            Du schaust einen Film in Plex und beendest Du die Wiedergabe. Die Hauptverzögerung im Script war da schon 3:30 aktiv. Also beträgt die Restzeit bis zum Ende der Verzögerung noch 1:30. Dann läuft das Script durch, erkennt die gestartete Plex Anwendung im Idle, führt den fünfmaligen Idle Chek durch, und schickt den Mini in den Standby. Das wäre dann nach 6:30 (1:30 Rest Hauptverzögerung + 5 Min. Plex Idle Check). Wäre das Script an diesem Punkt gerade erst mit dem Durchlauf fertig geworden und in die Hauptverzögerung gelaufen, dann wäre der Standby im Extremfall erst nach 10 Minuten erflogt (5 Min. Hauptverzögerung + 5 Min. Plex Idle Check). Wenn iTunes und Plex gleichzeitig gestartet sind, dann müsste man die 5 Min. für den iTunes Idle Check noch hinzuzählen. Dazu kommt noch die Bedingung für die Eingabegeräte. Auch hier ist der Standby erst dann möglich, wenn diese mind. 5 Minuten nicht bedient wurden.

                            Zwischen 5 Minuten und 20 Minuten ist also alles möglich. Das hängt davon ab welche Anwendungen gestartet sind und wann Du die Eingabegeräte zuletzt benutzt hast. Genauer lässt sich das nicht eingrenzen. Denn die Anwendungen / Eingabegeräte melden nicht von sich aus "Idle" sondern müssen abgefragt werden. Das Script ist also nicht Ereignisgesteuert, sondern folgt einem fest vorgegeben Ablauf und Zeitplan.

                            Ist es ein großer Aufwand noch weitere Apps reinzubauen...denn letztens beim Film gucken über VLC ist der natürlich in den Standby gegangen .
                            Im Anhang findest Du eine Version mit VLC Abfrage.

                            aber ich würde evtl. in Zukunft noch weitere Apps hinzufügen...kann ich das dann ggfls. auch selber machen?
                            Im Prinzip schon. Das setzt aber Apple Script Kenntnisse voraus. Ausserdem muss die zu überwachende Anwendung ihren Status per Applescript preisgeben. Sonst wird das nicht klappen. Ich kann mal am Beispiel VLC verdeutlichen, was dafür nötig ist. Zunächst mal der Source Code des Scripts:

                            Code:
                            set logevents to 2 as number --- 0 = AUS  1 = Standard  2 = Erweitert
                            set logpath to (path to home folder) & "CheckIdle.txt" as string
                            set idleTest to 300
                            
                            repeat
                                set eventtolog to (current date) & "   ---   CheckIdle started... delay 5 min." as text
                                writelogfile(eventtolog, logevents, logpath)
                                
                                do shell script "sleep 300"
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   Reset Vars" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                set checkpath to "/users/lifeflow/Downloads/Temp" as text
                                set numberofclients to 0 as number
                                set ipoffset to "192.168.0." as text
                                set clientoffset to 20 as number
                                set plexbmcport to "3000" as text
                                
                                set pingresult to " " as text
                                set ipclient to " " as text
                                set clientalive to 0 as number
                                set condition1 to "Nothing Playing" as text
                                set gosleep to 0 as number
                                set xbmcalive to 0 as number
                                set plexalive to 0 as number
                                set vlcalive to 0 as number
                                set eyetvalive to 0 as number
                                set itunesalive to 0 as number
                                set eyetvrecording to 0 as number
                                set xbmcevent to 0 as number
                                set pathempty to 0 as number
                                set app_name to "" as text
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   Check Progs Alive" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                tell application "System Events"
                                    get every process
                                    if exists application process "XBMC" then
                                        set xbmcalive to 1 as number
                                    else
                                        set xbmcalive to 0 as number
                                    end if
                                    if exists application process "Plex" then
                                        set plexalive to 1 as number
                                    else
                                        set plexalive to 0 as number
                                    end if
                                    if exists application process "EyeTV" then
                                        set eyetvalive to 1 as number
                                    else
                                        set eyetvalive to 0 as number
                                    end if
                                    if exists application process "iTunes" then
                                        set itunesalive to 1 as number
                                    else
                                        set itunesalive to 0 as number
                                    end if
                                    if exists application process "VLC" then
                                        set vlcalive to 1 as number
                                    else
                                        set vlcalive to 0 as number
                                    end if
                                    set app_name to name of the first process whose frontmost is true
                                end tell
                                if app_name is "EyeTV" then
                                    set gosleep to gosleep + 1 as number
                                    set eventtolog to (current date) & "   ---   EyeTV is frontmost - keep alive" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   Start Check Plex" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if xbmcalive = 1 or plexalive = 1 then
                                    repeat 5 times
                                        try
                                            set xbmcevent to (do shell script "curl http://127.0.0.1:" & plexbmcport & "/xbmcCmds/xbmcHttp?command=GetCurrentlyPlaying") as text
                                            set xbmcevent to word 8 of xbmcevent & " " & word 9 of xbmcevent
                                            if xbmcevent = condition1 then
                                                set xbmcevent to 0 as number
                                            else
                                                set xbmcevent to 1 as number
                                            end if
                                        end try
                                        set gosleep to gosleep + xbmcevent as number
                                        do shell script "sleep 60"
                                    end repeat
                                    if app_name is not "EyeTV" and gosleep > 0 then
                                        set eventtolog to (current date) & "   ---   Plex / xbmc ist busy" as text
                                        writelogfile(eventtolog, logevents, logpath)
                                    end if
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check Plex" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check EyeTV" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if eyetvalive = 1 then
                                    tell application "EyeTV"
                                        set limit to 10 * minutes
                                        set ausmachen to true
                                        set vorlauf to (prepad time + 2) * minutes
                                        set jetzt to current date
                                        repeat with aufnahme in start time of programs
                                            set diff to aufnahme - jetzt
                                            if diff ≥ vorlauf then set diff to diff - vorlauf
                                            if diff ≥ 0 and diff ≤ limit then set ausmachen to false
                                        end repeat
                                        set recordCount to count (recordings whose busy is true)
                                        if is_recording = false and ausmachen = true and recordCount is not greater than 0 then
                                            set eyetvrecording to 0 as number
                                        else
                                            set eyetvrecording to 1 as number
                                        end if
                                    end tell
                                    if eyetvrecording > 0 then
                                        set eventtolog to (current date) & "   ---   EyeTV is busy" as text
                                        writelogfile(eventtolog, logevents, logpath)
                                    end if
                                    set gosleep to gosleep + eyetvrecording as number
                                end if
                                
                                set pathempty to (do shell script "ls -l " & checkpath & " | wc -l") as number
                                if pathempty > 0 then
                                    set eventtolog to (current date) & "   ---   path not empty" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    set gosleep to gosleep + 1
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check EyeTV" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check Ping" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                repeat numberofclients times
                                    set ipclient to clientoffset as text
                                    set pingresult to " " as text
                                    try
                                        set pingresult to (do shell script "ping -c 1 -t 3 " & ipoffset & ipclient)
                                    end try
                                    if pingresult > " " then
                                        set gosleep to 1
                                        set eventtolog to (current date) & "   ---   client " & ipoffset & ipclient & " is awake" as text
                                        writelogfile(eventtolog, logevents, logpath)
                                    end if
                                    set clientoffset to clientoffset + 1
                                end repeat
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check Ping" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check iTunes" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if itunesalive = 1 then
                                    repeat 5 times
                                        tell application "iTunes"
                                            set plstate to player state as text
                                            if plstate = "stopped" or plstate = "paused" then
                                                set gosleep to gosleep + 0
                                            else
                                                set eventtolog to (current date) & "   ---   iTunes is busy" as text
                                                writelogfile(eventtolog, logevents, logpath)
                                                set gosleep to gosleep + 1
                                            end if
                                        end tell
                                        do shell script "sleep 60"
                                    end repeat
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check iTunes" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check VLC" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if vlcalive = 1 then
                                    repeat 5 times
                                        tell application "System Events"
                                            tell process "VLC"
                                                tell menu 1 of menu bar item "Wiedergabe" of menu bar 1
                                                    get title of menu item 1
                                                    set play_pause_btn to the result
                                                    get enabled of menu item 2
                                                    set stop_enabled to result
                                                end tell
                                            end tell
                                        end tell
                                        set gosleep to gosleep + 0
                                        if stop_enabled is true and play_pause_btn is "pause" then
                                            try
                                                tell application "VLC"
                                                    set theTitle to name of first window whose id is not -1 and name is not "VLC media player" and zoomable is true
                                                    set gosleep to gosleep + 1
                                                end tell
                                            end try
                                        end if
                                        do shell script "sleep 60"
                                    end repeat
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check VLC" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check HID" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                set idleTime to idle_time()
                                set old_delims to AppleScript's text item delimiters
                                set AppleScript's text item delimiters to "."
                                set idleTime to ((first text item of idleTime as string) as integer)
                                set AppleScript's text item delimiters to old_delims
                                set idleTest to (idleTest as integer)
                                if idleTime is greater than idleTest then
                                    set gosleep to gosleep + 0
                                else
                                    set gosleep to gosleep + 1
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check HID" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    set eventtolog to (current date) & "   ---   Start Check Gosleep" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                if gosleep = 0 then
                                    set sleep_date to current date
                                    set eventtolog to (current date) & "   ---   System is idle - send standby trigger..." as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    tell application "System Events"
                                        set TheApp to item 1 of (get name of processes whose frontmost is true)
                                    end tell
                                    
                                    tell application "System Events" to sleep
                                    do shell script "sleep 30"
                                    
                                    set eventtolog to (current date) & "   ---   System Wakeup" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    tell application TheApp to activate
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check Gosleep" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                            end repeat
                            
                            on writelogfile(eventtolog, logevents, logpath)
                                if logevents > 0 then
                                    set RefNum to (open for access file logpath with write permission)
                                    with timeout of 60 seconds
                                        tell application "Finder"
                                            try
                                                write eventtolog & return to RefNum starting at ((get eof RefNum) + 1)
                                                close access RefNum
                                            on error
                                                close access RefNum
                                            end try
                                        end tell
                                    end timeout
                                end if
                            end writelogfile
                            
                            on idle_time()
                                set idleTime to (do shell script "ioreg -c IOHIDSystem | perl -ane 'if (/Idle/) {$idle=(pop @F)/1000000000; print $idle,\"\";last}'")
                                return idleTime
                            end idle_time
                            Das Script ist in verschiedene Funktionsbereiche unterteilt. In den ersten 3 Zeilen wird festgelegt, welche Art Logfile (Kein / Standard / Erweitert) geschrieben werden soll, und wo es abzulegen ist. Ausserdem wird hier bestimmt, wie lange die Eingabegeräte Idle sein müssen. Nach dem ersten Repeat Statement beginnt das eigentliche Script. Im ersten Teil werden die Variablen geleert, bzw. auf einen definierten Zustand gesetzt:

                            Code:
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   Reset Vars" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                                
                                set checkpath to "/users/lifeflow/Downloads/Temp" as text
                                set numberofclients to 0 as number
                                set ipoffset to "192.168.0." as text
                                set clientoffset to 20 as number
                                set plexbmcport to "3000" as text
                                
                                set pingresult to " " as text
                                set ipclient to " " as text
                                set clientalive to 0 as number
                                set condition1 to "Nothing Playing" as text
                                set gosleep to 0 as number
                                set xbmcalive to 0 as number
                                set plexalive to 0 as number
                                set vlcalive to 0 as number
                                set eyetvalive to 0 as number
                                set itunesalive to 0 as number
                                set eyetvrecording to 0 as number
                                set xbmcevent to 0 as number
                                set pathempty to 0 as number
                                set app_name to "" as text
                            Hier müsstest Du die Variablen, die Du für die zusätzliche Programme benötigst, einpflegen.

                            Im nächsten Teil wird ermittelt, welche Anwendungen überhaupt laufen:

                            Code:
                                tell application "System Events"
                                    get every process
                                    if exists application process "XBMC" then
                                        set xbmcalive to 1 as number
                                    else
                                        set xbmcalive to 0 as number
                                    end if
                                    if exists application process "Plex" then
                                        set plexalive to 1 as number
                                    else
                                        set plexalive to 0 as number
                                    end if
                                    if exists application process "EyeTV" then
                                        set eyetvalive to 1 as number
                                    else
                                        set eyetvalive to 0 as number
                                    end if
                                    if exists application process "iTunes" then
                                        set itunesalive to 1 as number
                                    else
                                        set itunesalive to 0 as number
                                    end if
                                    if exists application process "VLC" then
                                        set vlcalive to 1 as number
                                    else
                                        set vlcalive to 0 as number
                                    end if
                                    set app_name to name of the first process whose frontmost is true
                                end tell
                                if app_name is "EyeTV" then
                                    set gosleep to gosleep + 1 as number
                                    set eventtolog to (current date) & "   ---   EyeTV is frontmost - keep alive" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if
                            Danach folgen die Check Blöcke für die einzelnen Anwendungen. Hier mal z.B. für Plex / XBMC:

                            Code:
                                if xbmcalive = 1 or plexalive = 1 then
                                    repeat 5 times
                                        try
                                            set xbmcevent to (do shell script "curl http://127.0.0.1:" & plexbmcport & "/xbmcCmds/xbmcHttp?command=GetCurrentlyPlaying") as text
                                            set xbmcevent to word 8 of xbmcevent & " " & word 9 of xbmcevent
                                            if xbmcevent = condition1 then
                                                set xbmcevent to 0 as number
                                            else
                                                set xbmcevent to 1 as number
                                            end if
                                        end try
                                        set gosleep to gosleep + xbmcevent as number
                                        do shell script "sleep 60"
                                    end repeat
                                    if app_name is not "EyeTV" and gosleep > 0 then
                                        set eventtolog to (current date) & "   ---   Plex / xbmc ist busy" as text
                                        writelogfile(eventtolog, logevents, logpath)
                                    end if
                                end if
                            Für jede Anwendung gibt es einen solchen Block. Immer etwas unterschiedlich, weil die Anwendungen mit ihren speziellen Befehlen angesprochen werden wollen.

                            Hinter diesen Blöcken folgt der Teil, der den Standby triggert:

                            Code:
                                if gosleep = 0 then
                                    set sleep_date to current date
                                    set eventtolog to (current date) & "   ---   System is idle - send standby trigger..." as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    tell application "System Events"
                                        set TheApp to item 1 of (get name of processes whose frontmost is true)
                                    end tell
                                    
                                    tell application "System Events" to sleep
                                    do shell script "sleep 30"
                                    
                                    set eventtolog to (current date) & "   ---   System Wakeup" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                    
                                    tell application TheApp to activate
                                end if
                                
                                if logevents = 2 then
                                    set eventtolog to (current date) & "   ---   End Check Gosleep" as text
                                    writelogfile(eventtolog, logevents, logpath)
                                end if

                            Fortsetzung folgt...
                            Zuletzt geändert von lifeflow; 03.08.2012, 01:19.
                            HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

                            Kommentar


                            • #15
                              Zum Schluss folgen noch zwei Unterprogramme. Das erste Programm schreibt ins Logfile. Das Zweite Prog ermittelt die Idle Zeit für die Eingabegeräte:

                              Code:
                              on writelogfile(eventtolog, logevents, logpath)
                                  if logevents > 0 then
                                      set RefNum to (open for access file logpath with write permission)
                                      with timeout of 60 seconds
                                          tell application "Finder"
                                              try
                                                  write eventtolog & return to RefNum starting at ((get eof RefNum) + 1)
                                                  close access RefNum
                                              on error
                                                  close access RefNum
                                              end try
                                          end tell
                                      end timeout
                                  end if
                              end writelogfile
                              
                              on idle_time()
                                  set idleTime to (do shell script "ioreg -c IOHIDSystem | perl -ane  'if (/Idle/) {$idle=(pop @F)/1000000000; print $idle,\"\";last}'")
                                  return idleTime
                              end idle_time

                              Nun nochmals konkret zu unserem Beispiel VLC. Dafür musste ich folgende Teile einfügen:

                              1. Scriptteil / Variablendefinition
                              Code:
                              set vlcalive to 0 as number
                              2. Scriptteil / Lifecheck
                              Code:
                                      if exists application process "VLC" then
                                          set vlcalive to 1 as number
                                      else
                                          set vlcalive to 0 as number
                              3.1 Text für Logfile Teil 1
                              Code:
                                      set eventtolog to (current date) & "   ---   Start Check VLC" as text
                                      writelogfile(eventtolog, logevents, logpath)
                                  end if
                              3.2 Idlecheck (die eigentliche Kernfunktion)
                              Code:
                                  if vlcalive = 1 then
                                      repeat 5 times
                                          tell application "System Events"
                                              tell process "VLC"
                                                  tell menu 1 of menu bar item "Wiedergabe" of menu bar 1
                                                      get title of menu item 1
                                                      set play_pause_btn to the result
                                                      get enabled of menu item 2
                                                      set stop_enabled to result
                                                  end tell
                                              end tell
                                          end tell
                                          set gosleep to gosleep + 0
                                          if stop_enabled is true and play_pause_btn is "pause" then
                                              try
                                                  tell application "VLC"
                                                      set theTitle to name of first window whose id is not -1 and name is not "VLC media player" and zoomable is true
                                                      set gosleep to gosleep + 1
                                                  end tell
                                              end try
                                          end if
                                          do shell script "sleep 60"
                                      end repeat
                                  end if
                              3.2 Text für Logfile Teil 2
                              Code:
                                  if logevents = 2 then
                                      set eventtolog to (current date) & "   ---   End Check VLC" as text
                                      writelogfile(eventtolog, logevents, logpath)
                              An welchen Stellen das alles eingebaut werden muss, kannst Du dem Hauptlisting im vorhergehenden Posting entnehmen.

                              Wenn Du über Apple Script Kenntnisse verfügst, dann sollte das kein grösseres Problem sein. Der schwierige Teil daran ist herauszufinden, wie Du den Apps verwertbare Statusinformationen entreissen kannst. Bei Programmen wie iTunes, VLC und EyeTV ist das kein Problem. Die bieten eine gute AS Unterstützung. Bei Plex / XBMC oder den Eingabegeräten kann das durchaus recht kompliziert werden. Oft geht das nur durch Hintertürchen.

                              Falls Du noch Fragen dazu hast, immer her damit

                              lg

                              Michael

                              checkidle.app.zip
                              Zuletzt geändert von lifeflow; 03.08.2012, 01:21.
                              HowTos: Mac Mini Mediacenter mit Plex oder XBMC / Logitech Harmony und der Mac

                              Kommentar

                              Lädt...
                              X