denonavr 1.1.2__tar.gz → 1.3.0__tar.gz

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.
Files changed (292) hide show
  1. {denonavr-1.1.2 → denonavr-1.3.0}/PKG-INFO +2 -1
  2. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/__init__.py +1 -1
  3. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/api.py +150 -115
  4. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/appcommand.py +48 -12
  5. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/audyssey.py +28 -29
  6. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/const.py +520 -126
  7. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/decorators.py +2 -3
  8. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/denonavr.py +198 -100
  9. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/dirac.py +7 -11
  10. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/foundation.py +587 -363
  11. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/input.py +110 -71
  12. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/soundmode.py +164 -66
  13. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/ssdp.py +12 -11
  14. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/tonecontrol.py +2 -6
  15. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/volume.py +47 -66
  16. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/PKG-INFO +2 -1
  17. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/SOURCES.txt +12 -0
  18. {denonavr-1.1.2 → denonavr-1.3.0}/pyproject.toml +2 -1
  19. {denonavr-1.1.2 → denonavr-1.3.0}/tests/test_const.py +10 -10
  20. {denonavr-1.1.2 → denonavr-1.3.0}/tests/test_denonavr.py +2 -1
  21. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AV7703-AppCommand-update-8080.xml +25 -0
  22. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-8500H-AppCommand-update-8080.xml +25 -0
  23. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-A10H-AppCommand-update-8080.xml +25 -0
  24. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-X3700H-AppCommand-update-8080.xml +25 -0
  25. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-AppCommand-update.xml +10 -0
  26. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-AppCommand-update.xml +20 -0
  27. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-AppCommand-update.xml +16 -0
  28. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-AppCommand-update.xml +25 -0
  29. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-AppCommand-update.xml +25 -0
  30. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4300H-AppCommand-update-8080.xml +25 -0
  31. denonavr-1.3.0/tests/xml/DRA-N4-AppCommand-setup.xml +6 -0
  32. denonavr-1.3.0/tests/xml/DRA-N4-AppCommand-update-tonecontrol.xml +15 -0
  33. denonavr-1.3.0/tests/xml/DRA-N4-AppCommand-update.xml +159 -0
  34. denonavr-1.3.0/tests/xml/DRA-N4-Deviceinfo.xml +631 -0
  35. denonavr-1.3.0/tests/xml/DRA-N4-formMainZone_MainZoneXml.xml +14 -0
  36. denonavr-1.3.0/tests/xml/DRA-N4-formMainZone_MainZoneXmlStatus.xml +9 -0
  37. denonavr-1.3.0/tests/xml/DRA-N4-formNetAudio_StatusXml.xml +56 -0
  38. denonavr-1.3.0/tests/xml/DRA-N4-formTuner_HdXml.xml +80 -0
  39. denonavr-1.3.0/tests/xml/DRA-N4-formTuner_TunerXml.xml +71 -0
  40. denonavr-1.3.0/tests/xml/DRA-N4-formZone2_Zone2XmlStatus.xml +48 -0
  41. denonavr-1.3.0/tests/xml/DRA-N4-formZone3_Zone3XmlStatus.xml +48 -0
  42. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-AppCommand-update.xml +3 -0
  43. denonavr-1.3.0/tests/xml/M-CR510-AppCommand-update-soundmode.xml +6 -0
  44. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-AppCommand-update.xml +4 -0
  45. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-AppCommand-update.xml +12 -0
  46. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1609-AppCommand-update-8080.xml +16 -0
  47. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-AppCommand-update.xml +16 -0
  48. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6012-AppCommand-update-8080.xml +16 -0
  49. {denonavr-1.1.2 → denonavr-1.3.0}/LICENSE +0 -0
  50. {denonavr-1.1.2 → denonavr-1.3.0}/README.md +0 -0
  51. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr/exceptions.py +0 -0
  52. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/dependency_links.txt +0 -0
  53. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/not-zip-safe +0 -0
  54. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/requires.txt +0 -0
  55. {denonavr-1.1.2 → denonavr-1.3.0}/denonavr.egg-info/top_level.txt +0 -0
  56. {denonavr-1.1.2 → denonavr-1.3.0}/setup.cfg +0 -0
  57. {denonavr-1.1.2 → denonavr-1.3.0}/tests/__init__.py +0 -0
  58. {denonavr-1.1.2 → denonavr-1.3.0}/tests/test_ssdp.py +0 -0
  59. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AV7703-AppCommand-setup-8080.xml +0 -0
  60. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AV7703-AppCommand-update-soundmode-8080.xml +0 -0
  61. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AV7703-AppCommand-update-tonecontrol-8080.xml +0 -0
  62. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AV7703-Deviceinfo-8080.xml +0 -0
  63. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-8500H-AppCommand-setup-8080.xml +0 -0
  64. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-8500H-AppCommand-update-soundmode-8080.xml +0 -0
  65. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-8500H-AppCommand-update-tonecontrol-8080.xml +0 -0
  66. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-8500H-Deviceinfo-8080.xml +0 -0
  67. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-A10H-AppCommand-setup-8080.xml +0 -0
  68. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-A10H-AppCommand-update-soundmode-8080.xml +0 -0
  69. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-A10H-AppCommand-update-tonecontrol-8080.xml +0 -0
  70. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-A10H-Deviceinfo-8080.xml +0 -0
  71. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-X3700H-AppCommand-setup-8080.xml +0 -0
  72. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-X3700H-AppCommand-update-soundmode-8080.xml +0 -0
  73. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-X3700H-AppCommand-update-tonecontrol-8080.xml +0 -0
  74. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVC-X3700H-Deviceinfo-8080.xml +0 -0
  75. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-AppCommand-setup.xml +0 -0
  76. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-AppCommand-update-soundmode.xml +0 -0
  77. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-AppCommand-update-tonecontrol.xml +0 -0
  78. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-Deviceinfo.xml +0 -0
  79. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formMainZone_MainZoneXml.xml +0 -0
  80. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formMainZone_MainZoneXmlStatus.xml +0 -0
  81. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formNetAudio_StatusXml.xml +0 -0
  82. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formTuner_HdXml.xml +0 -0
  83. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formTuner_TunerXml.xml +0 -0
  84. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formZone2_Zone2XmlStatus.xml +0 -0
  85. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1713-formZone3_Zone3XmlStatus.xml +0 -0
  86. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-AppCommand-setup.xml +0 -0
  87. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-AppCommand-update-soundmode.xml +0 -0
  88. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-AppCommand-update-tonecontrol.xml +0 -0
  89. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-AppCommand-update.xml +0 -0
  90. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-Deviceinfo.xml +0 -0
  91. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-formMainZone_MainZoneXml.xml +0 -0
  92. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-formMainZone_MainZoneXmlStatus.xml +0 -0
  93. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-1912-formNetAudio_StatusXml.xml +0 -0
  94. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-AppCommand-setup.xml +0 -0
  95. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-AppCommand-update-soundmode.xml +0 -0
  96. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-AppCommand-update-tonecontrol.xml +0 -0
  97. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-AppCommand-update.xml +0 -0
  98. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-Deviceinfo.xml +0 -0
  99. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXml.xml +0 -0
  100. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  101. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-2312CI-formNetAudio_StatusXml.xml +0 -0
  102. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-AppCommand-setup.xml +0 -0
  103. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-AppCommand-update-soundmode.xml +0 -0
  104. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-AppCommand-update-tonecontrol.xml +0 -0
  105. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-AppCommand-update.xml +0 -0
  106. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-Deviceinfo.xml +0 -0
  107. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXml.xml +0 -0
  108. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  109. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3311CI-formNetAudio_StatusXml.xml +0 -0
  110. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-AppCommand-setup.xml +0 -0
  111. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-AppCommand-update-soundmode.xml +0 -0
  112. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-AppCommand-update-tonecontrol.xml +0 -0
  113. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-AppCommand-update.xml +0 -0
  114. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-Deviceinfo.xml +0 -0
  115. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formMainZone_MainZoneXml.xml +0 -0
  116. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formMainZone_MainZoneXmlStatus.xml +0 -0
  117. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formNetAudio_StatusXml.xml +0 -0
  118. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formTuner_HdXml.xml +0 -0
  119. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formTuner_TunerXml.xml +0 -0
  120. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formZone2_Zone2XmlStatus.xml +0 -0
  121. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3312-formZone3_Zone3XmlStatus.xml +0 -0
  122. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-AppCommand-setup.xml +0 -0
  123. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-AppCommand-update-soundmode.xml +0 -0
  124. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-AppCommand-update-tonecontrol.xml +0 -0
  125. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-Deviceinfo.xml +0 -0
  126. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formMainZone_MainZoneXml.xml +0 -0
  127. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formMainZone_MainZoneXmlStatus.xml +0 -0
  128. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formNetAudio_StatusXml.xml +0 -0
  129. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formTuner_HdXml.xml +0 -0
  130. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formTuner_TunerXml.xml +0 -0
  131. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formZone2_Zone2XmlStatus.xml +0 -0
  132. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-3313-formZone3_Zone3XmlStatus.xml +0 -0
  133. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-AppCommand-setup.xml +0 -0
  134. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-AppCommand-update-soundmode.xml +0 -0
  135. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-AppCommand-update-tonecontrol.xml +0 -0
  136. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-AppCommand-update.xml +0 -0
  137. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-Deviceinfo.xml +0 -0
  138. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formMainZone_MainZoneXml.xml +0 -0
  139. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formMainZone_MainZoneXmlStatus.xml +0 -0
  140. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formNetAudio_StatusXml.xml +0 -0
  141. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formTuner_HdXml.xml +0 -0
  142. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formTuner_TunerXml.xml +0 -0
  143. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formZone2_Zone2XmlStatus.xml +0 -0
  144. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-4810-formZone3_Zone3XmlStatus.xml +0 -0
  145. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-AppCommand-setup.xml +0 -0
  146. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-AppCommand-update-soundmode.xml +0 -0
  147. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-AppCommand-update-tonecontrol.xml +0 -0
  148. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-Deviceinfo.xml +0 -0
  149. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXml.xml +0 -0
  150. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  151. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formNetAudio_StatusXml.xml +0 -0
  152. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formTuner_HdXml.xml +0 -0
  153. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formTuner_TunerXml.xml +0 -0
  154. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formZone2_Zone2XmlStatus.xml +0 -0
  155. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1100W-formZone3_Zone3XmlStatus.xml +0 -0
  156. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X1600H_upnp.xml +0 -0
  157. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-AppCommand-setup.xml +0 -0
  158. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-AppCommand-update-soundmode.xml +0 -0
  159. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-AppCommand-update-tonecontrol.xml +0 -0
  160. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-AppCommand-update.xml +0 -0
  161. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-Deviceinfo.xml +0 -0
  162. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXml.xml +0 -0
  163. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  164. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-2-formNetAudio_StatusXml.xml +0 -0
  165. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-AppCommand-setup.xml +0 -0
  166. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-AppCommand-update-soundmode.xml +0 -0
  167. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-AppCommand-update-tonecontrol.xml +0 -0
  168. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-AppCommand-update.xml +0 -0
  169. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-Deviceinfo.xml +0 -0
  170. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXml.xml +0 -0
  171. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXmlStatus.xml +0 -0
  172. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formNetAudio_StatusXml.xml +0 -0
  173. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formTuner_HdXml.xml +0 -0
  174. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formTuner_TunerXml.xml +0 -0
  175. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formZone2_Zone2XmlStatus.xml +0 -0
  176. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2000-formZone3_Zone3XmlStatus.xml +0 -0
  177. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-AppCommand-setup.xml +0 -0
  178. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-AppCommand-update-soundmode.xml +0 -0
  179. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-AppCommand-update-tonecontrol.xml +0 -0
  180. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-AppCommand-update.xml +0 -0
  181. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-Deviceinfo.xml +0 -0
  182. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXml.xml +0 -0
  183. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  184. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-2-formNetAudio_StatusXml.xml +0 -0
  185. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-AppCommand-setup.xml +0 -0
  186. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-AppCommand-update-soundmode.xml +0 -0
  187. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-AppCommand-update-tonecontrol.xml +0 -0
  188. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-AppCommand-update.xml +0 -0
  189. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXml.xml +0 -0
  190. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  191. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X2100W-formNetAudio_StatusXml.xml +0 -0
  192. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-AppCommand-setup.xml +0 -0
  193. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-AppCommand-update-soundmode.xml +0 -0
  194. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-AppCommand-update-tonecontrol.xml +0 -0
  195. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-Deviceinfo.xml +0 -0
  196. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXml.xml +0 -0
  197. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXmlStatus.xml +0 -0
  198. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formNetAudio_StatusXml.xml +0 -0
  199. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formTuner_HdXml.xml +0 -0
  200. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formTuner_TunerXml.xml +0 -0
  201. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formZone2_Zone2XmlStatus.xml +0 -0
  202. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4000-formZone3_Zone3XmlStatus.xml +0 -0
  203. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-AppCommand-setup.xml +0 -0
  204. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-AppCommand-update-soundmode.xml +0 -0
  205. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-AppCommand-update-tonecontrol.xml +0 -0
  206. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-Deviceinfo.xml +0 -0
  207. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXml.xml +0 -0
  208. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  209. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4100W-formNetAudio_StatusXml.xml +0 -0
  210. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4300H-AppCommand-setup-8080.xml +0 -0
  211. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4300H-AppCommand-update-soundmode-8080.xml +0 -0
  212. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4300H-AppCommand-update-tonecontrol-8080.xml +0 -0
  213. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/AVR-X4300H-Deviceinfo-8080.xml +0 -0
  214. /denonavr-1.1.2/tests/xml/M-CR510-2-AppCommand-update-soundmode.xml → /denonavr-1.3.0/tests/xml/DRA-N4-AppCommand-update-soundmode.xml +0 -0
  215. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-AppCommand-setup.xml +0 -0
  216. /denonavr-1.1.2/tests/xml/M-CR510-AppCommand-update-soundmode.xml → /denonavr-1.3.0/tests/xml/M-CR510-2-AppCommand-update-soundmode.xml +0 -0
  217. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-AppCommand-update-tonecontrol.xml +0 -0
  218. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-Deviceinfo.xml +0 -0
  219. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXml.xml +0 -0
  220. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  221. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-formNetAudio_StatusXml.xml +0 -0
  222. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-formTuner_HdXml.xml +0 -0
  223. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-2-formTuner_TunerXml.xml +0 -0
  224. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-AppCommand-setup.xml +0 -0
  225. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-AppCommand-update-tonecontrol.xml +0 -0
  226. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-Deviceinfo.xml +0 -0
  227. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-formMainZone_MainZoneXml.xml +0 -0
  228. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-formMainZone_MainZoneXmlStatus.xml +0 -0
  229. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-formNetAudio_StatusXml.xml +0 -0
  230. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-formTuner_HdXml.xml +0 -0
  231. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR510-formTuner_TunerXml.xml +0 -0
  232. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-AppCommand-setup.xml +0 -0
  233. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-AppCommand-update-soundmode.xml +0 -0
  234. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-AppCommand-update-tonecontrol.xml +0 -0
  235. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-AppCommand-update.xml +0 -0
  236. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-Deviceinfo.xml +0 -0
  237. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formMainZone_MainZoneXml.xml +0 -0
  238. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formMainZone_MainZoneXmlStatus.xml +0 -0
  239. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formNetAudio_StatusXml.xml +0 -0
  240. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formTuner_HdXml.xml +0 -0
  241. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formTuner_TunerXml.xml +0 -0
  242. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formZone2_Zone2XmlStatus.xml +0 -0
  243. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-CR603-formZone3_Zone3XmlStatus.xml +0 -0
  244. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-AppCommand-setup.xml +0 -0
  245. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-AppCommand-update-soundmode.xml +0 -0
  246. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-AppCommand-update-tonecontrol.xml +0 -0
  247. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-Deviceinfo.xml +0 -0
  248. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-formMainZone_MainZoneXml.xml +0 -0
  249. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-formMainZone_MainZoneXmlStatus.xml +0 -0
  250. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-formNetAudio_StatusXml.xml +0 -0
  251. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/M-RC610-formTuner_TunerXml.xml +0 -0
  252. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-AppCommand-setup.xml +0 -0
  253. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-AppCommand-update-soundmode.xml +0 -0
  254. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-AppCommand-update-tonecontrol.xml +0 -0
  255. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-AppCommand-update.xml +0 -0
  256. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-Deviceinfo.xml +0 -0
  257. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formMainZone_MainZoneXml.xml +0 -0
  258. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formMainZone_MainZoneXmlStatus.xml +0 -0
  259. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formNetAudio_StatusXml.xml +0 -0
  260. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formTuner_HdXml.xml +0 -0
  261. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formTuner_TunerXml.xml +0 -0
  262. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formZone2_Zone2XmlStatus.xml +0 -0
  263. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1604-formZone3_Zone3XmlStatus.xml +0 -0
  264. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1609-AppCommand-setup-8080.xml +0 -0
  265. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1609-AppCommand-update-soundmode-8080.xml +0 -0
  266. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1609-AppCommand-update-tonecontrol-8080.xml +0 -0
  267. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/NR1609-Deviceinfo-8080.xml +0 -0
  268. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-AppCommand-setup.xml +0 -0
  269. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-AppCommand-update-soundmode.xml +0 -0
  270. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-AppCommand-update-tonecontrol.xml +0 -0
  271. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-AppCommand-update.xml +0 -0
  272. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-Deviceinfo.xml +0 -0
  273. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-formMainZone_MainZoneXml.xml +0 -0
  274. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-formMainZone_MainZoneXmlStatus.xml +0 -0
  275. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-formNetAudio_StatusXml.xml +0 -0
  276. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-formTuner_HdXml.xml +0 -0
  277. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR5008-formTuner_TunerXml.xml +0 -0
  278. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-AppCommand-setup.xml +0 -0
  279. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-AppCommand-update-soundmode.xml +0 -0
  280. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-AppCommand-update-tonecontrol.xml +0 -0
  281. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-Deviceinfo.xml +0 -0
  282. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formMainZone_MainZoneXml.xml +0 -0
  283. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formMainZone_MainZoneXmlStatus.xml +0 -0
  284. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formNetAudio_StatusXml.xml +0 -0
  285. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formTuner_HdXml.xml +0 -0
  286. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formTuner_TunerXml.xml +0 -0
  287. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formZone2_Zone2XmlStatus.xml +0 -0
  288. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6011-formZone3_Zone3XmlStatus.xml +0 -0
  289. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6012-AppCommand-setup-8080.xml +0 -0
  290. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6012-AppCommand-update-soundmode-8080.xml +0 -0
  291. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6012-AppCommand-update-tonecontrol-8080.xml +0 -0
  292. {denonavr-1.1.2 → denonavr-1.3.0}/tests/xml/SR6012-Deviceinfo-8080.xml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: denonavr
