Master Control

Projekt
Ein Script um Abläufe in der Echt-Welt zu automatisieren.
☞︎ full_power wird dadurch noch besser!!1!
An meinem Computer hängt eine USB-Festplatte,
die iTunes Bibliothek ist auf eben dieser Platte.
Also muss ich erst die Platte anschalten, bevor ich iTunes starte..
Davor sollte ich aber noch mit dem Bluetooth Audio Device verbinden..
Und am Ende, schalte ich erst den Strom ab, oder hänge ich zuerst die Platte aus?!?
Aber erst alle Programme die auf die Platte zugreifen schließen!
... *seufz* ...
Ziel
Eine Lösung die mir das Nachdenken abnimmt und so Fehler verhindert :)
Irgendwas, das die Abhängigkeiten auflöst, und eigenständig laufen kann.
Werkzeuge
  • full_power
  • python3
  • Apple Script
    mit eingebettet, für z.B. den Bluetooth Audio Dialup, oder um Scripte explizit im neuen Terminal-Fenster zu starten.
Features
  • Schaltet Strom.
    Kennt meine Funksteckdosen, und weiß was an welcher Steckdose angeschlossen ist.
  • Verbindet mit meinem Bluetooth Audio Gerät.
    Schaltet aber zuerst den Strom für die Stereoanlage an.
  • USB-Festplatten ein- und aushängen.
    mount ☞︎ Strom an.
    unmount ☞︎ Erst alle Programme schließen, Platte aushängen und dann den Strom aus.
    Kann aber auch Platten die nicht an einer Funksteckdose hängen mounten.
    ☞︎ Holt sich das Passwort zum entsperren aus der Keychain.
  • Startet Programme.
    Erst auf die Platte mit der Musik drauf warten, dann iTunes starten..
    Und währenddessen die wird die Stereoanlage eingeschaltet..
  • Power Management.
    Ausschalten, Neustarten, Ausloggen, Standby, Bildschim aus/sperren/-schoner ...
  • Gruppen für alle Elemente.
    z.B. alle Steckdosen aus.
Service
Zusätzlich lassen sich mit Helfer-Scripten noch ein paar Dinge generieren:
Umsetzung
Natürlich habe ich mittels Klassen alles Modular aufgebaut.
Es gibt eine Abstrakte-Basis-Klasse (abc), die die Methoden full() sowie null() verlangt.
Abhängigkeiten ☜︎
Instanzen bekommen beim Erstellen die Abhängigkeiten, die sie selbst zum starten benötigen mit übergeben.
In jeder Klasse selbst existieren zwei Listen: below und above.
Der Konstruktor sieht nun so aus:
def __init__(self, *depends):
     self.below = []
     self.above = []

     for elem in depends:
        self.below.append(elem)
        elem.above.append(self)
Zack, noch eine Methode, um in beiden Richtungen durch diesen simplen Baum zu iterieren..
Und dann noch argparse drum rum geschnallt, fertig!
Versionen
Das Projekt existiert schon länger als sein Git-Repo..
☞︎ Gleich beim Entwickeln von full_power habe ich mir schon Alfred Workflows zusammengeklickt.
Zwei Beispiele:
Die kann man mit der Alfred Remote verknüpfen, so lässt sich dann alles vom Telefon aus bedienen.
Das ganze wird aber sehr schnell undurchsichtig und ist schwer zu pflegen.
☞︎ Der nächste Versuch war ein längliches bash-Script. Zunächst recht verheißungsvoll.
Da darin das überprüfen von Abhängigkeiten eher schwierig ist, wurde fast alles von Hand ausformuliert.
Dies potenziert den Aufwand mit jedem neuen Feature, und zieht massiv Bugs nach sich :(
☞︎ Also wieder ans Reißbrett, und so entstand die oben beschriebene Version in python.
Links
Repository
master_control.git
☞︎ full_power
My automated home is on fire!
Erstellt
17.12.2016 - 18:50:38
Tags
Home Automation
Projekt
Python