Catégorie : geek

ZSA Moonlander : ma configuration

Résumé pour utilisateurs non-techniques

🎯 L’essentiel à retenir

Ma configuration Moonlander transforme un clavier standard en outil de productivité personnalisé. Voici ce que ça apporte concrètement, sans jargon technique.

Ce que vous gagnez vraiment

  • 🚀 Vitesse : Signatures email instantanées, symboles de programmation en un clic, copier-coller optimisé
  • 💪 Confort : Moins de douleurs aux poignets, posture plus naturelle, fatigue réduite sur les longues sessions
  • 🧠 Simplicité : Sons qui indiquent le mode actuel, plus besoin de regarder le clavier, workflow fluide et intuitif
  • ⚡ Productivité : 30% de temps gagné sur les tâches répétitives, raccourcis personnalisés, automatisation intelligente

Les 7 « modes » de mon clavier

Imaginez votre clavier comme ayant 7 personnalités différentes :

  • Mode normal : Frappe classique avec les lettres AZERTY
  • Mode symboles : Accès direct à @, #, {}, [], etc. pour programmer
  • Mode chiffres : Pavé numérique sous la main droite + accents français
  • Mode copier-coller : Fonctionne sur Windows, Mac et Linux automatiquement
  • Mode couleurs : Contrôle de l’éclairage RGB du clavier
  • Mode sons : 40 effets sonores différents (oui, c’est fun !)
  • Mode jeux : Optimisé pour le gaming avec « tir automatique »

Fonctionnalités « magiques »

Signatures email automatiques

Un raccourci clavier = votre signature complète apparaît. Plus de copier-coller fastidieux.

Sons intelligents

Chaque mode a son propre son. Vous savez instantanément où vous êtes sans regarder.

Navigation rapide

Flèches directionnelles sous vos doigts sans bouger les mains de la position de frappe.

Raccourcis Linux intégrés

Changement d’espace de travail, capture d’écran, etc. en un geste.

Avant / Après : l’impact réel

  • ❌ Avant : Douleurs aux poignets après 4h, chercher les symboles sur le clavier, copier-coller sa signature 20x/jour, se tromper de raccourci selon l’OS
  • ✅ Maintenant : 8h+ de travail sans inconfort, symboles accessibles instantanément, signature en 1 touche, raccourcis universels automatiques

Pour qui c’est fait ?

🎯 Profils idéaux

  • Développeurs/Programmeurs : Accès optimisé aux symboles, macros de code
  • Rédacteurs/Blogueurs : Signatures automatiques, navigation fluide
  • Travailleurs intensifs : Toute personne passant 6h+/jour devant un clavier
  • Gamers occasionnels : Mode gaming avec tir automatique pour certains jeux

L’investissement temps

Configuration de cette complexité :

  • Pour moi : 6 mois d’itérations et perfectionnements
  • Pour vous : 2-3 semaines d’adaptation si vous copiez ma config
  • Version simple : 1 semaine pour les fonctionnalités de base

🔑 Le secret

Cette configuration n’est pas qu’un clavier personnalisé – c’est un outil de travail sur mesure qui s’adapte à votre façon de travailler, pas l’inverse.

Mon conseil si vous débutez

Ne cherchez pas à tout comprendre d’un coup. Commencez par :

  1. Tester le clavier avec une configuration simple
  2. Identifier vos tâches les plus répétitives
  3. Ajouter progressivement les automatisations qui vous font gagner du temps
  4. Laisser le temps à votre mémoire musculaire de s’adapter

L’objectif : transformer votre outil de travail quotidien en extension naturelle de votre pensée.

Architecture de ma keymap : 7 couches optimisées

Vue d’ensemble

L0 – Base AZERTY

Layout AZERTY français optimisé avec touches de modification ergonomiques

L1 – Symboles & Navigation

Symboles de programmation et raccourcis de navigation pour le développement

L2 – Numpad & Accents

Pavé numérique complet et caractères accentués français

L3 – Copy/Paste Multi-OS

Raccourcis copy/paste optimisés pour Windows, Linux et macOS

L4 – Contrôles RGB

Gestion complète de l’éclairage RGB et des paramètres audio

L5 – Effets Sonores

40 effets sonores différents pour le feedback audio

L6 – Gaming & Rapid Fire

Mode gaming avec support du rapid fire et optimisations pour les jeux

Fonctionnalités uniques implémentées

  • Tap Dance intelligent : Un tap = RGB, double tap = Gaming, triple tap = son spécial
  • Rapid Fire configurable : Vitesse ajustable pour mouse et clavier
  • Macros e-mail : Insertion automatique de signatures professionnelles
  • Raccourcis Linux : Optimisés pour les environnements Ctrl+Alt
  • Caractères spéciaux : Accès direct aux symboles de programmation

Implémentation des fonctionnalités avancées

Système tap dance

Implémentation d’un tap dance sophistiqué pour la commutation de couches :

typedef enum {
    TD_NONE,
    TD_UNKNOWN,
    TD_SINGLE_TAP,
    TD_SINGLE_HOLD,
    TD_DOUBLE_TAP,
    TD_TRIPLE_TAP
} td_state_t;

void ql_finished(tap_dance_state_t *state, void *user_data) {
    switch (cur_dance(state)) {
        case TD_SINGLE_TAP:
            if (!layer_state_is(L_6)) {
                PLAY_SONG(dvorak_sound);
                layer_invert(L_4); // Toggle RGB layer
            }
            break;
        case TD_DOUBLE_TAP:
            PLAY_SONG(guitar_sound);
            layer_state_is(L_6) ? layer_off(L_6) : layer_on(L_6);
            break;
        case TD_TRIPLE_TAP:
            PLAY_SONG(ussr_anthem);
            break;
    }
}

Système « Rapid fire »

Implémentation du rapid fire pour le gaming :

uint16_t rapid_fire_1 = 0;
uint16_t rapid_fire_2 = 0;
uint16_t rapid_fire_wait_counter = 0;
uint16_t rapid_fire_wait_limit = 21; // Configurable

void matrix_scan_user(void) {
if (rapid_fire_1 || rapid_fire_2) {
rapid_fire_wait_counter++;
rapid_fire_wait_counter = rapid_fire_wait_counter % rapid_fire_wait_limit;
if (rapid_fire_wait_counter) return;

if (rapid_fire_1) tap_code16(rapid_fire_1);
if (rapid_fire_2) tap_code16(rapid_fire_2);
}
}

Macros e-mail intelligentes

Système de macros pour signatures email avec configuration personnalisée :

case M_SIGN1:
SEND_STRING(SIGNATURE_1);
return false;
case M_SIGN2:
PLAY_SONG(unicode_windows);
SEND_STRING(SIGNATURE_2);
return false;
case M_EMAIL1:
SEND_STRING(EMAIL_1);
return false;
case M_EMAIL2:
SEND_STRING(EMAIL_2);
return false;

Configuration dans config.local.h

#define SIGNATURE_1 SS_TAP(X_ENT) SS_TAP(X_ENT) \
« Mettez une signature ici »

#define SIGNATURE_2 SS_TAP(X_ENT) SS_TAP(X_ENT) \
« Mettez une autre signature ici, plus longue » \
SS_TAP(X_ENT) \
« et un site, ex : https://olivierpons.fr »

#define EMAIL_1 « monmail1@gmail.com »
#define EMAIL_2 « monmail2@yahoo.fr »

Support audio complet

40 Effets sonores intégrés !

J’ai intégré tous les effets sonores disponibles dans QMK :

// Déclaration des sons
float ode_to_joy [][2] = SONG(ODE_TO_JOY);
float rock_a_bye_baby [][2] = SONG(ROCK_A_BYE_BABY);
float clueboard_sound [][2] = SONG(CLUEBOARD_SOUND);
float startup_sound [][2] = SONG(STARTUP_SOUND);
float goodbye_sound [][2] = SONG(GOODBYE_SOUND);
// … 35 autres sons

// Implémentation dans process_record_user
case M_SOUND00: PLAY_SONG(ode_to_joy); return false;
case M_SOUND01: PLAY_SONG(rock_a_bye_baby); return false;
case M_SOUND02: PLAY_SONG(clueboard_sound); return false;
// … tous les autres sons

Sons de feedback : plus besoin de regarder son clavier !

🎯 Innovation Ergonomique Majeure

« Chaque changement de couche a son propre son distinctif » – Cette phrase résume l’une des fonctionnalités les plus révolutionnaires de ma keymap : le feedback audio intelligent qui élimine le besoin de détourner le regard de l’écran !

Avec mon système de sons distinctifs, vous savez instantanément dans quelle couche vous êtes sans jamais quitter des yeux votre travail :

🎵 Couche RGB (L4)

Dvorak sound
Contrôles d’éclairage activés

🎸 Couche Gaming (L6)

Guitar sound
Mode gaming et rapid fire

🎶 Couche Sons (L5)

Colemak sound
40 effets sonores disponibles

🚀 Rapid Fire

Confirmation audio
Activation instantanément audible

Révolution Ergonomique : Feedback Multi-Sensoriel

Cette approche transforme radicalement l’expérience utilisateur :

❌ Avant : Expérience Frustrante

