Im Blog von Rahix findet sich geballtes Know-How zum Thema Design für 3d-Druck.
Handgeschrieben, deshalb kompakt.
Im Blog von Rahix findet sich geballtes Know-How zum Thema Design für 3d-Druck.
Handgeschrieben, deshalb kompakt.

Wann immer ich ein Gerät entsorge, behalte ich das Netzteil. Ich konnte immer wieder eines davon wiederverwenden.
In den letzten Jahren ist eine beträchtliche Sammlung entstanden. Dafür gehen mir jetzt langsam tatsächlich die USB-Netzteile aus.
Frage: Warum ist die essentielle Angabe – die Spannung in Volt – nur immer so klein aufgedruckt?
Meine favorisierte Passwortverwaltung Bitwarden hat vor Kurzem die Möglichkeit zur SSH-Schlüsselgenerierung direkt im Safe eingeführt.
Ich habe mein Skript secrethubwarden zur Synchronisierung von Bitwarden-Secrets zu GitHub-Secrets entsprechend um die SSH-Schlüssel-Option erweitert.
Das Skript hatte ich 2021 hier vorgestellt und habe es immer noch produktiv im Einsatz.

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.

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.

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.

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.

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.

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.

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.

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.
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:
Nur wenn alle drei Bedingungen erfüllt sind, soll sich die Lamp einschalten. Andernfalls ausschalten.
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.
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:
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
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
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
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
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
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.
Die Metadaten meiner Wetter-APIs (Stationen & Parameter) biete ich unter anderem auf der Seite API-Datasette an. Das ist eine kleine Webapplikation welche SQLite-Datenbanken auf mannigfaltige Arten und Weisen darstellt und durchsuchbar macht. Jede Tabelle wird aus verschiedenen Perspektiven visualisiert, gefiltert, sortiert, arrangiert, facetiert etc. Datasette kommt aus dem Datenjournalismus und ist im Bereich Open Data sehr beliebt.
Letzthin ist mir aufgefallen, dass die API-Datasette überdurchschnittlich viel Systemleistung meines Servers beansprucht. Bei der Kontrolle in den Log-Dateien fand ich die Ursache: Zahlreiche KI-Bots, welche konstant das Internet zum Füttern ihrer Modelle abgrasen, haben die API-Datasette gefunden und kommen jetzt nicht mehr raus: Die zahlreichen Darstellungsarten der Tabellen führen zu Millionen von kombinierten Links welchen diese Bots allesamt folgen.

