***************** Nouvelle mise à jour le 01/07 *****************
01/07:
* Rétablissement conversion Hex => Dec pour le niveau de batterie remonté
19/06:
* Correction affichage niveau de batterie
+ Ajout de l'option -e pour que le script retourne le vrai code d'erreur
02/06:
* Correction système de log
24/02:
* Correction d'un bug du fichier de log
06/01:
+ Ajout du paramètre "-r" pour gérer les Nut Find 3
+ Ajout de la variable IP_JEEDOM si jamais le script tourne sur une
machine différente de votre Jeedom
04/01:
* Correction pour prise en compte de l'interface bluetooth paramétrée
(avant cela prenait systématiquement hci0... )
************************************************************
************************************************************
Bonjour à tous,
Cela fait un moment que je cherchais car ce qui me manque cruellement avec les Nut Mini c'est la remontée de leur niveau de batterie...
Donc j'ai enfin trouvé le temps d'adapter un script Domoticz trouvé ici pour pouvoir récupérer cette info !!!
Code : Tout sélectionner
#!/bin/bash
#############################
### PARAMETRES A MODIFIER ###
#############################
# Interface bluetooth de votre machine (généralement hci0)
INTERFACE_BLUETOOTH="hci0"
# API Key à récupérer dans vos paramètres Jeedom
API_KEY="A_CHANGER avec la vôtre"
# IP du Jeedom cible (127.0.0.1 ou votre IP du type xxx.xxx.xxx.xxx)
IP_JEEDOM=127.0.0.1
#############################
#############################
##############################################
# NE PLUS RIEN MODIFIER SOUS CETTE LIGNE !!! #
##############################################
URL_JEEDOM_1="http://${IP_JEEDOM}/core/api/jeeApi.php?plugin=virtual&apikey=${API_KEY}&type=virtual&id="
URL_JEEDOM_2="&value="
BATTUUID="0x2a19"
VERBOSE=0
UPDATEVIRTUAL=0
MODE_EXPRESS=0
EXIT_REAL_STATUS=0
HCITOOL_RANDOM="--random"
GATTTOOL_RANDOM="-t random"
LOGFILE="$(dirname $0)/$(basename $0 .sh).log"
function restartHCI () {
if (( $VERBOSE == 1 )); then
echo "Redémarrage ${INTERFACE_BLUETOOTH}..." | tee -a $LOGFILE
sudo hciconfig ${INTERFACE_BLUETOOTH} down 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
echo "KO: sudo hciconfig ${INTERFACE_BLUETOOTH} down" | tee -a $LOGFILE
return 1
fi
if (( MODE_EXPRESS == 0 )); then
sleep 1
fi
sudo hciconfig ${INTERFACE_BLUETOOTH} up 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
echo "KO: sudo hciconfig ${INTERFACE_BLUETOOTH} up" | tee -a $LOGFILE
return 1
fi
echo "${INTERFACE_BLUETOOTH} redémarrée" | tee -a $LOGFILE
else
sudo hciconfig ${INTERFACE_BLUETOOTH} down 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
return 1
fi
if (( MODE_EXPRESS == 0 )); then
sleep 1
fi
sudo hciconfig ${INTERFACE_BLUETOOTH} up 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
return 1
fi
fi
return 0
}
function getBLEBatteryLevel () {
if (( $VERBOSE == 1 )); then
echo "Démarrage de l'analyse du Nut ${NUT_MAC}..." | tee -a $LOGFILE
fi
# Gestion du Handle
if (( $VERBOSE == 1 )); then
echo " Récupération du handle avec la commande sudo hcitool -i ${INTERFACE_BLUETOOTH} lecc ${HCITOOL_RANDOM} ${NUT_MAC} | awk '{print \$3}'" | tee -a $LOGFILE
HANDLE=$(sudo hcitool -i ${INTERFACE_BLUETOOTH} lecc ${HCITOOL_RANDOM} $NUT_MAC | awk '{print $3}')
if [[ $HANDLE == "" ]]; then
echo " KO: pas de handle pour ${NUT_MAC} !" | tee -a $LOGFILE
return 1
else
echo " Ok: Handle récupéré (${HANDLE})" | tee -a $LOGFILE
fi
else
HANDLE=$(sudo hcitool -i ${INTERFACE_BLUETOOTH} lecc ${HCITOOL_RANDOM} $NUT_MAC 2>/dev/null | awk '{print $3}')
if [[ $HANDLE == "" ]]; then
return 1
fi
fi
# Attente
if (( MODE_EXPRESS == 0 )); then
sleep 1
fi
# Lecture Handle
if (( $VERBOSE == 1 )); then
echo " Lecture du handle avec la commande sudo hcitool -i ${INTERFACE_BLUETOOTH} ledc ${HANDLE}" | tee -a $LOGFILE
sudo hcitool -i ${INTERFACE_BLUETOOTH} ledc $HANDLE 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
echo " KO: Erreur de lecture du handle !" | tee -a $LOGFILE
return 1
else
echo " Ok: Handle lu avec succès" | tee -a $LOGFILE
fi
else
sudo hcitool -i ${INTERFACE_BLUETOOTH} ledc $HANDLE 2>&1 | tee -a $LOGFILE
if (( $? == 1 )); then
return 1
fi
fi
# Récupération de la valeur "Batterie"
if (( $VERBOSE == 1 )); then
echo " Lecture valeur batterie avec la commande sudo gatttool ${GATTTOOL_RANDOM} -i ${INTERFACE_BLUETOOTH} --char-read --uuid ${BATTUUID} -b ${NUT_MAC} | awk '{print \$4}'" | tee -a $LOGFILE
BATHEX=$(sudo gatttool ${GATTTOOL_RANDOM} -i ${INTERFACE_BLUETOOTH} --char-read --uuid $BATTUUID -b $NUT_MAC | awk '{print $4}')
if [[ $BATHEX == "" ]]; then
echo " KO: Impossible de lire la valeur !" | tee -a $LOGFILE
return 1
else
echo " Ok: Valeur Hex lue = ${BATHEX}" | tee -a $LOGFILE
fi
else
BATHEX=$(sudo gatttool ${GATTTOOL_RANDOM} -i ${INTERFACE_BLUETOOTH} --char-read --uuid $BATTUUID -b $NUT_MAC 2>/dev/null | awk '{print $4}')
if [[ $BATHEX == "" ]]; then
return 1
fi
fi
# Conversion en décimal
BATDEC=$((0x$BATHEX))
# ...ou pas
#BATDEC=$BATHEX
if (( $VERBOSE == 1 )); then
echo " Niveau de batterie=${BATDEC}%" | tee -a $LOGFILE
else
echo $BATDEC | tee -a $LOGFILE
fi
if (( $UPDATEVIRTUAL == 1 )); then
if (( $VERBOSE == 1 )); then
echo " Lancement curl -s ${URL_JEEDOM_1}${VIRTUAL_ID}${URL_JEEDOM_2}${BATDEC}" | tee -a $LOGFILE
fi
if [[ $(curl -s "${URL_JEEDOM_1}${VIRTUAL_ID}${URL_JEEDOM_2}${BATDEC}") != "" ]]; then
return 1
fi
fi
return 0
}
function Usage() {
echo
echo " Usage: ${0} [-v] [-x] <<Virtual_Id>> <<MacAdresseDuNut>>"
echo " Format adresse Mac Nut: \"xx:xx:xx:xx:xx:xx\""
echo " -v: mode verbeux"
echo " -x: mode express (n'attend pas entre les commandes, ne redémarre pas l'interface BT)"
echo " -r: compatibilté Nut Find 3"
echo " -e: exit status = 1 en cas d'erreur (sinon toujours 0)"
echo
}
function readParams () {
until (( $# == 0 )); do
if [[ $1 == "-v" ]]; then
VERBOSE=1
shift
continue
fi
if [[ $1 == "-x" ]]; then
MODE_EXPRESS=1
shift
continue
fi
if [[ $1 == "-r" ]]; then
HCITOOL_RANDOM=""
GATTTOOL_RANDOM=""
shift
continue
fi
if [[ $1 == "-e" ]]; then
EXIT_REAL_STATUS=1
shift
continue
fi
if [[ $VIRTUAL_ID == "" ]]; then
VIRTUAL_ID=$1
#echo "ID du virtuel: ${VIRTUAL_ID}" | tee -a $LOGFILE
shift
continue
elif [[ $NUT_MAC == "" ]]; then
NUT_MAC=$1
#echo "MAC du Nut: ${NUT_MAC}" | tee -a $LOGFILE
shift
continue
else
shift
continue
fi
done
if [[ $NUT_MAC == "" || $VIRTUAL_ID == "" ]]; then
Usage
exit 1
fi
# Forcer le mode update du Virtuel
UPDATEVIRTUAL=1
}
# Programme principal
# Lecture des paramètres de la ligne de commande
readParams $*
# Redémarrage de l'interface bluetooth
if (( MODE_EXPRESS == 0 )); then
restartHCI
# S'il y a eu un pb
if (( $? == 1 )); then
if (( $VERBOSE == 1 )); then
echo "Impossible de redémarrer l'interface bluetooth !" | tee -a $LOGFILE
fi
fi
fi
echo " " | tee -a $LOGFILE
echo "==============" | tee -a $LOGFILE
date | tee -a $LOGFILE
# Récupération du niveau de batterie et mise à jour du virtuel
getBLEBatteryLevel
ExitStatus=$?
if (( $ExitStatus == 1 )); then
if (( $VERBOSE == 1 )); then
echo "Une erreur s'est produite..." | tee -a $LOGFILE
fi
# getBLEBatteryLevel
# ExitStatus=$?
# if (( $ExitStatus == 1 )); then
# echo "Une erreur s'est produite..." | tee -a $LOGFILE
# fi
fi
if (( $EXIT_REAL_STATUS == 1 )); then
exit $ExitStatus
else
exit 0
fi
* 1er paramètre: ID du virtuel
* 2nd paramètre: adresse MAC du Nut Mini
Attention l'orde est donc important
Il a 3 paramètres optionnels :
* "-v" pour le mode verbeux (utile lorsque vous testez en ligne de commande pour voir tout ce qui se passe bien ou mal)
* "-x" pour le mode rapide qui n'attend pas entre les appels de fonction bluetooth ET SURTOUT qui ne redémarre par l'interface Bluetooth. Je ne conseille PAS d'utiliser l'option -x
* "-r" pour assurer la compatibilité avec les Nut Find 3. Ne pas utiliser ce paramètre pour les Nut Mini
* "-e" pour que le script sorte en erreur -1 en cas d'erreur. Sans cette option le script retourne toujours 0 (donc "tout s'est bien passé...")
Donc en gros la syntaxe est : <<nom du script>> [-v] [-r] [-x] <<ID du virtuel>> <<Adresse Mac du Nut mini>>
Attention il ne faut pas oublier de changer dans le script la valeur de votre API_KEY et si besoin celle de votre interface bluetooth (hciX).
Attention : ce script ne fonctionne pas à chaque coup si jamais l'interface Bluetooth est déjà utilisée (par le plugin Blea par exemple).
Donc il faut soit le relancer jusqu'à ce que cela passe ou mieux, stopper (temporairement) le process qui utilise l'interface Bluetooth avant de lancer le script...ou mieux, mais plus cher , installer un dongle bluetooth dédié pour ce script (et donc modifier le paramètre INTERFACE_BLUETOOTH en conséquence au début du script)