Kaninchen, Taster und Lean-Management

Kaninchen

Was die Begriffe Kaninchen, Taster, Lean-Management alles mit dem Raspberry Pi zu tun haben, erfahren Sie in diesem Artikel.

Vorgeschichte

Alles begann mit dem Einzug von 2 Kaninchen in unsere Garage. Die Kinder waren voll motiviert und damit war auch die Fütterung und Reinigung sichergestellt. Aber wie es manchmal so läuft…

Die Fütterungshäufigkeit durch die Kids passte nicht so ganz zu den Wünschen der Kaninchen. Es musste also eine Lösung her.

Die erste Lösung war: Papa macht alles allein. Die fand ich nicht ganz so gut. Ich brauche also eine Zweite.

Lösung mit Lean Thinking

Im Job würde ich es mit Methoden aus dem Lean Management anpacken. Den Prozess visualisieren, Verschwendung eliminieren, ausprobieren, verbessern…

Das war ein guter Plan. Also den Familenrat einberufen und dann legten wir gemeinsam los.

Das Ergebnis konnte sich wirklich sehen lassen. Meine Tochter hat eine Schiebe-Karte gebastelt und es gab Regeln.

Regeln (= „Prozessablauf“)

1. Die Schiebe-Karte wird an die Haustüre geklebt und beachtet.

2. Jeden Morgen stellt Papa die Karte auf HUNGRIG.

Lean-Schiebetafel: Die Kaninchen sind hungrig
Lean-Schiebetafel: Die Kaninchen sind hungrig

3. Sobald jemand füttert, stellt er die Karte auf SATT.

Lean-Schiebetafel: Die Kaninchen sind satt
Lean-Schiebetafel: Die Kaninchen sind satt

4. Am Abend wird geprüft, ob die Karte auf SATT steht.

Wenn Ja ist alles gut. Wenn Nein – ja dann muss nochmal jemand raus.

Soweit so gut. Eine Zeitlang hat das ziemlich gut funktioniert. Aber irgendwann schaute auch nicht immer jemand jeden Abend auf die Schiebe-Karte. Und für das Saubermachen des Geheges gab es das gleiche Problem.

Damit war klar: → Kontinuierliche Verbesserung! Eine dritte Lösung muss her.

Smarter Raspberry

Die Lösung musste auf jeden Fall smarter sein, auch um das Interesse wieder neu zu wecken. Und es sollte diesmal alle Probleme lösen.

  1. Es muss jedem klar sein, ob bereits gefüttert wurde.
  2. Die Problematik „Saubermachen“ muss auch mit gelöst werden.
  3. Wenn etwas vergessen wird, muss eine Erinnerung kommen.
  4. Und das Wichtigste: Es muss Spaß machen.

Mit meinem Sohn habe ich dann ein Realisierungskonzept überlegt:

  • Unser Smarthome, bestehend aus einem Raspberry Pi, wird erweitert
  • Bei den Kaninchen werden 3 Taster installiert:
    (1) Gefüttert
    (2) Saubergemacht und eine Taste
    (3) für Leckerli gegeben
  • Auf dem Raspberry läuft ein Python-Programm zur Überwachung der Tastenereignisse
  • Werden Tasten gedrückt, erfolgt eine Ereignisbearbeitung: Der jeweilige Zähler wird für den ausgewählten Zeitraum zurückgesetzt:
    – Gefüttert, täglicher Zähler (muss täglich bis 19:00h erfolgt sein)
    – Saubergemacht, wöchentlicher Zähler (muss sonntags bis 12:00h erfolgt sein)→ Erfolgt keine Rücksetzung bis zum gewählten Zeitpunkt, wird eine E-Mail mit einer Erinnerung an alle Kinder versendet.
  • Bei jedem Ereignis wird eine Textdatei erstellt, die vom Webserver ebenfalls ausgewertet werden kann
Systemaufbau des Kaninchen-Cockpits
Systemaufbau des Kaninchen-Cockpits

Schritt 1: Panel für Tasten bauen

