Esempio n. 1
0
    def onHeartbeat(self):
        Domoticz.Debug("onHeartbeat called")
        if not self.ip:
            return
        url = 'http://' +self.ip + "/DEV_device_info.htm"

        Domoticz.Debug("url to check : %s" %url)
        try:
            if self.session:
                r = self.session.get( url )
            else:
                r = requests.get(url, auth=HTTPBasicAuth(self.username, self.password))
            r.raise_for_status()
            
        except requests.exceptions.TooManyRedirects:
            Domoticz.Errors("URL was bad. %s" %url)
            return
        
        except requests.exceptions.ConnectionError as errc:
            Domoticz.Log("Error Connecting: %s - %s" %(url, errc))
            return
        
        except requests.exceptions.HTTPError as err:
            Domoticz.Error("Error on requests(%s): %s" %(url, err))
            return
        
        except requests.exceptions.Timeout:
            Domoticz.Error("Timeout on requests(%s)" %url)
            return
        
        except requests.exceptions.RequestException as e:
            Domoticz.Log("Catastophic error. %url - %s" %(url, e))

        if len(r.text) < 200:
            Domoticz.Error("response seems too short: %s - %s" %(url, r.text))
            return

        lines = r.text.split('\n')
        Domoticz.Debug("lines: %s" %lines)

        if len(lines) < 2:
            Domoticz.Error("Unexpected value (too short)) for lines: %s" %lines)
            return

        device = lines[1].split('=')
        if len(device) < 2:
            Domoticz.Error("Unexpected value (too short)) for device: %s" %device)
            return

        Domoticz.Debug("lines: %s" %lines)
        Domoticz.Debug("device: %s" %device)
        try:
            json_orbi = json.loads(device[1])
        except:
            Domoticz.Debug("looks like something went wrong with json.loads(%): device: %s" %device[1])
            return

        cnt = 0
        dico_orbi = {}
        for iter in json_orbi:
            dico_orbi[cnt] = {}
            dico_orbi[cnt] = iter
            cnt += 1

        mac_presence = []
        for iter in dico_orbi:
            if dico_orbi[iter]['mac'] in self.macs:
                mac_presence.append(format_mac(dico_orbi[iter]['mac']))
        Domoticz.Log('MAC@ present are : %s' %mac_presence)
        oneOn = False
        for iterDev in Devices:
            if iterDev == 1: continue
            if Devices[iterDev].DeviceID in mac_presence:
                oneOn = True
                Domoticz.Log('%s is at home' %Devices[iterDev].Name)
                if Devices[iterDev].sValue != 'On':
                    Devices[iterDev].Update(nValue=1, sValue='On')
            else:
                Domoticz.Log('%s is away' %Devices[iterDev].Name)
                if Devices[iterDev].sValue != 'Off':
                    Devices[iterDev].Update(nValue=0, sValue='Off')

        Domoticz.Log("@Home: %s %s, oneOn: %s" %(Devices[1].nValue, Devices[1].sValue, oneOn))

        if oneOn:
            if Devices[1].sValue != 'On':
                Domoticz.Log("Update Anyone@Home to On")
                Devices[1].Update(nValue=1, sValue='On')
        else:
            if Devices[1].sValue != 'Off':
                Domoticz.Log("Update Anyone@Home to Off")
                Devices[1].Update(nValue=0, sValue='Off')