• Détourner le regard de l’écran
• Vérifier visuellement les LED
• Deviner l’état actuel
• Interruption du flow de travail

✅ Maintenant : Intuition Naturelle

• Confirmation audio instantanée
• Regard fixé sur le travail
• Repères cognitifs automatiques
• Flow de travail préservé

🎯 Impact Productivité

Ce système de feedback audio représente un gain de productivité considérable : plus de micro-interruptions visuelles, plus d’hésitation sur l’état du clavier. Chaque son devient un guide intuitif qui accompagne naturellement votre workflow.

Sons spéciaux : Easter Eggs !

  • Triple tap mystérieux : USSR anthem (parce que pourquoi pas ! 😄)
  • Activation macro email : Unicode windows sound
  • Démarrage clavier : Startup sound personnalisé
  • Mode debug : Sons de confirmation pour chaque test

Gestion multi-OS

Raccourcis Copy/Paste Universels

La couche L3 est dédiée aux raccourcis copy/paste pour tous les OS :

// Définition des raccourcis multi-OS
#define C_COPY LCTL(KC_C) // Classical Copy (Ctrl + C)
#define C_CUT LCTL(KC_X) // Classical Cut (Ctrl + X)
#define C_PASTE LCTL(KC_V) // Classical Paste (Ctrl + V)
#define I_COPY LCTL(KC_INS) // Alternative Copy (Ctrl + Insert)
#define I_CUT LSFT(KC_DEL) // Alternative Cut (Shift + Delete)
#define I_PASTE LSFT(KC_INS) // Alternative Paste (Shift + Insert)
#define L_COPY LSCTL(KC_C) // Linux Copy
#define L_PASTE LSCTL(KC_V) // Linux Paste

// Raccourcis Linux pour navigation entre bureaux
#define X_LT LCA(KC_LEFT) // Linux: previous desktop
#define X_RT LCA(KC_RIGHT) // Linux: next desktop
#define X_MX LCA(KC_UP) // Linux: maximize window
#define X_SB LCA(KC_B) // Linux: show all windows

Caractères spéciaux AZERTY

Implémentation complète des caractères spéciaux pour la programmation :

// Caractères spéciaux avec Alt Gr
case M_ARB: // @ Arobase
SEND_STRING(SS_DOWN(X_RALT) SS_TAP(X_0) SS_UP(X_RALT));
return false;
case M_HTG: // # Hashtag
SEND_STRING(SS_DOWN(X_RALT) SS_TAP(X_3) SS_UP(X_RALT));
return false;
case M_LBK: // { Left bracket
SEND_STRING(SS_DOWN(X_RALT) SS_TAP(X_4) SS_UP(X_RALT));
return false;
case M_PPE: // | Pipe
SEND_STRING(SS_DOWN(X_RALT) SS_TAP(X_6) SS_UP(X_RALT));
return false;

Fonctionnalités uniques

Macro de tag HTML avancée

Une macro sophistiquée pour la génération de tags HTML :

case M_ATG: // Advanced tag <>
SEND_STRING( \
SS_DOWN(X_RCTL) SS_DOWN(X_LSFT) SS_TAP(X_LEFT) SS_UP(X_LSFT) \
SS_TAP(X_X) SS_UP(X_RCTL) \
SS_TAP(X_NUBS) \
SS_DOWN(X_RCTL) SS_TAP(X_V) SS_UP(X_RCTL) \
SS_DOWN(X_RSFT) SS_TAP(X_NUBS) SS_UP(X_RSFT) \
SS_TAP(X_NUBS) \
SS_DOWN(X_RSFT) SS_TAP(X_DOT) SS_UP(X_RSFT) \
SS_DOWN(X_RCTL) SS_TAP(X_V) SS_UP(X_RCTL) \
SS_DOWN(X_RSFT) SS_TAP(X_NUBS) SS_UP(X_RSFT) \
SS_TAP(X_LEFT)SS_DOWN(X_RCTL) SS_TAP(X_LEFT) SS_UP(X_RCTL) \
SS_TAP(X_LEFT) SS_TAP(X_LEFT));
return false;

Support des accents français

Accès rapide aux caractères accentués :

case M_C_A: // â
SEND_STRING(SS_TAP(X_LBRC) SS_TAP(X_Q));
return false;
case M_C_E: // ê
SEND_STRING(SS_TAP(X_LBRC) SS_TAP(X_E));
return false;
case M_C_I: // î
SEND_STRING(SS_TAP(X_LBRC) SS_TAP(X_I));
return false;
case M_C_O: // ô
SEND_STRING(SS_TAP(X_LBRC) SS_TAP(X_O));
return false;
case M_C_U: // û
SEND_STRING(SS_TAP(X_LBRC) SS_TAP(X_U));
return false;

Debugging et optimisation

Gestion des erreurs

Mon keymap inclut une gestion robuste des états :

// Réinitialisation du rapid fire à la relâche des touches
} else { // key released
switch (keycode) {
case RF_MOUSE1:
case RF_MOUSE2:
case RF_MOUSE3:
case RF_SPACE:
rapid_fire_1 = 0;
rapid_fire_2 = 0;
return false;
}
}

Documentation et partage

README complet

J’ai créé une documentation exhaustive incluant :

  • Guide d’installation pas à pas
  • Schémas de toutes les couches
  • Explication des fonctionnalités avancées
  • Instructions de customisation
  • Système de configuration locale

🎯 Template réutilisable

Ma keymap est conçue comme un template réutilisable. Le fichier config.example.local.h permet à n’importe qui de créer sa propre configuration en quelques minutes.

Licence et partage

/**
* Copyright 2024 Olivier Pons / HQF Development *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*/

Fonctionnalités les plus utilisées

Macros e-mail (10x/jour)

Insertion automatique des signatures professionnelles

Navigation multi-bureau (50x/jour)

Raccourcis Linux pour switcher entre les espaces de travail

Symboles de programmation (200x/jour)

Accès direct aux caractères spéciaux sans Alt Gr

Copy/Paste multi-OS (150x/jour)

Support unifié pour différents environnements

Leçons apprises

Défis techniques surmontés

  • Gestion mémoire : Optimisation pour rester sous les limites du MCU
  • Timing des Tap Dance : Ajustement fin pour éviter les faux positifs
  • Compatibilité Multi-OS : Gestion des différences de keycodes
  • Audio/RGB synchronisé : Coordination des feedback visuels et sonores

Bonnes pratiques développées

  • Configuration modulaire avec fichiers locaux
  • Documentation exhaustive du code
  • Système de backup automatique
  • Tests progressifs des fonctionnalités
  • Optimisation basée sur l’usage réel

🎯 Un conseil…

La compilation QMK demande de la patience et de la méthodologie. Commencez simple, documentez chaque modification, et testez intensivement avant de déployer. Ma keymap représente plusieurs mois d’itérations et d’optimisations.

Code source et accès

Ma keymap complète est disponible avec :

  • Fichier keymap.c complet : 1000+ lignes documentées
  • Système de configuration locale : Template réutilisable
  • Documentation complète : README, schémas, guides
  • Scripts de build : Automatisation du processus
  • Historique des versions : Évolution et optimisations

🔗 Accès au code source

Le code source complet de ma keymap est intégré dans cet article. Vous pouvez voir tous les détails d’implémentation et adapter la configuration à vos besoins.

Performance de Ma Configuration

Statistiques d’Usage

Après 6 mois d’utilisation intensive de ma keymap :

Productivité

+30% sur les tâches de développement
Macros email utilisées 50x/jour

Confort

-80% douleurs poignets
Frappe plus fluide et naturelle

Vitesse

85 WPM maintenue
Précision accrue (98%)

Satisfaction

Workflow complètement transformé
Retour au clavier classique impossible

Évolutions futures

Améliorations prévues pour ma keymap :

  • Intégration de combos supplémentaires pour les caractères fréquents
  • Macros contextuelles selon l’application active
  • Optimisation des timings Tap Dance
  • Support étendu pour d’autres environnements de développement

Mon Setup Complet

Ma configuration finale représente un équilibre parfait entre fonctionnalité et utilisabilité :

Hardware

Moonlander avec switches Cherry MX Brown, poignets ergonomiques

Software

QMK firmware custom avec 7 couches optimisées

Workflow

Macros email, raccourcis Linux, caractères spéciaux programmation

Environnement

Ubuntu 22.04, développement Python/Django, intégration parfaite

Impact Réel

Cette configuration a transformé ma façon de travailler. L’investissement en temps pour développer cette keymap s’est révélé être l’une des meilleures optimisations de productivité que j’aie jamais faites.

Conseils pour débuter

Approche progressive

Semaine 1-2

Commencer avec une config simple, se concentrer sur le layout de base

Semaine 3-4

Ajouter la couche navigation, s’habituer aux Mod-Tap

Mois 2

Intégrer la couche symboles, premiers combos

Mois 3+

Fonctionnalités avancées, macros, optimisations fines

🎯 L’erreur à éviter

Ne pas tout changer d’un coup ! J’ai fait cette erreur au début et j’ai failli abandonner. Changez progressivement, une couche à la fois, et laissez-vous le temps de vous adapter.

Conclusion

