Wie ja alle wissen ist das Arbeiten in der Wohnung mit einer Flex oder Kreissäge nicht wirklich zu empfehlen, da die Staub- und Dreckentwicklung enorm ist. Aus diesen Grund wollte ich schon immer eine Werkstatt für die “groben” Arbeiten haben.

In meiner Garage ist auch extra ein Raum dafür abgetrennt, dieser ist jedoch nicht beheizt, so dass das Arbeiten im Winter nur mit dicker Jacke möglich wäre – ein unhaltbarer Zustand! 😉

Infrarot Heizungen

Ich habe mich also entschlossen meine Werkstatt zu beheizen, und habe mir dazu zwei Infrarot Heizpanele mit je 800 Watt besorgt.
Warum Infrarotheizungen?
Zuächst mal können diese sinnvoll an die Decke montiert werden, was keinen Platz an den Wänden weg nimmt.
Sie erhöhen nicht die Luftfeuchtigkeit da sie nichts verbrennen.
Und wenn man unter einer solchen Heizung steht, spürt man die Strahlungswärme fast sofort.
Außerdem mache ich ja bei mir irgendwie “alles” mit Strom 😉

Und da meine Garage nicht, oder nur wenig gedämmt ist, habe ich nach kurzer Recherche ausrechnen können, dass ich ca. 1200-1400 Watt haben sollte.

Infrarotheizung Panael an Decke montiert
Infrarotheizung an Decke montiert
Steckdosen in Werkstatt an der Decke für die Infrarotheizungen
Steckdosen in Werkstatt

Nachdem das geschafft war, ging es an die Steuerung. Diese sollte natürlich über den KNX Bus stattfinden. Ich musste also erstmal die Temperatur der Werkstatt messen und an den Homeserver übertragen.

Temperatur Messung

Um die Temperatur zu messen habe ich den Sensor aus der Garage wiederverwendet. Dieser hat regelmäßig seine Firmware nach dem Tiefschlaf nicht mehr wieder gefunden und leider muss ich sagen, das der eingebaute Lüfter es auch nicht geschafft hat die Temperatur in der Garage spührbar zu reduzieren, also wird der jetzt recycelt.

Er besteht nach wie vor aus einem ESP8266 und einen DHT22 Temperatursensor. Ich habe dann eine neue Firmware drauf gespielt die ich vom Zisternen-Sensor übernommen habe und somit von PUSH auf PULL umgestellt.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHTTYPE DHT22

const int DHTPin = 2;
ESP8266WebServer server(80); // Webserver
WiFiClient client;
DHT dht(DHTPin, DHTTYPE);

struct measureData{
  float temp;
  float humi;
};

void setup() {
  Serial.begin(115200);

  IPAddress ip(192, 168, X, Y);
  IPAddress gateway(192, 168, X, Y); 
  IPAddress subnet(255, 255, 255, 0); 
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("<SSID>", "<PASSWORD>");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());  

  server.on("/", handle_normal);
  server.on("/hs", handle_hs);
  server.on("/hs/1", handle_hs);
  server.onNotFound(handle_NotFound);  
  server.begin();
  Serial.println("http server startet");

  dht.begin();
  Serial.println("dht startet");
}

