Smarte Hintergrundlampe

Nachdem ich viele Videos von kreativen, talentierten und produktiven Macher:innen gesehen hatte, bekam ich Lust wieder einmal etwas selber zu bauen. Meine Wahl fiel auf eine smarte Tischlampe.

Hintergrundbeleuchteter Monitor
Extrembeispiel ohne Zimmerbeleuchtung

Die Lampe steht hinter meinem Monitor und erhellt die Wand immer dann wenn draussen Dunkelheit herrscht und ich noch am Arbeiten bin. Das Licht senkt den Helligkeitskontrast zwischen Monitor und Umgebung und schont damit meine Augen.

Der Lichtkegel ist aufgrund der verwendeten Lampenform nicht sehr gross, aber gut genug für meine Bedürfnisse.

Hardware

Prototyp Smarte Tischlampe
Prototyp

Begonnen habe ich mit einem Eurolite PAR-16 Spot-Scheinwerfer (5 cm Ø), welchen ich vor knapp 20 Jahren für meine WG-Zimmerbeleuchtung erstanden hatte. Das Leuchtmittel ist eine normale LED-Birne mit GU10-Sockel, gespiesen mit 230 Volt. Er ist montiert auf einem einfachen Stück Holz und geschaltet mit einem Fussschalter.

Diese Lösung war mir aber zu dumm. Ich wollte die Lampe nicht ständig von Hand ein- und ausschalten, nicht im 21. Jahrhundert, nein.

Ich hatte mir überlegt, eine Fernsteuerung mit Hilfe eines ESP8266 oder ähnlichem einzubauen. Das hätte aber zusätzliche Teile benötigt: Eine 3.3 V-Stromversorgung sowie ein Relais für die Lampe. Nach kurzer Recherche bin ich auf die perfekte Lösung gestossen: Diese Komponenten gibt es bereits integriert unter dem Namen Shelly 1PM Mini. Das kleine rote Kästchen (29x34x16 mm) kann exakt was ich brauche.

Holzsockel ausfräsen

Um die ganze Elektronik zu verstecken habe ich eine Vertiefung in den Holzsockel gefräst. Das ging mit Forstnerbohrer zum Markieren und mit der Oberfräse zum ausfräsen ziemlich einfach.

Zusätzliche Aussparung im Holzsocker für einen Schalter

Vorsichtig habe sowohl Löcher für die Kabelführung, eine Versenkung für die Mutter der Lampenhalterung sowie eine zweite Aussparung für den Edelstahl-Taster gebohrt. Gerade letzteres war spannend weil ich ein kleineres durchgängiges Loch nach oben benötigte, darunter aber eine breitere Vertiefung um die Mutter anziehen und die Kabel verbinden zu können.

Auf die Idee mit dem Taster kam ich erst als ich das Schaltbild des Shelly studiert habe. Ich dachte mir, dass eine manuelle Steuerung nicht schaden kann. Gut gedacht…

Auch im Bild: Eine einfache 3d-gedruckte Zugentlastung für das Stromkabel welches zur Steckdose führt.

Verkabelung der Lampe innen


Weil ich wusste, dass auf den meisten der verbauten Drähte 220 V Spannung anliegt – auf einigen sogar ständig – und dass die ganzen Lampe aus Holz besteht, waren mir solide Verbindungen wichtig: Ich habe mir WAGO 221-Verbindungsklemmen geleistet und verbaut.

Damit ging aber mein Originalplan nicht mehr auf: Ich wollte ursprünglich die ganze Verkabelung mit einer 3d-gedruckten runden Platte abdecken und so einfach zugänglich halten. Das funktionierte jetzt aber aus zwei Gründen nicht mehr: Erstens waren meine Löcher doch nicht so rund wie ich dachte. Und zweitens war die Aussparung unter der Lampe mit dem Shelly und den ganzen Klemmen vollständig ausgefüllt. Ein Deckel darauf wäre ein Gemurkse geworden.

Oberfräse für die Abdeckung

Also habe ich beschlossen ein zweites Stück Holz als Abdeckung und zur zusätzlichen Stabilisierung unter die Lampe zu schrauben.

