Télécommande LED pour chambre d'enfant via Home Assistant

- Package HA : 8 scripts d'effets (calmes et « boum ») et une
  automatisation webhook local_only avec liste blanche stricte
- Page web autonome (HTML/CSS/JS ES5) tenant sur un écran de lecteur MP3
- Mini APK Android (WebView verrouillée) compilé sans Gradle
- Modèles + config.local.env non versionné : aucune valeur réelle
  (IP, ID du webhook, entité, prénom) dans le dépôt ; deploy.sh génère
  et déploie, android/build.sh injecte la configuration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-10 21:29:51 +02:00
co-authored by Claude Opus 5.5
commit e4bd58afa7
22 changed files with 1432 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env bash
# Compile l'APK « Ma lumière » sans Gradle (aapt2 + javac + d8 + apksigner).
# Les valeurs réelles (IP de HA, identifiant de l'appli) viennent de
# ../config.local.env (non versionné, voir ../config.example.env).
# Résultat : build/ma-lumiere.apk
set -euo pipefail
cd "$(dirname "$0")"
[ -f ../config.local.env ] || { echo "../config.local.env manquant (copier config.example.env)" >&2; exit 1; }
set -a; . ../config.local.env; set +a
SDK="${ANDROID_HOME:-/opt/android-sdk}"
BT="$SDK/build-tools/30.0.2"
JAR="$SDK/platforms/android-25/android.jar"
KEYSTORE="$HOME/.android/debug.keystore"
rm -rf build && mkdir -p build/res build/gen/app/lumiere build/classes build/dex
echo "== valeurs locales ($APP_ID -> http://$HA_IP:$HA_PORT/)"
cp -r res build/res-src
sed -i "s/__HA_IP__/$HA_IP/g" build/res-src/xml/network_security_config.xml
if grep -rq "__[A-Z_]*__" build/res-src; then echo "marqueurs non remplacés dans res/" >&2; exit 1; fi
cat > build/gen/app/lumiere/Config.java <<EOF
package app.lumiere;
/** Généré par build.sh depuis config.local.env : ne pas modifier. */
final class Config {
static final String ORIGINE = "http://$HA_IP:$HA_PORT/";
private Config() {}
}
EOF
echo "== ressources"
"$BT/aapt2" compile --dir build/res-src -o build/res/res.zip
"$BT/aapt2" link -o build/base.apk -I "$JAR" \
--manifest AndroidManifest.xml \
--rename-manifest-package "$APP_ID" \
--min-sdk-version 24 --target-sdk-version 33 \
--java build/gen build/res/res.zip
echo "== java"
javac -source 1.8 -target 1.8 -encoding UTF-8 -Xlint:-options \
-bootclasspath "$JAR" -d build/classes \
$(find src build/gen -name '*.java')
echo "== dex"
"$BT/d8" --min-api 24 --lib "$JAR" --output build/dex $(find build/classes -name '*.class')
cp build/base.apk build/unsigned.apk
(cd build/dex && zip -q -j ../unsigned.apk classes.dex)
echo "== alignement et signature (clé de debug)"
"$BT/zipalign" -f -p 4 build/unsigned.apk build/aligned.apk
"$BT/apksigner" sign --ks "$KEYSTORE" --ks-pass pass:android --key-pass pass:android \
--out build/ma-lumiere.apk build/aligned.apk
"$BT/apksigner" verify build/ma-lumiere.apk
ls -l build/ma-lumiere.apk