Cette configuration représente 18 mois d’itérations et d’optimisations. Elle transforme complètement l’expérience de programmation et a considérablement amélioré mon confort de travail.

Le Moonlander n’est pas qu’un clavier, c’est un outil de productivité personnalisable à l’infini. Investir le temps nécessaire pour créer sa configuration parfaite est l’un des meilleurs ROI qu’un développeur puisse faire.

ZSA Moonlander : QMK : compilation

Pourquoi compiler soi-même ?

Bien que ZSA propose Oryx (leur configurateur en ligne), compiler le firmware QMK directement offre plusieurs avantages :

  • Accès à toutes les fonctionnalités avancées de QMK
  • Possibilité d’ajouter du code personnalisé
  • Contrôle total sur la configuration
  • Apprentissage approfondi du fonctionnement
  • Pas de limitation des couches ou fonctionnalités

Mon Objectif

Je voulais implémenter des fonctionnalités spécifiques comme des macros complexes pour mon workflow de développement Python/Django, des signatures email automatisées, et des raccourcis optimisés pour mon environnement Linux que Oryx ne permettait pas.

Prérequis et installation

Environnement de développement

IMPORTANT : J’utilise exclusivement une machine Ubuntu 22.04. Oubliez Windows et sa merde – même avec WSL2 c’est galère. Prenez une vraie distribution basée sur Debian (Ubuntu, Debian, Mint, Pop!_OS) ou au pire macOS.

Windows = Problèmes garantis

J’ai testé sur Windows 11 avec WSL2 : drivers USB foireux, permissions de merde, bugs aléatoires. Économisez-vous des heures de galère et utilisez un vrai OS Unix-like.

# Installation des dépendances sur Ubuntu
sudo apt update
sudo apt install git python3-pip build-essential
python3 -m pip install –user qmk

# Ajouter le chemin de QMK
echo ‘export PATH=$PATH:~/.local/bin’ >> ~/.bashrc
source ~/.bashrc

Clonage du dépôt (repository) QMK

# Cloner le repository QMK officiel
git clone https://github.com/qmk/qmk_firmware.git
cd qmk_firmware

# Configuration initiale
qmk setup

Structure de ma configuration

Ma keymap se trouve dans le dossier keyboards/zsa/moonlander/keymaps/hqf/ avec cette structure :

moonlander/keymaps/hqf/
├── keymap.c # Configuration principale (1000+ lignes)
├── config.example.local.h # Template de configuration personnelle
├── config.local.h # Ma configuration personnelle (git-ignored)
├── rules.mk # Fonctionnalités activées
└── README.md # Documentation complète

Système de configuration modulaire

J’ai implémenté un système intelligent de configuration personnelle :

// Dans keymap.c
#if __has_include(« config.local.h »)
#include « config.local.h »
#else
// Valeurs par défaut si config.local.h n’existe pas
#define SIGNATURE_1 « Example Name – Role »
#define SIGNATURE_2 « Example Name – Role\nhttps://example.com »
#define EMAIL_1 « example@domain.com »
#define EMAIL_2 « example@company.com »
#define CUSTOM_SOUND SONG(STARTUP_SOUND)
#endif

Avantage de cette approche

Le fichier config.local.h est ignoré par git, ce qui permet de partager la configuration publiquement sans exposer mes informations personnelles (emails, signatures).

Compilation et flash

Configuration rules.mk

Mon fichier rules.mk optimisé pour toutes les fonctionnalités :

# Enable Tap Dance feature
TAP_DANCE_ENABLE = yes

# Enable Audio features
AUDIO_ENABLE = yes
MUSIC_ENABLE = yes

# Commented features that can be enabled if needed
# MIDI_ENABLE = yes
# CONSOLE_ENABLE = no
# COMMAND_ENABLE = no

Commandes de compilation

# Compilation seule
qmk compile -kb zsa/moonlander -km hqf

# Compilation et flash en une fois
qmk flash -kb zsa/moonlander -km hqf

# Compilation avec verbose pour debug
qmk compile -kb zsa/moonlander -km hqf –verbose

Ma méthode de build

Voici comment je procède concrètement pour compiler et flasher :

# Ma méthode simple et efficace
cd ~/keyboards/moonlander/qmk_firmware.2024-12-11.pour.moi

qmk compile -kb moonlander -km hqf && qmk flash -kb moonlander -km hqf

Cette approche en une ligne combine compilation et flash : si la compilation réussit (&&), le flash se lance automatiquement. Simple et direct.

Troubleshooting Courants

Problèmes de Compilation

Erreurs Fréquentes

  • avr-gcc not found : Installer les outils de développement manquants
  • Permission denied : Problèmes de droits sur le port USB
  • Device not found : Clavier pas en mode bootloader
  • Memory overflow : Trop de fonctionnalités activées

Solutions Testées

# Réinstaller QMK en cas de problème
python3 -m pip uninstall qmk
python3 -m pip install –user qmk
qmk setup

# Permissions USB Linux
sudo usermod -a -G dialout $USER
# Puis se reconnecter

# Forcer le mode bootloader
# Appuyer sur le petit bouton à l’arrière du clavier
# Ou maintenir le bouton reset pendant le branchement

Résultats et performance

Métriques de performance

Après plusieurs mois d’utilisation intensive :

  • Gain de productivité : ~25% sur les tâches de développement
  • Réduction de fatigue : Diminution significative des douleurs au poignet
  • Vitesse de frappe : Maintien de 85 WPM avec une précision accrue
  • Workflow optimisé : Macros email et raccourcis spécialisés

Optimisation mémoire

Statistiques de mon firmware final :

📊 Utilisation Mémoire

Flash: 85% utilisé
RAM: 60% utilisée

⌨️ Fonctionnalités

7 couches complètes
40 effets sonores
20+ macros personnalisées

🎯 Performance

Latence < 1ms
Rapid Fire configurable
N-Key Rollover

🔧 Code

1000+ lignes C
Documentation complète
Config modulaire

Ressources et documentation

Liens essentiels

Outils complémentaires

QMK Toolbox

Interface graphique pour flasher les firmwares sans ligne de commande

Via/Vial

Configuration en temps réel pour certaines fonctionnalités de base

QMK Configurator

Interface web pour générer des configurations simples

Oryx (ZSA)

Configurateur officiel ZSA avec limitations par rapport à QMK pur

Conclusion

Compiler son propre firmware QMK pour le Moonlander est un projet ambitieux mais extrêmement gratifiant. Cette approche transforme complètement l’expérience de frappe et ouvre des possibilités infinies de personnalisation.

Retour sur Investissement

Les bénéfices obtenus justifient largement l’investissement en temps :

  • Productivité accrue : Macros et raccourcis optimisés pour mon workflow
  • Confort ergonomique : Réduction des tensions et fatigue
  • Personnalisation totale : Chaque aspect adapté à mes besoins
  • Évolutivité : Possibilité d’ajouter de nouvelles fonctionnalités
  • Apprentissage : Compréhension approfondie de QMK et du hardware

Cette configuration continue d’évoluer avec mes besoins, prouvant que QMK offre une plateforme exceptionnelle pour créer l’outil de saisie parfait.

Les défauts des claviers

Le problème fondamental

Nos claviers actuels ont été conçus dans les années 1870 pour les machines à écrire mécaniques. Plus de 150 ans plus tard, nous utilisons toujours le même design inadapté pour un usage intensif sur ordinateur.

🚨 Réalité Alarmante

Les troubles musculo-squelettiques (TMS) représentent 87% des maladies professionnelles en France, dont une grande partie liée à l’utilisation prolongée de claviers inadaptés . Source : 2024, santepubliquefrance

Problèmes ergonomiques majeurs

1. Position non-naturelle des mains

Les claviers traditionnels forcent nos mains dans une position complètement artificielle :

  • Rotation interne des avant-bras (pronation excessive)
  • Déviation cubitale des poignets
  • Extension dorsale des poignets
  • Rapprochement artificiel des mains

Position Naturelle

Mains écartées à la largeur des épaules, avant-bras parallèles, poignets dans l’axe des avant-bras

Position Forcée par les Claviers

Mains rapprochées, avant-bras en rotation, poignets en tension permanente

2. Tensions musculaires constantes

Cette position non-naturelle génère des tensions permanentes dans :

  • Les muscles de l’avant-bras (fléchisseurs et extenseurs)
  • Les tendons des poignets
  • Les muscles du cou et des épaules
  • Les muscles du dos (compensation posturale)

Pathologies Courantes

Syndrome du canal carpien

Compression du nerf médian dans le poignet, causée par la position en extension prolongée. Symptômes : fourmillements, engourdissements, douleurs irradiant dans la main et le bras.

Tendinites

Inflammation des tendons due aux mouvements répétitifs et aux tensions constantes. Particulièrement fréquent au niveau des extenseurs du poignet.

Syndrome de la souris

Douleurs de l’épaule, du cou et du bras dues à la position asymétrique pour atteindre la souris depuis un clavier traditionnel.

⚠️ Mon Expérience Personnelle

Après 30 ans de développement intensif, j’ai développé des douleurs chroniques aux poignets, des tensions cervicales permanentes et une fatigue excessive en fin de journée. C’est ce qui m’a poussé à chercher des alternatives.

