LA DOMOTIQUE enfin, on essaie.

Bonjour (mars 2019).

Depuis quelques années, je me suis « mis » à l’Arduino, puis Raspberry Pi, j’ai réussi à faire clignoter des Leds, afficher des messages sur des afficheurs LCD, piloter des relais via Arduino ou les GPIO du raspberry, puis j’ai découvert node-red grâce à marc Silanus, suivi ses merveilleux tutos, consulté des centaines de pages d’explications en anglais et en Français, et je partage à mon tour mes expériences, recherches et résultats, même si c’est bien léger par rapport à ce qu’on trouve…

Le projet

Le premier projet concret est de gérer les lumières du salon qui en construction, j’ai prévu environ 50 spots LED dans le plafond, un tous les mètres, la pièce fait 7m sur 7, ça me donne 7 rangées de 6 ou 7 lampes, pour le moment, elles sont gérées par colonnes, avec ce code node-red . C’est un premier jet, fait avec l’aide de Sophie, en service depuis quelques semaines.

dans le navigateur
le flow principal, il manque la gestion de la température du processeur en mode test

A noter que cette interface a l’immense avantage de rafraîchir en temps réel les autres écrans ouverts sur cette adresse.

Le code à coller dans node red si on veut voir comment c’est fait en vrai, c’est le premier jet, tout simple, (je ne sais pas le publier correctement (bloc code), ça va venir).

[{« id »: »2e78f18e.06ed76″, »type »: »tab », »label »: »Flow 1″, »disabled »:false, »info »: » »},{« id »: »488bf45c.e8ad8c », »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch1″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:2, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:357, »y »:182, »wires »:[[« 2f06c4a8.ad6254 »]]},{« id »: »5585be3c.4e097″, »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch2″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:3, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:357, »y »:242, »wires »:[[« 94f641f3.0c8918 »]]},{« id »: »d727909e.8e5e78″, »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch3″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:4, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:357, »y »:302, »wires »:[[« a69ffedf.d3e8d8 »]]},{« id »: »1717054d.edb5eb », »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch4″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:5, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:357, »y »:362, »wires »:[[« a989f07.f51e19 »]]},{« id »: »6faad7e0.2321f », »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch5″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:6, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:360, »y »:420, »wires »:[[« d3b3b7a7.6ed9a »]]},{« id »: »adb35d95.80362″, »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch6″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:7, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:360, »y »:480, »wires »:[[« cc817209.24add »]]},{« id »: »2f06c4a8.ad6254″, »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio1″, »pin »: »12″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:567, »y »:182, »wires »:[]},{« id »: »94f641f3.0c8918″, »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio2″, »pin »: »13″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:567, »y »:242, »wires »:[]},{« id »: »a69ffedf.d3e8d8″, »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio3″, »pin »: »15″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:567, »y »:302, »wires »:[]},{« id »: »a989f07.f51e19″, »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio4″, »pin »: »16″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:567, »y »:362, »wires »:[]},{« id »: »d3b3b7a7.6ed9a », »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio5″, »pin »: »18″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:570, »y »:420, »wires »:[]},{« id »: »cc817209.24add », »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio6″, »pin »: »26″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:570, »y »:480, »wires »:[]},{« id »: »de5c53f9.77b4e », »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio7″, »pin »: »7″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:570, »y »:540, »wires »:[]},{« id »: »720fde5.2401ba », »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch7″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:8, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:360, »y »:540, »wires »:[[« de5c53f9.77b4e »]]},{« id »: »24aaebd8.a69efc », »type »: »ui_button », »z »: »2e78f18e.06ed76″, »name »: » », »group »: »58369ccf.05d8d4″, »order »:9, »width »:0, »height »:0, »passthru »:false, »label »: »Global ON », »tooltip »: » », »color »: » », »bgcolor »: »green », »icon »: » », »payload »: »false », »payloadType »: »bool », »topic »: » », »x »:120, »y »:100, »wires »:[[« 488bf45c.e8ad8c », »5585be3c.4e097″, »d727909e.8e5e78″, »1717054d.edb5eb », »6faad7e0.2321f », »adb35d95.80362″, »720fde5.2401ba », »fd453b27.7d2b48″]]},{« id »: »2d2bd1c1.8003ae », »type »: »ui_button », »z »: »2e78f18e.06ed76″, »name »: » », »group »: »58369ccf.05d8d4″, »order »:10, »width »:0, »height »:0, »passthru »:false, »label »: »Global OFF », »tooltip »: » », »color »: » », »bgcolor »: »red », »icon »: » », »payload »: »true », »payloadType »: »bool », »topic »: » », »x »:110, »y »:160, »wires »:[[« 488bf45c.e8ad8c », »5585be3c.4e097″, »d727909e.8e5e78″, »1717054d.edb5eb », »6faad7e0.2321f », »adb35d95.80362″, »720fde5.2401ba », »fd453b27.7d2b48″]]},{« id »: »fd453b27.7d2b48″, »type »: »ui_switch », »z »: »2e78f18e.06ed76″, »name »: » », »label »: »switch0″, »tooltip »: » », »group »: »58369ccf.05d8d4″, »order »:1, »width »:0, »height »:0, »passthru »:true, »decouple »: »false », »topic »: » », »style »: » », »onvalue »: »false », »onvalueType »: »bool », »onicon »: » », »oncolor »: » », »offvalue »: »true », »offvalueType »: »bool », »officon »: » », »offcolor »: » », »x »:360, »y »:120, »wires »:[[« eba0eecf.70154 »]]},{« id »: »eba0eecf.70154″, »type »: »rpi-gpio out », »z »: »2e78f18e.06ed76″, »name »: »gpio0″, »pin »: »11″, »set »: » », »level »: »0″, »freq »: » », »out »: »out », »x »:570, »y »:120, »wires »:[]},{« id »: »a84969d7.8e707″, »type »: »function », »z »: »2e78f18e.06ed76″, »name »: »date », »func »: »var now = new Date(); \nvar year = now.getFullYear();\nvar month = now.getMonth()+1; \nvar day = now.getDate();\nvar hour = now.getHours();\nvar minute = now.getMinutes();\nvar second = now.getSeconds(); \nmsg.payload = day+\ »/\ »+\n month+\ »/\ »+\n year+\ » à \ »+\n hour+\ »:\ »+\n second+\ » => \ »+\n msg.payload;\nreturn msg; », »outputs »:1, »noerr »:0, »x »:240, »y »:640, »wires »:[[]]},{« id »: »58369ccf.05d8d4″, »type »: »ui_group », »z »: » », »name »: »Lumières », »tab »: »bf5a6de7.db3a98″, »disp »:true, »width »: »6″, »collapse »:false},{« id »: »bf5a6de7.db3a98″, »type »: »ui_tab », »z »: » », »name »: »Domotique », »icon »: »dashboard », »disabled »:false, »hidden »:false}]