void loop() {
  server.handleClient();
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

void handle_normal() {
  Serial.println("handle /");
  struct measureData measureData = getMeasureData();
  String msg = String("<!DOCTYPE html><html>") + 
    "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" + 
    "<link rel=\"icon\" href=\"data:,\">" + 
    "<body><h1>Werkstatt Temperature Server</h1>" + 
    "<p>Use get parameter hs for homeserver</p>" + 
    "<p>Exampe: /hs/1</p>" + 
    "<br><br><p>Current temp: " + String(measureData.temp) + "</p>" + 
    "<br><p>Current humi: " + String(measureData.humi) + "</p>" + 
    "</body></html>\r\n" ;
  server.send(200, "text/html", msg); 
}

void handle_hs() {
  Serial.println("handle /hs");
  struct measureData measureData = getMeasureData();
  String msg = String("T=" + String(measureData.temp) + "\r\n");
  server.send(200, "text/html", msg); 
} 

struct measureData getMeasureData() {
    float h, t;
    struct measureData measureData;

    delay(4000);
    h = dht.readHumidity();
    t = dht.readTemperature();
    Serial.println(t);
    Serial.println(h);        
        
    if (!isnan(t)) {
      measureData.temp = t;
    }
    if (!isnan(h)) {
      measureData.humi = h;
    }
    return measureData;
}

Und natürlich wollte ich jetzt erstmal prüfen, ob das alles denn auch funktioniert. Dazu habe ich dann den Sensor provisorisch zusammen mit einem Oldschool-Analog-Thermometer in der Werkstatt platziert.

Temperatursensor in Werkstatt
Neuer Temperatursensor in Werkstatt
Thermometer in Werkstatt
Analoges Thermometer in Werkstatt

Und siehe da: Der Sensor vertut sich um gut 2-3 Grad – so geht das aber nicht!

Schaltungsüberarbeitung

Und dann ging die Suche los:
Zunächst einmal habe ich die Schaltung überarbeitet und einen Pull-Up Wiederstand (4.7k) sowie den im Datenblatt des DHT22 aufgeführten 100nF Kondensator eingefügt.

Überarbeitete Sensorschaltung auf Lachrasterplatine Oberseite
Überarbeiteter Sensor Oberseite
Überarbeitete Sensorschaltung auf Lachrasterplatine Unterseite
Überarbeiteter Sensor Unterseite

Gleichzeitig habe ich den DHT22 Sensor auch noch komplett ausgetauscht (hatte damals ein 3er-Set gekauft und daher noch zwei in meiner Rummelkiste) und ihn auch nicht mehr direkt neben dem ESP montiert, sondern mit kurzen Kabeln ca. 20cm entfernt von der Platine.

Ich weiß nicht genau was von den Maßnahmen geholfen hat, aber nachdem ich den überarbeiteten Sensor so in der Werkstatt aufgestellt hatte, deckte sich die Messung 1zu1 mit dem analogen Thermometer.

KNX Anbindung

Die Anbindung an den Homeserver findet auf die gleiche Weise statt, wie schon bei der Zisterne. Ich habe ein KO angelegt und mitteils Webseitenaufruf wird der Wert von der Webseite des ESP gelesen.

Webseitenaufruf IP-Adresse
Webseitenaufruf IP
Webseitenaufruf URL
Webseitenaufruf URL
Webseitenaufruf Werte auslesen
Webseitenaufruf Werte

Der Webseitenaufruf wird dann mittels Logik einmal pro Minute wiederholt.

Die Logik

Und zum Schluß musste noch eine Logik her, welche die gemessene Temperatur mit der Wunschtemperatur vergleicht und unter Berücksichtigung von Pufferwerten dann die Steckdosen für die Heizungen an- bzw abschaltet.

Homserver Logik zur Steuerung der Heizungssteckdosen abhängig von der Wunschtemperatur und gemessenen Temperatur
Homeserver Logik zur Steuerung der Werkstattheizung

Wie schon angekündigt hat mein letzter Raspberry mit meiner Zigbee-Steuerung seine SD-Karte zerlegt – was ja immer ein Damoklesschwert über dem Kopf eines jeden ist, der die kleinen PCs mit SD-Karte betreibt und dort auch Datenbanken o.ä. drauf laufen lässt.

Da die PIs ab Version 3 aber auch endlich (ordentlich) aus dem Netzwerk booten können, habe ich mich entschieden nach und nach allen PIs die SD-Karte weg zu nehmen und nur noch über das Netzwerk zu arbeiten. Hier ist die kleine Anleitung dazu:

Verwendet wurden:
– QNAP NAS
– Raspberry PI 3 B V1.2

Vorbereitung DHCP Server

  • Damit der PI aus dem Netzwerk booten kann habe ich meinen DHCP Server so konfiguriert, das er immer die gleiche IP vergibt
  • Außerdem habe ich noch folgende DHCP Optionen gesetzt:
  • “Vendor encapsulated options” = Raspberry Pi Boot
  • “TFTP Servername” = 192.168.x.y (das ist die IP vom NAS)
  • “Bootfile Name” = bootcode.bin

Vorbereitung Raspberry Pi

  • Wie üblich mit dem Raspberry Pi Imager eine (neue) SD-Karte beschrieben und das Betriebssystem “Raspberry Pi OS Lite” installiert (ohne grafische Oberfläche)
  • Dann das System hochgefahren und die grundlegende Installation abgeschlossen (raspi-config, usw.)
  • Damit der Pi über das Netzwerk booten kann, muss ein Eintrag in der /boot/config.txt geändert werden (ganz am Ende)
nano /boot/config.txt
program_usb_boot_mode=1
  • Anschließend den PI neu starten und die Zeile wieder entfernen. Die Einstellung bleibt dauerhaft erhalten.
  • Der Erfolg kann nach dem Neustart wie folgt überprüft werden
vcgencmd otp_dump | grep 17
Ergebniss: 17:3020000a

Einrichtung QNAP NAS

  • Als erstes habe ich die Freigabe “Public” per NFS freigegeben. Hier soll später das Root-Dateisystem liegen und auch die Dateien für den Bootvorgang werde ich hier ablegen. Dazu muss der NFS-Dienst ggf. vorher in der Systemsteuerung aktiviert werden.
  • Gastzugang per Samba/Windows wird für “Public” deaktiviert, bzw. auf “kein Zugriff” gestellt
  • Auf der Public-Freigabe erstellle ich einen Ordner “pxeboot”
  • In dem Ordner “pxeboot” erstelle ich dann pro Raspberry einen weiteren Unterordner. Hier z.b. “zigbee”
  • Und in dem Ordner “zigbee” erzeuge ich dann noch einen Ordner “boot”
  • Außerdem brauche ich für den Netzwerkboot noch einen TFTP Server, der auf den QNAP-NAS wie folgt konfiguriert wird
  • Nun starte ich den Pi einmal ohne die SD-Karte neu und schaue in die Log-Datei “Public\pxeroot\opentftpd.log”. Dort steht jetzt drin welche Dateien gefunden/nicht gefunden wurden. Bei der Datei “start.elf” ist auch ein Unterordner zu sehen, der die Seriennummer des PIs darstellt. Diese merke ich mir, denn ich muss im nächsten Schritt einen passenden Symlink anlegen
  • Darum melde ich mich auf der Console des NAS per SSH an und mittels “ln -s /share/Public/pxeroot/zigbee/boot /share/Public/pxeroot/<seriennummer>” erzeuge ich einen Symlink mit der passenden Seriennummer, der in das boot-Verzeichniss des entsprechenden PIs zeigt

Kopieren der Daten

  • Zunächst melde ich mich am Pi an und mounte die NFS-Freigabe. Anschließend kopiere die gesamte Root-Partition auf die NFS-Freigabe
sudo mount.nfs 192.168.X.Y:/Public/pxeroot/zigbee /mnt
sudo rsync -xa --exclude /mnt / /mnt/
  • Nachdem der Kopiervorgang abgeschlossen ist (kann etwas dauern) müssen noch ein paar Dateien angepasst werden.
  • Zunächst “nano /mnt/etc/fstab”. Es wird alles entfernt außer “proc” und die vier tmpfs sowie das NFS-Root werden hinzugefügt
proc /proc proc defaults 0 0
192.168.X.Y:/Public/pxeroot/zigbee	/ 	nfs 	defaults 	0 	0
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0
tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0
  • Dann fahre ich den Pi herunter und lege die SD-Karte in meinen PC ein (da wo ich diese auch beschrieben habe). Ich kopiere den ganzen Inhalt, also die ganzen .elf-Dateien, config.txt usw. in den Boot-Ordner auf der Netzwerkfreigabe
  • Die Datei “bootcode.bin” jedoch kopiere ich direkt in den Ordner “pxeroot”
  • Dann wird noch die “cmdline.txt” im Boot-Ordner angepasst:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.X.Y:/Public/pxeroot/zigbee rw vers=3 ip=dhcp rootfstype=nfs smsc95xx.turbo_mode=N elevator=deadline rootwait

Neustart des Raspberry Pi

Jetzt müsste der Pi ohne SD-Karte neu gestartet werden können. Er wird nach ca. 5 Sekunden vom Netzwerk booten und das System wird bis auf eine Fehlermeldung bzgl. der SWAP-Datei ganz normal hoch fahren.

Dann sind noch folgende, abschließende Arbeiten zu tun:

  • Deinstallieren von “dphys-swapfile” und erstellen und einbinden einer manuell erzeugten SWAP-Datei
sudo apt-get remove --purge dphys-swapfile
sudo rm /var/swap
sudo update-rc.d dphys-swapfile remove
 
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo losetup /dev/loop0 /var/swap
sudo mkswap /dev/loop0
sudo swapon /dev/loop0

vi /etc/rc.local
echo "Swap einbinden"
sleep 3
losetup /dev/loop0 /var/swap
mkswap /dev/loop0
swapon /dev/loop0
  • Außerdem mache ich noch ein bischen Tuning
vi /etc/default/rcS
ASYNCMOUNTNFS=no 

vi /etc/sysctl.conf
vm.min_free_kbytes=12288
  • Dann noch ein abschließender Neustart und die Konfiguration ist abgeschlossen.

Wie schon bei Version 1.0 des Grillpavillons angekündigt, möchte ich auch wenn ich nicht grille den Pavillon mit etwas Ambiete-Beleuchtung erhellen, so wie auch den ganzen restlichen Garten.

Natürlich habe ich direkt an RGB LED Streifen gedacht, die ich aber auch über KNX steuern möchte. Doch nun erstmal die Hardware, zur Steuerung kommen wir später.

Ich habe mir also 2x 5m LED Streifen bestellt, mit der typischen infrarot Fernbedienung. Das Ganze ist natürlich Wasserfest (IP68). Und da ich möglichst viel Licht haben möchte, habe ich RGBW Streifen gewählt. Also sitzt dort alle paar cm auch eine weiße LED und der Streifen hat 4 Kanäle die ich separat steuern kann (rot, grün, blau und weiß).

Trotzdem lassen sich die Streifen alle paar cm mit einer normalen Schere zerschneiden. Mit einem Messer kann man an den vorgesehenen Stellen einfach die Schutzschicht abschneiden und dann an den vorhandenen Lötpads Kabel anlöten um z.B. zwei Streifen “um die Ecke” mit einander zu verbinden. Danach wieder Schrumpfschlauch drauf (wegen Wasserfest) und fertig.

Und, damit das Licht etwas mehr gestreut wird, habe ich mir Aluminium Profile mit einem entsprechenden Aufsatz besorgt.

Aluminiumprofil mit diffuser Abdeckung
Aluminiumprofil mit diffuser Abdeckung

Zuerst habe ich mir überlegt wie ich das Aluminiumprofil am Pavillon befestigen soll. Denn das vorhandene Gestänge ist rund, das Profil aber gerade, bzw. eckig. Ich brauche also einen Adapter. Endlich mal wieder ein (sinnvoller) Fall für den 3D-Drucker.

Ich habe also einen Adapter entworfen und unter jeder 2m Schiene Profil 4 Adapter befestigt. Die runde Seite kommt auf das Pavillon Gestänge. Die Kerben sind für Kabelbinder – so muss ich nicht Bohren. Das Profil klebe ich einfach mit üblichen Konstruktionskleber auf meine Adapter – fertig.

Hier gibt es natürlich auch wieder die STL-Datei für den Adapter.

Und so sieht das ganze dann fertig montiert aus. Schon sehr schön, aber eben nur mit der dusseligen Fernbedienung zu steuern.
Das darf so natürlich nicht bleiben und da ich alles an Ambiente-Beleuchtung im Garten ja mit Zigbee lösen möchte, habe ich mir für den LED Streifen einen entsprechenden RGBW-Zigbee-Controller besorgt.

Verkabelung Zigbee RGBW Controller

Ich habe die 5 Adern des Strips mit einem 8-Adrigen Kabel bis in meine kleine Verteilerbox geführt. Die Stecker des mitgelieferten Netzteiles habe ich gekürzt und direkt an die schon gelegte Verkabelung angeschlossen.

Zigbee Controller am RGBW Stripe

Sieht etwas wild aus, aber wenn man in der Kiste dann etwas auräumt, dann ist es ok und der Deckel passt super drauf.

Zigbee Controller im Verteilerkasten

Warum es jetzt gerade Zigbee geworden ist, könnt Ihr hier nachlesen.

Wie ja schon mehrmals beschrieben wohne ich in einem Altbau. (d.h. schlecht, bis gar nicht gedämmt).

Bei den aktuellen Temperaturen sorgt das natürlich dafür, dass sich das Haus schnell aufwärmt und man vor Hitze kaum in den Schlaf kommt. Größtes Problem sind dabei wohl auch die Fenster auf Ost-, Süd- und Westseite.

Meine Wetterstation (Gira KNX Wetterstation) misst aber nicht nur Regen und Wind, sondern eben auch Licht. Sogar in genau diesen drei Ausrichtungen. Ich bekomme in der Tat 3 verschiedene Messwerte, für je eine Richtung einen.

Jetzt habe ich mir schnell eine Logik gebastelt, welche die automatischen Rollos, bei längerer Sonneneintrahlung auf einer Seite auf 50% herunter fährt. Allerdings auch nur, wenn Sie noch oben sind. D.h. ist kann manuell mit den Rollos machen was ich möchte, aber wenn Sie morgens auf 0 sind (also ganz oben), werden sie bei Bedarf automatisch halb herunter gefahren und somit ein Aufheizen der Räume reduziert.

Die Logik im Gira Experten meines Homeservers sieht so aus:

Gira Homeserver Logik für Rollosteuerung bei Sonneneinstrahlung

Natürlich berücksichtige ich auch die Raumtemperatur. Wenn diese ohnehin schon wärmer als eingestellt ist, nur dann fährt das Rollo auch runter.

Oft merkt man ja immer erst was fehlt, wenn man es braucht. So auch bei diesem, diesmal wirklich kleinen Projekt.

Denn aktuell ist das Wetter tagsüber ja wirklich schön warm, aber Abends wirds nochmal knackig kalt. Tagsüber sind also die Fenster offen – und abends werden sie dann schon mal vergessen wieder zu schließen.

Da ich aber nicht für die Luftwaffe heizen möchte, habe ich eine kleine Logik erzeugt, welche den Einwohnern eine Email schickt.

Schnell und einfach gemacht und trotzdem effektiv. So werde ich das Fenster im Bad oder Schlafzimmer nicht mehr vergessen.

Fenster-Offen-Logik des Gira Home Servers

Wichtig bei den Alarm-Emails im Homeserver ist jedoch, eine “Totzeit” einzustellen. Sonst werden wohlmöglich sehr sehr viele Emails erzeugt.

Wie ist immer so ist im Leben: Man kann noch so viel planen, irgendwas kommt immer dazwischen und wirft alles wieder durcheinander. 😉

So auch dieses Projekt, denn:
Mein Zisternen-Sensor hat einen Wasserschaden!

Wasserschaden HC-ST04 Ultraschall Abstandssensor
Wasserschaden am HC-ST04 Ultraschall Abstandssensor.

Das kommt daher, dass sich am Deckel über dem Sensor Kondenswasser bildet und dann auf den Sensor tropft. Das ist auch wohl schon im Winter passiert, so durchgerostet wie einige Teile des Sensor-Moduls sind.

Da ich den Sensor nun erneuern muss, bot sich auch die Gelegenheit gleich noch ein paar Dinge mit zu verbessern:

  • Die Halterung. Diese muss jetzt ja auch vor Wasser von oben schützen
  • Außerdem war der Sensor sehr nah über dem Saugschlauch montiert, das brachte die Messung hin und wieder durcheinander.
  • Und dann muss man ja auch alle paar Wochen noch den Schmutz-Fang-Korb sauber machen. Also wollte ich die Kabel steckbar machen um die Wartung zu erleichtern.

Zunächt also musste ein neuer Sensor her. Wie schon zuletzt habe ich einen HC-SR04 besorgt. Diesmal als Set – man weiß ja nie. 😉

Dann habe ich eine neue Halterung entworfen und ausgedruckt. Diesmal mit Deckel und auch etwas näher an der Wasseroberfläche montiert. Es sind drei Teile: Einmal die Halterung, dann der Deckel und dann der Haltewinkel für die Metallschiene swe Zisterne. Alles werde ich mit 6mm Gewindestangen verbinden. Hier gibts auch die .STL Datei.

Zisternen Sensor Halterung 2.0
Neue Halterung für Abstandssensor

Doch bevor ich alles zusammenbaue, hier nochmal die Einzelteile:

Einzelteile Halterung 2.0
Einzelteile Halterung 2.0, M6 Muttern, Unterlegscheiben, Gewindestangen und die gedruckten Halterungen.

Dann habe ich erstmal gelötet und das Kabel bzw. Sensor mit Pfostensteckern versehen. So kann ich das Kabel ganz leicht vom Sensor oder von der Basis trennen.

Und montiert in der Zisterne sieht es dann so aus. Denke, das ist deutlich professioneller als mit der alten Halterung. Und ich hoffe das “Dach” schützt den Sensor ausreichend.

Montierter Abstandssensor in Zisterne
Montierter Abstandssensor in Zisterne

Was macht man wenn man entspannt im Garten sitzt, das schöne Wetter genießt und dann der Postbote 3mal (oder öfters) klingelt?
Man hört ihn nicht und bekommt sein heiß ersehntes Paket nicht.

Dieser Zustand ist natürlich nicht haltbar, so habe ich zusätzlich zu meinen zahllosen anderen Projekten mal schnell ein neues aufgemacht.

Im Baumarkt meines Vertrauens habe ich zusammen mit meiner Sachverständigen für schöne Klingeltöne (aka. Freundin) eine neue Klingel gekauft. Da mein Pumpenhaus direkt an die Terasse grenzt werde ich dort einen Klingeltrafo und einen 1-Port Aktor einbauen, der dann Bus-gesteuert eine Sequenz mit einer kleinen Klingel-Melodie auslöst.

Nötiger Kleinkram

Ich habe mir folgenden Kleinkram zugelegt:
Zuerst das Netzteil / Klingeltrafo von EATON.

Eaton Hutschienen Klingeltrafo

Dann einen einfachen 1-Port-Aktor von MDT (da alle meine Aktoren von MDT sind).

MDT Unterputz 1-Port Aktor

Der Verkabelung im Sicherungskasten sieht dann so aus. Simpel und einfach.

Neu verkabelter Sicherungskasten

Natürlich möchte ich, dass die außen Klingel nur klingelt, wenn auch jemand draußen ist. Das mache ich mal an der geöffneten Terassentür fest. Hier ist die entsprechende Logik dafür. (unterer Teil)

Logik zum Ausführen der Klingelsequenz

Und hier noch ein Screenshot der Sequenz.

Sequenz für das Klingeln

Schon ist das Projekt Gartenklingel fertig und es sollte kein Besuch mehr an mir vorbei gehen.

Auch im neuen Jahr habe ich natürlich wieder einige Ideen, was ich noch alles umsetzen und verbessern möchte.

Neben meiner Gartenbeleuchtung und Bewässerung möchte ich vor allem mein Haus per Sprache steuern. Doch nach den letzten Datenskandalen bei Amazon (siehe z.B. heise.de) möchte ich mir auf keinen Fall eine solche Wanze in mein Haus (vielleicht sogar in jeden Raum) hohlen.

Daher muss ein System her wo
a) ich als Individuum nicht eindeutig identifizierbar bin
b) die Spracherkennung komplett lokal stattfindet

