a:6:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:4:" ";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:113:" ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:4:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:12:"My Canaletto";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:20:"http://canaletto.fr/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"docs";a:1:{i:0;a:5:{s:4:"data";s:41:"http://www.rssboard.org/rss-specification";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:22:"BlogEngine.NET 3.3.8.0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:5:"en-US";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:10:{i:0;a:6:{s:4:"data";s:145:" ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:33:"Home Assistant & Aqara Hub M3";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:4010:"
Produit en cours de test et article en cours d'écriture.
Dans la série des clic compulsifs d'un soir, voici le dernier Hub d'Aqara, le M3. Je parle de clic car je ne reçoit pas ces produits d'un quelconque service de presse qui me presserait d'être gentil, mais je les achètes, quitte parfois à les retourner à ce cher Amazon. Et en plus, contrairement à pas mal de sites "pute à clics", je les teste vraiment.
Ca vaut 130 € et il y a un code promo de 20% qui traine.

Ce produit offre de grandes promesses sur papier glacé et il est même annoncé officiellement compatible avec Home Assistant. Mais la réalité est un peu différente...
Une fois de plus dans une industrie qui va très vite on se retrouve avec un hardware de bonne facture avec du software à la traine.
Je ne pense pas que cette passerelle acceptera des devices Zigbee d'autres marques, sauf peut être des accords avec des leaders genre Philips Hue, mais il ne faut pas trop rêver. Par contre on peu penser qu'ils termineront la partie Matter et espérer que les remontées vers Home Assistant ne se limitent pas au strict minimum.
Pour l'instant il est donc urgent d'attendre...
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://canaletto.fr/post/home-assistant-and-aqara-hub-m3";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:64:"http://canaletto.fr/post/home-assistant-and-aqara-hub-m3#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=0fcbac1f-a87c-418f-b507-aab8b71207b4";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:32:"lun., 13 mai 2024 17:50:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:7:"IP & Co";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:5:{i:0;a:5:{s:4:"data";s:6:"zigbee";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:6:"Matter";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:6:"Thread";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:5:"Aqara";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:6:"Hub M3";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=0fcbac1f-a87c-418f-b507-aab8b71207b4";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=0fcbac1f-a87c-418f-b507-aab8b71207b4";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:64:"http://canaletto.fr/post/home-assistant-and-aqara-hub-m3#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=0fcbac1f-a87c-418f-b507-aab8b71207b4";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:131:" ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:25:"Home Assistant & Nuki";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:8460:"
Ca me travaillait depuis un moment, automatiser la porte d'entrée ! L'objectif étant que la porte se verrouille quand je part (process d'alarme, fermeture des volets, etc.) et se déverrouille quand j'arrive avec le process inverse. Accessoirement permettre à des tiers d'ouvrir (clavier et tags), ou moi même d'ouvrir et fermer à distance.
J'ai regardé un peu le marché et j'ai trouvé :
Après avoir bien creusé le sujet et écouté les conseils d'autrui j'ai porté mon choix sur une Nuki Pro 4.0, en y voyant comme avantage :

Je fait l'impasse de l'installation qui est effectivement facile, mais qui m'a tout de même couté un cylindre débrayable (lien Amazon). Et on passe à la configuration.
Je n'ai pas grand chose à redire sur la mise en œuvre via l'application, c'est plutôt bien fait, tout comme Nuki Web ou l'accès à distance depuis un smartphone. Là ou ça va se compliquer c'est pour intégrer ça à Home Assistant, et c'était le but ! Il existe plusieurs solutions et je veux bien comprendre que les débutants soient perdus.
On me l'a déconseillé et j'en ai lu du mal, j'ai donc zappé.
Ca semble bien fait, mais c'est un fail. Je pense qu'il vaut mieux disposer du bridge Nuki.
Il s'agit d'un fork de Nuki NG qui a la particularité de se connecter directement au Nuki en Bluetooth. A priori parfait pour mon usage. Sauf que je n'ai jamais réussit à appairer le Nuki à cette intégration.
Proposé comme la solution officielle pour connecter Nuki à Home Assistant, je me suis dit que ça serait facile. En effet la configuration est simple et les information de base (Look/Unlook et batterie) remontent bien dans Home Assistant. Il faut laisser le WIFI actif, ça consommera un peu plus mais ça devrait aller.
Oui, mais ! Il y a un tout petit problème : entre l'envoi d'une commande, l'action et le retour d'état il peut se passer de 1 à 3 minutes (quand ça fonctionne). Et je ne me voit pas passer 3 minutes à attendre devant la porte... Que se passe t'il ? Direction le forum Nuki, et la c'est le bug ! Problème plus ou moins connu, récurent, bref les utilisateurs ne sont pas contents et j'aurais du lire ça avant. Bien sur Nuki explique que ça vient du Wi-Fi des utilisateurs, sauf que j'ai testé avec mon Unifi de base et 3 AP d'autres marques, avant de me dire que si l'application Nuki connectée sur un smartphone en 4G fonctionnait bien, le problème n'était pas lié au Wi-Fi mais à l'implémentation MQTT. Un peu dégouté, je me suis dit qu'ils voulaient vendre leur bridge et que n'y couperait pas !
Dans mes pérégrinations j'a commencé par tester sans succès un projet basé sur espHome avant de tomber sur Nuki Hub, un projet très complet qui crée un bridge avec un ESP. Nuki Hub communique avec un Nuki Lock, un Opener et un clavier via Bluetooth (BLE) et utilise MQTT pour s'intégrer à d'autres systèmes. Il expose l'état de verrouillage (et bien plus encore) via MQTT et permet d'exécuter des commandes telles que le verrouillage et le déverrouillage via MQTT (n'hésitez pas à bien lire la doc qui est une mine d'informations).
Un petit flash plus loin j'ai réussit à associer mon Nuki à ce bridge DIY, il remonte toutes les informations utiles, voire plus, et surtout il permet de verrouiller / déverrouiller rapidement la serrure, ce qui est tout de même la base.

Par contre il faut savoir une chose, chez Nuki c'est fromage ou dessert, pas le deux ! En gros pour activer un bridge, qu'il soit Nuki ou DIY, il faut désactiver le Wi-Fi du Nuki. Ce qui concrètement veut dire qu'on ne pourra plus le commander à distance depuis l'application Nuki et que si on veut utiliser localement cette application il faudra se rapprocher du Nuki, la portée du Bluetooth de cet objet étant très faible (j'ai du mal dans mon bureau qui est à 3 mètres de la porte d'entrée...).
Ou moralité ! Je crois que j'ai acheté une version 4 et Pro pour rien. En effet le Wi-Fi intégré ne me servira à rien et une v3 standard aurait parfaitement fait le job pour pas cher (il y a plein sur le Bon Coin !

Comme d'aucuns ont pu le remarquer, le flux des caméras sous Home Assistant à tendance parfois à laguer et ne pas être très réactif. On pourrait penser que ça vient de la qualité des caméras, pourtant j'utilise un système Unifi Protect très bien intégré à Home Assistant et parfois j'ai l'impression d'avoir les mêmes lags que sur une chinoiserie achetée pas cher sur Ali ! En fait Home Assistant utilise le protocole RSTP afin de communiquer avec les caméras ou dans mon cas le NVR et en l'état le résultat n'est pas à la hauteur de ce que j'obtiens avec l'appli Unifi Protect. Sauf que je veux avoir ça dans HA car ça m'apporte plein d'options intéressantes. Voir la version simple à la fin !

Afin de contourner ce problème il y a WebRTC que les développeurs connaissent bien. Et l'un d'eux, Alex, qui est également l'auteur d'autres très bonnes intégration, a développé Go2RTC qui va de façon transparente nous permettre d'utiliser WebRTC pour visualiser nos caméras.
J'avais déjà lu quelques sujets sur WebRTC et HA, mais ce qui m'a donné subitement envie de l'intégrer est la vidéo de ce jeune homme :
Ceux qui me suivent savent que je ne suis pas fan des tutoriaux vidéo, surement une question de génération (je suis vieux !), mais passer du temps à faire play / pause m'agace et me fait perdre du temps. Ceci étant il explique clairement l'essentiel que je vais reprendre ici en l'adaptant à l'infrastructure Unifi Protect.
Le problème est documenté et sera probablement corrigé dans une prochaine version de Go2RTC, en attendant il faut le contourner. L'intégration Unifi Protect intègre les caméras en se basant sur le flux RSTPS, ce qui va nous donner ça :
"url": "rtsps://192.168.10.1:7441/2sgdfdsgdfgf3DNu5F?enableSrtp"
Sauf que Go2RTC ne supporte pas SRTP, et donc c'est le bug ! La bonne URL est donc celle ci :
"url": "rtsps://192.168.10.1:7441/2sgdfdsgdfgf3DNu5F"
Je n'ai pas trop cherché, mais je n'ai pas trouvé ou faire la modification et comme Go2RTC recrée les liens lors de chaque démarrage, j'ai contourné le problème en créant dans HA des caméras génériques basées sur la bonne URL (on pense à décocher la vérification du certificat car il est généralement bidon et on n'entre pas d'authentification puisque le lien est open bar).

On répète ça sur toutes les caméras et on pense à les renommer proprement.
L'étape suivant va consister à installer l'addon Go2RTC. Pour ça on va dans les addons HA et on ajoute l'adresse du dépôt idoine dans les sources et on installe :
https://github.com/AlexxIT/hassio-addons
Une fois cet addon installé et lancé on va ajouter l'intégration RTSPtoWebRTC à Home Assistant que l'on fera pointer sur :
http://localhost:1984
Et c'est presque tout, miracle vos caméras sont maintenant bien plus réactives !
A ce stade les barbus vont me dire, oui, mais tous ces ports passent bien en local, mais depuis l'extérieur ? Ouvrir des ports n'étant pas conseillé (j'utilise Nabu Casa ou Cloudflared), on va tuneliser en utilisant le service Ngrok sur lequel on va devoir créer un compte. Une fois le compte créé et validé , on récupère le token d'authentification que l'on vient coller dans la console de Go2RTC :
ngrok:command: ngrok tcp 8555 --authtoken <token>webrtc:listen: ":8555" # external TCP/UDP portcandidates:- stun:8555
Ensuite on va configurer l'option dans l'intégration RTSPtoWebRTC :
stun.l.google.com:19302
Voilà, c'est fini. La suite de la vidéo nous parle de Frigate et Fully Kiosk. Deux sujets que j'aborderais une autre fois.
A la base je voulais juste un affichage plus fluide de mes caméras et j'ai installé toute cette usine qui a certainement un intérêt dans un contexte Frigate. Mais si l'on souhaite uniquement un peu de fluidité dans l'affichage et profiter de WebRTC simplement, et bien il y a plus simple.
Dans ce cas le seul composant à installer est l'intégration WebRTC Camera depuis HACS et de le configurer en l'ajoutant aux intégrations.
Ensuite on peu ajouter une carte Lovelace très simplement :
type: 'custom:webrtc-camera'
url: 'rtspx://192.168.6.1:7441/3jurvIekaWvpee222'
Ou aller plus loin avec quelques option :
type: custom:webrtc-camera
streams:
- url: ''
- url: 'rtspx://192.168.6.1:7441/3jurvIekaWee222'
shortcuts:
- name: Privacy
icon: mdi:cctv-off
service: switch.toggle
service_data:
entity_id: switch.terrasse_nord_privacy_mode
ui: true
poster: https://demo.home-assistant.io/stub_config/bedroom.png
muted: true
La doc est très complète et ça remplacera efficacement la carte Picture Glance pour afficher les caméras. Ca fonctionne mais ça reste un peu pauvre, alors même si vous n'utilisez pas Frigate rien n'empêche d'utiliser leur carte qui est bien plus riche et permettra par exemple de caster le rendu vers un téléviseur...

Même s'il est préférable (et je vous le recommande) de ne pas exposer directement des serveurs sur internet, l'idéal est faire ça avec un reverse proxy, on n'a parfois pas le choix. Le confinement l'a démontré ou en urgence pas mal d'entreprises n'ont eu d'autres choix que d'exposer à la va-vite des serveurs RDP sur Internet à des fin de télétravail. La moindre des chose serait d'utiliser un VPN ou une passerelle RDP comme Guacamole, mais si ce n'est pas possible il faut sécuriser au maximum, RDP, pour ne citer que lui étant très vulnérable.

Je ne vais pas parler de ce qui est à faire sous Linux mais pour les serveurs Windows.
On a deux étapes :
Contrairement à une légende urbaine, le firewall intégré à Windows est solide, à condition toutefois de le configurer correctement et de n'exposer que ce qui est réellement utile.
Il y a 3 catégorie auxquelles on affecte les règles : Public, Private et Domain (équivalent Private si on est connecté à un domaine Active Directory).

Si on expose un Windows sur Internet la première chose à considérer est que l'interface exposée doit se trouver en mode Public :
PS C:\Users\Administrator> Get-NetConnectionProfile
Name : Network 5
InterfaceAlias : WAN
InterfaceIndex : 3
NetworkCategory : Private
IPv4Connectivity : Internet
IPv6Connectivity : Internet
Si ce n'est pas le cas, comme dans cet exemple on ajuste avec :
PS C:\> Set-NetConnectionProfile -InterfaceIndex 3 -NetworkCategory Public
Cette considération étant prise en compte, de base très peu de choses sont exposées en Public et on pourra ouvrir un port pour laisser passer un service. Et idéalement s'il s'agit de RDP on va restreindre cette exposition aux IP des clients... Idéalement, car dans la pratique peu de client disposent d'IP fixes et certains services doivent êtres accessibles de façon universelle.
L'interface du firewall de Windows datant du siècle dernier on pourra avantageusement se servir de eu se servir de WFC (récemment acquis par Malwarebytes) afin de le gérer plus facilement.
A ce stade on teste avec avec un scan externe afin de s'assurer que seul le ports utiles sont ouverts (Advanced port Scanner ou NMap par exemple)
Mails il va donc falloir renforcer cette sécurité par d'autres moyens !
Sous Windows il existe une seconde couche de défense moins connue : WFP (Windows Filtering Platform). Si WFP peut être très efficace, sa configuration est délicate et se passe en PowerShell, ce qui la rend peu accessible. Et c'est ici que va rentrer en action IPBan qui un peu à la manière de Fail2ban disponible sous Linux va nous permettre d'ajouter une ligne de défense supplémentaire.
D'abord une petite précision, il existe deux versions d'IPBan :
C'est la version Pro à laquelle on va s'intéresser ici. Son cout annuel n'est pas prohibitif ($ 29.00 pour un serveur et $ 99.00 pour tous vos serveurs) si on le compare à d'autres produits qui en font moins pour bien plus cher. Cerise sur la gâteau, le support par mail ou sur Discord est vraiment très réactif !
La fonction de base d'IPBan est d'interdire l'accès à une IP après x tentatives infructueuses de connexion.
De base il va surveiller les applications suivantes grâce aux Events de Windows, mais égaiement aux logs des applications :
Mais ce n'est pas limitatif et l'administrateur peut également ajouter ses propres surveillances en lui demandant d'aller scanner events et logs. Le GitHub de l'éditeur héberge d'ailleurs un certain nombre d'intégrations personnalisée qui vous faciliteront la tache, en voici un exemple pour surveiller le serveur FTP de Filezilla :
<LogFile>
<Source>Filezilla</Source>
<PathAndMask>C:\Program Files (x86)\FileZilla Server\Logs</PathAndMask>
<FailedLoginRegex>
<![CDATA[
(?<timestamp>[^\s]+)\s.*\s\[FTP\sSession\s[0-9]+\s(?<ipaddress>[^\]]+)\]\sUSER\s(?<username>[^\n]+)\n.*\sspecify\sthe\spassword[^\n]*\n.*\sPASS\s[^\n]*\n.*\s(?<log>Login\s(?:or\spassword\s)?incorrect)[^\n]*
]]>
</FailedLoginRegex>
<FailedLoginRegexTimestampFormat></FailedLoginRegexTimestampFormat>
<SuccessfulLoginRegex>
<![CDATA[
(?<timestamp>[^\s]+)\s.*\s\[FTP\sSession\s[0-9]+\s(?<ipaddress>[^\]]+)\]\sPASS\s[^\n]*\n.*\[FTP\sSession\s[0-9]+\s[^\s]+\s(?<username>[^\]]+)\].*Login\ssuccessful[^\n]*
]]>
</SuccessfulLoginRegex>
<SuccessfulLoginRegexTimestampFormat></SuccessfulLoginRegexTimestampFormat>
<PlatformRegex>Windows</PlatformRegex>
<PingInterval>10000</PingInterval>
<MaxFileSize>0</MaxFileSize>
<FailedLoginThreshold>0</FailedLoginThreshold>
</LogFile>
Au delà de ce blocage d'IP via WFP, il est également possible de :
En conclusion c'est l'outil indispensable pour qui doit exposer un serveur directement sur Internet !

