Skip to content

HU-058: Günstige ESPHome WiFi-Uhr

Do-It-Yourself Hardware Heimautomatisierung
Hero-Bild

Manchmal gibt es so Zufälle. Mir ist schon ein paar Mal aufgefallen, dass ich nachts die Uhrzeit auf Telefon und Smartwatch nur schwerlich ohne Brille erkennen kann. Und dann guck ich ein Video von Adrian’s Digital Basement, in dem er genau das gleiche Problem beschreibt und mit einem DIY-Kit aus China und einem ESP32 und ESPHome löst. Einen ESP32-C3 hatte ich auch noch rumliegen. Also hab ich mir das günstigere der beiden Kits (HU-058) für ~8€ bestellt, um so eine Uhr fürs Schlafzimmer nachzubauen.

Als ich das Kit erhalten habe, habe ich mir erstmal Adrians Github Repository angeschaut. Dabei ist mir sofort aufgefallen, dass hier garantiert KI am Werk gewesen ist. Das verschweigt er auch nicht in der README, aber die Struktur der Doku, und die Art und Weise haben meine Spinnensinne sofort kribbeln lassen. Wenn Du einmal mit KI vibecoding betrieben hast, kannst Du das nicht mehr nicht erkennen…

HU-058 Kit vorbereiten

In der wiring.md beschreibt er, welche Teile des HU-058 Kits benötigt werden und welche nicht – die meisten Bauteile verbleiben in dem Tütchen. Eigentlich brauche ich tatsächlich nur die beiden Taster, die später Automatisierungen in Home Assistant triggern und die µUSB-Buchse für die Stromversorgung.

Flashen der Firmware

Software adaptieren

Kernstück der Software ist die custom_component aip33628, die über je einen data und einen clock Pin die linke und die rechte Seite der Displaysegmente separat ansteuern. Diese beiden SMD-Chips sind beim Bausatz bereits verlötet. So übernimmt der ESP32 die Kontrolle über alle LEDs und macht für diesen Usecase (ohne Pieper und Helligkeitssensor) fast alle Komponenten der HU-058 überflüssig.

Allerdings verwende ich im Gegensatz zu Adrian kein ESP32-WROOM Modul, sondern einen ESP32-C3 Supermini. Einfach, weil der gerade in einer Kiste herumlag und verfügbar war. Außerdem ist er viel kleiner und ich benötige ohnehin nur 8 Pins (inkl. Stromversorgung).

Das macht auf jeden Fall schon mal ein Umbelegen der Pins nötig. Außerdem habe ich ein wohletabliertes Setup mit vielen ESPHome Geräten mit allen interessanten Geheimnissen in einer secrets.yaml. Außerdem habe ich eine gewisse Nomenklatur für Gerätenamen, -beschreibungen etc., sodass ich blockweise Templates aus meinen Bestandsgeräten verwende.

Adrian verwendet SNTP + Home Assistant time zur Zeitsynchronisation. Den Punkt habe ich auch nicht verstanden. Binnen 2-3s nach dem Boot liefert HA eine Zeit samt Zeitzone. Also warum eine 2. Quelle verwenden, für die man die Zeitzone nochmal separat setzen müsste. SNTP fliegt also raus.

Kompilierungsfehler

Beim Kompilieren meiner angepassten Version, bin ich dann aber in einen Kompilierungsfehler gelaufen:

FAILED: esp-idf/src/CMakeFiles/__idf_src.dir/esphome/components/aip33628/aip33628.cpp.obj
ccache /data/cache/idf/tools/riscv32-esp-elf/esp-14.2.0_20260121/riscv32-esp-elf/bin/riscv32-esp-elf-g++ @esp-idf/src/CMakeFiles/__idf_src.dir/esphome/components/aip33628/aip33628.cpp.obj.rsp -MD -MT esp-idf/src/CMakeFiles/__idf_src.dir/esphome/components/aip33628/aip33628.cpp.obj -MF esp-idf/src/CMakeFiles/__idf_src.dir/esphome/components/aip33628/aip33628.cpp.obj.d -o esp-idf/src/CMakeFiles/__idf_src.dir/esphome/components/aip33628/aip33628.cpp.obj -c /data/build/sleepingroom-clock/src/esphome/components/aip33628/aip33628.cpp
In file included from ../src/esphome/components/aip33628/aip33628.cpp:1:
../src/esphome/components/aip33628/aip33628.h:8:10: fatal error: driver/gptimer.h: No such file or directory
    8 | #include <driver/gptimer.h>
      |          ^~~~~~~~~~~~~~~~~~Code-Sprache: HTML, XML (xml)

