Domoticz
Transfert facile vers Docker

ou nouvelle installation sur Docker



 

 

dzdoc1

un lien pour comprendre "Docker":
https://guillaumebriday.fr/comprendre-et-mettre-en-place-docker

J'utilise Proxmox pour installer mes serveurs sur des machines virtuelles mais l'installation de Docker sur Debian 11 est la même que pour une machine réelle. J'ai créer une nouvelle VM pour Domoticz-Docker , il suffira ensuite de transférer facilement la VM Domoticz vers cette nouvelle VM.

Créer une nouvelle VM ou installer un nouveau système impose parfois de réinstaller des logiciels ou des modules necessaires pour les scripts perso utilisés par Domoticz
dans ce cas il faut reconstruire l'image, voir cette page .
;

j'ai essayé d'installer des modules python sur python 3.9 du système mais je n'ai pas réussi à appelé les scripts utilisant ces modules depuis lua de Domoticz ;

Les différentes étapes:
- Pré-requis : une installation minimum de Debian bullseye
- installation de Docker Engine
- installation de Docker-Compose
- facultatif : installation de PORTAINER
- téléchargement de l'image de Domoticz et affichage
- Migration: transfert entre machines Domoticz

 

 

Installation de Docker Engine

Installer SUDO

dzdoc2

pour les droits grand sudo :

 

dzdoc3

Ou :

 

dzdoc4

 

Configurer le référentiel

 

dzdoc5

dzdoc6

Télécharger la clé GPG officielle de Docker :

dzdoc7

- Le canal Stable vous fournit les dernières versions pour une disponibilité générale.
- Le canal Test fournit des versions préliminaires prêtes à être testées avant la disponibilité générale.
- La chaîne Nightly vous donne les dernières versions du travail en cours pour la prochaine version majeure.

Utiliser cette commande pour configurer le référentiel stable :

dzdoc8

 

 

Installer la dernière version de Docker Engine

 

dzdoc9

dzdoc10

Vérifiez que Docker Engine est installé correctement :

dzdoc11

Mettre à niveau le moteur Docker et installer des dépendances

 

dzdoc12

 

dzdoc13

 

dzdoc14

 

Pour désinstaller Docker Engine

Pour supprimer toutes les images, conteneurs et volumes :

sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

 

 

 

Installation de docker compose

- Avec curl ou avec pip3

Vérifier la dernière version disponible : https://docs.docker.com/compose/install/
remplacer la version dans la commande curl.

 

avec curl

 

dzdoc18

dzdoc19

 

 

avec pip3

 

 

 

vérifier que l’installation de docker compose a bien fonctionné ,
afficher le numéro de version :

dzdoc20

 

 

Installation de PORTAINER

Non Indispensable
Portainer est une interface Web open source qui permet de créer, modifier, surveiller des conteneurs Docker.

Installer l'interface graphique

 

dzdoc21

Avec le navigateur : http://IP du SERVEUR avec DOCKER:9000

dzdoc22

Créer l’utilisateur

dzdoc23

dzdoc24

dzdoc25

dzdoc26

 

 

Récupérer l’image de Domoticz et la lancer

Récupérer l'image sur Docker Hub
https://hub.docker.com/r/domoticz/domoticz
https://www.domoticz.com/wiki/Docker

dzdoc27

afficher la liste des images Docker sur le système

dzdoc28

informations détaillées sur l’image domoticz

dzdoc29

Lancer Domoticz :

En mode interactif ( pour faire un essai);
pour continuer d’utiliser le shell mieux vaut lancer Domoticz avec docker-compose (voir ci-après)
- pour le port 8082 : -p 8082 :8080

 

Lancement avec docker-compose:

 

Configuration de docker-compose

le fichier : /opt/domoticz/docker-compose.yml

 

version: '3.3'

services:
  domoticz:
    image: domoticz/domoticz
    container_name: domoticz
    restart: unless-stopped
    # Pass devices to container
    # devices:
    # clé zwave
    #   - "/dev/serial/by-id/usb-0658_0200-if00:/dev/ttyACM0"
    ports:
      - "8080:8080"
    volumes:
      - ./config:/opt/domoticz/userdata
    environment:
      - TZ=Europe/Paris
      #- LOG_PATH=/opt/domoticz/userdata/domoticz.log

dzdoc30

 

 

Démarrer Domoticz:

L'option -d lance en daemon, le unless-stopped (Restart dans la configuration) qui rend le programme permanent même au reboot machine.

dzdoc31

 

Stopper Domoticz

