Amélioration avec des fonctions d'un vrai dashboard automotive et containerisation du projet pour faciliter le déploiement

This commit is contained in:
Christian CUNAT-BRULE
2026-09-12 21:13:24 +02:00
parent d170f95c92
commit d8eb7f4375
31 changed files with 2233 additions and 65 deletions
+39
View File
@@ -0,0 +1,39 @@
# Applications, conduite et musique — 0.3
## Favoris et affichage tactile
La référence actuelle est un écran **10 pouces tactile en paysage**, interprété comme **1200 pixels de large et 1080 de haut**. Le rendu reste adaptatif. Le bouton hamburger replie la barre latérale sans recharger la page ; le choix est enregistré dans ce navigateur. L’en-tête est placé dans le contenu et le pied de page reste visible pour les essais.
Le catalogue se trouve dans Applications (`#apps`). Personnaliser permet de sélectionner jusqu’à quatre favoris, leur ordre, les applications visibles et le mode d’ouverture des services externes. Choisir un favori déjà présent échange les positions. Masquer un favori libère sa place ; cela ne désactive pas une fonction de CARIA et ne met pas la musique en pause. Applications et le logo d’accueil restent accessibles. Les préférences sont propres au navigateur et synchronisées entre ses onglets de même origine.
Conduite est un favori par défaut pour les essais. Pour son futur écran séparé : `/?display=drive#drive` ouvre directement les instruments et replie la barre. Les grands compteurs ont une base plate sous Vitesse/Régime moteur. Carburant, refroidissement, batterie et extérieur sont visibles rapidement ; Détails du véhicule ouvre les valeurs et leur explication. Toutes ces mesures restent simulées et sont masquées si l’API devient indisponible.
## Services Web et lecteurs intégrés
Les raccourcis externes par défaut sont Jellyfin, Spotify, YouTube, YouTube Music et Waze. Aucun de ces services n’est chargé en arrière-plan par le catalogue. L’ouverture n’intervient qu’après un appui. Aucun logiciel natif n’est installé dans Docker.
| Mode | Comportement |
| --- | --- |
| Nouvel onglet (défaut) | Conserve CARIA et son audio local. Le navigateur ou l’OS décide s’il ouvre aussi une application associée. |
| Même onglet | Quitte CARIA ; le bouton Retour permet de revenir. La musique locale et le GPS peuvent être interrompus. |
| Lecteur intégré | Reste dans CARIA, avec un cadre officiel/service compatible et un lien externe de secours. Disponible hors Waze. |
**Jellyfin** : utilise l’adresse configurée dans les réglages. Le serveur et son reverse proxy doivent autoriser l’origine de CARIA à l’afficher dans un cadre. Le contrôle public des en-têtes de `https://media.cunatbrule.fr/web/` a répondu HTTP 200 sans restriction de cadrage explicite dans ces en-têtes au moment du test ; les pages d’authentification, cookies et lectures restent à vérifier avec le compte réel. Aucune configuration de serveur Jellyfin n’a été changée. L’interface CARIA ne peut ni garantir ni inspecter une connexion dans un cadre d’une autre origine.
**Spotify** : le mode intégré attend un lien de morceau, album, playlist, épisode ou émission, et construit le lecteur officiel `open.spotify.com/embed/...`. Il ne reproduit pas la navigation complète de l’application. La connexion, la durée/possibilité de lecture et les restrictions appartiennent au lecteur Spotify. Voir les [Embeds officiels](https://developer.spotify.com/documentation/embeds).
**YouTube / YouTube Music** : un lien vidéo (`watch?v=...` ou `youtu.be/...`) ou playlist produit un lecteur vidéo YouTube officiel. La vidéo et ses commandes restent visibles. Ce n’est pas l’application YouTube Music complète, ni une extraction audio ; certains contenus ou playlists peuvent refuser la lecture intégrée. Voir [la documentation du lecteur](https://developers.google.com/youtube/iframe_api_reference).
**Waze** : le lien ouvre le site ou l’application selon l’OS. Après sélection d’une destination dans CARIA, le catalogue et le bouton de navigation utilisent un [lien Waze avec latitude/longitude et `navigate=yes`](https://developers.google.com/waze/deeplinks). Ce bouton fonctionne aussi si le calcul OSRM échoue, tant qu’une destination a été choisie. Il est masqué si Waze est masqué. Terminer le trajet retire la destination du lien. Aucune carte Waze n’est intégrée dans CARIA.
Les lecteurs intégrés se chargent après un appui et, pour Spotify/YouTube, après fourniture d’un lien compatible (mémorisé localement). Ils sont déchargés lorsque l’on quitte la vue intégrée, pour éviter une lecture invisible et libérer leurs ressources. Cela ne coupe pas le lecteur de musique locale. Un seul cadre est chargé à la fois. CARIA ne modifie pas les interfaces, marques, publicités ou restrictions de ces services. Leur apparence interne ne peut pas être recolorée librement depuis CARIA.
## Lecture locale immersive
Depuis Musique locale, « Vue lecture immersive » ouvre `#now-playing`. La bibliothèque reste disponible et le morceau en cours continue : les deux vues pilotent le même lecteur HTML audio.
L’arc coloré suit le temps réellement lu. La barre de progression permet de déplacer la lecture au tactile ou au clavier ; les commandes proposent lecture/pause, morceau précédent/suivant, recul/avance de 15 secondes, répétition du morceau, volume et silence. Les contrôles de transport sont désactivés sans morceau. Le titre, la durée et les commandes se synchronisent avec le lecteur de la bibliothèque. La sélection des fichiers reste locale et doit encore être refaite après rechargement de la page.
## Tests et limites
Les tests navigateur couvrent la navigation, les favoris et leur permutation, les modes d’ouverture, l’absence de préchargement des services, l’ouverture YouTube Music, le masquage sans interruption audio, la barre repliée persistante, l’affichage Conduite, les détails et la synchronisation de la lecture immersive. Les lecteurs externes sont simulés dans les tests ; leurs URL officielles et le déchargement du cadre sont vérifiés. Le tactile est émulé dans Chrome ; le toucher, le son et les comptes réels restent à tester sur l’appareil.
+2 -2
View File
@@ -39,8 +39,8 @@ Le simulateur et la future passerelle doivent être sélectionnés explicitement
## Évolutions indépendantes
- Bibliothèque audio persistante : volume en lecture seule, catalogue et prise en charge des requêtes Range ; la musique serait alors lue depuis le serveur plutôt que choisie dans l’appareil client.
- Météo réelle : fournisseur à définir, position configurable, cache et date de dernière mise à jour.
- Cartographie/radar : fournisseur open source, besoin hors ligne, zone géographique et données à définir avec l’utilisateur.
- Météo réelle et cartographie : intégrées en 0.2, voir [navigation.md](navigation.md). Restent le hors ligne et le GPS matériel.
- Alertes de zones : moteur local livré en 0.2 ; la source de données réelle et son utilisation par pays restent à définir.
- Affichage : kiosque Linux et configuration des moniteurs au niveau de l’OS ; paramètres propres à chaque écran si nécessaire.
- Distribution : figer les images par version/digest une fois la première construction ARM validée ; ajouter une construction automatisée multiarchitecture au dépôt si son hébergement CI le permet.
+80
View File
@@ -0,0 +1,80 @@
# Météo, navigation et zones — version 0.2
## Utilisation
1. Ouvrir Navigation, puis activer le GPS ou choisir un départ par recherche/coordonnées. Le GPS demande l’autorisation du navigateur ; le mode manuel convient à la préparation d’un trajet et à la météo.
2. Rechercher une ville ou adresse, avec « Destination », puis sélectionner le résultat. Les résultats ne sont chargés qu’à la validation de la recherche.
3. L’itinéraire affiche sa distance, une durée indicative et les manœuvres. Un GPS de moins de 15 secondes et précis à 100 mètres ou mieux active le suivi. Le départ manuel reste un aperçu. Hors route à plus de 100 mètres : bouton Recalculer. Le suivi ne recentre pas automatiquement la carte, pour préserver le déplacement manuel ; utiliser Recentrer.
4. Activer Voix pour annoncer les changements d’étape si le navigateur propose la synthèse vocale française. Les capacités vocales dépendent de l’OS et du navigateur.
Ce premier guidage projette la position sur la ligne de l’itinéraire. Il n’effectue pas de map matching avancé : les boucles, croisements et routes parallèles peuvent donner une progression ambiguë. Il n’intègre pas le trafic ni les restrictions temporaires. La voix annonce les changements d’étape, sans plusieurs préannonces à distance. Ce prototype reste à tester sur le matériel et sur route.
## Localisation et météo
La [géolocalisation Web](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition) demande un contexte sécurisé. Un accès HTTP par IP LAN ne donne généralement pas accès au GPS. Prévoir un reverse proxy HTTPS avec certificat reconnu pour l’ODroid. Ne pas désactiver la sécurité du navigateur pour contourner cette contrainte.
Le bouton Arrêter le GPS ferme le suivi, suspend le guidage et les alertes et efface la météo GPS affichée. Le dernier lieu manuel, enregistré dans le navigateur, est repris au rechargement. La météo est actualisée toutes les 15 minutes ou après un déplacement de plus de 5 km, avec un bouton d’actualisation. Si le service échoue, les valeurs sont remplacées par des tirets. Les données météo ne sont pas remplacées par une simulation.
Open-Meteo fournit température, état du ciel, vent et minimum/maximum du jour. L’heure de modèle affichée est celle du lieu météo. Les coordonnées envoyées au fournisseur sont arrondies au centième de degré. Les mêmes valeurs peuvent être servies depuis le cache du serveur pendant 15 minutes.
## Fournisseurs et exploitation
| Fonction | Par défaut | Configuration serveur |
| --- | --- | --- |
| Météo | Open-Meteo | `WEATHER_URL`, endpoint compatible forecast |
| Recherche | Photon public | `GEOCODER_URL`, endpoint compatible Photon |
| Itinéraire voiture | OSRM public | `ROUTER_URL`, préfixe `.../route/v1/driving/` |
| Tuiles raster | OpenStreetMap standard | `TILE_URL`, template `{z}/{x}/{y}` |
| Crédit cartographique | © OpenStreetMap contributors | `TILE_ATTRIBUTION` |
Configurer ces variables dans `.env`, puis relancer Compose. Le serveur ne permet pas aux requêtes Web de fournir une URL arbitraire à récupérer. Les appels sortants utilisent un User-Agent CARIA, un délai de 8 secondes et une limite globale d’un appel par fournisseur toutes les 1,1 secondes. Cache mémoire borné à 128 entrées, regroupement des demandes simultanées identiques. Recherche conservée au maximum 24 heures dans le cache, route 1 minute, météo 15 minutes. L’API renvoie 429 lorsqu’il faut attendre, 502 en cas d’indisponibilité et 422 lorsqu’aucune route n’est trouvée.
Les logiciels sont open source ; les services publics ne constituent pas une infrastructure gratuite illimitée :
- [Open-Meteo](https://open-meteo.com/en/pricing) : accès gratuit pour usage non commercial dans les limites publiées, données avec attribution CC BY 4.0. Une commercialisation exige de revoir l’offre ou d’auto-héberger.
- [Photon](https://github.com/komoot/photon) : serveur de démonstration autorisant un usage raisonnable sans garantie de disponibilité ; auto-hébergement possible. Recherche à la demande seulement dans CARIA.
- [OSRM](https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server) : serveur public de démonstration, sans garantie. Respecter ses conditions et prévoir son instance pour une exploitation soutenue.
- [OpenStreetMap](https://operations.osmfoundation.org/policies/tiles/) : attribution visible, HTTPS, cache natif du navigateur, pas de préchargement ni de téléchargement hors ligne. Les tests automatiques interceptent les tuiles pour ne pas solliciter les serveurs publics.
Les coordonnées météo, recherches et points d’itinéraire transitent par le serveur CARIA puis par le fournisseur concerné. Le navigateur demande les tuiles directement au fournisseur, qui connaît donc la zone affichée et l’adresse IP du client. Pas d’historique GPS en fichier : les coordonnées restent en mémoire, à l’exception du départ manuel mémorisé localement. Les journaux d’accès Nginx sont désactivés sur `/api/` pour ne pas y enregistrer les paramètres géographiques. Si vous ajoutez un reverse proxy, appliquer la même règle à ses journaux.
## Système d’alertes et couverture
Le système livré avertit à l’approche de **zones géographiques importées**. Il ne télécharge pas une base radar, ne détecte pas les contrôles et ne fournit pas de signalements communautaires. Sans fichier de zones, il n’a aucune couverture réelle. Le bouton de test génère une alerte fictive indépendante du GPS.
Les règles varient selon le pays ; le sélecteur de pays filtre les données et ne certifie aucune autorisation. Le [Code de la route français, article R413-15](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000025111528/2016-03-19) vise notamment les dispositifs informant de la localisation des appareils de contrôle. Transformer un point radar en cercle ne suffit pas à établir la conformité d’un service. Aucune base n’est transformée automatiquement de cette manière dans CARIA.
Pour la France et les pays voisins, il reste à sélectionner une source maintenue de zones de vigilance, vérifier sa licence et ses conditions pays par pays. Les alertes sont désactivées au démarrage et à chaque changement de pays. Il faut sélectionner le pays manuellement : cette version ne détecte pas le franchissement d’une frontière.
## Import GeoJSON
Maximum 1,5 Mo, 1 000 zones. Chaque zone est un Point GeoJSON dont les coordonnées représentent le centre d’une **zone de vigilance** et dont `radiusM` donne l’étendue. Champs obligatoires : pays ISO à deux lettres, rayon entre 300 et 10 000 m, source, dates de mise à jour et d’expiration. Les points ne sont pas affichés comme emplacements de radars sur la carte. Le nom et la source sont affichés comme texte, pas interprétés comme HTML.
```json
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [2.35, 48.85] },
"properties": {
"id": "exemple-fictif",
"name": "EXEMPLE FICTIF — ne correspond pas à un radar",
"country": "FR",
"radiusM": 500,
"source": "Jeu de test utilisateur",
"updatedAt": "2026-09-12T00:00:00Z",
"expiresAt": "2026-12-31T23:59:59Z"
}
}]
}
```
Les zones expirées sont ignorées. L’alerte se déclenche à moins de 400 m de la limite d’une zone, ou à l’intérieur, avec un GPS récent et précis. Calcul de proximité à vol d’oiseau, sans sens de circulation ni rattachement à une route. Le son est optionnel et limité pour éviter les répétitions. Le fichier reste dans le navigateur ; Effacer les zones le retire. Le fichier ne constitue pas une preuve de qualité ou d’actualité des données importées.
## Priorités proposées pour la suite
1. HTTPS, modèle d’ODroid et récepteur GPS : indispensables pour valider le guidage embarqué.
2. Musique sur volume Docker/USB avec catalogue persistant, pour éviter la resélection des fichiers.
3. Cartographie hors ligne avec tuiles autorisées et routage auto-hébergé, adaptés à la mémoire disponible.
4. Passage des données CAN simulées aux mesures réelles, avec fraîcheur par signal.
5. Source de zones maintenue et règles locales vérifiées avant toute utilisation routière de l’avertisseur.