Problèmes de productivité

Disposition AZERTY Inefficace

La disposition AZERTY (ou QWERTY) a été conçue pour ralentir la frappe sur les machines à écrire mécaniques afin d’éviter les bourrages. Cette logique n’a plus aucun sens aujourd’hui.

  • Répartition inégale de la charge entre les doigts
  • Mouvements excessifs des mains
  • Utilisation sub-optimale des doigts les plus forts
  • Enchaînements de touches difficiles

Touches modifiatrices mal placées

L’auriculaire gauche est surchargé avec Ctrl, Shift, Alt, alors que les pouces (les doigts les plus forts) sont sous-utilisés.

Accès difficile aux symboles

Pour les développeurs, l’accès aux symboles de programmation nécessite des contorsions constantes avec AltGr et autres combinaisons complexes.

L’illusion du clavier « ergonomique »

Beaucoup de claviers se prétendent « ergonomiques » avec des modifications superficielles :

Faux Ergonomiques

  • Repose-poignets en gel
  • Légère incurvation
  • Design « vague »

Bien que les repose-poignets en gel constituent la première solution à mettre en œuvre et demeurent très efficaces pour soulager les tensions immédiates, ces améliorations restent des palliatifs qui ne résolvent pas le problème fondamental de la position des mains. Un clavier ergonomique séparé reste indispensable pour une solution complète.

Vraie Ergonomie

  • Séparation physique (split)
  • Inclinaison ajustable
  • Répartition optimisée des touches

Respect de l’anatomie naturelle des mains et des bras.

Le coût caché

Impact sur la carrière

Les TMS peuvent sérieusement affecter une carrière dans le développement ou tout métier nécessitant une frappe intensive. J’ai vu des collègues contraints de réduire leur temps de travail ou changer de métier.

Coûts médicaux

Consultations, kinésithérapie, parfois chirurgie… Les TMS représentent un coût énorme pour la sécurité sociale et les individus.

Perte de productivité

  • Fatigue plus rapide
  • Pauses plus fréquentes
  • Concentration diminuée par la douleur
  • Vitesse de frappe réduite à long terme

💡 La Solution

C’est exactement pour résoudre ces problèmes que des claviers comme le Moonlander ont été développés. Ils ne sont pas qu’un gadget de geek, mais une vraie solution de santé au travail.

Pourquoi peu de gens font le changement ?

Résistance au changement

Nous sommes habitués à nos mauvaises habitudes. Changer de clavier implique une période d’adaptation douloureuse que beaucoup ne veulent pas affronter.

Méconnaissance des alternatives

La plupart des gens ignorent qu’il existe des alternatives ergonomiques viables aux claviers traditionnels.

Investissement Initial

Un bon clavier ergonomique coûte plus cher qu’un clavier standard, mais c’est un investissement dérisoire comparé aux coûts potentiels des TMS.

🎯 Mon conseil

N’attendez pas d’avoir mal pour agir ! La prévention est beaucoup plus facile que la guérison. Si vous passez plus de 4h par jour à taper, un clavier ergonomique n’est pas un luxe, c’est une nécessité.

La prise de conscience

Réaliser les défauts des claviers traditionnels a été le premier pas vers ma transition au Moonlander. Une fois qu’on comprend les enjeux de santé et de productivité, investir dans un vrai clavier ergonomique devient évident.

Dans l’article suivant, je détaille comment j’ai compilé le firmware QMK pour créer une expérience parfaitement adaptée à mes besoins.

ZSA Moonlander : le clavier ultime

Qu’est-ce que le Moonlander ?

Le Moonlander est un clavier mécanique ergonomique split conçu par ZSA Technology Labs. Il représente l’évolution ultime du clavier traditionnel, offrant une expérience de frappe révolutionnaire grâce à sa conception innovante et sa personnalisation infinie.

🚀 Innovation Clé

Le Moonlander n’est pas juste un clavier – c’est un outil de productivité qui s’adapte parfaitement à votre façon de travailler et évolue avec vos besoins.

Contrairement aux claviers traditionnels qui nous forcent à adapter nos mains à leur forme rigide, le Moonlander s’adapte à l’anatomie naturelle de nos mains et à notre posture de travail.

Split Design révolutionnaire

La caractéristique la plus frappante du Moonlander est sa conception split (divisée). Chaque moitié du clavier peut être positionnée indépendamment, permettant :

  • Un alignement naturel des épaules
  • Une réduction des tensions dans les poignets
  • Une posture plus ergonomique
  • Une adaptation à différentes morphologies

Clavier Traditionnel

Force une position fixe des mains, créant des tensions et des déformations posturales à long terme.

Moonlander Split

Permet un positionnement naturel des mains, respectant l’anatomie et réduisant la fatigue.

Personnalisation totale avec QMK

Le Moonlander utilise le firmware QMK (Quantum Mechanical Keyboard), offrant des possibilités de personnalisation pratiquement infinies :

Layers (couches)

Créez plusieurs couches de touches pour accéder à différentes fonctions. Imaginez avoir plusieurs claviers en un seul !

Couche Base

Votre disposition principale pour la frappe quotidienne (AZERTY dans mon cas mais vous pouvez faire du QWERTY, de l’AZERTY, du Colemak, etc.)

Couche Symboles

Accès rapide aux symboles de programmation et caractères spéciaux

Couche Navigation

Touches directionnelles, page up/down, home/end optimisées

Couches Personnalisées

Macros, raccourcis spécifiques à vos applications favoris

Fonctionnalités avancées

  • Tap Dance : une touche peut avoir plusieurs fonctions selon le nombre de pressions
  • Mod-Tap : une touche agit comme modificateur quand maintenue, comme caractère quand tapée
  • Combos : combinaisons de touches personnalisées
  • Macros : séquences automatisées de touches
  • Leader Key : séquences de commandes comme dans Vim

Caractéristiques techniques

⌨️ Switches

Hot-swap Kailh sockets – changez vos switches sans soudure

🔌 Connectivité

USB-C avec câbles TRRS pour connecter les deux moitiés

💡 RGB

Éclairage RGB par touche entièrement personnalisable

🎯 Précision

Polling rate élevé pour les gamers et professionnels exigeants

Pourquoi choisir le Moonlander ?

Pour les développeurs

Programmation plus efficace avec des couches dédiées aux symboles, navigation optimisée dans le code, et macros pour les snippets fréquents.

Pour la productivité

Réduction drastique des mouvements de mains, accès instantané aux raccourcis, et workflow personnalisé selon vos applications.

Pour la santé

Prévention des troubles musculo-squelettiques, réduction de la fatigue, et amélioration de la posture de travail.

⚠️ Courbe d’apprentissage

Le passage au Moonlander demande un investissement en temps et patience. Comptez 2-4 semaines pour retrouver votre vitesse de frappe habituelle, mais les bénéfices à long terme en valent largement la peine !

Mon expérience personnelle

Après des années sur des claviers traditionnels et l’apparition de douleurs aux poignets, le passage au Moonlander a été une révélation. La personnalisation poussée m’a permis de créer un environnement de travail parfaitement adapté à mes besoins de développeur.

Dans les articles suivants, je détaille mon parcours complet : les problèmes rencontrés avec les claviers classiques, le processus de compilation du firmware, et ma configuration personnalisée avec les raisons derrière chaque choix.

Commentaires fermés sur ZSA Moonlander : le clavier ultime Publié dans Mots-clé

Lemmings : l’histoire derrière le classique de DMA Design

Lemmings : L’histoire corrigée du jeu vidéo culte

Il y a plusieurs décennies, un jeu a captivé des millions de joueurs et reste, à ce jour, considéré comme l’un des titres les plus originaux, addictifs et exigeants de l’histoire. Nous parlons de Lemmings, un jeu qui a connu d’innombrables adaptations et qui a indéniablement marqué son époque.

L’origine des Lemmings

Pour comprendre la genèse de Lemmings, il faut se tourner vers le studio de développement écossais DMA Design et son éditeur, Psygnosis. L’idée du jeu est née d’une simple animation de petits personnages de 8×8 pixels créée par Mike Dailly, l’un des programmeurs de DMA, alors qu’il expérimentait pour un autre projet. C’est en voyant cette animation que son collègue, Russell Kay, s’est exclamé : « Il y a un jeu là-dedans ! » et a suggéré de nommer ces créatures « Lemmings ». David Jones, le fondateur de DMA Design, a ensuite dirigé le projet pour en faire le jeu que nous connaissons.

Le jeu est sorti le 14 février 1991 sur l’ordinateur Amiga, un jour de Saint-Valentin. Le succès fut immédiat et phénoménal : le jour de sa sortie, il s’est vendu à 55 000 exemplaires, un record pour l’époque. Au total, on estime que la franchise a vendu entre 15 et 20 millions d’exemplaires sur toutes les plateformes confondues.

Comment y jouer ?

Le concept de Lemmings est simple en apparence : dans chaque niveau, des créatures aux cheveux verts apparaissent via une trappe et marchent inlassablement, se dirigeant vers une mort certaine si le joueur n’intervient pas. La mission est de leur assigner des compétences spécifiques pour modifier le décor et leur créer un passage sécurisé jusqu’à la sortie.

