Unifi UDM Pro, ZT, encore...

Longtemps j'ai disposé de deux lignes vDSL à 90 MB en étant proche du DSLAM. Il y avait un peu de bricolage, la Freebox en bridge sur le WAN1 de l'UDMP et Nerim en NAT entre le WAN2 (secours) de l'UDM Pro et vie le LAN sur un subnet différent sur MPTCP et OTB. Je sais, pas très propre, mais c'est juste un labo... Et c'est pourquoi on va optimiser un peu, d'autant plus qu'entre temps je me retrouve avec une fibre SFR et ma Freebox Révolution migrée elle aussi en fibre.

Versions utilisées, relativement stable par rapport à ces derniers mois :

  • UDMP : 1.10.0
  • Network : 6.4.47

Swap des ports WAN de l'UDM Pro

Avec l'idée migrer la Freebox Révolution vers une Delta S afin de profiter d'un lien à 8 GB, j'ai commencé par swapper la logique des deux ports Wan de l'UDMP. De base le port 9 en 1 GB (RJ45) correspond à WAN1 et le port 10 en 10 GB (SFP+) à WAN2. On peut se demander ou est leur logique tant il est évident que le lien principal sera plus performant que le lien de secours. Depuis je ne sais plus quelle beta il est possible d'inverser cette logique, mais attention il reste un bug de taille, le nom du provider (probablement lié à l'ASN) ne sera pas mis à jour et on reste avec ceux de base, et ça peut être déroutant. Comme on le voit ci dessous le port WAN1 avec la Freebox remonte OwCloud (anciennement Nerim racheté par BT), alors que le WAN2 est maintenant branché sur du SFR...). Ce bug est connu, mais comme d'autres il ne semble pas être dans les priorités des équipes Unifi qui préfèrent surement se concentrer sur une nouvelle version de l'interface...

Passer mon mélange de subnets en VLAN

C'est logique, il faut juste trouver un peu de temps. Et on va voir que du temps j'en ai perdu.

Pour créer un VLAN sur Unifi c'est dans l'absolu très simple. On crée un nouveau réseau et dans les paramètres avancés on choisit un VLAN ID et éventuellement le subnet et le mode DHCP, mais on peut faire sans et dans certains cas laisser faire l'Auto Scale Network. Ensuite on associe ce réseau à un port du switch. Sauf que j'ai passé des heures à chercher à faire compliqué car ça ne fonctionnait pas. Et finalement je me suis résolut à un reboot et là ça passe tout seul. Allez donc savoir...

Dans mon cas je voulait un VLAN sur un subnet particulier avec DHCP. Mon objectif étant d'y coller la box SFR qui sera branchée sur le WAN2 et sur ce VLAN et ainsi sera utilisable par mon fils pour ses jeux qui disposera ainsi d'une fibre rien que pour lui et sans aucune restrictions (il est grand !) et sans venir perturber la QoS du réseau principal, même si l'impact sera moindre via que fibre qu'il ne l'était en xDSL.

Sur le subnet de ce VLAN, la passerelle par défaut est donc la box SFR, comme c'est le cas sur le WAN2 de l'UDM. Les deux usages cohabitent, et la box de secours sert à quelque chose...

On peu ensuite créer un réseau WI-FI sur ce VLAN ou taguer des ports sur les switch (port profile) pour qu'ils l'utilisent.

On verra plus tard comment créer un VLAN dédié à l'IoT et surtout comment ouvrir ou bloquer le trafic entre les VLAN.

UPnP mon amour !

Toute cette partie fonctionnelle, je me suis aperçu que mon routeur VPN/SDN Zerotier (un Linux dans une VM) avait un peu de mal à sortir. Dans la configuration précédente il sortait en NAT via ma ligne de secours. Dans ma nouvelle configuration il doit sortir via l'UDMP, et le vas échéant profiter du secours. Curieusement j'ai remarqué que le passage en mode secours était lent et qu'au retour certaine destinations n'étaient pas joignables, bizzarement celles situées sur le réseau Free, Online Sacaleway pour être précis, alors que d'autres distants passaient. Et c'est critique.

On lance la commande :

root@zt:~# zerotier-cli peers

Et l'on obtient la liste des clients distants :

1d20dgr3f3 1.6.5  LEAF      -1 RELAY
2533gtdaef 1.6.5  LEAF      -1 RELAY
338fgte636 1.4.6  LEAF      13 DIRECT 7131     2944

