Synology et Bluetooth
Re: Synology et Bluetooth
Des nouveautés ?
-
kurairaito
- Messages : 1
- Inscription : 24 mars 2018, 12:59
Re: Synology et Bluetooth
Code : Tout sélectionner
ash-4.3# hcitool lescanCode : Tout sélectionner
stdbuf -i0 -o0 -e0 hcitool lescan | perl -MPOSIX -nle 'print strftime("%F %T",localtime), " ", $_'avec un peu de script en plus, on pourrait mettre à jour des user variable dans domoticz (date de dernière vue par exemple)
EDIT :
bon j'ai fait 2 scripts adaptés de la version python mais en bash seulement compatible synology (normalement).
jannonce tout de suite que malgré les lignes commentés, j'ai pas testé pour plusieurs badges. actuellement j'ai que mon téléphone avec une application (beacon simulator) mais l'addresse mac change toutes les 5 minutes donc pas facile de tester.
Je pense aussi que cette méthode pose problème avec la gestion du bluetooth de DSM car parfois lorsque l'on lance la commande hcitool lescan, on obtient une erreur d'I/O (en fait c'est que la ressource est déjà utilisée probablement par DSM). je n'ai fait aucune gestion d'erreur dans ce script, si le script ne démarre pas, relancer le après quelques secondes et ca devrais fonctionner. en dernier recours lancer :
Code : Tout sélectionner
hciconfig hci0 down
hciconfig hci0 up
ce qui fonctionne d'après mes test :
- la sauvegarde des beacons vu avec le dernier timestamp
- l'envoie des infos à domoticZ, les 2 modes de transmission, l'envoie du status initial (si présent, envoie immédiat, si absent attente du timeout avant d'envoyer l'état ce qui permet de ne pas avoir un état transitoire au démarrage)
les infos sont remontée dans des variable utilisateurs, c'est adaptable à des switchs virtuels assez facilement (url à changer)
script n°1 : celui qui sauvegarde l'état des beacons. vous devez adapter le nom du fichier temporaire ou sont stockée les informations
fichier updateLastSeen.sh
Code : Tout sélectionner
#!/bin/bash
FILENAME="/volume1/homes/admin/domoticz/last_seen_tag"
stdbuf -i0 -o0 -e0 /bin/hcitool lescan | while read -r line; do
TIMESTAMP=`date +%s`;
stringarray=($line)
if [[ ${stringarray[0]} == ??:??:??:??:??:?? ]]
then
if grep -Rq "${stringarray[0]}" $FILENAME
then
#found in file : update timestamp
sed -i "s/.* ${stringarray[0]}/$TIMESTAMP ${stringarray[0]}/" $FILENAME
else
# not found in file : append
echo $TIMESTAMP ${stringarray[0]} >> $FILENAME
fi
fi
done
2ème script : celui qui remonte les info à domoticZ. Vous devez adapter le nom d'utilisateur/mot de passe qui a un accès au variable utilisateur ansi que l'addresse ip et le port du serveur. vous devez également reporter le même chemin vers le fichier temporaire que dans le premier script.
Vous devez ensuite définir vos beacons de la facon suivante :
- nom de la variable à mettre à jour,
- addresse mac du beacon
- timeout avant de passer en AWAY
- idx de la variable utilisateur
- mode de transmission ($SWITCH_MODE ou $REPEAT_MODE) le premier envoie seulement sur un changement d'état, le second envoie l'information toute les secondes.
si vous ajoutez des beacon, no'oubliez pas de modifier la variable TAG_DATA pour les renseigner. c'est ce tableau qui est utilisé dans le reste du script.
fichier checkPresence.sh
Code : Tout sélectionner
#!/bin/bash
DOMOTICZ_USER="xxxxxx"
DOMOTICZ_PASS="xxxxxx"
URL_DOMOTICZ="http://xxx.xxx.xxx.xxx:yyyy/json.htm?username=$DOMOTICZ_USER&password=$DOMOTICZ_PASS&type=command¶m=updateuservariable&idx=PARAM_IDX&vname=PARAM_NAME&vtype=2&vvalue=PARAM_CMD"
REPEAT_MODE=1
SWITCH_MODE=0
FILENAME="/volume1/homes/admin/domoticz/last_seen_tag"
# Configure your Beacons in the TAG_DATA table with : [Name,MacAddress,Timeout,0,idx,mode]
# Name : the name of the uservariable used in Domoticz
# macAddress : upper case
# Timeout is in secondes the elapsed time without a detetion for switching the beacon AWAY. Ie :if your beacon emits every 3 to 8 seondes, a timeout of 15 secondes seems good.
# idx of the uservariable in Domoticz for this beacon
# mode : SWITCH_MODE = One update per status change / REPEAT_MODE = continuous updating the RSSI every 3 secondes
TAG_1=("Tag_White" "45:5A:28:40:4C:FC" 30 5 $SWITCH_MODE)
#TAG_2=("Tag_Pink" "f1:0d:d6:e6:b0:b2" 30 6 $REPEAT_MODE)
#TAG_3=("Tag_Orange" "Fb:14:78:38:18:5e" 30 9 $REPEAT_MODE)
#TAG_4=("Tag_Green" "ff:ff:60:00:22:ae" 30 7 $REPEAT_MODE)
TAG_DATA=(
TAG_1[@]
# TAG_2[@]
# TAG_3[@]
# TAG_4[@]
);
COUNT=${#TAG_DATA[@]}
LAST_UPDATED=()
LAST_STATE=()
INITIAL_LAUNCH=`date +%s`
while true; do
sleep 1;
for ((i=0; i<$COUNT;i++))
do
MUST_UPDATE=false
TAG_NAME=${!TAG_DATA[i]:0:1}
TAG_ADDR=${!TAG_DATA[i]:1:1}
TAG_TIMEOUT=${!TAG_DATA[i]:2:1}
TAG_IDX=${!TAG_DATA[i]:3:1}
TAG_MODE=${!TAG_DATA[i]:4:1}
TAG_LAST_SEEN=`awk "/$TAG_ADDR/{print $1}" $FILENAME | cut -d ' ' -f 1`
if [ -z "$TAG_LAST_SEEN" ]
then
TAG_LAST_SEEN=0
fi
TIMESTAMP=`date +%s`
# for initial state, we must wait at least the timeout before updating domoticz if absent
if [[ -z ${LAST_UPDATED[$i]} ]] && [[ "$TIMESTAMP" -gt "$(( $INITIAL_LAUNCH + $TAG_TIMEOUT ))" ]]
then
MUST_UPDATE=true
elif [[ ! -z ${LAST_UPDATED[$i]} ]] && [[ "$TIMESTAMP" -gt "$(( $TAG_LAST_SEEN + $TAG_TIMEOUT ))" ]]
then
MUST_UPDATE=true
elif [[ "$TIMESTAMP" -le "$(( $TAG_LAST_SEEN + $TAG_TIMEOUT ))" ]]
then
MUST_UPDATE=true
fi
SEND_CMD=false
if [ $MUST_UPDATE == true ]
then
URL=$URL_DOMOTICZ
URL=${URL/PARAM_IDX/$TAG_IDX}
URL=${URL/PARAM_NAME/$TAG_NAME}
LAST_UPDATED[$i]=$TIMESTAMP
if [[ "$TIMESTAMP" -gt "$(( $TAG_LAST_SEEN + $TAG_TIMEOUT ))" ]]
then
#tag perdu
if [[ -z ${LAST_STATE[$i]} ]] || [[ "$TAG_MODE" == "$SWITCH_MODE" && ${LAST_STATE[$i]} == true ]] || [[ "$TAG_MODE" == "$REPEAT_MODE" ]]
then
SEND_CMD=true
fi
LAST_STATE[$i]=false
URL=${URL/PARAM_CMD/"AWAY"}
else
#tag present
if [[ -z ${LAST_STATE[$i]} ]] || [[ "$TAG_MODE" == "$SWITCH_MODE" && ${LAST_STATE[$i]} == false ]] || [[ "$TAG_MODE" == "$REPEAT_MODE" ]]
then
SEND_CMD=true
fi
LAST_STATE[$i]=true
URL=${URL/PARAM_CMD/"HOME"}
fi
# echo $URL
if [ $SEND_CMD == true ]
then
curl $URL > /dev/null 2>&1
fi
fi
done
done
EDIT 2 : github si quelqu'un souhaite participer : https://github.com/Kurairaito/DomoticzS ... eDetection