Skip to content

Commit 823f5b5

Browse files
authored
Trigger scenes (#161)
* Add scene triggering on and off * Fix issue with cleanup messages for dimmer devices * Fix issue with thermostat mode value
1 parent 353402b commit 823f5b5

File tree

5 files changed

+81
-18
lines changed

5 files changed

+81
-18
lines changed

insteonplm/devices/__init__.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -592,18 +592,13 @@ def _handle_device_info_response(self, msg):
592592
self._device_info_queue.put_nowait(msg)
593593

594594
def _handle_all_link_complete(self, msg):
595-
if msg and msg.group == 0 and msg.linkcode == 0x01:
596-
# IM is controller of group 1
597-
# Set up other needed links
598-
self.aldb.add_loaded_callback(self.create_default_links)
599-
600-
last_record = None
601-
for mem_addr in self.aldb:
602-
aldb_rec = self.aldb[mem_addr]
603-
if aldb_rec.control_flags.is_high_water_mark:
604-
last_record = mem_addr
605-
if last_record:
606-
self.aldb.pop(last_record)
595+
# Not ready for prime time
596+
# if msg and msg.group == 0 and msg.linkcode == 0x01:
597+
# # IM is controller of group 1
598+
# # Set up other needed links
599+
# self.aldb.add_loaded_callback(self.create_default_links)
600+
601+
self._aldb.remove_unused()
607602
self.read_aldb()
608603

609604
def _register_messages(self):
@@ -1262,6 +1257,16 @@ def clear(self):
12621257
"""Remove all records."""
12631258
self._records.clear()
12641259

1260+
def remove_unused(self):
1261+
"""Remove All-Link records marked as not in use."""
1262+
unused = []
1263+
for mem_addr in self._records:
1264+
rec = self._records[mem_addr]
1265+
if rec.control_flags.is_available:
1266+
unused.append(mem_addr)
1267+
for mem_addr in unused:
1268+
self._records.pop(mem_addr)
1269+
12651270
# pylint: disable=too-many-locals
12661271
def write_record(self, mem_addr: int, mode: str, group: int, target,
12671272
data1=0x00, data2=0x00, data3=0x00):

insteonplm/plm.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,13 +333,69 @@ async def close(self):
333333
await self.pause_writing()
334334
await asyncio.sleep(0, loop=self._loop)
335335

336+
def trigger_group_on(self, group):
337+
"""Trigger an All-Link Group on."""
338+
from .messages.standardSend import StandardSend
339+
from .constants import COMMAND_LIGHT_ON_0X11_NONE
340+
target = Address(bytearray([0x00, 0x00, group]))
341+
flags = 0xc0
342+
msg = StandardSend(target, COMMAND_LIGHT_ON_0X11_NONE,
343+
cmd2=0xff, flags=flags)
344+
self.send_msg(msg)
345+
dev_list = self._find_scene(group)
346+
_LOGGER.debug('Scene %d turned on', group)
347+
for addr in dev_list:
348+
device = self._devices[addr.id]
349+
if hasattr(device, 'async_refresh_state'):
350+
_LOGGER.debug('Checking status of device %s', addr.human)
351+
device.async_refresh_state()
352+
353+
def trigger_group_off(self, group):
354+
"""Trigger an All-Link Group off."""
355+
from .messages.standardSend import StandardSend
356+
from .constants import COMMAND_LIGHT_OFF_0X13_0X00
357+
target = Address(bytearray([0x00, 0x00, group]))
358+
flags = 0xc0
359+
msg = StandardSend(target, COMMAND_LIGHT_OFF_0X13_0X00, flags=flags)
360+
self.send_msg(msg)
361+
dev_list = self._find_scene(group)
362+
_LOGGER.debug('Scene %d turned off', group)
363+
for addr in dev_list:
364+
device = self._devices[addr.id]
365+
if hasattr(device, 'async_refresh_state'):
366+
_LOGGER.debug('Checking status of device %s', addr.human)
367+
device.async_refresh_state()
368+
369+
def _find_scene(self, group):
370+
"""Identify all devices that are part of a scene."""
371+
device_list = []
372+
for rec_num in self._aldb:
373+
rec = self._aldb[rec_num]
374+
_LOGGER.debug('Checking record for scene: %s', rec)
375+
if (rec.control_flags.is_controller and rec.group == group):
376+
if rec.address not in device_list:
377+
device_list.append(rec.address)
378+
for addr in self._devices:
379+
device = self._devices[addr]
380+
aldb = device.aldb
381+
for mem_addr in aldb:
382+
rec = aldb[mem_addr]
383+
_LOGGER.debug('Checking record for scene: %s', rec)
384+
if (rec.control_flags.is_in_use and
385+
rec.group == group and
386+
rec.address == self._address):
387+
if rec.address not in device_list:
388+
device_list.append(device.address)
389+
return device_list
390+
336391
async def _setup_devices(self):
337392
await self.devices.load_saved_device_info()
338393
_LOGGER.debug('Found %d saved devices',
339394
len(self.devices.saved_devices))
340395
self._get_plm_info()
341396
self.devices.add_known_devices(self)
342397

398+
# Comment out the following lines for testing
343399
if self._load_aldb:
344400
self._load_all_link_database()
345401
else:

insteonplm/states/dimmable.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,13 @@ def _register_messages(self):
145145
cmd2=None)
146146

147147
self._message_callbacks.add(template_on_cleanup,
148-
self._on_message_received)
148+
self._manual_change_received)
149149
self._message_callbacks.add(template_on_fast_cleanup,
150-
self._on_message_received)
150+
self._manual_change_received)
151151
self._message_callbacks.add(template_off_cleanup,
152-
self._off_message_received)
152+
self._manual_change_received)
153153
self._message_callbacks.add(template_off_fast_cleanup,
154-
self._off_message_received)
154+
self._manual_change_received)
155155
self._message_callbacks.add(template_manual_cleanup,
156156
self._manual_change_received)
157157
self._message_callbacks.add(template_instant_cleanup,

insteonplm/states/thermostat.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ def _status_received(self, msg):
193193
def _ext_status_received(self, msg):
194194
sysmode = msg.userdata['d6']
195195
ext_mode = sysmode >> 4
196+
mode = None
196197
if ext_mode == 0:
197198
mode = ThermostatMode.OFF
198199
elif ext_mode == 1:
@@ -201,7 +202,8 @@ def _ext_status_received(self, msg):
201202
mode = ThermostatMode.HEAT
202203
elif ext_mode == 3:
203204
mode = ThermostatMode.COOL
204-
self._update_subscribers(mode)
205+
if mode is not None:
206+
self._update_subscribers(mode)
205207

206208
def _register_messages(self):
207209
mode_status_msg = StandardReceive.template(

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def readme():
1111

1212
setup(
1313
name='insteonplm',
14-
version='0.15.4',
14+
version='0.16.0',
1515
author='David McNett',
1616
author_email='[email protected]',
1717
url='https://github.com/nugget/python-insteonplm',

0 commit comments

Comments
 (0)