Vor vielen Jahren habe ich mal eine Stand-Alone Wetterstation mit Außensensor geschenkt bekommen und diese hat eigentlich auch immer gut ihren Dienst getan. Jetzt ist vor ein paar Wochen leider der Außensensor an einem Wasserschaden gestorben. Natürlich funktioniert die Wettervorhersage immer noch, aber ohne Außentemperatur ist das Gerät für mich nicht mehr “vollständig” 😉 – und schon war das nächste Projekt geboren.

Folgende Anforderungen habe ich festgelegt:

  • Möglichst größer Bildschirm (mindestens 7.5″)
  • Batteriebetrieb
  • Anbindung meiner KNX Wetterstation
  • Anzeige von Temperaturen im Haus (zur Kontrolle der Fußbodenheizung)
  • Verlässliche Wettervorhersage
  • Schönes Gehäuse, so dass man es außerhalb des Bastelzimmers aufstellen kann

Lithium Batterien

Egal ob zwei 1,5V Lithium-Batterien in Reihe oder wie in meinem Fall eine CR123(A) 3V Lithium-Batterie: mit Lithium-Batterien läuft die Station super (mit normalen Batterien nicht) und ich nutze sie für µC Anwendungen fast immer. Lithium Batterien halten nämlich ziemlich konstant eine Spannung von 3V. Ab ca. 2,7 V sind dann auch schon über 90% der Kapazität verbraucht und bei ca. 2,55 V ist sie praktisch leer. Auch kurzfristigen großen Strombedarf, wie z.B. bei WLAN oder Bluetooth Betrieb, liefern Lithium-Batterien ohne Probleme. Zusätzlich haben Lithium-Batterien auch noch eine sehr geringe Selbstentladung.

Stromverbrauch

An meinem Labornetzteil habe ich den Stromverbrauch beim Refresh gemessen:
Ingesamt dauert der Vorgang ca. 55 Sekunden.
Maximal werden 137mA gezogen, im Mittel über die 55 Sekunden sind es 41mA.
Im Deepsleep sind es aber immer noch 0,36mA, obwohl der ESP32 eigentlich nur ca. 7µA ziehen sollte. Das liegt wohl an dem Entwicklungsboard. Obwohl ich den ESP32 in Tiefschlaf versetze, scheint auf der Platine noch immer etwas Strom zu ziehen. Vermutlich werde ich die Schaltung nochmal ohne Entwicklungsboard aufbauen müssen.

Labornetzteil zur Strommessung
Labornetzteil zum Messen des Stroms

Bei 0,36mA Standby-Strom komme ich mit den 2500mAh Batterien ungefähr auf 2500mAh/0,36mA=6944h = 289 Tage
Einmal pro Stunde zieht er für eine Minute im Mittel 41mA. Das heißt ich sollte mit einer Batterie ca. 3/4 Jahr hinkommen.
Das reicht für den Anfang, aber ich werde auf jeden Fall noch eine alternative Platine bauen.

Die Software

Elektrik wäre damit (erstmal) erledigt und auch ein Gehäuse musste nicht designed werden. Aber die Software hatte es in sich. Zwar programmiere ich recht oft Microcontroller, jedoch haben die meisten Projekte keine 100 Zeilen. Dieses hier ist eines der umfangreicheren Programme auf Arduino-Basis.

Der Programmablauf ist wie folgt:

  1. WLAN Verbindung herstellen
  2. Wetterbericht von https://openweathermap.org/ holen (REST-API, Ergebnis kommt als JSON, Dienst ist für wenige Abfragen kostenlos)
  3. KNX Daten von Homeserver lesen (ab Firmware 4.7 spricht dieser auch (simples) REST)
  4. Aktuelle Uhrzeit von http://worldtimeapi.org/ holen (wird nur zur Info mit ausgegeben)
  5. Schöne, mit Informationen vollgepackte Oberfläche zeichnen
  6. ESP32 einschlafen lassen

Das Ergebnis sieht dann wie folgt aus.

Wetterstation im 3D Druck Gehäuse mit EInk Bildschirm

