# Salsabil TV — fonctionnement hors ligne, économie de données et commandes Raspberry

## Objectifs du patch

- conserver les intervalles `/tv/state` et `/tv/ping` existants ;
- continuer à changer l'activité en cours et l'activité suivante pendant une coupure Internet ;
- conserver le programme du jour rotatif à partir du dernier planning synchronisé ;
- ne pas rejouer une ancienne sonnerie après une reconnexion ;
- mettre en cache le player, les polices et les photos déjà consultées ;
- désactiver les vidéos sur le Raspberry en mode économie de données ;
- fournir des commandes SSH simples pour démarrer, arrêter, relancer et diagnostiquer le kiosk ;
- mesurer la consommation de l'interface réseau avec vnStat et générer un rapport TXT par période.

## Fonctionnement hors ligne

À chaque ouverture en ligne, le serveur transmet un planning absolu résolu pour aujourd'hui et les sept jours suivants. Le navigateur le conserve dans `localStorage`.

Le player conserve également le décalage entre l'heure du serveur et l'heure locale. Si `/tv/state` ne répond plus, JavaScript recalcule localement :

- l'activité en cours ;
- l'activité suivante ;
- le temps restant ;
- la barre de progression ;
- le changement d'activité ;
- la sonnerie, uniquement au véritable début de la nouvelle activité ;
- les états du programme de la journée.

Le planning complet hors ligne n'est redemandé que toutes les 30 minutes. Les appels `/tv/state` et `/tv/ping` gardent leur rythme antérieur.

## Cache du player et des photos

Le service worker `public/tv-sw.js` conserve :

- la dernière page `/tv` ouverte avec succès ;
- les ressources CSS, JavaScript et polices ;
- jusqu'à 140 photos récentes d'élèves ou d'activités.

Les photos issues de la campagne 4×4 sont déjà normalisées en 800 × 800 px. Les photos des écrans de résultats sont chargées paresseusement et réutilisées depuis le cache local.

## Mode économie de données

Dans `/etc/salsabil-tv/config` :

```bash
LOW_DATA_MODE=1
```

Le launcher ajoute automatiquement `low_data=1` à l'URL du player. Les diapositives vidéo sont alors ignorées, mais les photos, résultats, annonces, planning et sonneries restent actifs.

Pour réautoriser les vidéos :

```bash
sudo nano /etc/salsabil-tv/config
# mettre LOW_DATA_MODE=0
salsabil-tv restart
```

Même hors mode économie, les vidéos utilisent maintenant `preload="metadata"` au lieu de `preload="auto"`.

## Commandes SSH

Après mise à jour du Raspberry :

```bash
salsabil-tv status
salsabil-tv stop
salsabil-tv start
salsabil-tv restart
salsabil-tv reload
salsabil-tv logs 200
salsabil-tv follow
```

La liste exhaustive est dans :

```text
deployment/raspberry-pi/COMMANDES_SSH_SALSABIL_TV.txt
```

## Mesurer la consommation

Aujourd'hui :

```bash
salsabil-tv data
```

Une période :

```bash
salsabil-tv data 2026-06-14 2026-06-20
```

Mesure instantanée de 60 secondes :

```bash
salsabil-tv data-live 60
```

Les rapports sont enregistrés dans :

```text
~/salsabil-tv-reports/
```

Important : vnStat mesure tout le trafic de l'interface réseau du Raspberry. Si le Raspberry n'exécute que Salsabil Screen, ce total constitue une bonne approximation de la consommation du kiosk. La mesure commence après installation de vnStat et n'est pas rétroactive.

## Mise à jour du Raspberry existant

Depuis Ubuntu :

```bash
scp -r deployment/raspberry-pi abou@alqiyam-tv.local:~/
```

Sur le Raspberry :

```bash
ssh abou@alqiyam-tv.local
cd ~/raspberry-pi
sudo ./update-salsabil-tv.sh
```

Pour rendre les options explicites dans une configuration existante :

```bash
sudo nano /etc/salsabil-tv/config
```

Ajouter si elles sont absentes :

```bash
LOW_DATA_MODE=1
ENABLE_OFFLINE_PLAYER=1
SALSABIL_DATA_INTERFACE=""
```

Puis :

```bash
salsabil-tv restart
```

## Limites normales du mode hors ligne

Pendant une coupure, le dernier planning continue. En revanche, les changements faits dans l'administration après le début de la coupure, les nouvelles annonces, les nouvelles notes et les nouveaux médias ne peuvent être reçus qu'au retour d'Internet.