Par défaut, sont supprimées :
https://docs.docker.com/compose/reference/down/
- Conteneurs pour les services définis dans le fichier Compose
- Réseaux définis dans la section du fichier Composenetworks
- Le réseau par défaut, s’il est utilisé

dzdoc32

 

 

dzdoc33

Accès au fichier log

dzdoc34

 

Quelques commandes Docker

Supprimer une image
sudo docker rmi ID_IMAGE
si l’image est utilisée : -f=force
sudo docker rmi -f ID_IMAGEdzdoc80
dzdoc81

Stopper container
sudo docker stop <ID>

Liste des conteneur:
sudo docker -ps -a
dzdoc98
stopper ou supprimer tous les conteneurs:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

dzdoc99

href="https://geekflare.com/fr/docker-commands/" target="_blank">https://geekflare.com/fr/docker-commands/

 

 

Au premier lancement de domoticz , les répertoires et fichiers persistants:

dzdoc87

Pour pouvoir transférer la BD avec Filezilla, modifier les droits avant de relancer Domoticz;
il est aussi possible le faire une restauration depuis Domoticz : ->Paramètres-->Sauvegarde/Restauration.

dzdoc88

 

 

Migration de Domoticz

C’est l’occasion de faire le ménage dans les scripts par exemple :

dzdoc35

Dans mon cas, seul le réseau ZWave est connecté directement par la clé USB sur la machine Domoticz ;
le réseau Zigbee (Zigbee2mqtt) est connecté sur la machine MQTT et c’est par ce protocole que Domoticz reçoit les informations.
J'envisage d'utiliser zwaveJS2Mqtt dans docker, Domoticz recevrait dans ce cas toutes les données des dispositifs par MQTT .

Je n’utilise pas Domoticz pour afficher des données( elles sont affichées sur une page web perso) , uniquement pour récupérer en json toutes les infos des différents appareils et des infos de traitements comme la gestion des poubelles, de la fosse septique,de l’alarme .....

Les différentes phases de la migration:
- la base de données et les plugins, la majorité des données sera transférée
- Les évènements: les différents scripts

 

La Base de données

Dès le transfert de la BD , seul le réseau ZWave n’est pas transférer car la clé n’est pour l’instant pas ajouter sur la machine docker
Si vous avez un réseau Zigbee2mqtt , il en sera de même.

Affichage avec Filezilla:

dzdoc36

La BD se trouve dans le répertoire "/opt/domoticz/config", pour la transférer :
- soit faire une restauration à partir du logiciel ->paramètres->Sauvegarde/Restauration
- soit copier la sauvegarde de la BD avec Filezilla (avant de lancer Domoticz)
La page matériel de Domoticz:

dzdoc37

Le contenu du dossier "plugins" est à transférer dans le dossier /opt/domoticz/config/ crée lors de l'installation.
les dossiers exemples et AwoxSMP ne sont pas à transférer , ils existent déjà dans :

dzdoc91

dzdoc74

 

 

Les Evènements

Les modifications pour les différents tyopes de scripts , Lua, DzVents, Python, ....

dzdoc38

 

les script LUA

 

dzdoc39

Ils sont enregistés dans la base de données , ils sont donc fonctionnels après transfert de la BD mais ,
Si les variables sont stockées dans un fichier comme par exemple:

dzdoc40

..... il faut:
- soit indiquer le bon chemin dans docker-compose :sudo nano /opt/domoticz/docker-compose.yml

dzdoc41

dzdoc42

dzdoc43

- soit indiquer le chemin réel dans le script Lua :

dzdoc44

Autre solution , si les fichiers lua doivent être appelé depuis un site distant , voir le paragraphe concernant le serveur web www

 

 

les scrips dzvents

les scripts de la version normale sont stockés dans : ~domoticz/scripts/dzVents/generated_scripts

dzdoc45

dzdoc46

Il doivent être ajoutés dans "config/scripts/generated_scripts" dans la version docker ; modifier les droits si necessaire.
ces scripts peuvent s'ajouter automotiquement si ce dossier existe au reboot ou lors d"une mise à jour d'un script évènement

dzdoc47

 

 

Les scripts utilisant json en lua :

Il suffit de modifier le lien de JSON.lua dans les scripts

dzdoc48

Le lien devient pour domoticz-docker:

dzdoc49

On peut utiliser le lien relatif :

dzdoc89

Si dans la version classique le lien relatif était utilisé , il n'y a pas de modification à faire
à la condition de ne pas créer un volume scripts:/opt/domoticz/scripts"
le répertoire "scripts" crée précédemment pour dzVents devra contenir les sous répertoires pour les scripts perso
si un volume était crée il effacerait le volume "scripts" existant;il faudrait dans ce cas copier JSON.lua dans un répertoire /opt/config/scripts/lua
- sur cet copie d'écran le chemin de JSON.lua

