Page 1 sur 1

Comparer un compteur et son index

Publié : 07 févr. 2016, 14:02
par papoo
Bonjour,
je test un damoclès 1208 en SNMP et j'ai fais un script sh pour remonter entre autre les compteurs
(test et explication ici)
j'aimerai améliorer mon script pour comparer le compteur avec l'index dans domoticz car après une coupure de courant le compteur repart à zéro (sur le damoclès)
mon script
DAMOCLES_IP="192.168.1.220" # IP Address damocles
PASSWORD="public" # SNMP Password
DOMO_IP="192.168.1.224" # Domoticz IP Address
DOMO_PORT="8080" # Domoticz Port

DAMOCLES_IDX="150" # DAMOCLES Switch IDX
DOMOTICZ_CPT_1_IDX="154" # IDX DOMOTICZ CPT 1
DOMOTICZ_CPT_2_IDX="155" # IDX DOMOTICZ CPT 2
DOMOTICZ_CPT_3_IDX="156" # IDX DOMOTICZ CPT 3
DOMOTICZ_CPT_4_IDX="197" # IDX DOMOTICZ CPT 4
DOMOTICZ_CPT_5_IDX="198" # IDX DOMOTICZ CPT 5
DOMOTICZ_CPT_6_IDX="199" # IDX DOMOTICZ CPT 6


DOMOTICZ_INT_1_IDX="157" # DOMOTICZ IDX interrupteur1
DAMOCLES_OUT_1_IDX="158" # DAMOCLES IDX Sortie1
#DOMOTICZ_INT_2_IDX="159" # DOMOTICZ IDX interrupteur2
#DAMOCLES_OUT_2_IDX="158" # DAMOCLES IDX Sortie2

# Contrôle si DAMOCLES est online

PINGTIME=`ping -c 1 -q $DAMOCLES_IP | awk -F"/" '{print $5}' | xargs`

OUT_1=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.2.1` # Etat Sortie 1

IN_1=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.1.1.6.1` # Etat Compteur 1
IN_2=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.6.2` # Etat Compteur 2
IN_3=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.6.3` # Etat Compteur 3
IN_4=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.6.4` # Etat Compteur 4
IN_5=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.6.5` # Etat Compteur 5
IN_6=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.6.6` # Etat Compteur 6

IND_CPT_1=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_1_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 1
IND_CPT_2=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_2_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 2
IND_CPT_3=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_3_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 3
IND_CPT_4=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_4_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 4
IND_CPT_5=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_5_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 5
IND_CPT_6=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_CPT_6_IDX"| jq -r .result[].Counter) # Index Domoticz Compteur 6

INT_1=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DOMOTICZ_INT_1_IDX"| jq -r .result[].Status)

echo $PINGTIME
if expr "$PINGTIME" '>' 0
then
echo "DAMOCLES ON"
# Envoi état damoclès
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=switchlight&idx=$DAMOCLES_IDX&switchcmd=On"

# Index Compteur 1
CPT_1=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.1.1.6.1`

# Envoi index Compteur 1 vers domoticz
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=udevice&idx=$DOMOTICZ_CPT_1_IDX&nvalue=0&svalue=$CPT_1"

# Index Compteur 2 vers domoticz
CPT_2=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.1.1.6.2`
# Send data
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=udevice&idx=$DOMOTICZ_CPT_2_IDX&nvalue=0&svalue=$CPT_2"

# Index Compteur 3 vers domoticz
CPT_3=`snmpget -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.1.1.6.3`
# Send data
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=udevice&idx=$DOMOTICZ_CPT_3_IDX&nvalue=0&svalue=$CPT_3"

# comparaison état interrupteur domoticz et Sortie 1 en cas de coupure de courant
if [ $INT_1 = "On" ] && [ $OUT_1 = 0 ]
then
DAMOCLES_CMD_1=`snmpset -c $PASSWORD -v1 -O qv $DAMOCLES_IP .1.3.6.1.4.1.21796.3.4.2.1.2.1 i 1`
fi
else
echo "DAMOCLES OFF"

#Envoi état damoclès
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command&param=switchlight&idx=$DAMOCLES_IDX&switchcmd=Off"

fi
j'essai donc de convertir mes variables string en entier pour pouvoir les comparer :
le compteur d'eau comptabilisant en m3 je supprime m3 avec
IND_CPT_1=${IND_CPT_1:0:6} # supprime les unités du compteur 1
ensuite j'essai de transformer ma variable en entier avec un fonction trouvée sur le net et légèrement modifiée:
function string_to_int ()
{
LANG=C
d=${1##*.} # partie décimale
e=${1%.*} # partie entière
e=${e//,/}
printf %.3f "$e.$d" 2>/dev/null
}
CPT1=$(string_to_int $IND_CPT_1)

j'ai donc transformé ma variable $IND_CPT_1 qui est égale à 0.007 m3 en $CPT1 qui est égale à 0.007
mais j'ai pas l'impression que ma variable n'est toujours pas un entier car je ne peux pas multiplier le résultat par 1000 pour obtenir des litres, mon compteur lui comptant en litres et sa variable $IND_CPT_1 étant égale à 7(avant coupure de courant)
comment feriez vous pour comparer ces deux variables ?

Re: Comparer un compteur et son index

Publié : 07 févr. 2016, 15:43
par patrice
Bonjour
A mon avis (mais je n'ai pas depioté le script) tu as une des 2 variables en string malgré ta fonction de conversion
ou sinon le 0 preliminaire est considere par le shell comme de l'octal

Pour la multiplication passe tes varaibles dans un pipe bc (echo $a * 1000 | bc) pour voir

Re: Comparer un compteur et son index

Publié : 07 févr. 2016, 18:14
par papoo
patrice a écrit :Bonjour
A mon avis (mais je n'ai pas depioté le script) tu as une des 2 variables en string malgré ta fonction de conversion
ou sinon le 0 preliminaire est considere par le shell comme de l'octal

Pour la multiplication passe tes varaibles dans un pipe bc (echo $a * 1000 | bc) pour voir
Je viens d'essayer avec la commande

Code : Tout sélectionner

IND_CPT_1=$(echo "$IND_CPT_1*1000" |bc)
cela fonctionne parfaitement
Merci patrice