Und um die Holzplatte aufzuhübschen habe ich mir ein schmuckes Karnies-Profil mit der Oberfräse gefräst. Hier kollidierte die Praxis mit der ganzen Theorie aus meinem Holzarbeiten-YouTube-Konsum: Es war mir ein Rätsel wie ich das Holzstück dermassen fixieren sollte, damit ich die Fräse eben und in einer geraden Linie darüber führen könnte.

Das Endresultat war akzeptabel, gewinnt aber sicher keinen Tischlerpreis.

Unterseite Lampe mit Filzgleitern

Nach Schleifen, Ölen und Trocknen habe ich die zwei Holzstücke zusammen geschraubt. Falls Wartung notwendig sein sollte, würde ich die Schrauben halt einfach wieder entfernen.

Hexagons are the Bestagons, deshalb kamen natürlich Ikea Trixig-Bodengleiter als zum Einsatz. Ein Detail welches kaum jemand zu Gesicht bekommen wird und nur mir enorm Freude bereitet.

Software

Ich will folgendes automatisiertes Verhalten der Lampe im Alltag: Wenn ich an meinem Arbeitsplatz sitze und es draussen dunkel wird, soll sie sich einschalten. Wenn es draussen wieder hell ist, soll sie sich ausschalten.

Daraus ergaben sich folgende technische Konditionen:

  • Bin ich am Laptop eingeloggt?
  • Ist der Laptop am Arbeitsplatz? (Angeschlossen am Thunderbolt-Dock und dem externen Monitor)
  • Ist die Sonne untergegangen?

Nur wenn alle drei Bedingungen erfüllt sind, soll sich die Lamp einschalten. Andernfalls ausschalten.

Hardware-Setup

Mit der Hardware angeschlossen wird der Shelly mit Hilfe der zugehörigen App mit dem WLAN verbunden. In der App habe ich den Taster als „Button“ mit dem Verhalten „Toggle Switch“ konfiguriert.

Der Taster funktioniert so ausserhalb der automatischen Steuerung und erlaubt es, die Lampe unabhängig von der Software ein- und auszuschalten.

Hammerspoon

Als Steuerung habe ich auf meinem MacBook die freie Automatisierungssoftware Hammerspoon installiert. Mit Hilfe von Lua-Skripten kann ich über Tastatur-Kurzbefehle und sonstigen Triggers die Lampe fernsteuern. Folgende Codeschnippsel verwende ich dazu:

Fernsteuerung

Der Einfachheit halber ist der Shelly innerhalb meines Netzwerkes ohne Authentifizierung erreichbar. Ein einfacher POST-Request auf die RPC-Schnittstelle reicht:

local shellyUrl = "http://shelly1pmminig4-xxx.local/rpc"

--- Power light light on or off
function powerLight(on)
  if on then
    hs.http.post(shellyUrl, hs.json.encode({
      id = 1,
      method = "Switch.Set",
      params = { id = 0, on = true }
    }))
  else
    hs.http.post(shellyUrl, hs.json.encode({
      id = 1,
      method = "Switch.Set",
      params = { id = 0, on = false }
    }))
  end
end

Benutzer am Laptop?

Die idleTime war für mich die solideste Methode um einen anwesenden User zu detektieren:

--- Check if a user is logged in, i.e. not idle
function isUserLoggedIn()
  return hs.host.idleTime() < 300
end

Laptop am Arbeitsplatz?

Die Überprüfung der angeschlossenen Monitore war weniger zuverlässig als die des Thunderbolt-USB-C-Docks:

local dockName = "USB3.2 Hub"
local dockVendor = "GenesysLogic"

--- Check if my Thunderbolt dock is connected
function isDockConnected()
    local usbDevices = hs.usb.attachedDevices()
    
    for _, device in pairs(usbDevices) do
        if device["productName"] == dockName and device["vendorName"] == dockVendor then
            return true
        end
    end
    
    return false
end

Tag oder Nacht?

Hammerspoon bringt netterweise bereits Methoden zur Berechnung des Sonnenauf- und Untergangs mit:

local homeLat = 47
local homeLon = 7.5