Wie sich einige vielleicht erinnern habe ich schon einmal versucht so ein System im großen Stil selbst aufzuziehen und habe dafür sogar eine Kickstarter Kampagne gemacht (die leider nicht finanziert wurde).

Jetzt werde ich einen neuen Versuch wagen – aber deutlich kleiner. Es gibt mittlerweile diverse Frameworks für Sprachassistenten:

  • MyCroft
  • Snips
  • Jarvis
  • Hound
  • PocketSphinx

Ich bin noch weiterhin in der Evaluierungsphase, aber nach aktuellem Stand überlege ich folgendes zu tun:

  • Einen Fork von MyCroft erstellen und die Verknüpfungen zur Cloud entfernen (was nach den Aussagen auf deren Homepage auch so erlaubt ist)
  • Ein eigenes, neuronales Netz (DeepSpeech) für deutsche Sprache trainieren (oder sollte ich online eines finden dieses benutzen)
  • MyCroft zusammen mit meiner lokalen Spracherkennung nutzbar machen

Einen Fork von Mycroft zu erstellen und diesen offline lauffähig zu machen wird dabei nicht das große Problem sein. Aktuell stehe ich beim neuronalen Netz.

Nachdem ich mich jetzt umfangreich mit dem Thema KI, neuronale Netze und Spracherkennung auseinander gesetzt habe, habe ich mir von “The Spoken Wikipedia” und “VoxForge” rund ca. 250 Stunden deutsche Sprachsamples geladen und diese so umgewandelt, das ich mit DeepSpeech ein neuronales Netz trainieren konnte (hat auf meiner Hardware 3.78 Wochen gedauert).
Die Spracherkennung war schon sehr gut, allerdings nur wenn ich nahe an dem Mikrofron stand. In der Praxis wird aber später z.B. Raumhall die Sprache verändern. Auch darauf muss ich das Netz trainieren. Ich habe also alle Sprachsamples mit Raumhall angereichert (digital natürlich) und trainiere aktuell wieder. Vermutlich wird es ca. 2 Monate dauern, da ich jetzt fast doppelt so viele Sprachdaten habe. Mir ist bewusst das ich auch in der Cloud viel schneller trainieren könnte, jedoch habe ich zu Hause Solarstrom und kann somit (fast) kostenfrei das Netz trainieren.