Si DIRECT veut dire que tout va bien, RELAY indique que le distant est injoignable directement, que le trafic va transiter par les serveurs Zerotier. Et que quand le trafic passe, ce qui n'est pas toujours le cas, cela va induire une latence aléatoirement plus importante, au minimum 35 ms. là ou en direct on passera à 12 ms. Et justement, au delà de remplir les poches des Telcos, l'un des objectifs de la fibre est de réduire la latence (même si avec le l'IPV4 encapsulée dans de l'IPV6 on en perd un peu, mais c'est un autre problème et il faudra se pencher sur du full IPV6).

Après moultes recherches j'ai trouvé que 

  1. Que l'UDMP bloquait peut être certains ports en sortie, même si on désactive toute la partie sécurité et que tout est autorisé sur le firewall (pas clair !)
  2. Qu'il est possible de configurer des ports UDP secondaires sur un client (en plus du port UDP natif 9993.

On commence donc par configurer un port secondaire (on ne touche surtout pas au primary (voir ce fil vers la fin) sur le client qui me sert de routeur ZT en créant un fichier local.conf dans le bon répertoire (détails ici) :

{
  "settings": {
    "secondaryPort": 21234
  }
}

Mais visiblement ça ne suffit pas et il va falloir activer l'UPnP pour que tout passe en direct avec un minimum de latence :

Je ne suis pas fan de l'UPnP/NAT-PMP car ce protocole d'automatisation ouvre par définition les ports à la demandes des applications. Applications qui sur un réseau peuvent êtres malveillantes. Pourtant à la maison ce service est très utilisé et quasiment indispensable. Par contre hors de question d'utiliser cette méthode en entreprise ou une règle WAN_LOCAL avec la destination UDP 9993 devrait faire l'affaire (pas clair et à creuser). (ici pour pfsense avec ACL en prime, ce qui va aider en entreprise).

ZT Failover ?

Alors là on rentre dans le coté obscur. Tant qu'à avoir deux fibres autant qu'elles servent à quelque chose. Visiblement l'UPnP de l'UDM Pro est archi buggé. Je me suis donc dit que j'allais faire le failover directement dans le routeur Zerotier. J'ai donc ajouté une carte réseau virtuelle à ma VM ZT qui me sert au routage Lan to Lan (ici et pour monter ça) sur le VLAN 110 qui correspond à la box SFR. Les deux interfaces ont une passerelle par défaut avec le même poids. 

Ensuite on édite le fichier local.conf et on ajoute et on ajoute ces paramètres : 

{
  "settings":
  {
    "defaultBondingPolicy": "active-backup",
    "peerSpecificBonds":
    {
      "f6dd3a2db3":"active-backup",
      "1d20ff53f3":"balance-xor",
      "a92cbsd6fa":"broadcast"
    }
  }
}

Pour comprendre les différentes possibilités on ne trouve pas beaucoup d'information si ce ne sont deux docs officielles ici et ! A croire que ce sujet intéresse peu. Attention, j'ai eu pas mal de difficultés en éditant avec Nano ce fichier avec un copié / collé. Peut être une question de formatage qui m'aurait échappé. Par contre je n'ai pas réussit à associer dans ces paramètres le port secondaire.

Toujours est-il que si je débranche un interface l'autre prend le relais en mode active-backup avec une légère interruption que quelque secondes ou encore plus rapidement en mode broadcast. Mais ce dernier mode semble déconseillé car il génère pas mal de garbage...

Design

Si j'étais un cador en Visio ou d'autres outils en ligne comme draw.io ou autres, je pourrais vous faire un joli dessin, mais ce n'est pas le cas. Donc :

  • WAN1 : Freebox en mode bridge (je voulais tester la Freebox Pro mais elle n'a pas ce mode).
  • WAN2: Secours en NAT sur une box SFR. NAT également accessible sur les ports tagués en VLAN 110 sur un subnet dédié et isolé. Cela permet à mon fils de jouer et faire ses bricolages sans impact sur la sécurité du LAN principal.
  • VPN vers les sites distants accessible depuis le LAN principal. On verra plus tard comment profiter des fonctionnalités Multipath / Bonding de Zerotier qui vont nous permettre d'utiliser le lien de secours sans passer par celui de l'UDM.

Vieilleries...

Et dans tout ça que devient mon installation openMPTCP ? L'objectif de cette installation était d'agréger plusieurs lignes afin de fiabiliser et d'augmenter le débit disponible. Si la question du débit se pose en en xDSL elle ne se pose plus avec une fibre. Quant à la fiabilité il faudrait pour que ça ait du sens disposer d'un VPS puissant avec un lien 10 GB. Et encore on aurait malgré tout une latence dégradée. 

Mais je vais tout de même tenter la chose pour le sport. Pour ca il faut que je crée sur mon ESXi une nouvelle interface sur le VLAN 110 afin d'accéder au NAT de la ligne de secours et éventuellement le modem 4G. L'objectif n'est pas la performance, je ne toucherait donc rien coté VPS, mais juste d'éviter le lag qui se produit quand l'UDMP passe sur le lien de secours. Mais ça reste très rare et je ne sais pas si le jeu en vaut la chandelle. Peyt être pour l'IoT.

 

 

TailScale, VPN/SDN simplifié

Avant, il y avait les VPN (PPTP, IPSec, OpenVPN, etc...) qui ne sont pas toujours très simple à implémenter. Et puis arrivent les SDN, qui dans l'absolu sont des VPN, orientés réseaux étendus et très simples à mettre en œuvre. D'aucun le savent, je sus un fan de Zerotier que j'utilise au quotidien, tant pour interconnecter 4 sites à la place d'IPSec, que pour des machines distantes ou quand je suis en déplacement.

Entre temps les barbus nous ont beaucoup parlé de Wireguard, qui peu ou prou fait la même chose en un peu plus compliqué avec de soit disant meilleures performances. Et puis arrive TailScale qui lui est basé sur Wireguard et lui apporte la simplicité. Une sorte de Wireguard pour les nuls, enfin, pas que, car TailScale apporte à WireGuard la notion d'annuaire qui lui manque (WG-Dynamic en cours de dev.). Comme pour Zerotier, au delà d'un certain nombre de nodes il faudra passer à la caisse, mais les tarifs sont comparables, tout comme les possibilités offertes par la version gratuite suffisante pour un usage home.

Comme pour Zerotier, il est possible :

  1. D'accéder depuis internet à une machine particulière avec un client dédié (MacOS, Windows, Linux, IOS, Android).
  2. D'accéder depuis internet à un sous réseau dès lors que l'on installe un node Linux qui servira de routeur
  3. D'accéder depuis internet à internet de façon sécurisée en passant par un node Linux installé en mode Exit-Node, chez vous ou sur un VPS.
  4. D'accéder depuis chez vous à d'autres sous réseaux, bon là c'est plus compliqué et il faudra passer à la caisse et avantage à Zerotier (ou Wireguard, mais je n'ai pas testé).

Le gros avantage de Zerotier est que l'on travaille en Layer-2 sur un subnet dédié avec la possibilité de figer des IP là ou TailScale affecte des IP aléatoires et travaille en Layer-3. Mais les deux peuvent cohabiter, et ça peut être intéressant dans certains cas. Vous trouverez ici un comparatif des deux solutions.

Ce qui est certain, c'est que si moi j'y trouve des limitations, TailScale a pour lui une simplicité qui en fera un bon choix pour ceux qui débutent et veulent juste un usage limité. On va donc se consacrer aux trois premiers points d'usage.

Accéder depuis internet à une machine distante

Je ne vais pas vous expliquer comment créer un compte (il suffit d'aller sur leur site), ou comment se faire coucou entre deux machines clic clic (MacOS, Windows, IOS ou Android), il suffit de lancer l'installation et de faire un ping. Par contre je vais le faire pour la machine Linux qui nous servira dans les deux cas qui suivent.

On part du principe que la machine existe dans sa config minimale et qu'elle communique avec Internet. On en fait un client Tailsacle, ça se passe ici et c'est un peu différent selon les distributions. J'utilise Ubuntu et on commence par ajouter les clés et le repository :

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.gpg | sudo apt-key add -
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.list | sudo tee /etc/apt/sources.list.d/tailscale.list

On fait les mise à jour et on installe :

sudo apt-get update
sudo apt-get install tailscale

On lance le client et on copie l'url pour l'autoriser :

sudo tailscale up

Et voici notre IP :

ip addr show tailscale0

A ce stade si on a un autre client TailScale on peu faire un ping... A noter que sur la console d'admin on va pouvoir définir si la clé expire ou pas...

Si votre but est d'accéder à Home Assistant, il existe un addon qui fera le travail pour vous.

Accéder depuis internet à un sous réseau

Afin de ne pas devoir installer TailScale sur toutes vos machines, et surtout accéder à celle ou il n'est pas possible de l'installer (IoT par exemple), on va installer une machine en mode routeur. Pour l'instant ce n'est faisable que sous Linux, avec un petit RPI ou une VM par exemple... On continue sur la même machine.

Première chose on active l'IP Forwarding :

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

Ensuite on active le routage du subnet :

sudo tailscale up --advertise-routes=192.168.210.0/24

Et pour terminer on va dans la console d'admin indiquer que cette machine servira de routeur pour ce subnet (sous réseau) (les ... au bout de la ligne) :

A partir de là un client TailScale pourra accéder à ce sous réseau.

Accéder depuis internet à internet de façon sécurisée

Quand vous vous connectez en WI-FI sur un hotspot public tout le monde vous dira que ce n'est pas très sécure et qu'il faut utiliser un VPN. Ici plutôt que de payer pour un VPN on va utiliser notre propre connexion, à la maison, ou encore dans un VPS. Pour ça on ajoute la fonction Exit-Node à notre machine :

sudo tailscale up --advertise-exit-node

Et on la configure de facon idoine au même endroit

Ensuite dans le client on choisit l'option Exit-Node afin que tout le trafic transite par notre nouveau point de sortie.

A noter que si l'in veut combiner les deux fonctions, subnet + Exit-Node la commande sera plutôt celle ci :

 sudo tailscale up --advertise-routes=192.168.210.0/24 --advertise-exit-node

Voilà, c'est pas plus compliqué, c'est gratuit et c'est sur. En parlant de gratuit sachez que Free a démarré une beta afin d'intégrer Wireguard dans les Freebox et que Wireguard tout comme Zerotier peut être intégré dans certains routeurs (Unifi, Asus, etc...) ce qui vous évitera la petite machine Linux. Mais ce n'est pas forcément aussi simple.

Sources :

 

Home Assistant & Hygrostat

Longtemps j'ai utilisé l'intégration custom Hygrostat pour forcer la VMC lorsque quelqu'un prend une douche. C'est un détournement en ce sens qu'un hygrostat est plutôt fait pour fonctionner de façon contestante, comme par exemple dans une cave à vin. 

La dernière version de Home Assistant (2021-08) apporte dans son lot de nouveautés un hygrostat intégré. J'ai donc naturellement voulut l'utiliser. Mais celui ci, bien que plous évolué, ne me semble pas fait pour travailler sur un écart rapide d'humidité. Hors le niveau d'humidité dans une maison varie en fonction des saisons et de la la météo. Donc, à moins de l'ajuster manuellement tous les jours, si je règle la consigne sur une valeur arbitraire, le résultat sera aléatoire.

Mon idée, il y a surement d'autres façons de faire, est de calculer la moyenne de la valeur humidité sur les 8 heures passées et d'ajuster dynamiquement la consigne de mon hygrostat toutes les heures (ces deux valeurs restent à affiner).

Mise en œuvre

On commence par déclarer l'intégration dans le fichier de configuration (attention à bien supprimer le custom hygrostat si vous l'utilisiez avant car il a le même nom) :

generic_hygrostat:
  - name: "Hygrostat : SdB"
    humidifier: switch.ipx800_7_vmc
    target_sensor: sensor.rpi_mi_h_sdb
    min_humidity: 20
    max_humidity: 80
    target_humidity: 67
    dry_tolerance: 3
    wet_tolerance: 0
    device_class: "dehumidifier"
    min_cycle_duration:
      seconds: 5
    keep_alive:
      minutes: 3
    initial_state: true
    away_humidity: 35
    away_fixed: True
    sensor_stale_duration: 00:15:00

Pour les détails de sa configuration ça se passe ici.

Je ne me suis pas vraiment intéressé aux autres valeurs possibles, mais dans notre cas on veut déshumidifier, donc attention du device class...

Ensuite je vais utiliser l'intégration Statistics afin de calculer la moyenne du taux d'humidité de la salle de bain durant les 8 dernières heures :

    - platform: statistics
      name: 'Humidité Salle de Bain (moyenne)'
      entity_id: sensor.rpi_mi_h_sdb
      sampling_size: 700     
      max_age:
        hours: 8

Et pour terminer je vais créer une petite automation qui va ajuster la consigne en fonction de cette moyenne en ajoutant + 10 :de façon à ce que la VMC se mette en route si l'humidité monte lors d'une douche :

- alias: '000 : Set Hygrostat'
  trigger:
  - platform: time_pattern
    hours: '1'
  action:
  - service: humidifier.set_humidity
    target:
      entity_id: humidifier.hygrostat_sdb
    data_template:
      humidity: "{{ states('sensor.humidite_salle_de_bain_moyenne') | float + 10 }}"

Il ne reste plus qu'à tester... Et surement à affiner les valeurs.

Alternatives

L'objectif étant de forcer la VMC lors d'une douche il y a d'autres alternatives à explorer :

  • Détecter si quelqu'un prend une douche : ça pourrait se faire en détectant le débit de l'eau... un peu compliqué ! Ou encore avec un détecteur de présence dans la cabine de douche. A creuser.
  • Par un scénario : en hiver quand je dis à Alexa que j'ai l'intention d'aller me doucher, elle lance un script qui va lancer une play list sur Sonos et un radiateur soufflant, ensuite elle me dit (c'est bien la seule à répondre à touys mes souhaits !) quand la température est idéale pour me doucher. Je pourrait inclure la VMC.

Enjoy !

PS : idées et corrections bienvenues...

 

Renommer les dossiers et raccourcis OneDrive

OneDrive de Microsoft, tant en mode Business que grand public est maintenait à peu près à maturité et dans la plupart des cas utilisable, même s'il reste quelques bugs et bizarreries. Par contre il y a des cas de figure, certes pas très courants, qui ne sont pas pris en charge et vont dérouter l'utilisateur final dans le cas d'usage ou l'on installe plusieurs instances.

Si on installe deux instances sur deux tenant différents (on peut travailler pour plusieurs employeurs...), pas de problème et on va se retrouver avec deux répertoires dans le dossier utilisateur et deux raccourcis dans l'explorateur, en fait trois car il y a aussi le dossier OneDrive grand public dont on parlera plus loin :

  • OneDrive
  • OneDrive - Société Truc
  • OneDrive - Société Machin

Vous allez me dire, ou est le problème ? Jusqu'ici aucun. Par contre imaginons maintenant que notre utilisateur ait besoin de synchroniser deux instances sur le même tenant, donc la même entreprise, une assistante qui synchronise le drive de son manager, ou deux filiales qui partagent le même tenant, le cas d'usage n'est finalement pas si rare, et là c'est le bug car on se retrouve avec ça tant sur les répertoires que sur les raccourcis sur l'explorateur de fichiers :

  • OneDrive
  • OneDrive - Société Truc
  • OneDrive - Société Truc(1)

Microsoft vous répondra qu'il n'y a pas de bug et que ça fonctionne très bien, et c'est vrai. Sauf qu'à l'usage, bonjour la confusion. Microsoft vous dira également que ce n'est pas une bonne pratique et qu'il existe des partages de groupe, et ils auront raison. Mais la demande ici était précise et l'utilisateur voulait vraiment synchroniser deux deux instances vraiment séparées sur le même tenant, et vu que le client est roi, et surtout qu'il me fait manger, je vais répondre à sa demande plutôt que de lui expliquer les bonnes manières (je laisse cette tache à Microsoft). Et comme rien n'est prévu pour ce cas d'usage, je vais vous expliquer comment j'ai contourné.

Attention, ces manipulations ne sont pas sans risques, vous savez ce que vous faites et vous assumez vos responsabilités. Dans le cas contraire allez jouer dans le bac à sable. En tous cas ne venez pas pleurer.

Je part du principe que mes deux instances OneDrive sont configurées et actives.

  1. On quitte les deux clients OneDrive (icones bleus en bas à droite) et on s'assure que ça ne tourne plus dans le gestionnaire de taches.
  2. On renomme le dosser OneDrive concerné : OneDrive - Société Truc(1) par OneDrive - Société Truc Services.
  3. En option on peut aussi déplacer ce dossier sur un autre disque (local et pas de disque externe en USB, hein !)
  4. On lance regedit.exe et soit on cherche Société Truc(1), soit plus proprement on va modifier cette chaine dans les clés suivantes :

    Dans HKEY_CURRENT_USER (HKCU) (4 entrées)

    HKCU\Software\Microsoft\OneDrive\Accounts\Business2\UserFolder & DisplayName
    HKCU\Software\Microsoft\OneDrive\Accounts\Business2\ScopeIdToMountPointPathCache\(ID)
    HKCU\Software\Microsoft\OneDrive\Accounts\Business2\Tenants\(name)\(path)
    HKCU\Software\SyncEngines\Providers\OneDrive\(ID)\MountPoint

    Dans HKEY_LOCAL_MACHINE (HKLM) (2 entrée, mais je n'ai rien trouvé dans la première)

    HKLM\SOFTWARE\Microsoft\Security Center\Provider\CBP\(ID)\NAMESPACE
    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\OneDrive!(ID)\UserSyncRoots\(SID)
    Il faut un peu tâtonner et ne pas perdre de vue que l'on cherche à remplacer Société Truc(1) par Société Truc Services (la partie après de Onedrive - "(on fait attention aux espaces et aux tirets, quant à l'accent je n'ai pas testé mais ça devrait le faire).

  5. Ensuite on ouvre l'emplacement suivant : %UserProfile%\AppData\Local\Microsoft\OneDrive\settings\Business1
    On y trouve un fichier (ID).ini dans lequel on cherche la ligne commençant par LibraryScope, la première en général, et on change Société Truc(1) par Société Truc Services et on enregistre.
  6. On relance OneDrive et tout devrait bien se passer et on doit retrouver les fichiers dans le bon répertoire et les raccourcis avec les bons noms.
  • OneDrive
  • OneDrive - Société Truc
  • OneDrive - Société Truc Services

Si on n'obtient pas le résultat espéré on va redémarrer (comme souvent sous Windows) et si toujours pas on revient dans regedit.exe et on cherche les entrée Société Truc(1) que l'on aurait pu oublier.

Attention, danger : dans l'admin de Microsoft 365 il est possible de renommer le nom de société et je crois depuis peu (??) le nom OneDrive ailleurs. Ce renommage est à considérer au tout début car si on le fait plus tard ça impactera tous les client OneDrive et SharePoint qui risquent de perdre leurs petits et générer pas mal de support....

Bonus

Comme vous avez pu le remarquer le raccourcis OneDrive (Grand public) est toujours présent dans l'explorateur de fichiers alors qu'il ne sert à rien et prête à confusion en entreprise.

Pour supprimer l'icône OneDrive - Personne dans l'explorateur de fichiers, voici comment faire :

  1. Lancez regedit.exe et accédez à l'emplacement suivant : hkey_current_user\software\microsoft\windows\currentversion\explorer\desktop\namespace
  2. Recherchez la sous-clé pour OneDrive personnel. Habituellement, il s'agit généralement de {018D5C66-4533-4307-9B53-224DE2ED1FE6}. Mais ça peut être différent).
  3. Accédez à l'emplacement suivant : hkey_classes_root\clsid et recherchez la clé qui correspond à OneDrive personnelle que vous avez trouvé à l'étape précédente.
  4. Dans la sous-clé system.ispinnedtonamespacetree, modifiez la date de valeur de 1 à 0.
  5. Enregistrez la modification et relancez l'explorateur de fichier. L'icone de raccourcis OneDrive à du disparaitre, sans on tue les tache explorer dans le gestionnaire de fichier et on le relance...

Enjoy ;-)

Faites vous entendre

Tout come lors des élections, ne vous abstenez pas et allez voter sur UserVoice pour que tous ces bricolages se fassent en un seul clic :

Sources

 

 

Home Assistant, Zigbee, encore...

Alors, comment dire, dans la série jamais content, le Zigbee... Aujourd'hui ce protocole dispose d'une multitude d'approches plus ou moins simples à mette en œuvre, on résume :

  • Deconz / Phoscon : l'ancêtre toujours vaillant avec les clés Combee I et II ou le module RPI. Ca fonctionne, mais le développement est lent les nouveaux appareils tardent à êtres intégrés. De plus ça nécessite un addon et une intégration, le tout étant moyennement bien intégré. C'est ce qui assure la grande majorité de mes objets Zigbee depuis le début, d'abbord Sous Jeedom et ensuite sous Home Assistant.
  • ZHA (Zigbee Home Automation) : Totalement intégré à Home Assistant c'est la voie la plus simple qui supporte la majorité des clés du marché. Rien à redire, presque trop simple...
  • Zigbee2MQTT : La voie royale de geeks en tout genre, MQTT est à la mode, ce protocole est certes génial, mais franchement si vous débutez en domotique il est tout à fait possible de s'en passer en passant par ZHA.
  • Les passerelles des marques (Xiaomi, Ikea, Hue, etc...) : ça peut faire le job, mais ça restera lié aux équipement de la marque.
  • Les passerelles sous Tasmota, comme la Sonoof : pas testé, donc par essence ça me parait complexe et vaut mieux avoir un pote barbu habile du fer à souder. Idem pour la fameuse SLS dont certains ont du entendre parler.

Si la première des solutions (Deconz) fonctionne exclusivement avec la clé de la marque, ZHA et Zigbee2MQTT savent fonctionner avec toutes les clés disponibles. A commencer par la peu couteuse mais pas très performante cc2531. C'est pas cher et c'est une bonne option pour se faire la main, mais on se rendra rapidement compte que ça manque parfois de réactivité, une faiblesse qui ne sera pas gênante sur des sondes de température, mais qui le deviendra sur des interrupteurs, ou pire des variateurs. On va donc chercher à gagner du temps en explorant d'autres options.

Je vais explorer deux options en utilisant Zigbee2MQTT, mais j'aurais pu faire la même chose avec ZHA si j'avais voulut faire simple.

Clé USB à base de cc2652P

Si on commence à en trouver sur le net, il se trouve que j'ai un pote habile de ses mains qui sait souder et cherche à gagner sa vie en intégrant cette clé. Je lui ai donc acheté une des premières productions il il y a quelques semaines et je l'ai faite fonctionner sous Zigbee2MQTT en replacement de la cc2532.

J'ai un peu galéré sur la config à changer (pan_id) et surtout on passe en Zigbee 3.0 et le ré appairage des équipements est obligatoire, au final surtout fastidieux.

  serial:
  port: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
advanced:
  rtscts: false
  log_level: info
  pan_id: 231  ## Attention à ce point...

La réactivité est bien meilleure et dans l'absolu le nombre d'équipements supportés simultanément bien plus important

La passerelle Xiaomi V3

Là vous vous demandez ce que vient faire cette passerelle que je dénigras plus haut. En fait elle est là car je vais l'utiliser non pas en mode natif avec une liste de devices limitée, mais en remplacement de la clé USB avec Zigbee2MQTT (ou ZHA). La liaison se fait en WIFI, et je peux donc placer la passerelle ou je veut dans la maison. Et cerise sur le gâteau les devices BLE reconnus remontent nativement dans Home Assistant...

La mise en place est un peu plus compliquée car il y a plusieurs façon d'utiliser ça, mais je vais essayer de vous mâcher un peu le travail. D'abord il vous faut une Gateway Xiaomi v3 (ZNDMWG03LM (CN) ou ZNDMWG02LM (EU) et rien d'autre), on en trouve chez AliExpress (27 €) ou Amazon (35/40€), de plus ces temps ci il y en a pas mal en reconditionnées état neuf chez Amazon à 25 €, donc plus simple que d'attendre 3/4 semaines avec le risque que le tanker se mette en travers du canal de Suez...

Une fois que vous avez en main votre nouveau jouet, vous l'ajoutez à Mi Home sans faire les mise à jour proposées (serveur Chine, j'ai pas essayé en serveur Europe mais ça devrait fonctionner également, retour welcome). A partir de là il faut récupérer le token (Mi Home, ou ici par exemple.) et lui assigner une réservation DHCP pour ne pas la perdre.

Ensuite sous Home Assistant :

  • On installe cette intégration via HACS (si vous n'avez pas HACS ou ne savez pas ce dont il s'agit, repassez dans quelques semaines...).
  • On ajoute l'intégration Xiaomi Gateway 3 dans Home Assistant (choisir Host & Token) en renseignant le HOST et le TOKEN et sans toucher aux options Telnet. Si ça ne fonctionne pas c'est surement lié à la version du firmware, firmware qu'il est possible de downgrader via Telnet (et pour une fois sans rien à souder).

Je vous ai perdu ? Pas de panique, tout est expliqué dans le GitHub de l'intégration et Google Translate est notre ami !

Modes de fonctionnement

  1. Natif Mi Home : On remonte dans Home Assistant les devices associables à Mi Home en ZigBee ou BLE (modules Xiaomi, Aqara et quelques ampoules Ikea).
  2. ZHA : La passerelle devient le coordinateur de ZHA et on profite de tous les devices supportés par ZHA. Cette option n'est pour l'instant pas la plus stable.
  3. Zigbee2MQTT : La passerelle devient le coordinateur de Zigbee2MQTT et on profite de tous les devices supportés par cette option. C'est la voie que j'ai explorée.

En choisissant l'option 3 et en considérant que Zigbee2MQTT est bien installé avec son broker, il suffit de modifier la configuration de l'addon en remplaçant la clé USB par un port TCP :

serial:
  port: 'tcp://192.168.210.119:8888'
  adapter: ezsp

Et bien sur de refaire les associations... Et constater une excellente réactivité. Meilleure qu'avec la clé à base de cc2652P, il me semble mais ça reste vraiment très subjectif. En tous cas sans commune mesure comparé à une clé cc2531.

On fait ainsi d'une pierre deux coups avec du Zigbee déporté qui intéressera ceux qui font tourner Home Assistant dans une VM installée au fond du garage, mais aussi la remontée des capteurs BLE, ce qui permettra de faire le ménage dans les intégrations dédiées BLE, et dans mon cas me séparer de mon Home Assistant remote qui supportait les clés USB

Et si on fait l'impasse sur le BLE, je pense qu'une fois la passerelle configurée pour Zigbee2MQTT on peut même désinstaller l'intégration...

Cette solution basée sur du reverse engineering sera pérenne pour peu que vous ne fassiez pas les mises à jour depuis Mi Home, et pour ça il existe dans l'intégration une possibilité de blocage.

EDIT 21/05/2021 : J'observe quelque plantages qui nécessitent le redémarrage de Zigbee2MQTT. Le problème semble venir du driver EZSP et non de la passerelle. Et curieusement ces plantages sont différents selon le type d'équipements. J'ai constaté une certaine allergies aux télécommandes IKEA par exemple... Par contre parfait pour remonter des sondes en BLE. A suivre.

EDIT 01/07/2021 : En l'état pas d'amélioration et inutilisable avec ZHA ou Zigbee2MQTT. Par contre 100% fiable en mode natif Xiaomi Mi Home. Donc parfait pour déporter des devices reconnus dans Mi Home

 

Home Assistant & Unifi Doorbell

Ca faisait un moment que je voulais moderniser la sonnette basic du portail par quelque chose de plus moderne. Il existe bien des solution élégantes de type Ring ou Nest, voire des chinoiseries plus ou moins attrayantes, mais l'inconvénient de toutes ces solutions c'est qu'elles passent par le cloud et que je trouve ridicule une telle dépendance, sans compter qu'il faut passer à la caisse...

En étant déjà équipé Unifi Protect j'ai donc attendu la disponibilité du système Dorbell G4 EU. Ce système fonctionne en WI-FI et la version EU est fournie avec un transformateur au format DIN pour l'alimenter en 24 volts. Donc entre le portail et la maison nous n'aurons besoin que d'une paire en BT et bien sur d'un signal WI-FI convenable.

Le problème est que ce système d'origine US est prévu pour fonctionner en 24 V. AC, le standard US pour ce genre d'équipement. Hors les sonnettes européennes fonctionnent soit en 220 V AC soit en 8 V. AC. Je me suis donc mis dans un premier temps à la recherche d'un carillon fonctionnant avec la bonne tension comme expliqué ici, objet rare sous nos latitudes et avec des commentaires déplorables.

Et puis j'ai réfléchit un peu, le Doorbell G4 remonte dans Home Assistant et j'ai des enceintes connectées dans toutes les pièces, on devrait donc pouvoir se passer d'une antique sonnette...

Après quelques tentatives j'ai utilisé un BluePrint existant (et perfectible) qui va me permettre de notifier avec un message vocal (TTS) une enceinte Google et d'envoyer une notification sur mon mobile avec la photo de la personne qui sonne, ce qui dans la pratique est bien plus efficace que l'application Unifi qui se contente de notifier mais qui ensuite est longue à afficher l'image. De plus si j'avais un portail électrique je pourrais me servir d'une action sur la notification pour l'ouvrir à distance depuis Home Assistant.

Mais tout ça ne sera pas suffisant pour me sortir du lit quant un livreur sonne tôt. Il me faut donc aller plus loin et faire sonner plusieurs enceintes Sonos. Le problème étant que si vous envoyez simplement un son à une enceinte Sonos, ça va certes le jouer au volume en cours, mais également casser l'état et le groupage des enceintes ainsi que le programme courant. J'ai donc créé une automation en parallèle qui va :

  • Sauvegarder l'état courant du système Sonos
  • Ajuster le volume des enceintes choisies
  • Grouper les enceintes choisie pour cette notification
  • Jouer le mp3 de la sonnerie (large choix ici).
  • Restaurer l'état précédent...
- alias: "RC : Doorbell Call Sonos Sound"
  trigger:
    - platform: state
      entity_id: binary_sensor.doorbell_g4_doorbell
      from: 'off'
      to: 'on'
  condition: []
  action:
  - service: sonos.snapshot
    data:
      entity_id: all
  - service: sonos.unjoin
    data:
      entity_id: media_player.sonos_hall
  - service: sonos.join
    data:
      master: media_player.sonos_hall
    entity_id: media_player.sonos_hall, media_player.sonos_cuisine
  - service: media_player.volume_set
    data:
      volume_level: 0.5
    target:
      entity_id: media_player.sonos_hall
  - service: media_player.play_media
    data:
      media_content_id: https://ha.canaletto.fr:8123/local/iphone.mp3
      media_content_type: music
    target:
      entity_id: media_player.sonos_hall
  - delay: 00:00:08
  - service: sonos.restore
    data:
      entity_id: all

Voilà, tout ceci reste perfectible, mais comme on dit, ça fait le job et il me reste à fixer l'objet !

A noter que cet appareil comporte également un détecteur de présence qui pourra ainsi permettre de signaler une présence (facteur ?), et que ce détecteur peut également allumer un led sous l'appareil. Le problème étant qu'il sera fixé dans la rue à la portée du premier vandale venu...

 

 
 

 

 

Cloud Drives et sécurité

Au fil du temps nous avons pris l'habitude d'utiliser des Cloud Drives. S'ils ont tous été comparés et décortiqués il reste des aspects souvent laissés de coté. La vraie menace aujourd'hui n'est pas tant de perdre ses fichiers mais plutôt de se les faire chiffrer à ses dépends, et dans ces cas comment les récupérer, et surtout les récupérer rapidement.

La majorité des ces offres permettent la synchronisation sélective (ne synchroniser que ce qui est utile) et surtout le travail en ligne avec des web apps. L'avantage de travailler ainsi est qu'aucun crypto virus ne pourra venir vous chatouiller.

Je ne vais pas faire le tour de toutes les offres mais me concentrer sur celles que je connais bien et me pencher sur les environnements Windows et MacOS.

Microsoft OneDrive

Depuis SkyDrive cette offre a beaucoup évoluée. Il existe en fait deux offres, l'une grand public (qui fait partie de l'offre Outlook grand public) et l'autre à destination des professionnels et des entreprises (qui fait partie de l'offre tentaculaire Microsoft 365, et n'est pas achetable à part). Techniquement l'usine qui est derrière est différente, mais dans sa manie habituelle Microsoft les appelle du même nom, et cette pratique confuse n'est pas nouvelle. 