--- Check if the sun is up here
function isSunUp()
  local currentTime = os.time()
  local sunrise = hs.location.sunrise(homeLat, homeLon, currentTime)
  local sunset = hs.location.sunset(homeLat, homeLon, currentTime)
  
  -- Add 30 minutes (1800 seconds) to sunrise and subtract 30 minutes from sunset
  local adjustedSunrise = sunrise + 1800
  local adjustedSunset = sunset - 1800

  return currentTime >= adjustedSunrise and currentTime <= adjustedSunset
end

Und jetzt alles zusammen…

Alle fünf Minuten wird der aktuelle Zustand überprüft:

--- Check the light from time to time
lightCheckTimer = hs.timer.new(300, function()
    determineLightPower()
end)
lightCheckTimer:start()

--- Determine Light power state by current conditions
function determineLightPower()
    print("Determining light power state...")

    --- No user? No light.
    if not isUserLoggedIn() then
        print("No user logged in. Turning off light.")
        powerLight(false)
        return
    end

    print("User logged in.")

    --- No dock? Not at the office, no light.
    if not isDockConnected() then
        print("No dock connected. Turning off light.")
        powerLight(false)
        return
    end

    print("Dock connected.")

    local isSunUp = isSunUp()
    print("Is sun up? " .. tostring(isSunUp))
    
    powerLight(not isSunUp)
end

Fazit

Die Lampe funktioniert gut genug. Beim Schlafenlegen und Aufwecken des Laptops gibt es einige Unschönheiten, auch beim Aufwachen des Systems in der Nacht für Update-Arbeiten. Aber mit zusätzlichen Tastatur-Kurzbefehlen zur Steuerung der Lampe via Hammerspoon und mit dem manuellen Taster ist die Situation kontrollierbar. Und braucht schlussendlich weniger manuellen Aufwand als eine dumme Lampe. Ich bin ganz zufrieden damit.

Rätselparcours #6: Teenager / Zeit

K1 wurde 13 und ist jetzt offiziell ein Teenager. Aber er ist noch nicht zu cool für einen kleinen Rätselparcours am frühen Morgen vor der Schule. Informelles Thema ist Zeit.

Schritt 1: Karte

Glückwunschkarte von A und mir
Der 13. Kuchen folgt später

Eine Karte liegt auf dem Zmorgentisch voller Geburtstagsglückwünschen von A und mir, mit den Schlussworten:

Und jetzt schnell auf die Suche! Wann beginnt laut Stundenplan schon wieder die Schule?

Schritt 2: Uhr

Schul-Infowand

An unserer Schulinfowand versteckt sich hinter K3’s Stundenplan eine Papier-Uhr.

Papieruhr

Die Papieruhr besteht aus drei Schichten: Zuunterst ein Zifferblatt, dann eine Zwischenblatt mit zwölf Bildern von Verstecken in der Wohnung, dann ein Deckblatt mit einer ausgeschnittenen Lücke. Daran angeklebt eine Minutenzeiger (Am Zwischenblatt) und ein kürzerer Stundenzeiger (Am Deckblatt.) Alle ausgedruckt auf festem Papier von 120 g/m² und auf Fotopapier, letzteres rutscht etwas besser und die Uhr lässt sich so einfach einstellen. Eine einfache Rundkopfklammer in der Mitte hält alles zusammen.

Zwischenblatt mit Verstecken

Ich habe für das Zwischenblatt zwölf Fotografien in Apple Pages eingefügt, den Hintergrund entfernen lassen und angeordnet. Etwas schöner wäre es noch gewesen, jedes Bild in Richtung Mitte auszurichten, aber das ging unter.

Damit bei der Zielzeit das richtige Bild in der Lücke angezeigt wird habe ich gar nicht gross überlegt und habe einfach die Zeiger erst nachträglich angeklebt.

Ein Problem war trotzdem die Position der Bilder: Platziert man für die Uhrzeit 07:30 den Stundenzeiger auf 7 oder etwas weiter zwischen 7 und 8, so wird bereits das falsche Bild angezeigt. Ein Lösungsansatz: Nur sechs bis acht Bilder platzieren.

Schritt 3: Schlüssel

Schlüssel

