Page 1 sur 1

[Tuto] Modifier les Id de vos dispositifs facilement

Publié : 11 nov. 2020, 23:42
par alpin38
bonsoir a tous amis Domoticziens

comme confinement oblige , il a bien fallu que je m'occupe un peu :o
j'ai crée un petit script bash accompagné d'un fichier texte (fichier de paramètres) qui sert a modifier les ID des dispositifs de domoticz
a quoi ca sert ? ben a pas grand chose, a part aux maniaques de l'organisation :mrgreen:

bref , si comme moi vous voulez changer les ID de certains de vos dispositifs sans vous prendre la tete ,rassembler tous les ids du même hardware , ou mettre tous les dummy avec des ID> 1000 , ce petit script est fait pour vous , (je ne suis pas le roi du script (c'est mon premier script en bash , mon but étant de le traduire en python prochainement pour ..... comme ca , je connais pas le python , ca m'entrainera :D )

pour le script , créer un fichier dans votre home ou ou vous voulez en fait ..

Code : Tout sélectionner

nano nomduscript.sh


coller ce bout de code (qui va faire tousser les puristes du code bash , mais bon :geek: )

Code : Tout sélectionner

#!/bin/bash

if [ -e "fichier_param.txt" ];then #verification si le fichier de parametres existe
	if [ "$#" != "1" ] ; then
		echo "******************************************************"
		echo "Attention ,il manque le chemin de la bdd en parametres du script "
		echo " "
		echo "pour lancer le script avec le paramètre" 
		echo "./script.sh chemindelabdd "
		exit
	else
		echo "******************************************************"
		echo "voici les paramètres que vous avez renseignés"
		echo " "
		echo "chemin de la base de donnée à modifier=> $1"  #chemin de la base de donnée a modifier 
		
		cat fichier_param.txt | while read ID IDNEW
		do
		
		echo "index dispositif à modifier =>$ID / nouvel index => $IDNEW"

		 done

	fi
else
	 echo "******************************************************"	
	 echo "le fichier 'fichier_param.txt' non trouvé"
	 echo "merci de verifier que ce fichier se trouve dans le meme repertoire que le script"
	 echo "chaque ligne de ce fichier doit indiquer : index a modifier  , un espace , nouvel index"
	 echo "exemple je veux modifier les index 6 ,8 et 45  et les rennomer respectivement en 1456 3524 et 456"
	 echo "mon fichier paramètres devra contenir :"
	 echo "6 1456"
	 echo "8 3524"
	 echo "45 456"
	 echo "et rien de plus "
	 echo "******************************************************"
	 exit 0
	 
fi

now=$(date +"%H%M%S-%m%d%Y")
		echo " "
		echo "Etes vous certains de vouloir executer le script avec les paramètres ci dessus ?"
		echo "une sauvegarde de la bdd sera effectuée avant la modification"
		echo "******************************************************"
PS3='Votre choix > '   # le prompt
LISTE=("[o] oui" "[n]  non")  # liste de choix disponibles
select CHOIX in "${LISTE[@]}" ; do
    case $REPLY in
        1|o)
			tables=("DeviceToPlansMap" "Fan" "Fan_Calendar" "LightSubDevices" "LightingLog" "Meter" "Meter_Calendar" "MultiMeter" "MultiMeter_Calendar" "Notifications" "Percentage" "Percentage_Calendar" "Rain" "Rain_Calendar" "SceneDevices" "SetpointTimers" "PushLink" "SharedDevices" "Temperature" "Temperature_Calendar" "Timers" "UV" "UV_Calendar" "Wind" "Wind_Calendar")


			if [ -e $1 ] #verification si le fichier en parametre existe
			then
				echo " "
				echo "vérification des éléments renseignés dans le fichier"
				echo " "
				#la bdd existe 
				cat fichier_param.txt | while read ID IDNEW
				do
			
					#verification si les index sont presents
					name=$(sqlite3 $1 "select Name from DeviceStatus WHERE ID='$ID'")
					if [ -z "$name" ]
					then 
						echo "ID dispositif $ID inexistant dans la table DeviceStatus"
						exit 10
					else
						echo "ID dispositif $ID Présent"
					fi
					#verification si les nouveaux index sont libres
					namenew=$(sqlite3 $1 "select Name from DeviceStatus WHERE ID='$IDNEW'")
					if [ -z "$namenew" ]
					then 
						echo "ID dispositif $IDNEW Disponible"
						
					else
						echo "Le nouvel index $IDNEW éxiste deja ,($namenew),  modification impossible"
						exit 10
					fi
				
				done
				
				if [ $? != 10 ] 
				then	
					echo " "
					echo "Les éléments renseignés sont ok , lancement des modifcations"
					echo " "
					#exit 0
							echo "Copie de Sauvegarde de la base de donnée"
							cp "$1" "$1.$now"
						
							echo "arret de domoticz"
							sudo service domoticz stop

							cat fichier_param.txt | while read ID IDNEW
							do
								name=$(sqlite3 $1 "select Name from DeviceStatus WHERE ID='$ID'")
								echo "mise à jour de l'index $ID ($name) en $IDNEW dans la table DeviceStatus"
								sqlite3 $1 "UPDATE DeviceStatus SET ID ='$IDNEW' WHERE ID ='$ID'"
								for i in "${!tables[@]}"
								do
									r=$(sqlite3 $1 "select * from ${tables[$i]} WHERE DeviceRowID='$ID'")
									if [ -n "$r" ]
									then
										# echo "Aucun index à modifier dans la table ${tables[$i]} pour le DeviceRowID $ID ($name)"
									# else
										echo "Modification éffectuée pour DeviceRowID $ID ($name) en $IDNEW dans la table ${tables[$i]}"
										sqlite3 $1 "UPDATE ${tables[$i]} SET DeviceRowID ='$IDNEW' WHERE DeviceRowID ='$ID'"
									fi
								done
								
							done
							
							
							echo "redemarrage de domoticz"
							sudo service domoticz start
				else
				echo " "
				echo "Les éléments renseignés sont incorrects ,annulation des modifcations"
				echo " "
				fi
				
				echo "******************************************************"
			else
				echo "la bdd $1 n'existe pas ou le chemin est érroné"
			echo "******************************************************"
			fi
       
        break
        ;;
        2|n)
		
        break
        ;;
    esac