Depuis plus de 20 ans tout le monde parle d'IPv6, mais dans la pratique ce n'est pas encore l'euphorie au niveau de l'adoption. En France, une fois n'es pas coutume, on est un peu en avance, Free en tête qui a passé tout son réseau fibre en IPv6. En fait du 4rd pleinement documenté dans le RFC 7600. Dans la pratique c'est du tunneling (donc 2 clients qui discutent en IPv4 le font par un tunnel direct au dessus de leur IPv6, ca ne passe par une passerelle). Par contre à ce que j'ai pu lire la sortie IPv4 vers le reste du monde ce fait via des 'Border Relay 4rd' ou du NAT64+. Et là si ces équipement ne sont pas suffisamment dimensionnés ça peut créer un goulot d'étranglement.
Il y a quelques temps je me suis aperçu que l'un de nos serveurs hébergé chez Scaleway présentait en soirée une importance latence, voire des lags pour les clients Free, ce qui est un comble car Free et Scaleway font partie de la même boutique !

Il semble donc qu'il y ait un entonnoir au niveau de la passerelle de sortie vers l'IPv6. Je ne connais pas les détails de l'infrastructure Free, mais je me suis dit qu'en rendant mon serveur accessible en IPv6 je pourrais contourner le problème, et que de toutes façons il était temps que je passe ma part d'IPv6 !
Sauf que ce n'est pas si simple, d'une par je n'ai jamais pratiqué, et d'autre par la documentation fournie par Scaleway est obsolète.
Chez Scaleway j'ai deux types d'approche, des serveurs loués (Dédibox) et une infra avec les propres serveurs installés dans une baie louée (Dédirack). Mon serveur étant une VM sous Windows 2019 sur un serveur Dédibox je me suis basé sur la documentation officielle qui fait référence à la fourniture d'un DUID (sur la console Online) après avoir demandé un bloc IPv6 et passé le serveur en SLAAC. Au vu des captures d'écrans cette doc doit dater de l'époque Windows NT (siècle dernier), j'espère qu'ils vont la mettre à jour, aussi je mets les copies d'écran de la version actuelle ici : 1 | 2 .
Cette documentation mets en avant l'utilisation du DUID en modifiant une clé de registre de Windows. Hors changer le DUID dans l'implémentation Windows est devenu impossible comme l’expliquent ces deux articles parmi tant d’autres 1 | 2.
Le DUID change maintenant à chaque reboot en se basant sur l'adresse MAC de l’interface. C'est maintenant le comportement normal et attendu. Cette doc n'a donc plus lieu d'être dans sa version actuelle !
En fait pour obtenir une IPv6 sous Windows il n'y a rien de plus à faire que d'activer le stack IPv6 de Windows par défaut (client DHCP) (après avoir demandé un bloc IPv6 /48). Et c'est tout, l'obtention de l'IPv6 se fait via le serveur DHCPv6 de l'infrastructure Scaleway (il est également possible de renseigner une adresse prise dans le bloc).
Je me suis obstiné sur l'utilisation du DUID que la documentation mets en avant ! Normal j'ai appris à lire. Et d’autres sites y font référence. Ensuite il se trouve que cette machine avait un firewall plutôt blindé, et comme elle n'utilisait pas d'IPv6 auparavant tous les entrées Core Networking IPv6 étaient désactivées, donc les échanges avec le DHCPv6 et RA ne pouvaient pas se faire correctement. Je les ai réactivés dès lors que j’ai compris que la première option était obsolète.
A aucun moment le support Scaleway n'a su me dire qu'il ne fallait pas poursuivre dans la voie du DUID, ce qui aurait évité une perte de temps de toutes parts ! Le ticket de support n’est surement pas remonté auprès des bonnes personne et la culture Windows pas très présente, et meme si je les comprends il est impossible aujourd'hui d'ignorer le monde Microsoft !
Par contre de base Windows génère une IPv6 aléatoire, ce qui peut être utile sur un client mais gênante sur un serveur, on désactive en PS:
Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
Ou :
netsh interface ipv6 set global randomizeidentifiers=disabled store=active netsh interface ipv6 set global randomizeidentifiers=disabled store=persistent netsh interface ipv6 set privacy state=disabled store=active netsh interface ipv6 set privacy state=disabled store=persistent
On peut également désactiver l'utilisation d'une IPv6 temporaire :
Set-NetIPv6Protocol -UseTemporaryAddresses Disabled
Voilà, en espérant que Scaleway clarifie son article car si le passage de l'utilisation d'un DUID à du full DHCPv6 facilite largement la tâche, encore faut-il l'expliquer ! Je n'ai pas testé sous Linux, mais sous pfsense ou OPNsense la procédure est relativement identique.
On aurait pu penser au vu de la console Online qui affiche sur une même pages les infos réseau de mon Dédirack (IPv4) et de mon bloc IPv6 /48 que ce bloc soit également utilisable dans la baie Dédirack. Mais non, après avoir lourdement insisté auprès du support j'ai enfin eu la réponse :
Pour faire de l'IPv6 dans un Dédirack (offre housing de Scaleway), il faut demander au support un bloc /48 et ensuite le gérer en statique à sa convenance. Ca ne s'invente pas.
Et ça fonctionne ? Et bien non, car il aura fallu plusieurs jours et plusieurs personnes pour que l'on s'aperçoive que quelqu'un ne sais pas faire de copié/collé chez eux (ou un farceur ?), et que dans le bloc /48 que l'on m'a fourni il y avait un C00D qu'il fallait lire C00C !
Je n'ai pas encore testé, mais j'y ai installé un serveur ESXi et je crois savoir que la procédure est encore différente.
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:38:"http://canaletto.fr/post/ipv6-scaleway";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:46:"http://canaletto.fr/post/ipv6-scaleway#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=cc0d019e-37d2-4a1d-9951-2064672ec6aa";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:34:"mer., 31 janv. 2024 02:25:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:7:"IP & Co";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:8:{i:0;a:5:{s:4:"data";s:4:"IPv6";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:8:"Scaleway";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:8:"Dedirack";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:7:"Dedibox";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:6:"Online";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:6:"DHCPv6";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:5:"SLAAC";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:7;a:5:{s:4:"data";s:4:"DUID";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=cc0d019e-37d2-4a1d-9951-2064672ec6aa";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=cc0d019e-37d2-4a1d-9951-2064672ec6aa";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:46:"http://canaletto.fr/post/ipv6-scaleway#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=cc0d019e-37d2-4a1d-9951-2064672ec6aa";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:145:" ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:41:"Home Assistant & Versatile thermostat";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:16734:"
J'ai souvent parlé ici de thermostats et de la planification de ceux ci. Si le modèle basic (climate:) a été amélioré au fil du temps, il manquait hélas toujours quelque chose, ce que le nouveau Versatile Thermostat vient combler. Je vais donc m'intéresser à celui ci afin de gérer mon climatiseur. Les intégrations de climatiseurs se calquent en général sur leur thermostat intégré, et de facto de la sonde qui y est intégré. Celle ci placée à l'intérieur de celui ci n'apporte pas la justesse d'une sonde externe qui elle sera placée à un emplacement plus idoine. On peut également imaginer une sonde virtuelle calculant la moyenne de plusieurs sondes physiques. C'est la principale utilité que je trouve à ce nouveau thermostat qui dans mon cas d'usage va commander le thermostat d'origine de mon climatiseur, mais VT peut également fonctionner de façon plus classique en commandant le switch ou le fil pilote d'un classique convecteur ou une vanne thermostatique. Et en plus c'est made in France !