Wie immer gibt es das Programm hier: Arduino Wetterstation Code

Beim letzten Starkregen (welcher in Deutschland ja verheerende Schäden angerichtet hat) kam auch bei uns die Kanalisation nicht mehr mit. Gott sei Dank gab es nicht so große Probleme wie anderswo, aber unsere Zisterne ist übergelaufen und dadurch ist mein Sensor in der Zisterne abgesoffen.

Durch Wasser zerstörter Zisternensensor
Durch Wasser zerstörter Zisternen-Sensor

Interessanterweise läuft der ESP8266 noch problemlos, aber die Messung liefert Mondwerte.

Mein Plan ist Elektronik und Sensor wieder zu trennen. Der Sensor wird in der Zisterne versenkt, die Elektronik kommt ins Pumpenhaus.

Wasserstandssensor auf Druckbasis mit Stromschleife
Wasserstandssensor auf Druckbasis mit Stromschleife

Doch wie bringt man einem ESP8266 bei Strom zu messen? Sicher gibt es viele Möglichkeiten, doch ich entscheide mich ganz simpel für einen (passenden) Widerstand, an dem die gewünschte Spannung abfällt.

Wir erinnern uns kurz zurück an die Schule: Da war mal was das hieß “U = I * R”
Und ich möchte das an meinem ADC, wenn der Sensor 20mA liefert eine Spannung von 3.3V anliegt. Das ist die Betriebsspannung meines ESP8266.
Das heißt: R = 3,3V / 0,020A = 165 Ohm -> Ich nehme also einen 150 Ohm Widerstand.
Bei minimaler und maximaler Wassertiefe (= Stromfluss) ergeben sich dann folgende Spannungen.
V = 0,004A * 150 Ohm = 0,6V (minimal)
V = 0,020A * 150 Ohm = 3,0V (maximal)
Das passt also, auch wenn ich nicht den ganzen Messbereich des ADC ausschöpfe!

Jetzt möchte ich den µC noch gegen Spannungen die größer als VCC (=3,3V) + 0.6V sind schützen und den Strom auf unter 0,1mA bringen. Kann ja immer mal passieren das irgendwo ein Kurzschluss entsteht oder beim Aufbau Kabel vertauscht werden.
R= (24V-(3,3V+0,6V)) / 0,0009A = 22333 Ohm -> Ich nehme also einen 27k Widerstand.

So sieht die modifizierte Schaltung nun aus:

Schaltplan des neuen Zisternen-Sensors mit Wasserdrucksensor
Schaltplan des neuen Zisternen-Elektronik mit Wasserdrucksensor.
Wichtig: Die GNDs der beiden Spannungsquellen sind verbunden! (auf dem Schaltplan nicht zu sehen)

Jetzt schaut man sich den Schaltplan an und denkt: Ok, R2 = 27kOhm, das ist also der Schutzwiderstand.
Aber sollte R3 lt. Berechnung nicht 150 Ohm sein? Warum steht im Schaltplan 50 Ohm?
Das liegt daran, das ich in die Falle meines ESP-Moduls getappt bin. Nachdem ich das so gebaut hatte und der ADC irgendwie nichts sinnvolles gemessen hat, habe ich etwas Datenblätter gewälzt und festgestellt, das die “rohen” ESP-Module – wie ich sie verwende – einen Spannungsbereich am ADC von 0-1V erwarten (trotz 3,3V Betriebsspannung). Es gibt Module da ist direkt ein Spannungsteiler eingebaut, bei meinem nackten Modul aber nicht.

Also nochmal neu gerechnet:
R = 1.0V / 0,020A = 50 Ohm -> Ich nehme also einen 51 Ohm Widerstand.
Der Schutzwiderstand bleibt gleich.
Proberechnung:
V = 0,004A * 50 Ohm = 0,2V (minimal)
V = 0,020A * 50 Ohm = 1,0V (maximal) (hier liefert der ADC dann den Wert 1023)

Neue Schaltung auf Lochrasterplatine
Neue Schaltung auf Lochrasterplatine

