Ob Bio, Restmüll oder nicht, sagt euch gleich das Licht

Mein neues Projekt hört sich wahrlich an wie eine Geschichte aus Tausendundeiner Nacht… zumindest bis zum Zeitpunkt, als Philips das Hue System auf den Markt gebracht hat. Im Laufe der Zeit, speziell in den letzten Jahren, sind vermehrt Anbieter solcher Lösungen auf dem Markt aufgetaucht. Und die Preise bewegen sich mittlerweile in einem Segment, welches es auch für mich interessant macht, das Projekt „Ob Bio, Restmüll oder nicht, sagt euch gleich das Licht“ ins Leben zu rufen.

Eigentlicher Auslöser war die morgendliche Hetze, wenn man im Halbschlaf einen LKW hört und wusste, dass man mal wieder vergessen hatte, die Abfalltonne am Vortag raus zu stellen. Bis man seine Plünnen angezogen hatte und die Treppe im Eiltempo heruntergelaufen war, war es zumeist schon zu spät, und man sah in der Regel nur noch die Rücklichter des Müllautos.

Ich bekomme natürlich aufgrund meiner Kalendereinträge eine Benachrichtigung. Aber wie das häufig so ist, es läuft gerade was Spannendes im Fernsehen oder man ist sonst irgendwie abgelenkt. Und nachdem man die Meldung weggedrückt hat, kann man sich nicht mehr daran erinnern… Müll-Alzheimer lässt grüßen. 😉 So erwuchs in mir der Wunsch, das ganze optisch zu betonen und nebenbei ein neues Spielzeug zu kaufen. 🙂

Ein Raspberry Pi 2 Modell B war bereits mein Eigen und ich hatte schon erste Erfahrungen mit openHAB bzgl. Z-WAVE vor dem Umzug in unser neues Haus sammeln können. Allerdings ist das auch schon wieder 1 ½ Jahre her und die Programmierung im Bereich Loxone und KNX ging vor und deckt jetzt ca. 95 % des Smart Home ab. Nun kommen nur noch die kleinen Schmankerln, die ich gerne mit der Himbeere und openHAB2 lösen möchte.

In den letzten Tagen hatte ich wieder etwas Zeit, mich dem Projekt zu widmen. Da die letzte Beschäftigung mit dem Raspberry und openHAB, wie bereits erwähnt, schon etwas her war, entschloss ich mich dazu, ganz neu zu starten. Also habe ich mir die neue Raspbian Version „Stretch“ als Image besorgt und kopierte es auf eine SD Karte. Das ganze erfolgte bei mir auf meinem Ubuntu Desktop mit dem Befehl:

dd bs=4M if=<Pfad zur Image-Datei> of=<Kartenleser>

Wie lange es her war, dass ich schon nicht mehr mit der Himbeere gearbeitet hatte, sah man daran, dass ich das Image auf eine normale SD Karte geschrieben hatte, im Raspberry aber eine Micro-SD Karte steckt. Gut, dann die bestehende Micro SD Karte in einen Adapter reinstecken und das Spielchen von vorne beginnen. Die Device des Kartenlesers kann man mit dem Vorher/Nachher Vergleich herausbekommen. Dazu ist der Kartenleser mit und ohne Karte zu betreiben und jeweils der Befehl lsblk einzugeben. Fix die Karte in den Pi 2 gesteckt, die USB Tastatur und den Bildschirm angeklemmt und Strom fließen lassen.

Die Anmeldung erfolgt über den Standarduser pi mit dem Standardkennwort raspberry. Und hier ist das y im Passwort bereits die erste Hürde, da die Tastatur noch nicht auf das länderspezifische Layout angepasst ist und ein US Tastatur verwendet wird. Daher die z-Taste für das y nehmen. Die landestypischen Einstellungen und diverse andere Einstellungen nimmt man dann sogleich mit dem Tool raspi-config vor. Auch hier wieder nach dem – auf der Tastatur suchen. Bei mir auf der ß-Taste zu finden. Nach den Einstellungen sollte man den Kleinen neu starten mit sudo shutdown –r now oder sudo shutdown –r 0, wenn man keine Minute warten möchte. Damit ist bei der nächsten Anmeldung schon mal die Tastaturhürde überwunden.

Um nun über einen Remote-Zugriff auf den Raspberry zuzugreifen, da dieser in einem kleinen IT-Schrank residieren soll, habe ich den Service ssh mit dem Kommando

sudo systemctl enable ssh

dauerhaft aktiviert und mit

sudo systemctl start ssh