proximity: et je ne vais pas m'en servir pour l'instant. Mais à terme certainement, ce qui me permettra de supprimer du code.Que ce soit manuellement ou avec une planification, il y a deux façons de gérer un appareil de chauffage, à la française ou on défini des modes (ECO/CONFORT/BOOST) et l'on s'en tient à ceux ci, soit on fait varier dynamiquement la température de consigne. Personnellement je fait varier la température de consigne avec la planification dont j'ai parlé plusieurs fois ici. C'est également ce qui est utilisé dans les pays nordiques ou les variation de température sont importantes.
L'objectif étant de mettre à disposition de l'utilisateur final une interface la plus claire possible, les préréglages disponibles dans VT peuvent m'être utiles. On peu par exemple imaginer l'utilisateur qui avoir besoin de booster le chauffage, il le fera alors avec le passage en mode BOOST depuis l'interface.
Se posent alors plusieurs questions :
Dans ma logique j'aimerais placer ces boutons dans la carte du thermostat. Mais on peut les placer ailleurs.
Dans mon cas je réactive simplement l'automation qui gère la planification.
L'idéal aurait été de disposer d'un preset AUTO dont je pourrais récupérer l'état et ainsi réactiver la planification. Il n'est pas possible d'utiliser le preset NONE/MANUAL car celui ci change d'état dès lors que l'on change la consigne.
Faute de disposer d'un preset AUTO (...), le seul preset que je peux détourner est donc celui du mode FROST (hors gel) dont je n'ai pas l'utilité. Je détecte l'action via l'état du VT et je réactive l'automation qui gère la planification (dans la même automation qui me permet de désactiver la planification lorsque je choisit ECO/COMFORT/BOOST), mais également les autres modes du climatiseur (FAN/DRY, etc.).
- id: 56dd275e-3f52-4d8gjk862-5eeft5708a82
description: Comfort - AC - Mode Auto Versatile
alias: "Comfort - AC - Mode Auto Versatile"
mode: restart
trigger:
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'off' }}"
id: "off"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'dry' }}"
id: "off"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'fan_only' }}"
id: "off"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'heat_cool' }}"
id: "off"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'heat' and state_attr('climate.ac_versatile', 'preset_mode') in ['boost', 'comfort', 'eco'] }}"
id: "heat_boost_comfort_eco"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'heat' and state_attr('climate.ac_versatile', 'preset_mode') == 'frost' }}"
id: "heat_frost"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'heat' and state_attr('climate.ac_versatile', 'preset_mode') == 'none' }}"
id: "heat_none"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'cool' and state_attr('climate.ac_versatile', 'preset_mode') in ['boost', 'comfort', 'eco'] }}"
id: "cool_boost_comfort_eco"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'cool' and state_attr('climate.ac_versatile', 'preset_mode') == 'frost' }}"
id: "cool_frost"
- platform: template
value_template: "{{ state_attr('climate.ac_versatile', 'hvac_mode') == 'cool' and state_attr('climate.ac_versatile', 'preset_mode') == 'none' }}"
id: "cool_none"
action:
- choose:
- conditions: "{{ trigger.id in ['off', 'heat_boost_comfort_eco', 'cool_boost_comfort_eco'] }}" # Dérogation, on coupe le schedulle
sequence:
- service: automation.turn_off
target:
entity_id: automation.comfort_ac_immediate
data:
stop_actions: true
- choose:
- conditions: "{{ trigger.id in ['heat_frost', 'cool_frost'] }}"
sequence:
- service: automation.turn_on
target:
entity_id: automation.comfort_ac_immediate
- service: automation.trigger
target:
entity_id: automation.comfort_ac_immediate
data:
skip_condition: true
Il s'agit ici de savoir si le prochain évènement (plage horaire, lever/coucher, géoloc, etc...) va repasser le thermostat dans le mode planifié ou pas.
Là je vais utiliser une automation déclenchée par mes différents triggers, automation qui sera ON ou OFF selon la volonté de l'utilisateur.
- id: 56efdfd5e-3f52-4ddd-a862-5e21f5708a82
description: Comfort - AC - Restart
alias: "Comfort - AC - Restart"
mode: restart
trigger:
- platform: state
entity_id:
- binary_sensor.heating_ac_1
- binary_sensor.heating_ac_2
- binary_sensor.heating_ac_3
- binary_sensor.heating_ac_4
- binary_sensor.heating_ac_1_d
- binary_sensor.heating_ac_2_d
- binary_sensor.heating_ac_3_d
- binary_sensor.heating_ac_4_d
- input_boolean.to_away
- binary_sensor.life_windows_and_doors_delayed
- input_boolean.presence_ac
- input_boolean.to_sleep # eco heat off cool
- input_boolean.thermostats_ac_on_off
- binary_sensor.lionel_geo # eco heat off cool
- input_boolean.thermostats_away
- input_select.comfort_ac
condition:
- condition: state
entity_id: automation.comfort_ac_immediate
state: "off"
- condition: state
entity_id: input_boolean.thermostats_ac_on_off
state: "on"
action:
- service: automation.turn_on
target:
entity_id: automation.comfort_ac_immediate
- service: automation.trigger
target:
entity_id: automation.comfort_ac_immediate
data:
skip_condition: true
S'agissant d'un "sur thermostat" il est intéressant de savoir ce qui se passe et si possible visuellement. Je vais donc créer deux sensor: / template: qui vont me permettre de suivre et comparer l'état de ces deux thermostats.
sensor:
- platform: template
sensors:
temp_up_th_ac: # Pour History Graph
friendly_name: "TH AC"
value_template: >
{% if is_state('climate.daikin', 'heat') %}
Heat {{state_attr ('climate.daikin', 'temperature')}}°
{% elif is_state('climate.daikin', 'cool') %}
Cool {{state_attr ('climate.daikin', 'temperature')}}°
{% else %}
Off
{% endif %}
temp_up_th_ac_vt: # Pour History Graph
friendly_name: "TH AC Versatile"
value_template: >
{% if is_state('climate.ac_versatile', 'heat') %}
Heat {{state_attr ('climate.ac_versatile', 'temperature')}}°
{% elif is_state('climate.ac_versatile', 'cool') %}
Cool {{state_attr ('climate.ac_versatile', 'temperature')}}°
{% else %}
Off
{% endif %}
Visuellement ça me donne deux lignes, la première représente le vrai thermostat du climatiseur tandis que la seconde celui du VT. Et l'on voit bien que pour une consigne fixée ici à 22° le VT pousse parfois le climatiseur à 23°.

