Domoticz – Connectivité Internet

La BBox souffre d’un problème majeur: Lors d’une perte de synchro au niveau de l’ADSL, la BBox ne cherche à aucun moment à réinitialiser cette synchro. On reste donc déconnecté jusqu’au prochain reboot electrique.

Domoticz et une prise Chacon allaient répondre à mon besoin. Domoticz permet la création de switchs virtuels que l’on peut commander via une API, appelée par un script de test de connectivité. Ce switch est ensuite utilisé dans une séquence “evenement/action” dite blockly pour commander la prise électrique de la Bbox et ainsi la redémarrer…

Script Python

 

Ce script, lancé par un cronjob,  effectue les tâches suivantes:
– ping de google (8.8.8.8)
– Si echec du ping on incremente une valeur (stockée dans un fichier grâce au module pickle qui permet de gérer des variables dans des fichiers)
– Si le nombre d’echec est supérieur à une valeur alors on appel l’API d’un switch virtuel domoticz

 – Ceci grâce au module urllib2 qui permet de gérer l’authentification basic (base64 encode) et de gérer l’échange (réponse à l’appel de l’API)

#!/usr/bin/python
 
import os,sys
import pickle
import json
import urllib2, base64
import re
import urlparse
 
internet = '8.8.8.8'
ip_domoticz = 'localhost'
switch_id = '17'
port = "8080"
etat="On"
login='login'
mdp='password'
fileTentatives='/home/pi/internetTries.pickle'
failure = 0
nbTentatives = 3
 
result_ping = os.system('ping -c 5 -W 2 ' + internet)
 
print result_ping
 
""" si le ping ne fonctionne pas on ecrit dans un fichier """
 
if result_ping == 0:
        with open(fileTentatives, 'w+') as f:
            pickle.dump(failure, f)
 
 
if result_ping >= 1:
        with open(fileTentatives, 'r+') as f:
            failure = pickle.load(f)
        failure=int(failure)+1
        with open(fileTentatives, 'w+') as f:
            pickle.dump(failure, f)
 
f.close()
 
if failure > nbTentatives:
    etat="Off"
 
site = ip_domoticz + ":" + port + "/"
apiCall = "json.htm?type=command&param=switchlight&idx=" + switch_id + "&switchcmd=" + etat + "&level=0"
     
print site + apiCall
authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
authinfo.add_password(None, "http://"+site, login, mdp)
     
page = 'HTTP://'+site+apiCall
handler = urllib2.HTTPBasicAuthHandler(authinfo)
myopener = urllib2.build_opener(handler)
opened = urllib2.install_opener(myopener)
output = urllib2.urlopen(page)
 
print output.headers.getheader('content-type')
 
sys.exit(0)

Blockly

Blockly est un créateur graphique de séquence domotique sous forme “event -> Action”. Dans notre exemple lorsque le switch (virtuel) “internet” est etient (API: &switchcmd=” + etat + “) alors on effectue un shut/no shut de la prise electrique commandant la BBox.

seqBlock

 

Tuning

Pour rendre vraiment les choses propres, avec domoticz il est possible de rendre un switch protégé par un mot de passe. Ceci evite dans notre cas qu’un malencontreux click sur le switch virtuel ne lance un reboot de la Bbox

Conclusion

“Mais ca ne sert à rien ce truc, la bbox c’est super…”, Domoticz garde aussi un historique sur les switchs. Sur le mois de juillet 2015, 12 reboots!!

 

 

chart (1)