gestartet. Nachdem ich den Rechner in meinem „Server-Schrank“ untergebracht (mitsamt USB Hub und Festplatte) und das Netzwerkkabel angeschlossen hatte, wurde die Verbindung mit ssh pi@minibian von meinem Laptop aus aufgebaut. Aufgrund der Tatsache, dass einer SD-Karte im Verhältnis zu einer Festplatte nur ein kurzes Leben beschert ist, vor allen Dingen bei vielen Schreibzugriffen, bin ich dazu übergegangen, eine USB Festplatte einzubinden. Dabei muss der Rechner so konfiguriert werden, dass der Boot Vorgang nur noch über die kleine Partition auf der SD Karte erfolgt, aber die Daten-Partition des USB Laufwerk eingehängt ist. Dazu muss man vorher die Platte partitionieren, was bei mir schon der Fall gewesen ist. Das anschließende verlagern der Partition /dev/mmcblk0p2 von Karte auf die Partition /dev/sda1 auf der USB Festplatte verlief reibungslos mit:

/dev/sda1  /  ext4    defaults,noatime  0       1

Et voila, nun haben wir ein System mit einer Festplatte. Sicherheitshalber sollte man sich einen USB HUB mit eigener Stromversorgung besorgen und die Platte daran anschließen, da die USB Ports normalerweise nur einen Gesamtstrom von 600 mA liefern. Durch den Parameter max_usb_current=1 in der Datei /boot/config.txt kann man dies bei einigen Raspberry Modellen auf 1200 mA erhöhen.

Bei der Installation von openHAB2 muss man beachten, dass man es bei der Version 8 von Java belässt. Ich habe mich für die Java Oracle Version entschieden. Wichtig ist auch noch zu erwähnen, dass man bei der 32-Bit Version bleiben sollte, da sonst keine seriellen Verbindungen klappen, wie z.B. das Z-WAVE Binding. Für weitere Informationen verweise ich auf die Seite https://www.openhab.org/docs/installation/

Nachdem die Vorbereitungen getroffen worden sind, holen wir uns mit dem ersten Kommando den öffentlichen Schlüssel und fügen ihn dem Paketmanager hinzu. Der zweite Befehl installiert ein Paket, der es dem Paketmanager erlaubt, über eine HTTPS Verbindung neue Pakete zu installieren.

wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab'|sudo apt-key add –
sudo apt-get install apt-transport-https

Danach fügen wir die Quell-Lokation für den Download und spätere Updates in eine neue Datei. Ich habe mich für die STABLE Version entschieden.

echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list

Dann erfolgt eine Synchronisierung des Paket-Index mit

sudo apt-get update

und wir sind bereit, openHAB2 mit folgenden Kommandos zu installieren.

sudo apt-get install openhab2
sudo apt-get install openhab2-addons

Der Start des Dienstes erfolgt dann mit sudo systemctl start openhab2.service oder sudo service openhab2 start. Um den Dienst beim System Boot automatisch zu starten muss man folgenden Befehl verwenden: sudo systemctl enable openhab2

Als nächstes habe ich mich an die Installation von anaconda gemacht, da ich meine Skripte in Python schreiben wollte. Es gibt war auch ein Binding, dass man für openHAB2 installieren kann und das für den Zugriff auf CALDAV Kalender verwendet werden kann. Ich hatte allerdings damit keine guten Erfahrungen gemacht. Bei Google hätte ich die Sicherheit einschränken müssen, um wenig sichere Applikationen zuzulassen. Und beim Zugriff auf meinen Kalender in ownCloud waren mir das zu viele Zugriffe und Einzeldateien, die abgelegt wurden, so dass ich mich letztendlich für eine lokale Version entschieden habe. Ich lade den Kalender im ICS Format herunter und setze diesen in eine reine Text-Datei mit Datum und Abfallart um.

Beispiel eines Eintrags in der ICS Datei: 
BEGIN:VEVENT CLASS:PUBLIC
CREATED:20190210T140658Z
DTSTAMP:20190210T140658Z
LAST-MODIFIED:20190210T140658Z
DTSTART;VALUE=DATE:20190211
DTEND;VALUE=DATE:20190212
X-FUNAMBOL-ALLDAY:1
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
LOCATION:Büdingen
SUMMARY:Altpapier
DESCRIPTION:Altpapier
PRIORITY:5
SEQUENCE:0
URL:stadt-buedingen.mein-abfallkalender.de
CONTACT:Mein-Abfallkalender.de\, support@know-it.net
TRANSP:TRANSPARENT
STATUS:CONFIRMED
UID:xxxxx@www.stadt-buedingen.mein-abfallkalender.de
END:VEVENT

Diese Datei setze ich mit einem Python Script um. Als Übergabeparameter erwartet das Script den Dateinamen mit einer dreistelligen Extension, also z.B. Abfallkalender.ics. Als Ergebnis gibt es dann die neue Datei Abfallkalender.txt

Beispiel: 
20190618;Bioabfall
20190618;Restmüll
20190622;Gelber Sack
20190625;Bioabfall
20190701;Altpapier
20190702;Bioabfall
20190705;Gelber Sack
20190709;Bioabfall
20190709;Restmüll

