{"version":"https://jsonfeed.org/version/1.1","title":"Tobias Schulz","home_page_url":"https://tbsch.de/","feed_url":"https://tbsch.de/feed.json","description":"Smart Home, Technik, Kram | Persönliche Webseite von Tobias Schulz","language":"de","authors":[{"name":"Tobias Schulz","url":"https://tbsch.de/"}],"items":[{"id":"https://tbsch.de/post/2026-06-10-vater-werden-und-was-das-mit-allem-macht/","url":"https://tbsch.de/post/2026-06-10-vater-werden-und-was-das-mit-allem-macht/","title":"Vater werden - und was das mit allem macht","summary":"Ein Kind krempelt nicht nur den Schlaf um, sondern auch Selbstbild, Hobbys und Freundschaften.","date_published":"2026-06-10T00:00:00Z","date_modified":"2026-06-10T00:00:00Z","tags":["meinung","familie","gewohnheit","bericht"],"content_text":" Ich dachte, ich hätte mein Leben ganz gut im Griff. Dann kam ein winziger Mensch und hat mir liebevoll das Gegenteil bewiesen. Es ist kurz vor vier Uhr morgens. Ich stehe im abgedunkelten Kinderzimmer, wiege ein winziges, warmes Bündel Mensch im Arm und bin müde und überglücklich zugleich. Für den Bruchteil einer Sekunde meldet sich der alte Nerd in mir und fragt, ob man diese Nachtschichten nicht irgendwie eleganter lösen könnte - dann lache ich leise über mich selbst \u0026#x1f601;. Manche Dinge löst man eben nicht. Man ist einfach da.\nUnter dem müden Papa im Halbdunkel steckt nämlich nach wie vor ein Kontrollmensch. Pläne geben mir Ruhe, ein durchdachter Ablauf fühlt sich für mich nach Komfort an und nicht nach Zwang.\nDer Reset, den ich nicht eingeplant hatte # Und dann bekommst du ein Kind, und dieses Kind schert sich null um deine schönen Pläne. Es kennt keine Uhrzeit, es kennt keinen Wochentag, und es fragt dich nicht, ob es gerade passt. Es meldet sich um 3:47 Uhr, und die einzig richtige Antwort darauf ist: da sein. Sofort, und ohne zu überlegen.\nFür mich war das anfangs ungewohnt. Ich konnte nichts vorbereiten, nichts vorausplanen, nichts beschleunigen. Ich musste einfach präsent sein - und das war, ehrlich gesagt, ein bislang verborgenes Talent in mir \u0026#x1f605;. Ich wusste bisher nicht, dass ich dermaßen gut im Improvisieren bin. Nicht alles im Leben muss sich rechnen, manches darf einfach Chaos sein. Wer hätte gedacht, dass mir das ausgerechnet ein paar schlaflose Nächte beibringen.\nDie ersten zwei Wochen nach der Geburt verschwimmen im Rückblick zu einem einzigen, sehr müden Nebel. Schlaf gab es nur noch häppchenweise, immer dann, wenn der kleine Mensch es gerade zuließ, nie am Stück. Und in den ersten vier Wochen war ich eigentlich nur noch am Laufen: hier schnell etwas organisieren, da der Haushalt, dazwischen ein paar Besorgungen, und natürlich immer Mama und Kind versorgen. Stillstand? Fehlanzeige. Ein gern gesehener Gast in dieser Zeit hieß übrigens Lieferando - Kochen stand schlicht nicht auf der Liste der Dinge, für die noch Energie übrig war \u0026#x1f648;.\nUnd dann passiert etwas Erstaunliches: Nach vier, fünf Wochen pendelt sich ein neuer Rhythmus ein. Nicht meiner, nicht der alte - ein komplett neuer, den wir zu dritt erst zusammen erfinden mussten. Verglichen mit diesem ersten Sturm ist der Alltag mit Kind heute ein Klacks. Damals, mitten im Nebel, hätte ich das nicht für möglich gehalten.\nWas es mit dem Nerd macht # Ich bin immer noch ein Nerd. Das bleibt auch so, da müssen alle durch. Aber die Währung hat sich geändert.\nFrüher war Zeit für Hobbys einfach da. Ein Abend mit Python, ein Wochenende mit einem neuen Projekt, kein Thema. Heute messe ich Hobby-Zeit in Minuten, und ich gebe sie sehr viel bewusster aus. Das klingt erst mal nach Verlust - ist es aber nicht. Selbst Apple könnte so einen effektiven Fokus-Filter nicht entwickeln: Wenn ich nur noch eine halbe Stunde habe, mache ich garantiert nicht den Quatsch, der mir eigentlich egal ist. Du kennst das sicher auch: schnell mal einen neuen Docker Container ausprobieren und zack, ist der Abend schon wieder rum. Für solche Themen nutze ich in letzter Zeit sehr stark die Möglichkeiten von KI; mal eben schnell nebenbei.\nSelbst mein Smart Home ist mit Kind nicht komplizierter geworden, sondern ehrlicher: Was nur Spielerei war, nervt im Alltag sofort und fliegt, der Rest darf bleiben.\nWas mir übrigens am meisten hilft, hat ausnahmsweise mal nur indirekt mit Technik zu tun: Ich arbeite im Homeoffice. Früher hielt ich das für einen netten Komfort-Bonus, heute ist es für mich schlicht unbezahlbar. Ich bin bei den kleinen und großen, wichtigen Momenten dabei - beim ersten echten Lachen, bei der ersten Seitwärtsdrehung, beim Mittagsschlaf auf meiner Brust, beim Quengeln, das partout nur auf dem Papa-Arm wieder aufhört. Dafür bin ich meinem Arbeitgeber sehr dankbar. Längst nicht jeder Berufstätige in Vollzeit hat dieses Privileg, und ich vergesse das keine Sekunde.\nWas es mit dem Umfeld macht # Eine Sache, die mir vorher niemand so deutlich gesagt hat: Ein Kind sortiert ganz nebenbei dein Umfeld. Nicht immer mit großem Knall - einfach dadurch, dass dein Alltag enger getaktet wird und du auf einmal sehr genau merkst, für wen darin noch Platz ist.\nAm Anfang passiert sogar das Gegenteil von Sortieren. Du lernst plötzlich andere frischgebackene Eltern kennen, und durch den geteilten Schlafentzug fühlt sich das in Windeseile nach tiefer Freundschaft an. Man schreibt sich nachts um drei, weil beide ohnehin wach sind, man teilt die kleinen Katastrophen und die großen Glücksmomente. Diese Nähe ist echt - aber sie entsteht eben unter Ausnahmebedingungen. Und was im Ausnahmezustand zusammenwächst, hält dem normalen Alltag nicht immer stand. Manche dieser intensiven Anfangsfreundschaften werden wieder leiser, sobald sich der erste Sturm legt. Das tut kurz weh, ist aber völlig normal.\nGleichzeitig verschieben sich die alten Beziehungen. Freunde ohne Kinder leben in einem anderen Takt; du sagst öfter ab, als dir lieb ist, und irgendwann lädt man dich gar nicht mehr spontan ein. Das ist selten böse gemeint, es ist einfach das Auseinanderdriften zweier Lebensphasen. Dafür werden andere Verbindungen unerwartet eng - oft genau die, von denen du es am wenigsten gedacht hättest.\nUnd dann gibt es da die Menschen, die in den ersten Wochen einfach da waren - ganz praktisch und bedingungslos. Freunde und Familie, die mit Essen vor der Tür standen oder sogar einen vorgekochten Topf dalassen, schnell den Müll rausbrachten oder im Vorbeigehen eine Maschine Wäsche anwarfen, während wir beide am absoluten Limit liefen. Niemand schreibt dir vorher ins Lehrbuch, wie kostbar eine warme Mahlzeit ist, die du nicht selbst kochen musstest.\nWas am Ende bleibt, ist eine ziemlich eindeutige Antwort auf eine Frage, die man sich vorher nie so direkt stellt: Wer taucht eigentlich auf, wenn es gerade nicht bequem ist? Wer schreibt nicht nur \u0026ldquo;meld dich, wenn ihr was braucht\u0026rdquo;, sondern steht mit einer Tüte Einkäufe vor der Tür, ohne vorher zu fragen? Diese Liste ist kürzer, als ich dachte. Aber jede Person darauf hat ihren Platz in unserem Herzen mehr als verdient.\nDer neue Maßstab # Vater zu werden hat nicht eine einzelne Sache in meinem Leben verändert, sondern den Maßstab für alle. Routinen, Selbstbild, Hobbys - alles misst sich heute an derselben, sehr einfachen Frage: Ist mir das die Zeit wert, die ich stattdessen mit meiner Familie haben könnte?\nDer Mensch in mir, der immer alles im Griff haben will, hat dabei das Schwerste gelernt, was es für ihn gibt: loslassen. Nicht alles muss durchdacht und durchgeplant sein. Manches muss einfach nur da sein. Pure Aufregung, pures Chaos - und ich würde keine Sekunde davon zurückgeben \u0026#x1f60e;.\nDas Titel-/Hintergrundbild stammt von Marcel Fagin auf Unsplash .","image":"https://tbsch.de/post/2026-06-10-vater-werden-und-was-das-mit-allem-macht/featured.webp"},{"id":"https://tbsch.de/post/2026-06-03-node-red-topic-mapper-f%C3%BCr-zendure-solarflow/","url":"https://tbsch.de/post/2026-06-03-node-red-topic-mapper-f%C3%BCr-zendure-solarflow/","title":"Node-RED Topic Mapper für Zendure SolarFlow","summary":"Ein Node-RED-Flow, der Zendure-MQTT-Topics in ein sauberes Schema für Home Assistant bringt.","date_published":"2026-06-03T00:00:00Z","date_modified":"2026-06-03T00:00:00Z","tags":["smart-home","guide","home-assistant","mqtt","node-red","zendure"],"content_text":" Ein kleiner Node-RED-Flow, der die Zendure-MQTT-Topics in ein verwertbares Schema für Home Assistant überführt. Robust und ohne weiteren Docker-Container. Im Beitrag zur lokalen Anbindung hatte ich den Topic-Mapper-Flow noch nicht teilen können, weil er zu sehr auf meine Installation zugeschnitten war. Inzwischen ist er aufgeräumt, hostnamenfrei und seit Monaten produktiv. Höchste Zeit, den Flow rauszugeben \u0026#x1f601;.\nWarum der Mapper überhaupt nötig ist # Wenn dein SolarFlow lokal über MQTT spricht (das hardcoded Passwort errechnest du hier), bekommst du Topics in dieser Form:\nTopic Inhalt /+/+/properties/report Properties des Hubs und packData der Akkus. /+/+/properties/write/reply Antworten auf Schreibbefehle, gleicher Payload-Stil. /+/+/log und /+/+/event Geräte-Logs und sonstige Events. Die eigentlichen Messwerte stecken alle in einem einzigen properties-Objekt und kommen nur als Delta: ändert sich solarInputPower, kommt eine Nachricht mit ausschließlich diesem Schlüssel. Für saubere MQTT-Sensoren in Home Assistant ist das ungeeignet, denn dort braucht jeder Sensor genau ein Topic mit einem stabilen, retained Wert.\nGenau diese Lücke schließt der Mapper. Er zerlegt jedes properties-Objekt in einzelne Topics, baut für packData einen Akku-Baum, hält den Online-Status nach, und bietet als Bonus einen sauberen Befehls-Eingang.\nInfo Für genau dieses Mapping gibt es ein Python-Skript im Original-Repo des SolarFlow Bluetooth Managers: solarflow-topic-mapper.py . Sehr ordentliche Vorlage, die letzte Code-Änderung liegt allerdings rund zwei Jahre zurück. Vor allem aber wollte ich keinen weiteren Docker-Container für eine Aufgabe, die Node-RED einfach direkt miterledigen kann.\nZielschema # Aus dem Wust an Zendure-Topics soll am Ende dieses Schema rauskommen, alles retained:\nTopic Bedeutung zendure/\u0026lt;device_id\u0026gt;/telemetry/\u0026lt;key\u0026gt; ein Topic pro Property zendure/\u0026lt;device_id\u0026gt;/batteries/\u0026lt;sn\u0026gt;/\u0026lt;prop\u0026gt; ein Topic pro Pack-Property pro Akku zendure/\u0026lt;device_id\u0026gt;/status \u0026quot;online\u0026quot; als Lebenszeichen zendure/cmd/\u0026lt;product\u0026gt;/\u0026lt;id\u0026gt;/properties/write sauberer Befehls-Eingang Der letzte Punkt ist der Komfort-Bonus: Befehle auf zendure/cmd/... werden vom Mapper transparent auf das Zendure-interne iot/... umgeschrieben. Aus Sicht der Automations-Schicht gibt es nur noch einen einzigen Namespace zendure/.\nArchitektur # flowchart TD sf[\"ZendureSolarFlow\"] broker[\"MQTT-Broker\"] parse[\"parse telemetry\"] settopic[\"set topic\"] rewrite[\"rewrite topic\"] ha[\"Home Assistant\"] sf --\u003e|\"/+/+/properties/report\n/+/+/properties/write/reply\"| parse sf --\u003e|\"/+/+/log\n/+/+/event\"| settopic parse --\u003e|\"zendure/__id__/...\"| broker settopic --\u003e|\"zendure/__id__/status\"| broker broker --\u003e ha ha --\u003e|\"zendure/cmd/...\"| rewrite rewrite --\u003e|\"iot/...\"| sf Function Node # Die wichtigste Function. Sie zerlegt properties und packData und setzt nebenbei den Online-Status:\nconst topic_parts = msg.topic.split(\u0026#34;/\u0026#34;); const device_id = topic_parts[2]; const is_write_reply = [\u0026#34;write\u0026#34;, \u0026#34;reply\u0026#34;] .every(part =\u0026gt; topic_parts.includes(part)); let has_properties = false; let has_pack_data = false; if (\u0026#34;properties\u0026#34; in msg.payload \u0026amp;\u0026amp; !is_write_reply) { has_properties = true; for (let key in msg.payload.properties) { node.send([{ topic: `zendure/${device_id}/telemetry/${key}`, payload: msg.payload.properties[key], retain: true, }, null, null]); } } if (\u0026#34;packData\u0026#34; in msg.payload \u0026amp;\u0026amp; Array.isArray(msg.payload.packData)) { has_pack_data = true; msg.payload.packData.forEach(pack =\u0026gt; { const sn = pack.sn; delete pack.sn; for (let prop in pack) { node.send([{ topic: `zendure/${device_id}/batteries/${sn}/${prop}`, payload: pack[prop], retain: true, }, null, null]); } }); } if (!has_properties \u0026amp;\u0026amp; !has_pack_data) node.send([null, msg, null]); node.send([null, null, { topic: `zendure/${device_id}/status`, payload: \u0026#34;online\u0026#34;, retain: true, }]); Drei Outputs: telemetry (verbunden mit MQTT-Out), others (für Debug-Zwecke offen) und status. Die write/reply-Antworten werden bewusst nicht als Telemetrie ausgewertet, weil ihr Payload nur das wiedergibt, was ich selbst gerade geschrieben habe. Sie zählen aber als Lebenszeichen. Das Topic-Ziel enthält absichtlich nur die device_id, nicht die product_id, was die Sensor-Konfiguration in Home Assistant einfacher hält.\nDie beiden anderen Functions sind Einzeiler. set topic setzt für log und event nur den Status \u0026quot;online\u0026quot; auf zendure/\u0026lt;device_id\u0026gt;/status. rewrite topic ersetzt für den Befehls-Kanal das Präfix zendure/cmd/ durch iot/.\nDen Flow importieren # In Node-RED über Menü → Import in einen leeren Tab einfügen. Vor dem Deploy zwei Dinge anpassen:\nMQTT-Broker. Im Knoten Home Assistant MQTT Hostname, Port, Zugangsdaten und TLS-Optionen auf deine Umgebung umstellen. Im Beispiel steht ein Platzhalter mqtt-broker.local mit Port 8883 und aktivem TLS. TLS-Zertifikate. Wenn dein Broker keine Client-Zertifikate verlangt, die TLS-Config leeren oder den TLS-Block entfernen. verifyservercert: false ist auf meine eigene CA gemünzt, prüfe das bei dir. [{\u0026#34;id\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;tab\u0026#34;,\u0026#34;label\u0026#34;:\u0026#34;Zendure SolarFlow Topic Mapper\u0026#34;,\u0026#34;disabled\u0026#34;:false,\u0026#34;info\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;env\u0026#34;:[]},{\u0026#34;id\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;group\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;Zendure Telemetry Topics verarbeiten\u0026#34;,\u0026#34;style\u0026#34;:{\u0026#34;label\u0026#34;:true,\u0026#34;color\u0026#34;:\u0026#34;#999999\u0026#34;,\u0026#34;fill\u0026#34;:\u0026#34;#ffefbf\u0026#34;,\u0026#34;fill-opacity\u0026#34;:\u0026#34;0.2\u0026#34;},\u0026#34;nodes\u0026#34;:[\u0026#34;70239655f64ff049\u0026#34;,\u0026#34;c4294b73f2df7591\u0026#34;,\u0026#34;3ed191421ad7509e\u0026#34;,\u0026#34;990c5574211cdd6a\u0026#34;,\u0026#34;b9f7cc71f1ea571f\u0026#34;,\u0026#34;ab5f182a4c5df576\u0026#34;,\u0026#34;48153921e53c4182\u0026#34;],\u0026#34;x\u0026#34;:14,\u0026#34;y\u0026#34;:119,\u0026#34;w\u0026#34;:612,\u0026#34;h\u0026#34;:202},{\u0026#34;id\u0026#34;:\u0026#34;db3fb2bbd94f8068\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;group\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;MQTT Befehle an Zendure Broker\u0026#34;,\u0026#34;style\u0026#34;:{\u0026#34;label\u0026#34;:true,\u0026#34;fill\u0026#34;:\u0026#34;#ffbfbf\u0026#34;,\u0026#34;fill-opacity\u0026#34;:\u0026#34;0.2\u0026#34;},\u0026#34;nodes\u0026#34;:[\u0026#34;3065a73c7cb7203b\u0026#34;,\u0026#34;a08d74f99a34b6c9\u0026#34;,\u0026#34;c065eba5601fb19a\u0026#34;],\u0026#34;x\u0026#34;:54,\u0026#34;y\u0026#34;:379,\u0026#34;w\u0026#34;:492,\u0026#34;h\u0026#34;:82},{\u0026#34;id\u0026#34;:\u0026#34;70239655f64ff049\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;function\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;parse telemetry\u0026#34;,\u0026#34;func\u0026#34;:\u0026#34;const topic_parts = msg.topic.split(\\\u0026#34;/\\\u0026#34;);\\nconst product_id = topic_parts[1];\\nconst device_id = topic_parts[2];\\nconst is_write_reply = [\\\u0026#34;write\\\u0026#34;, \\\u0026#34;reply\\\u0026#34;].every(part =\u0026gt; topic_parts.includes(part));\\nlet has_properties = false;\\nlet has_pack_data = false;\\nif (\\\u0026#34;properties\\\u0026#34; in msg.payload \u0026amp;\u0026amp; !is_write_reply) {\\n has_properties = true;\\n for (let key in msg.payload.properties) {\\n node.send([{ topic: `zendure/${device_id}/telemetry/${key}`, payload: msg.payload.properties[key], retain: true }, null, null]);\\n }\\n}\\nif (\\\u0026#34;packData\\\u0026#34; in msg.payload \u0026amp;\u0026amp; Array.isArray(msg.payload.packData)) {\\n has_pack_data = true;\\n msg.payload.packData.forEach(pack =\u0026gt; {\\n const sn = pack.sn;\\n delete pack.sn;\\n for (let prop in pack) {\\n node.send([{ topic: `zendure/${device_id}/batteries/${sn}/${prop}`, payload: pack[prop], retain: true }, null, null]);\\n }\\n });\\n}\\nif (!has_properties \u0026amp;\u0026amp; !has_pack_data) node.send([null, msg, null]);\\nnode.send([null, null, { topic: `zendure/${device_id}/status`, payload: \\\u0026#34;online\\\u0026#34;, retain: true }]);\u0026#34;,\u0026#34;outputs\u0026#34;:3,\u0026#34;timeout\u0026#34;:0,\u0026#34;noerr\u0026#34;:0,\u0026#34;initialize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;finalize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;libs\u0026#34;:[],\u0026#34;x\u0026#34;:360,\u0026#34;y\u0026#34;:180,\u0026#34;wires\u0026#34;:[[\u0026#34;c4294b73f2df7591\u0026#34;],[],[]],\u0026#34;outputLabels\u0026#34;:[\u0026#34;telemetry\u0026#34;,\u0026#34;others\u0026#34;,\u0026#34;status\u0026#34;]},{\u0026#34;id\u0026#34;:\u0026#34;c4294b73f2df7591\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt out\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;mqtt out\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;retain\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;respTopic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;contentType\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;userProps\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;correl\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;expiry\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;x\u0026#34;:540,\u0026#34;y\u0026#34;:180,\u0026#34;wires\u0026#34;:[]},{\u0026#34;id\u0026#34;:\u0026#34;3ed191421ad7509e\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;sf properties/report\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;/+/+/properties/report\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;datatype\u0026#34;:\u0026#34;auto-detect\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;nl\u0026#34;:false,\u0026#34;rap\u0026#34;:true,\u0026#34;rh\u0026#34;:0,\u0026#34;inputs\u0026#34;:0,\u0026#34;x\u0026#34;:130,\u0026#34;y\u0026#34;:160,\u0026#34;wires\u0026#34;:[[\u0026#34;70239655f64ff049\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;990c5574211cdd6a\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;sf log\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;/+/+/log\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;datatype\u0026#34;:\u0026#34;auto-detect\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;nl\u0026#34;:false,\u0026#34;rap\u0026#34;:true,\u0026#34;rh\u0026#34;:0,\u0026#34;inputs\u0026#34;:0,\u0026#34;x\u0026#34;:90,\u0026#34;y\u0026#34;:240,\u0026#34;wires\u0026#34;:[[\u0026#34;ab5f182a4c5df576\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;b9f7cc71f1ea571f\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;sf event\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;/+/+/event\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;datatype\u0026#34;:\u0026#34;auto-detect\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;nl\u0026#34;:false,\u0026#34;rap\u0026#34;:true,\u0026#34;rh\u0026#34;:0,\u0026#34;inputs\u0026#34;:0,\u0026#34;x\u0026#34;:90,\u0026#34;y\u0026#34;:280,\u0026#34;wires\u0026#34;:[[\u0026#34;ab5f182a4c5df576\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;ab5f182a4c5df576\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;function\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;set topic\u0026#34;,\u0026#34;func\u0026#34;:\u0026#34;const topic_parts = msg.topic.split(\\\u0026#34;/\\\u0026#34;);\\nconst device_id = topic_parts[2];\\nmsg.topic = `zendure/${device_id}/status`;\\nmsg.payload = \\\u0026#34;online\\\u0026#34;;\\nmsg.retain = true;\\nreturn msg;\u0026#34;,\u0026#34;outputs\u0026#34;:1,\u0026#34;timeout\u0026#34;:0,\u0026#34;noerr\u0026#34;:0,\u0026#34;initialize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;finalize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;libs\u0026#34;:[],\u0026#34;x\u0026#34;:360,\u0026#34;y\u0026#34;:240,\u0026#34;wires\u0026#34;:[[]]},{\u0026#34;id\u0026#34;:\u0026#34;48153921e53c4182\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;dbef3a2a6ac13d38\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;sf properties/write/reply\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;/+/+/properties/write/reply\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;datatype\u0026#34;:\u0026#34;auto-detect\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;nl\u0026#34;:false,\u0026#34;rap\u0026#34;:true,\u0026#34;rh\u0026#34;:0,\u0026#34;inputs\u0026#34;:0,\u0026#34;x\u0026#34;:140,\u0026#34;y\u0026#34;:200,\u0026#34;wires\u0026#34;:[[\u0026#34;70239655f64ff049\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;3065a73c7cb7203b\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;db3fb2bbd94f8068\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;mqtt in\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;zendure/cmd/#\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;datatype\u0026#34;:\u0026#34;auto-detect\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;nl\u0026#34;:false,\u0026#34;rap\u0026#34;:true,\u0026#34;rh\u0026#34;:\u0026#34;2\u0026#34;,\u0026#34;inputs\u0026#34;:0,\u0026#34;x\u0026#34;:130,\u0026#34;y\u0026#34;:420,\u0026#34;wires\u0026#34;:[[\u0026#34;a08d74f99a34b6c9\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;a08d74f99a34b6c9\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;function\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;db3fb2bbd94f8068\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;rewrite topic\u0026#34;,\u0026#34;func\u0026#34;:\u0026#34;msg.topic = msg.topic.replace(\\\u0026#34;zendure/cmd/\\\u0026#34;, \\\u0026#34;iot/\\\u0026#34;);\\nreturn msg;\u0026#34;,\u0026#34;outputs\u0026#34;:1,\u0026#34;timeout\u0026#34;:0,\u0026#34;noerr\u0026#34;:0,\u0026#34;initialize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;finalize\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;libs\u0026#34;:[],\u0026#34;x\u0026#34;:290,\u0026#34;y\u0026#34;:420,\u0026#34;wires\u0026#34;:[[\u0026#34;c065eba5601fb19a\u0026#34;]]},{\u0026#34;id\u0026#34;:\u0026#34;c065eba5601fb19a\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt out\u0026#34;,\u0026#34;z\u0026#34;:\u0026#34;661870a4a8dc9578\u0026#34;,\u0026#34;g\u0026#34;:\u0026#34;db3fb2bbd94f8068\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;mqtt out\u0026#34;,\u0026#34;topic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;qos\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;retain\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;respTopic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;contentType\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;userProps\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;correl\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;expiry\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;x\u0026#34;:460,\u0026#34;y\u0026#34;:420,\u0026#34;wires\u0026#34;:[]},{\u0026#34;id\u0026#34;:\u0026#34;666dbb21de861090\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;mqtt-broker\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;Home Assistant MQTT\u0026#34;,\u0026#34;broker\u0026#34;:\u0026#34;mqtt-broker.local\u0026#34;,\u0026#34;port\u0026#34;:\u0026#34;8883\u0026#34;,\u0026#34;tls\u0026#34;:\u0026#34;1c39c6626d1e78ba\u0026#34;,\u0026#34;clientid\u0026#34;:\u0026#34;node-red\u0026#34;,\u0026#34;autoConnect\u0026#34;:true,\u0026#34;usetls\u0026#34;:true,\u0026#34;protocolVersion\u0026#34;:\u0026#34;5\u0026#34;,\u0026#34;keepalive\u0026#34;:\u0026#34;60\u0026#34;,\u0026#34;cleansession\u0026#34;:true,\u0026#34;autoUnsubscribe\u0026#34;:true,\u0026#34;birthTopic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;birthQos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;birthRetain\u0026#34;:\u0026#34;false\u0026#34;,\u0026#34;birthPayload\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;birthMsg\u0026#34;:{},\u0026#34;closeTopic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;closeQos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;closeRetain\u0026#34;:\u0026#34;false\u0026#34;,\u0026#34;closePayload\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;closeMsg\u0026#34;:{},\u0026#34;willTopic\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;willQos\u0026#34;:\u0026#34;0\u0026#34;,\u0026#34;willRetain\u0026#34;:\u0026#34;false\u0026#34;,\u0026#34;willPayload\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;willMsg\u0026#34;:{},\u0026#34;userProps\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;sessionExpiry\u0026#34;:\u0026#34;\u0026#34;},{\u0026#34;id\u0026#34;:\u0026#34;1c39c6626d1e78ba\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;tls-config\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;mqtt CA\u0026#34;,\u0026#34;cert\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;key\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;ca\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;certname\u0026#34;:\u0026#34;client.crt\u0026#34;,\u0026#34;keyname\u0026#34;:\u0026#34;client.key\u0026#34;,\u0026#34;caname\u0026#34;:\u0026#34;ca.crt\u0026#34;,\u0026#34;servername\u0026#34;:\u0026#34;mqtt-broker.local\u0026#34;,\u0026#34;verifyservercert\u0026#34;:false,\u0026#34;alpnprotocol\u0026#34;:\u0026#34;\u0026#34;}] Tip Property-Namen wandern 1:1 ins Topic (solarInputPower, electricLevel, outputPackPower, \u0026hellip;). Eine vollständige Auflistung pflegt Zendure selbst im Developer-Repo .\nFazit # Der Mapper läuft bei mir seit Monaten unauffällig. Ein Stück Infrastruktur, das du einmal baust und dann vergisst - genau so soll es sein \u0026#x1f604;.\nViel Spaß beim Importieren \u0026#x1f60e;!\nDas Titel-/Hintergrundbild stammt von Claudio Schwarz auf Unsplash .","image":"https://tbsch.de/post/2026-06-03-node-red-topic-mapper-f%C3%BCr-zendure-solarflow/featured.webp"},{"id":"https://tbsch.de/post/2026-05-31-interaktiver-reinigungsplan-mit-home-assistant/","url":"https://tbsch.de/post/2026-05-31-interaktiver-reinigungsplan-mit-home-assistant/","title":"Interaktiver Reinigungsplan mit Home Assistant","summary":"Local calendar, To-do list und Roborock zu einem Reinigungsplan kombiniert, der sich selbst pflegt.","date_published":"2026-05-31T00:00:00Z","date_modified":"2026-05-31T00:00:00Z","tags":["smart-home","guide","haushalt","home-assistant","workflow"],"content_text":" Ein guter Reinigungsplan plant sich selbst - du musst ihn nur einmal vernünftig aufschreiben. Erinnerst du dich noch an mein Versprechen vom Ende des Scene-History Beitrags? Ich mich schon: denn ich hatte angekündigt, dass ich darüber schreibe, wie ich mit Local calendar, To-do list und Roborock einen interaktiven Reinigungsplan in Home Assistant gebaut habe. Das ist jetzt knapp zwei Jahre her, höchste Zeit also \u0026#x1f601;.\nVorab eine ehrliche Ansage: das hier ist kein One-Click-Setup. Wir bauen mehrere Bausteine zusammen, jeder davon einzeln nicht weltbewegend, in Kombination aber überraschend mächtig. Wer schon Lust hat, kann sich die Reihenfolge gleich merken: Kalender als Plan, Template Sensor als heutige Wahrheit, Script für die eigentliche Reinigung, Todo-Liste als Statusanzeige für die Familie und zwei Automationen als Klebstoff.\nKlingt nach Aufwand? Ist es auch. Klingt nach Spaß? Definitiv \u0026#x1f60e;.\nInsgesamt sind es drei Automationen, die wir bauen: eine, die saugt, eine, die nachts die Status-Liste neu aufbaut, und eine, die nach dem Saugen die heute fälligen Räume in der Liste abhakt. Klingt nach viel, ist aber jede für sich kurz und folgt einer klaren Aufgabe.\nAnforderungen an den Plan # Bevor ich angefangen habe, wollte ich für mich klären, was der Plan eigentlich können soll. Ohne klare Anforderung baust du sonst monatelang am Symptom statt an der Ursache. Mein Anspruch war konkret folgender:\nPro Raum eigener Rhythmus. Wohnzimmer und Flur fast täglich, Schlafzimmer zwei- bis dreimal die Woche, andere Räume nach Bedarf. Wiederholungen pro Tag möglich. Manche Tage rechtfertigen einen zweiten Durchlauf, andere nicht. Soll der Plan steuern, nicht ich. Nur, wenn niemand stört. Kein Roborock, wenn das Kind schläft, der Fernseher läuft oder jemand in der betroffenen Etage arbeitet. Selbst-pflegende Status-Anzeige. Damit meine Frau und ich auf einen Blick sehen, was heute ansteht und was bereits erledigt ist - ganz ohne, dass jemand etwas händisch eintragen muss. Info Mein Setup besteht aus genau einem Roborock S7 , der über Segment Cleaning gezielt einzelne Räume anfährt. Wenn du mehrere Sauger oder gar mehrere Stockwerke hast, lassen sich die Bausteine erweitern - das Grundprinzip bleibt aber identisch.\nDie Bausteine im Überblick # Bevor ich in die Konfiguration einsteige, kurz die Architektur. Das hilft dir später, dich im Code zurechtzufinden:\nBaustein Aufgabe calendar.auto_vacuum Hält den Plan: welcher Raum, wie oft, in welchem Zeitfenster. binary_sensor.auto_vacuum_schedule Liest den Kalender und berechnet heute und als Nächstes. script.turn_on_vacuum_segment_cleaning Übersetzt Home Assistant Areas in Roborock-Segmente und löst die Reinigung aus. todo.auto_vacuum Status-Anzeige fürs Dashboard mit Fälligkeitsdatum pro Raum. automation.staubsauger_starten Klebstoff: triggert bei passender Gelegenheit, prüft Bedingungen, ruft das Script auf. automation.staubsauger_todos_bauen Pflegt nachts die Todo-Liste neu, damit Fälligkeiten stimmen. automation.staubsauger_todos_abhaken Hakt die heute fälligen Items nach erfolgreicher Reinigung in der Todo-Liste ab. Es lohnt sich, das einmal vor sich hinzuzeichnen. Stichwort: Skizze schlägt Schreibtisch \u0026#x1f601;.\n1. Der Plan im Kalender # Das Herzstück ist ein Local Calendar namens calendar.auto_vacuum. Anders als bei klassischen Reinigungsplänen ist mein Kalender allerdings nicht lesbar für Menschen, sondern lesbar für Home Assistant. Drei Event-Typen sind hinterlegt, alle mit eigenen Wiederholungs-Regeln (RRULE).\nBereich-Events geben an, an welchen Tagen welcher Raum dran ist. Der summary folgt strikt dem Schema area:\u0026lt;area_id\u0026gt;:\nsummary: area:wohnzimmer rrule: FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA summary: area:schlafzimmer rrule: FREQ=WEEKLY;BYDAY=TU,SA Wiederholungs-Events geben an, wie oft an einem Tag zusätzlich gesaugt werden soll. Ohne Event bleibt es bei einem Durchgang, mit repeat:once gibt es einen Extra-Durchgang (also zwei), mit repeat:twice gibt es zwei Extras (also drei):\nsummary: repeat:once rrule: FREQ=WEEKLY;BYDAY=MO,FR Tip Es lohnt sich, hier mit Bedacht zu entscheiden. Drei Durchgänge bedeuten dreifache Laufzeit und dreifacher Lärm. Mein Roborock zieht im max-Modus außerdem ordentlich an der Batterie. repeat:once oder repeat:twice nutze ich nur an Tagen, an denen wir verlässlich nicht da sind.\nClean-Events definieren Zeitfenster, in denen die Reinigung überhaupt anlaufen darf. Das sind die einzigen Events mit dateTime statt date, weil hier eine Uhrzeit zählt:\nsummary: clean start: 09:00, end: 13:00 rrule: FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA Auf diese Weise habe ich vormittags und nachmittags je ein Fenster definiert. Innerhalb dieser Fenster sieht der Plan zu, dass die Sache passiert. Außerhalb wird gar nicht erst angefangen.\n1a. Erläuterungen # Warum drei Event-Typen statt einem? Weil sie unabhängig voneinander geändert werden können. Wenn ich morgen entscheide, dass das Schlafzimmer nur noch einmal pro Woche dran ist, ändere ich genau ein area:-Event, nichts sonst. Wenn ich eine neue Putzphase mit drei Durchgängen ausprobieren möchte, lege ich ein repeat:twice-Event an. Und wenn der Bauarbeiter-Lärm in der Nachbarschaft mich zwingt, ein Zeitfenster zu verschieben, fasse ich nur das clean-Event an. Trennung der Zuständigkeiten, ganz wie beim Coden \u0026#x1f604;.\n2. Der Template Sensor: \u0026ldquo;Was steht heute an?\u0026rdquo; # Aus den Kalender-Events allein wird noch kein Reinigungsplan. Es braucht eine Stelle, die jeden Moment beantworten kann: \u0026ldquo;Welche Räume stehen heute an, wie oft, und wann das nächste Mal?\u0026rdquo;. Genau das tut mein Trigger-basierter Template Sensor binary_sensor.auto_vacuum_schedule.\nBevor wir in den YAML-Schlund steigen, zur Orientierung das Output-Schema, das der Sensor liefert. Sein State ist on, sobald ein clean-Fenster aktiv ist, sonst off. Die Attribute sind die interessante Stelle:\nstate: \u0026#34;off\u0026#34; # oder \u0026#34;on\u0026#34;, während eines clean-Fensters attributes: today: areas: - wohnzimmer - flur repeat: 1 next: areas: schlafzimmer: \u0026#34;2026-05-23\u0026#34; flur: \u0026#34;2026-05-22\u0026#34; wohnzimmer: \u0026#34;2026-05-22\u0026#34; repeat: once: \u0026#34;2026-05-22\u0026#34; Und so sieht der Sensor in voller Schönheit aus:\n- triggers: - trigger: homeassistant event: start - trigger: time_pattern hours: /1 actions: - action: calendar.get_events data: start_date_time: \u0026#34;{{ now().date() }}\u0026#34; duration: days: 6 target: entity_id: calendar.auto_vacuum response_variable: result - variables: clean_events: \u0026gt; {{ result[\u0026#34;calendar.auto_vacuum\u0026#34;].events | selectattr(\u0026#34;summary\u0026#34;, \u0026#34;eq\u0026#34;, \u0026#34;clean\u0026#34;) | sort(attribute=\u0026#34;start\u0026#34;) | list }} next_areas: \u0026gt; {% set areas = result[\u0026#34;calendar.auto_vacuum\u0026#34;].events | selectattr(\u0026#34;summary\u0026#34;, \u0026#34;search\u0026#34;, \u0026#34;area:\u0026#34;) | groupby(attribute=\u0026#34;summary\u0026#34;) %} {% set data = namespace(areas=[]) %} {% for area, items in areas %} {% set data.areas = data.areas + [( area | replace(\u0026#34;area:\u0026#34;, \u0026#34;\u0026#34;), items | sort(attribute=\u0026#34;start\u0026#34;) | map(attribute=\u0026#34;start\u0026#34;) | first )] %} {% endfor %} {{ dict(data.areas) }} next_repeat: \u0026gt; {% set repeat = result[\u0026#34;calendar.auto_vacuum\u0026#34;].events | selectattr(\u0026#34;summary\u0026#34;, \u0026#34;search\u0026#34;, \u0026#34;repeat:\u0026#34;) | groupby(attribute=\u0026#34;summary\u0026#34;) %} {% set data = namespace(repeat=[]) %} {% for rep, items in repeat %} {% set data.repeat = data.repeat + [( rep | replace(\u0026#34;repeat:\u0026#34;, \u0026#34;\u0026#34;), items | sort(attribute=\u0026#34;start\u0026#34;) | map(attribute=\u0026#34;start\u0026#34;) | first )] %} {% endfor %} {{ dict(data.repeat) }} binary_sensor: - name: auto_vacuum_schedule unique_id: auto_vacuum_schedule state: \u0026gt; {% set clean_ev_start = clean_events | map(attribute=\u0026#34;start\u0026#34;) | map(\u0026#34;as_datetime\u0026#34;) | list %} {% set clean_ev_end = clean_events | map(attribute=\u0026#34;end\u0026#34;) | map(\u0026#34;as_datetime\u0026#34;) | list %} {% set clean_ev_map = zip(clean_ev_start, clean_ev_end) | list %} {{ clean_ev_map | rejectattr(\u0026#34;0\u0026#34;, \u0026#34;ge\u0026#34;, now()) | rejectattr(\u0026#34;1\u0026#34;, \u0026#34;lt\u0026#34;, now()) | list | count \u0026gt; 0 }} attributes: next: \u0026gt; {{ { \u0026#34;areas\u0026#34;: next_areas, \u0026#34;repeat\u0026#34;: next_repeat } }} today: \u0026gt; {% set data = namespace(areas=[], repeat=[]) %} {% for area in next_areas.keys() %} {% if (next_areas[area] | as_datetime).date() == now().date() %} {% set data.areas = data.areas + [area] %} {% endif %} {% endfor %} {% for rep in next_repeat.keys() %} {% if (next_repeat[rep] | as_datetime).date() == now().date() %} {% set data.repeat = data.repeat + [rep] %} {% endif %} {% endfor %} {{ { \u0026#34;areas\u0026#34;: data.areas, \u0026#34;repeat\u0026#34;: 3 if \u0026#34;twice\u0026#34; in data.repeat else 2 if \u0026#34;once\u0026#34; in data.repeat else 1 } }} 2a. Erläuterungen # Sieht nach viel aus, ist im Grunde aber überschaubar. Lass uns das einmal von oben nach unten durchgehen:\nTriggers. Der Sensor wird beim Home Assistant Start und einmal pro Stunde neu berechnet. Häufiger ist nicht nötig, weil sich der Kalender ohnehin nicht im Minutentakt ändert. calendar.get_events. Holt alle Events der nächsten sechs Tage und legt sie als result ab. Das ist die einzige externe Datenquelle, alles andere ist Rechenarbeit auf dem Ergebnis. Variable clean_events. Filtert auf die summary: clean-Einträge. Aus dieser Liste wird gleich der State berechnet. Variable next_areas. Gruppiert alle area:*-Events nach Bereich und schnappt sich pro Bereich den frühesten kommenden Termin. Ergibt das Dict im next.areas-Attribut. Variable next_repeat. Macht dasselbe für repeat:*-Events und liefert pro Wiederholungs-Typ (once, twice) den nächsten Termin. State. Vergleicht now() gegen die Start- und End-Zeiten der clean-Events. Sobald genau ein Fenster aktuell läuft, ist der Sensor on. Attribut next. Einfach die beiden Dicts gebündelt - das ist die Status-Ebene für die Todo-Liste. Attribut today. Filtert beide Dicts auf das heutige Datum. Aus den Wiederholungs-Treffern entsteht der numerische repeat-Wert: drei bei twice, zwei bei once, sonst eins. Das ist die Aktions-Ebene für die Automation. Info Beachte die Reihenfolge in der repeat-Logik: twice wird vor once geprüft. Wäre es umgekehrt, würde ein Tag, an dem beide Events liegen, fälschlich nur zwei Durchgänge bekommen. So gewinnt immer der höhere Wert.\nDas schöne Detail an diesem Sensor ist, dass er komplett ohne Helfer auskommt. Keine input_*-Entities, keine externen Trigger-Quellen, kein Zustand außer dem Kalender. Wenn morgen mein Setup zerschießt, reichen Kalender plus Template-Sensor, um das System wieder ans Laufen zu bringen.\n3. Das Script: Areas zu Roborock-Segmenten übersetzen # Home Assistant kennt Räume als area_id. Mein Roborock kennt Räume als numerische Segment-IDs, die er sich beim Mapping selbst vergibt. Das passt nicht zusammen. Also baue ich die Brücke in einem Skript namens script.turn_on_vacuum_segment_cleaning:\nalias: Segmentreinigung starten icon: mdi:robot-vacuum fields: area: name: Raum description: Name des Raums required: true selector: area: multiple: true repeat: name: Wiederholungen description: Wie oft die Segmente gesaugt werden sollen required: false default: 1 selector: number: min: 1 max: 3 step: 1 sequence: - action: roborock.get_maps data: {} target: entity_id: vacuum.roborock_s7 response_variable: result - variables: segments: \u0026gt; {% set rooms = result[\u0026#34;vacuum.roborock_s7\u0026#34;].maps | selectattr(\u0026#34;name\u0026#34;, \u0026#34;eq\u0026#34;, \u0026#34;Obergeschoss\u0026#34;) | map(attribute=\u0026#34;rooms\u0026#34;) | first %} {% set room_map = zip( rooms.values() | map(\u0026#34;area_id\u0026#34;), rooms.keys() ) | list %} {{ room_map | selectattr(\u0026#34;0\u0026#34;, \u0026#34;in\u0026#34;, area) | map(attribute=\u0026#34;1\u0026#34;) | list }} - action: vacuum.send_command data: command: app_segment_clean params: - segments: \u0026#34;{{ segments }}\u0026#34; repeat: \u0026#34;{{ repeat }}\u0026#34; target: entity_id: vacuum.roborock_s7 3a. Erläuterungen # Drei Schritte, drei Ideen:\nDas Script fragt die Roborock Integration per roborock.get_maps nach den bekannten Karten und legt die Antwort in result ab. Bei einer Karte pro Etage filtere ich gezielt die Karte namens Obergeschoss heraus. Aus den Räumen der Karte baue ich eine Mapping-Liste der Form (area_id, segment_id). Das ist das eigentliche Bindeglied zwischen Home-Assistant-Welt und Roborock-Welt. Anschließend filtere ich auf jene area_ids, die als Argument übergeben wurden, und feuere das proprietäre app_segment_clean-Kommando an den Sauger ab. Inklusive der gewünschten Wiederholungs-Anzahl. Warning Damit dieses Mapping funktioniert, müssen die Raumnamen im Roborock mit den Area-IDs in Home Assistant korrespondieren. Bei mir heißt der Roborock-Raum Wohnzimmer, die Area in HA wohnzimmer. Roborock leitet daraus dieselbe area_id ab. Wenn deine Namen abweichen, musst du die Map einmal manuell pflegen oder via Lookup-Tabelle ergänzen.\n4. Die Trigger-Automation: \u0026ldquo;Saug, wenn\u0026rsquo;s niemanden stört\u0026rdquo; # Jetzt kommt der Klebstoff. Diese Automation entscheidet, wann der Sauger tatsächlich loslaufen darf:\nalias: \u0026#34;Staubsauger: starten\u0026#34; mode: single trigger: - platform: state entity_id: input_select.presence_mode from: zuhause to: abwesend for: \u0026#34;00:15:00\u0026#34; - platform: state entity_id: person.partner to: not_home for: \u0026#34;00:30:00\u0026#34; - platform: time_pattern minutes: \u0026#34;/15\u0026#34; seconds: 40 - platform: calendar entity_id: calendar.auto_vacuum event: start condition: - condition: state entity_id: binary_sensor.auto_vacuum_schedule state: \u0026#34;on\u0026#34; - condition: state entity_id: - input_boolean.auto_vacuumed_today - input_boolean.vacation_mode state: \u0026#34;off\u0026#34; - condition: state entity_id: input_select.sleep_mode state: aus - condition: or conditions: - condition: state entity_id: input_select.presence_mode state: abwesend for: \u0026#34;00:15:00\u0026#34; - condition: not conditions: - condition: state entity_id: person.partner state: home - condition: state entity_id: media_player.wohnzimmer_tv state: \u0026#34;off\u0026#34; for: \u0026#34;00:10:00\u0026#34; action: - action: script.turn_on_vacuum_segment_cleaning data: area: \u0026#34;{{ state_attr(\u0026#39;binary_sensor.auto_vacuum_schedule\u0026#39;, \u0026#39;today\u0026#39;).areas or [] }}\u0026#34; repeat: \u0026#34;{{ state_attr(\u0026#39;binary_sensor.auto_vacuum_schedule\u0026#39;, \u0026#39;today\u0026#39;).repeat or 1 }}\u0026#34; - wait_for_trigger: - platform: state entity_id: binary_sensor.roborock_s7_reinigen from: \u0026#34;off\u0026#34; to: \u0026#34;on\u0026#34; continue_on_timeout: true timeout: \u0026#34;00:05:00\u0026#34; - if: - condition: template value_template: \u0026#34;{{ not wait.trigger }}\u0026#34; then: - action: notify.mobile_app data: message: \u0026#34;Staubsauger sollte gestartet werden, reinigt aber nicht.\u0026#34; - stop: \u0026#34;Der Staubsauger ist nicht losgefahren.\u0026#34; error: true - action: input_boolean.turn_on target: entity_id: input_boolean.auto_vacuumed_today - action: vacuum.set_fan_speed target: entity_id: vacuum.roborock_s7 data: fan_speed: max - action: select.select_option target: entity_id: select.roborock_s7_wisch_intensitat data: option: \u0026#34;off\u0026#34; 4a. Erläuterungen # Vier Trigger, eine Wahrheit:\nPresence-Mode wechselt auf abwesend für mindestens 15 Minuten. Wenn die ganze Familie das Haus verlässt, beginnt das Fenster. Partner geht außer Haus` für 30 Minuten. Mein Büro ist auf einem anderen Stockwerk, also kann gesaugt werden, wenn meine Frau nicht da ist. Alle 15 Minuten ein Tick, weil sich Zustände auch zwischendurch ändern können, ohne dass ein State-Trigger feuert. Kalender-Start eines clean-Events. Wenn das Zeitfenster aufgeht und gerade niemand da ist, soll der Sauger loslegen. Die Conditions sind das eigentliche Hirn. Sie stellen sicher, dass der Sauger wirklich loslaufen darf:\nbinary_sensor.auto_vacuum_schedule muss on sein, sprich: heute steht etwas an und das Zeitfenster läuft. Weder Urlaubsmodus noch heute schon gesaugt dürfen aktiv sein. Kein Schlaf-Modus, kein laufender Fernseher seit mindestens 10 Minuten. Die Anwesenheits-Bedingung wird im or-Block doppelt geprüft, damit das System bei einer einzelnen Person im Haus auch reagiert, sobald sie unterwegs ist. Im action-Block wird das Script gerufen, dann fünf Minuten lang auf das Live-Signal \u0026ldquo;Sauger reinigt\u0026rdquo; gewartet. Springt er nicht an, gibt es eine Push-Notification - das hat mich am Anfang vor mehr als einem stillen Fehlversuch bewahrt \u0026#x1f604;. Erfolg setzt das gesaugt-heute-Flag, schaltet den Lüfter auf maximale Saugstufe und deaktiviert die Wischfunktion, weil bei mir nur gesaugt wird.\nTip Wer wischen will, lässt die select.select_option-Aktion einfach weg oder stellt sie auf den jeweilig sinnvollen Wert.\n5. Die Todo-Liste: Status fürs Dashboard # Das Schöne an einem todo-Entity in Home Assistant ist, dass es als interaktive Liste auf dem Dashboard erscheint - inklusive Fälligkeitsdatum und Abhaken per Klick. Genau das wollte ich für meine Frau und mich: eine Anzeige, die zeigt, was heute ansteht und was schon erledigt ist.\nInfo Klare Ansage vorweg, damit kein Missverständnis entsteht: die Todo-Liste ist in meinem Setup eine reine Statusanzeige, kein Steuer-Eingang. Die Trigger-Automation aus dem vorigen Kapitel liest sie nicht. Sie entscheidet allein anhand des Template-Sensors, welche Räume heute fällig sind. Die Todo-Liste wird also vom System geschrieben, aber nicht vom System gelesen.\nDamit das Schreiben sauber funktioniert, kümmern sich zwei Automationen um die Liste: eine nächtliche Aufbau-Automation und eine Abhak-Automation nach erfolgreicher Reinigung.\n5a. Nachts aufbauen # alias: \u0026#34;Staubsauger: Todos bauen\u0026#34; mode: single trigger: - platform: time at: \u0026#34;00:05:00\u0026#34; action: - action: input_boolean.turn_off target: entity_id: input_boolean.auto_vacuumed_today - action: todo.get_items data: status: - completed response_variable: result target: entity_id: todo.auto_vacuum - repeat: for_each: \u0026#34;{{ result[\u0026#39;todo.auto_vacuum\u0026#39;][\u0026#39;items\u0026#39;] }}\u0026#34; sequence: - variables: new_due: \u0026gt; {% set nxt = state_attr(\u0026#34;binary_sensor.auto_vacuum_schedule\u0026#34;, \u0026#34;next\u0026#34;).areas %} {{ nxt.get(repeat.item.summary | area_id) }} - if: - condition: template value_template: \u0026#34;{{ new_due is not none }}\u0026#34; then: - action: todo.update_item data: item: \u0026#34;{{ repeat.item.summary }}\u0026#34; status: needs_action due_date: \u0026#34;{{ new_due | as_timestamp | timestamp_custom(\u0026#39;%Y-%m-%d\u0026#39;) }}\u0026#34; target: entity_id: todo.auto_vacuum 5a. Erläuterungen # Diese Automation läuft um fünf nach Mitternacht und tut drei Dinge:\nSie setzt das input_boolean.auto_vacuumed_today auf off, damit der neue Tag offen ist. Sie liest alle abgeschlossenen Items aus der Todo-Liste. Für jedes dieser Items prüft sie im next.areas-Attribut des Template-Sensors, wann der zugehörige Raum als Nächstes fällig ist. Stimmt das Datum, wird das Item wieder auf needs_action gesetzt und das Fälligkeitsdatum aktualisiert. Die Filter-Zauberei mit repeat.item.summary | area_id ist die Stelle, an der die Magie greift: weil der Todo-Item-Titel exakt dem Raumnamen entspricht (zum Beispiel Wohnzimmer), kann Home Assistant daraus automatisch die area_id ableiten. Trennung der Zuständigkeiten, schon wieder.\n5b. Nach Reinigung abhaken # alias: \u0026#34;Staubsauger: Todos abhaken\u0026#34; mode: single trigger: - platform: state entity_id: input_boolean.auto_vacuumed_today from: \u0026#34;off\u0026#34; to: \u0026#34;on\u0026#34; action: - action: todo.get_items data: status: - needs_action response_variable: result target: entity_id: todo.auto_vacuum - repeat: for_each: \u0026#34;{{ result[\u0026#39;todo.auto_vacuum\u0026#39;][\u0026#39;items\u0026#39;] | selectattr(\u0026#39;due\u0026#39;, \u0026#39;defined\u0026#39;) | list }}\u0026#34; sequence: - if: - condition: template value_template: \u0026#34;{{ repeat.item.due | as_timestamp \u0026lt;= now().date() | as_timestamp }}\u0026#34; then: - action: todo.update_item data: item: \u0026#34;{{ repeat.item.summary }}\u0026#34; status: completed target: entity_id: todo.auto_vacuum 5b. Erläuterungen # Diese Automation triggert exakt dann, wenn input_boolean.auto_vacuumed_today von off auf on springt - also genau nach einer erfolgreichen automatischen Reinigung. Sie holt sich alle offenen Items und hakt jene ab, deren due-Datum heute oder früher liegt. Das deckt sich exakt mit den Räumen, die der Sauger gerade abgefahren hat.\nDer input_boolean.auto_vacuumed_today ist hier das zentrale Signal, das die drei Automationen miteinander koppelt: er wird von der Trigger-Automation gesetzt, von der Abhak-Automation gelesen und von der Aufbau-Automation nachts zurückgesetzt. Ein Helfer, drei Rollen - so soll das sein \u0026#x1f604;.\nWas die Todo-Liste konkret leistet # Ergebnis: jeden Morgen schaut meine Frau aufs Dashboard und sieht \u0026ldquo;Wohnzimmer (heute), Flur (heute), Schlafzimmer (übermorgen)\u0026rdquo;. Sobald der Roboter fertig ist, fliegen die heutigen Räume in den erledigt-Stapel. Nachts wird die Liste neu sortiert und mit aktuellen Fälligkeitsdaten versehen.\nNote Manuelles Abhaken eines Items hat in diesem Setup keinen Einfluss auf die Reinigung. Wer also \u0026ldquo;Wohnzimmer\u0026rdquo; morgens abhakt, weil er mit dem Akkusauger durch war, sieht zwar die Liste hübscher aussehen, der Roboter fährt das Wohnzimmer aber trotzdem an. Das ist eine bewusste Designentscheidung: die Logik was wird gereinigt lebt im Kalender, nicht in der Todo-Liste. Wenn ich das ändern möchte, ändere ich den Kalender, nicht ein Häkchen.\nStolpersteine # Hier noch ein paar Beobachtungen aus dem Echtbetrieb:\nHelfer-Inflation. Du brauchst mindestens drei Input-Booleans (auto_vacuumed_today, vacation_mode, plus eventuell weitere) und ein paar Input-Selects (presence_mode, sleep_mode). Das ist eine Menge Klick-Arbeit in der UI - lohnt sich aber, weil die Helfer in anderen Automationen wiederverwendet werden.\nKarten-Namen sind fragil. Sobald du deine Roborock-Karte einmal umbenennst oder neu erstellst, ändern sich die Segment-IDs. Das Mapping im Script bleibt funktional, weil es über Namen läuft - aber genau hier liegt der Teufel im Detail.\nRoborock cloud vs. local. Die offizielle Roborock Integration nutzt die Roborock-Cloud. Wer das nicht mag - ich kann das gut nachvollziehen, Stichwort Cloudzwang - findet auf GitHub Alternativen mit lokalem Zugriff. Das Setup hier funktioniert mit beiden, weil es nur die Standard-Services aufruft.\nWartezeit auf den Start. Manche Roborock-Modelle brauchen nach dem app_segment_clean-Kommando einige Sekunden, bis sie überhaupt aus der Dock fahren. Mein Timeout von fünf Minuten ist großzügig gewählt - es reichen wahrscheinlich zwei. Probier es aus.\nFazit # Was als zweijähriger Cliffhanger angefangen hat, ist heute eines der Setups, das mir im Alltag am wenigsten Aufmerksamkeit kostet und am meisten zurückgibt. Der Sauger läuft, wenn er soll. Er läuft nicht, wenn er nicht soll. Die Familie sieht den Status, ohne dass ich erklären müsste, was gerade automatisch passiert. Stichwort: Women Acceptance Factor, einmal mehr im grünen Bereich \u0026#x1f601;.\nDer eigentliche Aha-Moment war für mich, dass der Reinigungsplan jetzt textuell in einem Kalender lebt. Wenn ich morgen entscheide, dass das Schlafzimmer dreimal die Woche dran sein soll, ändere ich genau eine RRULE und der Rest der Pipeline zieht von selbst nach. Keine Skript-Anpassung, keine YAML-Migration, kein Helfer-Karussell.\nVielleicht magst du das Setup für dein Zuhause adaptieren. Vielleicht hast du eine bessere Idee, wie man das alles noch eleganter löst - dann schreib mir gern. Bis dahin: Viel Spaß beim Reinigen lassen \u0026#x1f60e;!\nDas Titel-/Hintergrundbild stammt von YoonJae Baik auf Unsplash .","image":"https://tbsch.de/post/2026-05-31-interaktiver-reinigungsplan-mit-home-assistant/featured.webp"},{"id":"https://tbsch.de/post/2026-05-21-wie-ich-mein-smart-home-mit-ki-auditiere/","url":"https://tbsch.de/post/2026-05-21-wie-ich-mein-smart-home-mit-ki-auditiere/","title":"Wie ich mein Smart Home mit KI auditiere","summary":"Mein Home Assistant ist über die Jahre gewachsen. Ein bisschen zu sehr. Was passiert, wenn ich Claude per MCP an die Maschine lasse?","date_published":"2026-05-21T00:00:00Z","date_modified":"2026-05-21T00:00:00Z","tags":["smart-home","home-assistant","mcp","ki","workflow"],"content_text":" Wenn dein Smart Home eine eigene Stadtverwaltung bräuchte, wird es Zeit für einen Spaziergang durch den Maschinenraum. Kennst du diesen Moment, in dem dir auffällt, dass dein Smart Home dir ein bisschen entglitten ist? Bei mir war es ein ganz normaler Sonntag. Ich saß mit einem Kaffee vor Home Assistant, wollte „nur kurz\u0026quot; einen Sensor neu anlernen - und stolperte stattdessen über eine Automatisierung, die ich nicht mehr erklären konnte. Wofür war die da? Wann habe ich die gebaut? Ich hatte keine Ahnung mehr \u0026#x1f601;.\nWenig später wollte ich mich überzeugen, dass ich alles im Griff habe. Das war ein Fehler: Im Reiter Geräte und Dienste leuchteten gefühlt überall kleine Warnsymbole, und in der Sensor-Liste sah ich Einträge, deren Namen mir nicht einmal mehr etwas sagten. Ein gewachsenes Setup hat das so an sich: es ist wie ein Garten, in dem zwischen den Stauden plötzlich Bäume stehen, die du augenscheinlich nie gepflanzt hast.\nEin paar Zahlen, damit du weißt, wovon ich spreche: meine Instanz zählt aktuell 1.293 Entitäten, 80 Automationen und 95 Sensoren, die mir unavailable zurufen. Verteilt über 13 Bereiche, gewachsen über Jahre. Ich glaube, jeder, der sein Smart Home länger als zwei Jahre pflegt, kennt das. Und so richtig Lust auf einen Aufräum-Samstag hat man halt auch nie.\nSeit ein paar Tagen probiere ich etwas Neues aus, und ich muss gestehen: es verändert tatsächlich, wie ich mein Setup pflege. Die Idee ist eigentlich ganz einfach: Ich lasse Claude über das Model Context Protocol (MCP) direkt mit meinem Home Assistant sprechen.\nWas ist MCP überhaupt? # Info MCP (Model Context Protocol) ist ein offener Standard, mit dem Sprachmodelle wie Claude strukturiert mit externen Systemen reden können. Statt der KI eine Wand aus Text vorzuwerfen und auf das Beste zu hoffen, bekommt sie einen klaren Werkzeugkasten an die Hand: zeig mir alle Entitäten in diesem Bereich, lies die Historie dieses Sensors, suche in den Automationen nach allem, was diese Lampe anfasst.\nFür Home Assistant gibt es dafür mittlerweile einen MCP-Server, den du im HACS 1 unter dem Namen ha-mcp findest. Die Einrichtung selbst ist erstaunlich unspektakulär: Repository hinzufügen, einen Service-Account in HA anlegen, ein Long-Lived Access Token2 erzeugen, in Claude Desktop den Server eintragen. Nach 15 Minuten kannst du loslegen. So einfach ist das.\nWichtig ist mir an der Stelle eines: die Verbindung läuft bei mir ausschließlich lokal. Claude Desktop spricht direkt mit meiner HA-Instanz im eigenen Netzwerk. Mein Heimnetz verlässt dabei genau das, was zur Sprachverarbeitung an die Anthropic-API geht - und das entscheide ich pro Frage. Wer regelmäßig hier mitliest, weiß: an dem Punkt bin ich pingelig \u0026#x1f604;.\nUnd wer ist eigentlich dieser Claude? # Falls dir der Name nichts sagt: Claude ist ein KI-Assistent der Firma Anthropic , vergleichbar mit ChatGPT, aber mit eigenem Charakter und einem deutlich stärkeren Fokus auf Sicherheit, Nachvollziehbarkeit und Datenhygiene. Ich nutze ihn seit über einem Jahr im Alltag, am intensivsten am Schreibtisch über die Claude Desktop -App. Mir liegt der Stil sehr, weil er sachlich bleibt, ehrlich auf Grenzen hinweist und nicht jeden Vorschlag mit drei Bullshit-Bingo-Wörtern garniert.\nEin wahrer Game-Changer, der dein Smart Home auf das nächste Level hebt.\nNa, kommt dir bekannt vor \u0026#x1f601;?\nWas die Sache kostet: für gelegentliches Ausprobieren gibt es eine kostenlose Variante mit Tageslimit, die zum Reinschnuppern völlig reicht. Wer Claude regelmäßig nutzt, landet beim Abo: Claude Pro kostet aktuell rund 20 Euro im Monat, hebt das Limit deutlich an, gibt Zugriff auf das aktuelle Spitzenmodell und schaltet Funktionen wie MCP-Integrationen in der Desktop-App frei. Für Vielnutzer gibt es zusätzlich Claude Max ab etwa 100 Euro im Monat, und für Entwickler oder Automatisierungen die API , bei der du pro verbrauchtem Token zahlst.\nFür das, was ich in diesem Beitrag beschreibe, reicht Claude Pro völlig aus.\nFünf Sachen, für die ich es tatsächlich nutze # Nach ein paar Abenden Herumspielen haben sich bei mir ein paar Anwendungsfälle herauskristallisiert. Nicht alle sind gleich nützlich - ich sortiere sie nach „wie oft hole ich es wirklich aus meiner Trickkiste\u0026quot;.\nBeispiel: Aufräumen, ohne dass es weh tut # Damit habe ich angefangen, weil es schlicht die Sache war, die am längsten überfällig war. Die Fragen, die ich Claude tatsächlich gestellt habe, klangen ungefähr so:\n„Welche meiner Integrationen sind kaputt, und warum?\u0026quot; „Liste mir die 95 unavailable Sensoren, gruppiert nach Integration.\u0026quot; „Welche Automationen wurden in den letzten 6 Monaten nie ausgelöst?\u0026quot; „Welche Entitäten gehören zu keinem Bereich?\u0026quot; In der HA-UI ist das ein halber Samstagvormittag, weil du dich durch Integrationen, Geräte und Logs klicken musst. Über MCP habe ich die Antwort in 30 Sekunden als sortierte Liste, oft direkt mit einem ersten Vorschlag, was eigentlich zu tun wäre.\nWas dabei rauskam, hat mich übrigens nicht überrascht, aber es war trotzdem ernüchternd: etwa die Hälfte meiner unavailable Sensoren hängt schlicht an Integrationen, die ich nicht mehr nutze. Die andere Hälfte sind Geräte, die ich längst entsorgt habe - deren Entitäten in HA aber munter weiterleben. Das hätte schon vor einem Jahr aufgeräumt werden müssen \u0026#x1f601;.\nBeispiel: alte YAML lesen, ohne den Verstand zu verlieren # Hier wird es richtig interessant, denn hier spielen die großen Kontextfenster moderner KI-Modelle ihre Stärke aus. Ich habe Claude zum Beispiel gefragt:\n„Such mir alle Automationen, die light.arbeitszimmer_tischlampe referenzieren.\u0026quot; „Welche meiner Automationen verwenden denselben Trigger?\u0026quot; „Bau mir die YAML für: ‚Heizung im Bad dimmen, wenn keiner zuhause und Fenster auf\u0026rsquo; - aber prüf vorher, ob das mit meinen bestehenden Heizungs-Automationen kollidiert.\u0026quot; Ein wichtiger Punkt für mich: die Kontrolle bleibt bei mir. Claude produziert YAML, ich lese sie, ich übernehme sie. Niemand schreibt ohne meine Zustimmung in mein Setup. Aber das mühsame Lesen und Querverknüpfen meiner über die Jahre gewachsenen Konfiguration - das übernimmt die KI für mich. Und genau das ist der langweilige Teil der Refactoring-Arbeit, der mich sonst immer wieder davon abhält, überhaupt anzufangen.\nBeispiel: Fragen ans eigene Haus # Das Energy-Panel in Home Assistant ist gut. Wirklich. Aber alles, was über Verbrauch pro Tag pro Gerät hinausgeht, ist erstaunlich mühsam. Über MCP fühlt sich das auf einmal leichtgewichtig an:\n„Wann war mein Standby-Verbrauch in den letzten 30 Tagen am höchsten - und welches Gerät war\u0026rsquo;s?\u0026quot; „Wie korreliert mein Heizverbrauch mit der Außentemperatur?\u0026quot; „Wann ist die Spülmaschine üblicherweise fertig, und wie spät kann ich sie noch starten, damit sie vor 22 Uhr durch ist?\u0026quot; Das sind Ad-hoc-Auswertungen, für die ich mir nie ein eigenes Dashboard bauen würde. Zu spezifisch, zu einmalig. Aber einfach mal eben zu fragen - das ist ein echter Komfortgewinn. Und manchmal lernt man dabei überraschend viel über sein eigenes Zuhause \u0026#x1f604;.\nBeispiel: endlich Doku, die niemand schreiben wollte # Das ist meiner Meinung nach der am meisten unterschätzte Anwendungsfall. Ein paar Beispiele für Dinge, die ich mir habe generieren lassen:\nEine Kurzanleitung für meine Frau und Gäste, wie unser Smart Home morgens, abends und im Urlaub funktioniert - inklusive der wichtigsten Sprachbefehle für Alexa. Stichwort: Women Acceptance Factor \u0026#x1f601;. Ein Runbook „was tun, wenn die Heizung in einem Raum nicht heizt\u0026quot; - mit den richtigen Entity-IDs, einem Diagnose-Pfad und den drei häufigsten Ursachen. Eine Architekturskizze meines Setups, halbwegs in arc42 -Logik. Sehr nützlich, wenn ich in zwei Jahren wieder vergessen habe, warum ich Automation Nr. 47 damals gebaut habe. Natürlich ist die generierte Doku bei dieser Größenordnung nicht perfekt und braucht Nachbearbeitung. Aber sie nimmt mir den Sprung von \u0026ldquo;leeres Dokument\u0026rdquo; zu \u0026ldquo;erster Entwurf\u0026rdquo; ab. Und das ist meistens der Punkt, an dem ich sonst aufschiebe.\nBeispiel: wenn das Haus sich seltsam verhält # Der spannendste Use-Case, weil hier die Mustererkennung tatsächlich etwas tut, das ich von Hand so nicht hinbekomme. Meine Idee: einmal pro Woche - als Scheduled Task - läuft ein Audit-Lauf mit Fragen wie:\n„Sinkt eine Batterie schneller als gewöhnlich?\u0026quot; „Läuft ein Gerät länger als sonst?\u0026quot; „Wurde eine Automation seltsam oft ausgelöst?\u0026quot; „Steigt mein Standby-Verbrauch schleichend?\u0026quot; Home Assistant selbst hat dafür keine eingebaute Logik. Es gibt einzelne Integrationen, aber nichts, was über mehrere Datenquellen hinweg korreliert. Hier ist das Reasoning eines Sprachmodells ein guter Fit - nicht perfekt, aber gut genug, um mich auf Dinge hinzuweisen, die ich sonst übersehen hätte. Und mehr will ich auch gar nicht.\nStolpersteine und Grenzen # Damit der Beitrag nicht klingt wie eine Werbeanzeige, hier noch ein paar Beobachtungen aus den letzten Tagen.\nKontextfenster sind nicht unendlich. Bei meinen ganzen Entitäten passt nicht alles in einen Prompt. Gute MCP-Server arbeiten daher mit gezielten Abfragen - Claude sagt nicht „zeig mir alles\u0026quot;, sondern fragt erst nach Bereichen, dann nach Entitäten, dann nach Details. Das funktioniert, kostet aber gelegentlich eine Nachfrage mehr.\nHalluzinationen gibt es. Ich habe von Claude schon Entity-IDs vorgeschlagen bekommen, die es so gar nicht gibt. Lösung ist banal: niemals ungeprüft übernehmen. Jede generierte Automation wird von mir in der HA-UI durchgeklickt, bevor sie scharf geht. Und dann gäbe es ja noch Spook , der uns vor falschen Benamungen schützt.\nSchnell ist anders. Ein vollständiger Audit-Lauf über alle Integrationen dauert mehrere Minuten. Das ist okay, wenn du es einmal pro Woche machst - aber nicht, wenn du interaktiv arbeiten willst.\nBerechtigungen in HA sind flach. Home Assistant kennt nur Admin oder Non-Admin, echtes Rollen- und Rechtemanagement gibt es nicht. Ein dediziertes Token allein schützt also nicht davor, dass Claude über die API erstaunlich viel anfassen kann. Eine entity-spezifische Filterung pro Benutzer kennt HA ebenfalls nicht. Was übrig bleibt, ist im Wesentlichen der Approval-Modus in Claude Desktop. Mehr dazu gleich.\nDatenschutz braucht Disziplin. Auch wenn ha-mcp lokal läuft: was Claude liest, geht zur Verarbeitung an Anthropic. Das ist kein klassischer Cloudzwang, aber eben auch nicht der reine Lokalbetrieb.\nWarning Wer ein Setup mit besonders sensiblen Bereichen hat (Kinderzimmer, Pflegesituationen, medizinische Sensorik), sollte sich vor dem Einsatz von Cloud-KI gut überlegen, ob er an dieser Stelle mit KI arbeiten möchte.\nZwei Maßnahmen, mit denen ich das Risiko klein halte # Wie eben angerissen: echtes Rollen- und Rechtemanagement bietet Home Assistant nicht, und Claude Desktop hat (Stand heute) auch noch keinen Schalter, um einzelne Tools eines MCP-Servers individuell abzuklemmen. Was übrig bleibt, sind zwei pragmatische Riegel, auf die ich mich verlasse:\nDedizierter Non-Admin-User in HA. Claude bekommt ein Long-Lived Access Token über einen eigenen Benutzer ohne Admin-Rechte. Damit fällt zumindest der direkte Zugriff auf die Konfigurationsdateien raus. Eine echte Entity-Filterung pro Benutzer kennt HA leider nicht. Was der User darf, das sieht er. Approval-Modus konsequent anlassen. Claude Desktop fragt per Default vor jedem Tool-Aufruf nach. Genau diese Bestätigung ist meine wichtigste Sicherheitsschicht, denn alles, was die KI auslösen könnte, läuft erst nach meinem aktiven Klick. Beim ersten Ausprobieren etwas nervig, im Alltag aber Gold wert. Immerhin ein kleines Plus serverseitig: ha-mcp lässt direkte YAML-Edits standardmäßig nicht zu (ENABLE_YAML_CONFIG_EDITING=false). Wer das nicht aktiv anschaltet, hat zumindest diese Klasse von Schreibzugriffen schon mal ausgeschlossen.\nWas sich für mich verändert hat # Drei konkrete Dinge; und das nach gerade mal einer Woche.\nErstens: ich räume tatsächlich auf. Was vorher ein halber Samstag war, ist jetzt eine halbe Stunde am Sonntagabend. Und damit passiert es auch wirklich.\nZweitens: ich traue mich an Refactorings. Dinge, vor denen ich mich gedrückt habe - „dieser ganze Lichter-Block ist über die Jahre Mist geworden, aber neu schreiben dauert ewig\u0026quot; - sind plötzlich machbar, weil das mühsame Lesen abgenommen wird.\nDrittens: ich verstehe mein eigenes Setup besser. Klingt komisch, ist aber so. Wenn ich Claude bitte, mir die Lichtsteuerung im Flur zu erklären, bekomme ich eine Zusammenfassung, die mir selbst Lücken in meinen Annahmen aufzeigt. Sehr spannend \u0026#x1f601;.\nFazit # MCP ist für mich kein Killer-Feature, das mein Smart Home revolutioniert. Niemand muss heute panisch loslegen, nur weil es gerade ein Trendthema ist. Aber für ein gewachsenes, gepflegtes Setup ist es ein erstaunlich nützliches Werkzeug - und zwar genau dort, wo die manuelle Arbeit am wenigsten Spaß macht: bei der Hygiene, beim Lesen alter Konfiguration, bei der ad-hoc-Datenanalyse, bei der Dokumentation.\nWas es nicht ist: ein Ersatz für Verstehen. Claude weiß nicht, warum meine Heizungs-Boost-Logik so aussieht, wie sie aussieht. Ich weiß es. Und genau dieses Verständnis braucht es, um die Vorschläge der KI bewerten zu können.\nIch glaube, das ist die wichtigste Erkenntnis aus den letzten Tagen: MCP ist ein Lesegerät und ein Skizzenblock, kein Architekt. Architekt bleibt weiterhin wer auch immer das Setup gebaut hat - also wir selbst. Und ehrlich gesagt: das ist genau richtig so.\nZumindest noch \u0026#x1f604;.\nWie sieht das bei dir aus? Hast du schon mit MCP herumgespielt, oder bist du noch am Beobachten? Schreib mir gern.\nDas Titel-/Hintergrundbild stammt von Growtika auf Unsplash .\nHACS steht für Home Assistant Community Store und ist der inoffizielle Marktplatz für Integrationen, Themes und Add-ons, die nicht direkt in Home Assistant enthalten sind. Siehe hacs.xyz .\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nEin langlebiger Zugangs-Token aus Home Assistant, mit dem sich externe Tools gegenüber der HA-API authentifizieren - die saubere Alternative zur klassischen Benutzername/Passwort-Kombi.\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2026-05-21-wie-ich-mein-smart-home-mit-ki-auditiere/featured.webp"},{"id":"https://tbsch.de/post/2026-04-01-pypaperless-v6-und-wieder-ein-reboot/","url":"https://tbsch.de/post/2026-04-01-pypaperless-v6-und-wieder-ein-reboot/","title":"pypaperless v6 - Und wieder ein Reboot","summary":"pypaperless v6 erscheint kurz nach Paperless-ngx v3 und bringt Breaking Changes. Ein Blick hinter die Kulissen.","date_published":"2026-04-01T00:00:00Z","date_modified":"2026-04-01T00:00:00Z","tags":["news","paperless","projekt","python"],"content_text":"Kurz nach dem Release von Paperless-ngx v3 folgt pypaperless v6 - und diesmal hat es wirklich Konsequenzen. Aufgrund vielerlei Veränderungen in der Paperless-ngx REST API und meinem Unwillen, bis in alle Ewigkeit rückwärts-kompatibel zu sein, traf ich eine Entscheidung. Es gibt Breaking Changes. Und damit meine ich nicht „eine Methode wurde umbenannt“, sondern einen tiefgreifenden Umbau der gesamten Bibliothek.\nWarum ein Reboot? # Wenn ich ehrlich bin, hatte pypaperless in v5 drei Baustellen, über die ich schon länger immer wieder gestolpert bin. Alle drei haben mich genug gestört, um diesmal wirklich von Grund auf neu zu bauen. Und in diesem Anlauf habe ich mein aktuelles Verständnis von SDK-Gedanken noch mehr einfließen lassen.\n1. Models waren zu eng ans HTTP-Layer gekoppelt # In v5 hielt jede Model-Instanz eine Referenz auf den Client und rief ihn intern direkt auf. Das klingt praktisch, führt aber dazu, dass man Models nicht isoliert testen kann und sie auch nicht ohne Kontext weitergeben kann. Das war beim Testen regelmäßig ein Ärgernis.\nIn v6 sind Models reine Daten - kein Client, keine HTTP-Aufrufe. Der gesamte I/O läuft ausschließlich über Services. Das macht den Code deutlich sauberer und testbarer. Und als kleines Schmankerl habe ich einen kleinen Dispatcher in die PaperlessClient Klasse eingebaut, über den wichtige CRUD-Methoden direkt nutzbar sind.\nVorher (v5) Nachher (v6) doc = await paperless.documents(4711) doc.title = \u0026#34;Ein neuer Titel\u0026#34; await doc.save() doc = await paperless.documents(4711) doc.title = \u0026#34;Ein neuer Titel\u0026#34; await paperless.save(doc) 2. Keine Typprüfung zur Laufzeit # v5 nutzte Dataclasses mit manueller Dict-Konvertierung. Wenn die API unerwartet etwas zurückgab, konnte das jedoch still und heimlich zu falschen Werten führen. Es gab zwar eine Warning in der Konsole, aber das war\u0026rsquo;s \u0026#x1f601;.\nv6 setzt auf Pydantic v2: Jede API-Antwort wird beim Parsen validiert. Ich muss keinem Python-Entwickler die Vorteile davon erklären.\n3. aiohttp raus, httpx rein # aiohttp hat seinen Job getan, aber httpx ist moderner, hat eine sauberere API für synchrone und asynchrone Nutzung, und bringt ein eingebautes Mock-Transport-System mit, das das Schreiben von Tests erheblich vereinfacht. Ein Wechsel, der sich auch beim Entwickeln sofort bemerkbar macht.\nAls User von pypaperless solltest du diesen Change in den meisten Fällen gar nicht bemerken.\nWas ändert sich konkret? # Die vollständige Checkliste der Breaking Changes gibt es im Migrationsleitfaden , hier die wichtigsten Punkte:\nPython 3.13 ist jetzt Pflicht # Wer noch auf \u0026lt;=3.12 läuft, muss vor dem Update die Python-Runtime upgraden.\nNeues PaperlessConfig-Objekt und Umgebungsvariablen # Der Konstruktor hat sich verändert. Neu ist außerdem die PaperlessConfig-Klasse:\nfrom pypaperless import Paperless, PaperlessConfig # Via Config-Objekt cfg = PaperlessConfig(url=\u0026#34;http://localhost:8000\u0026#34;, token=\u0026#34;mytoken\u0026#34;) paperless = Paperless(config=cfg) # Via Umgebungsvariablen (PYPAPERLESS_URL, PYPAPERLESS_TOKEN) paperless = Paperless() filter() statt reduce() # reduce() ist weg. Das neue filter() funktioniert ähnlich, aber die Context-Manager-Variable ist jetzt das eigentliche Iterationsobjekt:\nVorher (v5) Nachher (v6) filters = { \u0026#34;title__icontains\u0026#34;: \u0026#34;invoice\u0026#34; } async with paperless.documents.reduce(**filters): async for doc in paperless.documents: print(doc.title) filters = { \u0026#34;title__icontains\u0026#34;: \u0026#34;invoice\u0026#34; } async with paperless.documents.filter(**filters) as ctx: async for doc in ctx: print(doc.title) Erstellen neuer Models # draft() heißt jetzt create().\nWas ist neu? # Neben dem Umbau kommen sechs neue Services dazu:\npaperless.profile - Zugriff auf das eigene Benutzerprofil paperless.trash - Gelöschte Dokumente durchsuchen, wiederherstellen oder den Papierkorb leeren paperless.share_links - Share-Links für Dokumente erstellen und verwalten paperless.documents.history - Audit-Log eines Dokuments abrufen paperless.documents.bulk_edit - Massenoperationen auf vielen Dokumenten in einem einzigen API-Aufruf paperless.bulk_edit_objects - Berechtigungen oder Löschvorgänge auf Tags, Korrespondenten, Dokumenttypen und Speicherpfaden in Massen Fazit # v6 ist kein kleines Pflaster. Ich bin mit den Neuerungen und Änderungen sehr glücklich. Der Preis dafür ist eine Migration, die für bestehende User etwas Arbeit bedeutet.\nDer Migrationsleitfaden führt Schritt für Schritt durch alle Änderungen.\nViel Spaß mit pypaperless v6!\nDas Titel-/Hintergrundbild stammt von Chris Ried auf Unsplash .","image":"https://tbsch.de/post/2026-04-01-pypaperless-v6-und-wieder-ein-reboot/featured.webp"},{"id":"https://tbsch.de/post/2026-03-06-meine-seite-ist-zur%C3%BCck/","url":"https://tbsch.de/post/2026-03-06-meine-seite-ist-zur%C3%BCck/","title":"Meine Seite ist zurück!","summary":"Mein Elternurlaub ist vorbei, demnach werde ich bald wieder neue Beiträge veröffentlichen.","date_published":"2026-03-06T00:00:00Z","date_modified":"2026-03-06T00:00:00Z","tags":["urlaub","familie"],"content_text":" Das Leben wird vorwärts gelebt und rückwärts verstanden. Treffender hätte es Kierkegaard wohl nicht formulieren können. Am Anfang ist da diese eine Nachricht: wir erwarten ein Kind. Ich glaube, so wirklich verstehen wird das niemand, was da gerade passiert, bis es dann passiert ist.\nWieder da # Diese eine verschneite Winternacht hat mein Leben auf einen Schlag geändert: plötzlich ist da ein kleiner Mensch. Der hat vollkommen andere Bedürfnisse und Erwartungen an seine Umgebung. Es hat mir gezeigt, wie schlecht auch mein Smart Home eigentlich auf ein kleines Kind abgestimmt war. Nun, das war ja bislang auch nicht notwendig \u0026#x1f601;.\nGlücklicherweise hatte ich in der Vergangenheit in der Licht- und Heizungssteuerung die Möglichkeit eingebaut, die Automatisierungen manuell zu überschreiben - so konnten wir zumindest darauf einwirken.\nEin kleines Beispiel gefällig? Abends erstrahlt das Wohnzimmer in wechselnden bunten Farben, beim TV-Schauen wird das Licht automatisch gedimmt. Wenn da allerdings ein kleines Baby ist, welches gerade einschlafen soll, möchte man grundsätzlich gedimmtes Licht haben und nicht nur dann, wenn der TV eingeschaltet ist.\nÜbrigens: ich arbeite gegenwärtig noch daran, eure E-Mails zu beantworten. Einige Antworten habe ich bereits verschickt, etwa ein Dutzend warten noch. Entschuldigt bitte!\nTech News # Der März wird sehr spannend: es steht ein großes Update meiner MikroTik Generation an. Die Letten haben es endlich fertiggebracht, die hAP-Serie um wenigstens Wifi7 zu erweitern. Demnach flattern Mitte März drei brandneue MikroTik hAP be3 Media in meinen Briefkasten!\nIch freue mich schon sehr darauf, das gesamte Heimnetzwerk auf das nächste Level zu heben. Neben Wifi7 gibt es dann auch durchweg 2.5G LAN im ganzen Haus - auf allen drei Stockwerken. Die dafür notwendige Arbeit ist größtenteils seit Mitte letzten Jahres erledigt, denn ich habe für alle drei Geräte bereits die Configs erstellt und muss sie nur noch einspielen.\nRouterOS sei Dank \u0026#x1f604;!\nDas Titel-/Hintergrundbild stammt von Ryan Stefan auf Unsplash .","image":"https://tbsch.de/post/2026-03-06-meine-seite-ist-zur%C3%BCck/featured.webp"},{"id":"https://tbsch.de/post/2025-12-19-meine-seite-verabschiedet-sich-in-den-urlaub/","url":"https://tbsch.de/post/2025-12-19-meine-seite-verabschiedet-sich-in-den-urlaub/","title":"Meine Seite verabschiedet sich in den Urlaub","summary":"Im neuen Jahr steht eine Menge an, weshalb ich vorerst keine Beiträge veröffentlichen werde.","date_published":"2025-12-19T00:00:00Z","date_modified":"2025-12-19T00:00:00Z","tags":["urlaub","familie"],"content_text":"Ja, du hast richtig gelesen: vorerst werde ich keine Beiträge mehr verfassen. Aber nicht für immer \u0026#x1f601;.\nDas liegt nicht daran, dass Technik mich nicht mehr begeistert - ganz im Gegenteil. Ich werde viele coole neue Ideen entwickeln und auf jeden Fall hier darüber berichten. Doch zuvor steht nun die Weihnachtszeit an - jeden Tag des Fests bin ich unterwegs und schlage mir bei Familie und Freunden den Bauch voll. Geil!\nAllerdings schicke ich meine Webseite jetzt erst einmal in Elternzeit. In Zukunft werde ich unser Smart Home nicht mehr ausschließlich nach dem Women Acceptance Factor designen, sondern auch den Nachwuchs in der Architektur berücksichtigen müssen. Ich werde bald darüber berichten, wie gut oder schlecht mir dies gelingen wird \u0026#x1f604;.\nBis dahin.\nDas Titel-/Hintergrundbild stammt von Ryan Stefan auf Unsplash .","image":"https://tbsch.de/post/2025-12-19-meine-seite-verabschiedet-sich-in-den-urlaub/featured.webp"},{"id":"https://tbsch.de/post/2025-12-18-paperless-guide-secretary/","url":"https://tbsch.de/post/2025-12-18-paperless-guide-secretary/","title":"Paperless Guide: Secretary Bot","summary":"Das papierlose Büro mit Scripting automatisieren und effizienter machen.","date_published":"2025-12-18T00:00:00Z","date_modified":"2025-12-18T00:00:00Z","tags":["home-lab","guide","paperless","python","workflow"],"content_text":"Es ist eine Weile her, seit ich zuletzt über mein papierloses Büro geschrieben habe. Denn mein System läuft und tut genau das, was es soll - seit nunmehr vielen Jahren. In der Zwischenzeit gab es jedoch zahlreiche Neuerungen bei Paperless-ngx, wie zum Beispiel die Arbeitsabläufe (Workflows) mit Webhooks und Nested Tags. Gerade Webhooks sind für mich enorm interessant, weil sie bei neuen, geänderten und gelöschten Dokumenten auslösen können.\nIntegration anderer Dienste # Mit Webhooks ist es endlich möglich, Paperless-ngx mit anderen Diensten zu verbinden. Gerade weil sie auch bei einem Update von Dokumenten auslösen können, lösten sie direkt meine Pre- und Post-Consume-Skripte ab. Diese setzte ich ein, um sehr einfach gestrickte Validierungen laufen zu lassen.\nDiese neue Situation nahm ich mir zum Anlass, um meinen Paperless Secretary neu aufzubauen. Bislang handelte es sich hierbei um ein einfaches Python Skript, in dem ich Dokumenten-Filter und Aktionen definiert hatte. In den letzten Wochen ist ein kleiner Webservice entstanden, der als Docker-Container bereitgestellt wird und - wer hätte es geahnt - auf HTTP-Anfragen wartet. Wie eben jene von den neuen Paperless-ngx Webhooks \u0026#x1f601;.\nSecretary v2 # Der neue Paperless Secretary besteht aus zwei Bausteinen: dem Webservice, der die Anfragen entgegennimmt. Und der Rules Engine, die konfigurierte Regelwerke aus Konfigurationsdateien liest, validiert und ausführt.\nVerfügbarkeit # Source Code und Dokumentation stehen zum aktuellen Zeitpunkt nicht öffentlich zur Verfügung, da das Projekt noch sehr frisch ist und ich auf absehbare Zeit keinen Support leisten kann. Dennoch möchte ich die Gelegenheit nutzen und dir zeigen, wie man solche Webhooks einsetzen könnte.\nInfo Ich werde in den nächsten Monaten an genau dieser Stelle das Container Image veröffentlichen. Und zwar dann, wenn ich die Dokumentation auf Vordermann gebracht habe.\nRegelwerke # Der Secretary hält ein Verzeichnis aus YAML Dateien, in denen komplexe Regeln vorgegeben werden können. Verwendest du Home Assistant ? Dann ist dir das Konzept sicher geläufig, denn ich habe mich beim Design der Regel-Notationen stark von Home Assistant Automationen inspirieren lassen. Denn eine Sache haben die Schöpfer vollkommen richtig gemacht: du kannst auf einen Blick herauslesen, was die Automation machen soll. Und genau das wollte ich für Regeln auch.\nEine Secretary Regel besteht immer aus ihrer Bezeichnung, Bedingungen (when) und Aktionen (exec). Bedingungen und Aktionen können beliebig viele Filter bzw. Aktionen ausführen. Und das macht es sehr dynamisch und spannend \u0026#x1f60e;.\nGenug Theorie, sehen wir uns so eine Regel doch einfach mal an.\nRegel-Kopf und Bedingungen:\n- id: kontoauszug_bank_titel_check description: \u0026gt; Ziel: Titel =\u0026gt; YYYY/MM when: - correspondent: \u0026#34;N26\u0026#34; - document_type: \u0026#34;Kontoauszug\u0026#34; - not: - title: regex: \u0026#39;^20\\d{2}/(0[1-9]|1[0-2])$\u0026#39; - tags: contains: \u0026#34;Problem\u0026#34; Gesucht werden mit dieser Regel Dokumente, deren Korrespondent N26 und Dokument-Typ Kontoauszug ist, die aber weder den Tag Problem noch einen Titel im Format YYYY/MM besitzen.\nAktionen anwenden:\nexec: - regex: field: content pattern: \u0026#39;\\d{2}\\.(\\d{2})\\.(\\d{4}) bis \\d{2}\\.\\1\\.\\2\u0026#39; result: \u0026#34;{{ m2 }}/{{ m1 }}\u0026#34; output: result_one - regex: field: content pattern: \u0026#39;Depotauszug per \\d{2}\\.(\\d{2})\\.(\\d{4})\u0026#39; result: \u0026#34;{{ m2 }}/{{ m1 }}\u0026#34; output: result_two - variable: match_result: \u0026gt; {%- if result_one is defined -%} {{ result_one }} {%- elif result_two is defined -%} {{ result_two }} {%- endif -%} - if: when: - template: \u0026#34;{{ match_result != \u0026#39;\u0026#39; }}\u0026#34; then: - set: title: \u0026#34;{{ match_result }}\u0026#34; else: - tag_add: \u0026#34;{{ tag(\u0026#39;Problem\u0026#39;) }}\u0026#34; - note: \u0026#34;Der korrekte Titel konnte nicht ermittelt werden.\u0026#34; - save Die Aktionen sind - mit Ausnahme der regulären Ausdrücke - eigentlich sofort verständlich. Machen wir dennoch einen kurzen Deep Dive:\nDer Inhalt des Dokuments wird nach einem Textmuster abgesucht, welches diese Form hat: 00.00.0000 bis 00.00.0000. Das Ergebnis wird zu 0000/00 transformiert und in result_one gespeichert. Erneut wird ein Textmuster mit dieser Form gesucht: Depotauszug per 00.00.0000. Das Ergebnis wird zu 0000/00 transformiert und in result_two gespeichert. In der Variable match_result wird der Fund eines Textmusters gespeichert. Wenn es einen Fund gab, wird der Titel des Dokuments gesetzt. Falls es keinen Fund gab, wird der Tag Problem gesetzt und eine Notiz am Dokument hinterlassen. Die Änderungen werden in Paperless-ngx gespeichert. Für den Tag Problem habe ich mich entschieden, da ich etwas manuell nacharbeiten muss. Welche Tags ich wofür verwende, kannst du hier nachlesen.\nFazit # Warum ich so viel Aufwand betreibe? Die Antwort liegt auf der Hand: ich bin ein fauler Mensch und werde intrinsisch angetrieben, Abläufe zu optimieren und zu automatisieren. Ich müsste viele Dokumente per Hand selbst bearbeiten, damit sie zu meinen Ablagevorstellungen passen - also lasse ich das machen. So einfach ist das \u0026#x1f601;.\nMittlerweile habe ich ein recht großes Regelwerk gebaut und bin unendlich zufrieden damit. Schade, dass in Paperless-ngx selbst keinerlei Möglichkeiten zur Verfügung stehen, Regelwerke einzubauen. Aber was nicht ist, kann ja schließlich noch werden.\nWelche Use-Cases würdest du automatisiert gern in deinem papierlosen Büro umsetzen? Lass es mich wissen!\nDas Titel-/Hintergrundbild stammt von Dhruvansh Soni auf Unsplash .","image":"https://tbsch.de/post/2025-12-18-paperless-guide-secretary/featured.webp"},{"id":"https://tbsch.de/post/2025-09-23-der-wahnsinn-warum-ich-dns-blocking-verwende/","url":"https://tbsch.de/post/2025-09-23-der-wahnsinn-warum-ich-dns-blocking-verwende/","title":"Der Wahnsinn: warum ich DNS-Blocking verwende","summary":"Nichts ist so kostbar, wie die eigene Privatsphäre. Ein kleiner Bericht über ihren Schutz im Internet.","date_published":"2025-09-23T00:00:00Z","date_modified":"2025-09-23T00:00:00Z","tags":["home-lab","bericht","dns","privacy"],"content_text":" Privacy is not a crime, protect yourself. Privacy matters. Privacy is what allows us to determine who we are and who we want to be! Diese wahren Worte stammen vom DNS-Blocklisten-Kurator hagezi . Doch was hat es mit DNS-Blocking eigentlich genau auf sich? Und wie genau unterscheidet es sich von einem Adblocker, den du womöglich als Browser-Plugin installiert hast?\nFalls du DNS (Domain Name System) und das Prinzip dahinter noch nicht kennst, lohnt sich ein Blick in den Wikipedia-Artikel . Hier wird es verständlich beschrieben und am Ende bist du um ein Quäntchen wertvolles Digitalwissen reicher \u0026#x1f604;. Du benötigst es außerdem, um die folgenden Absätze nachvollziehen zu können.\nSteigen wir nun etwas tiefer ein: du wirst nun erfahren, wie du dein heimisches Internetvergnügen auf das nächste Level bringen kannst.\nDNS-Blocking # Was ist das? # Normalerweise fragt jedes Gerät einen DNS-Server: welche IP-Adresse gehört zu dieser Domain? DNS-Blocking sorgt nun dafür, dass bestimmte Internetadressen gar nicht erst aufgelöst werden. Ohne Antwort gibt es keine Verbindung, weil das Gerät nicht weiß, wohin es sich verbinden soll – so einfach ist das.\nBeim DNS-Blocking prüft der DNS-Server jede Anfrage gegen Blocklisten. Ist die Domain dort gelistet, gibt es keine gültige Antwort zurück. Damit wird der Inhalt blockiert, bevor er überhaupt aus dem Internet geladen werden kann – und das ist der wesentliche Unterschied zum Adblocker, der Werbung innerhalb deines Browsers einfach nur ausblendet, nachdem sie bereits geladen wurde.\nDer Vorteil im privaten Netzwerk ist der zentrale Ansatz, denn du brauchst keinen Adblocker mehr auf jedem Gerät. Stattdessen profitieren alle deine Endgeräte automatisch, sobald sie den DNS(-Blocking)-Server nutzen.\nAuswirkungen # Positiv spürbar ist das sofort: Seiten laden schneller, weil unnützer Ballast wegfällt. Bandbreite wird gespart, weil weniger Daten übertragen werden. Und auch die Sicherheit steigt, da Angriffe über fragwürdige Domains ins Leere laufen. Zusätzlich schützt DNS-Blocking deine Privatsphäre, indem Tracker keine Daten mehr abgreifen können.\nZu restriktives DNS-Blocking kann jedoch auch dazu führen, dass einige deiner Dienste nicht mehr korrekt funktionieren. Landet eine bekannte Tracking-Domain auf einer DNS-Blockliste, die jedoch gleichzeitig für das Aufrufen von bspw. Instagram benötigt wird, meldet sich die App bei dir direkt mit Verbindungsproblemen zu Wort.\nDie Kunst beim DNS-Blocking ist also, Werbung, Tracker und Sicherheitsrisiken auszuschließen und gleichzeitig die Funktionsweise deiner alltäglichen Dienste und Apps zu gewährleisten. Und das bedeutet jede Menge Arbeit.\nHistorische Gründe # Wir nutzen Adblocker oder DNS-Blocking, weil Werbung im Internet längst nicht mehr nur dezent am Rand steht. Sie ist laut, störend und oft sicherheitskritisch. Pop-ups, Autoplay-Videos und aggressive Banner lenken ab und kosten Bandbreite.\nGleichzeitig hat sich Werbung zum Tracking-Werkzeug entwickelt: Unternehmen sammeln Daten über Klicks, Verhalten und Interessen. Historisch begann das Web werbefrei, erst Ende der 1990er kamen die ersten Banner, später komplexe Werbenetzwerke. Mit steigender Monetarisierung stieg auch der Missbrauch: Malware über Anzeigen, unerlaubtes Datensammeln und überladene Seiten.\nUnd das ist heute noch viel professioneller geworden.\nIch will es einmal überspitzt formulieren:\nGoogle weiß, was du vor 3 Wochen gefrühstückt hast und wo du deinen nächsten Urlaub planst. Amazon kennt dein Einkaufsverhalten auswendig und schlägt dir genau in diesem Moment vor, was du als nächstes kaufen sollst. Deine Seele (und privaten Fotos) hast du über Facebook, Instagram oder WhatsApp bereits an Meta verkauft. Und deine eigene Meinung? Nun, die bildet TikTok natürlich gezielt für dich, indem es dir maßgeschneiderte und wegweisende Inhalte präsentiert. Du nutzt diese Dienste nicht und bist safe? Haha. Trotzdem erhalten sie laufend deine Daten – und zwar jedes Mal dann, wenn du völlig genervt auf Alles akzeptieren bei einem der abertausenden Cookie-Banner klickst. Oder wenn ein Dienstanbieter die DSGVO wieder einmal nicht einhält und auch ohne dein Einverständnis durch die Gegend telefoniert.\nInfo Ich habe diese Unternehmen beispielhaft benannt, einfach weil sie jeder kennt oder nutzt. Es gibt eine große Reihe weiterer teils aggressiver Datensammler, die ebenfalls in sehr vielen Webdiensten eingebunden sind.\nGlaubst du mir nicht, alles Science Fiction oder ist dir egal, hast ja schließlich nichts zu verbergen? Das ist gar nicht schlimm, denn so ticken die allermeisten Menschen. Nicht umsonst sind die Bosse dieser Unternehmen schließlich superreich – und alle anderen Menschen nicht.\nPrivatsphäre # Letzten Endes musst du für dich selbst entscheiden, was für dich wichtig ist. An dieser Stelle möchte ich einfach nur dein Bewusstsein dafür schärfen, dass solche Dinge tatsächlich stattfinden. Mir persönlich geht es hierbei um mein Mitspracherecht. Ich möchte selbst entscheiden können, welche Dienstanbieter über mich Bescheid wissen. Ich möchte gefragt werden, ob das in Ordnung für mich ist. Die Industrie möchte aber genau dieses nicht tun müssen und mich bevormunden.\nUnd genau darum setze ich DNS-Blocking ein: um mir einen kleinen Teil meines Mitspracherechts zurückzuholen.\nLösungen # Ich bevorzuge eine technisierte Welt, weil Technik uns im Alltag unterstützen kann. Doch es geht den Akteuren nicht in erster Linie darum, eine bessere Welt zu erschaffen, einfach weil das ja so toll wäre. Es geht darum, maximal zu kassieren. Das ist die Quintessenz der ganzen Nummer, denn es handelt sich um Wirtschaftsunternehmen. Der Preis dafür sind einfach unsere Daten. Du hast doch nicht ernsthaft geglaubt, dass Facebook, WhatsApp und Co. wirklich gänzlich kostenlos zur Verfügung stehen?\nUnd dann gäbe es schließlich noch die wirklich bösen Jungs, die deine Daten mit kriminellen Methoden sammeln – nur um am Ende ebenso maximal zu kassieren.\nAlso, was kann man dagegen tun? Die Wahrheit ist: leider gar nichts. Denn ohne Internet geht heutzutage nur wenig, in Zukunft vermutlich gar nichts mehr. Aber man kann die Datensammelwut oder kriminellen Energien zumindest im heimischen Netzwerk etwas einschränken \u0026#x1f604;.\nMöglichkeiten # Genug Theorie. Du bist also am Einsatz von DNS-Blocking interessiert. Woher ich das weiß? Du liest schließlich gerade meinen Artikel darüber. Aber nicht ich wusste, dass du dich dafür interessieren könntest, sondern Google \u0026#x1f60e;.\nEin DNS-Blocker ist ein kleines Stückchen Software, welches du in deinem Heimnetzwerk bereitstellen kannst. Solche Tools erfreuen sich immer größerer Beliebtheit im privaten Umfeld und sind zumindest für mich gar nicht mehr wegzudenken.\nDie Bekanntesten sind wohl:\nMit einem Klick auf das Logo gelangst du direkt zur jeweiligen Projekt-Webseite und kannst dich darüber informieren. Ich selbst habe mich für Pi-hole entschieden, weil es im Gegensatz zu den anderen Lösungen sehr vielfältige Möglichkeiten bietet, je nach Client oder IP-Adressbereich unterschiedliche Blocklisten einzusetzen.\nAlles, was du benötigst, ist ein (Mini-)Computer, auf dem der Dienst dann laufend ausgeführt und in deinem Heimnetzwerk erreichbar ist. Falls du bisher gar nicht mit solcher Technik ausgestattet sein solltest, wäre ein Raspberry Pi Mini-Computer ein guter Einstieg.\nFailure Ja, ich bin mir der Ironie absolut bewusst, gerade einen Amazon-Link bereitzustellen. Du kannst jedoch selbst entscheiden, ihn anzuklicken oder es einfach zu lassen \u0026#x1f604;.\nEs gibt im Internet unzählige Leitfäden, einen Raspberry Pi mit Pi-hole einzurichten. Ich finde diesen hier sehr strukturiert und verständlich erklärt.\nLos geht\u0026rsquo;s # Nachdem du einen DNS-Blocker deiner Wahl installiert und in Betrieb genommen hast, richtest du ihn schlussendlich als DNS-Server in deinem Heimnetz ein. Wie genau das funktioniert, hängt stark von deinem Router ab.\nHier die gängigsten Geräte:\nFRITZ!Box – Lokalen DNS-Server einrichten Speedport (Telekom) – DNS-Server ändern Vodafone Station – mit Bordmitteln scheinbar nicht möglich, hier muss dein DNS-Blocker gleich als kompletter DHCP-Server eingetragen werden. Vodafone halt. Dein DNS-Blocker wird von deinem Router nun als DNS-Server an die Endgeräte im Heimnetzwerk verteilt. Um das sofort zu erzwingen, kannst du die Endgeräte einfach erneut mit dem Netzwerk verbinden lassen. Kurz darauf beginnt dein DNS-Blocker mit der Auflösung von DNS-Anfragen und stellt dir sogar Statistiken darüber bereit:\nAn meinen Statistiken kannst du erkennen, dass knapp 20% aller DNS-Anfragen bei mir ins Leere laufen und damit geblockt werden. Die Geräte mit den meisten Blockierungen sind neben den Smartphones übrigens Smart TV, PlayStation 5 und Voice Assistants. Trotz dieser gewaltigen Summen an Blockierungen funktionieren sie übrigens weiterhin frei von Fehlern und Einschränkungen – also war es unnützer Ballast.\nBlocklisten # Dieser ganze Aufwand wäre nichts wert, wenn du keine Domains blockierst. Doch woher soll man die Information nehmen, welche Domains überhaupt blockiert werden sollten? Natürlich könntest du jede scheinbar unliebsame DNS-Anfrage nun selbst per Hand blockieren. Doch im Anschluss daran solltest du natürlich auch testen, ob deine Entscheidung dafür sorgt, dass z.B. deine Lieblings-Webseite jetzt nicht mehr funktioniert.\nDas würde viel zu aufwändig werden und schnell hättest du keine Lust mehr darauf. Ich übrigens auch nicht. Das Internet lebt von der Crowd und ihrem Einfallsreichtum, und so ist bspw. mit Firebog eine gute Blocklisten-Sammlung entstanden. Diese stellte auch meinen Start in das DNS-Blocking dar, ist aber mittlerweile aus der Zeit gefallen und wird nicht mehr regelmäßig aktualisiert. Einige der Blocklisten sind mir außerdem zu restriktiv gewesen, sodass ich mich immer wieder selbst dabei ertappt habe, blockierte Domains manuell freizugeben.\nAus diesem Grund solltest du dir dieses Projekt ansehen:\nDer Kurator dieser Blocklisten und des gesamten Projekts, hagezi aka Gerd, veröffentlicht jeden Tag ein Update mit dem neusten Fundus an Werbern, Trackern, Scammern, Fake-Shops und sonstigem Kram, dem man im Internet besser nicht vertrauen sollte.\nGroßartig bei diesem Projekt ist außerdem, dass du dir entweder eine kuratierte Gesamt-Blockliste (in den Ausprägungen light, normal, pro, pro++ und ultimate) in deinen DNS-Blocker laden kannst. Oder aber du abonnierst die Themen-Blocklisten (bspw. NSFW, Gambling, Threat Intelligence Feeds, etc.), einzeln, wie du sie brauchst. Diesen Weg habe ich gewählt, da ich mein Heimnetz segmentiert habe und unterschiedliche Blocklisten-Kombinationen für die verschiedenen Netzsegmente verwende.\nInfo Beispiel: unser Home-WLAN ist weniger restriktiv als unser Gäste-Netz. Beim Surfen möchte ich nicht durch zu intensives Blocking gestört werden und beschränke mich hierbei gezielt auf Werbung, Tracking und Security. Unsere Gäste kommen darüber hinaus in den Genuss von Gambling- und NSFW-Filtern – das können sie gern zu Hause machen \u0026#x1f601;.\nEs soll nicht unerwähnt bleiben, dass hagezi nicht nur eine großartige Sammlung bereitstellt. Im täglichen Einsatz wirst du feststellen, dass der von deinen Lieblingsdiensten benötigte Traffic durchgelassen wird und sie in den meisten Fällen weiterhin korrekt funktionieren. Das ist für mich der ausschlaggebende Punkt.\nFazit # Das gesamte Thema rund um DNS und Blocking ist sehr interessant und kann eine Menge Spaß machen. Es fühlt sich gut an, diesem Datensammelwahnsinn zumindest etwas Einhalt zu gebieten. Der Nachteil daran ist, dass du dich nach einer Weile an das saubere Internet gewöhnst. Manchmal bin ich wirklich erschrocken, wenn ich außerhalb des Heimnetzwerks surfe und sehe, wie meine Lieblingswebseiten in Wirklichkeit aussehen.\nEin weiterer Pluspunkt ist, dass du Schwarz auf Weiß sehen kannst, wohin deine Geräte die ganze Zeit telefonieren. Auch dann, wenn du sie gerade nicht benutzt. Du wirst dich wundern, was in deinem Zuhause alles abgeht, von dem du bisher nichts gewusst hast.\nViel Spaß beim Blockieren \u0026#x1f60e;!\nDas Titel-/Hintergrundbild stammt von Morgane Perraud auf Unsplash .","image":"https://tbsch.de/post/2025-09-23-der-wahnsinn-warum-ich-dns-blocking-verwende/featured.webp"},{"id":"https://tbsch.de/post/2025-08-29-erfahrungsbericht-5-jahre-ohne-brille/","url":"https://tbsch.de/post/2025-08-29-erfahrungsbericht-5-jahre-ohne-brille/","title":"Erfahrungsbericht: 5 Jahre ohne Brille","summary":"Meine Augen lasern zu lassen, war eine der besten Entscheidungen meines Lebens.","date_published":"2025-08-29T00:00:00Z","date_modified":"2025-08-29T00:00:00Z","tags":["meinung","bericht","gesundheit"],"content_text":" Eine der besten Entscheidungen meines Lebens war, es ohne Brille führen zu wollen. Blickst du auch manchmal zurück und fragst dich, was du in deinem Leben richtig oder komplett falsch gemacht hast? Seit die Tage immer weniger werden, die mir noch bis zur magischen 4 vorne im Alter verbleiben, denke ich immer öfter darüber nach. Warum ist das so? Ich habe keinen Schimmer, allerdings kann es ja auch gar nicht so falsch sein, sich mit den getroffenen Entscheidungen immer wieder mal auseinanderzusetzen.\nDenn auch in den nächsten 40 Jahren werde ich noch viele Entscheidungen treffen müssen - sei es für mich selbst, für mein Kind oder die ganze Familie. Und jede davon soll ein kleines bisschen besser, weiser, vorausschauender sein als die, die ich zuvor einmal getroffen habe.\nHeute möchte ich über eine meiner Entscheidungen schreiben, die ich absolut richtig getroffen habe: mein Nein zur Brille und das absolute Ja zur Augen-Operation.\nInfo Dieser Beitrag ist sehr lang, aus diesem Grund habe ich versucht, ihn in logische Zeitabschnitte aufzuteilen. Weiterhin berichte ich transparent über alle mir entstandenen Kosten in jedem Zeitabschnitt.\nRückblick # Genau weiß ich es gar nicht mehr: meine erste Brille muss ich bekommen haben, als ich ungefähr 10 Jahre alt war. Als Kind habe ich dieses Ding einfach nicht gemocht - wie vermutlich alle Kinder. Irgendwann hat man sich aber schließlich doch daran gewöhnt, weil man damit einfach etwas sehen konnte. Und ohne halt nicht. So einfach ist das.\nViel zu schnell gewöhnt man sich auch an die ganzen kleinen Einschränkungen: Beim Sport rutscht die Brille ständig runter, wenn man schwitzt. Während eines Friseurbesuchs kann man nicht sehen, was gerade auf dem eigenen Kopf passiert. Auf dem Sofa schmerzt es irgendwann, seitlich auf einem Kissen zu liegen, weil die Brille gegen Kopf und Ohr drückt. Und noch viel mehr. Kommt dir bekannt vor \u0026#x1f601;?\nEines wunderschönen Frühlingstages in 2017 wachte ich auf dem Sofa auf und stellte fest, dass ich abends einfach beim Fernsehen eingeschlafen sein muss. Und da war es passiert: Ich habe auf meiner Brille geschlafen, sie war in der Mitte am Nasensteg glatt durchgebrochen. Seinerzeit wohnte ich auf dem Dorf und ohne Auto gab es keinen Weg in die Stadt, und natürlich musste ich auch noch auf die Arbeit fahren – der Ärger war perfekt, denn ohne Brille konnte ich nichts sehen und, hier sind wir übrigens bei einer meiner dümmsten Entscheidungen: ich hatte keine Ersatzbrille \u0026#x1f604;.\nEine Taxifahrt später und mit 25 Euro weniger in der Tasche gab ich meine Brille schließlich bei einer dir sicherlich bekannten Optiker-Kette zur Reparatur. Und dank meiner Brillenversicherung, die ich scheinbar beim Brillenkauf versehentlich abgeschlossen haben muss, um beim Kaufpreis zu sparen, erhielt ich zur Überbrückung kostenlose Kontaktlinsen in meiner Sehstärke - für insgesamt 14 Tage.\nEntscheidung # Diese zwei Wochen haben mein Leben verändert. Das war wie eine Inception, ich wurde diesen Gedanken einfach nicht mehr los, dass ich keine Brille mehr tragen möchte. Nie wieder! Aber einfach nur auf Linsen umzusteigen, ging mir nicht weit genug. Ich wollte einfach gar keine Sehhilfe mehr haben.\nNatürlich habe ich öfter mal darüber nachgedacht, wie es wäre, sich die Augen operieren zu lassen. Das tut bestimmt jeder Brillenträger gelegentlich. Zumindest bis man dann Google anwirft und sich grob über die Kosten der Operation informiert. Wahnsinn. Von dem Geld könnte ich mir vier MacBooks kaufen, mehrere Male in den Urlaub fliegen oder mir eine Karibik-Kreuzfahrt mit Balkonzimmer buchen.\nMeine damaligen finanziellen Möglichkeiten hätte dieser Eingriff definitiv überschritten, also begann ich Mitte 2018, mir jeden Monat sämtliche Überschüsse meines Gehalts dafür zurückzulegen. Infolgedessen habe ich mir mehr Zeit bei anderen Dingen gelassen, die ich ansonsten frequentierter getan hätte: zum Beispiel meinen Gaming-PC aufrüsten. Man muss ja nicht immer alles sofort haben wollen \u0026#x1f601;.\nErstuntersuchung # Im Januar 2020 war es dann schließlich so weit: ich reservierte mir für März 2020 einen Termin zur Erstuntersuchung und Beratung im FreeVis LASIK Zentrum des Uniklinikums Mannheim. Ich habe mich für diese Klinik entschieden, da ich damals in Mannheim wohnte und es sich um eines der führenden Augenlaserzentren Europas handelt - das passte einfach perfekt!\nWarning Es ist wichtig zu wissen, dass es sich auch bei einer Erstuntersuchung um keine Leistung der Krankenkasse handelt. Es spielt also keine Rolle, ob die Untersuchung einen guten oder schlechten Ausgang hat – die Kosten dafür müssen selbst getragen werden. Es schadet aber nicht, mit deiner Krankenkasse über dein Vorhaben zu sprechen. Manchmal ist unter bestimmten Voraussetzungen vielleicht etwas für dich drin.\nWährend der Untersuchung wurde die Ist-Situation einmal komplett vom Ärzte-Team erfasst, indem diverse Sehtests mit mir durchgeführt wurden. Die Ergebnisse der Tests bildeten dann die Grundlage für das direkt folgende Beratungsgespräch mit dem behandelnden Arzt, in meinem Fall Prof. Dr. Knorz höchstpersönlich.\nDie Untersuchungsergebnisse belegten, dass ich für eine Augenlaser-Operation in Frage kam. Da ich mich im Vorfeld intensiv mit den Laser-Techniken befasst hatte, wünschte ich mir die Durchführung der SMILE LASIK . Bei dieser Methode bleibt der größte Teil der Hornhautschichten des Auges unberührt, wodurch die biomechanische Stabilität der Hornhaut nur minimal beeinflusst wird. Klang für mich sinnvoll und Prof. Dr. Knorz quittierte meinen Wunsch kurzerhand mit der Aussage, dass es ihn aufgrund meiner Vorbereitung für ein Beratungsgespräch ja fast gar nicht mehr benötigen würde, nachdem wir gemeinsam über die Vor- und Nachteile der Operations-Techniken sinnierten \u0026#x1f604;.\nTip Die Kosten der Erstuntersuchung beliefen sich in meinem Fall auf 280 EUR.\nOperation # Bereits einen Monat später, also im April 2020, wurde mein Operations-Termin eingeplant. Das LASIK Zentrum legte mir außerdem nahe, nicht allein zum Termin zu erscheinen, sondern jemanden mitzubringen. Ich muss ganz ehrlich sagen, dass ich die ganze Zeit über sehr entspannt auf den Termin gewartet hatte. Die zwei Nächte vorher konnte ich vor Aufregung allerdings kaum noch schlafen. Da mischte sich alles hinein: Vorfreude, Angst, Panik - und die Erinnerung an diese eine fiese Augenlaser-Szene in Final Destination 5.\nVöllig übermüdet schnappte ich mir am OP-Tag schließlich meinen Kumpel Dmitrij und fuhr mit ihm in die Klinik. Natürlich mit der Straßenbahn. Es soll nicht unerwähnt bleiben, dass es sich um einen gänzlich ambulanten Eingriff handelte. Aufgrund der Corona-Maßnahmen vor Ort waren wir die einzigen Besucher des LASIK Zentrums an diesem Vormittag. Auch wenn Corona keine tolle Sache war, fand ich ziemlich gut, dass es quasi gar keine Wartezeit gab. Es ging also direkt zur Voruntersuchung, wobei nochmals ähnliche Tests wie bei der Erstuntersuchung gemacht wurden. Das dauerte jedoch deutlich länger als beim ersten Mal, da die Messwerte für den Laser benötigt wurden. Nach etwa einer Stunde durfte ich kurz ins Wartezimmer zurückkehren.\nTip Die Kosten der Voruntersuchung beliefen sich in meinem Fall auf 485 EUR.\nNach einer kurzen Verschnaufpause im Wartezimmer wurde ich dann vom Ärzte-Team in das OP-Vorzimmer geführt, in dem ich wie eine Mumie gänzlich eingepackt wurde - damit ich möglichst steril war. Kurz darauf durfte ich mich auf eine Liege legen und bekam Augentropfen, die die Augen betäuben sollten. Nachdem diese 10 Minuten eingewirkt hatten, ging es auch direkt in den OP, in dem mich Prof. Dr. Knorz bereits erwartete.\nIch kann überhaupt nicht in Worte fassen, was mir in diesem Moment alles durch den Kopf ging: alles und nichts. Pure Aufregung. Mir wurde der Ablauf der Operation erklärt: im Endeffekt sollte ich mich nur unter den Laser legen und in das grüne Licht gucken. Mensch, das kann ja nicht so schwer sein \u0026#x1f601;! Mit Klammern wurden dann noch meine Augenlider fixiert, sodass ich nicht mehr blinzeln konnte. Augentropfen schützten vor Brennen in den Augen.\nUnd dann ging es auch schon los, Prof. Dr. Knorz gab das Startsignal und das gesamte Team saß um mich herum. Ich erinnere mich noch, dass eine Assistentin ihre Hand auf mein Knie legte - vermutlich als Beruhigungsmaßnahme. Half leider nur bedingt, in so einem Moment hast du einfach nur Schiss. Es müssen 5 oder 10 Sekunden vergangen gewesen sein, als mir mitgeteilt wurde, dass die Operation geglückt sei. Vielleicht war die Zeitspanne auch länger, es kam mir allerdings wie Sekunden vor.\nDurch meine intensive Vorbereitung wusste ich, was nun passieren würde: durch den Laser schwoll die Hornhaut an und ich erblindete für einen kurzen Moment. Prof. Dr. Knorz erklärte mir nun, dass er jetzt die Lentikelentnahme durch den seitlichen Schnitt in meinen Hornhäuten vornahm. Das sah für mich so aus, als würde man ein Milchglas vor meinen Augen seitlich wegziehen. Dann gab es erneut Augentropfen auf die Augen, die Klemmen wurden gelöst und ich durfte schon wieder aufstehen.\nEs fühlte sich nun so an, als hätte ich zwei Tage lang geweint, aber das Wichtigste war: ich konnte klar sehen, wenn auch noch etwas verschwommen – was nach so einem Eingriff vollkommen normal ist. Das war einfach ein irres Gefühl! In Summe war das Ärzte-Team während des Eingriffs sehr zuvorkommend und routiniert, ich habe mich stets gut abgeholt und aufgehoben gefühlt. Das ist heutzutage in einer Klinik ja leider keine Selbstverständlichkeit mehr.\nÜbrigens war der gesamte Eingriff frei von Schmerzen, ich habe nichts gespürt. Auch nach der Operation gab es keinen einzigen Moment, in dem ich Schmerzen, Druck oder Brennen spürte. Bis heute nicht.\nTip Die Kosten der Operation beliefen sich in meinem Fall auf 3.400 EUR.\nNach der OP # Nachdem ich vom gesamten Team verabschiedet worden war und den OP verlassen hatte, ging es direkt zurück ins Wartezimmer zu meiner Begleitung. Eine Assistentin gab mir dann noch ein Care-Paket an die Hand, bestehend aus einer Sonnenbrille für den Heimweg und sehr vielen verschiedenen Augentropfen. Außerdem gab sie mir noch ein paar Instruktionen mit auf den Weg, wie ich mich zu verhalten habe: nicht ins helle Licht schauen, nur mit gewaschenen Händen ins Gesicht, nicht die Augen reiben.\nBei den Augentropfen handelte es sich um drei unterschiedliche Medikamente, die für die nächsten Wochen teilweise 3x täglich aufgetragen werden sollten. Das gehörte zu solch einem Eingriff einfach dazu und förderte den Heilungsprozess.\nDurch die Sonnenbrille hindurch konnte ich auf dem Heimweg bereits scharf sehen - dieses Gefühl war einfach unglaublich. Hier wurde mir das erste Mal so richtig bewusst, was keine 60 Minuten vorher mit mir passiert war. Ein Laser hat tatsächlich Haut aus meinen Augen herausgeschnitten. Kaum vorstellbar eigentlich. Ab diesem Moment überwogen einfach nur noch die Glücksgefühle.\nDie ersten Tage konnte ich nicht am Rechner arbeiten, das Licht des Bildschirms war schlichtweg zu grell und es war mir nur möglich, die Inhalte verschwommen zu sehen. Fernsehen war auch nicht drin. Meine natürliche und verdunkelte Umgebung nahm ich allerdings gestochen scharf wahr \u0026#x1f604;. Draußen schien die Sonne, doch musste ich Licht vorerst nach Möglichkeit etwas meiden. Also habe ich die nächsten 3 Tage schlichtweg mit Telefonieren verbracht, ganz oldschool.\nVon Nebenwirkungen bin ich anfangs auch nicht ganz verschont geblieben, gerade in den ersten Tagen nach dem Eingriff sah ich häufig Lichtblitze in der Dunkelheit. Das ist ganz normal, und hörte nach ein paar Wochen schließlich auf. Ein weiterer Nebeneffekt kann übrigens sein, dass man in der Dunkelheit etwas schlechter sieht als vor so einer OP. Dies ist bei mir bis heute noch spürbar, war direkt nach dem Eingriff aber verglichen mit heute deutlich stärker.\nNachuntersuchung # Sechs Wochen nach der Operation stand als letzte Maßnahme im Juni 2020 dann noch die Nachuntersuchung an. Hierbei wurde ich erneut einem intensiven Sehtest unterzogen, wie bei der Voruntersuchung und kurz vor dem Eingriff. Im Anschluss gab es dann noch einen weiteren Test, wie man ihn vom Augenarzt kennt, wenn man eine Brille braucht oder den Führerschein beantragen möchte. Das Ergebnis dieses Tests war eine sagenhafte Fehlsichtigkeit von 0 (null!) Dioptrien.\nDamit war es offiziell: meine Kurzsichtigkeit wurde geheilt! Kurz darauf erhielt ich noch das augenärztliche Gutachten, mit dem ich meine Sehschwäche aus dem Führerschein austragen lassen durfte und wurde aus der Behandlung entlassen.\nTip Die Kosten der Nachuntersuchung beliefen sich in meinem Fall auf 426 EUR.\nFazit # Vom ersten Buchen eines Beratungsgesprächs bis zum Abschluss der Behandlung waren gerade einmal 6 Monate vergangen, obwohl gleichzeitig die Corona-Maßnahmen langsam losgingen. Insgesamt habe ich knapp 4.600 EUR für die Heilung meiner Sehschwäche bezahlt.\nWährend ich diesen Beitrag schreibe, sind mit dem heutigen Tag etwas mehr als 5 Jahre seit dem Eingriff vergangen. Nach dieser langen Zeit kann und möchte ich jedem unzufriedenen Brillenträger nahelegen, sich ernsthaft mit der Korrektur der Sehschwäche auseinanderzusetzen. Mein Leben ist auf so vielfältige Weise so viel besser geworden, seit ich einfach gut sehen kann.\nIch habe zum Beispiel Spaß an Sport gefunden, obwohl ich mein ganzes Leben lang ein absoluter Sportmuffel war – ich kann schwitzen, ohne dass mir die Brille von der Nase rutscht. Ich habe sogar Gefallen an Sommer und heißen Tagen gefunden. Beim Tauchen erkenne ich unter Wasser etwas. Es sind diese unzähligen kleinen Details, die das Leben so viel toller machen - darüber zu schreiben, würde einen halben Roman füllen.\nÜberlegst du dir auch, ob du diesen Schritt gehen möchtest? Meine Empfehlung: hör auf zu überlegen, fang an zu sparen und gehe diesen Weg. Für jeden Cent der OP-Kosten erhältst du im Austausch maximales Wohlfühlgefühl - und das ist schließlich unbezahlbar.\nDu wirst es nicht bereuen!\nDas Titel-/Hintergrundbild stammt von Brands\u0026amp;People auf Unsplash .","image":"https://tbsch.de/post/2025-08-29-erfahrungsbericht-5-jahre-ohne-brille/featured.webp"},{"id":"https://tbsch.de/post/2025-06-30-zendure-solarflow-mqtt-passwort-knacken/","url":"https://tbsch.de/post/2025-06-30-zendure-solarflow-mqtt-passwort-knacken/","title":"Zendure SolarFlow MQTT Passwort knacken","summary":"Zendure SolarFlow lokal über MQTT ohne anonymen Benutzer und mit mehr Sicherheit steuern.","date_published":"2025-06-30T00:00:00Z","date_modified":"2025-06-30T00:00:00Z","tags":["smart-home","energie","guide","home-assistant","solar","zendure"],"content_text":"Wenn du deine Zendure SolarFlow Speicherlösung ebenfalls von der Cloud befreit hast, wirst du wahrscheinlich einen MQTT-Broker mit anonymen Logins eingerichtet haben, um an die Sensor-Messwerte zu gelangen.\nIn diesem Artikel möchte ich dir zeigen, wie du an das hardcoded Passwort deines SolarFlow-Geräts gelangst. Getestet habe ich das Verfahren mit einem Hub 2000, mit ein bisschen Glück funktioniert es auch bei den anderen Geräten.\nVorgehensweise # 1. Device ID # Wenn du deinen SolarFlow aus der Cloud befreit hast, verfügst du bereits über seine Device ID. Falls nicht, schau dir am besten einmal den Artikel darüber von mir an.\n2. Passwort ermitteln # Auf GitHub habe ich ein paar kleine Programme veröffentlicht, mit denen das Passwort ermittelt werden kann. Das Projekt steht dort als Micro-Webseite, Node.js- und Python-Script zur Verfügung.\nAlternativ dazu kannst du das Passwort auch direkt hier ermitteln. Meine Webseite berechnet es für dich direkt in deinem Browser, deine Device ID wird also nicht an mich übertragen.\nDevice ID:\n3. MQTT User konfigurieren # Als Home Assistant User mit dem Mosquitto Broker Add-on hast du es am einfachsten, denn du musst nur einen kleinen Eintrag in der Konfiguration erzeugen und das Add-on anschließend neu starten.\nZur Veranschaulichung verwende ich ABCdef123 als Device ID.\n- username: ABCdef123 password: A599C0002BC5E5F5 Falls du nicht mit Home Assistant oder dem Add-on ausgestattet bist und stattdessen einen eigenen mosquitto Broker betreibst, erzeugst du neue User in der Regel so:\nmosquitto_passwd -b /etc/mosquitto/passwd ABCdef123 A599C0002BC5E5F5 Das gilt jedoch nicht für gänzlich andere Broker, wie z.B. EMQX oder HiveMQ.\nFazit # Auch wenn das gesamte Prozedere die Sicherheit deines Smart Homes nur minimal tangiert (wenn überhaupt), fühlt man sich doch um einiges wohler, wenn man keinen MQTT-Broker mit anonymen Logins betreiben muss \u0026#x1f601;.\nDas Titel-/Hintergrundbild stammt von Leo_Visions auf Unsplash .","image":"https://tbsch.de/post/2025-06-30-zendure-solarflow-mqtt-passwort-knacken/featured.webp"},{"id":"https://tbsch.de/post/2025-06-15-zendure-solarflow-lokal-%C3%BCber-mqtt-steuern/","url":"https://tbsch.de/post/2025-06-15-zendure-solarflow-lokal-%C3%BCber-mqtt-steuern/","title":"Zendure SolarFlow lokal über MQTT steuern","summary":"Wie aus Zendure SolarFlow mit lokalem Zugriff noch mehr raus geholt werden kann, und wie man das macht.","date_published":"2025-06-15T00:00:00Z","date_modified":"2025-11-30T00:00:00Z","tags":["smart-home","energie","guide","home-assistant","solar","zendure"],"content_text":" Danger Update 29.06.2025: in diesem Artikel beschreibe ich die Vorgehensweise, Zendure SolarFlow lokal über MQTT zu steuern. Hierbei beziehe ich mich auf einen MQTT-Broker mit anonymen Logins, da das verwendete MQTT Passwort von SolarFlow unbekannt ist. Zwischenzeitlich habe ich einen Weg gefunden, das Passwort selbst zu errechnen und SolarFlow direkt mit meinem Home Assistant Broker und mit Authentifizierung zu verbinden.\nMehr dazu findest du hier.\nSeit ich ein kleines Balkonkraftwerk (ich berichtete) betreibe, war für mich schnell klar: nicht nur den erzeugten Strom verbrauchen, sondern auch speichern. Denn sonst läuft das meiste der gewonnenen Power direkt ins Netz zurück - verschenkte Energie, keinen Cent wert, nutzlos.\nAlso musste ein Batteriespeicher her, der sich nahtlos in mein Smart Home-Ökosystem mit Home Assistant integrieren lässt. Voraussetzung dafür war, dass die Messdaten jederzeit lokal zur Verfügung stehen und stets den aktuellen Status aufweisen. Gibt es in Zeiten von IoT und Smart Home ja ganz bestimmt endlos am Markt \u0026#x1f609; - /sarcasm.\nIch nehme dich nun also mit auf die Reise, von der Entscheidung für eine Speicherlösung bis hin zur Integration in Home Assistant.\nDie Suche nach einer Speicherlösung # So begann Anfang 2024 mein absoluter Albtraum: Recherche hier, Ratlosigkeit da, Fassungslosigkeit dort. Zum Glück mit einem positiven Erwachen im Juni 2025.\nÜberall Cloudzwang # Bin ich eigentlich der einzige Mensch auf der Welt, der überhaupt nicht darauf steht, von allen Herstellern mit ihren Apps überschwemmt zu werden? Natürlich alles absolut sicher in ihren Hochsicherheits-Clouds gespeichert, Privatsphäre wird geschützt, etc.pp. Das ist so sicher, wie dass Facebook ernsthaft daran interessiert ist, deine Privatsphäre zu schützen. Du merkst schon, worauf das hinausläuft \u0026#x1f928;.\nAußerdem möchte ich nicht in eine App gucken müssen, wie viel Solarstrom gerade gewonnen, gespeichert und selbst verbraucht werden kann. Davon habe ich nichts außer der Erkenntnis, die Informationen zwar sehen, aber nicht damit arbeiten zu können. Mein Smart Home muss in die Lage versetzt werden, mit diesen Messwerten intelligente Entscheidungen zu treffen. Und da es keine App bedienen kann, habe ich also nichts davon.\nLast but not least sprechen wir hier von kritischen Messwerten, die ich auf keinen Fall nur über das Internet im Zugriff haben möchte. Denn das würde bedeuten: bei einem Internetausfall ist mein Balkonkraftwerk – direkt vor meiner Nase – nicht mehr steuerbar. Das ist absolut nicht erstrebenswert, will man einfach nicht, Red Flag \u0026#x1f6a9;.\nAnforderungen # Meine Wünsche an eine Speicherlösung sind doch eigentlich gar nicht so speziell:\n2 kWh Kapazität, denn mehr fällt bei meiner Anlage derzeit nicht an Überschuss ab Kapazität jedoch skalierbar, denn\u0026hellip; Solarmodule bis 2400 Wp aufrüstbar Lokale Datenverfügbarkeit über REST, MQTT, etc. Integration somit in Home Assistant möglich Wenn du im Internet nach Batteriespeichern für Balkonkraftwerke suchst, wirst du sehr schnell von Anker SOLIX, Growatt NOAH, Marstek B2500, Zendure SolarFlow und einigen anderen Produkten lesen. Und alle kommen sie mit Cloudzwang ohne lokale Steuerung daher, oder aber auf irgendeine Weise nervtötend eingeschränkt.\nFazit # Insgesamt habe ich mich ein Jahr mit der Suche nach einer Lösung beschäftigt und mich sehr lange mit den Ergebnissen auseinandergesetzt. Ich wollte einfach unbedingt direkt zu dem für mich passenden Produkt greifen.\nDie Recherche ist allerdings gar nicht so einfach gewesen, da häufig die Informationen nicht so zur Verfügung standen, wie ich es mir wünschte. Bei so einer Investition möchte man im Vorfeld schließlich genau wissen, worauf man sich einlässt. Deshalb passte ich meine Strategie an. Ich kontaktierte den Balkonkraftwerk Content Creator Mario Makowski , der die Lösungen diverser Hersteller bereits selbst in der Hand hatte und ausprobieren konnte.\nEr riet mir, mich mit Zendure SolarFlow zu beschäftigen \u0026#x1f914;.\nZendure SolarFlow # Zendure SolarFlow besteht in der Regel aus einer Hub-Einheit und den daran angeschlossenen Speichereinheiten. Ich habe mich für den Hub 2000 entschieden, den ich dann bequem an meinen vorhandenen Wechselrichter anschließen konnte.\nSehen wir uns nun gemeinsam an, wie ich diese Speicherlösung erfolgreich in mein Smart Home integrieren konnte.\nInfo Technische Daten zum Zendure SolarFlow findest du hier . In diesem Beitrag geht es stattdessen um die Integration im lokalen Smart Home. Kontaktiere mich gern, wenn du Fragen hast.\nVorbereitungen # Eigentlich hatte ich SolarFlow bereits ausgeschlossen, da die Messwerte über MQTT lediglich aus der Herstellercloud abgerufen werden können. Einige Smart Home Nutzer klagten außerdem über die Tatsache, dass die Datenübertragung häufig mit hohen Latenzen verbunden sei und viele Messwerte erst mit einer Verzögerung mehrerer Minuten zur Verfügung stehen.\nDann entdeckte ich den SolarFlow Bluetooth Manager von Reinhard Weber auf GitHub.\nDas Tool verspricht, diverse Modellreihen von Zendure aus der Cloud befreien zu können. Hierbei wird per Bluetooth eine Verbindungskonfiguration an das Gerät übertragen, darunter deine WLAN-Einstellungen und Verbindungsoptionen für einen MQTT-Broker. Dass die Zendure App fürs Smartphone dann nicht mehr korrekt arbeiten kann, ist mir sogar mehr als recht \u0026#x1f604;.\nWarning Die nun gezeigte Lösung ist zwar kinderleicht, dennoch nichts für Anfänger. Du benötigst ein Bluetooth-fähiges Gerät, auf dem Python installiert ist. Du solltest dich mit Python auskennen und wissen, wie eine Entwicklungsumgebung eingerichtet und Abhängigkeiten bereitgestellt werden. Ein paar Grundlagen im Umgang mit einem Terminal schaden ebenfalls nicht.\nInfo Update 30.11.2025: vom Leser und Zendure User Manfred habe ich den Hinweis erhalten, dass SolarFlow Bluetooth Manager mit einem Zendure SolarFlow 2400AC nicht funktioniert. Er teilte mir mit, dass das auch gar nicht nötig wäre, denn dort ist es problemlos möglich, einen eigenen lokalen MQTT-Broker zu konfigurieren. Voraussetzung ist die Deaktivierung des Home Energy Management Systems (HEMS).\nNachdem ich meine Solarmodule und den Wechselrichter mit Zendure SolarFlow Hub 2000 verbunden hatte und das System betriebsbereit war, habe ich das Gerät mit der Zendure App verbunden und initial eingerichtet: klasse, alles funktioniert einwandfrei und erste Solar-Leistungsdaten flatterten über mich herein.\nDas angebotene Firmware-Update habe ich vorerst ausgelassen, da ich befürchtete, dass die weiteren Schritte danach nicht mehr funktionieren könnten. Die Version v3.0.21 der MASTER Firmware kannst du jedoch bedenkenlos installieren - die habe ich ebenfalls im Einsatz.\nNote Ich lege dir nahe, in der App unbedingt direkt das Output Limit herabzusetzen. Das ist die Leistung, mit der SolarFlow Strom an deinen Wechselrichter abgibt. In meinem Fall waren 800 Watt voreingestellt.\nAllerdings habe ich das nicht bemerkt und bis zum Abschluss der Einbindung von SolarFlow in mein Smart Home die volle Power direkt aus der Batterie raus zum Netzbetreiber gejagt \u0026#x1f604;.\nDanach schnappte ich mir direkt mein MacBook. Hier hatte ich bereits alles für die Ausführung des SolarFlow Bluetooth Managers vorbereitet.\nSprengen der Ketten # Auf der GitHub Seite vom SolarFlow Bluetooth Manager sind alle Befehle sehr gut beschrieben, sodass du sie einfach nach der Reihe ausführen kannst.\n1. Infos parat halten # Für den lokalen Betrieb von Zendure SolarFlow benötigst du:\nWLAN-Verbindungsdaten (SSID und Passwort). MQTT-Broker-Verbindungsdaten (Host und Port), ohne Authentifizierung. Das war schon alles. SolarFlow verwendet mutmaßlich ein hardcoded Passwort zur Authentifizierung am MQTT-Broker, welches wir nicht kennen. Daher benötigst du einen MQTT-Broker mit erlaubter anonymer Anmeldung.\nNote Anonyme Logins auf meinem Smart-Home-MQTT-Broker begeisterten mich wenig, weshalb ich mir in Docker schlichtweg einen extra dafür vorgesehenen Broker hochgezogen habe. Dass das durchaus Sinn ergeben kann, erkläre ich weiter unten.\n2. Umgebung scannen # Ziel ist es, die Device ID des Zendure-Geräts herauszufinden. Öffne dein Terminal, definiere deine SF_PRODUCT_ID und starte das Python Skript.\nexport SF_PRODUCT_ID=A8yh63 # Zendure SolarFlow Hub 2000 python3 solarflow-bt-manager.py -i Schon nach einem kurzen Augenblick werden dir die Infos präsentiert und du kannst die Ausführung des Programms unterbrechen. Notiere dir die Device ID.\nSollte das Skript in einen Timeout laufen und keine Geräte finden, stelle sicher, dass die Zendure App auf deinem Smartphone geschlossen und nicht mehr mit SolarFlow über Bluetooth verbunden ist. Das Skript hat mein SolarFlow erst 3 Minuten nach Beenden der App gefunden. Lass dich nicht aus der Ruhe bringen \u0026#x1f60e;.\n3. Lokal verbinden # Jetzt wird es auch schon richtig ernst, denn die Verbindung zur Zendure Cloud (und damit zur App) wird getrennt. Das Gerät ist im Anschluss nur noch lokal über MQTT steuerbar. Der SolarFlow Bluetooth Manager bietet noch einen Proxy-Mode an, über den die Messwerte lokal bereitstehen und gleichzeitig eine Cloud-Verbindung erhalten bleibt. Das kam für mich persönlich jedoch nicht in Frage.\nZuerst werden im Terminal wieder ein paar Umgebungsvariablen definiert. Die SF_PRODUCT_ID hast du in Schritt 2 bereits definiert, der Vollständigkeit halber liste ich sie aber noch einmal auf:\nexport SF_PRODUCT_ID=A8yh63 # Zendure SolarFlow Hub 2000 export SF_DEVICE_ID=\u0026#34;V77...\u0026#34; # die Device ID aus Schritt 2 export WIFI_PWD=\u0026#34;1234567890\u0026#34; # dein WLAN Passwort export MQTT_USER=\u0026#34;mqtt\u0026#34; # habe hier nur einen Dummy-Wert gesetzt export MQTT_PWD=\u0026#34;mqtt_pwd\u0026#34; # habe hier nur einen Dummy-Wert gesetzt Vergewissere dich, dass alle Werte korrekt sind, und führe danach den Disconnect-Befehl aus. Hierbei musst du deinen WLAN-Netzwerknamen und die IP-Adresse deines lokalen MQTT-Brokers angeben.\npython3 solarflow-bt-manager.py -d -w \u0026#34;WLAN_SSID\u0026#34; -b \u0026#34;MQTT_HOST\u0026#34; Das war es auch schon. Bei mir hat es direkt funktioniert, Troubleshooting war nicht notwendig.\n4. Erfolgsprüfung # Kurz darauf erreichen deinen MQTT-Broker bereits die ersten Nachrichten von Zendure SolarFlow, denn das Gerät berichtet beinahe sekündlich über seinen aktuellen Zustand und übermittelt Telemetrie-Daten.\nIch verwende für solche Zwecke gern das Tool MQTT Explorer von Thomas Nordquist. Es ist schlank, übersichtlich und Open Source. Falls du es noch nicht installiert hast: Du wirst es im weiteren Verlauf dieses Beitrags noch benötigen \u0026#x1f601;.\nHerzlichen Glückwunsch, dein Zendure SolarFlow ist nun von der Cloud befreit und kann nur noch lokal gesteuert und ausgelesen werden. Du wirst es nicht bereuen!\nSmart-Home-Integration # Wäre ja zu schön gewesen, wenn nun schon direkt alle Sensoren in Home Assistant (oder der Smart Home Lösung deiner Wahl) zur Verfügung stehen würden. Allerdings folgt jetzt der Teil der Arbeit, der mir persönlich immer am meisten Spaß macht.\n1. Daten analysieren # Zendure SolarFlow sendet haufenweise Nachrichten an die folgenden Topics. Diese solltest du dir im MQTT Explorer näher ansehen und entscheiden, ob du mit den Informationen im Smart Home arbeiten kannst oder nicht.\nDie aus meiner Sicht wichtigsten wären:\nTopic Beschreibung /+/+/event/device Enthält allgemeine Infos zu Laderichtung und Power. /+/+/log Enthält sämtliche Gerätedaten als Telemetrie-Array. /+/+/properties/report Wichtigstes Topic! Hierüber kommen detaillierte Zustandsänderungen. iot/+/+/properties/write Hierüber können Befehle an SolarFlow gesendet werden, z.B. Änderung des Output Limits. Sehen wir uns das Report-Topic einmal näher an. Es enthält sehr viele Zustandsmitteilungen zum SolarFlow Hub selbst (properties), aber auch zu den angeschlossenen Batterien (packData):\n{ \u0026#34;messageId\u0026#34;: \u0026#34;123\u0026#34;, \u0026#34;product\u0026#34;: \u0026#34;solarFlow\u0026#34;, \u0026#34;deviceId\u0026#34;: \u0026#34;V77xxx\u0026#34;, \u0026#34;timestamp\u0026#34;: 847111, \u0026#34;properties\u0026#34;: { \u0026#34;solarInputPower\u0026#34;: 37, \u0026#34;packInputPower\u0026#34;: 59, \u0026#34;solarPower2\u0026#34;: 11 }, \u0026#34;packData\u0026#34;: [ { \u0026#34;socLevel\u0026#34;: 38, \u0026#34;sn\u0026#34;: \u0026#34;CO4xxxxxxxxxx\u0026#34; } ] } Info Eine Auflistung aller Datenpunkte und ihrer Bedeutung wird von Zendure selbst auf GitHub bereitgestellt.\n2. MQTT Topics mappen # Die Herausforderung beim Bau von Sensoren für Home Assistant ist, dass lediglich veränderte Datenpunkte in den Payloads enthalten sind. Unveränderte Datenpunkte werden so lange nicht erneut gesendet, bis sie einen anderen Wert angenommen haben.\nBeim SolarFlow Bluetooth Manager ist zwar auf GitHub ein möglicher Lösungsweg dokumentiert , ich habe es jedoch anders gelöst. Wie oben erwähnt, verwende ich einen separaten MQTT-Broker ohne Authentifizierung, an den Zendure SolarFlow nun alle Daten sendet. In Node-RED habe ich dann einen Flow aufgebaut, der die Topics umbaut und an meinen Home Assistant MQTT Broker weiterleitet.\nInfo Alle wesentlichen Details zu meiner Home Assistant Installation und den Produkten, die ich verwende, kannst du auf meiner Smart Home Seite nachschlagen.\nAls kleinen Bonus gibt es noch ein zusätzliches Topic von mir, welches den Verbindungsstatus von SolarFlow darstellen kann, und einen Binary Sensor in Home Assistant, der diesen Status direkt visualisiert. Das löse ich mit einem Trigger-Node.\nIm Wesentlichen habe ich die Logik vom SolarFlow Topic Mapper , der beim SolarFlow Bluetooth Manager dabei ist, in Node-RED nachgebaut und das gesamte Ergebnis an meine Bedürfnisse angepasst. Deshalb kann ich den Flow gegenwärtig noch nicht öffentlich teilen, kontaktiere mich aber gern, wenn du Fragen dazu hast.\nNachdem der Flow deployed wurde und seine Arbeit aufgenommen hat, kommen auch schon direkt die Messwerte auf meinem Home Assistant MQTT Broker an.\nSicher kannst du auf einen Blick erkennen, welches Wetter hier gerade ist, während ich diesen Beitrag schreibe \u0026#x1f60e;.\n3. Sensoren definieren # Im letzten Schritt steht die eigentliche Integration der Messwerte in Home Assistant an, nachdem sie nun sauber über MQTT transportiert werden. Ich habe ein paar Stunden Arbeit in die eigene Gestaltung der Sensoren gesteckt, da die im Internet zur Verfügung stehenden Konfigurationen mir schlichtweg nicht gefallen haben, unvollständig waren oder sogar Fehler hatten.\nDie beiden folgenden YAML-Dateien werden von Home Assistant geladen, da ich folgenden Eintrag in meiner configuration.yaml angelegt habe:\nmqtt: !include_dir_merge_list includes/mqtt/ homeassistant_mqtt_zendure_hub.yaml homeassistant_mqtt_zendure_pack.yaml Dir ist sicher aufgefallen, dass die Sensoren das in Punkt 2 erwähnte MQTT Topic zum Verbindungsstatus verwenden. Sollte mein Zendure SolarFlow einmal länger als drei Minuten keine Daten senden, stellen sich die Sensoren alle auf den Status nicht verfügbar um.\n4. Ergebnis # Nach der ganzen Theorie wird es nun Zeit, das Ergebnis zu sehen - bzw. einen kleinen Ausschnitt davon. Ich möchte dich ja nicht spoilern und dir die Möglichkeit geben, diesen Moment des Erfolgs in deinem eigenen Smart Home genießen zu können \u0026#x1f604;.\nNächste Schritte # Nachdem Zendure SolarFlow in dein Smart Home integriert wurde und die Sensorik sowie grundlegende Steuerung jetzt funktioniert, liegt es nun an dir, für Intelligenz im Lade-/Entlade-Verhalten zu sorgen.\nIch möchte dir an dieser Stelle ein paar Konfigurations-Entitäten für den Anfang mit auf den Weg geben, über die sich bereits viel erreichen lässt:\nEinstellung Bedeutung/Auswirkung Output Limit Legt fest, wie viel Leistung an deinen Haushalt abgegeben wird. SolarFlow versucht immer, diesen Wert zu erreichen - mit direktem Verbrauch deiner aktuellen Solarpower oder vorhandener Batterieladung, oder einem Mix aus beidem. Wenn mehr Solarstrom produziert wird als abgegeben werden soll, wird in der Folge die Batterie aufgeladen. SoC Min Die Schwelle für die Mindestladung der Batterie, ich verwende hier in der Regel 20%. SolarFlow wird die Batterie mindestens bis zu diesem Wert aufladen und nichts an den Haushalt abgeben, während Solarstrom produziert wird. Beim Entladen wird dieser Wert niemals unterschritten. Du kannst das System zwingen, die Aufladung der Batterie zu priorisieren, wenn du den Wert bspw. auf 80% einstellst. Da gibt es interessante Möglichkeiten. SoC Set Die Schwelle für die Maximalladung der Batterie, ich verwende hier einen Wert \u0026gt;=80%. SolarFlow wird die Batterie bis zu diesem Wert aufladen und anschließend den Battery Bypass aktivieren. Ab hier wird sämtliche produzierte Solarpower direkt an den Haushalt abgegeben, ohne die Batterie zu laden. Battery Bypass Kann drei Zustände annehmen. Immer ein klemmt die Batterie vom Kreislauf immer ab. Immer aus lädt und entlädt die Batterie in Abhängigkeit der anderen Einstellungen. Automatisch lässt SolarFlow selbst entscheiden, ob die Batterie am Kreislauf teilnimmt, oder nicht. Ich verwende in der Regel Automatisch. Mein Ziel ist, immer den aktuellen Leistungsbedarf im Haushalt mit Sonnenkraft zu decken, die Überkapazitäten zu speichern und nach Möglichkeit niemals Strom an das öffentliche Netz abzugeben. Nach Sonnenuntergang wird die Batterie anschließend in der Höhe meiner Grundlast entladen. So verbrauche ich die meiste Solarpower direkt und schaffe mir zusätzlich eine kleine Ersparnis für die Nacht.\nDa ich einen Stromtarif mit fixem Arbeitspreis verwende, spielt es keine Rolle, wann ich Energie verbrauchen oder speichern muss - sie kostet immer dasselbe. Sparen kann ich also nur, wenn ich das Maximum an selbstproduziertem Strom selbst verbrauchen kann. Und genau das ist meine Strategie.\nHätte ich einen dynamischen Stromtarif, sähe das Ganze wiederum komplett anders aus. Hier kann das Ziel nur sein, Strom immer dann aus dem Netz zu beziehen, wenn er günstig ist, und teure Zeitintervalle mit Eigenproduktion zu decken. Diese Tarife sprechen mich zwar aufgrund ihrer Möglichkeiten an, sind mir gegenwärtig allerdings zu risikobehaftet.\nAls Nächstes werde ich darüber berichten, wie ich die ganzen Messwerte für das Home Assistant Energie-Dashboard passend gemacht habe.\nEmpfehlung # Und noch etwas in eigener Sache:\nSeit kurz nach dem Marktstart in Deutschland bin ich überzeugter Kunde bei Octopus Energy , mittlerweile in einem noch günstigeren Treuetarif.\nWährend der Energiekrise 2022 hatten wir gegenseitig ein einmonatiges Kündigungsrecht, im Gegensatz zu vielen schwarzen Schafen am Markt haben sie weder davon, noch einer Preisanpassung mir gegenüber, Gebrauch gemacht. Im Gegenteil: sie haben den Preis nach dem Wegfall der EEG-Umlage sogar noch gesenkt. So bin ich mit knapp unter 30 Cent Arbeitspreis durch die Krise gekommen, mit mir haben sie definitiv kein Geld verdient.\nAber sie waren mir treu und im Gegenzug erzähle ich jedem davon \u0026#x1f601;.\nFalls dich die Preisgestaltung von Octopus Energy anspricht, scanne einfach den QR-Code und sichere dir 100 EUR Guthaben auf den Jahresbeitrag. Ich erhalte dann 50 EUR auf meinen Jahresbeitrag - oder mit anderen Worten: 175 kWh frei \u0026#x1f60e;!\nDas Titel-/Hintergrundbild stammt von Zendure .","image":"https://tbsch.de/post/2025-06-15-zendure-solarflow-lokal-%C3%BCber-mqtt-steuern/featured.webp"},{"id":"https://tbsch.de/post/2025-05-26-pypaperless-v4-und-home-assistant-integration/","url":"https://tbsch.de/post/2025-05-26-pypaperless-v4-und-home-assistant-integration/","title":"pypaperless v4 und Home Assistant Integration","summary":"Ich habe pypaperless v4 veröffentlicht. Neuigkeiten zur Home Assistant Integration!","date_published":"2025-05-26T00:00:00Z","date_modified":"2025-05-26T00:00:00Z","tags":["news","home-assistant","paperless","projekt","python"],"content_text":"Oha, schon wieder ein Major Update \u0026#x1f631;! Wird ja langsam zur Gewohnheit.\npypaperless v4 # Spaß beiseite, die neue Version von pypaperless bringt Support für Paperless-ngx ab Version 2.15.0 und enthält ein Refactoring der Art und Weise, wie mit CustomField Objekten umgegangen werden kann. In den kurz darauf erfolgten Minor Updates gab es außerdem haufenweise neue Features.\nHome Assistant Integration # Das mir vorgenommene Ziel einer Home Assistant Integration rückt nun in greifbare Nähe. Nicht jedoch, weil ich meine eigene Integration zur Marktreife geführt hätte. Dafür fehlte mir leider schlichtweg die Zeit, und aus privaten Gründen könnte ich den notwendigen Support in meiner Freizeit auch in Zukunft gar nicht bewältigen.\nUmso aufgeregter machte mich die Mail von Florian, der mir mitgeteilt hat, selbst eine Integration bauen und gern mit mir gemeinsam daran arbeiten zu wollen.\nDirekt zu den Pull Requests von Florian.\nIch werde hier dann mit einer weiteren News auf den endgültigen Release hinweisen.\nViel Spaß mit pypaperless v4 und der neuen Home Assistant Integration!\nDas Titel-/Hintergrundbild stammt von Chris Ried auf Unsplash .","image":"https://tbsch.de/post/2025-05-26-pypaperless-v4-und-home-assistant-integration/featured.webp"},{"id":"https://tbsch.de/post/2025-05-25-smart-home-als-gewohnheitsverst%C3%A4rker/","url":"https://tbsch.de/post/2025-05-25-smart-home-als-gewohnheitsverst%C3%A4rker/","title":"Smart Home als Gewohnheitsverstärker","summary":"Smart Home nutzen, um nicht nur das Zuhause zu steuern, sondern Gewohnheiten zu verstärken.","date_published":"2025-05-25T00:00:00Z","date_modified":"2025-05-25T00:00:00Z","tags":["smart-home","gewohnheit","home-assistant","trigger","workflow"],"content_text":"Automatisierung ist für viele ein technisches Hobby. Ein Spielplatz, auf dem Regeln und Zustände wie Bausteine zusammengesetzt werden. Ich habe mich lange genau so damit beschäftigt. Aber irgendwann war mir das zu wenig. Warum? Weil mein Ziel nicht nur war, ein paar Lichter automatisch an- und auszuschalten oder die Kaffeemaschine fernzusteuern. Ich wollte, dass Technik mir hilft, mich selbst zu strukturieren – ohne mich zu bevormunden.\nGenau an dieser Stelle wurde Home Assistant für mich mehr als nur ein zentrales Dashboard. Es wurde ein Werkzeug zur Selbstverstärkung. Oder, anders gesagt: ein Gewohnheitsverstärker \u0026#x1f601;.\nVon stumpfer Regel zu echtem Kontext # Die klassische Smart-Home-Automation funktioniert nach dem Schema: Wenn Zustand A, dann Aktion B. Wenn Bewegung im Flur, dann Licht an. Wenn Tür geöffnet, dann Alarm deaktivieren. Praktisch, aber nicht intelligent. Diese Automationen denken nicht mit. Sie wissen nichts über meine Absicht, meinen Tagesplan oder meine Stimmung.\nIch habe mich gefragt: Was wäre, wenn Automatisierungen nicht nur Zustände, sondern auch meine Routinen, Ziele oder Gewohnheiten berücksichtigen würden? Was, wenn Technik nicht einfach ausführt, sondern hilft?\nDaraus entstand eine neue Idee. Ich wollte mein Setup nicht mehr nur um Geräte herum bauen, sondern um uns.\nGewohnheit statt Reaktion # Eine der stärksten Anwendungen für mich war, Automatisierungen nicht mehr nur als Reaktionen auf Umweltveränderungen zu sehen, sondern als Verstärker meiner Gewohnheiten. Damit das gelingt, musst du dich selbst und deine Gewohnheiten sehr genau beobachten.\nBeispiel: der sanfte Start in den Tag # Ich bin ein absoluter Frühaufsteher und schätze strukturierte Morgenroutine. Einfach nur ruhig wach werden, ein bis zwei Kaffee trinken und dann fokussiert in den Tag starten.\nHier hilft mir Home Assistant mit einer Automatisierung:\nNach dem Aufstehen werden Bewegungen außerhalb des Schlafzimmers registriert, wodurch der Zustand Schlafen: aus eintritt. Die Kaffeemaschine wird eingeschaltet und ist betriebsbereit. Sobald ich in meinem Büro Platz genommen habe, werden mir von Alexa die morgendlichen Meetings vorgelesen, während ich mich einlogge. Trigger: Wir verlassen das Schlafzimmer und bewegen uns in der Wohnung mindestens fünf Minuten. Falls diese Abfolge nicht zutreffen sollte, können wir auch \u0026ldquo;Alexa, guten Morgen\u0026rdquo; sagen.\nBeispiel: entspannt ins Bett gehen # Beim Schlafengehen ist es genau dasselbe, nur wird die Wohnung in den Nachtmodus versetzt und bereitet dafür alles vor.\nIm Flur, Treppenhaus und Arbeitszimmer wird der Weg ins Schlafzimmer erleuchtet auf 10%, blaue und lila Farbtöne. Wenn wir ins Bett gehen, versetzt das Smart Home die Wohnung in den Zustand Schlafen: laufend. Alle Lichter schalten sich ab, die Heizung fährt runter. Wenn wir eingeschlafen sind, wird die Wohnung in den Zustand Schlafen: an versetzt. Energiehungrige Geräte werden abgeschaltet, der Alarm wird aktiviert. Trigger: Wir schalten den Fernseher ab, verlassen das Wohnzimmer und betreten den Flur. Falls diese Abfolge nicht zutreffen sollte, können wir auch \u0026ldquo;Alexa, gute Nacht\u0026rdquo; sagen.\nBeispiel: der Pre-Sports-Trigger # Ich laufe regelmäßig, weil es mir hilft, den Kopf frei zu bekommen und fit zu bleiben. Bei schlechten Witterungsbedingungen oder im Winter laufe ich vor allem zu Hause auf meinem Laufband.\nAuch hierbei unterstützt mich Home Assistant mit einer kleinen Automatisierung:\nDie Steckdose vom Laufband wird aktiviert und somit das Gerät eingeschaltet. Der Raum wird während des Workouts laufend auf Helligkeit überprüft, und ggf. wird die Beleuchtung so eingeschaltet, dass es sonnig wirkt. Auf Spotify wird eine Playlist gestartet, die ich extra für das Laufband kuratiert habe - rhythmische Musik als Taktgeber. Direkt über die AirPods. Trigger: Ich muss eine Minute vor oder auf dem Laufband stehen. Diese Zeit nutze ich, um mich zu dehnen und einen Schluck zu trinken.\nAutomation ≠ Faulheit # In vielen Diskussionen rund um Smart Home und Automatisierungen schwingt bei Gesprächspartnern (insbesondere Freunde, Verwandte) oftmals ein Missverständnis mit: Dass ich faul wäre. Man könne schließlich immer einmal schnell zum Lichtschalter gehen und diesen betätigen.\nIch sehe das anders und genau darum geht es mir auch gar nicht. Stell dir eine gute Automatisierung einfach wie einen Coach vor, der nicht laut schreit, sondern zur richtigen Zeit am Rand steht und kurz zunickt.\nEs geht mir nicht um maximalen Support. Ich will keinen Haushalt, der gänzlich ohne mein Zutun funktioniert. Ich will einen Haushalt, der mich unterstützt – still, zuverlässig, respektvoll.\nStolpersteine und Grenzen # Natürlich läuft nicht alles rund. Ich habe viele Automationen zigmal bearbeitet oder auch wieder gelöscht:\nWeil sie in unnatürlichen Situationen ausgelöst wurden. Weil das Verbinden mit einer Gewohnheit in der Praxis nicht gut funktioniert hat. Weil sie technisch zwar clever waren, aber sich nicht gut angefühlt haben. Ein Beispiel: eine Routine, die das Licht im Schlafzimmer beim Aufwachen automatisch als Sonnenaufgang steuern sollte. Klingt harmlos, führte aber regelmäßig dazu, dass beim Schlafen in unerwünschten Situationen das Licht anging. Denn es ist gar nicht so leicht, durch Sensorik herauszufinden, wann wir denn nun wirklich aufstehen wollen. Unsere iPhone-Wecker mit der Automatisierung zu koppeln, klappte leider nur sehr sporadisch - denn häufig stehen wir ohne Wecker auf. Effekt: Frust, nicht Hilfe.\nWas ich gelernt habe: Automatisierung muss Fehler verzeihen können. Sie braucht Kontext. Und sie muss uns dienen – nicht ihrer eigenen technischen Eleganz.\nWas ich darüber hinaus gelernt habe: immer gute Ausreden für die Frau auf Lager haben, wenn ein Fehlerfall eintritt. Stichwort: Women Acceptance Factor \u0026#x1f604;.\nWarum das alles? # Automatisierungen sind für mich kein Ersatz für Motivation – aber eine Unterstützung für meine Absicht. Sie sind wie Geländer: nicht zwingend nötig, aber hilfreich, wenn man müde ist.\nGerade das Studieren der eigenen Gewohnheiten, um diese dann mit Technik zu unterstützen, begeistert mich. Es ist sehr zeitaufwendig und man entwickelt nicht jeden Tag etwas Neues, vielmehr ist es der langfristige Feinschliff, der das insgesamt zu einer spannenden Herausforderung macht.\nFazit # Home Assistant ist für mich nicht einfach nur ein Smart-Home-System, sondern ein Werkzeug für ein noch besseres Zuhause. Es hilft mir nicht nur, meine Geräte zu steuern, sondern meine Gewohnheiten sanft zu bestärken.\nEs ist ein stiller Begleiter, der mich an gute Routinen erinnert, mir den Beginn eines Trainings angenehmer macht und mir morgens hilft, in den Tag zu finden.\nNicht mehr. Aber auch nicht weniger.\nDas Titel-/Hintergrundbild stammt von Nubelson Fernandes auf Unsplash .","image":"https://tbsch.de/post/2025-05-25-smart-home-als-gewohnheitsverst%C3%A4rker/featured.webp"},{"id":"https://tbsch.de/post/2025-01-21-weniger-gute-vors%C3%A4tze-mehr-greifbare-ziele/","url":"https://tbsch.de/post/2025-01-21-weniger-gute-vors%C3%A4tze-mehr-greifbare-ziele/","title":"Weniger gute Vorsätze, mehr greifbare Ziele","summary":"Meine Meinung zu guten Vorsätzen\u0026hellip; und ein paar Worte zum Thema Motivation.","date_published":"2025-01-21T00:00:00Z","date_modified":"2025-01-21T00:00:00Z","tags":["meinung","bericht","gewohnheit"],"content_text":"Gerade befinde ich mich wieder einmal auf Geschäftsreise, der Arbeitstag ist überstanden und ich genieße die restlichen Stunden des Tages bei einem kühlen Cocktail und klassischer Musik an der Bar. Warum also nicht einfach ein bisschen schreiben \u0026#x1f604;? Glücklicherweise sind die Tage überstanden, an denen einem jeder ein gutes neues Jahr wünscht und man doch in diesem Jahr seine Ziele und guten Vorsätze erreichen möge. Ja, es ist unser Brauch und die Arbeitskollegen, Freunde und Familienmitglieder meinen es sicher gut. Dennoch halte ich nicht viel davon und mag das gar nicht.\nDie guten Vorsätze # In meinem Umfeld gibt es sehr viele Menschen, die sich für jedes Neujahr eine Reihe von Self-Optimizing-Maßnahmen oder große Ziele aufbürden, nur um kurz darauf wieder damit zu brechen. Die Gewohnheit ist eben doch so bequem und kuschelig warm-gemütlich.\nIch möchte mich davon nicht ausnehmen, habe ich mich doch selbst lange genug in diesem Hamsterrad mitgedreht. Vor 15 Jahren fasste ich dann den Entschluss, von guten Vorsätzen auf Abstand zu gehen und einfach immer und ständig an meinen Zielen zu arbeiten. Es ist sehr viel einfacher, seine Ziele auch wirklich zu erreichen, wenn man stetig mit kleinen Schritten voran kommt, als sich den Jahreswechsel für einen kompletten Sinneswandel zum Anlass zu nehmen.\nErfüllung im Job # Lange hatte ich überhaupt keine Vorstellung davon, was ich später einmal arbeiten möchte oder was mir Spaß machen könnte. Natürlich war aber die Liste von Dingen, die ich auf keinen Fall tun wollte, sehr lang \u0026#x1f601;. Das machte es mir anfangs schwer, den richtigen Kurs einzuschlagen. Also probierte ich mich durch Einzelhandel und Gastronomie, öffentlichen Dienst und privatwirtschaftliche Verwaltung, Anwendungsentwicklung und IT-Systemintegration, Personalwesen und Controlling, sowie letztendlich Kundenservice für Großunternehmen (Call Center) durch.\nDass ich letztendlich wieder genau in der IT gelandet bin, obwohl ich mein Hobby niemals zum Beruf machen wollte, ist tatsächlich ein Zufall gewesen. Meine Stärken lagen schon immer in der Datenextraktion, -transformation und -analyse, sowie dem Ziehen von Schlüssen aus den gewonnenen Erkenntnissen und dem Ableiten konkreter Maßnahmen. Das war mein Berufsalltag im Controlling, allerdings mit einfachen Bordmitteln. Nennen wir sie Excel, und ich war so etwas wie der Schöpfer der Excel-Tapeten des Grauens - so nannte sie zumindest mein damaliger Chef \u0026#x1f604;. Jedoch kam genau diese Tätigkeit immer mehr in Mode, neue Tools und ganze Berufsfelder im Datenbereich entstanden. So konnte ich einen Nutzen aus meinem Wissensvorsprung ziehen und formte das Data Management im Unternehmen federführend mit. Aus heutiger Sicht würde ich genau diesen Moment als größten beruflichen Wegbereiter in meinem Leben bezeichnen.\nMittlerweile ist es meine Aufgabe, Daten nicht einfach nur zu verstehen, sondern durch ihre Wertschöpfung in die Lage versetzt zu werden, das Unternehmen langfristig effizienter zu machen. Das bedeutet nicht zwangsläufig Personalkosten einzusparen, sondern den Arbeitsalltag meiner Kollegen zu verbessern und ihnen die Möglichkeit zu geben, ihre Arbeitszeit mit wirklich wichtigen Dingen zu verbringen. Davon profitieren am Ende alle: Unternehmen, Kollegen und Kunden. Das ist oft kräftezehrend und anstrengend, aber ich liebe jede einzelne Sekunde meines Berufs und freue mich nach Feierabend schon auf den nächsten Tag. Und das ist, was wirklich zählt, oder?\nBewegen, bewegen, bewegen! # Ich möchte gestehen: Ich bin ein Nerd. Das war ich schon immer und werde es vermutlich auch bleiben. Und ich liebe Essen – vor allem ungesund und in großen Mengen \u0026#x1f601;. Perfekte Kombination, oder? Kein Wunder also, dass Kleidergröße M für mich nie gereicht hat. Der erste Schritt, um seine Ziele zu erreichen, ist, einen Missstand zu erkennen und zu überlegen, wie man ihn ändern kann. Die Antwort in meinem Fall ist simpel, wenn auch unbeliebt: Sport machen. Wie bereits erwähnt, bedeutet das, Gewohnheiten zu ändern – und genau das fällt uns Menschen besonders schwer.\nDoch genau hier sah ich eine Gelegenheit, meine beruflichen Skills einzusetzen: Wenn ich Unternehmen verbessern kann, dann sollte das auch mit meinem Bauch ja schließlich gleichermaßen funktionieren. Da es kaum verwertbare Daten zu meinem Verhalten gab, begann ich, mich selbst zu beobachten. Dabei stellte ich fest, dass meine innere Stimme mir ständig Gründe einflüsterte, warum ich keinen Sport machen könnte. Faszinierend, funktioniert aber leider extrem effizient. Also musste ich lernen, jeden dieser Einwände zu entkräften.\nEin paar Beispiele:\nGrund Konter Du wirst schwitzen. Schweiß ist ekelhaft, nass und klebt. Jeder Tropfen steht für maximalen Erfolg! Du wirst keine Luft bekommen. Zwei Wochen durchhalten, dann die Leistung langsam steigern. Andere Menschen werden über dich lachen. Vielleicht. Aber kenne ich die? Also egal. Ins Fitnessstudio gehen kostet zu viel Zeit. Stimmt. Also trainiere ich zuhause und im Freien. Deine Freunde zahlen für das Gym, gehen aber nicht hin. Stimmt auch, das mache ich besser. Niemand wird mitmachen und dich unterstützen. Diejenigen bleiben dann eben unfit und erfolglos, ich nicht. Wenn es regnet oder kalt ist, ist Laufen doch blöd. Absolut, deshalb habe ich mir ein Laufband für Zuhause zugelegt. Du kannst dann nicht mehr essen, was du willst. Ich mache keine Diät, sondern Sport. Und ich esse dabei einfach weiter, was ich will, dann nehme ich eben langsamer ab. Diese Liste könnte ich endlos weiterführen – unser Gehirn ist unglaublich kreativ, wenn es darum geht, Ausreden zu finden. Doch worauf es wirklich ankommt, ist die Erkenntnis, dass man jedes negative Gefühl in etwas Positives verwandeln kann. Man muss es nur wollen. Und dann? Einfach in die Laufschuhe steigen, Musik auf die Ohren und loslaufen. Diese Zeit gehört nur dir, du bist frei und kannst das Leben (und idealerweise auch das Handy) einfach mal auf Standby setzen.\nSchon nach kurzer Zeit – bei mir war es nach dem dritten oder vierten Training – wirst du merken, dass dein Körper die Bewegung regelrecht aufsaugt und mehr davon will. Plötzlich geht dir nach einem Kilometer bei 5 km/h nicht mehr die Puste aus. Kein Seitenstechen, keine Erschöpfung, die dir die Beine wegklappen lässt. Und nach vier Wochen ertappst du dich dabei, von einem sechs Kilometer langen Lauf bei 6,5 km/h zurückzukehren und dich nicht zerstört, sondern richtig gut zu fühlen. Also steigerst du dich weiter.\nUnd weißt du, was das Beste ist? Nicht, dass du nicht mehr so schnell außer Atem kommst. Nicht, dass die Waage jede Woche ein niedrigeres Gewicht anzeigt. Sondern wenn deine Freunde dich plötzlich auf deine Fortschritte ansprechen und dir Komplimente machen. Wenn sie zugeben, dass sie dachten, du würdest genauso schnell aufgeben wie alle anderen Quatschköpfe, die nur reden und nichts tun. Und das Gefühl, wenn Klamotten wieder passen, die du schon ganz unten im Schrank verstaut hattest \u0026#x1f601;.\nDas ist keine Fantasie – ich habe mit Lauftraining insgesamt über 55 Kilo abgenommen. Die dafür benötigte Zeit war vermutlich viel geringer, als du dir gerade vorstellst. In unter zwei Jahren habe ich täglich etwa 45-90 Minuten investiert – je nachdem, wie es in meinen Alltag passte. Lass einfach mal TikTok weg, dann hast du die Zeit locker. Der Schlüssel zum Erfolg? Kontinuität, nicht Diät. Ich esse, was ich will, so viel ich will – und wenn es mal zu viel war, laufe ich einfach eine Extrameile. Essen ist für mich Lebensfreude, und das lasse ich mir nicht nehmen.\nMein Tipp an dich: Bleib einfach am Ball, baue das Training in deinen Tagesablauf ein, entdecke den Spaß daran und konzentriere dich dabei nur auf dich selbst. Der Rest kommt von allein!\nHeißer Tipp für Python Devs # Abschließend möchte ich noch einen heißen Tipp loswerden, der insbesondere die Python-Devs und Data Analysten unter euch erfreuen könnte. Falls du dich noch mit Jupyter Notebooks abmühst oder gemeinsam mit deinem Software Architekten überlegst, wie ihr ein Jupyter Notebook sauber als Task ausführen lassen könntet: lasst es einfach. Ja, ich meine es wirklich ernst.\nNutzt die Zeit stattdessen effizient und werft einen Blick auf marimo . Ich hatte das Projekt bereits länger im Visier, weil ich Jupyter einfach nur leid war. Nun setzen wir das im Unternehmen für erste Notebooks ein und sind mit dieser Entscheidung richtig glücklich. Da werden noch viele weitere Notebooks dazukommen.\nRichte deinen Dank gern per Mail an mich \u0026#x1f604;.\nDas Titel-/Hintergrundbild stammt von mir, Silvester 2024/2025","image":"https://tbsch.de/post/2025-01-21-weniger-gute-vors%C3%A4tze-mehr-greifbare-ziele/featured.webp"},{"id":"https://tbsch.de/post/2024-09-25-aktivierung-von-home-assistant-szenen-verfolgen-part-2/","url":"https://tbsch.de/post/2024-09-25-aktivierung-von-home-assistant-szenen-verfolgen-part-2/","title":"Aktivierung von Home Assistant Szenen verfolgen - Part 2","summary":"Aktivieren und Deaktivieren von Szenen laufend mit einem Sensor verfolgen.","date_published":"2024-09-25T00:00:00Z","date_modified":"2024-09-25T00:00:00Z","tags":["smart-home","guide","home-assistant","licht","sensor","szene","trigger"],"content_text":"Im vorherigen Part habe ich die Lichtszenen und deren Aktivierung beschrieben. Diesmal möchte ich tiefer in das Konzept des Trigger-basierten Template Sensors eintauchen und zeigen, wie dieser verwendet werden kann, um komplexere Szenarien in Home Assistant zu handhaben.\nStand der Dinge # Rufen wir uns doch noch einmal eine verkürzte Version meines Sensors in Erinnerung:\n- trigger: - platform: homeassistant event: start - platform: event event_type: call_service event_data: domain: scene service: turn_on action: - variables: history: \u0026gt; {{ ... }} sensor: - name: scene_history_wohnzimmer unique_id: sensor_scene_history_wohnzimmer state: \u0026gt; {{ state_attr(history.wohnzimmer[0], \u0026#34;name\u0026#34;) }} attributes: current: \u0026#34;{{ history.wohnzimmer[0] }}\u0026#34; history: \u0026#34;{{ history.wohnzimmer[1:] }}\u0026#34; # ... weitere Räume einfügen Bei jedem Start von Home Assistant sowie jeder Aktivierung einer Szene wird die Aktualisierung des Trigger-basierten Template Sensors ausgelöst. Zuerst werden die Actions abgearbeitet, die in meinem Fall die Variable history mit Daten für alle Räume füllen. Danach werden die Sensor-Konfigurationen nacheinander ausgeführt.\ngraph LR A[/Trigger/] --\u003e B(Actions ausführen) --\u003e C[Sensoren aktualisieren] Während also der scene_history_wohnzimmer Sensor aktualisiert wird, steht die history Variable bereits mit allen Werten für das Wohnzimmer zur Verfügung. Diese Tatsache müssen wir im Kopf behalten, wenn wir solche Sensoren bauen. Das gilt natürlich auch für die Sensoren aller weiteren Räume, die wir an unseren Trigger anheften.\nUnd hier liegt ein kleines Detail versteckt: sobald die history Variable nach Auslösen des Triggers für alle Räume befüllt wird, kann sie nämlich die Sensordaten aller Räume aktualisieren - quasi in einem Durchlauf. Ja, so werden auch die Sensoren der Räume aktualisiert, in denen gerade keine Szene aktiviert wurde. Das werden wir aber später noch brauchen \u0026#x1f601;.\nHerausforderung # Wir haben es im ersten Part erfolgreich geschafft, dass der Name der zuletzt aktivierten Szene im Scene-History-Sensor gespeichert wird. Konkret stand der Sensor auf Essen und verhinderte somit, dass während des Essens die Wohnzimmer-Beleuchtung gedimmt wird, wenn jemand den Fernseher einschaltet.\nDoch was passiert nun, wenn das Licht zwischenzeitlich ausgeschaltet wird? Du ahnst es vermutlich schon: Nichts. Die letzte Szene Essen wird so lange beibehalten, bis eine andere Szene im Wohnzimmer aktiviert wird. Und hier endet die Geschichte auch schon. Dies wird in anderen Situationen dafür sorgen, dass Automatisierungen eine Szene vermuten und entsprechend reagieren, obwohl sie mittlerweile gar nicht mehr aktiv sein könnte.\nUm dieses Problem zu lösen, erweitern wir nun unseren Scene-History-Sensor um weitere Trigger und Attribute.\nErweiterung des Sensors # Wir fügen einen weiteren Trigger, ein neues Attribut und ein Makro1 hinzu.\nTrigger # Ich teile den Triggern nun auch Trigger-IDs zu, um innerhalb des Trigger-basierten Template Sensors prüfen zu können, durch welches Ereignis er eigentlich aktualisiert wird. Entitäten wie light.wohnzimmer_lights gibt es bei mir für jeden Raum, sie gruppieren sämtliche Lampen innerhalb eines Raumes. Das ermöglicht mir die extrem bequeme Abfrage des Beleuchtungsstatus, oder eben alle Lichter gleichzeitig auszuschalten.\n- trigger: - platform: homeassistant event: start - platform: event event_type: call_service event_data: domain: scene service: turn_on id: scene_activated # das ist neu # und ein neuer Trigger - platform: state entity_id: - light.wohnzimmer_lights from: \u0026#34;on\u0026#34; to: \u0026#34;off\u0026#34; id: off_again # ... Attribut # Statten wir den Scene-History-Sensor im Wohnzimmer nun mit dem Attribut aus, welches in Zukunft die Information vorhält, ob das Licht nach dem Aktivieren einer Szene wieder ausgeschaltet wurde.\n# ... - name: scene_history_wohnzimmer unique_id: sensor_scene_history_wohnzimmer state: \u0026gt; {{ state_attr(history.wohnzimmer[0], \u0026#34;name\u0026#34;) }} attributes: current: \u0026#34;{{ history.wohnzimmer[0] }}\u0026#34; history: \u0026#34;{{ history.wohnzimmer[1:] }}\u0026#34; # das kommt dazu off_again: \u0026gt; {% from \u0026#34;scenes.jinja\u0026#34; import get_off_again %} {{ get_off_again(\u0026#34;wohnzimmer\u0026#34;, trigger) }} Ich habe mich für den Namen off_again entschieden. Das Template des Attributs importiert ein Makro und führt es dann aus. Damit ich das Template der Funktion get_off_again auch für andere Räume benutzen kann, ohne es immer wieder kopieren zu müssen, habe ich es in eben jenem Makro ausgelagert. Das ist übrigens der übliche Use-Case für Makros, falls du dich schon mal gefragt hast, wozu die eigentlich gut sein sollen \u0026#x1f601;.\nAn das Makro übergebe ich den gewünschten Raum und das gesamte trigger Objekt, welches von Home Assistant zur Verfügung gestellt wird. In diesem Objekt enthalten ist auch die Information, welcher Trigger ausgelöst wurde.\nTip An dieser Stelle machen wir uns die Tatsache zu Nutze, dass beim Auslösen eines Triggers immer State und Attribute des Trigger-basierten Template Sensors aktualisiert werden. Das musst du dir stets im Hinterkopf behalten, denn auch unser Makro ist darauf ausgelegt.\nMakro # Um eigene Makros zu verwenden, erstelle im config-Ordner deiner Home Assistant Installation den Unterordner custom_templates. Hier legst du deine .jinja-Dateien ab. Ich habe mich für den Dateinamen scenes.jinja entschieden, einfach weil ich es vorteilhaft finde, Informationen thematisch zu strukturieren.\nDie Datei hat folgenden Inhalt:\n{% macro get_off_again(area, trigger) %} {# eine Szene wurde aktiviert #} {% if trigger.id == \u0026#34;scene_activated\u0026#34; %} {% set areas = trigger.event.data.service_data.entity_id | map(\u0026#34;area_id\u0026#34;) | list %} {% if area in areas %} {% set return = \u0026#34;no\u0026#34; %} {% endif %} {# Lampen wurden ausgeschaltet #} {% elif trigger.id == \u0026#34;off_again\u0026#34; %} {% set areas = [area_id(trigger.entity_id)] %} {% if area in areas %} {% set return = \u0026#34;yes\u0026#34; %} {% endif %} {% endif %} {# Nichts von beidem #} {% if return is not defined %} {% set return = state_attr(\u0026#34;sensor.scene_history_\u0026#34; + area, \u0026#34;off_again\u0026#34;) %} {% endif %} {{ return }} {% endmacro %} Erläuterungen # Das Makro wird mit zwei Parametern aufgerufen. Dies ist einerseits area, die in meinem Beispiel ja auf wohnzimmer gesetzt ist. Andererseits das trigger Objekt von Home Assistant.\nWird eine Szene aktiviert, soll überprüft werden, ob die ausgelöste Szene im wohnzimmer ist. Falls ja, wird off_again auf no gesetzt. Dieselbe Logik wende ich an, wenn Lampen ausgeschaltet werden. Es wird überprüft, ob es sich um den gewünschten Raum handelt und falls ja, off_again auf yes gesetzt. Du hast richtig gemerkt: wir haben einen Schalter im klassischen Sinne gebaut, der entweder an oder aus ist. Macht bis hierher Sinn, oder?\nFür den Fall, dass weder die aktivierte Szene, noch die ausgeschaltete Lampe aus dem wohnzimmer sind, wird einfach der aktuell eingestellte Wert übernommen. Warum das notwendig ist? Ich habe dir weiter oben einen brennenden Tipp dazu gegeben \u0026#x1f60e;.\nIm letzten Schritt wird der Wert der Variable return nun zurückgegeben und in der Folge als off_again Attribut festgelegt.\nAbschlussarbeiten # Der Scene-History-Sensor kann nun nicht nur erfolgreich die zuletzt aktivierte Szene anzeigen, sondern stellt darüber hinaus auch ein Attribut bereit mit der Information, ob das Licht seit Aktivierung einer Szene wieder abgeschaltet wurde. Damit kann die in Part 1 aufgebaute Automatisierung nicht nur feststellen, ob die Szene Essen im Wohnzimmer zuletzt aktiviert wurde, sondern auch, ob das Licht seither wieder ausgeschaltet worden ist.\nSobald der Fernseher im Wohnzimmer eingeschaltet wird, überprüft die für das Dimmen verantwortliche Automatisierung in Zukunft nicht nur, ob der Scene-History-Sensor auf Essen steht, sondern auch, ob das Licht seither wieder abgeschaltet wurde.\n- condition: not conditions: - condition: state entity_id: sensor.scene_history_wohnzimmer state: Essen - condition: state entity_id: sensor.scene_history_wohnzimmer attribute: off_again state: \u0026#34;yes\u0026#34; Jetzt wird die Automatisierung wirklich zuverlässig laufen und das Licht nur im vorgesehenen Moment dimmen \u0026#x1f601;. Wenn du bessere Ideen zu einer möglichen Umsetzung hast, schreib mir gern. Mein Ziel war die Vermeidung der Erstellung von unzähligen Helfern.\nNote Der Trigger-basierte Template Sensor ist von mir so designt, dass einfach weitere Räume hinzugefügt werden können, ohne den ganzen Code immer wieder schreiben zu müssen. Das war auch notwendig, da ich die Scene-History in sechs verschiedenen Räumen verwende.\nIn einem der nächsten Beiträge zu Home Assistant werde ich darüber berichten, wie ich mit Hilfe der Local calendar , To-do list und Roborock Integrations einen interaktiven Reinigungsplan erstellt habe.\nDas Titel-/Hintergrundbild stammt von Bilal Mansuri auf Unsplash .\nSeit der Version 2023.4 unterstützt Home Assistant die Erstellung und Wiederverwendung eigener Makros, siehe hier .\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-09-25-aktivierung-von-home-assistant-szenen-verfolgen-part-2/featured.webp"},{"id":"https://tbsch.de/post/2024-09-16-aktivierung-von-home-assistant-szenen-verfolgen-part-1/","url":"https://tbsch.de/post/2024-09-16-aktivierung-von-home-assistant-szenen-verfolgen-part-1/","title":"Aktivierung von Home Assistant Szenen verfolgen - Part 1","summary":"Die Aktivierung von Szenen laufend mit einem Sensor verfolgen.","date_published":"2024-09-16T00:00:00Z","date_modified":"2024-09-16T00:00:00Z","tags":["smart-home","guide","home-assistant","licht","sensor","szene"],"content_text":"Es gibt zahlreiche Smart Home Apps, die für nahezu jedes Gerät eine eigene Steuerung bereitstellen. In den meisten dieser Apps lassen sich mittlerweile individuelle Szenen erstellen, mit denen du für eine Gruppe von Geräten einen bestimmten Zustand festlegen kannst, den sie bei Aktivierung automatisch einnehmen. Szenen sind für viele Menschen vermutlich unnötiger Ballast, weil sie damit nichts anfangen können oder wollen. Und dann gibt es da zum Beispiel mich, der sie insbesondere für die heimische Beleuchtung exzessiv einsetzt.\nWenn es um Licht geht, gibt es aus meiner Sicht keinen Weg an Philips Hue vorbei:\nDie Leuchtmittel sind hochwertig. Ich habe seit über 7 Jahren noch Glühbirnen aus der ersten Generation im Einsatz. Die Steuerung in Home Assistant1 funktioniert perfekt. Philips Hue funkt mit ZigBee. Kein Cloudzwang2, alles wird lokal gesteuert. Verwendet man die originale Hue Bridge vom Hersteller, kann man die Philips Hue App benutzen und hat hierüber Zugriff auf die Lichtszenen-Galerie. Diese Szenen sehen einfach nur klasse aus. Note Philips Hue erfüllt sämtliche Voraussetzungen für ein Markenprodukt, neben dem guten Namen haben die Leuchtmittel nämlich auch einen stolzen Preis. Im Ausgleich hierfür machen sie jedoch verglichen zu anderen Herstellern sehr viel richtig.\nHome Assistant Szenen # Wenn du zur Steuerung deines smarten Zuhauses Home Assistant einsetzt, ist dir sicher bereits aufgefallen, dass du hier ebenfalls Szenen kreieren kannst. Falls du das noch nicht entdeckt hast, kannst du über den folgenden Link direkt zu den Einstellungen gelangen \u0026#x1f60e;.\nDas Tolle an Szenen ist, dass du dir beliebig viele Snapshots deiner Geräte erstellen und immer wieder aufrufen kannst. Der Nachteil von Szenen ist, dass sie stateless sind, also keinen eigenen Zustand besitzen. Es ist zum Beispiel nicht möglich zu überprüfen, welche Szene gerade in einem Moment ausgeführt wird, um beispielsweise in Abhängigkeit dessen in bestimmten Situationen anders reagieren zu können.\nEs wird Zeit für ein praxisnahes Beispiel.\nAusflug ins Wohnzimmer # In unserem Wohnzimmer wird zur Abenddämmerung das Licht automatisch eingeschaltet. In kalten Jahreszeiten nehmen die Lampen darüber hinaus warme Farbtöne an, um einen Ausgleich zum rauen Wetter zu schaffen. Lampen können so viel mehr als nur Licht erzeugen: sie nehmen positiv Einfluss auf unsere Stimmung.\nSchalten wir nun unseren Fernseher ein, wird das Licht gedimmt, damit eine noch gemütlichere Atmosphäre entsteht. Für all diese Umstände habe ich unterschiedliche Szenen gebaut, welche darüber hinaus täglich wechseln. Das klingt bisher recht unkompliziert, oder?\nWer regelmäßig an Smart Home Automatisierungen bastelt, wird mir jedoch sofort zustimmen, wenn ich behaupte: alltägliche Abläufe sind alles andere als einfach. Sie können extrem komplex sein. Vor allem, wenn Automatisierungen den Bedürfnissen von mehreren Menschen gleichzeitig gerecht werden sollen (Stichwort: Women Acceptance Factor3). Du wirst dieses Wort in meinen Smart Home Beiträgen noch öfter lesen.\nEssen wir beispielsweise zu Abend, soll das Wohnzimmer (welches auch unseren Esstisch beherbergt) hell erleuchtet werden, also die Szene Essen aktiviert werden. Und nun kann es vorkommen, dass der Fernseher eingeschaltet wird. Du hast ja bereits gelesen, was in unserem Fall dann passiert: Das Licht wird gedimmt, und wir essen plötzlich im Dunkeln.\nEs erfordert im weiteren Verlauf eine manuelle Kurskorrektur durch uns, und das kann nerven: vor allem meine Frau. Und dann dauert es nicht mehr lange, bis ich genervt bin; du verstehst sicher. Mein Anspruch an Heimautomatisierung ist, dass sie intelligent genug agiert, um manuelle Interventionen überflüssig zu machen. Das steigert außerdem den WAF enorm - happy wife, happy life \u0026#x1f604;.\nAutomatisierungen zur Intelligenz verhelfen # Smart Home Automatisierungen machen dein Zuhause smarter, aber es ist wichtig, realistisch zu bleiben: sie sind nicht wirklich intelligent. Sie lösen unter bestimmten Umständen einfach nur eine Aktion aus, selbst wenn es lediglich bedeutet, jeden Tag um 18 Uhr das Licht einzuschalten – das macht häufig gar keinen Sinn. Und während der Essenszeit das Licht zu dimmen, nur weil der Fernseher eingeschaltet wird, ist eben weder smart noch intelligent. Das ist ehrlich gesagt ziemlich dumm.\nAlso müssen wir hier ein bisschen nachhelfen. Wie eingangs erwähnt, sind Szenen stateless: Du weißt also weder, ob eine Szene gegenwärtig aktiv ist, noch um welche es sich dabei handelt. Für mich ist es auch keine Option, alle Lampen einzeln auf bestimmte Farben oder Helligkeit zu überprüfen und zu schauen, ob die Parameter zu irgendeiner Szene passen. Denn meine Szenen sind kunterbunt, verwenden alle möglichen Helligkeitsstufen und sind daher schlichtweg nicht oder eben nur mit höllischem Aufwand nachverfolgbar.\nWie schön wäre es, wenn Home Assistant eine Funktion mitbringen würde, die uns hier unterstützen könnte? Normalerweise leite ich mit so einem Satz nun die zündende Lösung ein, in diesem Fall gibt es aber wirklich nichts. Zumindest fast nichts. Es gibt Trigger-basierte Template Sensors4! Die lösen zwar das eigentliche Problem nicht, jedoch lässt sich mit ihnen etwas bauen, was grundsätzlich intelligentere Entscheidungen möglich machen kann.\nMein Lösungsweg # Nachdem wir nun die Herausforderung erörtert haben, möchte ich meine Lösung vorstellen. Hast du ein ähnliches Problem selbst lösen wollen und einen anderen Weg eingeschlagen? Lass es mich wissen, ich freue mich von dir zu hören!\nWarning Die folgenden Passagen setzen voraus, dass du dich zumindest etwas mit Home Assistant Automatisierungen und Templates auskennst. Ohne Basiswissen werden sie nur schwer zu greifen sein. Ich versuche natürlich trotzdem, alles etwas zu veranschaulichen und die Thematik verständlicher zu gestalten. Dennoch ist das eine komplexe Sache.\nBeobachtungen # Um eine Herausforderung lösen zu können, müssen wir zunächst beobachten, wie das System in bestimmten Situationen reagiert.\nFast alle Automatisierungen schalten bei mir keine Lampen direkt ein. Sie aktivieren Szenen, in denen die eigentlichen Beleuchtungseinstellungen definiert sind. Also musste ich herausfinden, was in Home Assistant passiert, wenn eine Szene aktiviert wird. Hierbei habe ich beobachtet, dass die Szenen-Entität selbst das Aktivierungsdatum als Zustand einnimmt. Das ist hilfreich, denn mit Zustandsänderungen können wiederum Aktionen ausgelöst werden \u0026#x1f601;.\nIch habe allerdings sehr viele Szenen gebaut und müsste jede davon als Trigger-Bedingung verwenden. Würdest du nach dem Erstellen jeder neuen Szene daran denken, deinen Trigger anzupassen? Sehr gut! Ich jedoch leider nicht, daher ist das für mich kein gangbarer Weg. Und auf sämtliche Zustandsänderungen zu triggern, nur um dann überprüfen zu können, ob es sich dabei um eine Szene handelt, ist für mich ebenso keine gescheite Lösung. Zu viel Overhead.\nStatt aktiv auf die Aktivierung einer Szene zu warten, habe ich mir in der Folge angesehen, wie eine Szene denn eigentlich aktiviert wird: über die Aktion scene.turn_on. Und genau hier habe ich angesetzt, indem ich sämtliche Aufrufe dieser Aktion mitverfolge.\nTrigger-basierter Template Sensor # Ausgestattet mit diesem Wissen habe ich einen Trigger implementiert, der je einen Scene-History5-Sensor im Arbeits- und Wohnzimmer updaten soll. Das passiert im Detail, wenn eine Szene aktiviert wird:\nDie Aktion scene.turn_on wird verwendet Die Variable history wird deklariert Für Arbeits- und Wohnzimmer werden alle Szenen\u0026hellip; abgefragt nach Last-Changed-Datum absteigend sortiert Die jeweiligen Zustände der Sensoren auf den Namen der Szene gesetzt Die Attribute current und history befüllt - trigger: - platform: homeassistant event: start - platform: event event_type: call_service event_data: domain: scene service: turn_on action: - variables: history: \u0026gt; {% set areas = [ \u0026#34;arbeitszimmer\u0026#34;, \u0026#34;wohnzimmer\u0026#34; ] %} {% set data = namespace(scenes=[]) %} {% for area in areas %} {% set scenes = area_entities(area) | select(\u0026#34;search\u0026#34;, \u0026#34;^scene.\u0026#34;) | expand | sort(attribute=\u0026#34;last_changed\u0026#34;, reverse=true) | map(attribute=\u0026#34;entity_id\u0026#34;) | list %} {% set data.scenes = data.scenes + [scenes] %} {% endfor %} {{ dict(zip(areas, data.scenes)) }} sensor: - name: scene_history_arbeitszimmer unique_id: sensor_scene_history_arbeitszimmer state: \u0026gt; {{ state_attr(history.arbeitszimmer[0], \u0026#34;name\u0026#34;) }} attributes: current: \u0026#34;{{ history.arbeitszimmer[0] }}\u0026#34; history: \u0026#34;{{ history.arbeitszimmer[1:] }}\u0026#34; - name: scene_history_wohnzimmer unique_id: sensor_scene_history_wohnzimmer state: \u0026gt; {{ state_attr(history.wohnzimmer[0], \u0026#34;name\u0026#34;) }} attributes: current: \u0026#34;{{ history.wohnzimmer[0] }}\u0026#34; history: \u0026#34;{{ history.wohnzimmer[1:] }}\u0026#34; Ist ganz schön viel Template-Code geworden. Der Vorteil hierbei ist jedoch, dass nun mit vergleichsweise wenigen Zeilen weitere Räume hinzugefügt werden können. Man muss sich einfach nur alles schönreden können \u0026#x1f601;.\nErläuterungen # Der Teil, der die history Variable mit Daten füllt, ist vermutlich am schwierigsten zu verstehen. Falls du nicht so tief in den technischen Details steckst, keine Sorge: wir gehen das jetzt Zeile für Zeile noch einmal durch.\n{% set areas = [ \u0026#34;arbeitszimmer\u0026#34;, \u0026#34;wohnzimmer\u0026#34; ] %} {% set data = namespace(scenes=[]) %} An dieser Stelle werden die Räume (Areas) definiert, für die ich die Szenen abrufen möchte. Danach wird noch ein Namespace für den darauffolgenden Code reserviert.\n{% for area in areas %} Für alle Räume wiederholen\u0026hellip;\n{% set scenes = area_entities(area) | select(\u0026#34;search\u0026#34;, \u0026#34;^scene.\u0026#34;) | expand | sort(attribute=\u0026#34;last_changed\u0026#34;, reverse=true) | map(attribute=\u0026#34;entity_id\u0026#34;) | list %} In diesem Befehl liegt die eigentliche Magie. Die Funktion area_entities gibt dir alle Entitäten zurück, die einem bestimmten Raum zugeordnet sind. Diese Liste kann sehr lang werden, weswegen wir mit select nur nach Entitäten suchen, die eine Szene verkörpern. Mit Hilfe von expand werden die Entitäten-Objekte quasi ausgepackt, wir erhalten dadurch Zugriff auf ihre einzelnen Attribute, um mit sort absteigend nach den letzten Änderungen zu sortieren. Da ich mich dazu entschieden habe, in den Sensoren nur die Entitäten-IDs zu speichern, verwerfen wir alle anderen Attribute mit dem map Befehl. Schlussendlich speichern wir mit list alle Ergebnisse als Liste.\n{% set data.scenes = data.scenes + [scenes] %} Speichert die lokale scenes Variable in unserem Namespace.\n{% endfor %} {{ dict(zip(areas, data.scenes)) }} Die Schleife ist an dieser Stelle durchgelaufen, wir verpacken die Ergebnisse nun in einem Dictionary, welches zugleich den Inhalt der history Variable bildet.\nErgebnis # Hier ist ein Beispiel, wie die fertig modellierten Daten meines Sensors für das Wohnzimmer am Ende aussehen:\nstate: Essen attributes: current: scene.wohnzimmer_essen history: - scene.wohnzimmer_tv_2 - scene.wohnzimmer_abend_4 - scene.wohnzimmer_hell - scene.wohnzimmer_abend_2 - scene.wohnzimmer_abend_3 - scene.wohnzimmer_gedimmt - scene.wohnzimmer_tv_1 - scene.wohnzimmer_konzentrieren - ... Tip Diese Umsetzung muss man erst einmal sacken lassen. Darum möchte ich dir zum Verschnaufen kurz den Hinweis geben, dass Home Assistant mit einem tollen Tool ausgeliefert wird: den Entwicklerwerkzeugen. Gerade beim Bauen von Templates empfiehlt es sich, diese Werkzeuge rege zu nutzen; hier kann alles ausprobiert werden. Auch mein obiger Code \u0026#x1f604;. Natürlich musst du ihn an deine Bedingungen anpassen, wie Raumnamen.\nAbschlussarbeiten # Nachdem wir die Template-Entitäten in den Einstellungen neu geladen haben, stehen die beiden Scene-History-Sensoren direkt bereit und werden getriggert, sobald Szenen in den jeweiligen Räumen aktiviert werden. Prima!\nSobald der Fernseher im Wohnzimmer eingeschaltet wird, überprüft die für das Dimmen verantwortliche Automatisierung in Zukunft, ob die Scene-History auf Essen steht. Und wenn ja, wird das Licht einfach nicht gedimmt \u0026#x1f60e;.\n- condition: not conditions: - condition: state entity_id: sensor.scene_history_wohnzimmer state: Essen Dann kann ja in Zukunft der Haussegen nicht mehr schief hängen! Oder? Doch was, wenn das Licht ausgeschaltet wird? Bleibt die Scene-History dann auf Essen stehen und sorgt das nicht wiederum in der Folge für weiteren Ärger?\nIm nächsten Part zeige ich dir, wie du deinen neuen Trigger-basierten Template Sensor dazu bringst, auch auf ausgeschaltete Lampen zu reagieren.\nDas Titel-/Hintergrundbild stammt von Bilal Mansuri auf Unsplash .\nHome Assistant ist eine Open-Source-Plattform zur zentralen Steuerung und Automatisierung von Smart Home-Geräten. Sie ermöglicht benutzerdefinierte Automatisierungen und unterstützt zahlreiche Geräte, ohne auf Cloud-Dienste angewiesen zu sein.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nViele Hersteller von Smart Home Geräten setzen auf ihre eigenen Cloud Services. Man kann nur mutmaßen, warum eine Internetverbindung für ihren Betrieb benötigt wird; Fakt ist jedoch, dass einige Geräte ohne funktionierende Internetverbindung ihren Dienst verweigern (bspw. die Roborock Saugroboter von Xiaomi). Darum ist Cloudzwang keine gute Sache.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nWomen Acceptance Factor (WAF) beschreibt scherzhaft den Grad, in dem technische Lösungen, insbesondere im Smart Home-Bereich, von Frauen akzeptiert werden. Er wird oft genutzt, um auszudrücken, wie gut eine technische Implementierung im Alltag ankommt und ob sie praktisch, einfach und ästhetisch ansprechend genug ist.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nSchau doch einmal in die Home Assistant Dokumentation rein, denn die Template Sensors werden hier sehr gut erklärt.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nMir ist kein besserer Name als Scene-History-Sensor eingefallen. Schlimmer noch ist die deutsche Übersetzung im Home Assistant UI: Szenenhistorie \u0026#x1f922;. Wenn du wohlklingendere Ideen hast, freue ich mich über deinen Hinweis.\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-09-16-aktivierung-von-home-assistant-szenen-verfolgen-part-1/featured.webp"},{"id":"https://tbsch.de/post/2024-08-28-paperless-guide-customization/","url":"https://tbsch.de/post/2024-08-28-paperless-guide-customization/","title":"Paperless Guide: Customization","summary":"Das papierlose Büro mit Scripting monitoren und verbessern.","date_published":"2024-08-28T00:00:00Z","date_modified":"2024-08-28T00:00:00Z","tags":["home-lab","guide","paperless","python","workflow"],"content_text":"Nachdem ich meine grundlegende Arbeitsweise mit Paperless-ngx nun detailliert vorgestellt habe, möchte ich noch etwas Content für die richtigen Nerds unter uns abliefern. Auf der Seite über Klassifizierungen habe ich ein paar Mal von einer Middleware gesprochen. Eigentlich trifft es das Wort gar nicht richtig, da es in Paperless-ngx derzeit keine Möglichkeiten gibt, eigene Programmabläufe während der Laufzeit des Systems einzubringen. Und komm mir jetzt nicht mit den neuen Workflows\u0026hellip; das Feature hätte Potenzial, wenn\u0026hellip; ach\u0026hellip; lassen wir das fürs Erste.\nDunkelverarbeitung # Na, kennst du das Wort? Gerade im Büro einer größeren Firma werden wir häufig mit diesem Begriff konfrontiert. Es bezeichnet die automatisierte Erledigung wiederkehrender Aufgaben, ohne dass ein Mensch darauf Einfluss nehmen muss. In deinem papierlosen Büro wirst du dich sicher auch immer wieder selbst dabei ertappen, die immer und immer selben Tätigkeiten zu erledigen. Haha, habe ich dich ertappt \u0026#x1f60e;?\nEigentlich bringt Paperless-ngx schon viele tolle Möglichkeiten mit, wie zum Beispiel die Auto-Klassifizierung. Wenn es jedoch an die Details geht, müssen wir immer wieder selbst nacharbeiten.\nEin Beispiel # Wenn ich meine allmonatlichen Kontoauszüge an Paperless-ngx übergebe, sollen sie immer eine Kombination aus Jahr und Monat im Titel tragen: 2024/03. Und zwar nicht des Monats, in dem das Dokument erstellt oder vom Document Consumer konsumiert wurde, sondern für den Monat, für den der Kontoauszug schlichtweg ist. Ganz einfach.\nDas System generiert keine passenden Titel für meine Kontoauszüge, und manuelle Anpassungen sind oft umständlich, besonders wenn Dokumente über das Share Sheet vom iPhone hochgeladen werden. Und mal im Ernst: möchtest du bei jedem Dokument wirklich noch darüber nachdenken, den Titel anzupassen? Versuche es ruhig. Das klappt sicher anfangs noch gut \u0026#x1f601;. Auf der Zeitachse führt es zu Inkonsistenzen in der Benennung deiner Dokumente.\nPaperless Secretary # Aus diesem und anderen Gründen erstellte ich für Paperless-ngx ein Python-Modul namens pypaperless, welches die API anspricht und einem Entwickler die Möglichkeit gibt, Einfluss auf sein DMS zu nehmen.\nDieses Modul bildet die Grundlage für mein Projekt Paperless Secretary, also einen virtuellen Sekretär, der wiederkehrende Aufgaben für mich erledigt. Meine Aufgabe besteht darin, diese wiederkehrenden Aufgaben zu identifizieren und entsprechende Bearbeitungsregeln zu erstellen.\nWarning Bitte beachte, dass ich den Secretary zur Zeit nicht öffentlich zur Verfügung stellen kann. Es handelt sich hierbei um eine experimentelle Software in Python, die insbesondere meinen Bedarf abdeckt und bei dir möglicherweise gar nicht funktioniert, schlimmstenfalls deine Daten in Paperless-ngx durcheinanderbringen könnte.\nRegel für Kontoauszüge # Kommen wir auf mein oben genanntes Beispiel zurück, welches ich wie folgt gelöst habe:\n\u0026#34;\u0026#34;\u0026#34;N26; Kontoauszüge; Titel bearbeiten.\u0026#34;\u0026#34;\u0026#34; import re from pypaperless.models import Document from .base import Rule from .const import CORRESPONDENT_N26, DOCUMENT_TYPE_KONTOAUSZUG # 1) _rule = Rule(\u0026#34;N26; Kontoauszüge; Titel =\u0026gt; yyyy/MM (Sparkonto)\u0026#34;) # 2) @_rule.condition(name=\u0026#34;correspondent == N26\u0026#34;) async def check_correspondent(item: Document) -\u0026gt; bool: return item.correspondent == CORRESPONDENT_N26 # 3) @_rule.condition(name=\u0026#34;document_type == Kontoauszug\u0026#34;) async def check_document_type(item: Document) -\u0026gt; bool: return item.document_type == DOCUMENT_TYPE_KONTOAUSZUG # 4) @_rule.condition(name=\u0026#34;title !~ yyyy/MM\u0026#34;) async def check_document(item: Document) -\u0026gt; bool: content = item.content or \u0026#34;\u0026#34; if \u0026#34;Sparkonto\u0026#34; in content: pattern = r\u0026#34;^\\d{4}/(0[1-9]|1[0-2])\\sSparkonto*$\u0026#34; else: pattern = r\u0026#34;^\\d{4}/(0[1-9]|1[0-2])*$\u0026#34; return not bool(re.match(pattern, item.title)) # 5) @_rule.action(name=\u0026#34;Apply new document title.\u0026#34;) async def apply_title(*, rule: Rule, item: Document) -\u0026gt; bool: content = item.content or \u0026#34;\u0026#34; match = re.search(r\u0026#34;\\d{2}\\.(\\d{2})\\.(\\d{4}) bis \\d{2}\\.\\1\\.\\2\u0026#34;, content) if match: year = match.group(2) month = match.group(1) item.title = f\u0026#34;{year}/{month}\u0026#34; if \u0026#34;Sparkonto\u0026#34; in content: item.title += \u0026#34; Sparkonto\u0026#34; # 6) if not rule.dry_run: return await item.update() return False Keine Sorge, sieht schlimmer aus, als es wirklich ist \u0026#x1f604;. Ich habe ein paar Stellen im Code nummeriert und gehe nun einmal kurz darauf ein.\nEs wird eine neue Rule erstellt. Hierbei handelt es sich um eine Klasse, die zum Core des Secretary gehört. Der Secretary verarbeitet solche Regeln dann, indem er sie auf Dokumente in Paperless-ngx anwendet. Der Regel wird eine Condition angeheftet. Das bedeutet, dass die Regel nur ausgeführt wird, wenn die Bedingung erfüllt wird. Konkret prüft sie also, ob das Dokument von meiner Bank ist. Wieder eine Condition. Diesmal wird überprüft, ob das Dokument ein Kontoauszug ist. Die letzte Condition überprüft, ob der Kontoauszug einen Titel in dem Format yyyy/MM oder yyyy/MM Sparkonto hat, so wie ich mir das wünsche. Besser gesagt: ob genau dieser Fall hier nicht zutrifft. Jetzt wird die Action implementiert. Das ist die Aktion, die ausgeführt wird, wenn alle Bedingungen zutreffen. Im Dokument-Inhalt ist bei meiner Bank ein Hinweis enthalten, ob der Kontoauszug für mein Girokonto oder Tagesgeldkonto ist. Deswegen überprüft die Aktion das kurz und bildet dann aus dem Inhalt des Dokuments den korrekten Titel. Wenn der Secretary gerade nicht im Testmodus ausgeführt wird, wird der neue Titel dann letztendlich in Paperless-ngx festgelegt. Bei der Klasse Document handelt es sich um ein Objekt von pypaperless. Dieses Objekt stellt nicht nur sämtliche Daten aus Paperless-ngx bereit, sondern auch Funktionen zum Ändern und Löschen von eben solchen Daten.\nWeitere Use-Cases # Es gibt zahlreiche Anwendungsmöglichkeiten für diese Regeln. In meinem Fall haben sich folgende Use-Cases herauskristallisiert:\nTitel von Dokumenten anpassen Custom Fields von Dokumenten automatisch befüllen Reminder für Wiedervorlagen/Todos Verschiedene Validierungen Ich bin gespannt, welche Herausforderungen du mit diesen Regeln angehen würdest. Teile mir gerne deine Ideen mit!\nDas Titel-/Hintergrundbild stammt von Chris Ried auf Unsplash .","image":"https://tbsch.de/post/2024-08-28-paperless-guide-customization/featured.webp"},{"id":"https://tbsch.de/post/2024-08-20-eigener-strom-mit-balkonkraftwerk/","url":"https://tbsch.de/post/2024-08-20-eigener-strom-mit-balkonkraftwerk/","title":"Eigener Strom mit Balkonkraftwerk","summary":"Selbst Strom erzeugen und dabei Geld sparen? Ein kleiner Einblick.","date_published":"2024-08-20T00:00:00Z","date_modified":"2024-08-20T00:00:00Z","tags":["smart-home","solar","energie","home-assistant"],"content_text":" Selbst Strom erzeugen und dabei Geld sparen? Ein kleiner Einblick. Du hast sicher schon davon gehört: Seit der Energiekrise 2022 sind Solaranlagen und Balkonkraftwerke in aller Munde. Diese Situation hat uns allen vor Augen geführt, wie abhängig wir von Stromanbietern und dem gesamten System1 sind. Der Strommarkt in unserem Land ist nicht nur extrem unübersichtlich. Vergleichsportale wie Check24 und Verivox tragen meiner Meinung nach sogar noch zur Verwirrung bei, indem sie die Preise für Verbraucher verzerren.\nIn meinem Umfeld begannen plötzlich viele Freunde, Kollegen und Bekannte, Solaranlagen auf ihren Dächern zu installieren und eigenen Strom zu produzieren. Dadurch begann auch ich, mich mit dem Thema auseinanderzusetzen, obwohl ich anfangs skeptisch war. Da ich kein eigenes Haus besitzen möchte und lieber in einer schönen Wohnung lebe, ist es für mich nicht sinnvoll, eine Solaranlage auf dem Dach zu installieren. Daher kam für mich nur ein Balkonkraftwerk infrage.\nWas ist ein Balkonkraftwerk2? # Kurz gesagt: Es sind Solaranlagen, genau wie jene, die du auf den Hausdächern überall sehen kannst. Sie sind einfach kleiner dimensioniert und daher mit weniger Solarmodulen ausgestattet. In der Regel bestehen Balkonkraftwerke aus einem bis sechs Solarmodulen, da aktuell maximal 800 Watt in den Stromkreis eingespeist werden dürfen. Ein großer Vorteil gegenüber Solaranlagen auf Dächern ist, dass Balkonkraftwerke, wie der Name schon sagt, meist am Balkongeländer befestigt werden \u0026#x1f601;. Alternativ kann man sie auch auf den Balkon stellen, im Garten platzieren oder an der Hausfassade anbringen. Letztendlich steckt man sie dann einfach in eine Steckdose. Das macht sie unglaublich flexibel einsetzbar und steigert die Akzeptanz bei Vermietern.\nGanz simpel formuliert: Ein Balkonkraftwerk besteht aus den Solarmodulen, die Sonnenenergie in Gleichstrom umwandeln, und einem Wechselrichter, der den Gleichstrom in Wechselstrom umwandelt und dann über eine Steckdose in den eigenen Stromkreis einspeist. Wer mag und den Platz dafür hat, stellt sich noch einen Batteriespeicher dazu. Dazu in einem späteren Beitrag mehr.\nMeine Anlage # Das nahezu unüberschaubare Angebot an Balkonkraftwerken hat mich zunächst überwältigt, daher habe ich genau überlegt, welche Anlage am besten zu meiner Situation passt. Mein Balkon bietet leider keine idealen Bedingungen für die Anbringung von Solarmodulen, da sich an der Außenseite Halterungen für Blumenkästen befinden. Ein 20kg schweres Solarmodul hätte ich hier niemals aufhängen können. Nach langer Recherche fand ich dann sogenannte Ultraleicht-Module, die 3kg pro Stück wiegen, aber auch ein Quäntchen weniger leisten.\nAußerdem habe ich mir überlegt, was ich mit meinem Balkonkraftwerk erreichen will. Mit einer kleinen Anlage erreicht man zwar keine vollständige Autarkie, aber zumindest möchte ich damit die Grundlast und kleinere Peaks meines Haushalts decken.\nLetztendlich habe ich mich dann hierfür entschieden:\nPlugin Energy PiE AIR superLIGHT 780W COMBO Wechselrichter: Hoymiles HM-600/700/800-2T Selbstgebastelte Aufhängung für Neigungswinkel (und damit mehr Effizienz) 2 Module nach Südost, 2 Module nach Südwest Ja, du siehst richtig. Diese Ultraleicht-Module lassen sich etwas biegen, was dann perfekt zu meiner Situation passte. Da sie aber sehr wenig Gewicht haben (3kg pro Modul), musste ich meine Konstruktion verstärkt gegen Wind und Sturm absichern. Kann man auf dem Bild nicht richtig erkennen, aber da rührt sich bei einem Windstoß nichts mehr.\nUnd was bringt es nun? # Plugin Energy bewirbt meine Anlage mit einer jährlichen Kostenersparnis von bis zu 235 €. Ich kann also erst in etwa einem Jahr sagen, ob die Jungs und Mädels gut in Mathe sind \u0026#x1f601;.\nWerfen wir einen Blick auf meine anfangs schleppende Entwicklung: Zunächst habe ich mit meiner Anlage deutlich weniger Strom erzeugt, da ich alle vier Module nach Südwesten ausgerichtet hatte (bis zu 1,5 kWh am Tag). Nach vier Wochen baute ich noch einmal um, sodass ich je 2 Module nach Südost/Südwest ausgerichtet habe (bis zu 2 kWh am Tag). Drei Monate später dann konstruierte ich mir eine Aufhängung, die einen zur Sonne gerichteten Neigungswinkel ermöglicht, mit dem Ergebnis, dass ich den Ertrag massiv steigern konnte (3,5 kWh am Tag war bisher das Maximum, leider war zumeist schlechtes Wetter) \u0026#x1f60e;.\nMit Home Assistant überwache ich jederzeit Stromproduktion und -verbrauch in meinem Haushalt. Sehen wir uns doch einmal den heutigen, eher durchwachsenen und bewölkten Tag an:\nDas Balkonkraftwerk konnte 2,4 kWh Energie gewinnen, von denen ich 0,7 kWh an den Versorger verloren habe. Das passiert immer dann, wenn du mehr Strom erzeugst, als du gerade verbrauchst. Mangels Stromspeicher fließt der überschüssige Strom dann durch den Zähler ins öffentliche Netz. Gut, 0,7 kWh sind sicherlich verschwindend gering und das reicht nicht einmal zum Backen einer Pizza im Ofen. Setzt man das jedoch mit den produzierten 2,4 kWh ins Verhältnis, bedeutet es ganz einfach, dass ich rund 32 % an erzeugter Energie nicht selbst verbrauchen konnte und sie damit verschenkt habe.\nDem entgegen steht jedoch der Fakt, dass ich 24 % der Stromkosten für den heutigen Tag vermieden habe. Mit anderen Worten: ein Viertel gespart.\nIch möchte in Zukunft noch viele weitere Einblicke in das Leben mit einem Balkonkraftwerk und Home Assistant geben, vielleicht kann ich dir das Thema ja ebenfalls näherbringen! Home Assistant ist eine Open-Source-Software, die es dir ermöglicht, dein Smart Home zentral zu steuern und zu automatisieren. Mit Home Assistant kannst du verschiedene Geräte und Systeme in deinem Haushalt, wie Lampen, Thermostate, Kameras und eben auch dein Balkonkraftwerk, miteinander verknüpfen und über eine einzige App bedienen.\nWenn du Fragen hast, schreib mir gern.\nDas Titel-/Hintergrundbild stammt von Chelsea auf Unsplash .\nDie organisierte Strompreisbörse EEX, deutsche Energieproduzenten, Stromanbieter und Netzbetreiber inklusive irrwitziger Zuschläge, Steuern und Umlagen.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nDen Begriff Balkonkraftwerk verwende ich lediglich, weil jeder etwas damit anfangen kann. Ich bevorzuge die Bezeichnung Mini PV-Anlage oder kurz MPV.\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-08-20-eigener-strom-mit-balkonkraftwerk/featured.webp"},{"id":"https://tbsch.de/post/2024-05-31-smart-home-live-fakten/","url":"https://tbsch.de/post/2024-05-31-smart-home-live-fakten/","title":"Smart Home Live-Fakten","summary":"Eine neue kleine Seite zeigt Live-Fakten zu meiner Smart Home Installation an.","date_published":"2024-05-31T00:00:00Z","date_modified":"2024-05-31T00:00:00Z","tags":["news","cloudflare","webseite","workflow"],"content_text":"Unter diesem Link steht eine neue kleine Seite bereit, die Live-Fakten zu meiner Smart Home Installation präsentiert. Die Daten werden von einem Key/Value Store abgerufen, der über einen Workflow ca. alle 5 Minuten mit den aktuellen Daten versorgt wird. Darüber hinaus kannst du dir angucken, aus welchen Komponenten mein Setup besteht (mit ein paar schamlosen Verlinkungen) \u0026#x1f601;.\nWarum? # Mir ging es dabei weniger um das Präsentieren irgendwelcher Fakten, sondern um die Lösung einer Herausforderung, die ich auch immer wieder im Beruf habe: Wie zur Hölle mache ich Daten abrufbar, die in einem isolierten Bereich liegen? In diesem Fall sprechen wir über die Smart Home Installation innerhalb meines Heimnetzwerkes, die von Inbound-Traffic aus dem Internet, aber auch vor unautorisiertem Traffic innerhalb des Netzwerkes, abgeschirmt ist.\nDie Lösung: Das Smart Home muss die Daten selbst bereitstellen. Auf einer statischen Webseite ohne Datenbanken. Ja, genau\u0026hellip; aber ich habe es nach ein bisschen Grübeln letztendlich hinbekommen \u0026#x1f60e;!\nDas Titel-/Hintergrundbild stammt von BENCE BOROS auf Unsplash .","image":"https://tbsch.de/post/2024-05-31-smart-home-live-fakten/featured.webp"},{"id":"https://tbsch.de/post/2024-02-25-paperless-guide-iphone/","url":"https://tbsch.de/post/2024-02-25-paperless-guide-iphone/","title":"Paperless Guide: Papierlos mit iPhone","summary":"iPhones bereichern unser Leben, auch im privaten Büro sind sie wertvoll.","date_published":"2024-02-25T00:00:00Z","date_modified":"2025-11-30T00:00:00Z","tags":["home-lab","guide","paperless"],"content_text":" Failure Ich werde hier nur über Apple-Produkte berichten. Wenn du sie nicht magst, ist das für mich völlig in Ordnung. Lies einfach nicht weiter. Woran ich nicht interessiert bin, sind Hinweise, warum Apple nicht gut ist oder dass Android ja viel besser sei. Spar dir die Zeit und langweile uns beide damit einfach nicht. Danke \u0026#x1f60e;.\nDas Smartphone als Werkzeug # Wir haben annähernd alle ein Smartphone in der Tasche und ich persönlich habe zu Social Media und Mobile Games eine Meinung. Die ist gar nicht gut, sparen wir das also besser aus. In meinen Augen wäre es einfach eine Verschwendung, das Smartphone nur für so etwas zu nutzen: denn das ist alles, aber nicht smart.\nÜberlege mal. Du hast einen Computer in der Tasche, der mit einigen Laptops konkurrieren kann. Er hat sämtliche Verbindungsmöglichkeiten an Bord, eine Kamera, Sensorik und kann, mit den richtigen Apps ausgestattet, richtig viel Arbeit richtig schnell erledigen. Das ist ein Schweizer Taschenmesser ohne Schneidwerkzeug, aber vielleicht sind Smartphones in Zukunft ja mit einem schneidfähigen Laser ausgestattet. Wenn ich es mir recht überlege: nein, lieber nicht \u0026#x1f601;.\nMotivation # Alle Pflichten des Lebens haben eine Gemeinsamkeit, da spielt es auch gar keine Rolle, ob es der Papierkram oder regelmäßiges Sporttreiben ist: du machst keine Freudensprünge, wenn du sie erledigen musst. Ich bin ein Mensch, der gern alle äußeren Umstände abwägt, die mich davon abhalten könnten, etwas zu tun - um sie dann als Ausreden zu nutzen.\nHeute ist Regen angesagt? Oh, wie schade, dann kann ich wohl keine Jogging-Tour machen.\nKommt dir bekannt vor? \u0026#x1f606;\nKommen wir zurück zu unserem Papierkram. Eine mögliche Barriere war in meinem Fall die Tatsache, dass ich eine Abneigung gegenüber Druckern/Multifunktionsgeräten in meinem Haushalt habe. Die Vorstellung, mit meinem Drucker andauernd irgendwelche Post einscannen zu müssen, hat mich genervt. Ich finde Drucker und insbesondere ihre Software völlig unintuitiv und veraltet, obendrein gibt es Bloatware und Tracker von den Herstellern ohne Ende. Nein danke. Da spielt es auch keine Rolle, ob Canon, HP, Epson oder sonst etwas draufsteht. Es wäre doch schön, wenn mein iPhone bloß vernünftig scannen könnte\u0026hellip; wie war das mit dem Schweizer Taschenmesser?\nDigitales Handwerk # Natürlich hat ein iPhone eine ausgefeilte Scanner-Funktion direkt an Bord, aber Genius Scan ist einfach besser. Ich habe absichtlich ein altes Firmenlogo auf dem Papier sichtbar gelassen, da es das Unternehmen eh nicht mehr gibt - auch hier siehst du den qualitativen Unterschied extrem deutlich. Achte doch mal genau auf das Firmenlogo: auf dem zweiten Bild ist der Schriftzug annähernd kerzengerade, obwohl ich das Blatt absichtlich zerknickt habe.\nBeide Aufnahmen entstanden im Schwarzweiß-Modus beim Scannen.\nInfo Über Geschmackssinn lässt sich nicht streiten. Mir gefällt das zweite Ergebnis besser, da Genius Scan vielfältige Methoden zur Aufbereitung des Scan-Ergebnisses einsetzt. Dicke schwarze Balken am Rand verschwinden, Schrift und Logo sind klar und es führt Begradigungen in hohem Maße aus.\nDokumente teilen # Nun sind wir an einem Punkt angelangt, an dem jedes Dokument digital verfügbar ist: egal ob ein Postbrief, ein E-Mail-Anhang oder App-Download. Nun geht es wieder ausschließlich um meine persönlichen Erfahrungen. Es ist daher möglich, dass du meine Schmerzpunkte gar nicht als solche wahrnimmst und gänzlich anderer Meinung bist. Teile sie gern mit mir \u0026#x1f601;!\nFTP und WebDAV # In den Beschreibungen zum Workflow sagte ich, dass deine Aufgabe darin besteht, Paperless-ngx mit Dokumenten zu füttern. Für mich war von Anfang an klar, dass ich nicht jede Datei einzeln hochladen möchte. Das soll automatisch passieren.\nGenius Scan bringt diverse automatische Exportmöglichkeiten mit, sodass eingescannte Dokumente direkt an den Consumption-Ordner übermittelt werden können. Eine Zeit lang löste ich das über FTP und später WebDAV. Ich machte mich allerdings von den Verbindungsmöglichkeiten von Genius Scan abhängig und ertappte mich eines Tages dabei, wie ich ankommende E-Mails über das Share Sheet mit Genius Scan teilte, damit die App das Dokument an den Consumption-Ordner überstellen konnte. Das war mir nicht smart genug, weil ich nicht nur einen vermeidbaren Umweg über Genius Scan gehen, sondern auch einen FTP- bzw. WebDAV-Server betreiben musste.\nEine zusätzliche Herausforderung war, dass ich in meiner Paperless-ngx Installation die Dokumente von zwei Personen verwalte. Ich brauchte also auch noch Mandantenfähigkeit bei der Bereitstellung - damals gab es Workflows noch nicht.\nShortcuts # Wie schön wäre es, wenn ich ein Dokument direkt mit Paperless-ngx teilen könnte, so wie wir das von Messengern beim Foto-Sharing gewöhnt sind? Und wie geil wäre es, wenn ich gleichzeitig noch festlegen könnte, für welche Person das Dokument bestimmt ist? Genau hier kommen Shortcuts auf Apple-Geräten ins Spiel. Die kann man nämlich komplett an seine Bedürfnisse anpassen.\nKurzerhand habe ich einen Shortcut mit diesem Flow erstellt:\nEingabe über Share Sheet: Bilder, PDFs, Text, Formatierter Text Abfrage, für welche Person das Dokument bestimmt ist Aufruf des REST API Endpunktes zum Erstellen neuer Dokumente Übermittlung aller geteilten Dokumente Diesen Shortcut habe ich dann noch im Share Sheet als Favoriten hinterlegt, sodass er nun an prominenter Stelle mit dem Finger ansteuerbar ist:\nDownload # Interessiert? Ich teile den Shortcut gern mit dir über iCloud. Konfigurieren musst du ihn lediglich mit deiner Paperless-ngx-URL und einem Wörterbuch bestehend aus Name/API-Token Paaren. Du kannst mehrere Personen mit ihren jeweiligen Tokens angeben.\nhttps://www.icloud.com/shortcuts/96b126eb7e6f4111b382dbd7011798f4 Abgeheftete Dokumente öffnen # Ich spreche immer davon, Dokumente zu digitalisieren und in Paperless-ngx zu archivieren. Manchmal möchten oder müssen wir jedoch Dokumente auch im Original aufbewahren. In einem Profi-Tipp über dieser Überschrift erwähnte ich kurz, dass du einen mit ASN kodierten QR Code mit dem iPhone scannen kannst, um das Dokument direkt in Paperless-ngx zu öffnen.\nShortcuts # Natürlich gibt es auch hierfür einen Shortcut \u0026#x1f60e; von mir. Der muss lediglich mit der URL deiner Paperless-ngx-Instanz konfiguriert werden, das war es schon.\nDownload # https://www.icloud.com/shortcuts/b217abe228ff4428bb65f5205653e205 Das Titel-/Hintergrundbild stammt von Oliur auf Unsplash .","image":"https://tbsch.de/post/2024-02-25-paperless-guide-iphone/featured.webp"},{"id":"https://tbsch.de/post/2024-02-18-paperless-guide-workflow/","url":"https://tbsch.de/post/2024-02-18-paperless-guide-workflow/","title":"Paperless Guide: Workflow","summary":"Briefe, Faxe, E-Mails und digitale Dokumente im Alltag meistern.","date_published":"2024-02-18T00:00:00Z","date_modified":"2024-02-18T00:00:00Z","tags":["home-lab","guide","paperless","workflow"],"content_text":"Nachdem wir auf den letzten Seiten unser gemeinsames Verständnis zum papierlosen Büro abgeglichen und geschärft haben, wird es Zeit, auf den stinknormalen Alltag zu sprechen zu kommen. Auch Paperless-ngx wird uns nicht zu Freudensprüngen verleiten, wenn es darum geht, sich um den Papierkram zu kümmern - auch wenn ich diese Illusion gern aufrecht erhalten hätte. Der Unterschied liegt schlicht und ergreifend darin, dass die vierteljährlichen Ich mache Ablage und räume meine Leitz-Ordner auf-Sonntage durch ein digitalisiertes Büro einfach wegfallen.\nAuch in der offiziellen Dokumentation findest du wertvolle Hinweise darauf, wie man Paperless-ngx nutzen könnte. Du wirst feststellen, dass meine Erläuterungen in einigen Punkten damit übereinstimmen. Nicht etwa weil ich abschreibe, sondern weil die Architektur der Software uns hier einen Weg bereits geebnet hat. Mit welcher Besohlung du diesen Weg gehst, kannst du dir selbst aussuchen - wie bisher auch, sprechen wir nun weiter über mein Schuhwerk.\nArbeitsablauf # Sehen wir uns einmal den typischen Ablauf mit Paperless-ngx an, wenn uns im Alltag neue Dokumente erreichen. Hierbei spielt es im Übrigen überhaupt keine Rolle, auf welchem Wege sie das tun; sei es per Post, per E-Mail, als Download aus einer App oder per Fa\u0026hellip; nein, das blöde Wort mit x am Ende ist keine Erwähnung wert \u0026#x1f921;.\nBarcodes und ASN1 # Dieses Thema spielt bereits beim Scannen eine größere Rolle, weshalb ich an dieser Stelle kurz darauf eingehen möchte.\nNote Barcodes und ASN sind komplett optional. Du musst das nicht benutzen, wenn du nicht möchtest. Es kann die Handhabung deines papierlosen Büros in einigen Situationen jedoch vereinfachen, weshalb es sich auf jeden Fall lohnt, einen Blick auf das Feature zu werfen.\nGrundsätzliches zu Barcodes # Paperless-ngx kommt mit einem eingebauten Barcode-Scanner, welcher zwei tolle Funktionen bereitstellt:\nSplitting: solltest du viele Dokumente auf einem Stapel haben und diesen auf einmal einscannen, können anhand von Trennblättern mit Barcode die einzelnen Dokumente erkannt werden. ASN Erkennung: Barcodes oder QR Codes können eine ASN1 kodiert bekommen, welche von Paperless-ngx erkannt und an das Dokument angefügt wird. Hier kannst du etwas über das Barcode-Feature von Paperless-ngx in der offiziellen Dokumentation nachlesen, und hier alles über ihre Konfiguration.\nWarum ich mit ASN arbeite # Paperless-ngx und Leitz-Ordner koexistieren in meinem papierlosen Büro, auch wenn das auf den ersten Blick ein Widerspruch ist. Ich arbeite nur mit den digitalen Abbildern meiner Dokumente, d.h. ich suche und finde sie im DMS, setze Todo-Tags und behalte meinen Posteingang im Blick. Im Leitz-Ordner lagern die Originale, die ich aufbewahren muss oder will. Den fasse ich ansonsten nur an, um weitere Dokumente einzulagern. Der Großteil der mich erreichenden Post wird nach dem Einscannen vernichtet. Diese Fakten machen für mich den eindeutigen Unterschied.\nASN sind ein kleiner Helfer, um mich bei meinem dualen System zu unterstützen. Ich sehe in Paperless-ngx auf einen Blick, dass ein Dokument als physisches Original existiert und auf den zweiten Blick, in welchem Leitz-Ordner es lagert. Sollte ich ein Original benötigen, kann ich direkt im richtigen Ordner auf die richtige Seite blättern, da die ASN mir verrät, wo im Ordner sich das Dokument befindet (oder zumindest befinden sollte \u0026#x1f601;). Beispiel gefällig?\nDas System bietet sehr charmante Suchmöglichkeiten nach Dokumenten mit ASN, und zeigt diese unter dem Dokumenten-Datum gleich an. Dass ein Dokument eine ASN hat, verrät mir, dass ein Original dazu existieren muss. Die ASN selbst verrät mir, wo das Dokument abgeheftet sein muss. Meine Leitz-Ordner sind beschriftet mit dem Nummernbereich der ASNs, die sie enthalten, z.B. 1000 - 1499. Innerhalb des Ordners sind die Dokumente nach ASN aufsteigend abgeheftet, d.h. Dokument 1499 finde ich ganz vorne, während die 1000 ganz hinten liegt. Einfach, oder?\nTip Es ist nicht nur möglich, vom digitalen Abbild auf ein Original zu schließen. Die abgehefteten Dokumente beklebe ich mit einem QR Code, in den die ASN kodiert ist. Scanne ich mit meinem iPhone diesen QR Code, öffnet sich Paperless-ngx im Browser und zeigt mir die digitale Version des Dokuments an. Dazu hier mehr.\nQR Codes erstellen # In den Erläuterungen zum Setup schrieb ich, dass Marvin Gaube einen großartigen Artikel verfasst hat. Hier erklärt er auch, wie man sich selbst QR Codes erstellen kann.\nEine kurze Zusammenfassung:\nDu benötigst L4731 Klebeetiketten , einen Drucker, ich nutze Canon PIXMA MG3650S , die zu druckenden QR Codes im 4731 Layout. Ein paar Beispiele habe ich hier, hier und hier für dich vorbereitet. Scannen # Wie über dem Schaubild am Anfang dieser Seite erwähnt, erreichen uns Dokumente mittlerweile über alle möglichen Kanäle. Ich präferiere natürlich den digitalen Weg, denn z.B. ein E-Mail-Anhang oder App-Download ist blitzschnell an Paperless-ngx übergeben. Hierfür musst du nicht einmal das Handy aus der Hand legen. Aus diesem Grund achte ich auch bei Vertragsabschluss mit Serviceanbietern darauf, dass diese schon selbst digital unterwegs sind. Eine monatliche Rechnung für den Internetanschluss per Post ist für mich ein absolutes Tabu. Das hat auch weniger politisch-motivierte grüne Gründe, es passt schlichtweg nicht zu meinem Lifestyle.\nGerade bei Behörden erfreut sich der Postweg allerdings nach wie vor größter Beliebtheit. In solchen Fällen musst du nach dem Öffnen des Briefs deinen Scanner bemühen. Hier empfiehlt sich ebenfalls das Smartphone, denn es gibt eine richtig gute Scanner-App in den App Stores: Genius Scan .\nInfo 2018 gab es die App als Vollversion für 8,99 EUR, heute bietet sie nur noch ein monatliches Abo an. Du benötigst das Abo nicht zwingend, denn in erster Linie willst du Dokumente scannen. Im Abo enthalten ist ein automatischer Export, auch möglich in Richtung Paperless-ngx. Als iPhone User bist du allerdings mit Shortcuts (Kurzbefehle App) gesegnet: nutze sie \u0026#x1f60e;. Dazu später mehr.\nKonsumieren # Die größte und umfangreichste Komponente von Paperless-ngx ist vermutlich der Document Consumer, er ist Herz und Gehirn des ganzen DMS. Und das geht auch gar nicht anders, denn er stellt sämtliche Funktionalitäten zur Dokumentenverarbeitung, OCR2, Fehlerbehandlung, Erkennung von Metainformationen, automatischer Klassifizierung und letztlich auch Archivierung bereit.\nDeine Aufgabe als Eigentümer eines papierlosen Büros ist es, den Document Consumer mit Dokumenten zu füttern. Hierfür werden eine Upload-Maske auf der Webseite, eine REST API, Abholen per IMAP (E-Mail) aus deinem E-Mail-Konto, ein spezieller Upload-Dateiordner und verschiedene Mobile Apps angeboten.\nEinsteiger: Upload-Dateiordner # Die wohl einfachste Möglichkeit ist, Dokumente direkt im Consumption-Ordner bereitzustellen. Dieser Ordner sollte im Netzwerk freigegeben sein, damit Anwender und Geräte darauf zugreifen können. Ein Netzwerk-Scanner könnte dann die eingescannten Seiten sogar direkt in diesem Ordner ablegen.\nÜber ein paar Einstellungen bietet Paperless-ngx außerdem die Möglichkeit, den Consumption-Ordner ein bisschen nach eigenen Vorlieben zu konfigurieren . In Kombination mit Verarbeitungsvorlagen können hierdurch sehr viele persönliche Use-Cases abgebildet werden, es sind fast keine Grenzen gesetzt.\nEinsteiger: Mobile Apps # Darüber hinaus kannst du dir eine App aus deinem App Store installieren, mit der du Dokumente bereitstellen kannst. Bedenke dabei aber, dass du dich hier von weiteren Drittanbietern abhängig machst. Das sind private Projekte und du läufst jederzeit Gefahr, dass sie nicht mehr weiterentwickelt werden - dieser Gefahr sehen wir uns bereits beim Einsatz von Paperless-ngx ausgesetzt3. Ein weiteres Risiko ist Monetarisierung, denn plötzlich könnte dich deine geliebte App ein wenig Geld kosten, damit du sie weiterhin wie gewohnt benutzen kannst.\nFalls du dir diese Projekte ansehen möchtest, folge diesem Link .\nFortgeschrittene: IMAP (E-Mail) # Weiterhin besteht die Möglichkeit, das eigene E-Mail-Konto völlig automatisiert nach Dokumenten scannen zu lassen. Hierfür stehen spezielle E-Mail-Regeln bereit, über die du beliebig komplexe Suchmuster festlegen kannst, um Dokumente aufzuspüren und abholen zu lassen.\nMeine persönliche Erfahrung ist, dass ich schlichtweg zu wenige Dokumente direkt als E-Mail oder im Anhang erhalte. In den letzten zwei Jahren haben viele meiner Vertragspartner auf App Downloads umgestellt und sehen von einer direkten Übermittlung per E-Mail ab. Aus diesem Grund ist das IMAP Feature für mich persönlich uninteressant geworden, davon abgesehen, dass ich ohnehin nur extrem ungern Zugriff auf mein iCloud-Konto gewähre.\nWarning Du musst deine Login-Daten zum E-Mail-Konto in Paperless-ngx hinterlegen und setzt es dadurch einem potenziellen Sicherheitsrisiko aus! Benutzt du dein papierloses Büro übers Internet von unterwegs? Dann lass die Finger von diesem Feature, wenn du dich nicht verdammt gut mit IT Security auskennst. Außerdem musst du darauf vertrauen, dass die Urheber von Paperless-ngx ausschließlich sichere Verfahren zur Authentifizierung am E-Mail-Konto einsetzen. Möchtest du das Risiko eingehen?\nProfis: REST API # Die meisten Anwender werden vermutlich auf den Einsatz der REST API verzichten, ich persönlich stelle jedes Dokument darüber bereit. Das liegt daran, dass ich alles mit dem iPhone oder am Mac erledige: vom Scannen bis zum Teilen mit Paperless-ngx über das Share Sheet. Leider kann ich nicht einschätzen, welche Möglichkeiten man hier als Android User hat, da ich zu lange von Android weg bin und mittlerweile überhaupt nicht mehr damit klarkomme. Ein paar Eindrücke gefällig?\nDu musst beim Thema Konsumieren den für dich praktikabelsten Weg selbst entdecken. Ich habe für mich entdeckt, dass ich die Arbeit einfach gern mit einem Gerät in der Hand erledige, welches ich eh andauernd in der Hand halte: iPhone. Vielleicht ist das ja auch für dich was?\nKlassifizieren # Nachdem dein Dokument konsumiert wurde, findest du es im Posteingang wieder. Hierbei handelt es sich nicht um einen klassischen Ordner, sondern eine dieser virtuellen Schubladen, von denen ich hier berichtet hatte. Damit das funktioniert, musst du einen Tag lediglich als Posteingangs-Tag konfigurieren. Nun kannst du das Dokument klassifizieren bzw. dir die Ergebnisse der automatischen Klassifizierung ansehen.\nEin erstes Ergebnis # Bereits ohne große Konfiguration meiner Entwickler-Installation und mit einem Test-Dokument, welches wirklich kaum verwertbares Material liefert, hat der Document Consumer diverse Informationen extrahieren können. Aus dem E-Mail-Header hat er z.B. das korrekte Datum ausgelesen, der Dateiname des konsumierten Dokuments wurde als Titel hinterlegt und der Posteingangs-Tag wurde angeheftet.\nInfo Ich habe Dateiname des konsumierten Dokuments im vorherigen Absatz absichtlich unterstrichen, da wir an dieser Stelle beachten müssen, dass ich diese E-Mail nicht per E-Mail-Konto-Abruf habe konsumieren lassen. Ich habe die E-Mail in der Druckansicht geöffnet, ein PDF erzeugt und in den Consumption-Ordner geworfen. Deshalb wurde der Dateiname als Titel des Dokuments gewählt, nicht der E-Mail-Betreff.\nAuto-Klassifizierung verbessern # Natürlich willst du nicht bei jedem Dokument die komplette Klassifizierung selbst vornehmen müssen. Wie auf der vorherigen Seite erläutert, hat jeder Korrespondent, Dokumenttyp, Tag und Speicherpfad die Option, Erkennungs-Algorithmen zu verwenden.\nIch habe beispielhaft zwei Zuweisungsmuster konfiguriert:\neinen Korrespondenten erstellt, der auf die Absenderadresse matcht der Dokumenttyp Rechnung matcht auf das Wort Rechnung im Text Nachdem ich das Test-Dokument nun aus Paperless-ngx gelöscht und nochmal konsumieren lassen habe, sieht das Ergebnis bereits so aus:\nSchlussfolgerung # Die kontinuierliche Verbesserung der Auto-Klassifizierung sollte ein integraler Bestandteil deiner regelmäßigen Arbeit mit Paperless-ngx werden. Wenn konsumierte Dokumente nicht automatisch so klassifiziert werden, wie du dir das vorstellst, lohnt sich auf jeden Fall ein Blick in die Einstellungen der Zuweisungsmuster. Dieser Prozess amortisiert sich auf der Zeitachse, da du weniger Zeit in die Verbesserung deiner Auto-Klassifizierung stecken wirst, als in die manuelle Klassifizierung oder Korrektur falscher Ergebnisse. Und denk daran: immer da, wo manuell gearbeitet wird, entstehen auch Fehler \u0026#x1f60e;.\nBereits beim Anlegen neuer Korrespondenten, Dokumenttypen, Tags und Speicherpfade empfiehlt es sich außerdem, dass du dir bereits Gedanken über die Auto-Klassifizierung machst.\nDas Titel-/Hintergrundbild stammt von Luca Bravo auf Unsplash .\nArchive Serial Number, bzw. eindeutige Seriennummer eines Dokuments in deinem Haushalt. Idealerweise fortlaufend.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nOptische Texterkennung, Wikipedia \u0026#160;\u0026#x21a9;\u0026#xfe0e;\nIch habe in der Einführung von Problemen mit paperless-ng geschrieben, siehe hier\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-02-18-paperless-guide-workflow/featured.webp"},{"id":"https://tbsch.de/post/2024-02-18-pypaperless-v3-erschienen/","url":"https://tbsch.de/post/2024-02-18-pypaperless-v3-erschienen/","title":"pypaperless v3 erschienen","summary":"Ich habe pypaperless v3 veröffentlicht.","date_published":"2024-02-18T00:00:00Z","date_modified":"2024-02-18T00:00:00Z","tags":["news","paperless","projekt","python"],"content_text":"Oha, schon wieder ein Major Update \u0026#x1f631;!\nNun, auf ein großes Refactoring sollte eigentlich nicht direkt wieder eins folgen. Nachdem ich in den letzten Monaten in Sachen Python aber sehr viel dazulernen konnte, war ich extrem unglücklich damit, wie pypaperless v2 sich entwickelt hat. Die Befehlsaufrufe fühlten sich falsch an, der Code war zu unstrukturiert - insgesamt war ich einfach unzufrieden mit dem Ergebnis.\nAlso habe ich mich kurzerhand entschieden, noch einmal komplett von vorne zu beginnen und den Code wieder gänzlich neu zu schreiben. Nun bin ich aber erst einmal zufrieden.\nVorerst \u0026#x1f604;! Spaß beiseite. Auf Basis von v3 möchte ich nun eine Home Assistant Integration entwickeln.\nViel Spaß mit pypaperless v3!\nDas Titel-/Hintergrundbild stammt von Chris Ried auf Unsplash .","image":"https://tbsch.de/post/2024-02-18-pypaperless-v3-erschienen/featured.webp"},{"id":"https://tbsch.de/post/2024-02-11-paperless-guide-classification/","url":"https://tbsch.de/post/2024-02-11-paperless-guide-classification/","title":"Paperless Guide: Klassifizierung","summary":"Dokumente klassifizieren, um sie später sorglos wiederzufinden.","date_published":"2024-02-11T00:00:00Z","date_modified":"2024-02-11T00:00:00Z","tags":["home-lab","guide","paperless","workflow"],"content_text":"Ich gehe davon aus, dass du an dieser Stelle bereits eine laufende Paperless-ngx-Installation zur Verfügung hast. Falls nicht, ist das gar nicht tragisch: ich möchte die folgenden Themen auf dieser Seite etwas mehr veranschaulichen. Nun drücke ich dem Ganzen auch meinen persönlichen Stempel auf, denn ich spreche von meinen Erfahrungen - von denen ich hoffe, dass sie dich zumindest einmal inspirieren werden.\nWas macht Paperless-ngx? # Auf der ersten Seite sprach ich davon, dass Paperless-ngx ein DMS ist. Toll, man kann damit also seine Dokumente organisieren. Das können Leitz-Ordner auch \u0026#x1f606;. Ja, die Arbeit eines DMS beginnt eben mit dem Lagern von Dokumenten, genau wie bei einem Leitz-Ordner.\nDas Tolle an einem DMS aber ist, dass es Dokumente eben nicht nur lagern kann. Es kann unter anderem:\nDokumente klassifizieren (einen Typ festlegen). Dokumente nach Absendern ordnen. Dokumente markieren (z.B. zur späteren Weiterarbeit). Metainformationen bereitstellen. Dokumente automatisiert abholen (z.B. vom Scanner, aus E-Mails). Dir sogar mitteilen, in welchem Leitz-Ordner ein Dokument physisch abgeheftet wurde. und vieles mehr\u0026hellip; Nun wird es sicher auch Leitz-Ordner-Profis geben, die mit Post-Its und anderen kleinen Helfern ähnliche Features analog umsetzen können und sich daher fragen: wozu brauche ich ein DMS? Ich bin leider nicht so ein Profi und ich arbeite einfach viel lieber digital \u0026#x1f605;. So habe ich meinen Papierkram nämlich auch außer Haus jederzeit griffbereit in meiner Hosentasche.\nUnd so sieht Paperless-ngx aus, wenn man es zum ersten Mal öffnet:\nKlassifizierung # Das Klassifizieren von Dokumenten deutet eigentlich an, dass man einem Dokument einen Typ zuweist. Ich verstehe darunter allerdings den Gesamtprozess des Anheftens von Metainformationen an ein Dokument. Wenn ich also von Klassifizierung spreche, meine ich nicht nur das Zuweisen eines Dokumenttyps, sondern die Zuweisung aller Metainformationen an ein Dokument: Dokumenttyp, Korrespondent, Speicherpfad, Tags etc.\nDiese Begrifflichkeiten wirst du nun sehr oft lesen, ich möchte nun näher auf sie eingehen. Auch lohnt sich ein Blick in die offizielle Dokumentation .\nWas ist ein Dokument? # Ich spreche immer von Dokumenten, doch bislang habe ich nicht erläutert, was genau ich damit meine. Du wirst dir vermutlich denken, dass das ja klar ist. Im Beruf habe ich jedoch beim Digitalisieren der Posteingangsstrecke gemerkt, dass das eben nicht immer so eindeutig ist. Es wird also Zeit für ein bisschen Theorie \u0026#x1f648;.\nFallbeispiel # Nehmen wir einen praktischen Fall: dich erreicht ein Brief \u0026#x2709;\u0026#xfe0f;. Enthalten sind vier Blatt Papier \u0026#x1f4c3;, die wiederum doppelseitig bedruckt sind; die gesamte Sendung besteht also aus acht bedruckten Seiten \u0026#x1f4c4;. Aus dem Inhalt geht hervor, dass es sich bei sechs Seiten um zwei unterschiedliche Rechnungen (A und B) \u0026#x1f587;\u0026#xfe0f; handelt. Die verbliebenen zwei Seiten sind eine Aufstellung von Leistungspositionen, die als Anlage \u0026#x1f4ca; zu Rechnung B mitgekommen sind.\nAnalyse # Wie du siehst, nimmt das Thema schnell ungeahnte Komplexität an. Was wäre für dich in diesem Beispiel denn nun ein Dokument? Aus meiner Sicht gibt es zu dieser Fragestellung erst einmal mehrere Antwortmöglichkeiten:\nDa alle Seiten in einem Brief verpackt waren, handelt es sich um ein Dokument (= Sendung). Hier liegen zwei Dokumente vor, eine Rechnung A und eine weitere Rechnung B nebst Anlage. Es handelt sich um drei Dokumente, zwei Rechnungen A + B und eine Anlage. Alle drei Möglichkeiten sind gangbare Wege, so viel sei dazu gesagt. Jede Person definiert ihr eigenes Ablagesystem und muss es natürlich so strukturieren, dass sie selbst im Bedarfsfall die korrekten Dokumente wiederfinden kann. Ich persönlich halte allerdings Antwort 2 für die effizienteste Vorgehensweise und setze dies auch selbst so um. Doch warum?\nSchlussfolgerung # Die erst einmal schnellste Methode ist natürlich Antwort 1: ich packe den Brief aus, scanne ihn ein und lasse ihn in Paperless-ngx verschwinden. Das funktioniert sehr gut bis zu dem Tag, an dem ich genau diese eine Rechnung B nebst Anlage wiederfinden muss. Durch die Kapselung mehrerer Rechnungen in ein Dokument wird die Suche nämlich unnötig erschwert. Die Zeit, die ich bei der Klassifizierung also eingespart habe, geht bei der längeren Suche locker dreifach wieder verloren.\nAnders verhält es sich mit Antwort 3: hier stecke ich sehr viel Zeit in die Klassifizierung von drei Dokumenten und habe dann alles sauber abgelegt. Doch welchen Vorteil habe ich davon, die Anlage von ihrer eigentlichen Rechnung B zu trennen? Wenn der Tag kommt, an dem ich Rechnung B und ihre passende Anlage wiederfinden muss, suche ich nach zwei Dokumenten im System1. Schlimmstenfalls enthält die Rechnung keinen Hinweis darauf, dass ihr eine Anlage beigefügt worden ist, und das hätte die zusätzliche negative Auswirkung, dass wir eine lose Anlage im DMS herumschwirren haben.\nAus diesen Gründen halte ich Antwort 2 für den effizientesten Weg. Die Sendung wird in ihre zwei Rechnungen A + B aufgetrennt und die Anlage zur Rechnung B gepackt. So entstehen in Paperless-ngx zwei Dokumente mit ihrer jeweils korrekten Klassifizierung. Darüber hinaus ist die Anlage immer direkt mit ihrer Rechnung zusammen auffindbar. Und falls ich einmal nur nach der Anlage suchen muss, kann ich mir sicher sein, dass mich niemand nach der Rechnungsanlage von Datum XY, sondern immer nach einer Anlage im Kontext einer bestimmten Rechnung fragen wird.\nInfo Nach all der Theorie wirst du dich bei genauem Hinsehen nun fragen, warum auf dem Bild Rechnungen und Einzelverbindungsnachweise voneinander getrennt sind. Ich halte einen EVN schlichtweg nicht für eine Rechnungsanlage(*), sondern ein für sich allein stehendes Dokument. Aus der Rechnung ergibt sich für mich auch ohne einen EVN eine Aufgabe: nämlich der Akt der Bezahlung eben dieser.\nZu *) Hierüber kann man streiten, ich änderte zu dem Thema auch selbst andauernd meine Meinung. Letztendlich habe ich mich aber festgelegt und behalte es so bei.\nHast du andere Erfahrungen gemacht? Lass es mich wissen \u0026#x1f601;.\nKorrespondent # Unter Korrespondenten versteht man den Absender von Dokumenten, die dich erreichen. In der anderen Richtung sind Korrespondenten die Empfänger von Dokumenten, die du verschickst.\ngraph TD A(Korrespondent) --\u003e|Absender| B B{{Sendung mit Dokumenten}} --\u003e|Empfänger| A In Paperless-ngx können wir uns Korrespondenten als virtuelle Schubladen vorstellen, in denen alle Dokumente einer Person oder Firma abgelegt sind. Mit nur einem Klick finden wir alle Dokumente, die einem bestimmten Korrespondenten zugeordnet sind.\nDokumenttyp # Mit dem Dokumenttyp legst du fest, um was für eine Art Dokument es sich handelt. Hier kann man beliebig granular werden, doch Simplizität schlägt aus meiner Sicht Komplexität. Die Klassifizierung von Dokumenten zu einem Dokumenttyp erfolgt nach Regeln, die wir uns selbst ausdenken und auferlegen müssen. Es sollte uns also auf einen Blick klar sein, was für ein Dokument vor uns liegt und welcher Dokumenttyp das sein könnte.\nWarning Ertappst du dich selbst dabei, wie du immer wieder zwischen mehreren Dokumenttypen schwankst, gebe ich dir einen guten Rat: konsolidiere sie. Wenn selbst du dir als Mensch unsicher bist, wie soll dann Paperless-ngx den korrekten Dokumenttyp automatisiert für dich erkennen?\nSehen wir uns alle Dokumente an, die wir im Laufe der Zeit erhalten, kristallisieren sich ein paar Dokumenttypen deutlich heraus.\nIn meinem Fall sind das diese hier:\nDokumenttyp Beschreibung Bescheid Bescheide von Behörden, z.B. Steuerbescheide, Bewilligungen, etc. Dokument Abstrakter Typ für Dokumente, die keinem Typ eindeutig zuordenbar sind. Kontoauszug Der Name ist Programm, egal ob Girokonto, ETF-Sparplan, Depot. Korrespondenz Allgemeine Schriftwechsel, auf die eine Antwort folgen soll, z.B. Beschwerde beim Internetanbieter. Kündigung Kündigungen und Kündigungsbestätigungen von Verträgen aller Art. Lohnabrechnung Hiermit werden alle monatlichen Lohnzettel klassifiziert. LSt-Bescheinigung Lohnsteuerbescheinigungen kommen in der Regel 1x im Jahr, sind aber wichtig genug für einen eigenen Typ. NK-Abrechnung Lange habe ich Nebenkostenabrechnungen einfach als Rechnung klassifiziert, zur schnelleren Auffindbarkeit habe ich aber dann einen eigenen Dokumenttyp erstellt. Rechnung Enthält alle Rechnungen, z.B. vom Internetanbieter, Mobilfunk, Käufe mit Garantie, etc. Spendennachweis Ich spende jedes Jahr, die Quittungen erhalten diesen Dokumenttyp. Spesenabrechnung Beruflich bin ich viel unterwegs und dieser Dokumenttyp enthält die Abrechnungen gegenüber meiner Arbeitgeberin, wie auch ihre Antworten darauf. SV-Mitteilung Bestimmt für Sozialversicherungsmitteilungen, An- und Abmeldungen. Vertrag Komplexer Dokumenttyp, enthält Verträge aller Art. Auch Versicherungspolicen und Vertragsänderungsmitteilungen. Zeitnachweis Lohnabrechnungen und Zeitnachweise klassifiziere ich getrennt voneinander. Enthält auch Zeitnachweise für Freelancer-Tätigkeiten. Zertifikat Nachweise über Schulungen, Weiterbildungen und Seminare. Zeugnis Dokumenttyp für Schul-, Ausbildungs- und Arbeitszeugnisse. Tagging # Die einen lieben sie, die anderen hassen sie, und die übrigen 80% nutzen sie nicht: Tags. Auch ich selbst habe mich lange vor dem Einsatz von Tags gesträubt, weil es Dingen eine Komplexität verleihen kann, die schnell unüberschaubar ist. Denn zu jedem Tag gibt es eine Story: wann nutze ich ihn? Wann muss er wieder entfernt werden? Was sagt er aus? Hier sind uns überhaupt keine Grenzen gesetzt.\nTagging ist prima: bei Paperless-ngx kann man einem Dokument damit einen Kontext verleihen, oder sogar mehrere. Ähnlich wie bei Korrespondenten kann man Tags wie virtuelle Schubladen verstehen, in denen Dokumente liegen. Sie eignen sich erstklassig, um Dokumenten eine Thematik zuzuweisen, die über viele Korrespondenten und Dokumenttypen verteilt ist (z.B. Kfz) - oder einfach nur als Statusindikator.\nDamit es jedoch nicht zu komplex wird, beschränke ich mich auf einige wenige, dafür eindeutige Tags.\nTag Beschreibung Ausgang Das Dokument ist ein Ausgangsdokument, wurde also von mir initiiert. Kfz Verträgen, Rechnungen, etc. verleihe ich mit diesem Tag einen Kfz-Kontext. So kann ich schnell sämtliche Unterlagen zu meinen Autos wiederfinden. Neu Hierbei handelt es sich um meinen Posteingangs-Tag. Alle Dokumente mit diesem Tag haben den Status neu. Problem Dieser Tag wird von meiner Middleware verwendet, wenn ich an einem Dokument noch etwas nacharbeiten muss. Darauf gehe ich später detailliert ein. Steuer Dokumente mit diesem Tag werden von mir für die nächste Steuererklärung benötigt. Todo Das sind Dokumente, mit denen ich zu einem späteren Zeitpunkt noch etwas vorhabe, oder bei denen ich noch auf eine Antwort warte. Wichtig Extrem wichtige Dokumente, die ich schnell wiederfinden muss, wenn ich sie brauche. Speicherpfade # Paperless-ngx bietet noch eine weitere Möglichkeit, Schubladen zu erschaffen. Nicht dass wir davon nicht schon bereits einige hätten \u0026#x1f613;. In diesem Fall handelt es sich um echte Ordner im Dateisystem, in denen die echten PDF-Dateien dann abgelegt werden, die du im DMS abspeicherst. Das ist natürlich ein reines Kosmetik-Feature und bietet Vorteile für Backups, oder wenn man all seine Dokumente bspw. zusätzlich bei einem Cloud-Anbieter speichern möchte.\nIch nutze zwar die physischen Dateiordner nicht, Speicherpfade stellen für mich allerdings ein zusätzliches Klassifizierungsmerkmal dar. So existiert nicht nur für jedes meiner Autos ein echter Dateiordner mit allen Dokumenten drin, meine Middleware weiß hierdurch sogar, um welches Auto es sich handelt. So spare ich mir für jedes Auto einen eigenen Tag anzulegen, denn viele Speicherpfade sind aus meiner Sicht weniger störend als viele Tags.\nMiddleware # Ich habe nun mehrmals eine Middleware erwähnt. Hierbei handelt es sich um eine selbst entwickelte Python-App, die wiederkehrende Monitoring-Aufgaben wahrnimmt. Die App baut auf diesem Python Modul auf, welches ich auch entwickelt habe:\nWenn du ein bisschen mehr darüber erfahren möchtest, solltest du hier weiterlesen \u0026#x1f604;.\nErkennungs-Algorithmen # Die Klassifizierung ist der Prozess, bei dem man Dokumenten jeweils Korrespondenten, Dokumenttyp, Tags und ggf. einen Speicherpfad zuweist. Das muss man glücklicherweise nicht jedes Mal komplett per Hand machen, Paperless-ngx wird mit einigen Erkennungs-Algorithmen ausgeliefert. Darüber kannst du hier mehr lesen. Falls die automatische Erkennung nicht zum gewünschten Ergebnis führt, kann man natürlich selbst den korrekten Wert einstellen. Im Falle der Auto-Erkennung lernt Paperless-ngx dann von deiner Entscheidung und macht es mit ein bisschen Glück direkt beim nächsten Mal richtig.\nKeine # Die Verwendung von Erkennungs-Algorithmen wird deaktiviert.\nIrgendein Wort, Alle # Der Inhalt eines Dokuments wird nach den Wörtern im Zuweisungsmuster durchsucht. Legst du das Zuweisungsmuster auf Rechnung fest, werden alle Dokumente entsprechend klassifiziert, wenn sie das Wort Rechnung enthalten.\nBeim Zuweisungsmuster Rechnung Baumarkt Köln trifft der Erkennungs-Algorithmus Irgendein Wort, sobald eines der drei Wörter im Dokument vorkommt. Alle trifft nur dann, wenn alle Wörter erkannt werden konnten. Du hast richtig erkannt: mehrere Wörter werden einfach durch ein Leerzeichen voneinander getrennt.\nEs ist aber auch möglich, nach Wörtern mit enthaltenen Leerzeichen zu suchen. Das Prinzip ist fast dasselbe wie mit einzelnen Wörtern: Rechnung \u0026quot;Baumarkt Köln\u0026quot;. Irgendein Wort trifft nur, wenn die Wörter Rechnung oder (Achtung!) Baumarkt Köln im Dokument vorkommen. Du kennst das von gängigen Suchmaschinen, denn dort ist es genauso. Alle trifft wieder nur, wenn beide Wörter vorkommen.\nDie Reihenfolge der Wörter im Dokument spielt übrigens keine Rolle, wichtig ist nur, dass sie vorkommen.\nExakt # Dieser Erkennungs-Algorithmus verhält sich ähnlich wie Irgendein Wort und Alle, nur dass hier nicht im Kontext von Wörtern, sondern Zeichenketten gesucht wird.\nDas Zuweisungsmuster Rechnung Baumarkt Köln setzt also dann voraus, dass im Dokument auch tatsächlich Rechnung Baumarkt Köln am Stück ausgeschrieben wurde, damit Exakt treffen kann.\nRegulärer Ausdruck (Regex) # Liebhaber von regulären Ausdrücken werden auf ihre Kosten kommen, auch ich bin ein großer Freund davon. Aufgrund der Komplexität von Regex empfehle ich die Verwendung allerdings nur, wenn du wirklich weißt, was du da machst. Es gibt leider extrem beschränkte Debugging Funktionen dafür in Paperless-ngx, neben der Logdatei gibt es nämlich keine. Im schlimmsten Fall bekommst du niemals mit, dass dein Zuweisungsmuster also gar nicht funktioniert.\nMöchtest du Regex besser kennenlernen, empfiehlt sich die offizielle Python Dokumentation .\nUngenau (Fuzzy) # Ich bin mir nicht sicher, was ich hierüber schreiben soll. Fuzzy Match war bislang niemals die Lösung einer meiner Use-Cases, aber vielleicht underrate ich den Erkennungs-Algorithmus ja auch einfach bodenlos. Ich werde mir vornehmen, mehr damit zu arbeiten und zu sehen, ob und wie er lebensverändernd sein könnte.\nAuto # Paperless-ngx erlernt die Zuweisung mit der Zeit automatisch. Ich nutze die Auto-Erkennung, wann immer ich bei einem Klassifizierungsmerkmal genügend Dokumente erwarte; ein Model muss schließlich mit genug Daten trainiert werden.\nDie automatische Zuweisung funktionierte bereits mit der Vorgänger-Software recht zuverlässig und ich bin sehr zufrieden damit.\nDas Titel-/Hintergrundbild stammt von blocks auf Unsplash .\nSeit Paperless-ngx v2.2.0 gibt es logische Dokumentenverknüpfungen, womit sich Dokumente verbinden lassen. Dies hat Stand 02.01.2024 jedoch weder eine Auswirkung auf die Qualität der Suchergebnisse, noch eine Visualisierung im UI.\u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-02-11-paperless-guide-classification/featured.webp"},{"id":"https://tbsch.de/post/2024-02-04-paperless-guide-setup/","url":"https://tbsch.de/post/2024-02-04-paperless-guide-setup/","title":"Paperless Guide: Setup","summary":"Zeit für den digitalen Wandel: ein neues papierloses Büro aufsetzen.","date_published":"2024-02-04T00:00:00Z","date_modified":"2024-02-04T00:00:00Z","tags":["home-lab","docker","guide","paperless"],"content_text":"Viele Wege führen nach Rom, zumindest aber benötigst du eine Komponente: ein Gerät, auf dem Services betrieben werden können. Hier setzt Paperless-ngx nur wenige Grenzen. Ich habe mich für die virtualisierte Variante mit Docker1 entschieden, die Docker Bridge läuft auf meinem Synology NAS2. Dieser Leitfaden beschränkt sich auf die Verwendung von Docker.\nInfo Bitte beachte, dass ein paar Vorkenntnisse notwendig sind. Grundsätzlich ist aber jeder in der Lage, ein papierloses Büro zu betreiben, wenn er sich in die Materie einarbeitet und Englisch beherrscht.\nDokumentation # Wichtigste Informationsquelle für die folgenden Inhalte ist die Webseite von Paperless-ngx .\nSetup # Ich empfehle stets die Verwendung von docker compose3, da es die Handhabung von Containern enorm erleichtert. Praktischerweise liefern die Macher von Paperless-ngx bereits diverse Beispiel-Setups mit, welche hier zur Verfügung stehen.\nMeine Installation besteht aus den folgenden Komponenten:\n# ... services: broker: image: redis:7 # ... webserver: image: paperlessngx/paperless-ngx:latest # ... gotenberg: image: gotenberg/gotenberg:7.8 # ... tika: image: ghcr.io/paperless-ngx/tika:latest # ... # ... Bewusst verzichte ich auf den Einsatz einer relationalen Datenbank, wie z.B. PostgreSQL. Ich möchte mein papierloses Büro einfach nicht von einer Datenbank abhängig machen, denn diese benötigt auch Wartung, Backups, etc. Ein weiterer Vorteil ist, dass sich eine sqlite-Datei sehr viel einfacher sichern lässt \u0026#x1f60e;. Solltest du eine MySQL-Datenbank verwenden wollen, gibt es noch weitere Dinge zu beachten .\nWarning Wenn du dich mit Datenbanken nicht gut auskennst, rate ich dringend dazu, ebenfalls auf deren Einsatz zu verzichten! Bei falscher Handhabung droht Datenverlust; und genau das muss vermieden werden. Es gibt absolut keinen großen Vorteil durch ihren Einsatz, da Paperless-ngx keine horrenden Datenmengen speichert. Meine sqlite-Datenbank ist gerade einmal 14 MB groß (über 3000 Dokumente, Stand 30.12.2023).\nGotenberg und Tika sind optionale Bestandteile der Paperless-ngx-Installation. Sie werden benötigt, um Office- und E-Mail-Dateien verarbeiten zu können. Ich nutze diese Services zwar extrem sporadisch, Haben ist aber besser als Brauchen. Hier findest du weitergehende Erläuterungen dazu.\nKonfiguration # Meine docker compose-Konfiguration ist natürlich auf meine Bedürfnisse zugeschnitten. Hier ein kleiner Einblick in den Paperless-ngx-Container. Alle Ordner sind frei zugänglich auf dem Dateisystem meines Servers, Docker Volumes nutze ich nicht:\n# ... volumes: - ./data:/usr/src/paperless/data - ./media:/usr/src/paperless/media - ./export:/usr/src/paperless/export - ./consume:/usr/src/paperless/consume - ./hooks:/usr/src/paperless/scripts - ./trash:/usr/src/paperless/trash environment: PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_TIKA_ENABLED: 1 PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 PAPERLESS_TASK_WORKERS: 2 PAPERLESS_THREADS_PER_WORKER: 2 PAPERLESS_PRE_CONSUME_SCRIPT: /usr/src/paperless/scripts/PRE_CONSUME.sh PAPERLESS_POST_CONSUME_SCRIPT: /usr/src/paperless/scripts/POST_CONSUME.sh PAPERLESS_TRASH_DIR: /usr/src/paperless/trash PAPERLESS_URL: # vertraulich PAPERLESS_TRUSTED_PROXIES: # vertraulich PAPERLESS_USE_X_FORWARD_HOST: true PAPERLESS_USE_X_FORWARD_PORT: true PAPERLESS_PROXY_SSL_HEADER: [\u0026#34;HTTP_X_FORWARDED_PROTO\u0026#34;, \u0026#34;https\u0026#34;] PAPERLESS_SECRET_KEY: # vertraulich PAPERLESS_ENABLE_UPDATE_CHECK: true PAPERLESS_OCR_LANGUAGES: deu PAPERLESS_OCR_LANGUAGE: deu PAPERLESS_FILENAME_FORMAT: {owner_username}/{created}_{correspondent}_{document_type}_{title} # QR Code Scanner PAPERLESS_CONSUMER_ENABLE_BARCODES: true PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: true PAPERLESS_CONSUMER_BARCODE_SCANNER: ZXING # ... Alle Optionen sind detailliert hier dokumentiert, jedes Detail kann und sollte nachgelesen werden. Für Vorschläge zu meiner Konfiguration bin ich jederzeit zu haben, nimm einfach Kontakt mit mir auf!\nErläuterungen:\nWie eingangs erwähnt, behalte ich mir den Zugriff auf alle Daten über das Dateisystem vor. Das erleichtert Backups ungemein. Ich verwende Custom Scripts, um Aktionen vor und nach dem Konsumieren von Dokumenten auszuführen. Der Papierkorb ist aktiviert. Sollte nicht passieren, aber falls ich mal etwas lösche, ist es nicht sofort verloren. Paperless-ngx läuft in meinem Home Lab innerhalb eines Traefik4-Netzwerks, ist also hinter einem Proxy. Beim PAPERLESS_FILENAME_FORMAT wird für jeden Eigentümer ein eigener Ordner angelegt. Paperless-ngx ist mandantenfähig, ein bisschen \u0026#x1f609;. Für den Privathaushalt mit mehreren Personen reicht es vollkommen. Der Barcode-Scanner ist aktiviert. Für eine bessere Erkennung von kleinen QR Codes auf Dokumenten verwende ich ZXING. Ein anderer Paperless-User, Marvin Gaube, hat einen interessanten Artikel darüber verfasst. Fazit # Es gibt viele Details, über die man seine Paperless-ngx-Installation für den persönlichen Gebrauch optimieren kann. Das hängt immer sehr vom eigenen Use-Case, aber auch der eingesetzten Technik ab.\nAuf die oben angesprochenen Custom Scripts gehe ich im weiteren Verlauf detaillierter ein. Das ist ein extrem mächtiges Tool, womit sich allerhand Schandtaten realisieren lassen \u0026#x1f601;. Stichwort: eigene Regelwerke, Validierung und Nachhalten eben dieser.\nDas Titel-/Hintergrundbild stammt von Luca Bravo auf Unsplash .\nContainermanager, docker.com \u0026#160;\u0026#x21a9;\u0026#xfe0e;\nNetwork Attached Storage, Synology Webseite \u0026#160;\u0026#x21a9;\u0026#xfe0e;\nMehr Infos auf docker-compose \u0026#160;\u0026#x21a9;\u0026#xfe0e;\nTraefik ist ein Reverse Proxy, traefik.io \u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-02-04-paperless-guide-setup/featured.webp"},{"id":"https://tbsch.de/post/2024-01-28-paperless-guide-introduction/","url":"https://tbsch.de/post/2024-01-28-paperless-guide-introduction/","title":"Paperless Guide: Einführung","summary":"Kurzer Abstecher zu den alltäglichen Themen mit der Papier-Ablage.","date_published":"2024-01-28T00:00:00Z","date_modified":"2024-01-28T00:00:00Z","tags":["home-lab","docker","guide","paperless"],"content_text":"Papierkram. Jeder von uns hat ihn, jeder muss ihn bewältigen, rechtzeitig auf Ereignisse reagieren, Schriftgut ablegen - und irgendwann im Bedarfsfall wiederfinden. Einige haben sich hierfür ein straffes Ordnersystem ausgedacht, andere feuern ihre Dokumente in irgendeine Kiste. Die Ablageregeln, die man sich hierfür aufgestellt hat, geraten mit den Jahren möglicherweise in Vergessenheit und bestimmte Dokumenttypen lagern dann an mehreren Stellen - der Worst Case ist eingetreten.\nLösungsansätze # Nacheinander probierte ich verschiedene Lösungsansätze aus und entwickelte so mit der Zeit meine heutige Lösung.\nAblage nach Datum # Da ich mich 2016 noch nicht mit privaten DMS1 auskannte bzw. mir mein Use-Case noch nicht bewusst war, entwickelte ich ein einfacheres Ablagesystem in meinen Ordnern. Hierbei heftete ich jedes Dokument einfach nach Datum ab und beschriftete die Ordner mit Zeiträumen.\nMann, kam ich mir clever vor \u0026#x1f60e;. Bis der Tag kam, an dem ich einen bestimmten Brief von der Krankenkasse gesucht habe. Natürlich wusste ich nicht mehr, wann genau ich ihn erhalten hatte: ich blätterte also jeden Ordner durch, bis ich den Brief schließlich gefunden hatte.\nErste Gehversuche: ecoDMS # Über meinen Freund Ben habe ich von ecoDMS erfahren. Das DMS besteht aus einem Server, der die Dokumente erkennt, klassifiziert und speichert, sowie einem Client. Über diesen kann man dann Dokumente suchen, mit Metainformationen versehen und einfach damit arbeiten. Cool - da ich einen Server zuhause stehen hatte, passte das wie die Faust aufs Auge und meine Dokumente wären immer verfügbar für mich.\nMan steckt bei ecoDMS sehr viel Zeit in die Konfiguration, überlegt sich Strukturen, Dokumenttypen, Datenfelder, etc. Außerdem musste man der Erkennungssoftware beibringen, wie Dokumente klassifiziert werden sollen. Über einen praktischen Editor konnte man Bereiche auf einem Dokument auswählen, in denen bspw. immer eine Kundennummer auftauchte. Wahnsinn \u0026#x1f601;!\nBis Absender von Dokumenten halt mal ihr Brieflayout ändern. Ich musste leider feststellen, dass das ziemlich oft passiert. Dann begann nämlich jedes Mal das große Herumgefummel und ecoDMS wurde für mich einfach nur noch lästig und fühlte sich so gar nicht smart an. Der lästige Windows-FAT-Client und die schlechten Mobile- und Web-Zugriffsmöglichkeiten rundeten das negative Erlebnis ab.\nDie Lösung: Paperless-ngx # Anfang 2021 dann der große, medienwirksame Newcomer: paperless-ng - Open Source, ausführbar in vielen privaten Umgebungen, rein webbasierter Zugriff, alles über REST API.\nAls im August 2021 das Aus von paperless-ng verkündet wurde, machte sich bei mir Enttäuschung breit. Ich hatte schließlich mein ecoDMS damit abgelöst. Im März 2022 dann die Kehrtwende: ich war offensichtlich nicht der einzige Fan von paperless-ng.\nDas Projekt wurde geforkt und ging an den Start als: Paperless-ngx Jeder hat seine Präferenzen, ich favorisiere ganz klar den digitalen Weg: wenig bis gar kein Papier im Aktenschrank. Das passt einfach zu meinem Lifestyle. Auf den folgenden Seiten gehe ich näher auf meine Vorgehensweise mit Paperless-ngx ein, die sich komplett mühelos in den Alltag integrieren lässt.\nDas Titel-/Hintergrundbild stammt von Carl Heyerdahl auf Unsplash .\nDocument Management System, Wikipedia \u0026#160;\u0026#x21a9;\u0026#xfe0e;","image":"https://tbsch.de/post/2024-01-28-paperless-guide-introduction/featured.webp"},{"id":"https://tbsch.de/post/2024-01-01-meine-neue-webseite/","url":"https://tbsch.de/post/2024-01-01-meine-neue-webseite/","title":"Meine neue Webseite","summary":"Alles neu, außer der Inhalt. Auf Ruby folgt nun Go: statisch bleibt\u0026rsquo;s.","date_published":"2024-01-01T00:00:00Z","date_modified":"2024-01-01T00:00:00Z","tags":["news","cloudflare","webseite"],"content_text":"Alles neu, außer der Inhalt. Auf Ruby folgt nun Go: statisch bleibt\u0026rsquo;s.\nIch habe mich dazu entschlossen, meine Webseite neu aufzubauen und auf Cloudflare Pages zu hosten. Bislang habe ich das in meiner heimischen Infrastruktur selbst getan, aufgrund zunehmender Cyberangriffe kommt das aber nicht mehr für mich in Frage.\nZwischenzeitlich habe ich mit einem VPS experimentiert, aber auch hier muss man natürlich laufend dran bleiben, um Sicherheitsrisiken im Keim zu ersticken. Das ist für mich auf Dauer leider keine Option, da die Webseite einfach nur ein kleines Projekt für nebenbei ist und im Alltag vermutlich häufig viel zu kurz kommt.\nKomponenten # Programmiersprache: Go Static Site Generator: Hugo Theme: Blowfish Keine Datenbank GitHub: Mein Profil Cloudflare Pages Jekyll? Hugo? # Ich habe mich vorher an einem Projekt mit Jekyll versucht, soweit hat das auch wunderbar funktioniert. Das Geflecht aus Ruby-Abhängigkeiten hat mir jedoch einfach nicht so gut gefallen, es verursachte immer wieder Probleme beim Build der Webseite. Als Anwender möchte ich mich aber einfach nicht mit solchen elementaren Herausforderungen herumplagen müssen und erwarte, dass Dinge einfach funktionieren. Also habe ich mich in letzter Konsequenz von Jekyll und dem Minimal Mistakes Theme wieder getrennt. So einfach ist das.\nDie Tatsache, eine Webseite einfach mit Markdown runterschreiben zu können, hat mir bei Jekyll jedoch so gut gefallen, dass ich nun bei Hugo gelandet bin. Wollen wir hoffen, dass es nun dabei bleibt \u0026#x1f601;.\nDas Titel-/Hintergrundbild stammt von Max Langelott auf Unsplash .","image":"https://tbsch.de/post/2024-01-01-meine-neue-webseite/featured.webp"},{"id":"https://tbsch.de/post/2023-12-19-pypaperless-v2-erschienen/","url":"https://tbsch.de/post/2023-12-19-pypaperless-v2-erschienen/","title":"pypaperless v2 erschienen","summary":"Ich habe pypaperless v2 veröffentlicht.","date_published":"2023-12-19T00:00:00Z","date_modified":"2023-12-19T00:00:00Z","tags":["news","paperless","projekt","python"],"content_text":"Seit April 2022 gibt es nun schon pypaperless, also den kleinen API Client für Paperless-ngx. Zugegeben, ich habe dem Projekt nie wirklich viel Liebe zukommen lassen, da ich mich zu der Zeit auch noch gar nicht viel mit Python beschäftigt habe. Das Ergebnis war ein kleines Python-Modul mit wahrlich keinem guten Code.\nIch habe mir jedoch in den Kopf gesetzt, Paperless-ngx als Integration nach Home Assistant zu bringen. Um diesem Ziel einen Schritt näher zu kommen, war ein Refactoring des kompletten Codes von pypaperless notwendig: Es musste in einem async Umfeld funktionieren.\nHeute war es nach langer Arbeit dann endlich so weit: Version 2 konnte an den Start gehen \u0026#x1f601;!\nViel Spaß mit pypaperless v2!\nDas Titel-/Hintergrundbild stammt von Chris Ried auf Unsplash .","image":"https://tbsch.de/post/2023-12-19-pypaperless-v2-erschienen/featured.webp"}]}