Und ich setze große Hoffnung in das Mozilla Common Voice Projekt und möchte alle einladen dort mitzumachen. Dort werden Sprachdaten gesammelt und geprüft und dann allen kostenlos zur Verfügung gestellt. Englisch ist bereits fertig und zum Download bereit, an Deutsch wird noch gearbeitet (Stand jetzt 191 Stunden vorhanden). Sobald Deutsch zum Download angeboten wird, werde ich erneut ein Netz trainieren (müssen) um die Erkennung noch weiter zu verbessern. Vielleicht wird Mozilla beim DeepSpeech Projekt auch direkt ein trainiertes Modell für Deutsch zum Download anbieten. (so wie für Englisch geschehen). Dann kann ich mir das Training selbst sparen.

Ansonsten werde ich das Projekt so aufziehen, wie schon bei meinem Listen2Me Projekt geplant:

  • Ein “potenter” Server im Haus (i3, 8 GB, …)
  • In jedem Raum ein Beakon (Pi mit Fernfeld Mikrofon)

Die Beakons senden die Sprache als Stream an den Server, der wandelt die Sprache in Text um und übergibt diesen dann an den digitalen Assistenten. Sobald ich erste sinnvolle Resultate habe, werde ich umgehend einen weiteren Beitrag schreiben.



