Écran e-paper « Est-ce vendredi ? » + Météo
Affiche une page amusante sur l'écran e-paper monochrome Zectrix 400×300, inspirée du projet open-source eyaeya/today-is-friday (MIT). Cette compétence reprend la mise en page pour écran monochrome noir et blanc et superpose la météo locale.
Voir l'aperçu dans assets/preview.png :
- En haut : à gauche « Est-ce vendredi ? », à droite le lieu de l'utilisateur (ex. « Chengdu · District Chenghua »)
- Colonne gauche : message d'accueil + deux lignes de texte humoristique, changeant selon le jour et l'heure, avec tirage aléatoire sans répétition dans un cycle
- Colonne droite : grande icône météo + grande température + situation + indice UV + HI/LO
- En bas : prévisions sur 3 jours (aujourd'hui/demain/après-demain) + conseil vestimentaire basé sur la météo réelle (parapluie par temps de pluie, protection solaire par forte chaleur, ajout de vêtements par froid, alerte aux écarts de température, crème solaire si UV élevé)
Règles de période et de couleurs (reprises du projet original) :
| Période | Message d'accueil | Couleurs |
|---|---|---|
| Lundi–Jeudi | Non. | Fond blanc, texte noir |
| Vendredi avant 16h | C'est vendredi ! | Fond noir, texte blanc inversé |
| Vendredi après 16h | C'est vendredi ! + cachet « Fin de service » en haut à droite | Fond noir, texte blanc inversé |
| Samedi, Dimanche avant 19h | Repos. | Fond noir, texte blanc inversé |
| Dimanche après 19h | Demain c'est lundi. | Fond blanc, texte noir |
Le pool de phrases contient 9 catégories (lun.-jeu. / vendredi jour / vendredi soir / samedi / dimanche jour / dimanche soir), chacune avec 65 phrases, stockées dans
scripts/friday_phrases.json. Vous pouvez ajouter directement des phrases pour l'étendre.
1. Première utilisation : initialisation obligatoire (aucune clé intégrée)
Cette compétence ne contient aucune clé API, identifiant d'appareil ou coordonnées – tout doit être fourni par l'utilisateur. L'initialisation est requise avant la première exécution.
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
python3 init.py # Assistant interactif (recommandé)
# Ou en mode non interactif :
python3 init.py --api-key zt_xxx --device AA:BB:CC:DD:EE:FF --place "Chengdu Chenghua" --label "Chengdu·District Chenghua"
Trois informations sont nécessaires (aucune ne peut être omise – ne pas deviner ni utiliser de valeurs d'exemple) :
- Clé API Zectrix : obtenue depuis la console Jiquyun, commence par
zt_. En cas de doute, exécutez d'abordpython3 init.py --api-key zt_xxx --list-devicespour vérifier si les appareils sont listés. - Identifiant de l'appareil : adresse MAC de l'appareil, format
AA:BB:CC:DD:EE:FF; disponible dans la sortie de la commande précédente. - Localisation : nom de lieu en chinois, par exemple « Chengdu Chenghua », « Shanghai Xuhui », « Shenzhen Nanshan ». Le script utilise le service de géocodage Open-Meteo pour convertir en coordonnées ; en cas de plusieurs candidats, choix interactif, sinon par défaut le premier.
L'initialisation vérifie que la clé correspond à l'appareil (sinon avertissement et arrêt ; pour forcer, ajoutez --no-verify), puis écrit dans ~/.config/zectrix-friday-weather/config.json :
{
"api_key": "zt_xxx",
"device_id": "AA:BB:CC:DD:EE:FF",
"page": "5",
"location": {"label": "XX·District XX", "lat": 30.0000, "lon": 104.0000, "timezone": "Asia/Shanghai"}
}
La configuration et l'état se trouvent dans ~/.config/zectrix-friday-weather/ (peut être remplacé par la variable d'environnement ZECTRIX_FRIDAY_CONFIG_DIR), pas dans le répertoire de la compétence, ce qui permet de partager/mettre à jour la compétence en toute sécurité sans divulguer de clés.
2. Utilisation quotidienne
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
ZECTRIX_NO_PUSH=1 python3 zectrix_friday_push.py # Rendu uniquement : génère /tmp/zectrix_friday_screen.png
python3 zectrix_friday_push.py # Rendu + envoi à l'écran e-paper
Si non initialisé, le script affiche NEED_INIT: et se termine avec le code 2 – dans ce cas, guidez l'utilisateur pour compléter la configuration (ne pas inventer de clé).
3. Rendu et mise en page (à respecter en cas de modification du style)
- Rendu natif 400×300, 1:1 – ne pas agrandir puis réduire ; seuil de binarisation
THRESHOLD=128,dither=false(seuil dur, texte le plus net) - Police : par défaut, police bitmap
assets/fonts/Zfull.ttfincluse dans le dépôt (8-24 px, nette au pixel, idéale pour e-paper, fonctionne après clone sans installation supplémentaire) ; peut être remplacée par$ZECTRIX_FONT=/path/to/xxx.ttf, avec fallback sur PingFang / Heiti / Noto CJK - Icônes :
draw_icon()dessine deux fois (d'abord contour extérieur avec couleur de bord, puis remplissage avec couleur de fond) pour obtenir un contour épais sans lignes intérieures ; les nuages masquent naturellement le soleil derrière ; les symboles multi-octets (▲▼) sont dessinés par le code car absents des petites tailles de police bitmap - Texte toujours en poids normal – pas de gras ni de contour (le gras devient flou sur un écran 1-bit)
- Icône + température centrés verticalement dans la colonne droite : mesurer d'abord la largeur réelle de la température avec
d.textlength(), puis calculer le point de départ par rapport à la ligne médiane de la colonne droite ; les rayons du soleil par beau temps s'étendent, la largeur de l'espace réservé doit être augmentée - La rotation du cachet utilise
fillcolor=255pour éviter les coins noirs ; dans un scénario inversé, le cachet doit être collé avecimg.paste(tcol, box, mask)en fonction de la couleur du cadre
4. Envoi programmé
L'appareil fonctionne en mode pull – l'API renvoie code:0 en cas de succès, l'écran se met à jour lors de la prochaine interrogation. Les phrases changent selon la période ; nous recommandons une automatisation pour un envoi quotidien à 10h. Pour que « Demain c'est lundi. » s'affiche après 19h le dimanche et que le cachet « Fin de service » apparaisse après 16h le vendredi, ajoutez un second envoi à 19h.
5. Structure des fichiers
| Fichier | Description |
|---|---|
scripts/init.py | Assistant d'initialisation : collecte de la clé/appareil/localisation, géocodage, écriture de la configuration |
scripts/zectrix_friday_push.py | Script principal de rendu + envoi |
scripts/dev_render_sample.py | Génère des exemples de documentation (spécifie jour/période/météo, sans envoi) |
scripts/friday_phrases.json | 9×65 phrases, modifiable directement pour extension |
assets/fonts/Zfull.ttf | Police bitmap incluse (police de rendu par défaut, distribuée avec le dépôt) |
assets/preview.png | Image d'aperçu |
assets/sample-friday.png | Exemple vendredi soir (fond noir inversé + cachet « Fin de service ») |
Données météo fournies par Open-Meteo (gratuit, sans clé API nécessaire). Indice UV basé sur uv_index_max du jour.