Das Python Programm für die Umsetzung:

#!/usr/bin/python3
import sys 

if len (sys.argv) != 2 :
    print("Argument fehlt")
    sys.exit(1)

file_in  = open(sys.argv[1], "r")
file_out = open(sys.argv[1][:-3] + "txt", "w")

# Wir gehen alle Zeilen nacheinander durch
# In der txt-Datei stehen für uns nicht sichtbare Zeilenumbruchszeichen, durch die jeweils das Ende einer Zeile markiert ist
for line in file_in:
    # Eine Zeile ohne Zeilenumbruch ausgeben
    if line.startswith("DTSTART;VALUE=DATE:"):
        datum = line[19:-1]
    if line.startswith("SUMMARY:"):
        abfallart = line[8:-1]
        file_out.write(datum + ';' + abfallart + '\n')
file_in.close()
file_out.close()

Das andere Python Skript gibt für den nächsten Tag alle Abfalltypen in einem Semikolon separierten String zurück und wird aus der .rules Datei heraus aufgerufen.

#!/usr/bin/python3
from datetime import date
from datetime import timedelta
import sys
#test
if len (sys.argv) != 2:
    print("Argument fehlt")
    sys.exit(1)

# datum = date.today() + timedelta(1)
datum = (date.today() + timedelta(1)).strftime("%Y%m%d")
result=''
file_in  = open(sys.argv[1], "r")
for line in file_in:
    # Eine Zeile ohne Zeilenumbruch ausgeben
    if line[:8] == datum:
       result = result + line[9:-1] + ';'

print(result)
file_in.close()

Die Regeln wurden so erstellt, dass folgende Bedingungen erfüllt werden sollen:

  1. Mehrere Abfallarten an einem Tag können möglich sein und sollen durch einen Farbwechsel angezeigt werden
  2. Wenn ich den Lichtschalter in der Sitemap auf OFF setze, soll  die Lampe ausgeschaltet und das Intervall gestoppt werden
  3. Der Kalender soll 1 x am Tag ab einer bestimmten Uhrzeit gelesen werden
  4. Das Intervall soll eine Minute danach jede Minute durchgeführt werden, zumindest beim ersten Aufruf. Danach hängt es vom Schalterzustand und dem Status der Lampe ab.

Die Farben sollten wie folgt sein:

  • Blau = Altpapier
  • Gelb = Gelber Sack
  • Grün = Bioabfall
  • Rot = Restmüll

Dann ging es daran, die Milight Box2 in das Netzwerk zu bringen, was relativ einfach von statten ging. Auch die Installation der App und das Linken der Lampe mit der Box war schnell erledigt. Letztendlich musste noch das entsprechende Milight Bindung in openHAB 2 installiert werden und dann noch ein Item eingefügt werden.

Hier noch die .rules Datei, mit der alles gesteuert wird.

var boolean schalter
var int counter
var String[] type_array

rule "getAbfall"
when  
    Time cron "0 0 19 1/1 * ? *"
then  
    var String abfallart = executeCommandLine("/usr/bin/python3 /etc/openhab2/rules/GetAbfall.py /etc/openhab2/rules/Abfallkalender.txt",1000)
    logInfo("Rosenhof.rules", "Abfallart: " + abfallart)
    schalter = true
    counter = 0
    type_array = null
    if (abfallart.contains(';')) {
        type_array = abfallart.split(';')
    }
end


rule "setLight"
when
    Time cron "0 1/1 19-22 1/1 * ? *"
then  
    if (type_array === null) {
        return
    }
        
    var String[] state_array = RGBW_WZ.state.toString().split(",")
    
    if (state_array === null) {
        return
    }

    if (schalter == true || state_array.get(2) != "0") {
        schalter = false
        var String farbe
        var String type = type_array.get(counter)
        switch(type) {
            case "Bioabfall": farbe = "110"
            case "Altpapier": farbe = "130"
            case "Restmüll": farbe = "20"
            case "Gelber Sack": farbe = "75"
            default : farbe = "0"
        }
        sendCommand(RGBW_WZ, ON)
        sendCommand(RGBW_WZ, new HSBType(new DecimalType(farbe),new PercentType(100),new PercentType(100)) as Number)
        counter = counter + 1
        if (counter >= type_array.length) {   
            counter = 0
        }
    }
end

Um den Alarm auszuschalten, muss man das Licht via openhab2 ausschalten (App, Paper UI etc.). Sicherlich gibt es hier viele Lösungen, die eleganter und konfigurierbarer sind. Aber für meine Zwecke ist das vollkommen ausreichend und es funktioniert bestens. Jetzt brauche ich nur noch ein Fördersystem, welches die Mülltonne zur Straße fährt. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert