8e39a1f23c6bd43b1846db0479a8b20c4d7b05f5
1. **Method Signature Update**: Added `bool active` parameter to `updateHint()` method across the display driver hierarchy: - `DisplayManager::updateHint(x, y, active)` - delegates to driver - `DisplayDriverTFT::updateHint(x, y, active)` - override implementation - `DisplayDriverGFX::updateHint(x, y, active)` - override implementation 2. **Code Formatting**: `DisplayManager.h` reformatted (whitespace/comment style changes only) - **Breaking Change**: All existing `updateHint(x, y)` calls will fail to compile until updated to include the `active` parameter - **Enhanced Control**: Callers can now explicitly show/hide touch hints rather than just updating position, enabling better touch feedback UX (e.g., hide hint on touch release) - **API Consistency**: All implementations in the driver hierarchy now enforce the same signature
Klubhaus Doorbell
Multi-target doorbell alert system powered by ntfy.sh.
Targets
| Board | Display | Library | Build Task |
|---|---|---|---|
| ESP32-32E | SPI TFT (ILI9341 etc.) | TFT_eSPI | mise run compile-32e |
| ESP32-S3-Touch-LCD-4.3 | 800x480 RGB parallel | Arduino_GFX | mise run compile-s3-43 |
Quick Start
-
Install prerequisites: arduino-cli (with esp32:esp32 platform) and mise.
-
Edit WiFi credentials:
cp boards/esp32-32e/secrets.h.example boards/esp32-32e/secrets.h cp boards/esp32-s3-lcd-43/secrets.h.example boards/esp32-s3-lcd-43/secrets.hThen edit both secrets.h files with your WiFi SSIDs and passwords.
-
Build and upload:
mise run compile-s3-43 mise run upload-s3-43 mise run compile-32e mise run upload-32e
Project Structure
.
├── libraries/
│ └── KlubhausCore/ Shared Arduino library
│ └── src/
│ ├── KlubhausCore.h Umbrella include
│ ├── Config.h Shared constants
│ ├── ScreenState.h State enums / structs
│ ├── IDisplayDriver.h Abstract display interface
│ ├── DisplayManager.h Thin delegation wrapper
│ ├── NetManager.* WiFi, NTP, HTTP
│ └── DoorbellLogic.* State machine, ntfy polling
├── boards/
│ ├── esp32-32e/ ESP32-32E sketch
│ │ ├── esp32-32e.ino
│ │ ├── board_config.h
│ │ ├── secrets.h (gitignored)
│ │ ├── tft_user_setup.h
│ │ └── DisplayDriverTFT.*
│ └── esp32-s3-lcd-43/ ESP32-S3-LCD-4.3 sketch
│ ├── esp32-s3-lcd-43.ino
│ ├── board_config.h
│ ├── secrets.h (gitignored)
│ └── DisplayDriverGFX.*
├── vendor/ Per-board vendored display libs
│ ├── esp32-32e/TFT_eSPI/
│ └── esp32-s3-lcd-43/GFX_Library_for_Arduino/
└── mise.toml Build harness
Serial Commands
Type into the serial monitor at 115200 baud:
| Command | Action |
|---|---|
| alert | Trigger a test alert |
| silence | Silence current alert |
| dashboard | Show dashboard screen |
| off | Turn off display |
| status | Print state + memory info |
| reboot | Restart device |
Architecture
Each board target gets its own sketch directory with a concrete IDisplayDriver implementation. The shared KlubhausCore library contains all business logic, networking, and the abstract interface. Arduino CLI's --libraries flag ensures each board only links its own vendored display library -- no preprocessor conflicts.
Board sketch (.ino)
|
+-- #include <KlubhausCore.h> (shared library)
| +-- DoorbellLogic (state machine + ntfy polling)
| +-- NetManager (WiFi, HTTP, NTP)
| +-- DisplayManager (delegates to IDisplayDriver)
| +-- IDisplayDriver (pure virtual interface)
|
+-- DisplayDriverXxx (board-specific, concrete driver)
+-- links against vendored display lib
(TFT_eSPI or Arduino_GFX, never both)
Description
Languages
C++
79%
C
10.1%
Shell
8.2%
Python
2.7%