Man sieht meine geliebte (aber sehr labile) Wurfverkabelung, mit der ich quasi immer arbeite. 😉
Im Hintergrund ist der USB->Seriell Konverter zu sehen (zum Programmieren) und vorne links, unter der Platine ist der Step-Up-Wandler. Die Platine ist jetzt durch das aus- und einlöten diverser Bauteile ganz schön verbraten, aber muss ja auch keinen Schönheitspreis gewinnen.

Ordentlich verpackt in eine Abzweigdose die rumlag sieht es dann so aus.

Schaltung in Abzweigdose
Schaltung in Abzweigdose

Wie man sieht habe ich das Kabel vom Sensor mit einem Hohlstecker versehen, damit ich die Elektronik für Wartungszwecke leicht vom Sensor trennen kann.

Jetzt fehlt noch der angepasste Arduino Sketch:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const int sensorEnable = 15; // PIN für den Transistor zum aktivieren des Step-Up-Wandlers
const byte sensorPin = A0; // ADC für den sensor
const uint16_t resistor = 51; // Eingesetzter Pull-Down Widerstand
const int maxAdcWennVoll = 472; // Prozentuale Umrechnung

ESP8266WebServer server(80); // Webserver
WiFiClient client;

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

  IPAddress ip(192, 168, X, Y);
  IPAddress gateway(192, 168, X, Z); 
  IPAddress subnet(255, 255, 255, 0); 
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("**netzwerk**", "**geheim**");

  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");

  pinMode(sensorEnable, OUTPUT);
  digitalWrite(sensorEnable, LOW);
  
  pinMode(sensorPin, INPUT); 
}

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

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

void handle_normal() {
  Serial.println("handle /");
  long pressure = measurePressure();  
  long percent = pressure * 100 / maxAdcWennVoll; //umrechnen auf prozent
  
  String msg = String("<!DOCTYPE html><html>") + 
    "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" + 
    "<link rel=\"icon\" href=\"data:,\">" + 
    "<body><h1>Zisterne Measusement Server</h1>" + 
    "<p>Use get parameter hs for homeserver</p>" + 
    "<p>Exampe: /hs/1</p>" + 
    "<br><br><p>Current pressure: " + String(pressure) + "</p>" + 
    "<br><br><p>Current percent: " + String(percent) + "</p>" + 
    "</body></html>\r\n" ;
  server.send(200, "text/html", msg); 
}

void handle_hs() {
  Serial.println("handle /hs");
  long pressure = measurePressure();
  long percent = pressure * 100 / maxAdcWennVoll; //umrechnen auf prozent
  String msg = String("D=" + String(percent) + "\r\n");
  server.send(200, "text/html", msg); 
} 

int measurePressure() {
  Serial.println("setting 24v on");
  digitalWrite(sensorEnable, HIGH);
  delay(5*1000); //auf sensor warten
  
  Serial.println("start measuring");
  int myValue = doMeasure(); 
  Serial.println("done measuring");
  
  Serial.println("setting 24v off");
  digitalWrite(sensorEnable, LOW);
  return myValue;
}

int32_t doMeasure() {
  float minAdc = 0.004 * resistor * 1024;
  float maxAdc = 0.020 * resistor * 1024;
  
  int adc = 0;
  for (byte i = 0; i < 3; i++)
  {
    int m = analogRead(sensorPin);
    Serial.println("adc" + String(m));
    adc += m;    
    delay(10);
  }
  adc = adc / 3;
  int32_t value = (adc - minAdc) * int32_t(1023) / (maxAdc - minAdc);
  if (value > 1023) value = 1023;
  else if (value < 0) value = 0;
  return  value;
}

Ich hoffe das diese Version jetzt rebust genug ist und der China-Sensor auch ein paar Jahre durchhält.

Jetzt soll das hier aber kein 3D Drucker test werden. Davon gibt es schon mehr als genug und ich kann diese einfach nur bestätigen: Druck starten -> wiederkommen -> perfekt 😉