Am Zielort, dem Velo, hängt kommentarlos ein Schlüssel unter dem Sattel. Nach etwas überlegen identifiziert K1 diesen als den Schlüssel zu seinem Sekretär.

Schritt 4: Wordle

QR-Code im Sekretär versteckt

In der Schublade liegt eine Karte mit einem QR-Code, welcher auf ein bestimmtes Wordle-Rätsel auf Wordly.org verweist. Auf dieser Seite erhält man nach Eingabe eines gewünschten Lösungswort einen Link auf das dazugehörige Rätsel.

Den QR-Code habe ich abermals mit QR Code AI Art Generator versucht zu verschönern und ausgedruckt.

Das Lösungswort verweist auf…

Schritt 5: Magische Zeitlinie

Magic-Kartenbox in einer Schublade, zu gross um sie zu schliessen

…den Esstisch, in dessen Schublade sich eine Schachtel befindet.

Üblicherweise teste ich alle Schritte des Parcours ausführlich, hier hatte ich es nicht getan und bin prompt in ein Problem gelaufen: Die Schachtel war zu gross für die Schublade. Zu diesem Zeitpunkt konnte ich den Ablauf aber nicht mehr ändern und konnte mich (erfolgreich) auf die Unaufmerksamkeit meiner Kinder verlassen: Ich liess die Schublade offen.

Die Schachtel ist das 3d-gedruckte Modell Versatile TCG Deck Box, unten schön glänzendes PETG, oben goldenes PLA.

K1s Magickarten

In der Schachtel befinden sich sechs selbstgestaltete Magickarten mit Bildern zu signifikanten Ereignissen in K1s Leben: Geburt, erster Skitag, erster Schultag, letzter Coiffeurbesuch etc. Die Kartentexte sind frei fabuliert und ähneln Magic-Regeln. Z.B. der Meister-Skifahrer:

Nichts kann dich aufhalten. Du bist unblockbar.

Die Karten habe ich im Gegensatz zum letzten Mal einfach mit Magic Card Maker online erstellt, auf Fotopapier ausgedruckt und auf bestehende Magickarten geklebt. Eingesleevet sehen sie perfekt aus.

Zeitlinien-Rätsel

Ein Begleitzettel gibt Hinweise auf den weiteren Verlauf: Als erstes soll K1 die Karten in die chronologisch richtige Reihenfolge bringen. Als zweites das Lösungswort finden: In jedem Kartentitel ist jeweils ein Buchstabe rot eingefärbt. Zusammengesetzt ergibt es den Namen von K1’s Lieblingsfussballerin. Und das war bereits da Lösungswort für den Cryptex aus dem letztjährigen Rätselparcours.

Schritt 6: Roter Hering

Offener Cryptex

Aber dabei handelte es sich nur um eine falsche Fährte. Im Cryptex versteckt findet sich eine Nachricht, welche nochmals auf die exakte Formulierung des Hinweise hinweist: Was steckt dahinter?

Schritt 7: Was steckt dahinter?

Versteck in der Handyhülle

Des Rätsels echte Lösung: K1 hat seine Handyhülle hinten mit einem Sticker seiner Lieblingsfussballerin verziert. In der Hülle hinter dem Handy habe ich den letzten Hinweis versteckt: Eine Karte auf Fotopapier gedruckt und zugeschnitten, mit dem absolut ersten Bild von K1 als Frischgeborener. Darauf die Frage: Wann wurdest du schon wieder genau geboren?

Abschluss: Uhr – Reprise

Geschenk versteckt in der Küche

Seine Geburtszeit wusste K1 zufälligerweise, stellt sie erneut in der Papier-Uhr aus Schritt 2 ein und fand am neuen Zielort sein Geschenk.

Ein weiterer Erfolg!

„I have no memory of this place.“

(Quelle)

Aus aktuellem beziehungstechnischen Anlass haben A und ich in meinem digitalen Kalender fast zwei Jahrzehnte nach hinten geblättert. Mein Archiv geht zurück bis April 2006:

Bildschirmaufnahme Terminkalender, erster Termin am 19.04.2006

An dieses Abendessen kann ich mich nicht erinnern, aber immerhin kenne ich die Personen auf der Gästeliste noch.