Die Tasten haben wir direkt neben den Stall gebaut. In einer kleinen Holz-Box kommen die 3 Tasten problemlos unter. Welche Taster Sie verwenden spielt keine Rolle. Mir gefallen die Industrie-Ausführungen aber besser.

Oft bekommen Sie gute gebrauchte Taster/Schalter-Angebote bei Ebay, wenn Sie unter „Industrie Taster“ suchen. Die Taster sind sehr robust und es ist sehr einfach eine LED einzubauen (ein wenig Heißkleber reicht). Damit kann die Beleuchtungsproblematik elegant gelöst werden.

Das Panel haben wir Kaninchen Konsole getauft.

Einbaubeispiel für Taster
Die eingebaute Kaninchen Konsole

 

Schritt 2: Verkabelung

Der Schaltungsaufbau der Taster erfolgt über einen 10kΩ Pull-Up-Widerstand gegen die 3,3 V des Raspberrys. Da es mit langen Leitungen öfters Probleme gibt, verweise ich auf meinen Blog Telekom T-Concept X311 mit Doorline am Raspberry. Dort habe ich verschiedene Lösungsmöglichkeiten beschrieben. Wie Sie später sehen werden, setzen wir hier eine Software-Lösung ein.

Schaltungsaufbau mit Tastern und LED's
Schaltungsaufbau mit Raspberry Pi

 

Schritt 3: Python-Software programmieren

Zuerst muss klar sein, wie die Funktion der Taster und LED’s aussehen soll. Die LED’s sollten auf jeden Fall nicht permanent eingeschaltet sein (und damit vielleicht im Dunkeln die Kaninchen stören).

Um trotzdem den aktuellen Status zu erkennen, haben wir uns überlegt, nach dem ersten Tastendruck den Status anzuzeigen.

→ Kaninchen wurden noch nicht gefüttert: LED blinkt für 10 Sekunden

→ Kaninchen wurden schon gefüttert: LED leuchtet für 10 Sekunden

Wird innerhalb der 10 Sekunden die Taste nochmal gedrückt, wird das als Signal für die Fütterung gewertet.

Die Programmierung erfolgt am besten über eine Testaufbau. Wir haben ein Breadboard und unseren Raspberry-Stecker benutzt.

kaninchen_testschaltung
Aufbau der Test-Schaltung auf dem Breadboard

Der Aufbau der Taster ist für alle 3 identisch, deshalb ist er über eine eigene Klasse definiert:

class EreignisTaster:
     def __init__(self,PinTaster,PinLed,Name,DateinameProtokoll,DateinameStatus):
         self.PinTaster=PinTaster
         self.PinLed=PinLed
         self.Name=Name
         self.DateinameProtokoll=DateinameProtokoll
         self.DateinameStatus=DateinameStatus
         self.Status=False
         self.gedrueckt=0
         self.lastKeypress=0
         self.PruefungIntervall="-"
         self.PruefungErfolgt=0
         self.Meldung=""

Die Funktion zur Prüfung, ob ein Taster gedrückt wurde, sieht so aus:

    def Pruefung(self):
         if GPIO.input(self.PinTaster)==False:
             if self.gedrueckt==0:
                 #Taste wird gedrueckt
                 self.gedrueckt=1
                 self.lastKeypress=datetime.datetime.now()
                 print("Taste "+self.Name+": erkannt")
             else:
                 if (self.gedrueckt==1) and (datetime.datetime.now()-self.lastKeypress>datetime.timedelta(milliseconds=200)):
                     #Status anzeigen
                     print("Taste "+self.Name+": Status anzeigen")
                     self.lastKeypress=datetime.datetime.now()
                     self.gedrueckt=2
                     #LED einschalten
                     GPIO.output(self.PinLed,True)   
                     
                 if (self.gedrueckt==2) and (datetime.datetime.now()-self.lastKeypress>datetime.timedelta(milliseconds=1000)):
                     print("Taste "+self.Name+": EREIGNIS gewertet")
                     Blink(self.PinLed,0.1)
                     self.Status=True
                     GPIO.output(self.PinLed,True)
 
                     KaninchenLogEintrag(self.Name)
 
                     #Protokoll schreiben
                     tex=open(pfadDokumente+self.DateinameProtokoll,'a')
                     tex.write('\n'+time.strftime('%d.%m.%Y %H:%M:%S'))
                     tex.close()
 
                     #Letztes Datum schreiben
                     tex=open(pfadDokumente+self.DateinameStatus,'w')
                     tex.write(time.strftime('%d.%m.%Y %H:%M:%S'))
                     tex.close()
                     
                     self.lastKeypress=datetime.datetime.now()