Jetzt sollte mein neuer Drucker aber auch ein neues zu Hause bekommen und nicht einfach nur auf der Werkbank stehen. Gerade der Filamentwechsler soll wohl eine Menge Platz brauchen (noch nicht zusammen gebaut). Und wenn ich ABS oder ASA Drucke, muss ich da auch noch eine Kiste drum rum bauen können und die Abluft irgendwie nach draußen bekommen.

Darum habe ich mich für ein Regal auf Rollen entschieden.

Regal auf Rollen mit 3D Drucker und Filamentrollen
Regal auf Rollen mit 3D Drucker und Filamentrollen

Von unten nach oben ist meine Aufteilung jetzt so: Lager und Ersatzteile, Mülleimer und Werkzeug, Drucker und Rollen in Benutzung, Filamentlager.

Filament Guide für Prusa MK3S
Filament Guide für Prusa MK3S

Dann hatte ich noch eine alte PTZ Webcam herum liegen. Diese habe ich mit Kabelbindern links am Regal befestigt, damit ich den Druck beobachten kann ohne im Raum sein zu müssen.

Kamera und 3D Drucker
Kamera und 3D Drucker

Obwohl, oder vielleicht gerade weil, der Prusa MK3S wirklich solide und robust aufgebaut ist, vibriert das ganze Holzbrett beim verfahren der Y-Achse. Darum habe ich eine Teppichfliese untergelegt, welche die Vibrationen deutlich dämpft.

Für die Halterung der Spulen habe ich mir auch etwas ausgedacht. Diese habe ich auf der rechten Seite mit einer Gewindestange montiert. Da ich viel mit den 3KG Spulen arbeite, war mir eine M8 Stange zu dünn. Daber bin ich auf M12 gegangen.

Zunächste habe ich übliche Stuhlwinkel am Regal festgeschraubt. Auf diese Winkel habe ich dann eine kleine Aufnahme für die Gewindestange geschraubt. Hier gibt es die STL-Datei der Aufnahme.

Stuhlwinkeln und Aufnahme der M12 Gewindestange
Stuhlwinkeln und Aufnahme der M12 Gewindestange
Aufnahme M12 Gewindestange
Aufnahme der M12 Gewindestange

Hier gibt es meine STL-Dateien des Universal Rollenhalters für M12 Stangen. Ich habe 3 Varianten gemacht, kurz, mittel und lang. Für die 3KG Rollen nehme ich die großen, für alle anderen den mittleren.

Universal Rollenhalter mittel
Universal Rollenhalter mittel
Universal Rollenhalter lang
Universal Rollenhalter lang
Universal Rollenhalter nuss
Universal Rollenhalter Nuss
Kugellager für M12 Gewindestangen
Kugellager für M12 Gewindestangen
Rollenhalter ohne Rolle auf Achse
Rollenhalter ohne Rolle auf Achse
Filamentrollen im Regal
Filamentrollen im Regal

Wie schon in den diversen Beiträgen zu meiner Gartenbeleuchtung beschrieben (Es werde Licht (aka. Zigbee und deCONZ), Es werde Licht 2.0 (aka. RGBW Controller und LED Leiste), Es werde Licht 3.0 (aka. Licht Animation erster Versuch)) , baue ich die ganze Ambiente-Beleuchtung im Garten auf ZigBee-Basis auf.

Nachdem mein Rasperry seine SD-Karte zerlegt hatte (ein Dauerproblem bei meinen PIs, was ich jetzt durch Netzwerkboot gelöst habe) habe ich auch mein altes PHP Projekt weggeworfen und durch eine neue Blazor/Razor App ersetzt.

Diese ist sicher noch nicht fertig, aber bietet schon mal die Steuerung einzelner Lampen, Szenensteuerung und vor allem die Möglichkeit zeitgesteuert und automatisch diverse Animationen abzuspielen.

Hier auch mal einige Screenshots der ersten Version.

