Page 2 sur 2

Re: Synology et Bluetooth

Publié : 18 oct. 2017, 17:00
par Ascari
Des nouveautés ?

Re: Synology et Bluetooth

Publié : 24 mars 2018, 13:08
par kurairaito

Code : Tout sélectionner

ash-4.3# hcitool lescan
retourne en temps réel les beacon a proximité.

Code : Tout sélectionner

stdbuf -i0 -o0 -e0 hcitool lescan | perl -MPOSIX -nle 'print strftime("%F %T",localtime), " ", $_'
ajoute la date et heure au début de chaque ligne.

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
puis lancer le 1er script.

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&param=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

si vous avez des question n'hésitez pas, de mon coté je vais essayer de commander des beacons pour mieux tester.


EDIT 2 : github si quelqu'un souhaite participer : https://github.com/Kurairaito/DomoticzS ... eDetection