denonavr 1.2.0__py3-none-any.whl → 1.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
denonavr/decorators.py CHANGED
@@ -9,7 +9,6 @@ This module implements the REST API to Denon AVR receivers.
9
9
 
10
10
  import inspect
11
11
  import logging
12
- import time
13
12
  from functools import wraps
14
13
  from typing import Callable, TypeVar
15
14
 
@@ -64,7 +63,7 @@ def cache_result(func: Callable[..., AnyT]) -> Callable[..., AnyT]:
64
63
  """
65
64
  Decorate a function to cache its results with an lru_cache of maxsize 32.
66
65
 
67
- This decorator also sets an "cache_id" keyword argument if it is not set yet.
66
+ The cache is only used if the "cache_id" keyword argument is set.
68
67
  """
69
68
  if inspect.signature(func).parameters.get("cache_id") is None:
70
69
  raise AttributeError(
@@ -77,7 +76,7 @@ def cache_result(func: Callable[..., AnyT]) -> Callable[..., AnyT]:
77
76
  @wraps(func)
78
77
  async def wrapper(*args, **kwargs):
79
78
  if kwargs.get("cache_id") is None:
80
- kwargs["cache_id"] = time.time()
79
+ return await func(*args, **kwargs)
81
80
 
82
81
  return await cached_func(*args, **kwargs)
83
82
 
denonavr/denonavr.py CHANGED
@@ -17,6 +17,7 @@ import httpx
17
17
 
18
18
  from .audyssey import DenonAVRAudyssey, audyssey_factory
19
19
  from .const import (
20
+ AVR_X,
20
21
  DENON_ATTR_SETATTR,
21
22
  MAIN_ZONE,
22
23
  VALID_ZONES,
@@ -24,17 +25,21 @@ from .const import (
24
25
  AutoStandbys,
25
26
  BluetoothOutputModes,
26
27
  DimmerModes,
28
+ DynamicVolumeSettings,
27
29
  EcoModes,
28
30
  HDMIAudioDecodes,
29
31
  HDMIOutputs,
30
32
  Illuminations,
33
+ InputModes,
34
+ MultiEQModes,
31
35
  PanelLocks,
36
+ ReferenceLevelOffsets,
32
37
  RoomSizes,
33
38
  TransducerLPFs,
34
39
  VideoProcessingModes,
35
40
  )
36
41
  from .dirac import DenonAVRDirac, dirac_factory
37
- from .exceptions import AvrCommandError
42
+ from .exceptions import AvrCommandError, AvrForbiddenError, AvrIncompleteResponseError
38
43
  from .foundation import DenonAVRFoundation, set_api_host, set_api_timeout
39
44
  from .input import DenonAVRInput, input_factory
40
45
  from .soundmode import DenonAVRSoundMode, sound_mode_factory
@@ -85,7 +90,7 @@ class DenonAVR(DenonAVRFoundation):
85
90
  _timeout: float = attr.ib(
86
91
  converter=float, on_setattr=[*DENON_ATTR_SETATTR, set_api_timeout], default=2.0
87
92
  )
88
- _zones: Dict[str, DenonAVRFoundation] = attr.ib(
93
+ _zones: Dict[str, "DenonAVR"] = attr.ib(
89
94
  validator=attr.validators.deep_mapping(
90
95
  attr.validators.in_(VALID_ZONES),
91
96
  attr.validators.instance_of(DenonAVRFoundation),
@@ -95,6 +100,7 @@ class DenonAVR(DenonAVRFoundation):
95
100
  init=False,
96
101
  )
97
102
  _setup_lock: asyncio.Lock = attr.ib(default=attr.Factory(asyncio.Lock))
103
+ _allow_recovery: bool = attr.ib(converter=bool, default=True, init=True)
98
104
  audyssey: DenonAVRAudyssey = attr.ib(
99
105
  validator=attr.validators.instance_of(DenonAVRAudyssey),
100
106
  default=attr.Factory(audyssey_factory, takes_self=True),
@@ -194,23 +200,46 @@ class DenonAVR(DenonAVRFoundation):
194
200
  # Create a cache id for this global update
195
201
  cache_id = time.time()
196
202
 
197
- # Verify update method
198
- _LOGGER.debug("Verifying update method")
199
- await self._device.async_verify_avr_2016_update_method(cache_id=cache_id)
203
+ try:
204
+ # Update device
205
+ await self._device.async_update(global_update=True, cache_id=cache_id)
206
+
207
+ # Update other functions
208
+ await self.input.async_update(global_update=True, cache_id=cache_id)
209
+ await self.soundmode.async_update(global_update=True, cache_id=cache_id)
210
+ await self.tonecontrol.async_update(global_update=True, cache_id=cache_id)
211
+ await self.vol.async_update(global_update=True, cache_id=cache_id)
212
+ except AvrForbiddenError:
213
+ # Recovery in case receiver changes port from 80 to 8080 which
214
+ # might happen at Denon AVR-X 2016 receivers
215
+ if self._device.use_avr_2016_update and self._allow_recovery:
216
+ self._allow_recovery = False
217
+ _LOGGER.warning(
218
+ "AppCommand.xml returns HTTP status 403. Running setup"
219
+ " again once to check if receiver interface switched "
220
+ "ports"
221
+ )
222
+ self._is_setup = False
223
+ await self.async_update()
224
+ else:
225
+ raise
226
+ except AvrIncompleteResponseError:
227
+ # Use status XML interface if Appcommand.xml returns an incomplete result
228
+ # Only AVR_X devices support both interfaces
229
+ if self._device.use_avr_2016_update and self._device.receiver == AVR_X:
230
+ _LOGGER.warning(
231
+ "Error verifying Appcommand.xml update method, it returns "
232
+ "an incomplete result set. Deactivating the interface"
233
+ )
234
+ self._device.use_avr_2016_update = False
235
+ await self.async_update()
236
+ else:
237
+ raise
238
+ else:
239
+ if not self._allow_recovery:
240
+ self._allow_recovery = True
241
+ _LOGGER.info("AppCommand.xml recovered from HTTP status 403 error")
200
242
 
201
- # Update device
202
- await self._device.async_update(global_update=True, cache_id=cache_id)
203
-
204
- # Update other functions
205
- await self.input.async_update(global_update=True, cache_id=cache_id)
206
- await self.soundmode.async_update(global_update=True, cache_id=cache_id)
207
- await self.tonecontrol.async_update(global_update=True, cache_id=cache_id)
208
- await self.vol.async_update(global_update=True, cache_id=cache_id)
209
-
210
- # AppCommand0300.xml interface is very slow, thus it is not included
211
- # into main update
212
- # await self.audyssey.async_update(
213
- # global_update=True, cache_id=cache_id)
214
243
  _LOGGER.debug("Finished denonavr update")
215
244
 
216
245
  async def async_update_tonecontrol(self):
@@ -320,7 +349,7 @@ class DenonAVR(DenonAVRFoundation):
320
349
  return self.input.state
321
350
 
322
351
  @property
323
- def muted(self) -> bool:
352
+ def muted(self) -> Optional[bool]:
324
353
  """
325
354
  Boolean if volume is currently muted.
326
355
 
@@ -329,7 +358,7 @@ class DenonAVR(DenonAVRFoundation):
329
358
  return self.vol.muted
330
359
 
331
360
  @property
332
- def volume(self) -> float:
361
+ def volume(self) -> Optional[float]:
333
362
  """
334
363
  Return volume of Denon AVR as float.
335
364
 
@@ -432,7 +461,7 @@ class DenonAVR(DenonAVRFoundation):
432
461
  return self.input.playing_func_list
433
462
 
434
463
  @property
435
- def receiver_port(self) -> int:
464
+ def receiver_port(self) -> Optional[int]:
436
465
  """Return the receiver's port."""
437
466
  if self._device.receiver is None:
438
467
  return None
@@ -540,8 +569,6 @@ class DenonAVR(DenonAVRFoundation):
540
569
  """
541
570
  Returns the dimmer state of the device.
542
571
 
543
- Only available if using Telnet.
544
-
545
572
  Possible values are: "Off", "Dark", "Dim" and "Bright"
546
573
  """
547
574
  return self._device.dimmer
@@ -551,9 +578,7 @@ class DenonAVR(DenonAVRFoundation):
551
578
  """
552
579
  Return the auto-standby state of the device.
553
580
 
554
- Only available if using Telnet.
555
-
556
- Possible values are: "OFF", "15M", "30M", "60M"
581
+ Possible values are: "OFF", "15M", "30M", "60M", "2H", "4H", "8H"
557
582
  """
558
583
  return self._device.auto_standby
559
584
 
@@ -582,8 +607,6 @@ class DenonAVR(DenonAVRFoundation):
582
607
  """
583
608
  Returns the eco-mode for the device.
584
609
 
585
- Only available if using Telnet.
586
-
587
610
  Possible values are: "Off", "On", "Auto"
588
611
  """
589
612
  return self._device.eco_mode
@@ -622,7 +645,7 @@ class DenonAVR(DenonAVRFoundation):
622
645
  return self._device.video_processing_mode
623
646
 
624
647
  @property
625
- def tactile_transducer(self) -> Optional[bool]:
648
+ def tactile_transducer(self) -> Optional[str]:
626
649
  """
627
650
  Return the tactile transducer state of the device.
628
651
 
@@ -660,7 +683,7 @@ class DenonAVR(DenonAVRFoundation):
660
683
  return self._device.room_size
661
684
 
662
685
  @property
663
- def triggers(self) -> Dict[int, str]:
686
+ def triggers(self) -> Optional[Dict[int, str]]:
664
687
  """
665
688
  Return the triggers and their statuses for the device.
666
689
 
@@ -799,15 +822,15 @@ class DenonAVR(DenonAVRFoundation):
799
822
  """Toggle DynamicEQ."""
800
823
  await self.audyssey.async_toggle_dynamic_eq()
801
824
 
802
- async def async_set_multieq(self, value: str) -> None:
825
+ async def async_set_multieq(self, value: MultiEQModes) -> None:
803
826
  """Set MultiEQ mode."""
804
827
  await self.audyssey.async_set_multieq(value)
805
828
 
806
- async def async_set_reflevoffset(self, value: str) -> None:
829
+ async def async_set_reflevoffset(self, value: ReferenceLevelOffsets) -> None:
807
830
  """Set Reference Level Offset."""
808
831
  await self.audyssey.async_set_reflevoffset(value)
809
832
 
810
- async def async_set_dynamicvol(self, value: str) -> None:
833
+ async def async_set_dynamicvol(self, value: DynamicVolumeSettings) -> None:
811
834
  """Set Dynamic Volume."""
812
835
  await self.audyssey.async_set_dynamicvol(value)
813
836
 
@@ -834,40 +857,44 @@ class DenonAVR(DenonAVRFoundation):
834
857
  await self.input.async_toggle_play_pause()
835
858
 
836
859
  async def async_play(self) -> None:
837
- """Send play command to receiver command via HTTP post."""
860
+ """Send play command to receiver command."""
838
861
  await self.input.async_play()
839
862
 
840
863
  async def async_pause(self) -> None:
841
- """Send pause command to receiver command via HTTP post."""
864
+ """Send pause command to receiver command."""
842
865
  await self.input.async_pause()
843
866
 
867
+ async def async_stop(self) -> None:
868
+ """Send stop command to receiver command."""
869
+ await self.input.async_stop()
870
+
844
871
  async def async_previous_track(self) -> None:
845
- """Send previous track command to receiver command via HTTP post."""
872
+ """Send previous track command to receiver command."""
846
873
  await self.input.async_previous_track()
847
874
 
848
875
  async def async_next_track(self) -> None:
849
- """Send next track command to receiver command via HTTP post."""
876
+ """Send next track command to receiver command."""
850
877
  await self.input.async_next_track()
851
878
 
852
879
  async def async_power_on(self) -> None:
853
- """Turn on receiver via HTTP get command."""
880
+ """Turn on receiver."""
854
881
  await self._device.async_power_on()
855
882
 
856
883
  async def async_power_off(self) -> None:
857
- """Turn off receiver via HTTP get command."""
884
+ """Turn off receiver."""
858
885
  await self._device.async_power_off()
859
886
 
860
887
  async def async_volume_up(self) -> None:
861
- """Volume up receiver via HTTP get command."""
888
+ """Volume up receiver."""
862
889
  await self.vol.async_volume_up()
863
890
 
864
891
  async def async_volume_down(self) -> None:
865
- """Volume down receiver via HTTP get command."""
892
+ """Volume down receiver."""
866
893
  await self.vol.async_volume_down()
867
894
 
868
895
  async def async_set_volume(self, volume: float) -> None:
869
896
  """
870
- Set receiver volume via HTTP get command.
897
+ Set receiver volume.
871
898
 
872
899
  Volume is send in a format like -50.0.
873
900
  Minimum is -80.0, maximum at 18.0
@@ -875,7 +902,7 @@ class DenonAVR(DenonAVRFoundation):
875
902
  await self.vol.async_set_volume(volume)
876
903
 
877
904
  async def async_mute(self, mute: bool) -> None:
878
- """Mute receiver via HTTP get command."""
905
+ """Mute receiver."""
879
906
  await self.vol.async_mute(mute)
880
907
 
881
908
  async def async_enable_tone_control(self) -> None:
@@ -945,60 +972,60 @@ class DenonAVR(DenonAVRFoundation):
945
972
  await self.tonecontrol.async_treble_down()
946
973
 
947
974
  async def async_cursor_up(self) -> None:
948
- """Send cursor up to receiver via HTTP get command."""
975
+ """Send cursor up to receiver."""
949
976
  await self._device.async_cursor_up()
950
977
 
951
978
  async def async_cursor_down(self) -> None:
952
- """Send cursor down to receiver via HTTP get command."""
979
+ """Send cursor down to receiver."""
953
980
  await self._device.async_cursor_down()
954
981
 
955
982
  async def async_cursor_left(self) -> None:
956
- """Send cursor left to receiver via HTTP get command."""
983
+ """Send cursor left to receiver."""
957
984
  await self._device.async_cursor_left()
958
985
 
959
986
  async def async_cursor_right(self) -> None:
960
- """Send cursor right to receiver via HTTP get command."""
987
+ """Send cursor right to receiver."""
961
988
  await self._device.async_cursor_right()
962
989
 
963
990
  async def async_cursor_enter(self) -> None:
964
- """Send cursor enter to receiver via HTTP get command."""
991
+ """Send cursor enter to receiver."""
965
992
  await self._device.async_cursor_enter()
966
993
 
967
994
  async def async_back(self) -> None:
968
- """Send back to receiver via HTTP get command."""
995
+ """Send back to receiver."""
969
996
  await self._device.async_back()
970
997
 
971
998
  async def async_info(self) -> None:
972
- """Send info to receiver via HTTP get command."""
999
+ """Send info to receiver."""
973
1000
  await self._device.async_info()
974
1001
 
975
1002
  async def async_options(self) -> None:
976
- """Raise options menu to receiver via HTTP get command."""
1003
+ """Raise options menu to receiver."""
977
1004
  await self._device.async_options()
978
1005
 
979
1006
  async def async_settings_menu(self) -> None:
980
- """Raise settings menu to receiver via HTTP get command."""
1007
+ """Raise settings menu to receiver."""
981
1008
  await self._device.async_settings_menu()
982
1009
 
983
1010
  async def async_channel_level_adjust(self) -> None:
984
- """Toggle the channel level adjust menu on receiver via HTTP get command."""
1011
+ """Toggle the channel level adjust menu on receiver."""
985
1012
  await self._device.async_channel_level_adjust()
986
1013
 
987
1014
  async def async_dimmer_toggle(self) -> None:
988
- """Toggle dimmer on receiver via HTTP get command."""
1015
+ """Toggle dimmer on receiver."""
989
1016
  await self._device.async_dimmer_toggle()
990
1017
 
991
1018
  async def async_dimmer(self, mode: DimmerModes) -> None:
992
- """Set dimmer mode on receiver via HTTP get command."""
1019
+ """Set dimmer mode on receiver."""
993
1020
  await self._device.async_dimmer(mode)
994
1021
 
995
1022
  async def async_auto_standby(self, auto_standby: AutoStandbys) -> None:
996
- """Set auto standby on receiver via HTTP get command."""
1023
+ """Set auto standby on receiver."""
997
1024
  await self._device.async_auto_standby(auto_standby)
998
1025
 
999
1026
  async def async_sleep(self, sleep: Union[Literal["OFF"], int]) -> None:
1000
1027
  """
1001
- Set auto standby on receiver via HTTP get command.
1028
+ Set auto standby on receiver.
1002
1029
 
1003
1030
  Valid sleep values are "OFF" and 1-120 (in minutes)
1004
1031
  """
@@ -1021,14 +1048,14 @@ class DenonAVR(DenonAVRFoundation):
1021
1048
  await self._device.async_hdmi_output(output)
1022
1049
 
1023
1050
  async def async_hdmi_audio_decode(self, mode: HDMIAudioDecodes) -> None:
1024
- """Set HDMI Audio Decode mode on receiver via HTTP get command."""
1051
+ """Set HDMI Audio Decode mode on receiver."""
1025
1052
  await self._device.async_hdmi_audio_decode(mode)
1026
1053
 
1027
1054
  async def async_video_processing_mode(self, mode: VideoProcessingModes) -> None:
1028
- """Set video processing mode on receiver via HTTP get command."""
1055
+ """Set video processing mode on receiver."""
1029
1056
  await self._device.async_video_processing_mode(mode)
1030
1057
 
1031
- async def async_status(self) -> str:
1058
+ async def async_status(self) -> None:
1032
1059
  """
1033
1060
  Toggles the display of status on the device.
1034
1061
 
@@ -1037,16 +1064,16 @@ class DenonAVR(DenonAVRFoundation):
1037
1064
  return await self._device.async_status()
1038
1065
 
1039
1066
  async def async_system_reset(self) -> None:
1040
- """DANGER! Reset the receiver via HTTP get command."""
1067
+ """DANGER! Reset the receiver."""
1041
1068
  await self._device.async_system_reset()
1042
1069
 
1043
1070
  async def async_network_restart(self) -> None:
1044
- """Restart the network on the receiver via HTTP get command."""
1071
+ """Restart the network on the receiver."""
1045
1072
  await self._device.async_network_restart()
1046
1073
 
1047
1074
  async def async_speaker_preset(self, preset: int) -> None:
1048
1075
  """
1049
- Set speaker preset on receiver via HTTP get command.
1076
+ Set speaker preset on receiver.
1050
1077
 
1051
1078
  Valid preset values are 1-2.
1052
1079
  """
@@ -1054,143 +1081,143 @@ class DenonAVR(DenonAVRFoundation):
1054
1081
 
1055
1082
  async def async_speaker_preset_toggle(self) -> None:
1056
1083
  """
1057
- Toggle speaker preset on receiver via HTTP get command.
1084
+ Toggle speaker preset on receiver.
1058
1085
 
1059
1086
  Only available if using Telnet.
1060
1087
  """
1061
1088
  await self._device.async_speaker_preset_toggle()
1062
1089
 
1063
1090
  async def async_bt_transmitter_on(self) -> None:
1064
- """Turn on Bluetooth transmitter on receiver via HTTP get command."""
1091
+ """Turn on Bluetooth transmitter on receiver."""
1065
1092
  await self._device.async_bt_transmitter_on()
1066
1093
 
1067
1094
  async def async_bt_transmitter_off(self) -> None:
1068
- """Turn off Bluetooth transmitter on receiver via HTTP get command."""
1095
+ """Turn off Bluetooth transmitter on receiver."""
1069
1096
  await self._device.async_bt_transmitter_off()
1070
1097
 
1071
1098
  async def async_bt_transmitter_toggle(self) -> None:
1072
1099
  """
1073
- Toggle Bluetooth transmitter mode on receiver via HTTP get command.
1100
+ Toggle Bluetooth transmitter mode on receiver.
1074
1101
 
1075
1102
  Only available if using Telnet.
1076
1103
  """
1077
1104
  await self._device.async_bt_transmitter_toggle()
1078
1105
 
1079
1106
  async def async_bt_output_mode(self, mode: BluetoothOutputModes) -> None:
1080
- """Set Bluetooth transmitter mode on receiver via HTTP get command."""
1107
+ """Set Bluetooth transmitter mode on receiver."""
1081
1108
  await self._device.async_bt_output_mode(mode)
1082
1109
 
1083
1110
  async def async_bt_output_mode_toggle(self) -> None:
1084
1111
  """
1085
- Toggle Bluetooth output mode on receiver via HTTP get command.
1112
+ Toggle Bluetooth output mode on receiver.
1086
1113
 
1087
1114
  Only available if using Telnet.
1088
1115
  """
1089
1116
  await self._device.async_bt_output_mode_toggle()
1090
1117
 
1091
1118
  async def async_delay_time_up(self) -> None:
1092
- """Delay time up on receiver via HTTP get command."""
1119
+ """Delay time up on receiver."""
1093
1120
  await self._device.async_delay_time_up()
1094
1121
 
1095
1122
  async def async_delay_time_down(self) -> None:
1096
- """Delay time up on receiver via HTTP get command."""
1123
+ """Delay time up on receiver."""
1097
1124
  await self._device.async_delay_time_down()
1098
1125
 
1099
1126
  async def async_delay_time(self, delay_time: int) -> None:
1100
1127
  """
1101
- Set delay time on receiver via HTTP get command.
1128
+ Set delay time on receiver.
1102
1129
 
1103
1130
  :param delay_time: Delay time in ms. Valid values are 0-999.
1104
1131
  """
1105
1132
  await self._device.async_delay_time(delay_time)
1106
1133
 
1107
1134
  async def async_audio_restorer(self, mode: AudioRestorers):
1108
- """Set audio restorer on receiver via HTTP get command."""
1135
+ """Set audio restorer on receiver."""
1109
1136
  await self._device.async_audio_restorer(mode)
1110
1137
 
1111
1138
  async def async_remote_control_lock(self):
1112
- """Set remote control lock on receiver via HTTP get command."""
1139
+ """Set remote control lock on receiver."""
1113
1140
  await self._device.async_remote_control_lock()
1114
1141
 
1115
1142
  async def async_remote_control_unlock(self):
1116
- """Set remote control unlock on receiver via HTTP get command."""
1143
+ """Set remote control unlock on receiver."""
1117
1144
  await self._device.async_remote_control_unlock()
1118
1145
 
1119
1146
  async def async_panel_lock(self, panel_lock_mode: PanelLocks):
1120
- """Set panel lock on receiver via HTTP get command."""
1147
+ """Set panel lock on receiver."""
1121
1148
  await self._device.async_panel_lock(panel_lock_mode)
1122
1149
 
1123
1150
  async def async_panel_unlock(self):
1124
- """Set panel unlock on receiver via HTTP get command."""
1151
+ """Set panel unlock on receiver."""
1125
1152
  await self._device.async_panel_unlock()
1126
1153
 
1127
1154
  async def async_graphic_eq_on(self) -> None:
1128
- """Turn on Graphic EQ on receiver via HTTP get command."""
1155
+ """Turn on Graphic EQ on receiver."""
1129
1156
  await self._device.async_graphic_eq_on()
1130
1157
 
1131
1158
  async def async_graphic_eq_off(self) -> None:
1132
- """Turn off Graphic EQ on receiver via HTTP get command."""
1159
+ """Turn off Graphic EQ on receiver."""
1133
1160
  await self._device.async_graphic_eq_off()
1134
1161
 
1135
1162
  async def async_graphic_eq_toggle(self) -> None:
1136
1163
  """
1137
- Toggle Graphic EQ on receiver via HTTP get command.
1164
+ Toggle Graphic EQ on receiver.
1138
1165
 
1139
1166
  Only available if using Telnet.
1140
1167
  """
1141
1168
  await self._device.async_graphic_eq_toggle()
1142
1169
 
1143
1170
  async def async_headphone_eq_on(self) -> None:
1144
- """Turn on Headphone EQ on receiver via HTTP get command."""
1171
+ """Turn on Headphone EQ on receiver."""
1145
1172
  await self._device.async_headphone_eq_on()
1146
1173
 
1147
1174
  async def async_headphone_eq_off(self) -> None:
1148
- """Turn off Headphone EQ on receiver via HTTP get command."""
1175
+ """Turn off Headphone EQ on receiver."""
1149
1176
  await self._device.async_headphone_eq_off()
1150
1177
 
1151
1178
  async def async_headphone_eq_toggle(self) -> None:
1152
1179
  """
1153
- Toggle Headphone EQ on receiver via HTTP get command.
1180
+ Toggle Headphone EQ on receiver.
1154
1181
 
1155
1182
  Only available if using Telnet.
1156
1183
  """
1157
1184
  await self._device.async_headphone_eq_toggle()
1158
1185
 
1159
1186
  async def async_tactile_transducer_on(self) -> None:
1160
- """Turn on tactile transducer on receiver via HTTP get command."""
1187
+ """Turn on tactile transducer on receiver."""
1161
1188
  await self._device.async_tactile_transducer_on()
1162
1189
 
1163
1190
  async def async_tactile_transducer_off(self) -> None:
1164
- """Turn on tactile transducer on receiver via HTTP get command."""
1191
+ """Turn on tactile transducer on receiver."""
1165
1192
  await self._device.async_tactile_transducer_off()
1166
1193
 
1167
1194
  async def async_tactile_transducer_toggle(self) -> None:
1168
1195
  """
1169
- Turn on tactile transducer on receiver via HTTP get command.
1196
+ Turn on tactile transducer on receiver.
1170
1197
 
1171
1198
  Only available if using Telnet.
1172
1199
  """
1173
1200
  await self._device.async_tactile_transducer_toggle()
1174
1201
 
1175
1202
  async def async_tactile_transducer_level_up(self) -> None:
1176
- """Increase the transducer level on receiver via HTTP get command."""
1203
+ """Increase the transducer level on receiver."""
1177
1204
  await self._device.async_tactile_transducer_level_up()
1178
1205
 
1179
1206
  async def async_tactile_transducer_level_down(self) -> None:
1180
- """Decrease the transducer on receiver via HTTP get command."""
1207
+ """Decrease the transducer on receiver."""
1181
1208
  await self._device.async_tactile_transducer_level_down()
1182
1209
 
1183
1210
  async def async_transducer_lpf(self, lpf: TransducerLPFs) -> None:
1184
- """Set transducer low pass filter on receiver via HTTP get command."""
1211
+ """Set transducer low pass filter on receiver."""
1185
1212
  await self._device.async_transducer_lpf(lpf)
1186
1213
 
1187
1214
  async def async_room_size(self, room_size: RoomSizes) -> None:
1188
- """Set room size on receiver via HTTP get command."""
1215
+ """Set room size on receiver."""
1189
1216
  await self._device.async_room_size(room_size)
1190
1217
 
1191
1218
  async def async_trigger_on(self, trigger: int) -> None:
1192
1219
  """
1193
- Set trigger to ON on receiver via HTTP get command.
1220
+ Set trigger to ON on receiver.
1194
1221
 
1195
1222
  :param trigger: Trigger number to set to ON. Valid values are 1-3.
1196
1223
  """
@@ -1198,7 +1225,7 @@ class DenonAVR(DenonAVRFoundation):
1198
1225
 
1199
1226
  async def async_trigger_off(self, trigger: int) -> None:
1200
1227
  """
1201
- Set trigger to OFF on receiver via HTTP get command.
1228
+ Set trigger to OFF on receiver.
1202
1229
 
1203
1230
  :param trigger: Trigger number to set to OFF. Valid values are 1-3.
1204
1231
  """
@@ -1206,7 +1233,7 @@ class DenonAVR(DenonAVRFoundation):
1206
1233
 
1207
1234
  async def async_trigger_toggle(self, trigger: int) -> None:
1208
1235
  """
1209
- Toggle trigger on receiver via HTTP get command.
1236
+ Toggle trigger on receiver.
1210
1237
 
1211
1238
  Only available if using Telnet.
1212
1239
 
@@ -1216,7 +1243,7 @@ class DenonAVR(DenonAVRFoundation):
1216
1243
 
1217
1244
  async def async_quick_select_mode(self, quick_select_number: int) -> None:
1218
1245
  """
1219
- Set quick select mode on receiver via HTTP get command.
1246
+ Set quick select mode on receiver.
1220
1247
 
1221
1248
  :param quick_select_number: Quick select number to set. Valid values are 1-5.
1222
1249
  """
@@ -1224,23 +1251,23 @@ class DenonAVR(DenonAVRFoundation):
1224
1251
 
1225
1252
  async def async_quick_select_memory(self, quick_select_number: int) -> None:
1226
1253
  """
1227
- Set quick select memory on receiver via HTTP get command.
1254
+ Set quick select memory on receiver.
1228
1255
 
1229
1256
  :param quick_select_number: Quick select number to set. Valid values are 1-5.
1230
1257
  """
1231
1258
  await self._device.async_quick_select_memory(quick_select_number)
1232
1259
 
1233
1260
  async def async_hdmi_cec_on(self) -> None:
1234
- """Turn on HDMI CEC on receiver via HTTP get command."""
1261
+ """Turn on HDMI CEC on receiver."""
1235
1262
  await self._device.async_hdmi_cec_on()
1236
1263
 
1237
1264
  async def async_hdmi_cec_off(self) -> None:
1238
- """Turn off HDMI CEC on receiver via HTTP get command."""
1265
+ """Turn off HDMI CEC on receiver."""
1239
1266
  await self._device.async_hdmi_cec_off()
1240
1267
 
1241
1268
  async def async_illumination(self, mode: Illuminations):
1242
1269
  """
1243
- Set illumination mode on receiver via HTTP get command.
1270
+ Set illumination mode on receiver.
1244
1271
 
1245
1272
  Only available for Marantz devices.
1246
1273
  """
@@ -1248,7 +1275,7 @@ class DenonAVR(DenonAVRFoundation):
1248
1275
 
1249
1276
  async def async_auto_lip_sync_on(self) -> None:
1250
1277
  """
1251
- Turn on auto lip sync on receiver via HTTP get command.
1278
+ Turn on auto lip sync on receiver.
1252
1279
 
1253
1280
  Only available on Marantz devices.
1254
1281
  """
@@ -1256,7 +1283,7 @@ class DenonAVR(DenonAVRFoundation):
1256
1283
 
1257
1284
  async def async_auto_lip_sync_off(self) -> None:
1258
1285
  """
1259
- Turn off auto lip sync on receiver via HTTP get command.
1286
+ Turn off auto lip sync on receiver.
1260
1287
 
1261
1288
  Only available on Marantz devices.
1262
1289
  """
@@ -1264,8 +1291,20 @@ class DenonAVR(DenonAVRFoundation):
1264
1291
 
1265
1292
  async def async_auto_lip_sync_toggle(self) -> None:
1266
1293
  """
1267
- Toggle auto lip sync on receiver via HTTP get command.
1294
+ Toggle auto lip sync on receiver.
1268
1295
 
1269
1296
  Only available on Marantz devices and when using Telnet.
1270
1297
  """
1271
1298
  await self._device.async_auto_lip_sync_toggle()
1299
+
1300
+ async def async_page_up(self) -> None:
1301
+ """Page Up on receiver."""
1302
+ await self._device.async_page_up()
1303
+
1304
+ async def async_page_down(self) -> None:
1305
+ """Page Down on receiver."""
1306
+ await self._device.async_page_down()
1307
+
1308
+ async def async_input_mode(self, mode: InputModes):
1309
+ """Set input mode on receiver."""
1310
+ await self._device.async_input_mode(mode)