Le but maintenant est d’arriver à piloter les lampes individuellement, ou par rangées, ou par colonnes, ou tout allumer/ tout éteindre, ou rallumer comme c’était avant, mais là n’est pas la difficulté.

Je souhaiterai aussi afficher l’heure, avoir des onglets pour gérer le chauffage au sol (électrique à film mince, 8 bandes de 400W), les volets roulants à commandes filaires déjà équipées de télécommandes 433 MHz (je décrirai), l’alarme, etc

Choix des matériels

l’ancien article de 2019 en attendant que j’améliore le site…

RPi pour la partie commande…
parce que j’ai trouve une distribution raspbian qui va très bien dessus,
on peut y mettre un serveur Apache, (pour la première version des lumières en php (remplacé par node-red pour (le moment), les deux sont en service en ce moment, je peux allumer ou éteindre mes lumières soit via apache, soit node-red simultanément
c’est pas cher et j’en ai quelques uns, et c’est pour le moment stable tant qu’on n’ouvre pas Chrome qui plante tout et ralentit terriblement.. De toute façon, il ne devrait pas y avoir de navigateur qui tourne dessus quand il sera en service domotique pur
Il s’alimente et 5V, pratique pour source électrique renouvelable (solaire, éolien ou autre – genre turbine sur l’eau potable).

Aussi parce que il y a des GPIO en E/S et même PWM, série, I²C, qui permettent de tourner dès maintenant en sortie, et qui aura en entrée les solénoïdes pour mesurer la consommation de l’installation. Mesure qui sera utilisée aussi pour lancer un test des lampes. (avec statistiques de durée de vie et d’utilisation).

Les relais :
Il existe des modules relais très peu cher chez les chinois, tant en statique, MOSFET ou mécaniques, je me suis décidé pour des mécaniques, qui ont l’avantage de pouvoir commuter ce que je veux sans tout remettre en question. Pour le moment les lampes sont en 220V, si je les passe en 12V alternatif ou continu, je n’ai pas à changer les 40 relais. Ceux-là sont commandés via optocoupleurs, ont une LED d’état et sont alimentés en 5V, avec possibilité de les alimenter avec une source distincte de la carte Rpi.
J’i commandé des transistors MOSFET pour alimenter via WPM en avoir une variation sur les lampes, on verra par la suite.

L’Arduino:
Pour son prix, et sa capacité d’extensions. Un Arduino mega coûte moins de 6 euro, et possède 50 E/S tor, 12 pwm et 12 E/S analogiques on numériques.
l’Arduino Uno coûte 3€, le nano moins de deux€, et quand j’aurais réussi à les piloter en lecture et écriture via I²C ou mieux Ethernet, je pourrai en mettre partout.

L’alimentation 5V est récupérer, elle fournit 14A, pour le moment bien suffisant, et puis je peux en mettre plein de parallèle. (actuellement une alim d’ordinateur portable HP qui a un port USB)

Tout n’est pas encore branché, on est dans l’expérimentation Le bornier est de récup.

Le câblage :

Chaque lampe arrive sur un bornier du coffret de commande, passera par un inter avec voyant pour bien contrôler chaque ligne, va sur le relais commandé soit par Arduino, soit pour le moment directement par le sports GPIO du Rpi, une commande par colonne de lampe,

Le Raspberry était bien fixé proprement, mais j’avais des doutes pour les vis de fixation…

Les lampes :

Pour le moment en 220V spot led encastrés 3W orientables. Principal défaut : l’angle d’éclairage trop faible, mais à 5€ le spot complet, on verra plus tard pour les modifs (spots 12V, angle plus grand).

le plafond en cours de construction, les spots seront intégrés après ponçage et peinture.