3
- Version: 1.1.2
3
+ Version: 1.3.0
4
4
  Summary: Automation Library for Denon AVR receivers
5
5
  Author-email: Oliver Goetz <scarface@mywoh.de>
6
6
  License: MIT
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
23
24
  Requires-Python: >=3.8
24
25
  Description-Content-Type: text/markdown; charset=UTF-8
25
26
  License-File: LICENSE
@@ -17,7 +17,7 @@ from .ssdp import async_identify_denonavr_receivers
17
17
  logging.getLogger(__name__).addHandler(logging.NullHandler())
18
18
 
19
19
  __title__ = "denonavr"
20
- __version__ = "1.1.2"
20
+ __version__ = "1.3.0"
21
21
 
22
22
 
23
23
  async def async_discover():
@@ -16,18 +16,7 @@ import xml.etree.ElementTree as ET
16
16
  from collections import defaultdict
17
17
  from collections.abc import Hashable
18
18
  from io import BytesIO
19
- from typing import (
20
- Awaitable,
21
- Callable,
22
- Coroutine,
23
- DefaultDict,
24
- Dict,
25
- List,
26
- Optional,
27
- Set,
28
- Tuple,
29
- cast,
30
- )
19
+ from typing import Callable, DefaultDict, Dict, List, Optional, Set, Tuple
31
20
 