Viele Termine aus den nächsten Jahren geben mir hingegen Rätsel auf: Wer oder was war „T.J.“? Wer war Simone zu deren Geburiparty ich in Fällanden eingeladen war? (Fällanden tönt eher nach Norwegen…) War ich wirklich innerhalb einer Woche an einem Sigur Rós-, einem Massive Attack– und einem Sting-Konzert? Warum gibt es da ein „Weihnachtsessen V1“ und keine weiteren Versionen? Und was zum Teufel habe ich beim Termin „Mord Dings“ gemacht?

Und selbst wenn ich mich an die Ereignisse von vor 10 oder mehr Jahren erinnere, sind in meinem Gedächtnis doch kaum mehr Details vorhanden.

Wenigsten nahm ungefähr damals die Handyfotographie Einzug in meinem Leben. So dass nicht all diese Moment wie Tränen im Regen verfliessen.

Persönliche Mobilitätsstatistik September 2025

Die Challenge Cyclomania ruft jährlich zur Erfassung der eigenen Mobilität auf, mit Fokus auf Velo- und Fussverkehr. Mit einem Punkte- und Preissystem wird die Datenerfassung gamifiziert. Die getrackten Strecken fliessen anschliessend (hoffentlich) in die Verkehrsplanung der beteiligten Gemeinden ein.

Für ein solches Projekt werfe ich gerne meine Datenschutzbedenken über den Haufen und lasse mich einen Monat lang orten. Das Resultat:

Cyclomania Mobilitätsstatistik September 2025

Zur Erläuterung: Drei normale Arbeitswochen machen bei mir 120 km Velofahrt aus. Dazu kommt eine Ferienwoche mit etwas Wandern im Jura, in welche wir mit dem Auto gefahren sind (Nicht ganz 100% getrackt). Und dann noch ein Konzertbesuch mit dem Zug in Milano, welchen ich nur bis zur Grenze erfasst habe.

Keine statistische Überraschung für mich.

(Vergleiche auch den Beitrag: Meine persönliche Mobilitätsstatistik 2022-2023)

Kurzkritik: Game Changer

Mit Improtheater habe ich persönlich nicht so viel am Hut, das ziellose Theatern finde ich, nun, ziellos. Zweifellos amüsant die ersten zwei, drei Mal, aber danach habe ich es gesehen.

Die Improshow Game Changer hingegen finde ich endlos unterhaltend. Praktisch jede Folge wartet mit einem neuen Konzept auf, massgeschneidert auf die Kandidaten, und ja, zusammengeschnitten für maximale Effizienz. Ich kann mich gar nicht sattsehen davon.

Game Changer läuft auf dem Nischen-Streamingdienst Dropout welchen ich bereits seit über zwei Jahren abonniere. Einzelne Folgen sind auf YouTube gratis zu sehen.

(Wer mir einen besonderen Gefallen tun will, organisiert mal ein Überraschungs-Escape-The-Greenroom für mich.)

Kurzkritik: Neal Stephenson – Snow Crash

"Snow Crash" Taschenbuch abgenutzt

Vor 20-30 Jahren habe ich mir diese Ausgabe von Neal Stephensons Snow Crash gekauft und seither x-mal gelesen. Eigentlich sollte es das Cyberpunk-Genre parodieren, macht aber dermassen Spass, dass es zum Cyberpunk-Klassiker wurde. Überdrehte Action, visionäre Ideen und viel Sumerische pseudowissenschaftliche Linguistik.

Das Buch dient mir immer wieder mal als leichte Sommerlektüre. Freue mich schon auf die nächste Runde.

Rätselparcours #5: Sport

K2 wurde 8 und wünschte sich einen Rätselparcours zum Thema Sport. Leider hatte die Hitzewelle in den vorangegangene Wochen meine intellektuelle Kapazität dahinschmelzen lassen. So beschränkte ich mich auf eine eher kurze Variante.

Schritt 1: Gedicht

Postkarte von Büro Destruct: Eisbären
Klimatologisch „passende“ Postkarte vom Büro Destruct.

Mein mittlerweile klassischer Parcourseinstieg: Ein selbgedichtetes Gedicht auf einer Postkarte.