Das sieht danach aus, dass eine inkludierte Library nicht geladen werden konnte. Auf der Suche im Repo stieß ich auf einen Pull-Request, der den Code auch für die RISCV-ESP anpasst. Diesen habe ich dann adaptiert, bekam aber immer noch den gleichen Fehler. Das ist meine Schuld, weil ich einfach ohne weiteres Nachdenken von der arduino auf die esp-idf Plattform gewechselt bin.

Scheinbar ist der gptimer Teil des arduino Frameworks, muss beim esp-idf aber noch einmal explizit inkludiert werden. Gesagt, getan. Dieser Patch ist nun ebenfalls im Pull-Request mit drin:

diff --git a/esphome/components/aip33628/__init__.py b/esphome/components/aip33628/__init__.py
index d28433a..2ca8f90 100644
--- a/esphome/components/aip33628/__init__.py
+++ b/esphome/components/aip33628/__init__.py
@@ -2,6 +2,7 @@ import esphome.codegen as cg
 import esphome.config_validation as cv
 from esphome import pins
 from esphome.components import time as time_
+from esphome.components.esp32 import include_builtin_idf_component
 from esphome.const import CONF_ID, CONF_NUMBER, PLATFORM_ESP32

 CODEOWNERS = ["@misterblack1"]
@@ -64,6 +65,9 @@ CONFIG_SCHEMA = cv.Schema(


 async def to_code(config):
+    # The display scan uses GPTimer, which ESPHome excludes by default.
+    include_builtin_idf_component("esp_driver_gptimer")
+
     var = cg.new_Pvariable(config[CONF_ID])
     await cg.register_component(var, config)
Code-Sprache: C/AL (cal)

Damit kompiliert die Firmware erfolgreich und die Uhr meldet sich sofort am Home Assistant, um sie einbinden zu können.

Einstellungen der Schlafzimmeruhr

ESP32-C3 auf der HU-058 verlöten

Nun verlöte ich die 8 Pins des ESPs mit dem PCB der Uhr: VCC, GND, die 4 Pins für die LED Ansteuerung und 2 für die Taster.

Und das wars auch schon. USB-Kabel einstecken, die Uhr bootet und zeigt alsbald die Uhrzeit an.

Automatisierungen

Zum Belegen der Buttons habe ich 2 Automatisierungen erstellt, die kurz die Sekunden und die Außentemperatur anzeigen.

- id: '1791126911003'
  alias: 'Schlafzimmeruhr: Außentemperatur anzeigen'
  description: ''
  triggers:
  - trigger: state
    entity_id:
    - binary_sensor.schlafzimmeruhr_button_2
    to:
    - 'on'
  conditions: []
  actions:
  - action: esphome.sleepingroom_clock_show_number
    data:
      value: '{{ states(''sensor.aussentemperatur'') | round(0) | int }}'
      unit: C
      duration: 10000
  mode: single
- id: '1791127515667'
  alias: 'Schlafzimmeruhr: Sekunden anzeigen'
  description: ''
  triggers:
  - trigger: state
    entity_id:
    - binary_sensor.schlafzimmeruhr_button_1
    to:
    - 'on'
  conditions: []
  actions:
  - action: button.press
    metadata: {}
    target:
      entity_id: button.schlafzimmeruhr_show_seconds
    data: {}
  mode: singleCode-Sprache: YAML (yaml)

Außerdem wird die Anzeige nachts auf ein relativ dunkles Rot umgestellt, abends auf „Sonnenuntergang“ und natürlich aus, wenn ich gehe und wieder an wenn ich nach Hause zurückkehre. Aber das ist relativ selbsterklärend, sodass ich das hier nicht explizit niederschreibe. Im Zweifel in meiner automations.yaml nach „Schlafzimmeruhr“ suchen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.