32
21
  import attr
33
22
  import httpx
@@ -111,10 +100,11 @@ class HTTPXAsyncClient:
111
100
  """Call GET endpoint of Denon AVR receiver asynchronously."""
112
101
  client = self.client_getter()
113
102
  try:
114
- res = await client.get(
115
- url, timeout=httpx.Timeout(timeout, read=read_timeout)
116
- )
117
- res.raise_for_status()
103
+ async with client.stream(
104
+ "GET", url, timeout=httpx.Timeout(timeout, read=read_timeout)
105
+ ) as res:
106
+ res.raise_for_status()
107
+ await res.aread()
118
108
  finally:
119
109
  # Close the default AsyncClient but keep custom clients open
120
110
  if self.is_default_async_client():
@@ -134,16 +124,18 @@ class HTTPXAsyncClient:
134
124
  data: Optional[Dict] = None,
135
125
  cache_id: Hashable = None,
136
126
  ) -> httpx.Response:
137
- """Call GET endpoint of Denon AVR receiver asynchronously."""
127
+ """Call POST endpoint of Denon AVR receiver asynchronously."""
138
128
  client = self.client_getter()
139
129
  try:
140
- res = await client.post(
130
+ async with client.stream(
131
+ "POST",
141
132
  url,
142
133
  content=content,
143
134
  data=data,
144
135
  timeout=httpx.Timeout(timeout, read=read_timeout),
145
- )
146
- res.raise_for_status()
136
+ ) as res:
137
+ res.raise_for_status()
138
+ await res.aread()
147
139
  finally:
