Skip to content

Commit

Permalink
feat: power toggle, dimmer, trigger commands
Browse files Browse the repository at this point in the history
- implement power toggle in driver, based on current power state
- support dimmer commands
- support trigger 1 & 2 on / off commands
  • Loading branch information
zehnm committed Jun 14, 2024
1 parent e9eb781 commit dacf304
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 95 deletions.
100 changes: 26 additions & 74 deletions intg-denonavr/avr.py
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,13 @@ async def power_off(self) -> ucapi.StatusCodes:
if not self._use_telnet:
self._set_expected_state(States.OFF)

@async_handle_denonlib_errors
async def power_toggle(self) -> ucapi.StatusCodes:
"""Send power-on or -off command to AVR based on current power state."""
if self._receiver.power is not None and self._receiver.power == "ON":
await self.power_off()
await self.power_on()

@async_handle_denonlib_errors
async def set_volume_level(self, volume: float | None) -> ucapi.StatusCodes:
"""Set volume level, range 0..100."""
Expand Down Expand Up @@ -732,119 +739,55 @@ async def select_sound_mode(self, sound_mode: str | None) -> ucapi.StatusCodes:
return ucapi.StatusCodes.BAD_REQUEST
await self._receiver.async_set_sound_mode(sound_mode)

@async_handle_denonlib_errors
async def cursor_up(self) -> ucapi.StatusCodes:
"""Send cursor up command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNCUP")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNCUP")
return await self.send_command("MNCUP")

@async_handle_denonlib_errors
async def cursor_down(self) -> ucapi.StatusCodes:
"""Send cursor down command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNCDN")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNCDN")
return await self.send_command("MNCDN")

@async_handle_denonlib_errors
async def cursor_left(self) -> ucapi.StatusCodes:
"""Send cursor left command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNCLT")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNCLT")
return await self.send_command("MNCLT")

@async_handle_denonlib_errors
async def cursor_right(self) -> ucapi.StatusCodes:
"""Send cursor right command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNCRT")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNCRT")
return await self.send_command("MNCRT")

@async_handle_denonlib_errors
async def cursor_enter(self) -> ucapi.StatusCodes:
"""Send cursor enter command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNENT")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNENT")
return await self.send_command("MNENT")

@async_handle_denonlib_errors
async def info(self) -> ucapi.StatusCodes:
"""Send info OSD command command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNINF")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNINF")
return await self.send_command("MNINF")

@async_handle_denonlib_errors
async def options(self) -> ucapi.StatusCodes:
"""Send options menu command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNOPT")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNOPT")
return await self.send_command("MNOPT")

@async_handle_denonlib_errors
async def output_monitor_1(self) -> ucapi.StatusCodes:
"""Send set HDMI monitor out 1 command to AVR."""
if self._use_telnet:
await self._receiver.async_send_telnet_commands("VSMONI1")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?VSMONI1")

@async_handle_denonlib_errors
async def output_monitor_2(self) -> ucapi.StatusCodes:
"""Send set HDMI monitor out 2 command to AVR."""
if self._use_telnet:
await self._receiver.async_send_telnet_commands("VSMONI2")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?VSMONI2")

@async_handle_denonlib_errors
async def output_monitor_auto(self) -> ucapi.StatusCodes:
"""Send set HDMI monitor automatic detection command to AVR."""
if self._use_telnet:
await self._receiver.async_send_telnet_commands("VSMONIAUTO")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?VSMONIAUTO")

@async_handle_denonlib_errors
async def back(self) -> ucapi.StatusCodes:
"""Send back command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNRTN")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNRTN")
return await self.send_command("MNRTN")