Dans la pratique les deux offres proposent un historique des versions de tous les documents, on peu donc considérer que si un document est vérolé par un crypto virus, il sera toujours possible de restaurer la version précédente. Cette opération peut bien sur être fastidieuse, et là ou Microsoft va plus loin c'est qu'il offre la possibilité de restaurer l'ensemble des fichiers à une date donnée. Ainsi il sera possible de restaurer rapidement tout le contenu. C'est un vrai plus.

Pour la version Entreprise le client permet également de synchroniser localement des librairies de groupe, par ailleurs accessibles via Teams. Et dans ce cas il est également possible de faire une restauration complète à une date donnée.

Google Drive

Chez Google il existe également deux offres. La première pour tout le monde (Google One) et la seconde à destination des professionnels et des entreprises (Google WorkSpace). Le client Sauvegarde et Synchronisation est utilisable sur les deux offres, il permet entre autre de synchroniser localement son drive, mais également de sauvegarder en continu des répertoires de l'ordinateur. C'est ainsi que ma fille, traumatisée par la perte d'une partie de ses cours sur OneDrive Business (sous Mac) les sauvegarde sur Google Drive... Une autre application réservée aux entreprise permet d'utiliser son drive comme un disque supplémentaire. Dans l'offre professionnelle il est également possible de créer des drives partagés qui pourront être accessible aux utilisateurs de la solution gratuite.