148
140
  # Close the default AsyncClient but keep custom clients open
149
141
  if self.is_default_async_client():
@@ -475,6 +467,7 @@ class DenonAVRTelnetApi:
475
467
 
476
468
  host: str = attr.ib(converter=str, default="localhost")
477
469
  timeout: float = attr.ib(converter=float, default=2.0)
470
+ is_denon: bool = attr.ib(converter=bool, default=True)
478
471
  _connection_enabled: bool = attr.ib(default=False)
479
472
  _last_message_time: float = attr.ib(default=-1.0)
480
473
  _connect_lock: asyncio.Lock = attr.ib(default=attr.Factory(asyncio.Lock))
@@ -484,28 +477,28 @@ class DenonAVRTelnetApi:
484
477
  _telnet_event_map: Dict[str, List] = attr.ib(
485
478
  default=attr.Factory(telnet_event_map_factory)
486
479
  )
487
- _callback_tasks: Set[asyncio.Task] = attr.ib(attr.Factory(set))
488
480
  _send_lock: asyncio.Lock = attr.ib(default=attr.Factory(asyncio.Lock))
489
481
  _send_confirmation_timeout: float = attr.ib(converter=float, default=2.0)
490
482
  _send_confirmation_event: asyncio.Event = attr.ib(
491
483
  default=attr.Factory(asyncio.Event)
492
484
  )