@async_handle_denonlib_errors
async def setup_open(self) -> ucapi.StatusCodes:
"""Send open setup menu command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNMEN ON")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNMEN%20ON")
return await self.send_command("MNMEN ON")

@async_handle_denonlib_errors
async def setup_close(self) -> ucapi.StatusCodes:
"""Send close menu command to AVR."""
# TODO : to be updated when PR will be released https://github.com/ol-iver/denonavr/pull/290
if self._use_telnet:
await self._receiver.async_send_telnet_commands("MNMEN OFF")
else:
await self._receiver.async_get_command(AVR_COMMAND_URL + "?MNMEN%20OFF")
return await self.send_command("MNMEN OFF")

@async_handle_denonlib_errors
async def setup(self) -> ucapi.StatusCodes:
Expand All @@ -857,6 +800,15 @@ async def setup(self) -> ucapi.StatusCodes:
else:
await self.setup_open()

@async_handle_denonlib_errors
async def send_command(self, cmd: str) -> ucapi.StatusCodes:
"""Send a command to the AVR."""
if self._use_telnet:
await self._receiver.async_send_telnet_commands(cmd)
else:
url = AVR_COMMAND_URL + "?" + cmd.replace(" ", "%20")
await self._receiver.async_get_command(url)

def _increase_expected_volume(self):
"""Without telnet, increase expected volume and send update event."""
if not self._use_telnet or self._expected_volume is None:
Expand Down
41 changes: 20 additions & 21 deletions intg-denonavr/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"""

import logging
from enum import Enum
from typing import Any

import avr
Expand Down Expand Up @@ -34,15 +33,20 @@
}


class SimpleCommands(str, Enum):
"""Additional simple commands of the Denon AVR not covered by media-player features."""

OUTPUT_1 = "OUTPUT_1"
"""Set HDMI monitor out 1."""
OUTPUT_2 = "OUTPUT_2"
"""Set HDMI monitor out 2."""
OUTPUT_AUTO = "OUTPUT_AUTO"
"""Set HDMI monitor automatic detection."""
SimpleCommandMappings = {
"OUTPUT_1": "VSMONI1",
"OUTPUT_2": "VSMONI2",
"OUTPUT_AUTO": "VSMONIAUTO",
"DIMMER_TOGGLE": "DIM SEL",
"DIMMER_BRIGHT": "DIM BRI",
"DIMMER_DIM": "DIM DIM",
"DIMMER_DARK": "DIM DAR",
"DIMMER_OFF": "DIM OFF",
"TRIGGER1_ON": "TR1 ON",
"TRIGGER1_OFF": "TR1 OFF",
"TRIGGER2_ON": "TR2 ON",
"TRIGGER2_OFF": "TR2 OFF",
}


class DenonMediaPlayer(MediaPlayer):
Expand All @@ -55,6 +59,7 @@ def __init__(self, device: AvrDevice, receiver: avr.DenonDevice):
entity_id = create_entity_id(receiver.id, EntityTypes.MEDIA_PLAYER)
features = [
Features.ON_OFF,
Features.TOGGLE,
Features.VOLUME,
Features.VOLUME_UP_DOWN,
Features.MUTE_TOGGLE,
Expand Down Expand Up @@ -89,11 +94,7 @@ def __init__(self, device: AvrDevice, receiver: avr.DenonDevice):
attributes[Attributes.SOUND_MODE] = ""
attributes[Attributes.SOUND_MODE_LIST] = []

self.simple_commands = [
SimpleCommands.OUTPUT_1.value,
SimpleCommands.OUTPUT_2.value,
SimpleCommands.OUTPUT_AUTO.value,
]
self.simple_commands = [*SimpleCommandMappings]

options = {Options.SIMPLE_COMMANDS: self.simple_commands}

Expand Down Expand Up @@ -141,6 +142,8 @@ async def command(self, cmd_id: str, params: dict[str, Any] | None = None) -> St
res = await self._receiver.power_on()
case Commands.OFF:
res = await self._receiver.power_off()
case Commands.TOGGLE:
res = await self._receiver.power_toggle()
case Commands.SELECT_SOURCE:
res = await self._receiver.select_source(params.get("source"))
case Commands.SELECT_SOUND_MODE:
Expand All @@ -163,12 +166,8 @@ async def command(self, cmd_id: str, params: dict[str, Any] | None = None) -> St
res = await self._receiver.options()
case Commands.INFO:
res = await self._receiver.info()
case SimpleCommands.OUTPUT_1:
res = await self._receiver.output_monitor_1()
case SimpleCommands.OUTPUT_2:
res = await self._receiver.output_monitor_2()
case SimpleCommands.OUTPUT_AUTO:
res = await self._receiver.output_monitor_auto()
case cmd if cmd in SimpleCommandMappings:
res = await self._receiver.send_command(SimpleCommandMappings[cmd])
case _:
return StatusCodes.NOT_IMPLEMENTED

Expand Down

0 comments on commit dacf304

Please sign in to comment.