A ma connaissance il n'existe pas d'option permettant de restaurer l'ensemble des documents à une date donnée sur l'offre grand public. Par contre l'historisation des fichiers fonctionne sur les deux offres.

Attention : les des offres Google Drive sont en pleine mutation des de nouvelles fonctionnalités sont prévue pour fin avril début mai.

Infomaniak KDrive

Cette offre suisse est à considérer pleinement car full RGPD, US Cloud Act free et avec la garantie que vos données ne seront jamais exploitées. Plus jeune et encore perfectible elle propose comme les autres une offre gratuite et une offre payante plus complète. Une historisation plus ou moins évoluée est au rendez vous mais sans possibilité d'une restauration globale.

A noter que sur les offres de groupe il n'est pas possible à l'administrateur d'accéder aux drives des autres utilisateurs et ainsi les sauvegarder. Donc ok dans un groupe d'indépendants ou la confidentialité de chacun est assurée, mais pas en entreprise.

Un des gros plus de KDrive est toutefois d'être full compatible WebDav, donc accessible sans client et par un Synologie pour par exemple une sauvegarde... (One drive également, mais il faut passer par Internet Explorer, c'est fastidieux, antique et plutôt décourageant...).

Le produit est plus jeune mais vraiment prometteur.

Dropbox

Ca existe encore ? Oui bien sur, mais il y a longtemps que je n'ai pas testé.

