You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 6387563
Browse filesBrowse the repository at this point in the historyBrowse files
feat: Apple HomeKit support (control + Television) via HomeSpan
Pair the player into the Apple Home app over the existing WiFi (no MFi
chip needed). Exposes a "Controls" accessory (play/pause, volume,
button-lock, loop, night-mode, battery) and a "Television" accessory
(power + a Control-Center remote for transport and volume). State is
mirrored back so changes from the buttons or RFID show up in the Home
app. The HomeSpan poll task is pinned to core 0 so it never disturbs the
audio pipeline on core 1; HomeKit-triggered actions are applied on core 1
to avoid cross-core races.
Each device generates its own random pairing code on first boot (stored
in NVS) instead of a shared hard-coded one. A HomeKit section in the web
settings shows the pairing QR + setup code and lets you regenerate the
code, reset the pairing and rename the device/remote. All new UI strings
are translated (de/en/fr).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -119,6 +119,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
119
119
|**Listening statistics**: per-day listening time (today / yesterday / 7 d / 30 d) in a 365-day NVS ring buffer, plus a most-played-cards top list — shown in the info dialog (`GET /info`, `GET /topcards`) |[`af6c8d3`](../../commit/af6c8d3) · [`c2e7d44`](../../commit/c2e7d44)|
120
120
|**Full backup**: export/import all settings + RFID assignments + per-path EQ rules + listening stats as one JSON file; passwords are only included when explicitly ticked, so a shared backup doesn't leak credentials |[`4c90ff4`](../../commit/4c90ff4) · [`646ec5c`](../../commit/646ec5c)|
121
121
|**Home Assistant MQTT discovery**: auto-registers all entities under one HA device — track/status/firmware/WiFi/battery sensors, volume & LED-brightness numbers, lock & ambient-light switches, equalizer select, transport/update/shutdown buttons |[`db73db1`](../../commit/db73db1)|
122
+
|**Apple HomeKit + Siri** (`HOMEKIT_ENABLE`, via [HomeSpan](https://github.com/HomeSpan/HomeSpan)): pair the player straight into the Home app as a bridge with named tiles — **Playback** (play/pause + battery), **Volume** (brightness dimmer) and **Button-lock** — all controllable by Siri and usable in automations. State is mirrored back, so changes from buttons/RFID show up on the iPhone. Each device generates its **own random pairing code** on first boot (persisted in NVS) instead of a shared hard-coded one, so multiple ESPuinos — and everyone running this firmware — stay distinct and private. A dedicated **HomeKit settings section** shows the scannable pairing **QR code** + that setup code and a "reset pairing" button. Pairs over the existing WiFi (no MFi chip needed); the HAP server runs on its own port and the poll task is pinned to core 0 so it never disturbs the audio pipeline on core 1 |_pending_|
122
123
|**Control tab**: Repeat / Sleep-Timer (live countdown) / Night-Mode / button-lock / FTP start-stop and a Bluetooth-mode picker (Normal / Speaker / Headphones) right in the control tab; mobile-optimised (full-width louder/quieter buttons instead of the fiddly slider) |[`88a742c`](../../commit/88a742c) · [`520815a`](../../commit/520815a) · [`d57f24a`](../../commit/d57f24a) · [`aef1765`](../../commit/aef1765)|
123
124
|**Battery-backed RTC (DS3231)**: optional real-time clock on the external I²C bus so the time stays correct without WiFi/NTP (seeds the clock at boot, NTP disciplines it); time + die-temperature in the info dialog and via MQTT/HA |[`bf90f66`](../../commit/bf90f66)|
124
125
|**State-driven control LEDs**: the optional control LEDs can mirror a runtime state (key-lock / repeat mode / Bluetooth / battery level) instead of a static colour, per-slot configurable, with a master mute (command **121** / MQTT `control_leds`) |[`d12a496`](../../commit/d12a496)|
@@ -157,6 +158,10 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
**Apple HomeKit** — pair the player into the Home app straight from the settings: a scannable QR code + the per-device setup code, configurable device/remote names, and regenerate-code / reset-pairing buttons (codes below are placeholders) (_pending_):
162
+
163
+
<divalign="center"><imgsrc="docs/img/feat-homekit.png"width="360"alt="HomeKit settings section with pairing QR, setup code and name fields"></div>
164
+
160
165
**Settings tab** — WiFi / MQTT / FTP / Bluetooth merged with the general settings into one tab, laid out as a vertical UniFi-style sidebar with flat, consistent sections ([`8b01876`](../../commit/8b01876), [`32aabfd`](../../commit/32aabfd)):
161
166
162
167
<divalign="center"><imgsrc="docs/img/feat-settings.png"width="860"alt="Consolidated Settings tab with sub-tabs"></div>
Copy file name to clipboardExpand all lines: html/locales/de.json
+19Lines changed: 19 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -803,5 +803,24 @@
803
803
"lblPlay7d": "Letzte 7 Tage",
804
804
"lblPlay30d": "Letzte 30 Tage",
805
805
"lblTopCard": "Meistgespielt"
806
+
},
807
+
"homekit": {
808
+
"title": "Apple HomeKit",
809
+
"intro": "Füge diesen ESPuino zur Apple-Home-App hinzu, um Wiedergabe, Lautstärke und die Tastensperre per Siri und Automationen zu steuern. Koppelt über dein bestehendes WLAN – ohne Zusatzhardware.",
810
+
"paired": "Gekoppelt",
811
+
"notpaired": "Noch nicht gekoppelt",
812
+
"setupcode": "Kopplungscode",
813
+
"howto": "In der Home-App auf + → Gerät hinzufügen → Weitere Optionen… → ESPuino tippen, dann den QR-Code scannen (oder den Code manuell eingeben).",
814
+
"devicename": "Gerätename",
815
+
"tvname": "TV-/Fernbedienungs-Name",
816
+
"tvnamehint": "(erscheint auf der Fernbedienung im Kontrollzentrum)",
817
+
"savenames": "Namen speichern",
818
+
"restartnote": "Wird nach einem Neustart des ESPuino übernommen.",
819
+
"regen": "Code neu generieren",
820
+
"reset": "Kopplung zurücksetzen",
821
+
"actionsnote": "„Code neu generieren“ erzeugt einen neuen Kopplungscode + QR (der alte funktioniert dann nicht mehr; bereits gekoppelte Zuhause bleiben verbunden). „Kopplung zurücksetzen“ entfernt alle gekoppelten Controller, damit der Player in einem anderen Zuhause hinzugefügt werden kann.",
822
+
"confirmreset": "Alle HomeKit-Kopplungen von diesem ESPuino entfernen?",
823
+
"confirmregen": "Neuen Kopplungscode generieren? Der aktuelle Code und QR funktionieren dann für neue Kopplungen nicht mehr.",
824
+
"namessaved": "Namen gespeichert. ESPuino jetzt neu starten, um sie zu übernehmen?"
Copy file name to clipboardExpand all lines: html/locales/en.json
+19Lines changed: 19 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -803,5 +803,24 @@
803
803
"lblPlay7d": "Last 7 days",
804
804
"lblPlay30d": "Last 30 days",
805
805
"lblTopCard": "Most played"
806
+
},
807
+
"homekit": {
808
+
"title": "Apple HomeKit",
809
+
"intro": "Add this ESPuino to the Apple Home app to control playback, volume and the button-lock with Siri and automations. Pairs over your existing WiFi — no extra hardware needed.",
810
+
"paired": "Paired",
811
+
"notpaired": "Not paired yet",
812
+
"setupcode": "Setup code",
813
+
"howto": "In the Home app tap + → Add Accessory → More options… → ESPuino, then scan the QR code (or enter the code manually).",
814
+
"devicename": "Device name",
815
+
"tvname": "TV / remote name",
816
+
"tvnamehint": "(shown on the Control-Center remote)",
817
+
"savenames": "Save names",
818
+
"restartnote": "Takes effect after a restart of the ESPuino.",
819
+
"regen": "Regenerate code",
820
+
"reset": "Reset pairing",
821
+
"actionsnote": "“Regenerate code” creates a new pairing code + QR (the old one stops working; already-paired homes keep working). “Reset pairing” removes all paired controllers so the player can be added to a different Home.",
822
+
"confirmreset": "Remove all HomeKit pairings from this ESPuino?",
823
+
"confirmregen": "Generate a new pairing code? The current code and QR will stop working for new pairings.",
824
+
"namessaved": "Names saved. Restart the ESPuino now to apply them?"
Copy file name to clipboardExpand all lines: html/locales/fr.json
+19Lines changed: 19 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -792,5 +792,24 @@
792
792
"lblPlay7d": "7 derniers jours",
793
793
"lblPlay30d": "30 derniers jours",
794
794
"lblTopCard": "Plus joué"
795
+
},
796
+
"homekit": {
797
+
"title": "Apple HomeKit",
798
+
"intro": "Ajoutez cet ESPuino à l’app Maison d’Apple pour contrôler la lecture, le volume et le verrouillage des touches avec Siri et des automatisations. Se jumelle via votre WiFi existant – sans matériel supplémentaire.",
799
+
"paired": "Jumelé",
800
+
"notpaired": "Pas encore jumelé",
801
+
"setupcode": "Code de configuration",
802
+
"howto": "Dans l’app Maison, touchez + → Ajouter un accessoire → Plus d’options… → ESPuino, puis scannez le QR code (ou saisissez le code manuellement).",
803
+
"devicename": "Nom de l’appareil",
804
+
"tvname": "Nom TV / télécommande",
805
+
"tvnamehint": "(affiché sur la télécommande du centre de contrôle)",
806
+
"savenames": "Enregistrer les noms",
807
+
"restartnote": "Pris en compte après un redémarrage de l’ESPuino.",
808
+
"regen": "Régénérer le code",
809
+
"reset": "Réinitialiser le jumelage",
810
+
"actionsnote": "« Régénérer le code » crée un nouveau code de jumelage + QR (l’ancien cesse de fonctionner ; les maisons déjà jumelées restent connectées). « Réinitialiser le jumelage » supprime tous les contrôleurs jumelés afin d’ajouter le lecteur à une autre Maison.",
811
+
"confirmreset": "Supprimer tous les jumelages HomeKit de cet ESPuino ?",
812
+
"confirmregen": "Générer un nouveau code de jumelage ? Le code et le QR actuels cesseront de fonctionner pour les nouveaux jumelages.",
813
+
"namessaved": "Noms enregistrés. Redémarrer l’ESPuino maintenant pour les appliquer ?"
0 commit comments