Quand je l'utilisait en direct je lui demandais généralement 23° pour obtenir 22° à la sonde. C'est plus que les recommandations étatiques me direz vous, mais il y a une raison ! Avoir 22° dans le hall / couloir me permet d'avoir de 19° à 21° dans les pièces adjacentes, dans lesquelles les convecteurs ne se déclenchent que très rarement, au point que cet hiver je les ai laissés tous OFF. Le seul cas ou ils sont maintenant utiles étant lorsque mes enfants sont présents et ferment les portes de leur chambre (il est bien connu que les ados s'isolent... Et encore le, PC gamer de mon fils doit lui assurer une part de chauffage...).
Ici on entre dans un domaine difficilement mesurable. En effet la consommation d'un climatiseur est fonction d'une multitude de paramètres, les horaires, le temps qu'il fait, le nombre d'occupants, etc... Il n'en reste pas moins que si je compare la consommation de mon climatiseur avant et après la mise e place du VT j'ai l'impression d'avoir réduit la conso de ± 10%. C'est subjectif et ça demande à être affiné. Par contre ce qui est certain c'est que le fait de ne quasiment plus activer les convecteurs constitue un gain énorme. Et conjugué à une ITE réalisée en 2022 et l'automatisation des volets roulants en fonction de l'ensoleillement, j'ai grandement gagné en confort et en cout.
Il y a longtemps que j'utilise la carte Simple Thermostat qui est très malléable et permet l'affichage d'une multitude d'informations.

