- Python 61.6%
- C++ 19.7%
- JavaScript 13.9%
- HTML 2%
- Nix 1.5%
- Other 1.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| clients | ||
| control_module | ||
| end_user_example | ||
| milieu | ||
| .gitignore | ||
| default.nix | ||
| README.md | ||
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/)
- 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
(
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:
- essayer d'ouvrir la porte
- l'état lumineux du ruban LED au dessus de la porte
- le voyant sur le hackens.org
- 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.