Skip to content
This repository has been archived by the owner on Feb 4, 2024. It is now read-only.

Pyhomematic/add/ipw key blind multi #318

Merged
32 changes: 25 additions & 7 deletions pyhomematic/_hm.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ def __init__(self,
# them in self._devices and self._devices_all
self.createDeviceObjects(interface_id)

def createDeviceObjects(self, interface_id):
def createDeviceObjects(self, interface_id, skip_systemcallback=False):
"""Transform the raw device descriptions into instances of devicetypes.generic.HMDevice or availabe subclass."""
global WORKING
WORKING = True
Expand Down Expand Up @@ -220,7 +220,7 @@ def createDeviceObjects(self, interface_id):
if self.devices_all[remote] and self.remotes[remote].get('resolvenames', False):
self.addDeviceNames(remote)
WORKING = False
if self.systemcallback:
if self.systemcallback and not skip_systemcallback:
self.systemcallback('createDeviceObjects')
return True

Expand Down Expand Up @@ -282,9 +282,15 @@ def listDevices(self, interface_id):
self._devices_raw[remote] = []
if self.systemcallback:
self.systemcallback('listDevices', interface_id)
return self._devices_raw[remote]

def newDevices(self, interface_id, dev_descriptions):

if len(self._devices_raw[remote]) > 2:
danielperna84 marked this conversation as resolved.
Show resolved Hide resolved
return []
# return self._devices_raw[remote][:2]
else:
return self._devices_raw[remote]

def newDevices(self, interface_id, dev_descriptions, skip_systemcallback=False):
"""The CCU / Homegear informs us about newly added devices. We react on that and add those devices as well."""
LOG.debug("RPCFunctions.newDevices: interface_id = %s, dev_descriptions = %s" % (
interface_id, str(dev_descriptions)))
Expand All @@ -295,14 +301,19 @@ def newDevices(self, interface_id, dev_descriptions):
self._devices_raw_dict[remote] = {}
if remote not in self._paramsets:
self._paramsets[remote] = {}
if self._devices_raw[remote] != []:
if self.systemcallback:
self.systemcallback('createDeviceObjects')
self.systemcallback('newDevices', interface_id, dev_descriptions)
return True
for d in dev_descriptions:
self._devices_raw[remote].append(d)
self._devices_raw_dict[remote][d['ADDRESS']] = d
self._paramsets[remote][d['ADDRESS']] = {}
self.saveDevices(remote)
self.saveParamsets(remote)
self.createDeviceObjects(interface_id)
if self.systemcallback:
self.createDeviceObjects(interface_id, skip_systemcallback)
if self.systemcallback and not skip_systemcallback:
self.systemcallback('newDevices', interface_id, dev_descriptions)
return True

Expand Down Expand Up @@ -522,7 +533,6 @@ def __getattr__(self, *args, **kwargs):
"""
Magic method dispatcher
"""

return xmlrpc.client._Method(self.__request, *args, **kwargs)

# Restrict to particular paths.
Expand Down Expand Up @@ -593,6 +603,7 @@ def __init__(self,
self.server.register_instance(
self._rpcfunctions, allow_dotted_names=True)


def run(self):
LOG.info("Starting server at http://%s:%i" %
(self._local, self._localport))
Expand Down Expand Up @@ -669,14 +680,21 @@ def proxyInit(self):
LOG.debug("ServerThread.proxyInit: init('http://%s:%i', '%s')" %
(callbackip, callbackport, interface_id))
try:
# at least for home ip, init ccu is not working. Read list devices before "init proxy"
if interface_id == "homeassistant-HMIP":
danielperna84 marked this conversation as resolved.
Show resolved Hide resolved
dev_list = proxy.listDevices(interface_id)
self._rpcfunctions.newDevices(interface_id=interface_id, dev_descriptions=dev_list, skip_systemcallback=True)

proxy.init("http://%s:%i" %
(callbackip, callbackport), interface_id)
LOG.info("Proxy for %s initialized", interface_id)

except Exception as err:
LOG.debug("proxyInit: Exception: %s" % str(err))
LOG.warning("Failed to initialize proxy for %s", interface_id)
self.failed_inits.append(interface_id)


def proxyDeInit(self):
"""De-Init from the proxies."""
stopped = []
Expand Down