Indicateur d'ouverture HackENS
  • Python 61.6%
  • C++ 19.7%
  • JavaScript 13.9%
  • HTML 2%
  • Nix 1.5%
  • Other 1.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-30 19:23:42 +02:00
clients Add missing shebang 2026-09-24 15:42:05 +02:00
control_module ordred source files into folders for each machine 2026-06-24 21:15:04 +02:00
end_user_example fix: popup positionning wrt badge 2026-09-28 21:20:21 +02:00
milieu update: changed hackens-org ip from test ip to local network ip 2026-09-22 21:19:12 +02:00
.gitignore changed secrets format to allow for easier integration with agenix 2026-09-10 17:46:30 +02:00
default.nix Moved hackens-org to hackens_org 2026-08-04 11:45:34 +02:00
README.md doc: updated README.md 2026-09-30 19:23:42 +02:00

PCF

Presence Control Firmware

Le système de détection d'ouverture d'hackens, pour pouvoir recevoir des gens et ne pas devenir sourd à cause du baby :)

Design général

flowchart TD

S[Senseurs] -->|Serial| m[hackens-mileu]
    -->|local network socket| E[ESP-32, LEDs]
m -->|websocket| org[hackens-org]
    --> web[Site web];
org -->|websocket| w[Systèmes extérieurs]

Il y a trois composants au système:

  • La boîte de contrôle en arrière, avec le sketch arduino fourni dans le répo (./control_module/)
  • Le software qui orchestre tout qui tourne sur hackens-milieu (./milieu/)
  • Les clients, qui reçoivent le signal ouvert/fermé depuis hackens-milieu (./clients/)
    • Une ESP-32 qui tourne proche de la porte de l'avant, qui allume et éteint l'indicateur en recevant des commandes du réseau local (./clients/indicateur/)
    • Un daemon serveur à faire tourner sur hackens-org, qui expose un websocket avec l'état d'ouverture (/.clients/websocket/)

Dans l'idée: L'ESP-32 est la plus stupide possible, c'est juste un actuateur.

Orchestration centrale

La boîte de controle en arrière et hackens-milieu implémentent une machine à état. On ne peut pas faire confiance à hackens-milieu de garder fidèlement un état -- les gens l'éteignent tout le temps, les services ça crashe. Donc, l'arduino garde un état X = (A, S). Ici A c'est l'état des senseurs (combien de fois on a appuyé sur l'override depuis le dernier switch, et est-ce que le loquet est inséré) et S c'est l'état de l'automate (qui est aussi reflété sur la LED)

hackens-milieu peut récupérer X, et est notifié à chaque fois que A change. À chaque changement, c'est le job d'hackens-milieu de faire tourner la machine à état et renvoyer S' dans les 10 secondes. Si ce n'est pas le cas, l'Arduino default sur un état S déconnecté blanc. Ça permet à l'automate d'évoluer au fil des besoins, et donne du feedback utilisateur lorsque le système n'est pas fonctionnel.

L'autre boulot d'hackens-milieu est de transmettre l'état ouvert/fermé aux différentes interfaces avec l'extérieur. Pour l'instant, cela inclut une ESP-32 en avant utilisée pour contrôler les LEDs de la porte, ainsi que hackens-org, qui expose l'état au public sous la forme d'un websocket.

hackens-milieu publie l'état à tous ses clients à chaque changement d'état ainsi que toutes les 5 secondes.

Configuration de l'ESP-32

L'ESP-32 est configuré avec une addresse IPv4 statique définie dans secrets.py, et écoute en TCP sur le port défini dans secrets.py.

À la réception d'un paquet \x00, les LEDs s'éteignent.

À la réception de n'importe quel autre paquet, les LEDs s'allument.

Par défaut, à l'initialisation, les LEDs sont éteintes.

Le mot de passe et le SSID du WiFi local sont également définis dans secrets.py.

Configuration de hackens-org

hackens-org a comme but d'agir comme un buffer entre les requêtes extérieures et le système en hackENS. Dans l'idée, il a 2 websockets. L'une, sous authentification, reçoit les messages de la part de hackens-milieu, le notifiant des changements d'état d'ouverture. L'autre, publique, sert d'endpoint pour le monde extérieur.

Les credentials pour l'authentification sont définis comme variables d'environnement dans le secrets.sh attenant.

hackens-org garde le dernier état en mémoire. Comme la connection est active (websocket), il suffit de réagir quand la connection se ferme, après quoi il considère que le système d'indicateur est down et expose l'état "UNKNOWN".

Déploiement actuel

Le déploiement est effectué sous la forme de paquets Nix, trouvables sur le dépôt de l'infrastructure HackENS.

Le paquet contenant la source est dans pkgs/indicateur_ouverture/default.nix et exporté dans pkgs/overlay.nix.

Le service qui tourne sur hackens-milieu est dans machines/hackens-milieu/indicateur.nix, et le paquet dans pkgs/indicateur_ouverture/local_server.nix.

Le service qui tourne sur hackens-org et la redirection nginx est dans machines/hackens-org/indicateur_websocket.nix, et le paquet dans pkgs/indicateur_ouverture/main_server.nix.

La partie responsable d'injecter le Javascript sur le site est dans la sections des plugins dans machines/hackens-org/dokuwiki.nix, et le paquet dans pkgs/indicateur_ouverture/dokuwiki_plugin.nix.

Les secrets (authentification de la websocket entre hackens-milieu et hackens-org) sont gérés avec agenix (machines/hackens-milieu/secrets/indicateur.age et machines/hackens-org/secrets/indicateur_websocket.age).

Interfaces publiques

Il existe 4 interfaces publiques pour connaître l'état d'HackENS:

  1. essayer d'ouvrir la porte
  2. l'état lumineux du ruban LED au dessus de la porte
  3. le voyant sur le hackens.org
  4. Une websocket redirigée sur wss://hackens.org/indicateur

Tout est évident à part la websocket. Celle-ci envoie le statut sous la forme d'un octet (donc ne pas la lire en mode texte).

Octet Status
0x00 Fermé
0x01 Ouvert
0xff Indéterminé

Si une réponse autre que celles listées ici est donnée ou que la websocket est indisponible, considérer l'état comme indéterminé.

Le serveur renvoie l'information en boucle avec un délai d'une seconde.