Liebe K3, jetzt bist du schon 8!
Du hast es schon weit gebracht,
Dich viel bewegt und gelacht.
Was aber hast du noch wenig gemacht?

  • Fussball spielen
  • Klettern im Baum
  • Box-Sack boxen

Schritt 2: Linienrätsel

Boxsack mit versteckten Couvert
Findest du das versteckte Couvert?

Im Keller hängt ein Boxsack an welchem K3 bisher kaum Interesse gezeigt hat. Daran klebt mit schwarzem Klebeband überklebt ein Couvert mit dem nächsten Rätsel:

Fussball-Linienrätsel

Wie bereits erwähnt hat die Hitze meine Kreativität beeinträchtigt. Als direkte Konsequenz habe ich an dieser Stelle ein Rätsel 1:1 aus einem Rätselbuch meiner Kinder kopiert, im Bildeditor Acorn eine Fotomontage daraus gemacht und ausgedruckt. Von Hand habe ich jeden der Fussbälle mit einem potentiellen Ziel ergänzt (Dusche, Bett, Schrank etc.).

Die korrekte Linie führte zum…

Schritt 3: Welcher Buchstabe passt nicht?

Couvert versteckt im Töggelitisch
Goal!

… versteckten Couvert im Goal des Töggelitisch draussen.

Für dieses Rätsel habe ich auf Wikimedia Commons frei verfügbare Bilder gesucht, heruntergeladen und in MacOS Vorschau-App mit der Funktion Hintergrund entfernen freigestellt. Die Seite gestaltete ich in Apple Pages und druckte sie aus.

Die Bilder nehmen teilweise Bezug auf unser privates Umfeld. Eigentlich wäre es ein Einfaches gewesen, hier das gewünschte Sport-Thema stärker einzubauen, aber eben, es war zu heiss.

Die falschen Buchstaben zusammengesammelt ergaben das nächste Lösungswort.

Schritt 4: Verstecktes Ticket

3d-gedruckter Fussball in der Murmelbahn

In der Märmelibahn lag ein auffälliger Fussball. Mit etwas Geschick liess sich der Fussball öffnen und darin lag noch eine kleinere Version des Fussballs. Und in diesem dann ein Billet mit dem Hinweis wo es mit der Suche weitergeht.

Ticket im Fussbal versteckt

Die Fussbälle sind 3d-gedruckt mit weissem PLA mit Hilfe eines existierenden Modells. Die schwarzen Felder sind von Hand mit Modellbaufarbe aufgemalt. Das Ticket habe ich irgendwo aus dem Internet übernommen und mit Apple Pages angepasst, schlussendlich auf dickem Papier ausgedruckt und ausgeschnitten.

Kleiner Patzer meinerseits: Meine 8-jährige Tochter konnte das viereckige Ding nicht als Billet identifizieren. Sie ist wohl zu jung: Die letzten Kartonbillets wurden bei der SBB 1986 gedruckt.

Schritt 5: Gondelbahn

Gondelbahn aus Lego

Auf dem Balkon hing aufgehängt an einer langen Schnur, ganz unten im Garten, eine Gondel. Ein auffälliger Griff aus Lego lud K3 ein die Kabine hoch zum Balkon zu ziehen. In der Gondel befanden sich neben ein paar Passagieren ein kleiner Zettel…

Beim Bau der Gondel hat mich übrigens K2 tatkräftig unterstützt. Und K1 half beim Spannen der Schnur.

Schritt 6: Emoji-Rätsel

Auf dem Zettel gedruckt war eine Reihe von Emojis:

🌳 🦔 🎈💡 🦔 👂 🎺 🏠 🫏 🐮

Sie fand schnell heraus dass die Anfangsbuchstaben der abgebildeten Gegenstände ein Wort ergeben.

Abschluss

K3's Bibliothek
Geschenk hier nicht abgebildet

In K3’s Zimmer steht eine Kinderbibliothek, in der ich ihr Geschenk versteckt hatte. Sie war happy mit Parcours und Geschenk.

Ich persönlich fand, dass ich einfach das Thema besser einbauen hätte können. Vielleicht ein andermal. K3 hatte es nicht gestört.