V1.1 wifi et reboot

This commit is contained in:
supermat
2018-07-02 22:36:52 +02:00
committed by GitHub
parent 18aadf8ba9
commit cef8e63ae5
3 changed files with 226 additions and 58 deletions

View File

@@ -8,6 +8,8 @@ https://matdomotique.wordpress.com/2018/03/25/plugin-freebox-pour-domoticz/
* Création d'un dispositif par partition de disque dur connecté à la Freebox (disques internes et externes) * Création d'un dispositif par partition de disque dur connecté à la Freebox (disques internes et externes)
* Création de 3 dispositifs pour suivre les températures de la Freebox * Création de 3 dispositifs pour suivre les températures de la Freebox
* Création d'un dispositif switch par adresse mac pour laquelle vérifier la présence ou non à proximité de la Freebox. * Création d'un dispositif switch par adresse mac pour laquelle vérifier la présence ou non à proximité de la Freebox.
* Création d'un dispositif switch de suivi et modification de l'état du wifi (Actif/Inactif)
* Création d'un dispositif switch de reboot de la Freebox serveur
## Installation ## Installation
@@ -40,7 +42,7 @@ Laissez les valeur par defaut sur un réseau local, ou configurez votre adresse
Ajoutez le Matériel et rendez vous dans les log. Ajoutez le Matériel et rendez vous dans les log.
Lors de la première utilisation, laissez le token vide. Lors de la première utilisation, laissez le token vide.
Au démarrage, si le token n'est pas défini, le plugin en demander un à la Freebox, il vous faut alors vous déplacer jusqu'à l'écran de la Freebox pourrépondre oui, puis revenir sur votre Domoticz pour copier coller le token qui s'affiche dans la fenetre de log, dans la partie Token de confirguration du plugin. Au démarrage, si le token n'est pas défini, le plugin en demander un à la Freebox, il vous faut alors vous déplacer jusqu'à l'écran de la Freebox pour répondre oui, puis revenir sur votre Domoticz pour copier coller le token qui s'affiche dans la fenetre de log, dans la partie Token de configuration du plugin.
Desactivez le plugin, autoriser l'ajout de nouveau dispositif pendant 5 minutes, puis réacivez le plugin pour le faire redemarrer. Desactivez le plugin, autoriser l'ajout de nouveau dispositif pendant 5 minutes, puis réacivez le plugin pour le faire redemarrer.
Les dispositifs vont se créer. Les dispositifs vont se créer.
@@ -52,6 +54,8 @@ Vous pouvez supprimer ceux qui ne vous interresse pas et inclure ceux qui vous i
| Système | Températures de la Freebox et du switch interne | | Système | Températures de la Freebox et du switch interne |
| Disque | Pourcentage d'espace utilisé de chaque partition connectées à la Freebox au moment du démarrage du Plugin avec autorisation d'ajout de dispositifs | | Disque | Pourcentage d'espace utilisé de chaque partition connectées à la Freebox au moment du démarrage du Plugin avec autorisation d'ajout de dispositifs |
| Présence | Pour chaque adresse mac renseignée, si elle est trouvée enregistrée sur la Freebox, un dispositif switch est créé, indiquant la presence (on) ou l'absence (off) du matériel à proximité de la box. Cela permet de tester la presence d'une personne au domicile en vérifiant la presence de sont smartphone par exemple. Cela fonctionne, même avec les Iphones | | Présence | Pour chaque adresse mac renseignée, si elle est trouvée enregistrée sur la Freebox, un dispositif switch est créé, indiquant la presence (on) ou l'absence (off) du matériel à proximité de la box. Cela permet de tester la presence d'une personne au domicile en vérifiant la presence de sont smartphone par exemple. Cela fonctionne, même avec les Iphones |
| On/Off Wifi | Switch permettant de voir l'état du wifi (actif/Desactivé) et de le modifier |
| Reboot | Switch permettant de rebooter la Freebox |
Note : Un fichier ```devicemapping.json``` est créé pour garder l'association des infos de la Freebox avec le bon device créé au moment du démarrage du Plugin. Note : Un fichier ```devicemapping.json``` est créé pour garder l'association des infos de la Freebox avec le bon device créé au moment du démarrage du Plugin.

