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.

Velo 2.0 aufgetaucht

Im wahrsten Sinne des Wortes.

Vor kurzem fand ich an meinem Velo 2.0, welches mir im Oktober 2008 gestohlen wurde. Unverschlossen, mit abgeblättertem Lack, rostiger Kette und fehlender Vignette, stand es plötzlich vor mir.

Gewissenhaft wie ich bin, telefonierte ich mit Polizei und Versicherung um das weitere Vorgehen abzusprechen. Allerdings hat mich der Aufwand in diesem Moment abgeschreckt. Kombiniert mit dem schlechten Zustand des Velos, entschloss ich mich in diesem Moment, es stehen zu lassen.

Einmal darüber geschlafen, habe ich meine Einstellung bereut: Nein, ich hatte zu viele Umtriebe in der Vergangenheit und will das Ding zurück, egal wie es aussieht.

Leider stand es nicht mehr dort. Pech, dachte ich, und ging meines Weges.

Eine Woche später bekomme ich einen Anruf der Kantonspolizei Bern (Welcher mich im ersten Moment nervös überlegen lässt, was ich wohl wieder derart verpennt haben könnte, dass die Polizei involviert wurde): Die Feuerwehr hat mein Velo 2.0 aus einem Bach gefischt und der Polizei übergeben, welche über die Rahmennummer und der Diebstahlsanzeige mich ausfindig machen konnte. Schnell war die Sache mit der Versicherung geklärt – sie hat kein Interesse an einem alten, rostigen Velo – und ich bin wieder im Besitz meines Velos 2.0.

Ein Besuch beim Velomech um die Ecke liess mich die anfallenden Arbeiten in etwa abschätzen: Die gebrochene Gabelstange muss ersetzt, die Bremsklötze ausgewechselt, neue Beleuchtung montiert und der Sattel repariert werden. Die Kette hatte zwei Jahre lang kein Öl gesehen. Dank der vielen Reparaturen an meinem Billig-Velo 3.0 hatte ich genügend Erfahrungen gesammelt (Und auch etwas Freude daran): Bis auf die Gabelstange konnte ich alle Defekte in wenigen Stunden Arbeit selbst beheben.

Möge mir mein Velo 2.1 lange erhalten bleiben.

iPad zum Ausschneiden

20091028_ipad

20100128_ipad.pdf

Weil ich mir die Dimensionen schlecht vorstellen kann, habe ich aus einem Foto von der Apple Webseite ein Papier-iPad als PDF gebastelt. Ausgedruckt und ausgeschnitten, vermittelt es einen ersten Eindruck.

Mein Verbesserungsvorschlag wäre noch sieben Tafeln Schoggi hintendran zu kleben, um auch das Gewicht realistisch erscheinen zu lassen.

Sneak Peek: Unser 3D-Drucker ist da

20091016_makerbot_box1

Zwei Monate nach meiner Entdeckung des Open-Source-Bausatzes für einen kleinen 3D-Drucker ist es soweit: Das Paket ist gestern angekommen. Zusammen mit Thomas S. und Fabian P. werde ich in den nächsten Tagen/Wochen/Monaten mich an das Zusammenbauen machen.

Höhepunkte werde ich hier im Blog veröffentlichen.

USB-Lego

Spontane Bastlerei spät am Abend: Mein winziger USB-Key flog auseinander und schreite förmlich nach einem neuen Gehäuse. Mein Blick auf einen herumliegenden Legostein:

20090702_usb

Dabei habe ich drei Dinge gelernt:

  • Dremel machen noch immer Spass. Handstaubsauger noch mehr.
  • Der wichtigste und meistbenutzte und universalste Dremelaufsatz ist die Gravierspitze.
  • Lieber Brille tragen als Kontaktlinsen beim dremeln.

Links zum Wochenende: Do-It-Yourself

Get Excited And Make ThingsDer seit einigen Jahren in den USA populäre Trend zum Selbermachen & Basteln in allen Lebensbereichen wird vor allem durch das Magazin Make vorangetrieben und auf Seiten wie Instructables zelebriert. Immer nach dem Leitspruch: Void Your Warranty!

Jetzt scheint dieser Trend auch in der Schweiz angekommen zu sein: Zuerst mit einem NZZ-Folio zum Thema Do It Yourself. (Den Inhalt fand ich leider weniger interessant als nur schon das Titelbild.)

Und jetzt mit der Vorschlag der Städte Bern & Thun doch lieber zu reparieren anstelle von wegwerfen.

Es ist wieder an der Zeit ein paar neue Projekte auf meine Pendenzenliste zu schaufeln…

Dog-Spielplan für 4 Spieler

Um mein diesjähriges Weihnachtsgeschenk an mich selber (Ein Dremel) auszuprobieren, bin ich daran mir ein eigenes Dog-Brettspiel zu basteln. Dog ist ein taktisches Eile-Mit-Weile mit reduzierten Glücksfaktor und macht enorm Spass.

Als ersten Schritt habe ich meinen eigenen Spielplan gestaltet, den ich hier veröffentlichen möchte. Er eignet sich als Bastelvorlage oder als Papierplan zum Ausdrucken:

Die Regeln finden sich ebenfalls unter Dogspiel.info. Eine 6-Spielervariante könnte hier noch folgen. Und falls aus dem Bastelprojekt tatsächlich was ansehnliches werden sollte, werde ich Bilder davon ebenfalls hier publizieren.

Update: Klangspiel.ch führt ausführlichere Regeln.