Hélas cette carte ne semble plus maintenue et je n'ai pas les compétences pour reprendre le développement, Jean-Marc si tu me lis...
VT est un vrai plus pour le confort ! Je n'ai pas abordé ici la partie refroidissement du climatiseur et je le ferait cet été quand els conditions seront réunies.
En plus c'est made in France et vous pouvez communiquer facilement avec Jean-Marc qui en est l'auteur et se montre très disponible sur le forum HACF ou sur GitHub. Merci à lui !

Petit à petit les messageries de type chat se sont imposées en entreprise, mais également entre les entreprises. Le but étant de garder le contact, de proposer / obtenir des réponses rapides et surtout de délester le mail souvent surchargé et parfois traité qu'une seule fois par jour, un peu comme le facteur qui jadis passait le matin... Au fil de ces dernières années certaines ont bien évoluées, tandis que d'autres s'imposaient par la force. Chacun ses préférences, mais je vais essayer de faire le tour de la question.
Attention, le seule option qui m'intéresse ici dans ces applications c'est le chat !

Je vais en retenir seulement quelques une, certaines sont à réserver à la sphère privée même si on les retrouve souvent en usage professionnel :
A noter qu'avec le RCS les SMS peuvent s'apparenter à des messageries Chat. Tout comme l'a fait Apple avec iMessage, et ça sera encore plus le cas avec l'adoption par ce dernier du protocole RCS.
Je ne vais pas toutes les traiter car de mon point de vue certains n'ont pas leur place en entreprise ou en B2B. Soit parce que je les estime destiné à un usage privé, ce qui permet de poser des limites, soit parce que trop spécifiques. Les trois dont je vais parler disposent de clients mobile et desktop, mais également d'une version web qui permet de les intégrer à un agrégateur d'applications web comme WebCalatog (que je recommande), SideKick ou encore Ferdium (il en existe d'autres). Ces utilitaires permettent de rassemble en un seul endroit tous les chat's...
Après avoir saboté MSN Messenger et cannibalisée Skype, Microsoft a fini par imposer Teams en profitant du confinement et surtout en l'incluant gratuitement dans toutes les offres 365. La méthode est plus que discutable et les différentes autorités de régulation se sont emparées du dossier suite à une plainte de Slack. Il n'en reste pas moins que Teams est devenu omniprésent et que le ver est dans la pomme. Même si beaucoup l'utilisent que pour du chat ou des réunions en visio, Teams va beaucoup plus loin en termes de fonctionnalités, certes utiles dans une multinationale, mais au point de rapidement perdre les utilisateurs. C'est mon cas et je n'utilise que le chat pour communiquer avec des contacts dont c'est le seul canal possible.
Teams a été conçu pour de très grandes entreprises et les échanges entre des utilisateurs de tenants différents sont limités et nécessitent une approbation. Essayez donc de faire glisser un document dans une conversation avec un contact externe. Impossible en a décidé Microsoft, pas plus que vous ne verrez les photos de profil de vos contacts externes. C'est comme ça, by design, simplement parce que ce n'est pas la cible. A destination des marchés SMB, Microsoft avait lancé il y a quelques années Kaizala, une sorte de clone de WhatsApp. Vous ne connaissez pas, normal, car rapidement retirée.
Bref, vous l'aurez compris je déteste Teams, mais je suis contraint de l'utiliser.
Comment justifier une licence de 6 à 12 € par mois et par utilisateur quand l'entreprise dispose déjà de Teams gratuitement ? Slack est un produit très intéressant et bien ficelé, jadis il était utilisable dans sa formule gratuite, hélas de plus en plus restrictive (3 mois d'historique seulement), ce qui me pousse à l'abandonner. Slack n'est toutefois pas exempt de défaut, et dans bien des facettes n'est pas vraiment adapté à l'utilisation facile inter entreprise. Slack c'est SalesForce, la cible principale n'est pas non plus les petites entreprises. Adieu Slack, je t'aimais bien, avant !
Et puis il y a le cas du (méchant) Google. Après des années d'errances (Hangouts) et de produits mal ficelés, je dois dire que je trouve l'actuelle version de Google Chat très séduisante. Elle n'impose pas de restrictions de communication entre les utilisateurs, qu'il s'agisse d'un simple compte Google personnel et gratuit ou d'un compte Google Workspace d'entreprise. L'interopérabilité est totale et l'interface claire et simple pour le chat, mais également des espaces de travail comme le propose Microsoft, mais de façon simple, intuitive et surtout légère. On peut dire qu'ils reviennent de loin, mais hélas Teams a entre temps cueilli le marché et j'y ai peu de contacts.
On ne vas pas ressortir ICQ et tout ce qui fonctionne sur la base IRC ou Jabber, voire Trillian. En intra entreprises certains pourront opter pour ce qui est proposé par Synology ou d'autres applications en auto hébergement, mais pas adapté au B2B. Il est également possible d'opter pour Discord, au départ dédié au gamers, certains l'utilisent en mode professionnel. Tout comme Zoom qui nous rappelle le confinement !
Les suisses proposent également Threema qui semble un beau produit destiné tant aux particuliers qu'au entreprise et qui préserve la confidentialité et la vie privé. Mais personne en connait en France !
Il n'en reste pas moins que le marché ne propose rien d'universel. La CE travaille à imposer une interopérabilité entre les messageries, à l'instar de ce qui existe pour le mail ou la téléphonie. Mais je doute fort de voir des résultats rapides et pour un bout de temps on sera encore contraints d'utiliser plusieurs clients.
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:44:"http://canaletto.fr/post/chat-s-and-business";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:52:"http://canaletto.fr/post/chat-s-and-business#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=b7938413-d923-4a65-871f-adf37f46289d";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:33:"sam., 9 déc. 2023 03:48:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:9:{i:0;a:5:{s:4:"data";s:4:"Chat";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:5:"Teams";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:5:"Slack";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:11:"Google Chat";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:8:"WhatsApp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:6:"Signal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:8:"Telegram";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:7;a:5:{s:4:"data";s:5:"Olvid";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:8;a:5:{s:4:"data";s:9:"Messenger";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=b7938413-d923-4a65-871f-adf37f46289d";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=b7938413-d923-4a65-871f-adf37f46289d";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:52:"http://canaletto.fr/post/chat-s-and-business#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=b7938413-d923-4a65-871f-adf37f46289d";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:145:" ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:39:"AutoDiscover & AutoConfig IMAP/SMTP";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:12485:"
En 2020, pour m'occuper pendant le confinement, j'avais écrit un article sur la configuration automatique des clients POP/IMAP. Ca fonctionnait sur Thunderbird, mais pas sur les clients Microsoft... Bon, les clients Microsoft il y en a de plusieurs sorte (Courrier, Outlook nouveau, ancien, 365, jadis Express et j'en passe) et la chose n'est (volontairement ?) pas simple. On va oublier les versions 365 qui même si elles supportent IMAP le font mal et ne sont pas vraiment destinés à cet usage mais plus à du MAPI.
Pour cet article j'ai monté un serveur Cloudron. Ce projet gère très bien le mail dans sa version de base gratuite. Hélas il ne gère pas la configuration des clients, ce qui est regrettable car il pourrait très facilement intégrer ce qui suit afin d'être totalement dans la philosophie du projet intégré !
Il existe plusieurs façons de faire de l'AutoDiscovery ou de l'AutoConfig
Elle se base sur des enregistrements DNS :
_imap._tcp 300 IN SRV 0 0 0 .
_imaps._tcp 300 IN SRV 0 1 993 mail.domain.tld.
_pop3._tcp 300 IN SRV 0 0 0 .
_pop3s._tcp 300 IN SRV 10 1 995 mail.domain.tld.
_submission._tcp 300 IN SRV 0 0 0 .
_submissions._tcp 300 IN SRV 0 1 587 mail.domain.tld.
Normalisée mais visiblement trop simple est abandonnée. Encore que certaines versions d'Outlook utiliseraient ça. Etrange.
Thunderbird va chercher les paramètres dans un fichier XML sur l'url :
http://autoconfig.domain.tld/mail/config-v1.1.xml
Outlook cherche l’enregistrement DNS de type SRV :
_autodiscover._tcp.domain.tld 3600 IN SRV 10 10 443 autodiscover.domain.tld.
qui va lui donner l'adresse ou interroger le fichier XML, donc un CNAME qui pointe sur le serveur web qui héberger le fichier XML, ce qui au final donnera une requête sur
https://autodiscover.domain.tld/AutoDiscover/AutoDiscover.xml
Simple ! Attention à bien respecter la casse du mot AutoDiscover... Et ne pas oublier que dans le cas Microsoft on travaille en HTTPS. Dans certains cas on pourrait faire pointer ça sur n'importe quelle url, mais il semblerait que certaines versions d'Outlook (et il y en a !) cherchent une url qui commence par autodiscover...
Dans la méthode qui va suivre on va utiliser un seul site capable de répondre aux url autoconfig et autodiscover, on renseignera donc ces enregistrement dans le dns :
_autodiscover._tcp.domain.tld 1800 IN SRV 10 10 443 autodiscover.domain.tld.
autoconfig 1800 IN CNAME web_server.domain.tld.
autodiscover 1080 IN CNAME web_server.domain.tld.
Ensuite on crée un site web capable de répondre à ces deux url pour l'ensemble des domaines de messagerie pour lesquels on souhaite proposer ce service. Le site doit répondre en HTTP et HTTPS, mais surtout sans redirection automatique HTTP vers HTTPS. Pour cet exemple j'ai utilisé un serveur web NGINX avec du PHP.
On va utiliser ce code que j'ai trouvé ici, je l'ai utilisé tel que en adaptant les enregistrements DNS et les redirections pour NGINX que l'on verra après le code. On copie donc ce code PHP dans autoconfig-mail.php :
<?php
/*
By David Mercereau
Licence Beerware
*/
function extract_domain($domain) {
if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches)) {
return $matches['domain'];
} else {
return $domain;
}
}
$domain = extract_domain($_SERVER['SERVER_NAME']);
$mailServeur='mail.'.$domain;
if (preg_match('/^\/mail\/config-v1\.1\.xml/', $_SERVER['REQUEST_URI'])) {
header('Content-Type: text/xml');
header('Content-Type: application/xml');
?>
<clientConfig version="1.1">
<emailProvider id="<?= $domain ?>">
<domain><?= $domain ?></domain>
<displayName><?= $domain ?></displayName>
<displayShortName><?= $domain ?></displayShortName>
<incomingServer type="imap">
<hostname><?= $mailServeur ?></hostname>
<port>143</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<outgoingServer type="smtp">
<hostname><?= $mailServeur ?></hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</outgoingServer>
<documentation url="https://webmail.<?= $domain ?>">
<descr lang="fr">Connexion Webmail</descr>
<descr lang="en">Webmail connexion</descr>
</documentation>
<documentation url="http://projet.retzo.net/projects/hebergement/wiki">
<descr lang="fr">Documentation</descr>
<descr lang="en">Generic settings page</descr>
</documentation>
</emailProvider>
</clientConfig>
<?php
} else {
// Outlook
//get raw POST data so we can extract the email address
$data = file_get_contents("php://input");
preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches);
//set Content-Type
header('Content-Type: text/xml');
header('Content-Type: application/xml');
echo '<?xml version="1.0" encoding="utf-8" ?>';
?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server><?= $mailServeur ?></Server>
<Port>993</Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $matches[1]; ?></LoginName>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>POP3</Type>
<Server><?= $mailServeur ?></Server>
<Port>995</Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $matches[1]; ?></LoginName>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server><?= $mailServeur ?></Server>
<Port>587</Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $matches[1]; ?></LoginName>
<SPA>off</SPA>
<Encryption>TLS</Encryption>
<AuthRequired>on</AuthRequired>
<UsePOPAuth>off</UsePOPAuth>
<SMTPLast>off</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>
<?php
}
?>
Ensuite dans configuration NGINX on ajoute les redirections suivantes qui va permettre de servir la bonne version XML selon que la requête utilise la méthode Outlook ou Thunderbird (attention à la casse...) :
location /AutoDiscover {
rewrite ^/AutoDiscover/AutoDiscover.xml /autoconfig-mail.php;
}
location /mail {
rewrite ^/mail/config-v1.1.xml /autoconfig-mail.php;
}

