Die-Frickler.org

Wir haben Zweigstellen in jeder Nervenheilanstalt!



LaundrySorcery, oder: seit wann fällt eigentlich Ethernet aus unserer Waschmaschine?

Keine Antwort

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:

Timingunterschiede des Ladekreises bei änderndem Widerstandswert.

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:

Zwei Gaussverteilungen

Zwei Gaussverteilungen der Messwerte. Die Y-Achse ist die Wahrscheinlichkeit, den Wert in der X-Achse zu erhalten, abhängig davon, ob die Waschmaschine an oder aus ist.

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:

Entscheidungsgrenze bei unterschiedlichen Varianzen

Weswegen wir annehmen, dass die gleiche Varianz vorliegt.

Bootstrapping

Baron von Münchhausen

++++ An den Haaren herbeigezogen: Baron befreit sich angeblich durch Hochziehen am eigenen Schopf aus Sumpf ++++

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:

Webseite im Aus-Zustand

Webseite im Aus-Zustand. Im Ein-Zustand wäre der Power-Knopf Grün.

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

Änderung des Mittelwertes über einen Tag. Die blaue Kurve ist die gelernte Gaussverteilung, welche (langsam) der roten Kurve angepasst wird.

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

Geschrieben von doeme @die-frickler.org

am 20. Juni 2018 um 03:19 Uhr

Antwort schreiben