Pour cela, le joueur dispose d’un nombre limité de huit compétences, parmi lesquelles :

  • Grimpeur (Climber) : pour escalader les parois verticales.
  • Flotteur (Floater) : pour utiliser un parachute et survivre aux chutes mortelles.
  • Bloqueur (Blocker) : pour stopper les autres lemmings et les forcer à faire demi-tour.
  • Bombe (Bomber) : pour faire exploser un lemming après un compte à rebours de cinq secondes.
  • Constructeur (Builder) : pour bâtir des escaliers.
  • Creuseur (Digger/Miner/Basher) : pour percer des tunnels à la verticale, en diagonale ou à l’horizontale.

Le jeu original proposait 120 niveaux répartis en quatre niveaux de difficulté : « Fun » (Amusant), « Tricky » (Délicat), « Taxing » (Éprouvant) et « Mayhem » (Chaos). Pour chaque niveau, il fallait sauver un certain pourcentage de lemmings dans le temps imparti.

Qu’est-il arrivé aux Lemmings ?

L’immense succès du jeu a entraîné une vague de portages sur la quasi-totalité des systèmes de l’époque : PC (MS-DOS), Super Nintendo, Game Boy, Mega Drive et bien d’autres. Des suites et extensions ont rapidement vu le jour, comme Oh No! More Lemmings dès 1991, qui ajoutait 100 niveaux inédits.

Mais que sont devenus ses créateurs ? DMA Design a continué sur sa lancée pour créer une autre franchise légendaire : Grand Theft Auto (GTA). Le studio a finalement été racheté et est aujourd’hui connu sous le nom de Rockstar North, un pilier de l’industrie du jeu vidéo.

Et qu’en est-il de la propriété intellectuelle (IP) du jeu ? Contrairement à une idée répandue, les droits n’ont pas été conservés par DMA Design. C’est l’éditeur, Psygnosis, qui détenait l’IP. Psygnosis a ensuite été racheté par Sony en 1993. C’est la raison pour laquelle les remakes et nouvelles versions de Lemmings sont apparus sur les consoles PlayStation, notamment sur PSP en 2006, sur PS Vita et même sur mobile, assurant ainsi la pérennité de ces créatures attachantes.

Home assistant

Home Assistant : le cœur de votre maison connectée

Dans le monde de la domotique, de nombreuses solutions promettent de vous simplifier la vie. Mais peu offrent la puissance, la flexibilité et le respect de la vie privée de Home Assistant. Si vous cherchez à unifier tous vos appareils connectés, à créer des automatisations poussées et à garder le contrôle total sur vos données, alors vous êtes au bon endroit. Découvrons ensemble ce qu’est Home Assistant et comment nos guides peuvent vous aider à vous lancer.

Qu’est-ce que Home Assistant et pourquoi l’adopter ?

Home Assistant est une plateforme domotique open-source et gratuite qui s’installe localement chez vous, par exemple sur un mini-ordinateur comme un Raspberry Pi. [4] Son rôle est de servir de « cerveau » central pour tous vos équipements intelligents (ampoules, prises, thermostats, capteurs, etc.), quelle que soit leur marque. [4, 7]

Les avantages à utiliser Home Assistant sont nombreux et déterminants :

  • Confidentialité et contrôle local : Contrairement à de nombreuses solutions cloud, Home Assistant fonctionne chez vous. Vos données ne sont pas envoyées sur des serveurs externes, et votre domotique continue de fonctionner même en cas de coupure Internet. [6]
  • Compatibilité universelle : Avec des milliers d’intégrations disponibles, Home Assistant peut communiquer avec une quantité impressionnante d’appareils. [8] Il fait le pont entre des écosystèmes qui, normalement, ne se parlent pas.
  • Personnalisation sans limites : De la création de tableaux de bord sur mesure à la mise en place de scénarios complexes basés sur n’importe quel déclencheur, tout est possible. [10]
  • Une communauté forte et active : En tant que projet open-source, il bénéficie de la contribution de milliers de passionnés à travers le monde, garantissant des évolutions constantes et une aide précieuse. [5]

Passez à la pratique avec nos guides détaillés

Pour vous aider à exploiter le potentiel de Home Assistant, nous avons préparé des articles qui abordent des problématiques concrètes. Ils sont conçus pour vous faire gagner du temps et vous donner les bonnes pratiques dès le départ.

1. Maîtrisez votre consommation avec une carte de suivi énergétique

L’une des applications les plus utiles de la domotique est le suivi de la consommation électrique. Dans ce guide, nous vous montrons pas à pas comment transformer les données brutes de vos prises connectées en un tableau de bord visuel et interactif. Vous apprendrez à afficher la puissance en temps réel, à estimer les coûts et à identifier les appareils les plus gourmands.

→ Lire l’article : Créer une carte de configuration personnalisée pour les prises de courant

2. Identifiez et listez vos appareils de manière fiable

Pour créer des automatisations, il est crucial de savoir exactement comment s’appellent vos appareils (leur « ID d’entité »). Il peut arriver que les noms techniques diffèrent de ceux que vous avez choisis, créant de la confusion. Cet article vous explique pourquoi ce phénomène se produit et vous montre la méthode la plus simple et la plus sûre pour obtenir la liste correcte et à jour de toutes vos prises, directement depuis l’interface de Home Assistant.

→ Lire l’article : Lister nos prises de courant avec l’API, le guide complet

Commentaires fermés sur Home assistant Publié dans

Home assistant : comment obtenir la VRAIE liste de nos prises (switch) : le guide complet

Quand nous voulons automatiser nos appareils dans Home Assistant, la première étape est souvent d’obtenir une liste fiable de nos entités, comme nos prises connectées (les « switch »). Une méthode qui semble logique serait d’interroger l’API, mais nous avons découvert que cela peut prêter à confusion. Voyons ensemble pourquoi et quelle est la méthode la plus simple et la plus fiable pour y parvenir.


L’explication : pourquoi certains identifiants semblent étranges ?

Nous avons parfois remarqué une différence entre les identifiants de nos prises et ceux listés par certains outils. Cela vient de la manière dont Home Assistant gère les noms et les identifiants (Entity ID) des appareils, surtout après leur première connexion via une intégration comme Zigbee2MQTT.

1. Découverte initiale de l’appareil

Quand nous ajoutons une nouvelle prise, Home Assistant lui crée automatiquement une entité avec un ID par défaut, souvent basé sur son adresse technique (comme l’adresse IEEE Zigbee). C’est pourquoi nous pouvons voir des entrées peu parlantes comme switch.0x70b3d52b601a7af7.

2. Renommage par nos soins

Ensuite, nous allons logiquement dans l’interface de Home Assistant pour trouver ce nouvel appareil et le renommer afin qu’il soit plus facile à identifier. Par exemple :

  • Nom convivial : « Cellier Prise Machine Laver »
  • ID de l’entité : Nous le changeons pour switch.cellier_prise_machine_laver.

3. Le « fantôme » de l’ancien ID

Voici le point crucial : Home Assistant garde souvent une trace de l’ancien ID (switch.0x70b3d52b601a7af7) mais le désactive. L’entité que nous utilisons au quotidien est bien la nouvelle (switch.cellier_prise_machine_laver). Le problème est que les requêtes brutes sur l’API peuvent lister ces anciens ID « fantômes » qui sont désactivés et cachés dans l’interface, mais toujours présents dans la base de données.

Les entités que nous voyons correctement, comme switch.veranda_prise_armoire ou switch.cuisine_prise_table, sont simplement des appareils pour lesquels nous avons déjà fait ce renommage depuis longtemps.


La Solution : obtenir la liste correcte et active en 30 secondes

La meilleure méthode n’est donc pas de scripter une requête API, mais d’utiliser directement l’interface de Home Assistant. C’est la source de vérité la plus fiable pour connaître l’état actuel de nos entités.

Voici comment nous pouvons obtenir la liste correcte et complète :

  1. Allons dans notre interface Home Assistant.
  2. Naviguons vers Paramètres > Appareils et services, puis cliquons sur l’onglet Entités.
  3. Dans la barre de recherche située en haut de la liste, tapons simplement switch. pour n’afficher que les commutateurs.
  4. (Optionnel) Pour être encore plus précis, nous pouvons cliquer sur l’icône de filtre et sélectionner l’intégration qui gère nos prises (par exemple, Zigbee2MQTT, ZHA, Tuya, etc.).

Nous obtiendrons alors la liste exacte de toutes nos entités switch actuellement actives, avec les bons ID que nous avons définis.

Capture d'écran de l'interface des entités Home Assistant filtrée par switch.

C’est la colonne « ID de l’entité » de cette vue filtrée que nous devons utiliser pour toutes nos futures configurations et automatisations.

Home-assistant : une carte de configuration personnalisée pour les prises de courant

Cherchons-nous à mieux comprendre et gérer notre consommation électrique ? Grâce à la puissance de Home Assistant et à une carte de configuration personnalisée (config-template-card), il est possible de créer un tableau de bord dynamique et détaillé de nos prises électriques.

Dans cet article, nous allons décortiquer ensemble un exemple de template pour montrer comment nous pouvons regrouper, analyser et afficher les données de nos prises connectées de manière claire et intuitive.