View File

@@ -1,7 +1,8 @@
#Code adapté de http://www.manatlan.com/blog/freeboxv6_api_v3_avec_python #Code adapté de http://www.manatlan.com/blog/freeboxv6_api_v3_avec_python
import urllib.request,hmac,json,hashlib,time import urllib.request,hmac,json,hashlib,time,Domoticz
from urllib.request import urlopen,Request from urllib.request import urlopen,Request
from socket import timeout
class FbxCnx: class FbxCnx:
def __init__(self,host="mafreebox.free.fr"): def __init__(self,host="mafreebox.free.fr"):
@@ -37,7 +38,35 @@ class FbxCnx:
request = Request(url,headers=headers) request = Request(url,headers=headers)
else: else:
request = Request(url) request = Request(url)
res = urlopen(request).read() res = urlopen(request,timeout=2).read()
return json.loads(res.decode())
def _put(self,method,data=None,headers=None):
url = self.host+"/api/v4/"+method
if data:
data = json.dumps(data) #On transforme en string le dict
data = data.encode() #On transforme en tableau de byte le string pour Request
if headers:
request = Request(url,data=data,headers=headers)
else:
request = Request(url, data=data)
request.get_method = lambda:"PUT"
else:
if headers:
request = Request(url,headers=headers)
else:
request = Request(url)
res = urlopen(request,timeout=2).read()
return json.loads(res.decode())
def _get(self,method,data=None,headers=None):
url = self.host+"/api/v4/"+method
if headers:
request = Request(url,headers=headers)
else:
request = Request(url)
request.get_method = lambda:"GET"
res = urlopen(request,timeout=2).read()
return json.loads(res.decode()) return json.loads(res.decode())
def _mksession(self): def _mksession(self):
@@ -49,9 +78,10 @@ class FbxCnx:
return self._com("login/session/",data)["result"]["session_token"] return self._com("login/session/",data)["result"]["session_token"]
# def _disconnect(self): # def _disconnect(self):
# result = self._com("/login/logout",None,{"X-Fbx-App-Auth": self.session}) # # result = self._com("/login/logout",None,{'Content-Type': 'application/json','X-Fbx-App-Auth': self.session})
# result = self._com("/login/logout")
# print (result) # print (result)
# return # # return
class FbxApp(FbxCnx): class FbxApp(FbxCnx):
def __init__(self,appid,token,session=None,host="mafreebox.free.fr"): def __init__(self,appid,token,session=None,host="mafreebox.free.fr"):
@@ -66,10 +96,16 @@ class FbxApp(FbxCnx):
def com(self,method,data=None): def com(self,method,data=None):
return self._com(method,data,{"X-Fbx-App-Auth": self.session}) return self._com(method,data,{"X-Fbx-App-Auth": self.session})
def put(self,method,data=None):
return self._put(method,data,{"X-Fbx-App-Auth": self.session})
def get(self,method,data=None):
return self._get(method,data,{"X-Fbx-App-Auth": self.session})
def diskinfo(self): def diskinfo(self):
listDisk = self.com( "storage/disk/")
retour = {} retour = {}
try:
listDisk = self.com( "storage/disk/")
for disk in listDisk["result"]: for disk in listDisk["result"]:
for partition in disk["partitions"]: for partition in disk["partitions"]:
label = partition["label"] label = partition["label"]
@@ -78,16 +114,26 @@ class FbxApp(FbxCnx):
percent = used/total*100 percent = used/total*100
# print(str(label)+"=>"+str(round(percent,2))+"%") # print(str(label)+"=>"+str(round(percent,2))+"%")
retour.update({str(label):str(round(percent,2))}) retour.update({str(label):str(round(percent,2))})
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
1 #on ne fait rien, on retourne une liste vide
return retour return retour
def getNameByMacAdresse(self,p_macAdresse): def getNameByMacAdresse(self,p_macAdresse):
try:
listePeriph = self.com( "lan/browser/pub/") listePeriph = self.com( "lan/browser/pub/")
for periph in listePeriph["result"]: for periph in listePeriph["result"]:
macAdresse = periph["id"] macAdresse = periph["id"]
if(("ether-"+p_macAdresse) == macAdresse): if(("ether-"+p_macAdresse) == macAdresse):
return periph["primary_name"] return periph["primary_name"]
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
return ""
def isPresenceByMacAdresse(self,p_macAdresse): def isPresenceByMacAdresse(self,p_macAdresse):
try:
listePeriph = self.com( "lan/browser/pub/") listePeriph = self.com( "lan/browser/pub/")
for periph in listePeriph["result"]: for periph in listePeriph["result"]:
macAdresse = periph["id"] macAdresse = periph["id"]
@@ -96,11 +142,16 @@ class FbxApp(FbxCnx):
active = periph["active"] active = periph["active"]
if reachable and active: if reachable and active:
return True return True
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
1 #on ne fait rien, on retourne faux
return False return False
def lanPeripherique(self): def lanPeripherique(self):
listePeriph = self.com( "lan/browser/pub/")
retour = {} retour = {}
try:
listePeriph = self.com( "lan/browser/pub/")
for periph in listePeriph["result"]: for periph in listePeriph["result"]:
name = periph["primary_name"] name = periph["primary_name"]
reachable = periph["reachable"] reachable = periph["reachable"]
@@ -108,12 +159,78 @@ class FbxApp(FbxCnx):
macAdresse = periph["id"] macAdresse = periph["id"]
if reachable and active: if reachable and active:
retour.update({macAdresse:name}) retour.update({macAdresse:name})
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
1 #on ne fait rien, on retourne une liste vide
return retour return retour
def sysinfo(self): def sysinfo(self):
sys = self.com( "system/")
retour = {} retour = {}
try:
sys = self.com( "system/")
retour.update({str('temp_cpub'):str(round(sys["result"]["temp_cpub"],2))}) retour.update({str('temp_cpub'):str(round(sys["result"]["temp_cpub"],2))})
retour.update({str('temp_sw'):str(round(sys["result"]["temp_sw"],2))}) retour.update({str('temp_sw'):str(round(sys["result"]["temp_sw"],2))})
retour.update({str('temp_cpum'):str(round(sys["result"]["temp_cpum"],2))}) retour.update({str('temp_cpum'):str(round(sys["result"]["temp_cpum"],2))})
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
1 #on ne fait rien, on retourne une liste vide
return retour return retour
def isOnWIFI(self):
try:
v_result = self.get("wifi/config/")
if(v_result["result"]["enabled"]):
return 1
else:
return 0
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('La Freebox semble indisponible : '+ error.msg)
except timeout:
return 0
def setOnOFFWifi(self, p_isPutOn):
isOn = None
if p_isPutOn:
# data = {'ap_params': {'enabled': True}}
data = {'enabled': True}
else:
# data = {'ap_params': {'enabled': False}}
data = {'enabled': False}
try:
v_result = self.put( "wifi/config/",data)
isOn = False
if True == v_result['success']:
if v_result['result']['ap_params']['enabled']:
Domoticz.Log( "Wifi is now ON")
isOn = True
else:
Domoticz.Log("Wifi is now OFF")
except (urllib.error.HTTPError, urllib.error.URLError) as error:
Domoticz.Log('setOnOFFWifi Erreur '+ error.msg)
except timeout:
if not p_isPutOn:
# If we are connected using wifi, disabling wifi will close connection
# thus PUT response will never be received: a timeout is expected
Domoticz.Log("Wifi désactivé")
return False
else:
# Forward timeout exception as should not occur
raise timeout
# Response received
# ensure status_code is 200, else raise exception
# if requests.codes.ok != r.status_code:
# raise FbxOSException("Put error: %s" % r.text)
# rc is 200 but did we really succeed?
# else:
# raise FbxOSException("Challenge failure: %s" % resp)
# self._logout()
return isOn
def reboot(self):
v_result = self.com( "system/reboot")
if not v_result['success']:
Domoticz.Log("Erreur lors du Reboot")
Domoticz.Log("Freebox Server en cours de reboot.")