Ich bin halb amüsiert und halb wütend: Da jede KI-Firma ihre eigenen Bots losschickt, sind es dutzende Bots welche in dieser Teergrube feststecken. Auf der anderen Seite ist das eine unglaubliche Ressourcenverschwendung! Sowohl an elektrischer Energie wie auch an mentaler Energie für Personen, welche öffentliche Systeme betreiben.
Dank der rapide steigenden Temperaturen von Luft & Wasser habe ich heute meine persönliche Aare-Schwumm-Saison 2025 eröffnet. Das letztjährige Motto No Nid Einisch wird sich nicht nochmals wiederholen.
Für die neue Statistikseite vom Aare.guru benutzen wir die neue API-Methode history. Wassertemperatur, Abfluss und Lufttemperatur können über jahrzehntelange Zeitperioden abgefragt werden. Die zurückgegeben Frequenz (10 Minuten, Stunden- oder Tageswerte) wird dabei automatisch anhand des abgefragten Zeitraumes gewählt.
Je nach Standort sind über 20 Jahre Daten verfügbar!
Intern werden die Daten aus der Existenz-InfluxDB geliefert, hier einfach etwas einfacher abzufragen.
Apropos Langzeitarchiv: Ich bin daran, das neue OGD-Datenarchiv der MeteoSchweiz (Mai 2025) in die InfluxDB zu importieren. Geplant ist es die wie bis anhin angebotenen Hauptparameter des Bodenmessnetzes SwissMetNet rückwirkend vom Jahr 2000 bis zur Gegenwart zu importieren. Wenn diese Arbeiten abgeschlossen sind werde ich hier informieren.
Ein grosses Lob an die MeteoSchweiz für deren seriösen OpenData-Effort.
Die Guild42 hat mich eingeladen, mein Webinar vom Dezember 2021 zu aktualisieren und erneut vorzutragen. Dieses Mal vor einer Live-Audienz.
Wenn du mit dabei sein möchtest: Am 1. September 2025, 18:00 im Best Western Hotel Bern. Eintritt frei. Anmeldung erforderlich auf Meetup.com.
Birebitzeli nervös bin ich schon.
Unser Grafiker Käspu hat die miserable letztjährige Saison (Ständig zu viel Wasser…) wieder in Plakatform verewigt, erhältlich in unserem Onlineshop oder in seinem Plakatkeller.
Gute Nacht und guten Schwumm.
Wieder etwas Nostalgie und zusätzlich fast ein Jahr zu spät: Letztes Jahr war das 40 jährige Jubiläum seit der ersten Ausgabe der Computerzeitschrift 64er. Das Heft beschäftigte sich mit dem Homecomputer Commodore 64, meinem ersten Computer überhaupt. Sowohl das Gerät wie auch das Magazin haben deshalb einen speziellen Platz in meinem Herzen.
Zu diesem Jubiläum haben sich eine Gruppe von Enthusiasten etwas besonderes ausgedacht: Mit exakt 40 Jahren Verzögerung publizieren sie die Artikel erneut online: https://www.64er-magazin.de
Sehr cool.
Die Schweizer Finanzapp-Lösung ist eine Erfolgsgeschichte. Seit ihrer Lancierung und der überraschenden und erfolgreichen Fusion mit der damaligen Konkurrenz Paymit im Jahr 2016 ging’s nur noch nach oben. Über 5 Millionen Benutzer, unzählige Onlineshops, Hofläden und Opferstöcke, die beliebteste Marke der Schweiz. Ein Erfolg reiht sich an den anderen.
Jetzt kann es eigentlich nur noch abwärts gehen. Tatsächlich scheinen sich neue Funktionen in den Apps weg von Nützlichem hin zu Gamifizierung und Rabattaktionsshop zu entwickeln. Das könnte man ja noch ignorieren.
Aber diesen Monat lancierte Twint Zahlungslinks. Und bewegt sich damit auf sehr dünnes Eis: Derartige Links sind Einfallstor für die meisten Scam- und Phishingversuche auf Plattformen wie Ricardo und Tutti. Regelmässig versenden Betrüger gefälschte Links und versuchen damit an Logininformationen zu kommen. Und sind dabei immer und immer wieder erfolgreich. Und die betroffenen Personen erhalten danach kaum Unterstützung von den Finanzinstituten.
Das Bundesamt für Cybersicherheit BACS verzeichnet jährlich zehntausende gemeldete Phishingversuche.
Twint scheint mit den Zahlungslinks da jetzt auch mitmachen zu wollen und legt schon mal wie erwartet vor: Auf der entsprechenden Webseite erscheint das Wort „Sicherheit“ oder „Schutz“ kein einziges Mal. Phishing wird ironischerweise nur in einer Warnmeldung ganz oben erwähnt.
Ich fürchte damit handelt sich Twint unnötig massive Probleme ein und könnte auf der Marken-Beliebtheitsskala schon bald wieder von irgendwelchen Pommes-Chips-Produzenten überholt werden.
Aktuell deaktivieren viele Hoster die veraltete PHP Version 7 und stellen auf PHP Version 8 um. Das führt dazu, dass gewisse Codezeilen Fehlermeldungen und Warnungen provozieren können (Deprecation-Notices). Wer wie ich nicht alle WordPress-Plugins auf der neuesten Version am Laufen hat, bekommt diese plötzlich angezeigt oder aber einzelne Seiten, z.B. Produkteseiten in Woocommerce, werden nur noch fehlerhaft dargestellt..
Diese Notices führen nicht zwangsläufig dazu, dass die Seite nicht mehr funktioniert und werden deshalb vom WordPress-internen Fehlermanagement nicht abgefangen. Die Standardeinstellungen von WordPress aber verstecken die Fehlermeldungen. Das Resultat ist unschön: Eine halb funktionierende Seite.
wp-config.php im obersten Verzeichnis von WordPress zum Editieren öffnen. Bei Unsicherheiten zuerst eine Sicherheitskopie der Datei anfertigen.define( 'WP_DEBUG', false); suchen (Oder im oberen Teil einfügen) und den Wert von false auf true ändern.define( 'WP_DEBUG', false); wieder auf false zurück wechseln.Temporär kann die PHP Version je nach Hoster noch für eine Übergangsfrist auf die veraltete Version 7 hinuntergesetzt werden. Längerfristig ist ein Update der WordPress-Instanz & -Plugins unabdingbar.
Wer als Werkzeug nur eine SQL-Datenbank hat, sieht in jedem Problem relationale Daten.
Aus der alten Architektur von meiner OpenData-Seite api.existenz.ch ist eine isolierte PHP-Bibliothek zum Speichern und Abfragen von Zeitreihen entstanden: MyTS (My Time Series).
Da auf dem verwendeten Shared Hosting nur eine MySQL-Datenbank zur Verfügung steht, lagern die aktuellen Daten dort relational und besser verfügbar als mein Langzeit-Datenarchiv auf InfluxDB.
Das spannende Details hier: Für das Unittesting mit einer echten Datenbank wird in den GitHub Actions ein eigener Datenbankcontainer hochgefahren.