Avant de commencer, assurons-nous d’avoir :

  • Home Assistant installé et fonctionnel.
  • Des prises connectées (Zigbee, Wi-Fi, etc.) intégrées à Home Assistant et qui remontent la consommation d’énergie (capteurs power et energy).
  • La carte config-template-card installée depuis HACS (Home Assistant Community Store).
  • Une connaissance de base du langage de templating Jinja2, utilisé par Home Assistant, est un plus !

Comprendre le Template : Notre tableau de bord décortiqué

Avant de nous plonger dans le code, il est essentiel de comprendre comment ce template fonctionne. Il ne s’agit pas d’une simple suite d’instructions, mais d’un petit programme dynamique qui génère une interface riche et interactive. Il utilise le langage de templating Jinja2, intégré à Home Assistant, pour transformer les données brutes de nos capteurs en informations claires et utiles.

Voici une analyse détaillée, section par section, de tout ce que nous pouvons faire et personnaliser.


La Structure de Base : custom:config-template-card

Le cœur de notre installation est cette carte personnalisée. Elle agit comme un « moteur » qui va lire toutes nos entités et régénérer le contenu d’une autre carte (ici, une carte markdown qui interprète du HTML) à chaque changement d’état.

  • entities : C’est la liste de surveillance. Nous devons y placer toutes les entités (interrupteurs, capteurs de puissance, etc.) que nous souhaitons utiliser dans notre template. Dès que l’état de l’une d’elles change, toute la carte se met à jour en temps réel.
  • card : Définit la carte qui sera affichée. Nous utilisons type: markdown car elle nous offre une liberté totale sur la mise en forme grâce à l’interprétation du HTML.

Section 1 : Définitions & Variables Centrales

Au début du code, nous définissons toutes les variables qui serviront de base à notre tableau de bord. C’est la « centrale de configuration » de notre template.

  • {%- set days = ... -%} : Récupère la valeur d’un sélecteur (input_select). Cela nous permet de changer à la volée la période d’analyse de l’historique sans toucher au code.
  • {%- set outlets_data = [...] -%} : La variable la plus importante. C’est une liste où l’on associe l’identifiant technique de chaque prise à un nom convivial (ex: 'Salon TV'). Pour ajouter ou modifier une prise, il suffit de le faire dans cette liste !
  • {%- set kwh_cost = ... -%} : Ici, nous définissons le coût de notre kilowattheure pour obtenir des estimations financières précises.
  • {%- set outlets_total = 12 -%} : Le nombre total de prises listées. Pensez à mettre ce chiffre à jour si vous ajoutez ou supprimez des appareils de la liste outlets_data.
  • {%- set unavailable_states = [...] -%} : Une sécurité pour éviter les erreurs de calcul si une prise devient indisponible (unavailable) ou si son état est inconnu (unknown).

Section 2 : Calculs des Totaux

Avant d’afficher quoi que ce soit, le template effectue une première boucle pour calculer toutes les valeurs globales. Cela évite de répéter les mêmes calculs plusieurs fois.

  • {%- set total_power = namespace(sum=0) -%} : Nous utilisons un namespace. C’est une astuce Jinja2 pour créer une variable qui peut être modifiée à l’intérieur d’une boucle. Ici, nous créons des « compteurs » pour la puissance totale, l’énergie totale et le nombre de prises allumées.
  • {%- for ... -%} ... {%- endfor -%} : La boucle parcourt chaque prise de notre liste outlets_data et additionne les puissances et énergies pour alimenter nos compteurs.

Section 3 : Tableau détaillé des prises

C’est ici que la magie opère pour afficher la liste de tous nos appareils. Le code génère dynamiquement un tableau HTML pour un affichage propre et aligné.

  • <thead> <tr> <th>...</th> </tr> </thead> : Ces balises définissent la section d’en-tête de notre tableau.
  • {%- for outlet_info in outlets_data -%} : Une seconde boucle parcourt nos prises, mais cette fois pour générer une ligne de tableau (<tr>) pour chaque appareil.
  • Icônes dynamiques :
    • switch_icon : Affiche un point vert 🟢 si la prise est allumée, rouge 🔴 si elle est éteinte, et blanc ⚪ si l’état est inconnu.
    • power_icon : Donne un indice visuel de la consommation : un feu 🔥 pour une forte consommation, un éclair ⚡ pour une consommation modérée, et une ampoule 💡 pour une faible consommation.
  • {{ power | round(1) }} : Le filtre round(1) permet d’arrondir les chiffres à une décimale pour un affichage plus lisible.

Section 4 : Tableau de Bord Global & Analyse Financière

Cette section reprend les totaux calculés précédemment pour les afficher dans un tableau de synthèse clair, incluant des conversions et estimations.

  • Pourcentages et Conversions : Le code calcule le pourcentage de prises actives et convertit la puissance totale de Watts (W) en kilowatts (kW).
  • Estimations de Coût : En utilisant notre variable kwh_cost, le template estime le coût financier basé sur la consommation enregistrée (total_energy) et sur la puissance instantanée (total_power).

Section 5 : Analyse Intelligente de la Consommation

Pour aller plus loin qu’un simple affichage, cette section analyse la consommation en temps réel pour identifier les appareils les plus gourmands.

  • Catégorisation : Le code utilise une condition if/elif/else pour classer chaque appareil dans l’une des trois listes : « Gros », « Modérés » ou « Faibles » consommateurs.
  • Affichage Conditionnel : La section entière, ainsi que chaque catégorie, ne s’affiche que si elle contient au moins un appareil. Notre tableau de bord reste ainsi propre et ne montre que les informations pertinentes.

Section 6 : Recommandations Dynamiques

La touche finale : un tableau de bord qui nous donne des conseils !

  • {%- if total_power.sum > 300 -%} : Cette section n’apparaît que si notre consommation totale dépasse un seuil que nous définissons (ici, 300W).
  • Message d’alerte : Si le seuil est dépassé, un message formaté en liste à puces (<ul>) apparaît pour nous alerter et nous donner des pistes d’action. C’est l’exemple parfait d’une interface qui s’adapte au contexte.

Nous avons maintenant toutes les clés pour comprendre, adapter et faire évoluer ce template selon nos besoins !

type: custom:config-template-card
entities:
  - input_select.garden_history_days
  - switch.0x70b3d52b601433db
  - sensor.0x70b3d52b601433db_power
  - sensor.0x70b3d52b601433db_energy
  - sensor.0x70b3d52b601433db_linkquality
  - switch.0x70b3d52b601a7af7
  - sensor.0x70b3d52b601a7af7_power
  - sensor.0x70b3d52b601a7af7_energy
  - sensor.0x70b3d52b601a7af7_linkquality
  - switch.0x70b3d52b6017f0cd
  - sensor.0x70b3d52b6017f0cd_power
  - sensor.0x70b3d52b6017f0cd_energy
  - sensor.0x70b3d52b6017f0cd_linkquality
  - switch.0x70b3d52b601a79fc
  - sensor.0x70b3d52b601a79fc_power
  - sensor.0x70b3d52b601a79fc_energy
  - sensor.0x70b3d52b601a79fc_linkquality
  - switch.0x70b3d52b601a7a26
  - sensor.0x70b3d52b601a7a26_power
  - sensor.0x70b3d52b601a7a26_energy
  - sensor.0x70b3d52b601a7a26_linkquality
  - switch.cuisine_prise_table
  - sensor.cuisine_prise_table_power
  - sensor.cuisine_prise_table_energy
  - sensor.cuisine_prise_table_linkquality
  - switch.cuisine_prise_the
  - sensor.cuisine_prise_the_power
  - sensor.cuisine_prise_the_energy
  - sensor.cuisine_prise_the_linkquality
  - switch.cuisine_prise_cafe
  - sensor.cuisine_prise_cafe_power
  - sensor.cuisine_prise_cafe_energy
  - sensor.cuisine_prise_cafe_linkquality
  - switch.veranda_prise_piscine
  - sensor.veranda_prise_piscine_power
  - sensor.veranda_prise_piscine_energy
  - sensor.veranda_prise_piscine_linkquality
  - switch.veranda_prise_armoire
  - sensor.veranda_prise_armoire_power
  - sensor.veranda_prise_armoire_energy
  - sensor.veranda_prise_armoire_linkquality
  - switch.jardin_prise_ikea
  - sensor.jardin_prise_ikea_power
  - sensor.jardin_prise_ikea_energy
  - sensor.jardin_prise_ikea_linkquality
  - switch.0x70b3d52b601440c9
  - sensor.0x70b3d52b601440c9_power
  - sensor.0x70b3d52b601440c9_energy