Zigbee Light Control Konfiguration
Zigbee Light Control Konfiguration
Zigbee Light Control Szenen Übersicht
Zigbee Light Control Szenen Übersicht
Zigbee Light Control Szenen Konfiguration
Zigbee Light Control Szenen Konfiguration
Zigbee Light Control Playlisten Übersicht
Zigbee Light Control Playlisten Übersicht
Zigbee Light Control Playlist Konfiguration
Zigbee Light Control Playlist Konfiguration

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

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.

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

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 oft beschrieben statte ich meinen Garten mit einer Ambiente-Beleuchtung auf Zigbee Basis aus.

Hier habe ich den Grillpavillon und die Teichbeleuchtung beschrieben.

In diesem Beitrag soll es nun um die automatische Steuerung gehen, denn das was die deCONZ App so kann, reicht mir leider nicht.

Da ich ja schon einen Rasperry für deCONZ in Betrieb habe, werde ich eine Webseite auf diesem laufen lassen und dann über REST-API mit deCONZ sprechen.

Ziel ist es, das ich “Animationen” abspielen kann. Also Farbübergänge, Helligkeitsübergänge, usw. Hatte hier ja schon mal ein Video gepostet. Es ist ja immerhin Ambiente-Licht. 🙂

Licht Animationen

Ich habe mich also hingesetzt und ein kleines PHP-Projekt mit Symfony geschrieben. Die Bedienung ist aufs Handy ausgelegt und aktuell ist die Funktion nur ganz simpel (und die Oberfläche ist noch nicht wirklich schön).

  • Es können mehrere “Szenen” erstellt werden
  • Innerhalb einer Szene können beliebige Lampen sein
  • Jede Lampe in einer Szene kann verschiedene “Aktionen” ausführen
  • Zwischen den Aktionen können beliebige Zeitintervalle vergehen
  • Am Ende einer Szene wird diese wiederholt, oder zur nächsten Szene gewechselt

Und dann kam wieder mal alles anders, als geplant

Denn der Raspberry, der die deCONZ App ausführt hat seine SD-Karte zerlegt, und damit ist die ganze Arbeit dahin.
Da ich nicht wieder auf SD-Karten setzen will, bringe ich jetzt allen PIs bei vom Netzwerk zu booten (genauer von meinem QNAP NAS) und setze dann die deCONZ App wieder auf.

Meine Steuersoftware werde ich dann übrigens nochmal komplett neu machen, und zwar als Blazor Projekt. Also komplett in C# – doch das ist ein anderer Beitrag…

Wie in den anderen Beträgen schon erwähnt, möchte ich die Ambiente-Beleuchtung meines Gartens mit Zigbee umsetzen, damit ich das Licht (Farbe, Helligkeit, usw) vom Smartphone oder natürlich auch automatisch steuern kann.

Hier habe ich die Installation den Gateways beschrieben und hier die Ambiente-Licht des Grill Pavillons.

In diesem Beitrag soll es jetzt um die Beleuchtung des Teiches gehen.
Für diesen habe ich mir 4 Zigbee GU10 Leuchmittel und 4 Erdspießleuchten (ohne Leuchtmittel) besorgt.
Diese haben blöderweise ein fest eingschweistes (und damit Wasserfestes) Anschlusskabel – was natürlich immer zu kurz ist. Doch dazu gleich.

Erstmal die cleveren Leuchtmitteln in die Lampen einbauen:

Wegen der immer zu kurzen Anschlusskabel muss ich die Kabel irgendwie Wasserfest verlängern. Bei meiner Suche nach einer Lösung vielen mir dann diese IP68 Muffen von Pollin in die Hände, wovon ich umgehend ein paar bestellt habe. Gibt es nicht nur als T-Stück, sondern auch als Verlängerung. Die Fotos sind schon bei der Montage am Teich entstanden.

Damit konnte ich dann mein Anschlusskabel mit den Lampen verbinden. Über KNX schalte ich also jetzt “nur noch” den Strom der Ambientebeleuchtung (per Szene gehen alle Leuchten auf einmal an), die Farbe und Helligkeit steuere ich dann über Zigbee. Auch dafür habe ich mir noch etwas ausgedacht, aber das ist ein anderes Projekt… 😉