View File

@@ -1,9 +1,10 @@
# Freebox Python Plugin # Freebox Python Plugin
# #
# Author: https://matdomotique.wordpress.com/ # Author: https://matdomotique.wordpress.com/
# https://matdomotique.wordpress.com/2018/03/25/plugin-freebox-pour-domoticz/
# #
""" """
<plugin key="Freebox" name="Freebox Python Plugin" author="supermat" version="1.0.0" wikilink="http://www.domoticz.com/wiki/plugins/plugin.html" externallink="https://matdomotique.wordpress.com/"> <plugin key="Freebox" name="Freebox Python Plugin" author="supermat" version="1.1.0" wikilink="http://www.domoticz.com/wiki/plugins/plugin.html" externallink="https://matdomotique.wordpress.com/2018/03/25/plugin-freebox-pour-domoticz">
<params> <params>
<param field="Address" label="URL de la Box avec http devant" width="400px" required="true" default="http://mafreebox.free.fr"/> <param field="Address" label="URL de la Box avec http devant" width="400px" required="true" default="http://mafreebox.free.fr"/>
<param field="Port" label="Port" width="100px" required="true" default="80"/> <param field="Port" label="Port" width="100px" required="true" default="80"/>
@@ -18,7 +19,7 @@
</params> </params>
</plugin> </plugin>
""" """
import Domoticz,freebox,json,os,datetime import Domoticz,freebox,json,os,datetime,time
# from data import * #Pour le debug local sinon à mettre en commentaire # from data import * #Pour le debug local sinon à mettre en commentaire
from enum import Enum from enum import Enum
@@ -27,10 +28,8 @@ class FreeboxPlugin:
deviceTypeDisk = 'DiskDevice' deviceTypeDisk = 'DiskDevice'
deviceSystemInfo = 'SystemInfoDevice' deviceSystemInfo = 'SystemInfoDevice'
devicePresence = 'PresenceDevice' devicePresence = 'PresenceDevice'
deviceCommande = 'Commande'
_fileNameDeviceMapping = 'devicemapping.json' _fileNameDeviceMapping = 'devicemapping.json'
# _deviceTypeDisk = 'DiskDevice'
# _deviceSystemInfo = 'SystemInfoDevice'
# _devicePresence = 'PresenceDevice'
enabled = False enabled = False
token = "" token = ""
freeboxURL = "http://mafreebox.free.fr" freeboxURL = "http://mafreebox.free.fr"
@@ -148,6 +147,7 @@ class FreeboxPlugin:
#Creation des device presence de la Freebox #Creation des device presence de la Freebox
listeMacString = Parameters["Mode2"] listeMacString = Parameters["Mode2"]
if(listeMacString != ""):
listeMac = listeMacString.split(";") listeMac = listeMacString.split(";")
for macAdresse in listeMac: for macAdresse in listeMac:
name = f.getNameByMacAdresse(macAdresse) name = f.getNameByMacAdresse(macAdresse)
@@ -159,6 +159,24 @@ class FreeboxPlugin:
Domoticz.Log("Création du dispositif "+"Presence "+name) Domoticz.Log("Création du dispositif "+"Presence "+name)
else: else:
Domoticz.Log("La mac adresse "+macAdresse+" est inconnu de la freebox, on ne crée aucun dispositif.") Domoticz.Log("La mac adresse "+macAdresse+" est inconnu de la freebox, on ne crée aucun dispositif.")
#Creation du device d'activation/désactivation du WIFI
v_etatWIFI = f.isOnWIFI()
Domoticz.Log("Etat WIFI : "+ str(v_etatWIFI))
keyunit = self.getOrCreateUnitIdForDevice(self.DeviceType.deviceCommande,"WIFI")
if (keyunit not in Devices):
v_dev = Domoticz.Device(Unit=keyunit, Name="WIFI On/Off", TypeName="Switch")
v_dev.Create()
Domoticz.Log("Création du dispositif "+"WIFI On/Off")
self.updateDeviceIfExist(self.DeviceType.deviceCommande,"WIFI",v_etatWIFI, str(v_etatWIFI))
#Creation du device de reboot du Freebox server
#f.reboot()
keyunit = self.getOrCreateUnitIdForDevice(self.DeviceType.deviceCommande,"REBOOT")
if (keyunit not in Devices):
v_dev = Domoticz.Device(Unit=keyunit, Name="Reboot Server", TypeName="Switch")
v_dev.Create()
Domoticz.Log("Création du dispositif "+"Reboot Server")
DumpConfigToLog() DumpConfigToLog()
def onStop(self): def onStop(self):
@@ -172,6 +190,28 @@ class FreeboxPlugin:
def onCommand(self, Unit, Command, Level, Hue): def onCommand(self, Unit, Command, Level, Hue):
Domoticz.Log("onCommand called for Unit " + str(Unit) + ": Parameter '" + str(Command) + "', Level: " + str(Level)) Domoticz.Log("onCommand called for Unit " + str(Unit) + ": Parameter '" + str(Command) + "', Level: " + str(Level))
# 2018-04-02 20:26:01.192 User: Admin initiated a switch command (17/Freebox - Presence iPhonedMatthieu/On)
# 2018-04-02 20:26:01.209 (Freebox) onCommand called for Unit 5: Parameter 'On', Level: 0
# 2018-04-02 20:27:50.550 User: Admin initiated a switch command (17/Freebox - Presence iPhonedMatthieu/Off)
# 2018-04-02 20:27:50.552 (Freebox) onCommand called for Unit 5: Parameter 'Off', Level: 0
# 2018-04-02 20:28:44.350 User: Admin initiated a switch command (18/Freebox - Presence iPhonedTiphaine/On)
# 2018-04-02 20:28:44.380 (Freebox) onCommand called for Unit 6: Parameter 'On', Level: 0
keyunit = self.getOrCreateUnitIdForDevice(self.DeviceType.deviceCommande,"WIFI")
if (keyunit == Unit):
f=freebox.FbxApp("idPluginDomoticz",self.token,host=self.freeboxURL)
if(str(Command) == "On"):
f.setOnOFFWifi(1)
else:
f.setOnOFFWifi(0)
time.sleep(1)
#On remet à jour l'état du wifi suite à la modification
v_etatWIFI = f.isOnWIFI()
self.updateDeviceIfExist(self.DeviceType.deviceCommande,"WIFI",v_etatWIFI, str(v_etatWIFI))
keyunit = self.getOrCreateUnitIdForDevice(self.DeviceType.deviceCommande,"REBOOT")
if (keyunit == Unit):
f=freebox.FbxApp("idPluginDomoticz",self.token,host=self.freeboxURL)
f.reboot()
def onNotification(self, Name, Subject, Text, Status, Priority, Sound, ImageFile): def onNotification(self, Name, Subject, Text, Status, Priority, Sound, ImageFile):
Domoticz.Log("Notification: " + Name + "," + Subject + "," + Text + "," + Status + "," + str(Priority) + "," + Sound + "," + ImageFile) Domoticz.Log("Notification: " + Name + "," + Subject + "," + Text + "," + Status + "," + str(Priority) + "," + Sound + "," + ImageFile)
@@ -211,11 +251,18 @@ class FreeboxPlugin:
for periph in lanPeriph: for periph in lanPeriph:
Domoticz.Debug(lanPeriph[periph]+" ("+periph+") présent") Domoticz.Debug(lanPeriph[periph]+" ("+periph+") présent")
v_etatWIFI = f.isOnWIFI()
self.updateDeviceIfExist(self.DeviceType.deviceCommande,"WIFI",v_etatWIFI, str(v_etatWIFI))
global _plugin global _plugin
_plugin = FreeboxPlugin() _plugin = FreeboxPlugin()
def onStart(): def onStart():
global _plugin global _plugin
# on fait une pause de 10 secondes au démarrage pour attendre la Freebox si besoin
# correction apporté par Gells qui avait des erreur au démarrage
#https://easydomoticz.com/forum/viewtopic.php?f=10&t=6222&p=55468#p55442
time.sleep(5)
_plugin.onStart() _plugin.onStart()
def onStop(): def onStop():