Box

Idem

Ice Drive

Un petit nouveau prometteur que je suis en train de tester.

Synology Drive et autres...

Un simple NAS, si possible hébergé, peut constituer une possibilité de cloud drive full privé. Ca fonctionne très bien. Il existe d'autres offres dans ce genre, NextCloud par exemple, mais ce n'est pas l'objet de la réflexion d'aujourd'hui.

Apple Cloud

Un autre monde.

Sauvegarder son / ses cloud drives

Comme on l'a vu tous ces cloud drives offrent des garanties de moyens pour assurer la sécurité de vos données. Mais aucune de ces solutions n'est infaillible et en cas de désastre (un crypto par exemple) la restauration risque d'être fastidieuse. Donc s'agissant de données critiques ou d'utilisateurs exigeants il va falloir s'assurer coté IT d'outils de restauration rapides et faciles à mettre en œuvre. Il en existe une multitude, Par exemple Veeam propose une solution qui nécessite un serveur Windows pour l'exploiter, une autre alternative consiste à utiliser un NAS Synologie et Active Backup pour Office 365 ou GSuite. Ce NAS peut être dans l'entreprise, ou par exemple loué chez Infomaniak qui le propose et ou les débits seront en adéquation avec cet usage. Une sorte d'assurance anti stress pour le responsable IT.

Clients alternatifs

Toutes ces offres proposent leur client propriétaire. Avec le temps ces clients fonctionnent plutôt bien, même s'il reste des lacunes. Que dire de OneDrive toujours en 32 bits là ou Microsoft prône du 64 bits ? Que dire du client Mac OneDrive qui fonctionne enfin (je touche du bois) après des années pour le moins catastrophiques ?

Bref, si on a un usage particulier, ou si on utilise plusieurs services en parallèle, il est tout à fait possible de passer par des clients alternatifs comme MountainDuck (Mac et Windows) ou RaiDrive (Windows). Ce n'est pas un conseil, mais une alternative possible. Il en existe d'autres bien sur, et les plus barbus s'orienteront naturellement vers RClone.

 

Home Assistant & Planification, Schedy, la suite !

Encore, allez vous me dire ! Oui car d'une part mon dernier article sur Schedy était un peu fouillis, et surtout en relisant les réponses de son auteur à ceux qui tentent de créer une interface, je me suis aperçu que l'approche que j'avais, qui consistait à faire passer à Schedy des plages horaires, n'était pas la plus simple ni la plus adaptée. D'une part il faut transformer des input_time en sensor ou en input_number (les deux seules possibilité pour transmettre à Schedy un horaire de début et de fin de plage sous la forme du nombre de minutes écoulées depuis minuit). C'est lié à son fonctionnement interne, ce n'est pas très pratique. Son auteur n'a pas le temps de faire évoluer, et surtout c'est un barbu qui déteste les interfaces graphiques...

J'ai donc opté pour une autre approche plus simple et plus concise qui va consister à se servir des input_datetime: de début et de fin de plage pour actionner un binary_sensor: qui passera à ON si on se trouve dans la plage.

A partir de là dans Schedy, on change la température de consigne (input_number:) de la la plage, si la plage est activée (input_boolean:) et la période active (binary_sensor:).

Et bien sur on le fait en fonction des contraintes que l'on s'impose en fonction de la situation de chacun (jour de travail, demie journée de travail, week-end ou télétravail), et tout ça pour chacune des pièces que l'on gère auxquelles correspond un thermostat (climate:) ou un groupe de thermostats.

De cette façon on continue à faire une gestion horaire qui correspondra à la majorité des usages, mais avec ce "mode" binaire on peut très bien imaginer une gestion à base de géolocalisation. Par exemple, en été, si un des membres du logement travaille à une distance de 20 Km, on peut imaginer mettre en route la climatisation s'il se rapproche à moins de 10 Km... Le chauffage (convecteurs + climatiseur) ne se gérant pas comme la climatisation (climatiseur seul) j'y reviendrait prochainement.