So. Nun kommt die schöne Jahreszeit und ich kann mich weiter um den Garten kümmern. Die Unterverteilung ist ja schon montiert, aber jetzt rüste ich ein paar Funktionen nach:

  1. Ich habe ein Gartentor gebaut und möchte erfassen ob es offen oder geschlossen ist
  2. Möchte ich meinen Unterstand im Garten mit Steckdosen ausstatten, die per Schlüsselschalter aktiviert werden können
  3. Anschluss der Parkplatzbeleuchtung
  4. Anschluss der Led-Ambiente-Beleuchtung

So sieht die Verteilung aktuell aus.

Sicherungskasten offen

Sicherungskasten geschlossen

Die Kabel sind also drin und die ersten Verbraucher sind am Aktor angeschlossen.

Die Parkplatzbeleuchtung wird vom sowieso vorhandenen Bewegungsmelder mit geschaltet. Dazu habe ich in die Programmierung des Melders einfach nur den zweiten Aktor hinzugefügt, und schon geht der LED-Fluter mit an und aus. (Punkt 3)

Dann habe ich 4 Außenleuchten gekauft und rund ums Haus platziert. Diese sind parallel geschaltet und das Erdkabel der Lampen ist in der Verteilung aufgelegt. Dann noch schnell den Aktor angeschlossen, die Sicherung hoch gedrückt und schon leuchtet es Abends gemütlich rund ums ganze Haus. (Punkt 4)