So, sieht der fertige Teich jetzt aus.

Teich mit Beleuchtung und Wasserfall
Teich mit Beleuchtung und Wasserfall

(Handy-Foto im dunkeln. Entschuldigt das Bildrauschen und auch die Lichtstimmung kommt nicht richtig rüber)

Ich denke jeder kann es nachvollziehen wenn ich sage “Rasenmähen nervt”. Also habe ich mir dieses Jahr endlich einen Rasenmäher Roboter geleistet. Ich habe mich nach langer Recherche für einen Gardena Sileno Life 750 entschieden. Direkt mit Garage, aber ohne Gardena Smart – doch dazu später mehr.

Nachdem es dann die Zeit erlaubte habe ich einen Sonntag Nachmittag für die Installation investiert. Tatsächlich ist das verlegen der Schleife und des Leitdrahtes nicht schwierig, dauert aber eben doch seine Zeit. Vor allem der Abstand zu diversen Hindernissen usw. muss ja stimmen, damit sich das Ding nicht fest fährt.

Ich habe also jetzt mein dummes Schaf und es leistet hervorragende Arbeit. Es ist so leise, ich lasse es auch Sonntags laufen. Lediglich die Kanten schneidet er nicht, aber das ist wohl “üblich” und muss dann doch mit einem Trimmer nachbearbeitet werden.

Doch warum habe ich nicht die Smart-Option gewählt? Das diese einen Cloud-Zwang voraus setzt, war für mich ein absolutes No-Go! Trotzdem möchte ich mein Schaf aber natürlich per Smartphone, bzw. vom Bus aus steuern können.

Nach kurzer Recherche bin ich auf Robonect HX gestoßen. Das ist ein Modul welches man zwischen Steuerplatine und Bildschirmplatine einbauen kann und was einem sehr, sehr viele Optionen zur Verfügung stellt.
Dem Aufmerksamen Leser darf ich auch einen Gutschein-Code für den Rebonect Shop verraten: Forum80
Damit gibt es 30 € Rabatt!
(Diesen Code habe ich übrigens auch genutzt. Ich habe also das Modul nicht gesponsert bekommen oder wurde vom Hersteller sonst irgendwie beeinflusst.)

Und das allerbeste. Ein fleißiger Entwickler hat sich bereits die Mühe gemacht ein Homeserver Modul für Robonect zu schreiben und stellt dieses kostenlos zur Verfügung. (aktuell Version 1.0 RC2)

Einbau Robonect Modul

Robonect Modul - www.robonect-shop.de

Heute kam dann endlich das Robonect Modul mit der nötigen Dichtung. (Diese unbedingt mitbestellen!)
Das Modul war schnell nach der hervorragenden Anleitung eingebaut und – da es ein eigenes WLAN aufmacht – auch schnell eingerichtet.

Einrichtung Homeserver Modul

Nachdem der Mäher dann ein paar Testläufe mit dem Modul bestanden hat (die Steuerung per Joystick ist cool!), habe ich dann das oben erwähnte Modul für den Homeserver installiert.

  1. Das Logik-Plugin von “LegoSpieler” aus dem Forum herunterladen
  2. Das Modul über den Gira Experten (ich bin bei Version 4.9) importieren (Logikbausteine->Importieren)
  3. Experte neu starten
  4. Grafischen Logikeditor öffnen und neuen Baustein darauf ziehen (Ordner Robonect)
  5. Wie im Forum beschrieben konfigurieren (IP, User, Pass, Tor geoeffnet und PUSH Einrichten)
  6. Einen “Haufen” Kommunikationsobjekte für die Ausgänge anlegen (ich mache erstmal nur ein paar Statusmeldungen)
  7. Komm-Objekte auf Quad-Client ausgeben
  8. Fertig! 😉

Ob dieser Funktionsumfang so bleibt ist noch unklar. Werde ja auch noch Wetterberichte in meinen Homeserver bekommen und dann könnte ich den Robby nach Hause schicken, damit er nicht so nass wird. Aber das ist ein anderes Projekt.

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.