Le script

Pour plus de facilité on va utiliser un script afin de créer l'ensemble des entités nécessaires. Dans ce script on crée les entités nécessaires à chaque pièce et le nombre de plages que l'on veut gérer chaque jour que l'on multiplie avec le nombre de jours particuliers à gérer ( jours de semaine, le samedi qui est travaillé le matin et les dimanches et fériés par exemple). 

Pour chaque plage on crée (à chaque plage correspond un fichier qui est stocké dans les pakages) :

  • Deux input_datetime: pour le début et la fin de chaque plage,
  • Un binary_sensor: pour savoir si on est dans la plage,
  • Un input_number: pour définir la température de consigne de la plage,
  • Un input_boolean: pour activer ou désactiver la plage.

On va également créer un fichier heating_global.yaml qui va contenir :

  • Un binary_sensor: s'appuyant sur workday: pour savoir si on est un samedi travaillé,
  • Deux input_number: pour définir la température de consigne pour les plages inactives (deux ou trois car ce n'est pas pareil pour une chambre vide ou un climatiseur),
  • Deux input_boolean: un premier pour activer un mode télétravail, et un autre pour activer / désactiver le bazard.

On pense à éditer les lignes 39 pour définir les pièces et 41 pour le nombre de plages par pièces. On est pas obligé de faite tout d'un coup bien sur (et je vous conseille de commencer light).

/bin/bash
test -d /config/packages || mkdir /config/packages
cd /config/packages
cat >heating_global.yaml<<EOF
input_boolean:
  heating_enabled:
    name: Heating Global
    icon: mdi:toggle-switch
  homeoffice:
    name: Home Office
    icon: mdi:toggle-switch
input_number:
  off_temperature:
    name: Off Température
    min: 14
    max: 26
    step: 1.0
    unit_of_measurement: °C
    icon: 'mdi:thermometer-lines'
  off_temperature_ac:
    name: Off Température
    min: 14
    max: 26
    step: 1.0
    unit_of_measurement: °C
    icon: 'mdi:thermometer-lines'
binary_sensor:
  - platform: template
    sensors:
      workday_saturday_working:
        friendly_name: "Samedi travaillé"
        value_template: >
          {% if now().isoweekday() in (5,) and states.binary_sensor.workday_sensor.state == 'on' %}
            true
          {%else%}
            false
          {% endif %}
EOF
for room in hall_ac
do
for period in {1..12}
do
cat >${room}_heating_period_${period}.yaml<<EOF
input_datetime:
  ${room}_heating_period_${period}_start:
    name: "Heating Period ${period} Start Time"
    has_date: false
    has_time: true
  ${room}_heating_period_${period}_end:
    name: "Heating Period ${period} End Time"
    has_date: false
    has_time: true
binary_sensor:
  - platform: template
    sensors:
      ${room}_slot_${period}:
        entity_id: sensor.time
        friendly_name: ${room}_Slot ${period}
        value_template: >
          {% set t = states('sensor.time') %}
          {% set start = states('input_datetime.${room}_heating_period_${period}_start') [0:5] %}
          {% set stop = states('input_datetime.${room}_heating_period_${period}_end') [0:5] %}
          {{ start <= t < stop if start < stop else (start <= t or t < stop) }}
input_number:
  ${room}_heating_period_${period}_temperature:
    name: Heating Period ${period} Temperature
    min: 18
    max: 25
    step: 1
    unit_of_measurement: °C
    icon: 'mdi:thermometer-lines'
input_boolean:
  ${room}_heating_period_${period}:
    name: Heating Period ${period} Enabled
    icon: mdi:toggle-switch
EOF
done
done
exit

On teste la configuration (check configuration) et on recharge ce qui est nécessaire (reload input booleans, reload input date times, reload input numbers, reload templates entities).

Les cartes Lovelace

Ici on a deux approches possibles. Un mode normal ou un mode compact. J'ai déjà évoqué le mode normal, mais quand on 12 plages par pièces on va essayer de compacter la chose. C'est un peu plus fastidieux pour saisir les valeurs, mais en général on ne change pas ces valeurs tous les jours.

type: entities
entities:
  - entity: input_boolean.heating_enabled
    name: Activation AC mode chauffage
  - entity: binary_sensor.heating_enabled
    name: Etat global du chauffage
  - entity: binary_sensor.workday_sensor
    name: Jour de semaine
  - entity: binary_sensor.workday_saturday_working
  - entity: input_boolean.homeoffice
  - entity: input_number.off_temperature
  - entity: schedy_room.schedy_heating_hall_ac
    name: Retour Schedy AC
  - label: SEMAINE
    type: section
  - entities:
      - entity: binary_sensor.hall_ac_slot_1
        name: false
      - entity: input_number.hall_ac_heating_period_1_temperature
        name: false
        unit: °
        format: precision1
      - entity: input_datetime.hall_ac_heating_period_1_start
        name: false
        format: relative
      - entity: input_datetime.hall_ac_heating_period_1_end
        name: false
    entity: input_boolean.hall_ac_heating_period_1
    name: Plage 1
    show_state: false
    toggle: false
    icon: 'mdi:calendar-range'
    type: 'custom:multiple-entity-row'
    state_color: true
# >>> Ici les autres avec un séparateur...
show_header_toggle: false
state_color: true
theme: teal
title: Schedy AC
footer:
  type: graph
  entity: sensor.daikin_inside_temperature
  hours_to_show: 24

Et voici le résultat...

Schedy

S'agissant de la configuration de Schedy il a bien sur fallut l'adapter. Vous dire que j'ai tout compris serait un mensonge et il y a certainement moyen de simplifier, et je suis preneur d'idées. Voici donc ce que ça donne (j'ai volontairement laissé quelques commentaires).

schedy_heating:
  module: hass_apps_loader
  class: SchedyApp

  actor_type: thermostat
  actor_templates:
    default:
      send_retry_interval: 15
      send_retries: 20
      supports_hvac_modes: true
      off_temp: 17
  
  watched_entities:
  - input_boolean.homeoffice
  - binary_sensor.workday_sensor
  - binary_sensor.workday_saturday_working
  - input_boolean.heating_enabled

  schedule_prepend:
  - x: "14 if is_off('input_boolean.heating_enabled') else Next()" # Le HorsGel... Possible aussi de créer un input_number...
  
  rooms:
    hall_ac:
      allow_manual_changes: true  # On autorise le changement manuel de consigne ou le passage en off
      rescheduling_delay: 90      # Délais après lequel Schedy repassera sur les valeurs prédéfinies
      actors:
        climate.thermostat_x:
          template: default
      watched_entities:
      # COMMON
      - input_boolean.homeoffice
      - binary_sensor.workday_sensor
      - binary_sensor.workday_saturday_working
      - input_number.off_temperature
      # ROOM SPECIFIC
      - input_number.hall_ac_heating_period_1_temperature
      - input_boolean.hall_ac_heating_period_1
      - binary_sensor.hall_ac_slot_1
      - input_number.hall_ac_heating_period_2_temperature
      - input_boolean.hall_ac_heating_period_2
      - binary_sensor.hall_ac_slot_2
      - input_number.hall_ac_heating_period_3_temperature
      - input_boolean.hall_ac_heating_period_3
      - binary_sensor.hall_ac_slot_3
      - input_number.hall_ac_heating_period_4_temperature
      - input_boolean.hall_ac_heating_period_4
      - binary_sensor.hall_ac_slot_4
      schedule:
      - rules:
        # WORKDAY
        - rules:
          - x: "Next() if is_on('binary_sensor.workday_sensor') else Break()"
          - x: >
              state("input_number.hall_ac_heating_period_1_temperature")
              if (is_on("input_boolean.hall_ac_heating_period_1") and (is_on("binary_sensor.hall_ac_slot_1")))
              else Next()
          - x: >
              state("input_number.hall_ac_heating_period_2_temperature")
              if (is_on("input_boolean.hall_ac_heating_period_2") and (is_on("binary_sensor.hall_ac_slot_2")))
              else Next()
          - x: >
              state("input_number.hall_ac_heating_period_3_temperature")
              if (is_on("input_boolean.hall_ac_heating_period_3") and (is_on("binary_sensor.hall_ac_slot_3")))
              else Next()
          - x: "Break(2)"
        # WEEK-END
        - rules:
          - x: "Next() if is_off('binary_sensor.workday_sensor') else Break()"        
          - x: >
              state("input_number.hall_ac_heating_period_4_temperature")
              if (is_on("input_boolean.hall_ac_heating_period_4") and (is_on("binary_sensor.hall_ac_slot_4")))
              else Next()
          - x: "Break(2)"

      # - v: 13 # On remplace par un input_number >>> Attention : v = valeur, x = expression
      - x: state("input_number.off_temperature") # Consigne entre les plages

A suivre...

Il existe dans Schedy un système d'events qui vont permettre de créer des dérogations ponctuelles. Par exemple un bouton ou une commande vocale quand je vais aller prendre une douche qui va lancer une dérogation pour augmenter sensiblement la température de la salle de bain pendant un temps défini ou jusqu'à ce qu'on lui envoie un contre ordre. On peu aussi imaginer chauffer une chambre d'amis lorsqu'on reçoit ou le boudoir lors d'une galante visite (encore que ces temps-ci la fonction ne servirait pas à grand chose...).

Et bien sur la gestion des ouvertures est gérée pour couper le chauffage... Plus tard...

Pour en finir...

Dans cet usage Schedy n'est plus vraiment le planificateur mais un moteur qui va surveiller (re planification) les thermostats et leur donner les bons ordres en fonction des évènements, états  et ordres venus de Home Assistant. Si Schedy peut également gérer des lampes (light:) et des actionneurs (switch:) c'est sans internet, sauf peut être pour superviser la machinerie d'une piscine...

 

Sauvegardes & Stockage Cloud

Il aura suffit d'un incendie ravageant un des data centers d'OVH pour que tous les IT de France dorment mal et que s'engagent de longues discutions de comptoir sur ce sujet. Il y a aussi les vautours opportunistes qui en profitent pour proposer leurs alternatives. Je ne vais pas ici vous expliquer si OVH est en faute, à mal fait ou bien fait son travail d'hébergeur, je n'en ai ni les moyens ni toutes les compétences. Je suis juste content de ne rien avoir chez eux et je compatis avec mes collègues qui sont dans la panade. Je vais donc juste vous parler de ce que je connais, sachant qu'il existera toujours un delta entre les meilleures pratiques et ce que l'ont peut s'offrir, techniquement et financièrement.

Il n'en reste pas moins qu'en matière de sauvegarde il y a des règles. La première veut qu'on dispose d'au moins 3 copies, les logiciels modernes le font très bien, ensuite que ces copies soient sur plusieurs support (NAS, Bandes), et surtout que l'on dispose d'au moins une copie externalisée. La fameuse sauvegarde de la sauvegarde.

Que veux t'on sauvegarder ?

PC isolé :

Premier conseil, on mets tous les documents dans un cloud drive (Google, Dropbox, Onedrive, KDrive) et on le configure pour qu'il sauvegarde le bureau et les documents. On peut aussi faire ça avec son cloud privé à base de Synology Drive ou autres logiciels de cloud privé comme NextCloud, enfin, quand on maitrise...

Mais on peut également vouloir sauvegarder ailleurs : Il existe une multitude logiciels qui vont savoir faire des sauvegardes incrémentales chez un fournisseur. On peut également vouloir faire une sauvegarde de type image, c-a-d un clone de sa machine. Dans ce cas le plus simple est d'utiliser Veeam Agent (gratuit) et de sauvegarder sur un disque externe, un second disque interne sur un desktop ou un NAS sur le réseau. Possible également de le faire vers OneDrive. Avantage, historisation et restauration intégrale en cas de besoin (ne pas oublier de créer la clé USB de boot....).

Site web

Un site web hébergé est généralement composé de fichiers et parfois d'une base de donnée (Wordpress par exemple). Les offres sont très disparates et on sauvegarde généralement les pages en FTP ou via des options proposées. Le FTP est universel et le minimum à faire lors de chaque mise à jour. S'il y a DB (WP par exemple) le process de sa sauvegarde est intégré dans une copie en FTP. Tout cela est un peu archaïque et il faut trouver un moyen pour l'automatiser ou s'imposer une véritable discipline...

VPS

Un VPS (Virtual Private Server) est rarement sauvegardé par l'hébergeur. Donc selon l'O/S c'est à vous de le prévoir et cela dépendra de ce que vous voulez sauvegarder (RClone, FTP).

Serveur dédié

Que votre dédié soir chez un hébergeur ou dans votre bureau, c'est pareil. C'est à vous de gérer les sauvegardes en fonction de sa criticité. Et si hyperviseur, voir plus loin.

Instance cloud managée

Managée veut dire que la notion de sauvegarde est intégrée. En général plusieurs options sont proposées et le tarif varie en conséquence. De base le fournisseur doit garantir la disponibilité. Il faut lire les contrats. On ne parle pas vraiment de sauvegardes mais de disponibilité, pour résumer si le data center brule, l'instance doit toujours être disponible car elle est censée être répliquée sur un autre site géographique. Enfin, c'est ce qui se passe chez Azure, AWS, etc... et l'expérience à démontrée que chez d'autres ça peut être plus hasardeux. Donc dans tous les cas, mettre en place une sauvegarde de secours pour les datas (base SQL par exemple) chez un fournisseur tiers n'est pas forcément un luxe !

NAS

Un NAS sert souvent des destination de sauvegardes, mais également pour partager des fichiers. Donc si la maison brule il n'y a plus rien. Il faut donc externaliser une sauvegarde à l'aide des logiciels fournis (HyperBackup sur Synology par exemple) qui fonctionne avec tous les fournisseurs de stockage. Et ne pas confondre synchronisation (CloudSync) ou on réplique des données même si elles sont vérolées, et sauvegarde (HyperBackup) ou on historise des sauvegardes. Synology propose C2 qui est également une bonne alternative intégrée.

VM et Hyperviseurs

Ici on creuse dans le dur et en général il y a un IT qui sait faire son boulot. S'il est possible de pratiquer des sauvegardes au niveau VM comme sur un serveur physique, la sauvegarde s'effectue en général au niveau de l'hyperviseur avec des outils tels que Veeam Backup&Recovery (il y a de la concurrence et même des produits gratuits). Idéalement on sauvegarde sur un stockage local (un gros NAS par exemple) et en parallèle on externalise vers un fournisseur de stockage externe. Bien sur la taille de l'infrastructure est un facteur décisionnel. Et pour des données critiques rien n'empêche de mettre en place une sauvegarde spécifique à l'intérieur des VM.

A ce stade on pense également PRA. En effet rien ne sert de sauvegarder si on ne dispose pas de quoi restaurer après une catastrophe... Mais c'est un autre sujet.

Fournisseurs de stockage

Un bon principe consiste comme souvent à ne pas mettre tous ses œufs dans le même panier.

Le choix de l'hébergeur est fait en fonction de la criticité de ce que l'on héberge et des moyens dont on dispose. Pour un résultat apparemment identique les tarifs peuvent s'étaler de 1 à 10, voire plus. Donc si vous êtes une entreprise riche et peu regardante sur sur le CloudAct et autres RGPD, visez Azure ou AWS, ce sont les meilleurs. Dans le cas contraire faites attention ou vous mettez vos datas et lisez bien les contrats. Une fois bien que vous aurez choisit votre fournisseur il faudra penser à une solution de stockage indépendante pour la fameuse seconde sauvegarde. Et attention à ne pas utiliser pour cette seconde sauvegarde une solution qui serait hébergée chez ce même fournisseur mais dans une offre concurrente. En gros savoir ou sera physiquement hébergée la sauvegarde de secours.

Pour le stockage et l'hébergement il faut également prendre n compte le niveau de certification du data center (Tiers 3/4, etc...).

Une sauvegarde externe c'est aussi la disponibilité d'un protocole qui sera utilisé par les logiciels de sauvegarde. Il vaut mieux éviter les protocoles exotiques ne fonctionnant qu'avec tel ou tel logiciel.

  • FTP : un peu old school mais adapté et utilisé sur les petits sites. Peu performant et peu adapté aux gros volumes.
  • SMB et NFS : pourquoi pas, mais je déconseille sur internet. Et SMB 1 on oublie, même en local, c'est une passoire que les marchands de copieurs forcent à réactiver.
  • S3 : Créé par Amazon AWS c'est un standard supporté par de nombreux logiciels, Veeam par exemple.
  • Swift : Alternative plus ouverte que l'on peut comparer à S3.

Je ne vais pas ici faire le tour de tous les fournisseurs de stockage, mais uniquement de ceux que j'ai testés.

  • Azure Backup : couteux et compliqué. Pas adapté aux TPE, à considérer dans un environnement d'entreprise structurée. A noter que s'il est possible de sauvegarder facilement un NAS Synology vers de l'Azure Backup, vous ne connaitrez pas à l'avance le montant de la facture...
  • AWS S3 : idem
  • OneDrive : utilisable avec Veeam Agent (tuto ici) pour sauvegarder des images de PC. On peut également s'en servir avec RClone si on a un barbu dans ses potes.
  • Google Drive : Synology et tout ce qui est à base de RClone : Ca peut être intéressant coté tarification dans un cadre GSuite. Débits très rapides.
  • Wasabi : véritable alternative à AWS S3, ce fournisseur ne fait que du stockage et il le fait bien, et à des tarifs très concurrentiels (5 € / mois / TB sans frais de transfert). Localisation des DC aux Etats Unis, Japon et Europe à Amsterdam. Protocole S3 exclusivement, avec un accès admin de secours en FTP. Je m'en sert depuis quelques années.
  • Scaleway : je vais éviter car j'héberge mes serveurs chez eux. Leur offre Object Storage est moins couteuse que les GAFAM mais plus que Wasabi par exemple. Par contre leur offre C14 (Cold) est certainement la plus intéressante du marché pour de l'archivage. Mais c'est un autre sujet : sauvegarde = usage à la demande, archivage = conservation légale et usage différé.
  • OVH : Swift et depuis peu S3. Tarifs abordables. Mais bon, OVH ces temps ci ça fait un peu peur...
  • Swiss Backup : Infomaniak est un des plus gros hébergeurs suisses, non content de proposer une véritable alternative GAFAM, ils offrent une solution de sauvegarde très complète (5 € / TB avec une tarification dégressive). Support S3, Swift et FTP, mais également ne offre Acronis pour les PC et Macs ainsi que le support des mobiles avec la possibilité de partager un même compte entre divers usages en affectant des quotas... Et puis la Suisse c'est rassurant !

Sauvegarder est une chose, mais il est important de pouvoir accéder à ses sauvegardes en tous temps et et parfois autrement qu'avec le logiciel qui a servi à les faire. Ces logiciels utilisent en général un format propriétaire, de plus quand on sauvegarde chez un tiers on prend soin de chiffrer les sauvegardes un minimum.

En cas d'un crash, et le temps que l'infrastructure soit remontée / rétablie, on peu avoir besoin de façon urgente de certains fichiers. Dans tous les cas attention à bien disposer des mots de passe et autres certificats ayant servi au chiffrage.

  • Pour les sauvegardes en clair (FTP, RClone, etc...) c'est simple et il suffit d'aller chercher le fichier.
  • Veeam Backup&Recovery et ses clones : il faudra disposer du logiciel dans une version identique. Environnement d'entreprise, donc le même logiciel installé dans un PRA en attente. Au pire monter le logiciel rapidement sur une machine de secours.
  • Synology HyperBackup : Facile en C2 en web. Si on ne dispose pas d'un NAS de rechange, HyperBackup Explorer sur un PC il faudra pouvoir accéder à la sauvegarde. Deux solutions, un montage CloudDrive sur du S3 ou Swift, fonctionnel avec Wasabi et Scaleway, mais pas avec Swiss Backup pour l'instant (ticket ouvert). Alternative : télécharger la sauvegarde avec CyberDuck (Swift) ou S3 Explorer de CloudBerry (S3) afin de pouvoir l'explorer en local.

Voilà pour ce petit tour d'horizon. N'hésitez pas à partager vos expériences, je mettrais à jour cet article.

 

Home Assistant & Coupures secteur

Ceux qui habitent à la campagne le savent, le réseau ERDF/Enedis est dans un état suffisamment lamentable pour que la moindre intempérie provoque des coupures électriques. Par ailleurs il peut arriver que pour une raison ou une autre un différentiel saute. Et ces coupures on un impact sur toute installation domotique, si sur certains appareils on peut gérer le comportement lors de la reprise électrique (Shelly par exemple) ce n'est pas le cas de beaucoup d'ampoules ou de prises commandées (Tuya pour le mauvais élève), il faudra donc gérer ce que l'on fait lors de la reprise en domotique et / ou être avertit en cas d'absence afin de mandater quelqu'un pour réarmer le différentiel du congélateur...

Et pour ça il faut que Home Assistant soit très rapidement informé sur les points de coupure possibles afin par exemple de sauvegarder et restaurer un état comme j'en avait parlé ici. Chez moi je dénombre 4 point de coupures. Le disjoncteur général + 4 disjoncteurs différentiels (1 par étage de mon tableau électrique).

Il me fallait donc un système qui me permette de tester la non présence électrique sur ces 5 points de coupure. Pour y parvenir j'ai commandé une carte qui comporte 8 optocoupleurs (lien non sponsorisé) (ça existe en 1, 3 et 8 canaux) que je vais pouvoir exploiter en GPIO. Le principe est simple, si présence électrique en entrée le port passe à 1.

Au départ je comptais exploiter ça sur le Raspberry qui me sert en remote pour le Zigbee et BLE avec l'intégration GPIO idoine, mais ce n'était pas assez réactif, j'ai donc opté pour un ESP que j'avais sous la main, et c'est ainsi que j'ai mis le doigt dans Tasmota, chose dont je connaissait l'existence grâce à @mathieu qui en fait une promotion quasi sectaire, mais que je n'avais jamais exploré...

ESP8266

Ce module présente l'avantage de s'alimenter en Micro USB, avantage car on a tous dans nos tiroirs des chargeurs et des câbles dans ce format. C'est également avec ce câble que l'on va le brancher sur un PC afin de le Tasmotiser (pas sur que l'Académie ajoute ce verbe cette année). Pour le reste, je ne suis pas spécialiste pour vous parler de ses avantages et inconvénients, ah si, il était présent au fond de mon tiroir.

On lance tasmotizer.exe (ça existe pour d'autres confessions que Windows) et le reste se fait tout seul, ça va même télécharger le firmware idoine. Presque trop facile. Une fois que c'est fait alimente l'ESP et on se connecte dessus en WI-FI afin de renseigner notre SSID dédié IoT. Après un redémarrage on peut ouvrir avec un navigateur et débuter la configuration du module. Je vous laisse trouver comment repérer l'IP et lui faire une réservation DHCP.

Tasmota

Dans la configuration on commence par choisir le type de module (Generic 18) et on configure 5 GPIO en mode SWITCH. Attention tous les ports ne sont pas utilisables, il faut tâtonner un peu quand on ne connait pas la signification des options possibles.

Ensuite on va passer à la configuration MQTT (Host, port, user et password). Et c'est tout. Enfin, il faut tout de même connecter notre carte optocoupleur avec l'ESP avec des câbles Dupont (+3.3, GND et GPIO 1 2 3 4 5).

Intégration

Sous Home Assistant il a plusieurs façons d'exploiter Tasmota (voir ici), en mode pur MQTT pour intégriste barbu (au sens Geek du terme hein !) en déclarant les devices en YAML, en mode MQTT discovery et depuis peu avec l'intégration Tasmota officielle qui va s'appuyer sur MQTT pour créer les devices et les entities. Comme je ne suis pas barbu et que je pense qu'il faut s'ouvrir au plus grand nombre, vous imaginez bien que j'ai choisit cette option.

On ajoute l'intégration avec le bouton + dans les intégrations et on laisse les options de base.

Ensuite on va dans la console du module Tasmota afin de saisir quelques options (que l'on pourrait du reste envoyer en MQTT ou en HTTP...).

SetOption19 0 # Pour lui dire de ne pas faire du discovery en MQTT mais via l'intégration Tasmota

SetOption114 # Pour activer le mode switch

SwitchMode1 2 # Mode folow inversé (0 = on, 1 = off) sur switch 1
SwitchMode2 2 # Mode folow inversé (0 = on, 1 = off) sur switch 2
SwitchMode3 2 # Mode folow inversé (0 = on, 1 = off) sur switch 3
SwitchMode4 2 # Mode folow inversé (0 = on, 1 = off) sur switch 4

Normalement à ce stade il ne nous reste plus qu'à tester notre montage en alimentant chacun des ports en 220 V. Attention, on ne le répètera jamais assez, le 220 V c'est très dangereux, donc on prend ses précautions (et si on ne le sent pas on retourne jouer à la marelle avec ses copines !). Moi je décline bien sur toute responsabilité.

Vous devriez rapidement obtenir quelque chose qui ressemble à ça :

Usage

Il ne restera ensuite plus qu'à exploiter ces binary_sensor: pour des actions ou des notifications, et pour ça je vous conseille l'intégration alert...

alert:
  tableau_1:
    name: Diff 1
    entity_id: binary_sensor.switch2
    state: 'off'   # Optional, 'on' is the default value
    repeat:
      - 10
      - 30
      - 60
      - 300
    can_acknowledge: true  # Optional, default is true
    skip_first: true  # Optional, false is the default
    message: "{{ states.sensor.date_time.state}} > ALERTE | Différentiel 1 : OFF" 
    done_message: "{{ states.sensor.date_time.state}} > ALERTE | Différentiel 1 : OK"
    notifiers:
      - slack_hass_canaletto
      - Free_Mobile

Voilà, presque trop simple. Et merci à ceux qui m'ont aidé à cogiter tout ça !