Diese Verbaucher sind oben links an den Klemmen angeschlossen. Alle Aktorausgänge hatte ich ja zuvor mit diesen Klemmen verbunden. So bleibt es schön übersichtlich.

Punkt 2 (die Steckdosen) war etwas trickreicher. Ich wollte natürlich endlich mal Strom am Unterstand haben, möchte aber nicht das diese ständing unter Spannung stehen (meine Paranoia lässt grüßen). Natürlich hätte ich jetzt einen teuren Schlüsselschalter kaufen können (um die 100,- € habe ich gesehen) und die Phase damit unterbrechen / verbinden können. Allerdings erschien mir das nicht “cool” genug.

Vor allem wollte ich aber auch, dass die Steckdosen – wie alles andere auch – über den Bus geschaltet werden können und somit auch über das Handy usw. bedienbar sind.

Ich habe mir also einen 4-Fach Schalteingang (MDT BE-04001.01) zugelegt, diesen direkt programmiert und beschriftet. (es geht nichts über Dokumentation ! 😉 )

MDT Binäreingang, 4fach MDT Binäreingang, 4fach mit VerkabelungSchlüsselschalter getarnt offen Schlüsselschalter TarnungDann habe ich einen günstigen Schlüsselschalter gekauft (bei einem der großen Elektronikversender, Auchtung: Auf einbautiefe achten!) und diesen getarnt in eine Steckdose eingebaut.
Der Schlüsselschalter verbindet einfach einen Port des Schalteingangs. Und dieser weisst dann den Aktor an zwei Eingänge (also zwei Phasen für die Steckdosen zur Lastverteilung) zu schalten.