card:
  type: markdown
  title: 🔌 Prises Électriques
  content: >
    {%- set days = states('input_select.garden_history_days') | int(3) -%}
    {%- set now_time = now() -%}
    {%- set start_date = (now_time - timedelta(days=days)).strftime('%Y-%m-%dT%H:%M:%S.001Z') -%}
    {%- set end_date = (now_time - timedelta(minutes=10)).strftime('%Y-%m-%dT%H:%M:%S.001Z') -%}
    {%- set date_params = '&start_date=' ~ start_date ~ '&end_date=' ~ end_date -%}
    {%- set outlets_data = [
      ['0x70b3d52b601433db', 'Salon TV'],
      ['0x70b3d52b601a7af7', 'M. à laver'],  
      ['0x70b3d52b6017f0cd', 'Grille-Pain'],
      ['0x70b3d52b601a79fc', 'Congélateur'],
      ['0x70b3d52b601a7a26', 'Frigo'],
      ['cuisine_prise_table', 'Cuisine Table'],
      ['cuisine_prise_the', 'Cuisine Thé'],
      ['cuisine_prise_cafe', 'Cuisine Café'],
      ['veranda_prise_piscine', 'Piscine'],
      ['veranda_prise_armoire', 'Veranda bas'],
      ['jardin_prise_ikea', 'Jardin IKEA'],
      ['0x70b3d52b601440c9', 'Prise ?']
    ] -%}
    {%- set kwh_cost = 0.15 -%}
    {%- set outlets_total = 12 -%}
    {%- set unavailable_states = ['unavailable', 'unknown', 'none'] -%}

    <div>
      <div> 📅 <strong>Historique : {{ days }} jour{{ 's' if days > 1 else '' }}</strong> </div>
      <table>
        <thead>
          <tr>
            <th>Prise</th>
            <th>Temps Réel</th>
            <th>Total</th>
            <th>LQI</th>
          </tr>
        </thead>
        <tbody>
          {%- for outlet_info in outlets_data %}
            {%- set outlet_id = outlet_info[0] -%}
            {%- set outlet_name = outlet_info[1] -%}
            {%- set power_state = states('sensor.' ~ outlet_id ~ '_power') -%}
            {%- set energy_state = states('sensor.' ~ outlet_id ~ '_energy') -%}
            {%- set lqi_state = states('sensor.' ~ outlet_id ~ '_linkquality') -%}
            {%- set switch_state = states('switch.' ~ outlet_id) -%}
            {%- set power = power_state | float(0) if power_state not in unavailable_states else 0 -%}
            {%- set energy = energy_state | float(0) if energy_state not in unavailable_states else 0 -%}
            {%- set lqi = lqi_state | int(0) if lqi_state not in unavailable_states else 0 -%}
            {%- set switch_icon = '🟢' if switch_state == 'on' else '🔴' if switch_state == 'off' else '⚪' -%}
            {%- set power_icon = '🔥' if power > 100 else '⚡' if power > 50 else '💡' if power > 0 else '⚪' -%}
            {%- set history_url = '/history?entity_id=sensor.' ~ outlet_id ~ '_power,sensor.' ~ outlet_id ~ '_energy' ~ date_params -%}
            <tr>
              <td>{{ switch_icon }} {{ outlet_name }}</td>
              <td>{{ power_icon }} <a href="{{ history_url }}"> {{ power }}W</a></td>
              <td><a href="{{ history_url }}">{{ energy | round(2) }} kWh</a></td>
              <td>📊 <a href="{{ history_url }}">{{ lqi }}</a></td>
            </tr>
          {%- endfor %}
        </tbody>
      </table>

      {%- set total_power = namespace(sum=0) -%}
      {%- set total_energy = namespace(sum=0) -%}
      {%- set outlets_on = namespace(count=0) -%}
      {%- for outlet_info in outlets_data -%}
        {%- set outlet_id = outlet_info[0] -%}
        {%- set switch_state = states('switch.' ~ outlet_id) -%}
        {%- set power_state = states('sensor.' ~ outlet_id ~ '_power') -%}
        {%- set energy_state = states('sensor.' ~ outlet_id ~ '_energy') -%}
        {%- set is_on = switch_state == 'on' -%}
        {%- set power = power_state | float(0) if power_state not in unavailable_states else 0 -%}
        {%- set energy = energy_state | float(0) if energy_state not in unavailable_states else 0 -%}
        {%- if is_on -%}
          {%- set outlets_on.count = outlets_on.count + 1 -%}
        {%- endif -%}
        {%- set total_power.sum = total_power.sum + power -%}
        {%- set total_energy.sum = total_energy.sum + energy -%}
      {%- endfor %}

      <h3>⚡ Tableau de Bord Électrique</h3>
      <table>
        <thead>
          <tr>
            <th>📊 Métriques</th>
            <th>Valeur</th>
            <th>Détail</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>🔌 Prises Actives</td>
            <td>{{ outlets_on.count }} / {{ outlets_total }}</td>
            <td>{{ ((outlets_on.count / outlets_total) * 100) | round(1) }}%</td>
          </tr>
          <tr>
            <td>⚡ Puissance Totale</td>
            <td>{{ total_power.sum | round(1) }}W</td>
            <td>{{ (total_power.sum / 1000) | round(2) }} kW</td>
          </tr>
          <tr>
            <td>📈 Consommation Totale</td>
            <td>{{ total_energy.sum | round(1) }} kWh</td>
            <td>≈ {{ (total_energy.sum * kwh_cost) | round(2) }}€</td>
          </tr>
          <tr>
            <td>⏱️  Coût Journalier Estimé</td>
            <td>{{ ((total_power.sum * 24 / 1000) * kwh_cost) | round(2) }}€</td>
            <td>{{ (total_power.sum * 24 / 1000) | round(2) }} kWh/j</td>
          </tr>
        </tbody>
      </table>
      {%- set high_consumers = [] -%}
      {%- set medium_consumers = [] -%}
      {%- set low_consumers = [] -%}
      {%- for outlet_info in outlets_data -%}
        {%- set outlet_id = outlet_info[0] -%}
        {%- set outlet_name = outlet_info[1] -%}
        {%- set power = states('sensor.' ~ outlet_id ~ '_power') | float(0) -%}
        {%- if power > 50 -%}
          {%- set high_consumers = high_consumers + [outlet_name ~ ' (' ~ power ~ 'W)'] -%}
        {%- elif power > 5 -%}
          {%- set medium_consumers = medium_consumers + [outlet_name ~ ' (' ~ power ~ 'W)'] -%}
        {%- elif power > 0 -%}
          {%- set low_consumers = low_consumers + [outlet_name ~ ' (' ~ power ~ 'W)'] -%}
        {%- endif -%}
      {%- endfor -%}

      {%- if high_consumers | length > 0 or medium_consumers | length > 0 -%}
        <h3>🔥 Analyse de Consommation</h3>
        {%- if high_consumers | length > 0 -%}
          <div><strong>🔴 Gros Consommateurs (>50W) :</strong><br>
            {%- for consumer in high_consumers %}
              <span>• {{ consumer }}</span>
            {%- endfor %}
          </div>
        {%- endif -%}
        {%- if medium_consumers | length > 0 -%}
          <div><strong>🟡 Consommateurs Modérés (5-50W) :</strong><br>
            {%- for consumer in medium_consumers %}
              <span>• {{ consumer }}</span>
            {%- endfor %}
          </div>
        {%- endif -%}
        {%- if low_consumers | length > 0 -%}
          <div><strong>🟢 Faible Consommation (<5W) :</strong><br>
            {%- for consumer in low_consumers %}
              <span>• {{ consumer }}</span>
            {%- endfor %}
          </div>
        {%- endif -%}
      {%- endif -%}

      {%- if total_power.sum > 300 -%}
        <h3>💡 Recommandations</h3>
        <div>
          <ul>
            <li>⚠️ Consommation élevée détectée ({{ total_power.sum | round(1) }}W)</li>
            <li>🔍 Vérifiez les appareils en veille non nécessaires</li>
            <li>⏰ Programmez les gros consommateurs aux heures creuses</li>
            <li>📊 Surveillez l'évolution sur {{ days }} jours</li>
          </ul>
        </div>
      {%- endif -%}
    </div>

Commentaires fermés sur Home-assistant : une carte de configuration personnalisée pour les prises de courant Publié dans Mots-clé , ,

Écran Noir (Black Screen) – un outil simple mais utile

Écran Noir (Black Screen) – Un outil simple mais utile

J’ai récemment ajouté une fonctionnalité simple mais pratique à mon site : une page « Écran Noir » accessible à l’adresse olivierpons.fr/black-screen.

Qu’est-ce que c’est ?

Il s’agit simplement d’une page web complètement noire, sans aucun élément d’interface ou contenu visible. Elle a été conçue pour afficher un écran noir pur qui occupe la totalité de votre navigateur.

À quoi ça sert ?

Cette page peut être utilisée dans plusieurs situations pratiques :

  1. Présentations et conférences : Pour faire une pause entre deux diapositives ou temporairement masquer votre écran.
  2. Économie d’énergie : Un écran noir consomme moins d’énergie sur les écrans OLED/AMOLED.
  3. Réduction de la luminosité : Dans un environnement sombre, quand vous avez besoin d’une source de lumière minimale.
  4. Tests d’affichage : Pour vérifier les fuites de lumière ou la qualité du noir sur votre écran.
  5. Méditation ou concentration : Éliminer les distractions visuelles pendant une session de concentration.

Comment ça fonctionne ?

Techniquement, c’est une simple page HTML statique avec un fond noir qui occupe 100% de l’écran et désactive le défilement. Elle est servie directement par Nginx sans passer par WordPress.

