Ich habe heute den letzten Windows-PC durch Linux Mint ersetzt. Und zwar der Visualisierungs-PC im Wohnzimmer für den Gira Homeserver. Natürlich sollte aber weiterhin der Gira QuadClient darauf laufen, was ich mit Wine gelöst habe.
Hier die Schritte dafür, falls jemand die selbe Anforderung hat.
Ich hatte dann noch ein paar Probleme mit der Startleiste und auch einem überlagernden Startmenu was ich regelmäßig mache um einen Browser zu öffnen um weitere Smarthome-Geräte (wie meinen Rasenmäher) zu steuern. Daher hab ich ein Script geschrieben, welches die nötigen Einstellungen setzt und alles passend startet und auch wieder aufräumt.
#!/bin/bash
# Gira HomeServer QuadClient unter Wine (Wine-Virtual-Desktop).
# Startet einmalig; beim Beenden KEIN Neustart. Volle Auflösung + bedienbares
# Cinnamon-Startmenü (Windows-Taste), da das äußere Fenster nicht Vollbild ist.
export WINEPREFIX="$HOME/.wine-gira"
export WINEARCH=win32
export WINEDEBUG=-all
export DISPLAY="${DISPLAY:-:0}"
QC="$WINEPREFIX/drive_c/Gira/home/qc"
cd "$QC" || exit 1
# Reste einer vorherigen Instanz aufräumen (nur eine Instanz)
wineserver -k 2>/dev/null
sleep 1
# Bildschirmauflösung ermitteln (Fallback 1600x900)
read W H < <(xdotool getdisplaygeometry 2>/dev/null)
[ -z "$W" ] && { W=1600; H=900; }
wine explorer "/desktop=giradesk,${W}x${H}" hs_client_net.exe &
# Auf das Wine-Desktop-Fenster warten und Vollbild-Status entfernen
VW=""
for i in $(seq 1 45); do
VW=$(wmctrl -lx 2>/dev/null | grep -i "explorer.exe.explorer.exe" | awk '{print $1}' | head -1)
[ -n "$VW" ] && break
sleep 1
done
[ -n "$VW" ] && { sleep 2; wmctrl -i -r "$VW" -b remove,fullscreen; }
# Überwachen: sobald das Fenster verschwindet (App beendet) -> aufräumen, Ende
while wmctrl -lx 2>/dev/null | grep -qi "explorer.exe.explorer.exe"; do
sleep 3
done
wineserver -k 2>/dev/null
Das Script dann einfach noch per Icon auf dem Desktop oder per Autostart beim booten ausführen – fertig.
Auch wenn es gerade mal etwas Offtopic ist, beschäfftigt mich diese Thema doch sehr. Denn ich habe seit geraumer Zeit (über 750 Druckstunden) beide Drucker im Einsatz und möchte hier kurz mein Fazit festhalten. Und natürlich die Optimierungen die ich an meinen Druckern vorgenommen habe! 😉 Spoiler: Einen von beiden habe ich wieder verkauft…..
Bambu Lab X1C
Tolle Software
Zunächst mal muss ich sagen, das meiner Meinung nach Bambu die beste Software-Integration hat: Slicer installieren -> Objekt slicen -> Upload zum Drucker -> automatischer Wechsel zur Live-Kamera -> druckt Das ist echt sehr gut gelöst und hat bei mir dafür gesorgt das meine Drucker quasi rund um die Uhr laufen, da ich neue Druckjobs aus der Ferne (also von der Arbeit aus) starten und mit der eingebauten Kamera auch überwachen kann.
Super Tempo und Qualität
Wie ja allgemein bekannt ist sind die Bambu Drucker schnell. Sehr schnell und liefern dabei auch noch gute Qualität. Auch das hat mir am Bambu gefallen.
Schlechte Hardware
Zumindest in meinem Fall muss ich sagen, das ich von der Hardware des X1C nicht begeistert bin. Ich hatte schon innerhalb der ersten 80 Druckstunden 21 (!!) – ja, ich habe eine Strichliste geführt – Probleme. Von den 21 Problemen waren 11 Filamentstörungen im AMS, 9 nicht erkannte Ablösungen vom Druckbett so das es viel Spaghetti gab und sogar einmal einen verstopften Extruder und es war nötig den kompletten Extruder auseinander zu bauen um das zu fixen. Sowas hasse ich sehr: Denn ich habe keine Lust ständig die Maschine zu zerlegen – das Ding muss laufen.
Original Prusa XL
Super Hardware
Im Vergleich zum Bambo X1C finde ich die Hardware von Prusa deutlich zuverlässiger. Ganz objektiv hatte ich in den ersten 80 Druckstunden mit dem Prusa XL keine (also 0 !!) Probleme. Nicht mit dem Filament (das selbe Filament wie beim X1C), nicht mit den Druckköpfen (habe eine 5-Kopf Maschine) und auch nicht mit der Druckbetthaftung. Bei Prusa gilt nach wie vor und auch beim XL: Drucken -> Warten -> fertig
Super Tempo und Qualität
Mit der neuen Firmware (ab 5.1.2) ist der Prusa XL (fast) genau so schnell wie der X1C bei gleicher oder sogar besserer Qualität. Ich habe zu Testzwecken die Drucker gegeneinander antreten lassen (1-Farb-Druck) und bei einem 8:20 Stunden Job war der Prusa nur 2:30 Minuten langsamer (mit Stoppuhr gemessen). Gleiche Schichtdicke, gleiches Filament. Qualität bei Prusa minimal besser aber bei beiden auf sehr hohem Level.
Software Integration nicht vergleichbar
Leider hängt Prusa mit der Software im Vergleich zum Bambu aber etwas hinterher. Und damit meine ich nicht das Slicen, sondern das drum herum. Synchronisierung der eingelegten Farben im AMS mit dem Slicer, das Live-Bild der Kamera, usw. Da kann Prusa noch deutlich aufholen.
Die Entscheidung
Aufgrund der zuverlässigeren Hardware (und auch wegen des größeren Bauraums und des besseren Material- und Farbwechsel) habe ich mich dazu entschieden den Prusa XL zu behalten und den Bambu wieder zu verkaufen – wenn es mir gelingt die defizite in der Software-Integration von Prusa sinnvoll auszugleichen. Meiner Meinung nach sind das vor allem folgende Punkte:
Drucken aus der Ferne (nicht unbedingt vom Handy, aber mindestens Mal von einem Arbeitsplatz auf der Arbeit)
Überwachen des Drucks mittels Kamera
Ebenso war mir wichtig nicht unbedingt auf eine Cloud angewiesen zu sein (vor allem nicht wenn ich zu Hause bin und drucken will) und den Drucker nicht permanent eingeschaltet lassen zu müssen, wenn es mal eine längere Druckpause geben sollte.
Also: Bambu verkauft. Prusa XL neben den schon vorhandenen Prusa Mini aufgebaut und an die Verbesserungen gemacht.
Die Verbesserungen
Drucker nicht permanent eingeschaltet lassen
Gerade der Original Prusa Mini ist bei mir nicht mehr im Dauereinsatz. Druckt er länger nicht, möchte ich ihn abschalten. Soll er wieder drucken, möchte ich ihn (auch aus der Ferne) wieder einschalten. Und das alles bitte ohne Cloudzwang. Die einfache Lösung: Eine über ein Webinterface kontrollierbare Steckdose. Hab auch erst ans Smarthome gedacht, das schien mir für den Anwendungsfall aber „zu overkill“. In meinem Fall gab es eine Steckdose von NOUS auf welcher die Software Tasmota vorinstalliert ist. Diese ist Open-Source und kommt ohne Cloud aus. Sie bietet 3 Steckdosen und auch 3 USB Anschlüsse, die ich ebenfalls sinnvoll benutzen kann (s.u.)
NOUS Steckdose mit Tasmota SoftwareTasmota Webinterface
Drucken aus der Ferne
Der Original Prusa XL hat Netzwerk und PrusaConnect/PrusaLink bereits eingebaut. Beim Original Prusa Mini konnte ich ein ESP8266 nachrüsten. Damit kann ich auf beiden PrusaConnect/PrusaLink aktivieren. PrusaLink zum drucken aus dem lokalen Netzwerk und PrusaConnect zum drucken aus der Ferne.
Dabei bin ich darüber gestolpert das ich die beiden Prusas nicht mit PrusaConnect verbinden konnte. Es zeigte sich das beide Geräte beim Booten versuchen die aktuelle Uhrzeit aus dem Internet zu holen – von einem offensichtlich fest in der Firmware hinterlegten NTP Server. Das ist nötig für die SSL-Kommunikation. Meine Firewall hatte es jedoch unterbunden, so dass eine Zuordnung zu PrusaConnect erstmal nicht möglich war. Nachdem ich das dann korrigiert hatte, klappt es wunderbar.
Druckersteuerung und Überwachung sind damit aus der Ferne möglich – aber ohne Kamerabild.
Überwachung der Drucker mit Kamera
Eigentlich ist es eine Schande das Prusa bei einer so teuren Maschine wie dem Prusa XL nicht schon ab Werk eine Kamera verbaut. Und noch viel befremdlicher ist die favorisierte Lösung „Stell ein altes Handy vor deinen Drucker und nutze die eingebaute Kamera als Webcam“. Ein altes Handy zu nutzen war für mich nicht „die richtige“ Lösung. Aber PrusaConnect bietet eine API an womit man Kamerabilder hochladen und im Portal sichtbar machen kann. Leider nur Standbilder und kein Live-Stream, aber zur Überwachung völlig ausreichend.
Also brauchte ich eine Kamera. Bzw. zwei, da ich den Prusa Mini ja auch überwachen will. Nachdem ich mehrere (China) Webcams ausprobiert hatte – alle hatten einen Cloudzwang – und ich nicht 250 € und mehr pro Kamera für etwas professionelles ausgeben wollte war klar: selber bauen.
Man findet im Netz schon viele gute Kamera Lösungen die ich einfach adaptieren konnte. Ich habe mich für die ESP32CAM entschieden. Dieses basiert auf einem Kameramodul, einem ESP32 und die nötige Software ist bereits in der Arduino IDE als Beispielprojekt dabei. Allerdings habe ich noch den Upload zu PrusaConnect hinzugefügt, so dass ich über den eingebauten Webclient sowohl einen LiveStream sehen kann, aber bei PrusaConnect auch alle 30 Sekunden ein neues Standbild bekomme. Hier gibts das Arduino-Programm für die ESP32CAM (inkl. PrusaConnect-Upload), basierend auf dem Beispiel aus der Arduino-IDE.
Original Prusa XL mit ESP32CAM und WeitwinkelobjektivOriginal Prusa Mini mit ESP32CAM und Standardobjektiv
Um den großen Druckraum des Prusa XL auch wirklich komplett im Blick zu haben, habe ich noch eine andere Linse mit 160 Grad Weitwinkelobjektiv gekauft und statt der mitgelieferten Linse verwendet.
Dann noch schnell Halterungen für die Prusa XL und den Prusa Mini sowie ein Gehäuse gedruckt – fertig. Die Stromversorgung mache ich über mit Tasmota Steckdose – so kann ich auch die Kameras aus der Ferne an- und abschalten.
ESP32 Cam am Prusa XLESP32 CAM Prusa XL HalterungESP32 CAM Prusa XL Halterung RückseiteESP32 CAM Prusa Mini HalterungESP32 CAM am Prusa Mini
Es werde Licht
Da es zu Hause in meinem kleinen FabLab doch recht dunkel ist, habe ich dann noch Led-Lampen erworben. Direkt mit Klemmen um sie am Tisch zu befestigen. Auch diese schalte ich mit der Tasmota Steckdose bei Bedarf ein und aus.
Fazit
Auch wenn mit meinen Anpassungen die Software-Integration bei Prusa (noch) nicht ganz so gut wie bei Bambu ist, so muss ich doch sagen das ich mit der Lösung mehr als zufrieden bin: Ich kann komfortabel von überall drucken. Kann die Drucker live überwachen und kann die Drucker bei Bedarf aus der Ferne an- und abschalten.
Wie der aufmerksame Leser weiß, haben sich in den letzten Monaten einige Dinge in meinem Leben verändert. Daher komme ich lange nicht mehr so viel zum basteln wie in der Vergangenheit, aber die aktuelle Energiekriese hat mich zu folgendem Projekt inspiriert.
Ich bin mal durch das Haus gegangen und habe Steckernetzteile gezählt, bzw. diverse Microcontroller und Raspberrys und war erschrocken, wie viele kleine Verbraucher sich so angesammelt haben – die Meisten davon habe ich ja hier dokumentiert. 🙂
Wild entschlossen habe ich angefangen diese zu hinterfragen und ggf. auch einfach als „unnötig“ zu deklarieren. So sind z.B. jetzt alle Spielekonsolen über eine schaltbare Steckdose deaktiviert und viele Dinge die ohnehin wenig oder garnicht benutzt wurden sind entsorgt oder verkauft.
Auch mein Heizungs-Raspberry, der tatsächlich nichts anderes mehr tut als auf das S0 Signal von einem Stromzähler zu hören und 1-Wire Temperatursensoren auszulesen, kam mir doch etwas oversized vor und mit diesem Projekt löse ich ihn durch einen ESP8266 ab. Natürlich bleibt ein Steckernetzteil erhalten, die Stromaufnahme ist aber trotzdem geringer und ich konnte so auch noch die Funktionalität erweitern.
Die Stromzähler
Denn ich habe in den letzten Monaten die Schlafzimmer und das Wohnzimmer mit Klimageräten ausgestattet – das war nicht nur diesen Sommer sehr angenehm. Um die Kosten bzw. den Verbrauch im Blick zu halten habe ich nicht nur die Heizung/Wärmpumpe mit einem Zwischenzähler ausgestattet, sondern auch die beiden Klimeageräte. Für die Wärmepumpe ist schon seit langem ein DRT428DC (3-phasig) im Einsatz und für die Klimaanlagen haben ich mir zwei Eltako WSZ15D-32A (1-phasig) besorgt.
Die Schaltung auf dem Steckbrett
Und los ging die Bastelei! (endlich!) Die Schaltung war auf dem Breadboard schnell zusammen gesteckt. Tatsächlich bin ich bei der Hardware nur über den S0 gestolpert. Bei den Zählern haben die 3.3V des ESP leider nicht ausgereicht für eine zuverlässige Erfassung. Ein Blick ins Datenblatt und es war klar das es mindestens 5V sein müssen. Da mein Steckernetzteil 5V hat, habe ich also für den S0 direkt diese Spannung genommen und mit einem Spannungsteiler die Spannung für die GPIOs angepasst.
S0 Stromzähler Steckbrett
S0 Stromzähler Schaltung
Ich habe mir auch die Mühe gemacht mal einen Schaltplan zu zeichnen: – Ein LM1117-3.3 macht aus den 5V Eingangsspannung 3.3V – In der Mitte sitzt der ESP8266 – Oben links sieht man den Spannungsteiler mit Pull-Down Wiederständen – Unten rechts ist der 1-Wire Bus (parasitär) für die Temperatursensoren. Was man auch sieht sind zwei RJ45 Buchsen. Ich habe nämlich sowohl für die Anbindung der S0-Anschlüsse als auch für die Temperatursensoren zwei Netzwerkkabel zerschnitten um eine zuverlässige Steckverbindung zu bekommen. Da ich die Schaltung dann auf einer Lochrasterplatine unterbringen wollte, habe ich mir auch noch RJ45 Breakout-Boards besorgt.
Die Platine sieht in einem kleine 3D-Druck-Gehäuse dann so aus. (Natürlich gibts zu dem Gehäuse auch noch einen Deckel…
Der Arduino Quellcode
Die Software besteht grundsätzlich aus zwei Teilen. Einmal dem Arduino Sketch für den ESP8266 und einem PHP-Script als Gegenstück, welches auf meinem NAS läuft und die Werte in die Datenbank schreibt.
Der ESP macht folgendes: 1. Per Interrupt auf steigende Flanken auf den 3 GPIOs hören um dann einen Zähler hochzuzählen 2. Nach 60 Sekunden die aktuellen Temperaturen auszulesen 3. Und das alles als JSON an das PHP-Script zu senden
Da mein NAS irgendwie träge ist und der erste Versuch des Datensendens mit einem Fehler abbricht, wiederhole ich als Workaround das Senden einfach so lange, bis es geklappt hat.
Und hier noch das bischen PHP (als Quick&Dirty Script), welches die per JSON gesendeten Werte entgegen nimmt, in die MySQL-Datenbank (ebenfalls auf dem NAS) schreibt und dann noch an den Homeserver schickt.
Damit werden jetzt die gemessenen Werte vom ESP in die Datenbank geschrieben und gleichzeitig auch nochmal an den Homeserver geschickt. Dieser nutzt die Infos „ist die Heizung an?“ oder „ist die Klimaanlage an?“ an verschiedenen Stellen in der programmierten Logik im sinnvolle Entscheidungen zu treffen – und der alte Raspberry ist jetzt ausgemustert.
Wie es manchmal so ist, kann ein einziges Ereignis das ganze Leben verändern. So auch die Geburt meines ersten Kindes. Das ist mit der Grund dafür, warum das basteln aktuell eine etwas niedrigere Priorität bekommen hat.
Aber natürlich gibt das Kind hin und wieder auch Anlass etwas am Haus zu verbessern. Denn aktuell ist Schlaftrainig angesagt und immer wenn abrupt das Nachttischlicht ausgeschaltet wird, ist erstmal „alarm„.
Daher war die Überlegung, das Nachtlicht nicht plötzlich auszuschalten sondern langsam auszudimmen – ähnlich wie bei einem Sonnenuntergang. In der Hoffnung, dass das Kind dadurch nicht erschrickt und das einschlafen leichter fällt.
Natürlich war schon eine kleine Lampe mit LED Leuchtmittel, welches man sogar dimmen könnte, vorhanden und an einer Steckdose angeschlossen. Und tatsächlich sind an meinem Dimmaktor noch zwei Anschlüsse frei. Jedoch hätte ich dazu diese eine schaltbare Steckdose so umverdrahten müssen, das sie eben nicht mehr über einen Schaltaktor läuft sondern über den Dimmaktor. Es wäre die einzige im Haus und irgendwie fühlte sich das nicht richtig an. Zumal ich auch alle anderen Steckdosen im Zimmer auf eine andere Phase (des 5×1.5 welches die Steckdosen speist) hätte umverdrahten müssen – das war mir zu aufwändig.
Stattdessen wollte ich die gleiche Technik nutzen, die auch schon im Garten eingesetzt wird: Zigbee.
Also habe ich zuerst einmal ein entsprechendes LED Leuchtmittel mit E14 Fassung besorgt, welches ich dann über Zigbee steuern will.
Dann habe ich eine Wippe am Lichtschalter so programmiert das die 2-Kanal-Bedienung aktiviert wird, so dass ich einmal einen kurzen und einen langen Tastendruck auslösen kann. Die Idee: – Der kurze Tastendruck fährt überall im Obergeschoss die Rollos runter, schaltet diverse Lichter aus und bereitet alles zum „Ins Bett gehen“ vor. – Der lange Tastendruck startet dann den Dimmvorgang. Es soll innerhalb von 5 Minuten von der maximalen Helligkeit auf „aus“ gedimmt werden.
Meinem Programmierprinzip folgend habe ich in der ETS „nur“ Kommunikationsobjekte für die beiden Tastenaktionen gemacht und den Rest mache ich dann im Homeserver durch eine kleine Logik:
Logik zur Steuerung des Sonnenuntergangslichts
Bei der Ausgangsbox „geht ins Bett“ werden wie beschrieben Rollos herunter gefahren und die Lichter im Flur ausgeschaltet.
Bei der Ausgangsbox „licht dimmen“ bzw „licht reset“ wird über „Web-Seiten abfragen“ eine URL aufgerufen. Denn schon alleine aus Entwicklungs- und Testgründen (den Homeserver muss man ja bei jeder Änderung neu starten) wollte ich den ganzen Dimmvorgang nicht über Sequenzen oder ähnliches steuern, sondern einfach nur der deCONZ-API mit einem Aufruf mitteilen „stelle das Licht so und so ein und nimm dir dafür 300 Sekunden Zeit“. Das habe ich dann als PHP-Script gelöst, welches einfach auf meinem NAS liegt und auf Knopfdruck vom Homeserver aufgerufen wird.
Aufruf einer Webseite im Homeserver 1Aufruf einer Webseite im Homeserver 2
Ich werte im Script noch einen GET-Paramter aus, um die Lampe auch vom gedimmten Zustand wieder auf „ungedimmt“ wechseln zu können. Hier mein Script.
Wie man erkennen kann wird beim starten des Dimmens zuerst die Lampe einmal kurz ein- und ausgeschaltet. Das ist die optische Rückmeldung, dass das Dimmen gestartet wurde.
Ergebnis: Das Licht geht nun auf Knopfdruck von hellweiß auf ein ganz dunkles warmweiß und schließlich aus. Das ganze in einer Zeit von ca. 5 Minuten. Und so wie es aussieht, hilft es dem Kind beim einschlafen.
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
Nach etwas Recherche viel meine Wahl auf ein 7.5″ E-Ink Display von Waveshare (mit weiß, schwarz und roter Farbe). Passenderweise hat Waveshare auch gleich ein ESP32 Board mit entsprechenden Connector/Treiber im Angebot. Der ESP32 hat auch genug RAM, so dass Grafiken und auch die Videobuffer im RAM Platz finden können.
Scheinbar ist schon vor mir jemand auf eine ähnliche Idee gekommen, denn bei Thingiverse gibt es ein schönes und vor allem exakt für meinen Bildschirm passendes Gehäuse. Es hat auch hinten genug Platz für Elektronik und Batterie. Ich habe es allerdings in weiß gedruckt.
Bzgl. Elektronik ist dieses Projekt schnell zusammengesteckt: ESP32 Board mit Display verbinden (Flachbandkabel ist dabei) und eine 3V Lithium Batterie, die ich noch rumliegen hatte, mit dem ESP32 verbinden. Das Display begnügt sich auch mit den 3V, so dass die ganze Installation nun über die Batterie funktioniert.
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 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:
WLAN Verbindung herstellen
Wetterbericht von https://openweathermap.org/ holen (REST-API, Ergebnis kommt als JSON, Dienst ist für wenige Abfragen kostenlos)
KNX Daten von Homeserver lesen (ab Firmware 4.7 spricht dieser auch (simples) REST)
Aktuelle Uhrzeit von http://worldtimeapi.org/ holen (wird nur zur Info mit ausgegeben)
Schöne, mit Informationen vollgepackte Oberfläche zeichnen
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 Zisternen-Sensor
Interessanterweise läuft der ESP8266 noch problemlos, aber die Messung liefert Mondwerte.
Das war mal wieder der Startschuss die Sensorik erneut zu ändern… Jetzt steige ich auf einen Drucksensor um, der mir einen Strom zwischen 4mA und 20mA liefert (je nach Wasserstand). Das ganze nennt sich Stromschleife. Das ist für mich erstmal neuDas scheint in der Industrie durchaus üblich zu sein, da Störeinflüsse minimiert werden. Wiki sagt dazu folgendes: https://de.wikipedia.org/wiki/Stromschnittstelle
Mein Plan ist Elektronik und Sensor wieder zu trennen. Der Sensor wird in der Zisterne versenkt, die Elektronik kommt ins Pumpenhaus.
Zunächst also einmal einen Stromsensor (China-Ware) besorgt. Der hatte auch direkt ein passend langes Kabel und macht trotz zweifelhafter Herkunft einen vernünftigen und wertigen Eindruck.
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-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)
Dann sieht man eine zweite Spannungsquelle im Schaltplan. Das liegt daran, das der Sensor 24V benötigt. Dazu nutze ich einen simplen Step-Up-Wandler, der aus den 5V vom Netzteil 24V macht. Um nicht unnötig Strom zu verbrauchen schalte ich den Step-Up-Wandler über einen Transistor vor der Messung an. Als Transistor habe ich das genommen was noch so rumlag. Da kaum Ströme fließen sollte jeder NPN Transistor gehen. Wichtig ist nur, das er bei den 3,3V des digitalen Ausgangs komplett durchschaltet. Ich habe dann die bestehende Schaltung auf der vorhandenen Lochrasterplatine entsprechend erweitert.
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
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.
Kurz vor Weihnachten bestellt, und jetzt ist er seit ein paar Tagen da. Mein neuer 3D Drucker! Diesmal ein Prusa MK3S, welcher meinen alten 3D Drucker nun endlich in Rente schickt (Flashforge Finder). Da ich sofort drucken wollte habe ich die zusammengebaute Variante bestellt (Asche auf mein Haupt) und nur der automatische Filamentwechsler (MMU2S) ist als Bausatz gekommen.
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
Beim Regal habe ich für einen s.g. Kommissionierregal bzw. einen Kommisionierwagen entschieden. Das hat wirklich ordentliche Rollen und verträgt eine Menge Gewicht. Die Böden kann man nach Bedarf platzieren. Ich habe einen weg gelassen, da ich für den Drucker ein höheres Fach haben wollte.
Von unten nach oben ist meine Aufteilung jetzt so: Lager und Ersatzteile, Mülleimer und Werkzeug, Drucker und Rollen in Benutzung, Filamentlager.
Zunächst mal habe ich den Drucker mit Filament-Guides ausgestattet. Diese habe ich bei Thingiverse gefunden. Sie werden einfach oben an die Metallstrebe geklemmt und sorgen dafür, dass das Filament immer „von oben“ kommt.
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
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
Aufnahme der M12 Gewindestange
Dann liefen die Rollen auf der Gewindestange schon ganz gut, aber noch wirklich „leicht“. Daher habe ich ebenfalls wieder bei Thingiverse universelle Spulenhalterungen heruntergeladen. Da ich aber M12 Stangen verwende, musste ich natürlich die Abmessungen anpassen.
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 lang
Universal Rollenhalter Nuss
In die Halterung kommen dann je zwei Kugellager (6001-2RS). Ich habe die Abmessungen der Halterungen so gewählt, das mit die Kugellager mit etwas Kraft hineindrücken muss und sie dann vom Kunststoff eingeklemmt werden. Das Ergebniss sind dann zwei Stangen, je 50cm, auf denen jeweils bis zu 4 oder 5 Rollen Platz haben. Durch die Kugellager wird das Filament sehr leicht abgerollt.
Ich habe dazu einen Raspberry-Pi mit deCONZ ausgestattet und kann mit der DeConz-App bereits einzelne Lampen steuern auch auch fertige Szenen gestallten – jedoch ist mir das (mal wieder) nicht genug! Ich möchte das sich das Licht automatisch, immer mal wieder ändert. Also animierte Szenen abspielt.
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.
Ich stelle das Programm hier auf GitLab (https://gitlab.com/daywalker79_11/zigbeelightcontrol) bereit und lade alle mit C# Kenntnissen ein daran mit zu machen. 😉
Hier auch mal einige Screenshots der ersten Version.
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 an Decke montiert
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.
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.
Neuer Temperatursensor 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.
Überarbeiteter Sensor Oberseite
Ü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
Webseitenaufruf URL
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.
09.10.2022: Ich hatte ein paar Probleme mit der alten Logik, da diese nicht richtig berücksichtigt hat wenn der ESP Temperatursensor einmal ausfällt. Das ist schon 2 oder 3 mal passiert. Dann lief die Heizung in der Vergangenheit ohne Unterbrechungen auf voller Kraft. Die neue Logik berücksichtig das jetzt besser.
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
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
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:
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