Woohoo, Inhalte!
In der WG standen wir neulich vor dem Problem: Die Waschmaschine befindet sich im Keller, also ganze zwei Stockwerke unter uns. Der geplagte Student nimmt also periodisch, den Rücken gebeugt unter der Bürde von geschätzt vier Wochen Wäsche, den mühsamen Weg in den Keller auf sich, ohne Gewissheit, dass die Waschmaschine auch tatsächlich frei ist.
Schlimmer noch, im Worst Case steht man vor laufender Waschmaschine, und hat mangels Timer an der Kiste keine Ahnung wie lange die Wäsche da drin war, oder wie lange sie noch drin sein wird.
Dass dieser Zustand unhaltbar ist, war auch der Genossin BC klar, kundgetan mit den (ungefähren) Worten: „Man sollte mal ’nen Sensor an die Waschmaschine pappen, hier fliegt auch noch ein Raspberry PI rum, der auf Einsatz wartet“
Natürlich liess ich mir das nicht zweimal sagen, und fuhr instantan in den lokalen Elektronikshop um das restliche Hühnerfutter zu besorgen.
Sensorik
Die Sensorik funktioniert so: Über die „Ein“-LED wird ein LDR geklebt, welcher vom Raspberry PI mit folgender Elektronik ausgelesen wird:
Wir messen also den Widerstandswert über Timingunterschiede des Ladezyklus:

Sobald wir die obere Hysterese (in der Abbildung bei 2.8V) erreichen, ziehen wir den Eingang der Schaltung auf 0V, bei der unteren Hysterese (1.8V) auf 3.3V.
Auswertung
Der Raspberry Pi erhält nun periodisch die Dauern der Zyklen. Doch: woher weiss er nun, ob die „Ein“-LED leuchtet oder nicht? Optimalerweise ginge das ohne fest einprogrammierte Grenzen.
Wir machen für das Problem zwei Annahmen: Wenn der Pi startet, befindet sich die Waschmaschine im Zustand aus, und die ausgelesenen Zeitdauern sind Gaussverteilt:

Die Gaussverteilungen werden zur Laufzeit mit running averages geschätzt, sie sind also a-priori nicht bekannt.
Ein Blick in die Entscheidertheorie zeigt, dass die optimale Entscheidung für Gaussverteilungen gleicher Varianz genau in der Mitte der Kurven liegt, i.e. wenn wir einen Wert messen, der über der Mitte (in Falle dieser Abbildung 800) liegt, entscheiden wir uns für OFF, ansonsten für ON. Falls die Verteilungen nicht die gleiche Varianz haben, liegt die Entscheidergrenze bei:
Weswegen wir annehmen, dass die gleiche Varianz vorliegt.
Bootstrapping

Aufmerksame Leser werden jetzt sagen: „Mooo-ment mal, Baron von Münchhausen, woher wissen wir zu Beginn, wo die Entscheidungsgrenze liegt, wenn wir die Verteilung a-priori nicht kennen?“
Ja, da hat der besorgte Bürger^W^W aufmerksame Leser natürlich recht: Wir bedienen uns bei der initialen Schätzung einer Krücke: Wir gehen davon aus, dass die Maschine im Aus-Zustand ist. Wir können daher die Gaussverteilung für den Aus-Zustand trainieren. Die Entscheidungsgrenze(n) liegen nun einfach 5*σ vom Mittelwert entfernt, i.e. sobald wir einen Wert Messen, der „zu weit“ von unserem gemessenen Mittel weg liegt, entscheiden wir uns um zum ON Zustand (lustigerweise kann der in unserem Algorithmus auch weniger Licht vorweisen als der OFF-Zustand)
Sobald wir die erste Entscheidung mal getroffen haben, können wir anfangen, die Gaussverteilung des ON-Zustandes zu trainieren, und können die oben besprochene Entscheidung verwenden.
Outlier-Resistenz
Wenn wir bei jedem einzelnen Wert überhalb des Grenzwertes wechseln würden, wäre das System unbrauchbar und ständig am rumwechseln. Wir entscheiden uns erst nach 100 konsekutiven Werten überhalb des Grenzwertes um.
Software
Das Programm wurde in C geschrieben. Wir verwenden zusätzlich ein paar Tricks, die grosse Messunterschiede wegen Scheduling durch das Betriebssystem vorbeugen: Der Messprozess wird in einer isolierten CPU ausgeführt, die nur von ihm benutzt werden darf. Weiterhin ist der Prozess immer am Werte auslesen, weswegen er nie gestoppt wird.
Interface
Dem ganzen wurde ein Web-Interface spendiert, das folgendermassen aussieht:

Zusätzlich sieht man in der Detail-Seite ein paar Kurven, welche die Software in eine RRD schreibt:

Das Ganze ist im LAN, sofern das Endgerät es beherrscht, per MDNS unter http://laundrysorcery.local erreichbar
Installation
So, genug gelabert, nun zur eigentlichen Installation:
Nachtrag
Der Code ist unter http://xatko.vsos.ethz.ch/git/LaundrySorcery/ auffindbar
Schreibe einen Kommentar
Du musst angemeldet sein, um einen Kommentar abzugeben.