https://github.com/gronke/email-autodiscover
https://github.com/SpicyWeb-de/isp-mailConfig
On m'a demandé récemment d'intégrer des appareils Legrand dans Home Assistant, je l'avais déjà fait pour certains et j'en avais parlé dans cet article. Aujourd'hui il s'agit d'intégrer des commandes sans fil vue come des télécommandes dans HA. Vous allez me demander quel est l'intérêt quand un simple bouton Ikea (E1743) à moins de 10 fait le job pour mes volets roulants. C'est purement esthétique, quand on a un logement équipé en Legrand Céliane ou Mosaic, on veut parfois que les commandes des volets soient dans la même collection.

Soit, Legrand propose des commandes en Zigbee, il n'y a plus qu'à !
Dans la pratique on va voir que ce n'est pas si simple, en tous cas bien moins simple qu'avec mon bouton Ikea à 10 € ! Je précise le prix car les commandes Legrand sont plutôt à 80 €. Mais quand on aime on ne compte pas.
Il existe plusieurs type d'équipements Zigbee chez Legrand
Je me suis donc penché sur la gamme avec pile.
Première observation, ces devices sont généralement livrés avec un firmware de niveau 42 qui ne permet que l'utilisation du canal Zigbee 11. Don impossible à faire fonctionner sur mon ZHA qui est en 15. Je l'ai donc appairé sur mon Z2M en 11 et ça fonctionne. Et là je me suis dit que j'allais pouvoir mettre à jour ce firmware en OTA. Mais non, ça ne fonctionne pas et on se retrouve dans la problématique des équipements franco Français qui n'intéressent pas grand monde au niveau international (on pense par exemple à tout ce qui est lié à l'intégration Overkiz...).
Après moultes lectures des forums de diverses plateformes domotique, la conclusion est que la mise à jour du firmware ne peut se faire qu'au travers d'une passerelle officielle Legrand ! J’ai donc acheté le kit qui comprend :

Il faut bien sur installer l’appli Legrand et ensuite tenter d’associer la prise au WIFI. Facile ? Non, ça m’a pris de plombes car vu que leur process est trop long, le mobile qui se connecte à la prise pour la configurer repasse sur le WIFI normal ou il retrouve Internet, et perd la config en cours. Solution faire ça avec un vieux mobile… Bref, un premier amateurisme car on fait facilement ce genre d'association avec la majorité des objets mobile en WIFI !
Bon, la logique de l’appli est orientée électricien très grand public, avec une logique d'électricien qui n’est pas nécessairement la notre. C'est un choix, il faut s'y faire, mais n'oublions pas que nous sommes ici uniquement pour faire un mise à jour...
Ensuite il faut ajouter les inter. Sauf que la il faut comprendre qu’on ne peut pas ajouter un inter seul. Dans la logique Legrand si tu ajoute un inter, en fin de dialogue ça te demande ce que tu veux commander, sans quoi ça bloque et il n’y a plus qu’à forcer le redémarrage de l’appli et recommencer... Je n’avais pas de prise Legrand sous la main, mais au bout d’un moment j’ai fini par penser à appairer l’ampoule. Et la je vois enfin l’inter livré et mon inter de volet roulant qui ne peut rien commander, c’est le même mais avec un firmware différent.
Mais souvenons nous que nous somme là à jouer avec ce bazar dans le seul but de mettre à jour le firmware de ces putains d’inter qui au delà de couter un rein ne fonctionnent (mal) que sur le canal 11. Hélas il n’y arien pour faire cette mise à jour, mon inter de VR apparait en 42 dans l’appli et en 002a dans z2m, donc identique l’un étant en hexa. D’après ce que j’ai pu lire, la mise à jour se fera, un jour, mais on ne peut pas la forcer. Il faut juste laisser branché, en espérant que mon inter qui n’est pas connecté à un appareil se mette à jour tout seul…
Donc je laisse branché, la suite pour bientôt…
EDIT un peu plus tard :
EDIT le lendemain :
EDIT le lendemain soir :
EDIT le sur lendemain midi :
Montée :
1002/ Montée puis relâché :1002/3002
Descente :2002/ Descente puis relâché :2002/3003
Stop (Les deux en même temps) :3003
Ce comportement est identique à ce qu’il était sous Z2M et contrairement à d'autres télécommandes (le on/off Ikea (E1743 par exemple) il manque le fait qu’un second appui bref provoque un stop. Il faut donc bien appuyer au milieu pour faire un « stop » et ce n’est pas toujours pris en compte (problème physique).
Qu’il ne soit pas supporté sur ZHA est un fait, il faudrait développer un quirk et ça me dépasse. Je ne sais pas pourquoi il ne veut plus s’appairer sur Z2M, mais c’est peut être lié à mon installation, ma clé, que sais-je...
Il y a des chances que l’aventure Legrand va prendre fin et je que je retourne fissa ce Kit à Amazon !
A signaler toutefois que cette passerelle est Homekit. Ce qui veut dire que ses équipements remontent dans Home Assistant. Mais ne rêvez pas trop, si l’ampoule remonte bien, et certainement tous les actionneurs connectés (prises, modules DIN), pas les inter En fait si, il faut juste attendre un peu. Néanmoins tout ne semble pas remonter, uniquement une action par bouton ! Mais j’avais déjà remarqué ça avec les télécommandes Tuya qui ne remontent pas via une passerelle Tuya Homekit. Il y a une forme de logique, Homekit sert à commander un équipement, comme une télécommande, hors on ne commande pas une télécommande…
Par contre ça veut dire que les équipements reconnus par Legrand vont remonter dans Homekit, ce qui peut être une solution de contrôle facile pour des produit pas reconnus par HA (Profalux, Bubendorf, Aldes, etc…).
Je vous propose de poursuivre ici et que chacun y apporte ses retours.

J'avais acheté cette télécommande Mi Boxer il y a quelques mois afin de gérer les éclairages de mon séjour, en me disant que les curseurs seraient plus pratiques que mon Opple avec ses 6 boutons actuelle. Hélas elle n'était reconnue nulle part et avait terminé sa course dans le tiroir aux oubliettes du Zigbee...

C'était sans compter sur la ténacité de quelques amateurs de reverse engineering sur lesquels je suis tombé il y a quelques semaines et qui on fait un travail formidable qui a aboutit à une extension pour Zigbee2MQTT, ce qui rend cette télécommande enfin utilisable, tout au moins partiellement pour l'instant. Mais l'essentiel est là !
Ce qui fonctionne :
Ce qui ne fonctionne pas (pour l'instant) :
Une fois la télécommande reconnue sous Z2M on peut commencer à créer des actions. On remarque tout de suite que l'affaire va manquer de sensor: et que certains ne fonctionnent pas. Pas de panique, il y a une solution comme je vais vous le démonter avec l'automation: qui suit.
J'ai fait un mélange de choose: / conditions: / trigger.id . C'est un peu long, mais je la colle en entier ce qui vous évitera une fastidieuse saisie. Il faudra tout de même y coller vous id: et entity: ! Ah j'allais oublier, il faut aussi ajouter un petit input_select: ... Voir plus bas EDIT du 11/01/2024 !
J'ai tenté de faire ça avec ControllerX que j'adore et qui me sert pour toutes mes télécommandes, mais pour l'instant c'est un échec !
alias: GUI - Mi Boxer
description: ""
trigger:
- platform: state
entity_id:
- sensor.mi_boxeur_brightness
id: bright
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_1_on
discovery_id: 0x003c84fffec29c71_zone_1_button_on
id: 1on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_1_off
discovery_id: 0x003c84fffec29c71_zone_1_button_off
id: 1off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_2_on
discovery_id: 0x003c84fffec29c71_zone_2_button_on
id: 2on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_2_off
discovery_id: 0x003c84fffec29c71_zone_2_button_off
id: 2off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_3_on
discovery_id: 0x003c84fffec29c71_zone_3_button_on
id: 3on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_3_off
discovery_id: 0x003c84fffec29c71_zone_3_button_off
id: 3off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_4_on
discovery_id: 0x003c84fffec29c71_zone_4_button_on
id: 4on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_4_off
discovery_id: 0x003c84fffec29c71_zone_4_button_off
id: 4off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_5_on
discovery_id: 0x003c84fffec29c71_zone_5_button_on
id: 5on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_5_off
discovery_id: 0x003c84fffec29c71_zone_5_button_off
id: 5off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_6_on
discovery_id: 0x003c84fffec29c71_zone_6_button_on
id: 6on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_6_off
discovery_id: 0x003c84fffec29c71_zone_6_button_off
id: 6off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_7_on
discovery_id: 0x003c84fffec29c71_zone_7_button_on
id: 7on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_7_off
discovery_id: 0x003c84fffec29c71_zone_7_button_off
id: 7off
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_8_on
discovery_id: 0x003c84fffec29c71_zone_8_button_on
id: 8on
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: button_short_press
subtype: button_group_8_off
discovery_id: 0x003c84fffec29c71_zone_8_button_off
id: 8off
condition: []
action:
- choose:
- conditions: "{{ trigger.id in ['1on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.shellydimmer_f3d426
- service: input_select.select_option
data:
option: "1"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['1off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.shellydimmer_f3d426
- conditions: "{{ trigger.id in ['2on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.shellydimmer_d3e57c
- service: input_select.select_option
data:
option: "2"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['2off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.shellydimmer_d3e57c
- conditions: "{{ trigger.id in ['3on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.ikea_e27_tv
- service: input_select.select_option
data:
option: "3"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['3off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.ikea_e27_tv
- conditions: "{{ trigger.id in ['4on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.lidl_led_stand
- service: input_select.select_option
data:
option: "4"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['4off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.lidl_led_stand
- conditions: "{{ trigger.id in ['5on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.dimmable_sm309
- service: input_select.select_option
data:
option: "5"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['5off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.dimmable_sm309
- conditions: "{{ trigger.id in ['6on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.shelly_bulb_1
- service: input_select.select_option
data:
option: "6"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['6off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.shelly_bulb_1
- conditions: "{{ trigger.id in ['7on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id: light.led_strip_1
- service: input_select.select_option
data:
option: "7"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['7off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id: light.led_strip_1
- conditions: "{{ trigger.id in ['8on'] }}"
sequence:
- service: light.turn_on
data: {}
target:
entity_id:
- light.shellydimmer_f3d426
- light.shellydimmer_d3e57c
- light.ikea_e27_tv
- light.dimmable_sm309
- light.shelly_bulb_1
- light.lidl_led_stand
- light.plug_tz_10_switch
- light.led_strip_1
- service: input_select.select_option
data:
option: "8"
target:
entity_id: input_select.mi_boxer_select
- conditions: "{{ trigger.id in ['8off'] }}"
sequence:
- service: light.turn_off
data: {}
target:
entity_id:
- light.shellydimmer_f3d426
- light.shellydimmer_d3e57c
- light.ikea_e27_tv
- light.dimmable_sm309
- light.shelly_bulb_1
- light.lidl_led_stand
- light.plug_tz_10_switch
- light.led_strip_1
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '1') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.shellydimmer_f3d426
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '2') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
device_id: 1ff4112785e14b8b8cba18d45fec3b11
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '3') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.ikea_e27_tv
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '4') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.lidl_led_stand
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '5') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.dimmable_sm309
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '6') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.shelly_bulb_1
enabled: true
- conditions: >-
{{ is_state('input_select.mi_boxer_select', '7') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data:
brightness_pct: "{{ trigger.to_state.state }}"
transition: 0.2
target:
entity_id: light.led_strip_1
enabled: true
mode: restart
Avec la dernière mise à jour Zigbee2MQTT (1.35.1-1) il n’y a plus besoin de l’extension. Par contre ce que j’avais fait sur la base de ce qui est proposé ici ne fonctionne plus (bien que toujours dans la doc).
J’ai donc biaisé en faisant du mqtt direct :
Pour la détection (trigger:) des boutons (à dupliquer) :
- platform: mqtt
topic: zigbee2mqtt/Mi Boxer
payload: ('on', 101)
value_template: "{{ value_json.action , value_json.action_group }}"
id: 1on
- platform: mqtt
topic: zigbee2mqtt/Mi Boxer
payload: ('off', 101)
value_template: "{{ value_json.action , value_json.action_group }}"
id: 1off
Et pour la luminosité (il me reste à trouver comment ne prendre en compte que la charge action_level) :
- platform: mqtt
topic: zigbee2mqtt/Mi Boxer
id: bright
Ensuite on modifie dans le chose: coté action (à dupliquer bien entendu :
- conditions:
- condition: template
value_template: >-
{{ is_state('input_select.mi_boxer_select', '2') and trigger.id in ['bright'] }}
sequence:
- service: light.turn_on
data_template:
entity_id: light.shellydimmer_d3e57c
brightness_pct: "{{ trigger.payload_json.action_level }}"
Le problème avec la solution de mon EDIT précédent est que le trigger sur la charge MQTT globale génère trop de bruit. On va donc faire deux sensor: basés sur MQTT afin d'isoler la valeur de la luminosité (merci Mathieu) ainsi que le groupe (bouton) correspondant à la light: active, ce qui va nous permettre d'éliminer l'input_select: dans le filtrage à venir :
mqtt:
sensor:
- name: "Mi Boxer Bright"
unique_id: "mi_boxer_bright"
state_topic: "zigbee2mqtt/Mi Boxer"
value_template: "{{ value_json.action_level |int }}"
- name: "Mi Boxxer Group"
unique_id: "mi_boxer_group"
state_topic: "zigbee2mqtt/Mi Boxer"
value_template: "{{ value_json.action_group |int }}"
En trigger: on utilisera l'action : action_brightness_move_to_level qui remonte dans HA :
trigger:
- platform: device
domain: mqtt
device_id: 86c1403c24491ce021ac3ee081a86308
type: action
subtype: brightness_move_to_level
discovery_id: 0x003c84fffec29c71 action_brightness_move_to_level
id: bright
Et on complète notre action déclenchée par l'id: bright et filtrée sur le sensor: correspondant au bon bouton, et j'ai ajouté le light: actif afin de ne pas risquer une fausse manœuvre :
- conditions:
- condition: template
value_template: >-
{{ is_state('sensor.mi_boxer_group', '101') and trigger.id in ['bright'] and is_state('light.shellydimmer_f3d426', 'on') }}
sequence:
- service: light.turn_on
data_template:
entity_id: light.shellydimmer_f3d426
brightness_pct: "{{ states('sensor.mi_boxer_bright') | int}}"
Il ne reste plus qu'à attendre que Z2M remonte les informations liées à la température du blanc et la roue chromatique et on pourra les traiter avec la même méthode.