done


rendez le exécutable

Code : Tout sélectionner

chmod +x nomduscript.sh
mettez le fichier de paramètres dans le même répertoire
celui ci DOIT être nommé "fichier_param.txt"
et contenir a chaque ligne l'ID a remplacer puis le nouvel ID espacé
exemple je veux modifier les index 6 ,8 et 45 et les renommer respectivement en 1456 3524 et 456"
mon fichier paramètres devra contenir :
6 1456
8 3524
45 456
et rien de plus (bien penser au retour chariot de la dernière ligne)

lancer le script en ajoutant en paramètre le chemin de la bdd de domoticz

Code : Tout sélectionner

./nomduscript.sh /home/pi/domoticz/domoticz.db
le code vérifie les informations et doit normalement vous guider tout le long du processus
ps une copie de la bdd est effectuée avant toute modification

voici les fichiers si vous voulez pas faire du copié collé :mrgreen:
fichier param => https://drive.google.com/file/d/1LdP9u1 ... sp=sharing
script bash => https://drive.google.com/file/d/1ASY-RL ... sp=sharing


enjoy

@+++

Re: Modifier les Id de vos dispositifs facilement

Publié : 11 nov. 2020, 23:44
par alpin38
ah oui pour info je l'ai testé en condition réelles sur mon domoticz en fonctionnement sur des paramètres avec 4-5 ans d'historique et ca a fonctionné sans probleme
:mrgreen:

Re: Modifier les Id de vos dispositifs facilement

Publié : 15 nov. 2020, 11:00
par secator
Intéressant. Quels sont les prérequis ? sqlite3, c'est tout ?
Merci

Re: Modifier les Id de vos dispositifs facilement

Publié : 15 nov. 2020, 23:24
par alpin38
je dirai oui , uniquement sqlite3 mais il est normalement deja présent
donc a part le script et son fichier , rien d'autre