RTC-Wakeup für MythTV setzen

Erstaunlicherweise klappte der Wakeup ohne Probleme. Was nicht so ganz einfach war, war die MythTV-konfiguration.

Das Backend erlaubt die Einstellung von Idle-Zeiten und Kommandos zum Setzen der Weckzeit und dem Runterfahren des PCs. Hat das Backend nichts zu tun, kann es nach Ablauf der Idle-Zeit sich selbst herunterfahren und vorher noch eine Weckzeit setzen, zu der sich der PC selbst wieder starten soll. In der Theorie ist es einfach, in der Praxis aber wieder nicht.

Idle hat leider nicht funktioniert. Wenn man EIT konfiguriert hat, muss man eine Option setzen, dass der EIT-Update z.B. 11min später ausgeführt wird, nachdem das Backend in den Idle-Zustand gegangen ist. Der Idle-Timeout sollte kurz davor passieren, d.h. beispielsweise 10min. Der EIT-Update setzt nämlich den Idle-Counter zurück …

Das eingestellt, ging es trotzdem nicht. Es gab noch einen Housekeeping-Thread, der das Backend ständig aus dem Idlen geholt hat. Ich hab hierzu nichts gefunden.

Als Alternative gab es dann noch ein TurnOff-Script, das man statt den Einstellungen im Backend verwenden konnte. Es wird per Cronjob gestartet und macht diverse Checks. Unter anderem, ob das Backend idelt, oder ob NFS verwendet wird, ob User eingeloggt sind usw usf …

Das Problem war, dass wenn der Idle-Counter nicht richtig arbeitet, das Script auch nicht funktioniert.

Ich hab das Python-Script dann auseinandergenommen und hab mir selbst eins zusammengebaut, das alle 5min die Zeit der nächsten Aufnahme ermitteln und die Weckzeit auf diesen Wert stellt. So kann ich zumindest den PC runterfahren, wann ich will und kann mir sicher sein, dass dieser zur nächsten Aufnahme wieder aufgeweckt wird.

Hier ist es:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import os, sys, time
from logging.handlers import SysLogHandler
try:
    import MythTV
except Exception, e:
    print "Module MythTV not found"
    sys.exit(1)

offset_s = 4 * 60

def getNextRecording():
  myth = MythTV.MythBE()
  recordings = myth.getUpcomingRecordings()

  for recording in recordings:
    if recording.recpriority > -99:
      return recording.starttime
    else:
      log.info("Skipping recording '%s' at '%s' because it has too low priority (%d)", recording.title, recording.starttime, recording.recpriority)
  return None

def setWakeTime(l):
  fn = '/sys/class/rtc/rtc0/wakealarm'
  wakealarm = open(fn, 'w+')
  wakealarm.write(str(l)+"\n")
  wakealarm.close()

log = logging.getLogger()
log.setLevel(logging.INFO)
syslog = SysLogHandler(address='/dev/log')
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
syslog.setFormatter(formatter)
log.addHandler(syslog)

date_time = str(getNextRecording())

if date_time == None:
  setWakeTime(0)
  log.info("No recording scheduled");
  sys.exit(0)
else:
  setWakeTime(0)
  pattern = '%Y-%m-%d %H:%M:%S'
  epoch = int(time.mktime(time.strptime(date_time, pattern)))
  log.info("Next scheduled recording at %s (%s)", date_time, epoch)
  epoch = epoch - offset_s
  date_new = time.strftime(pattern, time.localtime(epoch))
  log.info("Setting wakeup to %s (%s)", date_new, epoch)
  setWakeTime(epoch)

sys.exit(0)

Es versteht sich von selbst, dass das nur zusammengeschustert wurde und Sonderfälle nicht getestet wurden. Auch berücksichtigt es keine anderen System-Konfigurationen.

Erwähnenswert ist, dass ich die „Priorität -99“ Idee des Originalautors von TurnOff übernommen habe. Hat eine Aufnahme die Priorität -99, dann wird der Rechner nicht gestartet. Läuft er aber, wird die Sendung aufgenommen.

Zusätzlich hab ich in die /usr/share/themes/defaultmenu/mainmenu.xml noch hinzugefügt:

<button>
    <type>MENU_MY_SHUTDOWN</type>
    <text>Shutdown</text>
    <description>Shutdown PC</description>
    <action>EXEC sudo sh -c 'shutdown -h now'</action>
</button>

Nach dem Neustart der Frontends gibt es nun einen neuen Menupunkt „Shutdown“, mit dem man den Rechner runterfahren kann, wenn man ihn nicht mehr braucht.

Das ist gut genug …

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s