So kann ich also nun die Steckdosen manuell per Schalter, oder über den Bus (z.B. per Handy) steuern. Punkt 2 ist damit auch erledigt.

 

Nun kommt Punkt 1. Obwohl ich nicht wirklich geübt bin Holz zu verarbeiten (Elektro geht viel besser!) finde ich, ich habe ein ganz passables Gartentor hin bekommen. Dies habe ich mit einem simplen, eingeschweissten Reedkontakt (Magnetkontakt) ausgestattet und mit dem für Punkt 2 angeschafften Schalteingang verbunden.
Tor zu = Kontakt geschlossen
Tor offen = Kontakt offen
Das brauche ich jetzt nur noch über den Bus zu signalisieren.
Der aufwändigste Teil an diesem Punkt war tatsächlich eine “schöne” Kabelverlegearbeit.

Reedkontakt montiert Reedkontakt montiert mit Kabel

Somit ist Punkt 1 auch erledigt und meine Elektroarbeiten im Garten erstmal beendet.

Als nächstes werde ich mich dann wohl um eine automatischen Gartenbewässerung kümmern…

Nachdem ich ja schon vor einiger Zeit zu diesem Thema experimentiert habe gehe ich dieses nun wieder an.

Ich habe erneut viel gesucht und recherchiert und kein fertiges Produkt gefunden, dass meine Ansprüche an Datenschutz erfüllt. Darum werde ich es wieder selbst bauen. Während meiner Arbeit kam mir dann die Idee, aus dieser Software vielleicht ein “richtiges” Produkt zu machen, so dass auch andere von meiner Arbeit profitieren können.

In den letzten Wochen habe ich viel Zeit in die Planung und Entwicklung einer Crowd-Funding-Kampagne gesteckt (ist mein erstes Crowd-Funding) und die Software hat sich zu einem “richtig großen Ding” gemausert.

Falls du Interesse daran hast die Kampagne zu unterstützen, ist hier der Link zur Projektseite.