493
485
  _send_confirmation_command: str = attr.ib(converter=str, default="")
494
- _send_tasks: Set[asyncio.Task] = attr.ib(attr.Factory(set))
495
- _callbacks: Dict[str, List[Coroutine]] = attr.ib(
486
+ _send_tasks: Set[asyncio.Task] = attr.ib(default=attr.Factory(set))
487
+ _callbacks: Dict[str, List[Callable]] = attr.ib(
496
488
  validator=attr.validators.instance_of(dict),
497
489
  default=attr.Factory(dict),
498
490
  init=False,
499
491
  )
500
- _raw_callbacks: List[Coroutine] = attr.ib(
492
+ _raw_callbacks: List[Callable] = attr.ib(
501
493
  validator=attr.validators.instance_of(list),
502
494
  default=attr.Factory(list),
503
495
  init=False,
504
496
  )
497
+ _update_callback_tasks: Set[asyncio.Task] = attr.ib(default=attr.Factory(set))
505
498
 
506
499
  def __attrs_post_init__(self) -> None:
507
500
  """Initialize special attributes."""
508
- self._register_raw_callback(self._async_send_confirmation_callback)
501
+ self._register_raw_callback(self._send_confirmation_callback)
509
502
 
510
503
  async def async_connect(self) -> None:
511
504
  """Connect to the receiver asynchronously."""
@@ -544,76 +537,104 @@ class DenonAVRTelnetApi:
544
537
  "%s: Connection failed on telnet reconnect: %s", self.host, err
545
538
  )
546
539
  raise AvrNetworkError(f"OSError: {err}", "telnet connect") from err
547
- self._protocol = cast(DenonAVRTelnetProtocol, transport_protocol[1])
540
+ self._protocol = transport_protocol[1]
548
541
  _LOGGER.debug("%s: telnet connection established", self.host)
549
542
  self._connection_enabled = True
550
543
  self._last_message_time = time.monotonic()
551
544
  self._schedule_monitor()
552
- # Trigger update of all attributes
545
+
546
+ # Cancel all update tasks in case they are still running and create a new one.
547
+ for callback_task in self._update_callback_tasks:
548
+ callback_task.cancel()
549
+
550
+ task = asyncio.create_task(self._async_trigger_updates())
551
+ self._update_callback_tasks.add(task)
552
+ task.add_done_callback(self._update_callback_tasks.discard)
553
+
554
+ async def _async_trigger_updates(self) -> None:
555
+ """Trigger update of all attributes."""
556
+ commands = [
557
+ # Critical State Info
558
+ "ZM?", # Main Zone Power
559
+ "SI?", # Select INPUT source
560
+ "MV?", # MASTER VOLUME
561
+ "MU?", # Mute
562
+ "Z2?", # Z2 Zone Power
563
+ "Z2MU?", # Z2 Mute
564
+ "Z3?", # Z3 Zone Power
565
+ "Z3MU?", # Z3 Mute
566
+ "MS?", # Surround mode
567
+ # State Info used in Toggle Commands
568
+ "MNMEN?", # Menu
569
+ "TR?", # Trigger
570
+ "PSTONE CTRL ?", # TONE
571
+ "PSDYNEQ ?", # Dynamic EQ
572
+ "PSLFC ?", # Audyssey LFC
573
+ "PSNEURAL ?", # Neural:X
574
+ "PSIMAXAUD ?", # IMAX Audio Settings Auto/Manual
575
+ "PSIMAXSWM ?", # IMAX Subwoofer Mode
576
+ "PSSWR ?", # Subwoofer
577
+ "SSTTR ?", # Tactile Transducer
578
+ "VSAUDIO ?", # HDMI Audio Decode
579
+ "PSCES ?", # CENTER Spread
580
+ "PSLOM ?", # Loudness Management
581
+ "PSCINEMA EQ. ?", # CINEMA EQ
582
+ "BTTX ?", # Bluetooth Transmitter
583
+ "PSSPV ?", # Speaker Virtualizer
584
+ "PSGEQ ?", # Graphic EQ
585
+ "PSHEQ ?", # Headphone EQ
586
+ # Regular State Info
587
+ "PSBAS ?", # BASS
588
+ "PSTRE ?", # TREBLE
589
+ "PSCNTAMT ?", # Containment Amount
590
+ "PSMULTEQ: ?", # MultEQ
591
+ "PSREFLEV ?", # Reference Level
592
+ "PSDYNVOL ?", # Dynamic Vol.
593
+ "DIM ?", # Dimmer
594
+ "PSDELAY ?", # Audio Delay
595
+ "ECO?", # ECO
596
+ "VSMONI ?", # HDMI Output
597
+ "PSDIRAC ?", # Dirac Live Filter
598
+ "CV?", # Channel Volume
599
+ "PSIMAX ?", # IMAX
600
+ "PSIMAXHPF ?", # IMAX High Pass Filter
601
+ "PSIMAXLPF ?", # IMAX Low Pass Filter
602
+ "PSIMAXSWO ?", # Subwoofer Output LFE+Main/LFE
603
+ "PSSWL ?", # Subwoofer Level
604
+ "STBY?", # Auto Standby
605
+ "Z2STBY?", # Auto Standby
606
+ "Z3STBY?", # Auto Standby
607
+ "SLP?", # Sleep
608
+ "VSVPM ?", # Video Process
609
+ "PSLFE ?", # LFE Level
610
+ "PSBSC ?", # Bass Sync
611
+ "PSDEH ?", # Dialog Enhancer
612
+ "PSAUROPR ?", # Auro-Matic Preset
613
+ "PSAUROST ?", # Auro-Matic Strength
614
+ "PSAUROMODE ?", # AURO-3D Mode
615
+ "PSRSZ ?", # ROOM SIZE
616
+ "SPPR ?", # Speaker Preset
617
+ "PSDIC ?", # Dialog Control
618
+ "PSSP: ?", # Effect Speaker selection
619
+ "PSDRC ?", # DRC
620
+ "PSDEL ?", # DELAY TIME
621
+ "PSRSTR ?", # AUDIO RESTORER
622
+ ]
623
+
624
+ index = commands.index("MNMEN?")
625
+ if self.is_denon:
626
+ commands.insert(index := index + 1, "MSQUICK ?") # Quick Select
627
+ if not self.is_denon:
628
+ commands.insert(index + 1, "MSSMART ?") # SMART Select
629
+ index = commands.index("TR?")
630
+ commands.insert(index := index + 1, "PSMDAX ?") # MDAX
631
+ commands.insert(index := index + 1, "PSDACFIL ?") # DAC Filter
632
+ commands.insert(index := index + 1, "ILB ?") # Illumination
633
+ commands.insert(index + 1, "SSHOS ?") # Auto Lip Sync
634
+
553
635
  await self.async_send_commands(
554
- "ZM?",
555
- "SI?",
556
- "MV?",
557
- "MU?",
558
- "Z2?",
559
- "Z2MU?",
560
- "Z3?",
561
- "Z3MU?",
562
- "PSTONE CTRL ?",
563
- "PSBAS ?",
564
- "PSTRE ?",
565
- "PSDYNEQ ?",
566
- "PSLFC ?",
567
- "PSCNTAMT ?",
568
- "PSMULTEQ: ?",
569
- "PSREFLEV ?",
570
- "PSDYNVOL ?",
571
- "MS?",
572
- "MNMEN?",
573
- "DIM ?",
574
- "PSDELAY?",
575
- "ECO?",
576
- "VSMONI ?",
577
- "PSDIRAC ?",
578
- "CV?",
579
- "PSNEURAL ?",
580
- "PSIMAX ?",
581
- "PSIMAXAUD ?",
582
- "PSIMAXHPF ?",
583
- "PSIMAXLPF ?",
584
- "PSIMAXSWM ?",
585
- "PSIMAXSWO ?",
586
- "PSSWR ?",
587
- "PSSWL ?",
588
- "SSTTR ?",
589
- "MSQUICK ?",
590
- "MSSMART ?",
591
- "STBY?",
592
- "SLP?",
593
- "VSAUDIO ?",
594
- "PSCES ?",
595
- "VSVPM ?",
596
- "PSLFE ?",
597
- "PSLOM ?",
598
- "PSBSC ?",
599
- "PSDEH ?",
600
- "PSCINEMA EQ. ?",
601
- "PSAUROPR ?",
602
- "PSAUROST ?",
603
- "PSAUROMODE ?",
604
- "PSRSZ ?",
605
- "TR?",
606
- "SPPR ?",
607
- "BTTX ?",
608
- "PSDIC ?",
609
- "PSSPV ?",
610
- "PSSP: ?",
611
- "PSDRC ?",
612
- "PSDEL ?",
613
- "PSRSTR ?",
614
- "PSGEQ ?",
615
- "PSHEQ ?",
616
- skip_confirmation=True,
636
+ *commands,
637
+ confirmation_timeout=0.2,
617
638
  )
618
639
 
619
640
  def _schedule_monitor(self) -> None:
@@ -713,7 +734,7 @@ class DenonAVRTelnetApi:
713
734
  self._reconnect_task = None
714
735
 
715
736
  def register_callback(
716
- self, event: str, callback: Callable[[str, str, str], Awaitable[None]]
737
+ self, event: str, callback: Callable[[str, str, str], None]
717
738
  ) -> None:
718
739
  """Register a callback handler for an event type."""
719
740
  # Validate the passed in type
@@ -727,24 +748,20 @@ class DenonAVRTelnetApi:
727
748
  self._callbacks[event].append(callback)
728
749
 
729
750
  def unregister_callback(
730
- self, event: str, callback: Callable[[str, str, str], Awaitable[None]]
751
+ self, event: str, callback: Callable[[str, str, str], None]
731
752
  ) -> None:
732
753
  """Unregister a callback handler for an event type."""
733
754
  if event not in self._callbacks.keys():
734
755
  return
735
756
  self._callbacks[event].remove(callback)
736
757
 
737
- def _register_raw_callback(
738
- self, callback: Callable[[str], Awaitable[None]]
739
- ) -> None:
758
+ def _register_raw_callback(self, callback: Callable[[str], None]) -> None:
740
759
  """Register a callback handler for raw telnet messages."""
741
760
  if callback in self._raw_callbacks:
742
761
  return
743
762
  self._raw_callbacks.append(callback)
744
763
 
745
- def _unregister_raw_callback(
746
- self, callback: Callable[[str], Awaitable[None]]
747
- ) -> None:
764
+ def _unregister_raw_callback(self, callback: Callable[[str], None]) -> None:
748
765
  """Unregister a callback handler for raw telnet messages."""
749
766
  self._raw_callbacks.remove(callback)
750
767
 
@@ -788,19 +805,15 @@ class DenonAVRTelnetApi:
788
805
  if event not in TELNET_EVENTS:
789
806
  return
790
807
 
791
- task = asyncio.create_task(
792
- self._async_run_callbacks(message, event, zone, parameter)
793
- )
794
- self._callback_tasks.add(task)
795
- task.add_done_callback(self._callback_tasks.discard)
808
+ self._run_callbacks(message, event, zone, parameter)
796
809
 
797
- async def _async_run_callbacks(
810
+ def _run_callbacks(
798
811
  self, message: str, event: str, zone: str, parameter: str
799
812
  ) -> None:
800
813
  """Handle triggering the registered callbacks."""
801
814
  for callback in self._raw_callbacks:
802
815
  try:
803
- await callback(message)
816
+ callback(message)
804
817
  except Exception as err: # pylint: disable=broad-except
805
818
  # We don't want a single bad callback to trip up the
806
819
  # whole system and prevent further execution
@@ -813,7 +826,7 @@ class DenonAVRTelnetApi:
813
826
  if event in self._callbacks.keys():
814
827
  for callback in self._callbacks[event]:
815
828
  try:
816
- await callback(zone, event, parameter)
829
+ callback(zone, event, parameter)
817
830
  except Exception as err: # pylint: disable=broad-except
818
831
  # We don't want a single bad callback to trip up the
819
832
  # whole system and prevent further execution
@@ -826,7 +839,7 @@ class DenonAVRTelnetApi:
826
839
  if ALL_TELNET_EVENTS in self._callbacks.keys():
827
840
  for callback in self._callbacks[ALL_TELNET_EVENTS]:
828
841
  try:
829
- await callback(zone, event, parameter)
842
+ callback(zone, event, parameter)
830
843
  except Exception as err: # pylint: disable=broad-except
831
844
  # We don't want a single bad callback to trip up the
832
845
  # whole system and prevent further execution
@@ -844,7 +857,7 @@ class DenonAVRTelnetApi:
844
857
  return event
845
858
  return ""
846
859
 
847
- async def _async_send_confirmation_callback(self, message: str) -> None:
860
+ def _send_confirmation_callback(self, message: str) -> None:
848
861
  """Confirm that the telnet command has been executed."""
849
862
  if len(message) < 3:
850
863
  return
@@ -855,9 +868,15 @@ class DenonAVRTelnetApi:
855
868
  _LOGGER.debug("Command %s confirmed", command)
856
869
 
857
870
  async def _async_send_command(
858
- self, command: str, skip_confirmation: bool = False
871
+ self,
872
+ command: str,
873
+ skip_confirmation: bool = False,
874
+ confirmation_timeout: Optional[float] = None,
859
875
  ) -> None:
860
876
  """Send one telnet command to the receiver."""
877
+ if confirmation_timeout is None:
878
+ confirmation_timeout = self._send_confirmation_timeout
879
+
861
880
  async with self._send_lock:
862
881
  if not skip_confirmation:
863
882
  self._send_confirmation_command = command
@@ -872,26 +891,42 @@ class DenonAVRTelnetApi:
872
891
  try:
873
892
  await asyncio.wait_for(
874
893
  self._send_confirmation_event.wait(),
875
- self._send_confirmation_timeout,
894
+ confirmation_timeout,
876
895
  )
877
896
  except asyncio.TimeoutError:
878
- _LOGGER.info(
897
+ _LOGGER.debug(
879
898
  "Timeout waiting for confirmation of command: %s", command
880
899
  )
881
900
  finally:
882
901
  self._send_confirmation_command = ""
883
902
 
884
903
  async def async_send_commands(
885
- self, *commands: str, skip_confirmation: bool = False
904
+ self,
905
+ *commands: str,
906
+ skip_confirmation: bool = False,
907
+ confirmation_timeout: Optional[float] = None,
886
908
  ) -> None:
887
909
  """Send telnet commands to the receiver."""
888
910
  for command in commands:
889
- await self._async_send_command(command, skip_confirmation=skip_confirmation)
911
+ await self._async_send_command(
912
+ command,
913
+ skip_confirmation=skip_confirmation,
914
+ confirmation_timeout=confirmation_timeout,
915
+ )
890
916
 
891
- def send_commands(self, *commands: str, skip_confirmation: bool = False) -> None:
917
+ def send_commands(
918
+ self,
919
+ *commands: str,
920
+ skip_confirmation: bool = False,
921
+ confirmation_timeout: Optional[float] = None,
922
+ ) -> None:
892
923
  """Send telnet commands to the receiver."""
893
924
  task = asyncio.create_task(
894
- self.async_send_commands(*commands, skip_confirmation=skip_confirmation)
925
+ self.async_send_commands(
926
+ *commands,
927
+ skip_confirmation=skip_confirmation,
928
+ confirmation_timeout=confirmation_timeout,
929
+ )
895
930
  )
896
931
  self._send_tasks.add(task)
897
932
  task.add_done_callback(self._send_tasks.discard)
@@ -30,6 +30,8 @@ class AppCommandResponsePattern:
30
30
 
31
31
  update_attribute: str = attr.ib(converter=str)
32
32
  add_zone: bool = attr.ib(converter=bool, default=True)
33
+ search_zone_text: bool = attr.ib(converter=bool, default=False)
34
+ prefix: str = attr.ib(converter=str, default="")
33
35
  suffix: str = attr.ib(converter=str, default="")
34
36
  get_xml_attribute: Optional[str] = attr.ib(
35
37
  converter=attr.converters.optional(str), default=None
@@ -73,7 +75,7 @@ class AppCommands:
73
75
  """Collect known AppCommand.xml tags."""
74
76
 
75
77
  GetAllZoneMuteStatus = AppCommandCmd(
76
- cmd_id=1,
78
+ cmd_id="1",
77
79
  cmd_text="GetAllZoneMuteStatus",
78
80
  response_pattern=(
79
81
  AppCommandResponsePattern(
@@ -82,7 +84,7 @@ class AppCommands:
82
84
  ),
83
85
  )
84
86
  GetAllZonePowerStatus = AppCommandCmd(
85
- cmd_id=1,
87
+ cmd_id="1",
86
88
  cmd_text="GetAllZonePowerStatus",
87
89
  response_pattern=(
88
90
  AppCommandResponsePattern(
@@ -91,7 +93,7 @@ class AppCommands:
91
93
  ),
92
94
  )
93
95
  GetAllZoneSource = AppCommandCmd(
94
- cmd_id=1,
96
+ cmd_id="1",
95
97
  cmd_text="GetAllZoneSource",
96
98
  response_pattern=(
97
99
  AppCommandResponsePattern(
@@ -100,7 +102,7 @@ class AppCommands:
100
102
  ),
101
103
  )
102
104
  GetAllZoneVolume = AppCommandCmd(
103
- cmd_id=1,
105
+ cmd_id="1",
104
106
  cmd_text="GetAllZoneVolume",
105
107
  response_pattern=(
106
108
  AppCommandResponsePattern(
@@ -109,8 +111,42 @@ class AppCommands:
109
111
  ),
110
112
  )
111
113
 
114
+ GetAutoStandby = AppCommandCmd(
115
+ cmd_id="1",
116
+ cmd_text="GetAutoStandby",
117
+ response_pattern=(
118
+ AppCommandResponsePattern(
119
+ update_attribute="_auto_standby",
120
+ add_zone=False,
121
+ search_zone_text=True,
122
+ prefix="/list/listvalue/",
123
+ suffix="/value",
124
+ ),
125
+ ),
126
+ )
127
+
128
+ GetDimmer = AppCommandCmd(
129
+ cmd_id="1",
130
+ cmd_text="GetDimmer",
131
+ response_pattern=(
132
+ AppCommandResponsePattern(
133
+ update_attribute="_dimmer", add_zone=False, suffix="/value"
134
+ ),
135
+ ),
136
+ )
137
+
138
+ GetECO = AppCommandCmd(
139
+ cmd_id="1",
140
+ cmd_text="GetECO",
141
+ response_pattern=(
142
+ AppCommandResponsePattern(
143
+ update_attribute="_eco_mode", add_zone=False, suffix="/mode"
144
+ ),
145
+ ),
146
+ )
147
+
112
148
  GetSurroundModeStatus = AppCommandCmd(
113
- cmd_id=1,
149
+ cmd_id="1",
114
150
  cmd_text="GetSurroundModeStatus",
115
151
  response_pattern=(
116
152
  AppCommandResponsePattern(
@@ -120,7 +156,7 @@ class AppCommands:
120
156
  )
121
157
 
122
158
  GetToneControl = AppCommandCmd(
123
- cmd_id=1,
159
+ cmd_id="1",
124
160
  cmd_text="GetToneControl",
125
161
  response_pattern=(
126
162
  AppCommandResponsePattern(
@@ -149,7 +185,7 @@ class AppCommands:
149
185
  )
150
186
  # Replace set command with a real command using attr.evolve
151
187
  SetToneControl = AppCommandCmd(
152
- cmd_id=1,
188
+ cmd_id="1",
153
189
  cmd_text="SetToneControl",
154
190
  set_command=AppCommandCmdParam(name="REPLACE", text="REPLACE"),
155
191
  )
@@ -160,7 +196,7 @@ class AppCommands:
160
196
  GetFriendlyName = AppCommandCmd(cmd_id=1, cmd_text="GetFriendlyName")
161
197
 
162
198
  GetAudyssey = AppCommandCmd(
163
- cmd_id=3,
199
+ cmd_id="3",
164
200
  name="GetAudyssey",
165
201
  param_list=(
166
202
  AppCommandCmdParam(name="dynamiceq"),
@@ -216,22 +252,22 @@ class AppCommands:
216
252
  ),
217
253
  )
218
254
  SetAudysseyDynamicEQ = AppCommandCmd(
219
- cmd_id=3,
255
+ cmd_id="3",
220
256
  name="SetAudyssey",
221
257
  param_list=(AppCommandCmdParam(name="dynamiceq", text="REPLACE"),),
222
258
  )
223
259
  SetAudysseyMultiEQ = AppCommandCmd(
224
- cmd_id=3,
260
+ cmd_id="3",
225
261
  name="SetAudyssey",
226
262
  param_list=(AppCommandCmdParam(name="multieq", text="REPLACE"),),
227
263
  )
228
264
  SetAudysseyReflevoffset = AppCommandCmd(
229
- cmd_id=3,
265
+ cmd_id="3",
230
266
  name="SetAudyssey",
231
267
  param_list=(AppCommandCmdParam(name="reflevoffset", text="REPLACE"),),
232
268
  )
233
269
  SetAudysseyDynamicvol = AppCommandCmd(
234
- cmd_id=3,
270
+ cmd_id="3",
235
271
  name="SetAudyssey",
236
272
  param_list=(AppCommandCmdParam(name="dynamicvol", text="REPLACE"),),
237
273
  )