Über einen Merker wird geprüft, ob die Ereignisse schon eingetreten sind. Ist das nicht der Fall wird eine Erinnerungsmail versendet.

So sieht der Quellcode für die tägliche Fütterung bis spätestens 19:00 Uhr aus. Über Definitionen von Intervalle erfolgt die Prüfung.

#Definitionen
 
 Taster=[0,1,2]
 Taster[0]=EreignisTaster(12,22,"Gefüttert","kaninchen_gefuettert.txt","kaninchen_gefuettert2.txt")
 Taster[1]=EreignisTaster(16, 9,"Leckerli gegeben","kaninchen_leckerli.txt","kaninchen_leckerli2.txt")
 Taster[2]=EreignisTaster(20,11,"Saubergemacht","kaninchen_saubergemacht.txt","kaninchen_saubergemacht2.txt")
 
 Taster[0].PruefungIntervall="*-15:18"
 Taster[0].Meldung="Es ist nach 19:00 Uhr und die Kaninchen wurden noch nicht gefüttert."
 
 #Für Prüfung wöchentlich, statt *, eine Zahl eingeben
 #0: Sonntag
 #1: Montag
 #...
 #6: Samstag
 
 Taster[2].PruefungIntervall="0-12:00"
 Taster[2].Meldung="Es ist Sonntag nach 12:00 Uhr und die Kaninchen wurden noch nicht sauber gemacht."

Die eigentliche Prüfung erfolgt hier:

        time.sleep(0.2)
 
         tick=tick+1
         if tick>300: #Jede Minute prüfen, ob Erinnerungen notwendig sind
             tick=0
 
             s=time.strftime("%Y.%m.%d")
             #Rücksetzen des Zählers um 23:59 Uhr
             if s!=signal0h:
                 if time.strftime("%H:%M")=="23:59":
                     signal0h=s
                     for t in Taster:
                         if t.PruefungIntervall!="-":
                             if t.PruefungIntervall[0]=="*":
                                 #wenn tägliches Intervall, dann rücksetzen
                                 t.Status=False
                                 t.PruefungErfolgt="-"
                                 print("Rücksetzen täglich:"+t.Name)
                             else:
                                 #wenn wöchentlich Intervall, dann erst Prüfung, ob Tag stimmt
                                 if time.strftime("%w")==t.PruefungIntervall[0]:
                                     t.Status=False
                                     t.PruefungErfolgt="-"
                                     print("Rücksetzen wöchentlich:"+t.Name)
                                  
                
             #Prüfen, ob Erinnerung notwendigt ist?
             for t in Taster:
                 if t.PruefungIntervall!="-":
                     if s!=t.PruefungErfolgt:
                         if ((t.PruefungIntervall[0]=="*") and (time.strftime("%H:%M")==t.PruefungIntervall[2:])) or (time.strftime("%w-%H:%M")==t.PruefungIntervall):
                             #es ist zum ersten Mal die Zeit der Prüfung
                             t.PruefungErfolgt="X" #dadurch wird nicht erneut geprüft
                             if t.Status==False:
                                 MailVersenden('Thomas Angielsky <name@deinserver.de>','Hinweis',t.Meldung)
                                 print(t.Meldung)

Im Mailprogramm könnte dann das Ergebnis so aussehen:

Mailnachricht: Kaninchen nicht gefüttert

So weit so gut. Wie gut oder interessant diese Lösung in der Praxis funktioniert hat, erfahren Sie dann später einmal…

Downloads

Das vollständige Python-Programm finden Sie in meiner Dropbox unter kaninchen.py.

Dieser Beitrag hat 4 Kommentare

Kommentar verfassen