90

Remarque:
docker exec -it NOM CONTENEUR bash est la commande utilisé pour accéder au shell docker

 

 

les scripts python perso :

Créer un dossier
- soit :/opt/domoticz/scripts/python (dans ce cas on écrase le fichier "scripts" de Domoticz (si on n'utilise aucun de ces scripts ça n'a pas d'importance, c'est beaucoup d'exemples)
- soit :/opt/domoticz/config/scripts/python (il n'y a pas de volume à créer)
des explications sur le choix du Volume dans cette page

dzdoc50

Ajouter dans docker-compose.yml pour créer un Volume ./script: (décommenter la ligne)

dzdoc51

exemples:

dzdoc92

dzdoc52

Ne pas oublier les scripts dans les dispositifs:

dzdoc15

mon script "mqtt.py" utilise le module python paho-mqtt

dzdoc16

il faut ajouter l'installation de ce module dans Dockerfile

dzdoc17

modifier les droits des fichiers si necessaire

Remarque
Comme indiqué , au début de cet tuto, si des modules python sont nécessaires,par exemple pour mes besoins:
- fabric pour l'envoi des données sur un site distant
- periphery pour la liaison série avec un Raspberry.

Il faudra reconstruire l'image , voir cette page .

 

Après reconstruction :

des scriprts python peuvent être appelés depuis un script bash,
dans ce cas il faut vérifier les liens , exemple pour ce fichier .sh :

dzdoc78

Des problèmes peuvent survenir , comme avec fabric2
,j'ai du , sous shell docker désinstaller et réinstaller Fabric
NE PAS UTILISER "install FABRIC2"
cette situation peut peut-être se produire avec d'autres modules

dzdoc57

dzdoc79

pour éviter de reinstaller Fabric dans le conteneur, ajouter l'install de Fabric dans Dockerfile

dzdoc97

 

 

 

les scripts bash :

Comme pour python ,créer un dossier /opt/domoticz/scripts/bash ou /opt/domoticz/config/scripts/bash
Dans la version linux , je plaçais les scripts bash dans ~domoticz/scripts, pour faire plus propre j'ai crée un dossier spécifique
La procédure est la même que pour python :
on crée un répertoire bash dand "scripts"

docker-compose.yml:

dzdoc53

dzdoc55

l'interpréteur bash, dans le conteneur, se trouve dans /bin/bash
comme pour les autres script , on peut utiliser le lien relatif:

dzdoc93

On peut aussi utliser un autre interpréteur , celui du système en créant un Volume ./bash:/usr/bin/bash

dzdoc94

Si l'image doit être reconstruite, on peut créer un lien symbolique :
ln -s /source /destination

dzdoc95

 

 

les script node.js :

Pour les scrips externes la procédure est toujours la même mais pour node.js , à la condition qu'il soit installé.
Ce n'est pas le cas dans l'image docker officielle ....il faut construire l'image en intégrant Node
à partir de cette nouvelle image, comme pour python et bash :
- créer un dossier /op/domoticz/config/scripts/js
- la config docker-compose ne change pas car le volume scripts prendra en charge le repertoire js

dzdoc56

On vérifie que les modules sont installés:
sudo exec -it <ID CONTERNEUR> bash

dzdoc83

Pour afficher les notifications sur le téléviseur , j'ai du modifier le fichier index.js du module lgtv(ce fichier n'existe plus sur l'App "Danovadia/lgtv-http-server" , qui n'ést plus maintenue ,elle est disponible sur mon référentiel: https://github.com/mgrafr/lgtv_notifications),
il faut donc l'installer dans l'image :
pour cela , comme on est tojours sous docker shell:
- copier index.js dans /opt/domoticz/config avec Filezilla; plus d'infos sur la page consacrée à la notification TV
on peut aussi ajouter ce fichier lors de la construction de l'image docker avec COPY , c'est la meilleure solution.(il faut placer ce script dans le répertoire de Dockerfile)
dzdoc84
Dans le Dockerfile
dzdoc96
- copier depuis le shell index.js vers LGTV
cp userdata/index.js node_modules/lgtv/
dzdoc85

Pour faire un essai en shell:
- copier le fichier new1.js dans /opt/domoticz/config
- lancer la commande: node new1.js

dzdoc82

exit , on quite docker shell
un nouvel essai dans Domoticz et le script LUA: node new1.js ....

dzdoc86

Le fichier définitif notification_tv.js remplacera new1.js

 

 

les appels Curl :

Pas de modification à apporter, fonctionne correctement

dzdoc58

 

 

Les fichiers externes au conteneur communiquant avec Domoticz

c'est le cas de ma liaison série entre le Raspberry et le mini PC
- Python est installé dans le conteneur mais il faut installé également une version sur le serveur
- j'ai mis ces scripts (en python) dans le dossier config/scripts/python de Domoticz

dzdoc100

- modifier l'adresse 127.0.0.1 (appel de l'API Domoticz) par localhost ( j’ignore pourquoi , peut-être parce que l'IP de Domoticz-docker est 172.20.0.2 et non 127.0.0.1 et localhost utilise la bonne IP ? )

dzdoc101

- modifier le lien pour le démarrage auto de systemd:

dzdoc102

- modifier dans les scripts les chemins si ils ont changé

dzdoc103

 

 

L'accès distant

Ne pas oublier de modifier l'IP dans la configuration de NGINX ou APACHE

dzdoc104

 

 

Eviter les erreurs:

Des erreurs dues aux scripts externes peuvent survenir;
si des liens existent dans ces fichiers, il faut également les modifier
exemples:

dzdoc76

Sous Debian 11 c'est Python 3.9 , sous Domoticz-docker c'est python 3.7 qui est installé:

dzdoc77

Vérifier le Sheband:

dzdoc76

 

 

 

Le serveur WEB :

www

dzdoc59

Le lien pour docker-compose :

dzdoc60

Essai avec une page nommée essai.html,
Le lien est donc : ./www/essai.html:/opt/domoticz/www/essai.html

dzdoc61

dzdoc62

Le dossier modules_lua (contenant des fichiers pouvant être appelés en http(s) distant)

dzdoc63

Dans domoticz docker :

dzdoc64

La config docker-compose dans ce cas :

dzdoc65

Affichage d’un fichier :

dzdoc66

Dans le script lua :

dzdoc67

 

 

Les fichiers log :

J’enregistre dans la version normale tous les fichiers log dans mon répertoire perso /home/michel

dzdoc68

Pour ne rien changer ajouter dans la config docker-compose :
./log:/home/michel
et creer le répertoire log

dzdoc69

Pour choisir un autre répertoire, exemple

dzdoc70

 

 

Le Reseau ZWave :

Dans le container docker Domoticz c'est la version OZW (OpenZWave) qui est installé.

Pour faire un essai , au lieu d'utiliser la passerelle du Domoticz-linux, j'ai utilisé un clone de la clé USB , ce qui m'a permis de constater le bon fonctionnement des copies de clé ZWave.
Tous les appareils existent dans la BD de Domoticz , il suffit de connecter la passerelle, la clé USB.
Pour trouver le port de la passerelle :

Config docker-compose :

dzdoc71

On relance Domoticz

dzdoc72

dzdoc75

dzdoc73



J'ai 2 installations de Domoticz qui tournent, avec les mêmes dispositifs ,et cela sans problèmes majeurs (la 2eme clé est un clone de la 1ère ce qui peut l'expliquer);
ce qui ne fonctionnait pas au début , ceux sont les scripts qui utilisent des modules Python ou Node, mais c'était normal car ces modules ne sont pas installés dans le container domoticz.
Sur Domoticz-docker, seuls les dispositifs sur secteur sont mis à jour , les dispositifs sur piles doivent être réveillés

J'étudie un transfert vers Zwavejs2mqtt et non OZW de Domoticz, Domoticz recevant les données par mon serveur MQTT .
Si j'avais utilisé ZWaveJS2Mqtt , comme je l'ai fait avec Zigbee2mqtt ,le transfert aurait été plus simple et donc les mises à jour à venir également plus faciles

 

 

 

CONCLUSION:
A part quelques autorisations que j'ai du modifier , pour les répertoires et fichiers persistants (copiés avec Filezilla), la migration a été facile; le fonctionnement est rapide, sans problème , similaire à l'installation d'origine
Pour les scripts qui ne fonctionnent pas à cause des modules, je j'ai construis une nouvelle image à partir de l'image officielle en intégrant ces modules; c'est l'objet du tuto sur cette page.
Le seul problème , toujours le même, quelque soit l'installation , les nœuds endormis qu'il faut réveiller ; en cas de coupure sur Domoticz classique, ça m'est souvent arrivé de devoir le faire , c'est pourquoi j'ai utilisé un clone de la clé USB (j'ai éviter l'arrêt de la VM).

 

 

 

 

 

crée le 16/02/2022
maj 26/02/2022 ajout remarque concernant les scripts python et compléments pour node
maj 05/03/2022 ajout explications
maj 31/03/2022 scripts externes au conteneur (localhost) et accès distant

page:84