Remove all em-dashes from website content and documentation

Replace ' — ' with ', ' across 40 files. Hyphens (-) untouched.
timecapsule, stefankoelle, LICENSE, CSS comments left as-is.
This commit is contained in:
2026-09-11 20:13:28 +02:00
parent 3363702ee6
commit eb0b777418
40 changed files with 311 additions and 311 deletions
+2 -2
View File
@@ -25,7 +25,7 @@ speaker app.</p>
a software mixer stage (<code>+20&nbsp;dB</code> via an ALSA softvol plugin) sits between
shairport-sync and the hardware. The hardware mixer itself is deliberately
left fixed at 100% / 0&nbsp;dB, and shairport-sync only ever adjusts its own
internal software volume this avoids the volume jumps and mixer
internal software volume, this avoids the volume jumps and mixer
conflicts that show up when multiple layers all try to control loudness.</p>
<h2>Bathroom-specific integration</h2>
@@ -33,7 +33,7 @@ conflicts that show up when multiple layers all try to control loudness.</p>
radio stream automatically when its light sensor detects the light has
been switched on. A simple flag file signals whether AirPlay is currently
active, so the automatic radio stream politely stays off while someone is
actively AirPlaying and resumes its normal behavior as soon as the
actively AirPlaying, and resumes its normal behavior as soon as the
AirPlay session ends.</p>
<h2>Why this design</h2>
+4 -4
View File
@@ -13,13 +13,13 @@ layout: base.njk
self-contained smart-balcony controller: light control, an internet
radio player, sensor readings, and its own backup/monitoring, all on
very modest hardware. The goal is to make the balcony a more pleasant
space light control when it gets dark, background music while sitting
space, light control when it gets dark, background music while sitting
outside, and temperature readings to know what to expect before stepping
out.</p>
<h2>What it does</h2>
<ul>
<li><strong>Audio output</strong> via a DIY PWM-to-analog circuit on two GPIO pins the Pi Zero has no built-in audio jack, so this is a well-known community workaround using a small RC filter.</li>
<li><strong>Audio output</strong> via a DIY PWM-to-analog circuit on two GPIO pins, the Pi Zero has no built-in audio jack, so this is a well-known community workaround using a small RC filter.</li>
<li><strong>Physical controls</strong>: a push button for the balcony light and a toggle switch for music playback, read directly via GPIO.</li>
<li><strong>HTTP communication</strong> with an ESP32-based balcony light controller.</li>
<li><strong>Internet radio</strong> via a lightweight command-line audio player, controlled by a small custom tool ported from an earlier bathroom-Pi project.</li>
@@ -28,7 +28,7 @@ out.</p>
<h2>Hardware details</h2>
<p>The Pi Zero W is connected to an ESP32 microcontroller that handles
the actual light switching via a relay module. Communication happens
over HTTP the Pi sends a simple request to toggle the relay, and the
over HTTP, the Pi sends a simple request to toggle the relay, and the
ESP32 responds with the current light state. The ESP32 also reads a
DHT22 temperature and humidity sensor, publishing the values to MQTT
for the home dashboard. This split makes sense: the Pi handles the
@@ -37,7 +37,7 @@ handles the real-time hardware control.</p>
<h2>Monitoring & backup, even on tiny hardware</h2>
<p>Despite the very limited RAM, this Pi still participates in the same
Prometheus monitoring pattern as the rest of the fleet with the metrics
Prometheus monitoring pattern as the rest of the fleet, with the metrics
collector's default configuration trimmed down to only the essential
collectors, since the full default set noticeably overloaded the CPU on
this specific board. It also runs a nightly rsync backup of its own
+15 -15
View File
@@ -13,30 +13,30 @@ parent: "/smarthome/"
<h2>Lighting & ambience</h2>
<ul>
<li><strong>Balkon</strong> LED on/off toggle for the balcony lighting.</li>
<li><strong>Beleuchtung (all rooms)</strong> global "all on"/"all off" shortcut plus per-room toggles for living room and kitchen lighting.</li>
<li><strong>Balkon</strong>, LED on/off toggle for the balcony lighting.</li>
<li><strong>Beleuchtung (all rooms)</strong>, global "all on"/"all off" shortcut plus per-room toggles for living room and kitchen lighting.</li>
</ul>
<h2>Music controls</h2>
<ul>
<li><strong>Kitchen</strong> quick buttons for SomaFM, a classical station, and an off switch, all routed to the kitchen speaker.</li>
<li><strong>Living room</strong> the same SomaFM/classical options plus dedicated Lounge, 2000s and Deluxe stations, and an off switch.</li>
<li><strong>Kitchen</strong>, quick buttons for SomaFM, a classical station, and an off switch, all routed to the kitchen speaker.</li>
<li><strong>Living room</strong>, the same SomaFM/classical options plus dedicated Lounge, 2000s and Deluxe stations, and an off switch.</li>
</ul>
<h2>Tasmota smart plugs</h2>
<ul>
<li><strong>TasmoAdmin</strong> link straight into the central Tasmota device dashboard for firmware and config management.</li>
<li><strong>Power strips (Gosund P1)</strong> two multi-outlet strips covering the home-office network gear and backup drive, and the iMac corner with its peripherals.</li>
<li><strong>Single sockets (SP112)</strong> four individually switchable outlets covering hallway, kitchen, dryer and washing machine circuits, each also powering an associated LED matrix or small Pi.</li>
<li><strong>Other plug families</strong> additional Nous, Eightree (ESP32-based), Athom and IDS smart plugs cover spare capacity, living-room seating/desk outlets, storage room, kitchen appliances, and a few legacy TV/PC outlets (several currently marked defective).</li>
<li><strong>TasmoAdmin</strong>, link straight into the central Tasmota device dashboard for firmware and config management.</li>
<li><strong>Power strips (Gosund P1)</strong>, two multi-outlet strips covering the home-office network gear and backup drive, and the iMac corner with its peripherals.</li>
<li><strong>Single sockets (SP112)</strong>, four individually switchable outlets covering hallway, kitchen, dryer and washing machine circuits, each also powering an associated LED matrix or small Pi.</li>
<li><strong>Other plug families</strong>, additional Nous, Eightree (ESP32-based), Athom and IDS smart plugs cover spare capacity, living-room seating/desk outlets, storage room, kitchen appliances, and a few legacy TV/PC outlets (several currently marked defective).</li>
</ul>
<p>The plug collection has grown over time as different brands became available at different price points. Gosund P1 multi-socket strips handle areas with multiple devices, while the SP112 single sockets cover dedicated appliances. Eightree plugs are ESP32-based and flashable to Tasmota, while the Athom and IDS models round out the remaining circuits. A Tasmota RF Bridge extends the ecosystem to RF-only devices like the 3D printer plug in the study.</p>
<h2>Special devices &amp; status</h2>
<ul>
<li><strong>Tasmota RF Bridge / Delock</strong> bridges RF-only devices (like the home-office 3D printer plug) into the Tasmota/MQTT ecosystem.</li>
<li><strong>LED Matrix restarts</strong> one-click restart buttons for each of the six room LED matrix displays (living room, study, bathroom, kitchen, hallway, Nepomuk room), avoiding a manual power-cycle.</li>
<li><strong>Healthchecks &amp; version info</strong> direct links into the Healthchecks dashboard and a version/status overview for the connected devices.</li>
<li><strong>Tasmota RF Bridge / Delock</strong>, bridges RF-only devices (like the home-office 3D printer plug) into the Tasmota/MQTT ecosystem.</li>
<li><strong>LED Matrix restarts</strong>, one-click restart buttons for each of the six room LED matrix displays (living room, study, bathroom, kitchen, hallway, Nepomuk room), avoiding a manual power-cycle.</li>
<li><strong>Healthchecks &amp; version info</strong>, direct links into the Healthchecks dashboard and a version/status overview for the connected devices.</li>
</ul>
<h2>Calendar &amp; weather</h2>
@@ -47,10 +47,10 @@ parent: "/smarthome/"
<h2>Network shortcuts</h2>
<ul>
<li><strong>Routers & mesh</strong> quick links to the main Fritzbox and its mesh repeaters covering different floors and the kitchen/IoT band.</li>
<li><strong>Switches</strong> direct access to each Zyxel switch's admin page (server room, living room, PowerLAN, OpenWRT segment).</li>
<li><strong>OpenWRT & mini router</strong> links into the OpenWRT admin UI and the small travel router used for testing.</li>
<li><strong>Sensors & MQTT</strong> shortcuts to server-room and balcony sensor readings, bathroom analog values, and background worker/API status pages (HTML and JSON views).</li>
<li><strong>Routers & mesh</strong>, quick links to the main Fritzbox and its mesh repeaters covering different floors and the kitchen/IoT band.</li>
<li><strong>Switches</strong>, direct access to each Zyxel switch's admin page (server room, living room, PowerLAN, OpenWRT segment).</li>
<li><strong>OpenWRT & mini router</strong>, links into the OpenWRT admin UI and the small travel router used for testing.</li>
<li><strong>Sensors & MQTT</strong>, shortcuts to server-room and balcony sensor readings, bathroom analog values, and background worker/API status pages (HTML and JSON views).</li>
</ul>
<p class="redacted-note">This dashboard is intentionally simple: static HTML, no login, meant purely for convenience on the local network rather than as a secured control surface. Device names and room assignments are shown for structure; a few outlets are currently unused or marked defective and simply act as placeholders for future devices.</p>
+1 -1
View File
@@ -18,7 +18,7 @@ deliberately low-tech bridge: <strong>Home Assistant → MQTT → InfluxDB</stro
Docker container, but the underlying Python library lost compatibility
with HomematicIP's cloud API and hasn't been maintained since 2022. Home
Assistant, on the other hand, ships an actively maintained HomematicIP
Cloud integration so instead of chasing a broken exporter, the bridge
Cloud integration, so instead of chasing a broken exporter, the bridge
now runs as native Home Assistant automations that simply republish
sensor state changes to MQTT.</p>
+2 -2
View File
@@ -1,5 +1,5 @@
---
title: "Smart Home Projects Home Assistant, MQTT & IoT | moonweb"
title: "Smart Home Projects, Home Assistant, MQTT & IoT | moonweb"
section: "smarthome"
tags: "smarthome"
description: "Smart home projects: Home Assistant, MQTT sensors, AirPlay audio, OctoPrint, and energy monitoring."
@@ -89,7 +89,7 @@ sections:
<p>The home dashboard runs on multiple touch displays around the flat: an ESP32-S3 WT32-SC01 in the living room and an M5Stack in the study. Both show room temperatures, energy usage, and quick-action buttons for lighting and music control.</p>
<h2>Automation philosophy</h2>
<p>The goal is subtle automation that improves daily life without being intrusive. Lights turn on when someone enters a room, music starts playing in the bathroom when the light switches on, and LED matrix displays show the time, weather, and laundry status. But nothing talks unless spoken to no voice assistants, no always-on microphones, just simple sensor-driven automation that runs locally without cloud dependencies.</p>
<p>The goal is subtle automation that improves daily life without being intrusive. Lights turn on when someone enters a room, music starts playing in the bathroom when the light switches on, and LED matrix displays show the time, weather, and laundry status. But nothing talks unless spoken to, no voice assistants, no always-on microphones, just simple sensor-driven automation that runs locally without cloud dependencies.</p>
<h2>Self-hosted services</h2>
<p>Beyond hardware automation, several self-hosted services run on the Synology NAS: TubeArchivist and TubeSync for YouTube archiving, OctoPrint for remote 3D printer control, iCloud Contacts Sync for keeping the address book up to date, and a Google Calendar sync for dashboard widgets. Each service is containerized and backed up as part of the NAS backup strategy.</p>
+14 -14
View File
@@ -9,43 +9,43 @@ layout: base.njk
<h1>Kids RFID MP3 Player</h1>
<div class="detail-content">
<p>An Arduino-based MP3 player where kids select audio content by holding RFID cards against the device. No screen, no menus, no WiFi just tap a card and music plays. Built together with my son in 2018 as a cheaper, more flexible alternative to commercial products like the Hoerbert or Tonuino.</p>
<p>An Arduino-based MP3 player where kids select audio content by holding RFID cards against the device. No screen, no menus, no WiFi, just tap a card and music plays. Built together with my son in 2018 as a cheaper, more flexible alternative to commercial products like the Hoerbert or Tonuino.</p>
<h2>Why this exists</h2>
<p>Commercial kids' audio players have trade-offs. The Hoerbert only offers 9 direct-select buttons with color-coded cards that aren't very intuitive for very young children. The Tonuino uses expensive RFID figures and relies on WiFi streaming, which introduces latency and dependency on network availability. This project aimed for the best of both worlds: RFID-based content selection with local-only playback, analog volume control, and minimal buttons.</p>
<h2>Hardware</h2>
<ul>
<li><strong>Arduino</strong> the microcontroller running the custom firmware.</li>
<li><strong>RFID module</strong> reads MIFARE cards to trigger audio playback.</li>
<li><strong>DFPlayer Mini</strong> compact MP3 player module with built-in amplifier, handling audio decoding and playback directly from an SD card.</li>
<li><strong>Pololu power switch</strong> handles auto-shutdown to prevent battery drain, replacing a manual toggle switch that a child would forget to turn off.</li>
<li><strong>Analog volume knob</strong> a rotary potentiometer for tactile volume control, deliberately chosen over digital buttons.</li>
<li><strong>3 LEDs</strong> green (playing), yellow (paused), red (stopped/at end).</li>
<li><strong>Arduino</strong>, the microcontroller running the custom firmware.</li>
<li><strong>RFID module</strong>, reads MIFARE cards to trigger audio playback.</li>
<li><strong>DFPlayer Mini</strong>, compact MP3 player module with built-in amplifier, handling audio decoding and playback directly from an SD card.</li>
<li><strong>Pololu power switch</strong>, handles auto-shutdown to prevent battery drain, replacing a manual toggle switch that a child would forget to turn off.</li>
<li><strong>Analog volume knob</strong>, a rotary potentiometer for tactile volume control, deliberately chosen over digital buttons.</li>
<li><strong>3 LEDs</strong>, green (playing), yellow (paused), red (stopped/at end).</li>
</ul>
<h2>How it works</h2>
<p>Each RFID card is mapped to a specific audio file on the SD card. Hold a card against the reader and the corresponding story or song starts playing. Hold the RFID keychain against the reader to pause; hold it again to resume. No other buttons exist on the device the design intentionally minimizes interaction points so even a toddler can use it independently.</p>
<p>Each RFID card is mapped to a specific audio file on the SD card. Hold a card against the reader and the corresponding story or song starts playing. Hold the RFID keychain against the reader to pause; hold it again to resume. No other buttons exist on the device, the design intentionally minimizes interaction points so even a toddler can use it independently.</p>
<h2>Auto-shutdown behavior</h2>
<p>The power management distinguishes between two states to avoid unnecessary battery drain:</p>
<ul>
<li><strong>Stopped</strong> (playback reached the end) the device shuts down after 5 minutes.</li>
<li><strong>Paused</strong> (user paused via RFID) the device stays on for 1 hour before shutting down, allowing easy resumption.</li>
<li><strong>Stopped</strong> (playback reached the end), the device shuts down after 5 minutes.</li>
<li><strong>Paused</strong> (user paused via RFID), the device stays on for 1 hour before shutting down, allowing easy resumption.</li>
</ul>
<h2>The case</h2>
<p>The enclosure is a custom-built retro-style wooden box, painted by hand. The name "Rocky Box" came from my son, who painted a Paw Patrol character on the front. The design is deliberately quirky and homemade rather than polished it has character.</p>
<p>The enclosure is a custom-built retro-style wooden box, painted by hand. The name "Rocky Box" came from my son, who painted a Paw Patrol character on the front. The design is deliberately quirky and homemade rather than polished, it has character.</p>
<h2>What's missing (by design)</h2>
<ul>
<li>No resume after power-off turning the device off mid-playback means starting the story over from the beginning.</li>
<li>No skip forward/backward within a track stories play start to finish.</li>
<li>No resume after power-off, turning the device off mid-playback means starting the story over from the beginning.</li>
<li>No skip forward/backward within a track, stories play start to finish.</li>
</ul>
<p>Both omissions are intentional. Young children don't need seeking functionality, and keeping the interface to just "tap card, listen" reduces confusion.</p>
<h2>Setup</h2>
<p>All 100 RFID cards were pre-programmed once and labeled with numbers. No card learning or reprogramming is needed after initial setup just hand a child a numbered card and they know which story it triggers.</p>
<p>All 100 RFID cards were pre-programmed once and labeled with numbers. No card learning or reprogramming is needed after initial setup, just hand a child a numbered card and they know which story it triggers.</p>
<h2>Code</h2>
<p>The Arduino firmware is not yet published on GitHub. It's a custom implementation (not Tonuino), written in C++ for the Arduino platform. The code may be uploaded in the future.</p>
+4 -4
View File
@@ -12,12 +12,12 @@ layout: base.njk
<p>A Raspberry Pi 3B runs OctoPrint for remote 3D-printer control, plus a
live camera stream so print progress can be checked without walking over
to the printer. This eliminates the need to stand next to the printer
watching the first layer a quality-of-life improvement that's hard to
watching the first layer, a quality-of-life improvement that's hard to
go back from once you've experienced it.</p>
<h2>Current setup</h2>
<ul>
<li><strong>OctoPrint</strong> runs as a Docker container the main remote control interface for the printer.</li>
<li><strong>OctoPrint</strong> runs as a Docker container, the main remote control interface for the printer.</li>
<li><strong>Camera streaming</strong> is handled by a lightweight camera-server project, exposing both an HLS stream and an MJPEG stream, the latter wired directly into OctoPrint's webcam panel.</li>
<li><strong>Container management</strong> (Portainer, cAdvisor, a node exporter) runs alongside, giving the same monitoring pattern as the rest of the fleet.</li>
</ul>
@@ -27,7 +27,7 @@ go back from once you've experienced it.</p>
camera-server project provides two streaming modes: MJPEG for the
OctoPrint dashboard (low latency, works in any browser) and HLS for
remote viewing over slower connections. The MJPEG stream is the primary
way to check on prints it loads quickly and updates in real time in the
way to check on prints, it loads quickly and updates in real time in the
OctoPrint web interface.</p>
<h2>History</h2>
@@ -39,7 +39,7 @@ that point to better reflect its now-singular focus on the printer.</p>
<h2>Notable OS lesson</h2>
<p>After moving this Pi to a newer OS release, boot configuration files
moved to a new path editing the old path silently does nothing, which
moved to a new path, editing the old path silently does nothing, which
is an easy trap when following older notes or tutorials for the same
hardware. The lesson: always verify that configuration changes actually
take effect, especially after OS upgrades on embedded hardware.</p>
+3 -3
View File
@@ -27,7 +27,7 @@ and LED matrix displays.</p>
<h2>Multi-socket power strips</h2>
<p>Several rooms use multi-outlet smart power strips (each socket
individually switchable and metered) rather than single smart plugs this
individually switchable and metered) rather than single smart plugs, this
keeps things like "washing machine + dryer" or "office desk cluster" on
one strip while still tracking each socket's consumption separately.</p>
@@ -35,7 +35,7 @@ one strip while still tracking each socket's consumption separately.</p>
<p>New devices go through a standard conversion flow (from the
manufacturer's original cloud-dependent firmware to Tasmota) using a
well-documented community process. It occasionally fails on the first
attempt due to a transient Wi-Fi handshake issue retrying resolves it
attempt due to a transient Wi-Fi handshake issue, retrying resolves it
without any special handling.</p>
<h2>How the data flows</h2>
@@ -60,7 +60,7 @@ via Flux to display real-time and historical usage charts.</p>
<h2>Why Tasmota over alternatives</h2>
<p>Tasmota was chosen over alternatives like ESPHome or Tuya firmware for
several reasons. The local-only control means no cloud dependency the
several reasons. The local-only control means no cloud dependency, the
plugs work even if the internet is down. The MQTT integration is mature
and well-documented. The energy monitoring sensors are accurate enough
for home use (typically within 5% of a dedicated energy meter). And the