samedi 23 octobre 2021

Domotique : Migration de Jeedom V3 à V4

Voici donc comme je me suis pris pour migrer de V3 à V4....

Vu qu'il y a des conseils et problèmes connus pour cette migration, je vais donc vous lister dans mon cas ce que j'ai vérifié et préparé avant de migrer. 

A) préparation de la mise à jour :

1) J'ai vérifier ma version de raspbian installé (il est conseillé de rester en Raspbian 9 (stretch) pour l'instant parce que Buster peut poser problème):

pi@JeedomMaster:/var/www/html/plugins $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
pi@JeedomMaster:/var/www/html/plugins $

2) J'ai du vérifier aussi les plugins qui ne seront plus bon après la migration... Apparement, c'est ceux qui continue d'utiliser l' object:: dans le code php. Maintenant la V4, demande d'utiliser JeeObject:: à la place, on verra ensuite si on peut modifier sur les anciens plugins si le dev ne maintient plus ce code.

Pour l'instant, on va devoir faire l'inventaire avec la commande suivante :

cd /var/www/html/plugins; grep -R "object::" *

pi@JeedomMaster:~ $ cd /var/www/html/plugins; grep -R "object::" *
alexaapi/desktop/php/alexaapi_ex.php:foreach (object::all() as $object)
clientSIP/desktop/php/panel.php:        $object = object::byId($_SESSION['user']->getOptions('defaultDashboardObject'));
clientSIP/desktop/php/panel.php:        $object = object::byId(init('object_id'));
clientSIP/desktop/php/panel.php:        $object = object::rootObject();
clientSIP/desktop/php/panel.php:$child_object = object::buildTree($object);
clientSIP/desktop/php/panel.php:                                $allObject = object::buildTree(null, true);
datatransfert/desktop/php/datatransfert.php:foreach (object::all() as $object) {
enedis_linky/desktop/php/enedis_linky.php:foreach (object::all() as $object) {
forecastio/desktop/php/forecastio.php:                  foreach (object::all() as $object) {
FreeboxCalls/desktop/php/FreeboxCalls.php:                            foreach (object::all() as $object) {
FreeboxOS/desktop/php/FreeboxOS.php:                            foreach (object::all() as $object) {
gmailinfo/desktop/php/gmailinfo.php:                            foreach (object::all() as $object) {
gmailinfo/desktop/php/pushbullet.php:                            foreach (object::all() as $object) {
JPI/desktop/php/JPI.php:                                                foreach (object::all() as $object) {
ledticker/desktop/php/ledticker.php:foreach (object::all() as $object) {
lightsManagement/desktop/php/lightsManagement.php:                            foreach (object::all() as $object) {
MiFlora/desktop/php/MiFlora.php:                                    foreach (object::all() as $object) {
Monitoring/desktop/php/Monitoring.php~:                                                 foreach (object::all() as $object) {
motion/core/ajax/motion.ajax.php:                               $object = object::byId($_SESSION['user']->getOptions('defaultDashboardObject'));
motion/core/ajax/motion.ajax.php:                               $object = object::byId(init('object_id'));
motion/core/ajax/motion.ajax.php:                               $object = object::rootObject();
motion/core/ajax/motion.ajax.php:                               foreach (object::all() as $object) {
motion/core/ajax/motion.ajax.php:                               foreach (object::buildTree($object) as $child) {
orvibo/desktop/php/orvibo.php:                  foreach (object::all() as $object) {
ping/desktop/php/ping.php:                            foreach (object::all() as $object) {
previsionpluie/desktop/php/previsionpluie.php:                            foreach (object::all() as $object) {
pushbullet/desktop/php/pushbullet.php:                            foreach (object::all() as $object) {
rcswitch/desktop/php/rcswitch.php:                                                           foreach (object::all() as $object) {
rcswitch/desktop/php/rcswitch.php.obsolete:foreach (object::all() as $object) {
RTSP/desktop/php/RTSP.php:foreach (object::all() as $object) {
script/data/Export_XML.php:if($jsonrpc->sendRequest('object::full', array())){
snmp_client/desktop/php/snmp_client.php:foreach (object::all() as $object) {
Store/desktop/php/Store.php:foreach (object::all() as $object) {
trafictransilien/desktop/php/trafictransilien.php:foreach (object::all() as $object) {
wifilight/desktop/php/wifilight.php:                            foreach (object::all() as $object) {
wifilight/desktop/php/wifilight.php~:                            foreach (object::all() as $object) {
wifilight/desktop/php/wifilight_V0.06.php:                            foreach (object::all() as $object) {
wifilight/desktop/php/wifilight - Copie.php:                            foreach (object::all() as $object) {
wifilight/desktop/php/wifilight.old.php:                            foreach (object::all() as $object) {
pi@JeedomMaster:/var/www/html/plugins $

Voici donc le résultat pour moi, j'ai des vieux plugins en fait et qui ne sont pas forcement maintenu :-(

Dans un premier temps, j'ai décider d'identifier dans cette liste ceux que je n'utilise même pas, que j'ai gardé mais qui sont inactif, j'ai :

- clientSIP

- freeboxCalls (plus de Freebox ;-)

- freeboxOS (plus de Freebox ;-)

- gmailInfo

- JPI

- Ledticker

- MiFlora

- Motion

- Previsionpluie (en fait, je ne sais pas quel est vraiment le plugin derrière ?!)

- Pushbullet (j'ai arrêté à cause du support d'iOS abandonné par le passé, maintenant j'envoi des SMS !)

- rcswitch

- RTSP (finalement, je ne l'utilise plus pour les cameras !)

- store

Et maintenant, il me reste donc ceux que j'utilise et qui pourront me poser problèmes :

- alexaapi (et celui là je l'utilise vraiment, surtout pour faire parler Alexa !)

- datatransfert (pour mes backups de jeedom dans dropbox)

- lightsManagement (pour ma simulation de présence !)

- Monitoring (pour suivre les Pis !)

- Orvibo (pour les prise et mon AllOne qui contrôle l'infra-rouge, pilotage télé/switch hdmi !)

- Ping (pour suivre la présence de device sur le réseau !)

- script (sera géré par l'équipe de Jeedom je pense à moins que cela soit un de mets scripts, à voir)

- snmp_client (pour le test de présence de mon routeur DD-WRT)

- trafic transilien (pour le train de ma femme ;-)

- wifilight (je vais devoir peut être migrer en v2 un jour ?!)

3) les widgets "custom" ne seront plus compatible, j'ai regardé, j'ai pas trouvé de widget fait par mes soins, j'ai fait des essais par le passé, mais rien de "folichon", donc je n'ai jamais vraiment utilisé des widgets spécifiques... on verra lors de la migration, si j'ai loupé un truc... mais c'est à savoir.

4) lancer un backup de la conf V3 : 


5) Télécharger le backup sur un autre appareil pour plus de sécurité :

    

6) Pour plus de sécurité, vous pouvez aussi cloner votre SD ou votre SSD : 

Pour cela j'ai suivi ce tuto: https://www.thedigitalpictureframe.com/guide-back-up-sd-card-raspberry-pi-while-running/

Et donc j'ai lancé cette commande à partir de mon linux.... attention cela peut être long, mon mSSD fait 111,8 Go et mon réseau n'est pas térrible je crois (j'ai cloné à 4/5 MBytes/s), donc mon cas c'est une Raspbian stretch (Debian 9) avec mon disque en /dev/sda :

ssh pi@192.168.0.X "sudo dd if=/dev/sda bs=1M status=progress | gzip -" | dd of=~/Desktop/$(date +%Y%m%d\_%H%M%S)\_pi_clone.gz

Et il faudra taper son mode de passe d'accès au pi pour pouvoir lancer le backup.

Et pour finir, on aura un fichier .gz ainsi :

Cela a mis plusieurs heures en fait :-( donc à vous de voir.

Si vous avez un doute vous pouvez utiliser cette commande pour vérifier si vous êtes sur le bon disque :

sudo cfdisk /dev/sda


6 bis) On peut aussi cloner avec un outil externe en installant le disque mSSD dans un "adapteur mSata <> Sata" pour le connecter à un PC comme ci-après : 


J'ai utilisé cet outil qui est gratuit et fonctionne sur windows  10 dans mon cas : https://www.ubackup.com/download.html


Mais il y en a surement d'autres ;-)

B) la mise à jour en tant que tel :

1) Pour les widgets, il est conseillé de les désactiver le plugin pour éviter les problèmes pendant la migration : 

2) Pour les designs, c'est plus radical... il est préférable de les supprimer :-( pour ma part, je m'en servait peu ou pas... j'avais juste fait un pour test : 


3) Mettez tous vos plugins à jour :

4) On peut maintenant lancer la mise à jour à partir du "centre de mise à jour" et cliquer sur "mettre à niveau V4"


5) Jeedom va analyser et donner son avis.... (il peut prendre une trentaine de secondes...)


Dans mon cas.... j'ai pris peur... et j'ai pensé qu'il était préférable de changer d'OS avant :-(... mais finalement non...

le mieux semble le processus suivant pour mon cas (et j'ai pu le vérifier maintenant ;-):
    - Garder raspbian 9.X donc mon système actuel sur mon mSSD
    - Faire un cleaning des plug-ins obsolete    
    - Migrer de v3 à v4 via l'outil de migration de Jeedom
    - Faire ensuite un backup de mon mSSD actuel et donc de cette v4 (sauvegarde jeedom standard(obligatoire) + image pour plus de sécurité (optionelle))
    - Flasher un nouvel OS en raspbian 10.X et avec Jeedom pré-installer en V4 (de préférence sur un nouveau mSSD au passage pour renouveller le hardware)
    - Restaurer le dernier backup jeedom en V4 sur cette nouvelle installation
    - "Pray for jeedom" ;-)


6) il faudra donc désinstaller déjà les plugins identifié comme "obsolete" avec le boutons suivant:


    vous pouvez aller voir la liste à la fin de la page pour comprendre mieux: 


Ensuite on peut cliquer sur le bouton et on va nous demander si on est sur ;-) !!!!



J'ai cliqué après vérification... la ligne sur les plug-ins obsoletes vont disparaitres.

On peut donc cliquer sur le bouton "Mettre à niveau V4"...


Encore une confirmation avant de lancer :



On se lance... et on prie ;-)


On commence par un backup...

On télécharge la mise à jour ;-)


On installe.... j'avais des versions de retard ;-)... J'ai une une erreur de DB ...sick :-(


Puis un packet de Fix....


Puis on check... et tout semble bon à part un plug-in beta qui me saoule :-( faurda que je le vire à l'occas !!!)



Et pour finir, je clique en haut à droite pour relancer le dashboard :




Ah oui, le chargement est différent déjà !!! Joli ce petit flouté et ce nouveau spinner !!!




C) la vérification que cela marche !!!

1) déjà, il y a des plug-ins à mettre à jour !!! (au passage apparement il est conseillé pour la suite de passer à Debian 10 Buster mais en "fresh install"... dommage :-(... mais bon on va déjà essayé de faire tournée cette installation pour avoir une bonne sauvegarde...


2) Mais avant on va supprimer le plugin "widget" qui est conseillé de virer ! (moi j'ai désactivé dans un premier temps avant de le vier, prudence... ;-)

3) Puis j'ai mis à jour de suite les plugins qui le demandait....

Mais j'ai du le faire un par un, un peu pénible... surement parce que je n'ai pas la bonne version de raspbian :-( ou sinon il n'y a plus la possibilité de le faire d'un coup :-( ?!

4) J'ai fait un redémarrage pour voir comment se comportait le système...


Encore un floutage... dans ce cas, c'est bizarre... on ne voit pas le Merci de patienter... mdr ;-)



Mais bon, cela redémarre bien pour arriver au dashboard !!!


5) j'ai quand même toujours le problème avec le plugin Xiaomi Home :-(, problème de python et/ou php... je n'arrive toujours pas à installer les dépendances !!!


6) Donc je vais faire un backup en 4.X avant de faire une fresh install pour être en Raspbian 10:


7) et puis j'ai téléchargé le backup en lieu sur !!!


D) Maintenant je me lance dans la "fresh install" !!!

1) Pour cela j'ai racheté un nouveau mSSD de 64 Go... ainsi je peux facilement remettre ma domotique existante si besoin ;-)

2) Pour la procédure, j'ai suivi le lien que l'on trouve dans le "centre de mise à jour": https://doc.jeedom.com/fr_FR/installation/#Installation
Dans mon cas, j'ai pris sur Raspberry Pi: https://doc.jeedom.com/fr_FR/installation/rpi

3) Pour l'image, j'ai pris celle-ci : https://images.jeedom.com/rpi/jeedom-debian-buster-rpi-4.1.25.zip

Pour avoir la dernière version, elle se trouve ici: https://images.jeedom.com/rpi/
(j'ai fais attention de ne pas prendre la 64 bits pour mon Pi3 et dans la même version que mon backup ;-)

4) Flashé sur le mSSD avec Pi Imager : https://www.raspberrypi.org/software/


Remarque: dans "choose OS", il faudra prendre "image personalisée" 

5) J'éteinds ma domotiqe (pi actuel), pour installer le nouveau mSSD


6) Je change le mSSD dans mon Pi Desktop ;-)




7) je relance le Pi ! (si l'IP est donné par un DHCP, cela simplifiera pour retrouver l'interface de Jeedom, ce que je conseil toujours)



8) Le login sera: admin et le mot de passe sera : admin 

9) on change le mot de passe

10) on ignore les autres étapes

11) Avant de lancer la restauration, on jete un coup d'oeil sur la santé de la bête (et pour pouvoir comparer plus tard) : 


12) on ajoute déjà la sauvegarde dans jeedom avec le bouton "Ajouter une sauvegarde"


13) On clique sur "Restaurer la sauvegarde"


14) OUPS.... dans mon cas, la restauration est resté figé... j'ai du me reloguer avec mon login/mot de passe comme dans la V3

15) Puis je suis aller voir dans les logs, et la restauration a bien été faite:


16) je suis aller voir la "santé" de jeedom aussi... un peu long mais voici !


17) J'avais donc encore 4 plugins NOK, j'ai pu en corriger 2... mais j'ai fini par en garder 2 avec problèmes... des que je n'utilise pas souvent donc j'ai décidé de remettre cela à plus tard... dans mon cas, j'ai beaucoup de plugin donc c'est normal d'avoir certains qui ne passent pas bien cette migration, certains avaient aussi des problèmes avant donc je n'ai pas considérer cela comme un problème, et cela sera à résoudre plus tard.

Dans mon cas j'ai laissé donc 2 problèmes de côté :
Le premier, c'est plus lié à des devices non accessibles dans mon réseau, donc pas un problème de migration:

Le deuxième, lié ai lancement du démon, et je sais que l'API d'Alexa est régulièrement non accessible à cause d'un cookie à renouveler :-(... donc je n'ai pas paniqué pour cela:


18) voilà c'est fini... ouf !!!

CONCLUSION: donc finalement, ce n'est pas compliqué de migrer et je n'ai pas eu vraiment de problème, je test cela depuis plusieurs semaines maintenant, et je suis super content, j'ai surtout pu retrouver mon plug-in xiaomi compatible python 3, que je ne pouvais plus utiliser sur Jeedom V3 et avec mon OS avec python 2 :-(

Enjoy !!!