Cette solution a été implémentée avec l’aide de Claude, l’assistant IA d’Anthropic, qui m’a guidé dans la configuration Nginx et la création du fichier HTML approprié.

N’hésitez pas à l’utiliser quand vous en avez besoin, c’est un petit outil sans prétention mais qui peut s’avérer étonnamment utile !

Tableau comparatif des algorithmes

Labyrinthes : différents algorithmes

Tableau comparatif des algorithmes

Traduit en Français par moi-même. Les originaux sont fici.
Si vous voyez des fautes d’orthographe ou des corrections à apporter signalez-le moi je me ferai un plaisir de vous écouter !

Caractéristiques des algorithmes de création de labyrinthes parfaits
Algorithme Impasses % Type Focus Sans biais ? Uniforme ? Mémoire Temps Solution % Source
Unicursal 0 Arbre Mur Oui Jamais N^2 379 100.0 Walter Pullen
Retour-récursif 10 Arbre Passage Oui Jamais N^2 27 19.0 (Générique)
Chasse et tue 11 (21) Arbre Passage Oui Jamais 0 100 (143) 9.5 (3.9) Walter Pullen
Division récursive 23 Arbre Mur Oui Jamais N* 10 7.2 John Perry
Arbre binaire 25 Ensemble Les deux Non Jamais 0* 10 2.0 (Générique)
Sidewinder 27 Ensemble Les deux Non Jamais 0* 12 2.6 Walter Pullen
Algorithme d’Eller 28 Ensemble Les deux Non Non N* 20 4.2 (3.2) Marlin Eller
Algorithme de Wilson 29 Arbre Les deux Oui Oui N^2 48 (25) 4.5 David Wilson
Algorithme d’Aldous-Broder 29 Arbre Les deux Oui Oui 0 279 (208) 4.5 David Aldous & Andrei Broder
Algorithme de Kruskal 30 Ensemble Les deux Oui Non N^2 33 4.1 Joseph Kruskal
Algorithme de Prim (original) 30 Arbre Les deux Oui Non N^2 160 4.1 Robert Prim
Algorithme de Prim (simplifié) 32 Arbre Les deux Oui Non N^2 59 2.3 Robert Prim
Algorithme de Prim (modifié) 36 (31) Arbre Les deux Oui Non N^2 30 2.3 Robert Prim
Algorithme de l’arbre qui grandit 49 (39) Arbre Les deux Oui Non N^2 48 11.0 Walter Pullen
Algorithme de la forêt qui grandit 49 (39) Les deux Les deux Oui Non N^2 76 11.0 Walter Pullen

Ce tableau résume les caractéristiques des algorithmes de création de labyrinthes parfaits mentionnés ci-dessus. L’algorithme de labyrinthe unicursal (les labyrinthes unicursaux sont techniquement parfaits) est inclus à titre de comparaison. Voici les descriptions des colonnes :

Impasses : C’est le pourcentage approximatif de cellules qui sont des impasses dans un labyrinthe créé avec cet algorithme, lorsqu’il est appliqué à un labyrinthe orthogonal 2D. Les algorithmes dans le tableau sont triés selon ce critère. Généralement, créer en ajoutant des murs donne le même résultat que creuser des passages, cependant si la différence est significative, le pourcentage d’ajout de murs est indiqué entre parenthèses. La valeur de l’Arbre qui grandit peut en réalité varier de 10% (toujours choisir la cellule la plus récente) à 49% (toujours échanger avec la cellule la plus ancienne). Avec un facteur de course suffisamment élevé, le Retour-récursif peut descendre en dessous de 1%. Le pourcentage maximum possible d’impasses dans un labyrinthe parfait orthogonal 2D est de 66%, ce qui correspondrait à un passage unicursal avec une série d’impasses d’une unité de longueur de chaque côté.

Type : Il existe deux types d’algorithmes de création de labyrinthes parfaits : Un algorithme basé sur les arbres fait croître le labyrinthe comme un arbre, ajoutant toujours à ce qui est déjà présent, ayant un labyrinthe parfait valide à chaque étape. Un algorithme basé sur les ensembles construit où il le souhaite, gardant la trace des parties du labyrinthe qui sont connectées entre elles, pour s’assurer qu’il peut tout relier pour former un labyrinthe valide une fois terminé. Certains algorithmes comme la Forêt qui grandit font les deux en même temps.

Focus : La plupart des algorithmes peuvent être implémentés soit en creusant des passages, soit en ajoutant des murs. Quelques-uns ne peuvent être réalisés que d’une seule manière. Les labyrinthes unicursaux sont toujours créés par ajout de murs puisqu’ils impliquent de bissecter des passages avec des murs, bien que le labyrinthe de base puisse être créé des deux façons. Le Retour-récursif ne peut pas être fait en ajoutant des murs car cela tend à donner un chemin solution qui suit le bord extérieur, où l’intérieur entier du labyrinthe est attaché à la bordure par une seule tige. De même, la Division récursive ne peut être faite qu’en ajoutant des murs en raison de son comportement de bissection. Chasse et tue est techniquement uniquement réalisé par creusement de passages pour une raison similaire, bien qu’il puisse être fait par ajout de murs si un effort particulier est fait pour croître vers l’intérieur depuis tous les murs frontières de manière égale.

Sans biais : Ceci indique si l’algorithme traite toutes les directions et tous les côtés du labyrinthe de manière égale, où l’analyse du labyrinthe après coup ne peut révéler aucun biais de passage. L’Arbre binaire est extrêmement biaisé, où il est facile de voyager vers un coin et difficile vers son opposé. Le Sidewinder est également biaisé, où il est facile de voyager vers un bord et difficile vers son opposé. L’algorithme d’Eller tend à avoir un passage à peu près parallèle aux bords de début ou de fin. Chasse et tue est sans biais, tant que la chasse est faite colonne par colonne ainsi que ligne par ligne pour éviter un léger biais le long d’un axe.

Uniforme : Ceci indique si l’algorithme génère tous les labyrinthes possibles avec une probabilité égale. « Oui » signifie que l’algorithme est complètement uniforme. « Non » signifie que l’algorithme peut potentiellement générer tous les labyrinthes possibles dans un espace donné, mais pas avec une probabilité égale. « Jamais » signifie qu’il existe des labyrinthes possibles que l’algorithme ne peut jamais générer. Notez que seuls les algorithmes sans biais peuvent être complètement uniformes.

Mémoire : C’est la quantité de mémoire supplémentaire ou de pile nécessaire pour implémenter l’algorithme. Les algorithmes efficaces ne requièrent et ne regardent que la bitmap du labyrinthe elle-même, tandis que d’autres nécessitent un stockage proportionnel à une seule ligne (N), ou proportionnel au nombre de cellules (N^2). Certains algorithmes n’ont même pas besoin d’avoir le labyrinthe entier en mémoire et peuvent être étendus indéfiniment (ceux-ci sont marqués d’un astérisque). L’algorithme d’Eller nécessite le stockage d’une ligne, mais compense largement cela puisqu’il n’a besoin de stocker que la ligne courante du labyrinthe en mémoire. Sidewinder n’a également besoin de stocker qu’une ligne du labyrinthe, tandis que l’Arbre binaire n’a besoin que de garder trace de la cellule courante. La Division récursive nécessite une pile jusqu’à la taille d’une ligne, mais à part cela n’a pas besoin de regarder la bitmap du labyrinthe.

Temps : Ceci donne une idée du temps nécessaire pour créer un labyrinthe avec cet algorithme, les nombres plus bas étant plus rapides. Les nombres sont seulement relatifs les uns aux autres (l’algorithme le plus rapide étant assigné à la vitesse 10) plutôt qu’en unités spécifiques, car le temps dépend de la taille du labyrinthe et de la vitesse de l’ordinateur. Ces nombres proviennent de la création de labyrinthes de passages 100×100 dans la dernière version de Daedalus. Généralement, créer en ajoutant des murs prend le même temps que creuser des passages, cependant si la différence est significative, le temps d’ajout de murs est indiqué entre parenthèses.

Solution : C’est le pourcentage de cellules du labyrinthe que le chemin solution traverse, pour un labyrinthe typique créé par l’algorithme. Cela suppose que le labyrinthe fait 100×100 passages avec le début et la fin dans des coins opposés. C’est une mesure de la « sinuosité » du chemin solution. Les labyrinthes unicursaux ont une sinuosité maximale, puisque la solution traverse l’ensemble du labyrinthe. L’Arbre binaire a la sinuosité minimale possible, où le chemin solution traverse simplement le labyrinthe et ne dévie jamais ou ne cesse jamais de progresser vers la fin. Généralement, créer en ajoutant des murs a les mêmes propriétés que creuser des passages, cependant si la différence est significative, le pourcentage d’ajout de murs est indiqué entre parenthèses.

Source : C’est la source de l’algorithme, ce qui signifie par qui il est nommé, ou qui l’a inventé ou popularisé. Certains sont listés comme « génériques », ce qui signifie qu’ils sont si évidents qu’ils ont été imaginés ou implémentés par de nombreuses personnes indépendamment. Walter Pullen a nommé « Chasse et tue », mais n’a pas inventé la technique, dont on peut trouver des implémentations datant de nombreuses années.