Skip to content

Commit f840914

Browse files
committed
Implement LED control (fixes #20)
1 parent 2b7666e commit f840914

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

tests/test_application.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ async def callback(request):
8888
if callback.called:
8989
return
9090

91-
callback.called = True
91+
callback.called = request
9292

9393
for response in responses:
9494
await asyncio.sleep(0.001)
@@ -99,7 +99,7 @@ async def callback(request):
9999
else:
100100
self.send(response)
101101

102-
called_future.set_result(True)
102+
called_future.set_result(request)
103103

104104
callback.called = False
105105
self.callback_for_response(request, lambda r: asyncio.create_task(callback(r)))
@@ -402,6 +402,24 @@ async def test_application_startup_tx_power(application):
402402
await set_tx_power
403403

404404

405+
@pytest_mark_asyncio_timeout(seconds=3)
406+
async def test_application_startup_led_mode(application):
407+
app, znp_server = application
408+
409+
set_led_mode = znp_server.reply_once_to(
410+
request=c.Util.LEDControl.Req(partial=True),
411+
responses=[c.Util.LEDControl.Rsp(Status=t.Status.SUCCESS)],
412+
)
413+
414+
app.update_config({conf.CONF_ZNP_CONFIG: {conf.CONF_LED_MODE: "off"}})
415+
416+
await app.startup(auto_form=False)
417+
led_req = await set_led_mode
418+
419+
assert led_req.Mode == c.util.LEDMode.OFF
420+
assert led_req.LED == 0xFF
421+
422+
405423
@pytest_mark_asyncio_timeout(seconds=3)
406424
async def test_permit_join(application):
407425
app, znp_server = application

zigpy_znp/commands/util.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ class RandomNumbers(t.FixedList, item_type=t.uint8_t, length=0x64):
2525
pass
2626

2727

28+
class LEDMode(t.enum_uint8):
29+
OFF = 0
30+
ON = 1
31+
BLINK = 2
32+
FLASH = 3
33+
TOGGLE = 4
34+
35+
2836
class Util(t.CommandsBase, subsystem=t.Subsystem.UTIL):
2937
# MAC Reset command to reset MAC state machine
3038
GetDeviceInfo = t.CommandDef(
@@ -189,8 +197,8 @@ class Util(t.CommandsBase, subsystem=t.Subsystem.UTIL):
189197
0x0A,
190198
req_schema=t.Schema(
191199
(
192-
t.Param("Laded", t.uint8_t, "The LED number"),
193-
t.Param("On", t.Bool, "True -- On, False -- Off"),
200+
t.Param("LED", t.uint8_t, "The LED number. 0xFF for all."),
201+
t.Param("Mode", LEDMode, "LED mode. ON/OFF are static."),
194202
)
195203
),
196204
rsp_schema=t.STATUS_SCHEMA,

zigpy_znp/config.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import numbers
33

44
import voluptuous as vol
5+
6+
from zigpy_znp.commands.util import LEDMode
57
from zigpy.config import ( # noqa: F401
68
CONFIG_SCHEMA,
79
SCHEMA_DEVICE,
@@ -36,11 +38,22 @@
3638
)
3739

3840

41+
def EnumValue(enum, transformer=str):
42+
def validator(v):
43+
if isinstance(v, enum):
44+
return v
45+
46+
return enum[transformer(v)]
47+
48+
return validator
49+
50+
3951
CONF_ZNP_CONFIG = "znp_config"
4052
CONF_TX_POWER = "tx_power"
53+
CONF_LED_MODE = "led_mode"
54+
CONF_SKIP_BOOTLOADER = "skip_bootloader"
4155
CONF_SREQ_TIMEOUT = "sync_request_timeout"
4256
CONF_AUTO_RECONNECT_RETRY_DELAY = "auto_reconnect_retry_delay"
43-
CONF_SKIP_BOOTLOADER = "skip_bootloader"
4457

4558
CONFIG_SCHEMA = CONFIG_SCHEMA.extend(
4659
{
@@ -55,6 +68,9 @@
5568
CONF_AUTO_RECONNECT_RETRY_DELAY, default=5
5669
): VolPositiveNumber,
5770
vol.Optional(CONF_SKIP_BOOTLOADER, default=True): cv_boolean,
71+
vol.Optional(CONF_LED_MODE, default=None): vol.Any(
72+
None, EnumValue(LEDMode, lambda v: str(v).upper())
73+
),
5874
}
5975
),
6076
}

zigpy_znp/zigbee/application.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ async def startup(self, auto_form=False):
354354
c.SYS.SetTxPower.Req(TXPower=dbm), RspStatus=t.Status.SUCCESS
355355
)
356356

357+
if self.config[conf.CONF_ZNP_CONFIG][conf.CONF_LED_MODE] is not None:
358+
led_mode = self.config[conf.CONF_ZNP_CONFIG][conf.CONF_LED_MODE]
359+
360+
await self._znp.request(
361+
c.Util.LEDControl.Req(LED=0xFF, Mode=led_mode),
362+
RspStatus=t.Status.SUCCESS,
363+
)
364+
357365
device_info = await self._znp.request(
358366
c.Util.GetDeviceInfo.Req(), RspStatus=t.Status.SUCCESS
359367
)

0 commit comments

Comments
 (0)