denonavr 1.1.2__tar.gz → 1.2.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 (280) hide show
  1. {denonavr-1.1.2 → denonavr-1.2.0}/PKG-INFO +2 -1
  2. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/__init__.py +1 -1
  3. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/api.py +145 -112
  4. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/audyssey.py +2 -6
  5. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/const.py +109 -0
  6. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/denonavr.py +64 -5
  7. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/dirac.py +2 -6
  8. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/foundation.py +221 -85
  9. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/input.py +56 -48
  10. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/soundmode.py +126 -42
  11. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/ssdp.py +12 -11
  12. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/tonecontrol.py +2 -6
  13. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/volume.py +14 -30
  14. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/PKG-INFO +2 -1
  15. {denonavr-1.1.2 → denonavr-1.2.0}/pyproject.toml +2 -1
  16. {denonavr-1.1.2 → denonavr-1.2.0}/tests/test_denonavr.py +1 -1
  17. {denonavr-1.1.2 → denonavr-1.2.0}/LICENSE +0 -0
  18. {denonavr-1.1.2 → denonavr-1.2.0}/README.md +0 -0
  19. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/appcommand.py +0 -0
  20. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/decorators.py +0 -0
  21. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr/exceptions.py +0 -0
  22. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/SOURCES.txt +0 -0
  23. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/dependency_links.txt +0 -0
  24. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/not-zip-safe +0 -0
  25. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/requires.txt +0 -0
  26. {denonavr-1.1.2 → denonavr-1.2.0}/denonavr.egg-info/top_level.txt +0 -0
  27. {denonavr-1.1.2 → denonavr-1.2.0}/setup.cfg +0 -0
  28. {denonavr-1.1.2 → denonavr-1.2.0}/tests/__init__.py +0 -0
  29. {denonavr-1.1.2 → denonavr-1.2.0}/tests/test_const.py +0 -0
  30. {denonavr-1.1.2 → denonavr-1.2.0}/tests/test_ssdp.py +0 -0
  31. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AV7703-AppCommand-setup-8080.xml +0 -0
  32. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AV7703-AppCommand-update-8080.xml +0 -0
  33. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AV7703-AppCommand-update-soundmode-8080.xml +0 -0
  34. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AV7703-AppCommand-update-tonecontrol-8080.xml +0 -0
  35. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AV7703-Deviceinfo-8080.xml +0 -0
  36. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-8500H-AppCommand-setup-8080.xml +0 -0
  37. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-8500H-AppCommand-update-8080.xml +0 -0
  38. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-8500H-AppCommand-update-soundmode-8080.xml +0 -0
  39. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-8500H-AppCommand-update-tonecontrol-8080.xml +0 -0
  40. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-8500H-Deviceinfo-8080.xml +0 -0
  41. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-A10H-AppCommand-setup-8080.xml +0 -0
  42. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-A10H-AppCommand-update-8080.xml +0 -0
  43. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-A10H-AppCommand-update-soundmode-8080.xml +0 -0
  44. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-A10H-AppCommand-update-tonecontrol-8080.xml +0 -0
  45. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-A10H-Deviceinfo-8080.xml +0 -0
  46. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-X3700H-AppCommand-setup-8080.xml +0 -0
  47. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-X3700H-AppCommand-update-8080.xml +0 -0
  48. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-X3700H-AppCommand-update-soundmode-8080.xml +0 -0
  49. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-X3700H-AppCommand-update-tonecontrol-8080.xml +0 -0
  50. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVC-X3700H-Deviceinfo-8080.xml +0 -0
  51. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-AppCommand-setup.xml +0 -0
  52. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-AppCommand-update-soundmode.xml +0 -0
  53. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-AppCommand-update-tonecontrol.xml +0 -0
  54. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-AppCommand-update.xml +0 -0
  55. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-Deviceinfo.xml +0 -0
  56. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formMainZone_MainZoneXml.xml +0 -0
  57. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formMainZone_MainZoneXmlStatus.xml +0 -0
  58. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formNetAudio_StatusXml.xml +0 -0
  59. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formTuner_HdXml.xml +0 -0
  60. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formTuner_TunerXml.xml +0 -0
  61. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formZone2_Zone2XmlStatus.xml +0 -0
  62. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1713-formZone3_Zone3XmlStatus.xml +0 -0
  63. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-AppCommand-setup.xml +0 -0
  64. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-AppCommand-update-soundmode.xml +0 -0
  65. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-AppCommand-update-tonecontrol.xml +0 -0
  66. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-AppCommand-update.xml +0 -0
  67. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-Deviceinfo.xml +0 -0
  68. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-formMainZone_MainZoneXml.xml +0 -0
  69. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-formMainZone_MainZoneXmlStatus.xml +0 -0
  70. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-1912-formNetAudio_StatusXml.xml +0 -0
  71. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-AppCommand-setup.xml +0 -0
  72. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-AppCommand-update-soundmode.xml +0 -0
  73. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-AppCommand-update-tonecontrol.xml +0 -0
  74. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-AppCommand-update.xml +0 -0
  75. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-Deviceinfo.xml +0 -0
  76. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXml.xml +0 -0
  77. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  78. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-2312CI-formNetAudio_StatusXml.xml +0 -0
  79. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-AppCommand-setup.xml +0 -0
  80. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-AppCommand-update-soundmode.xml +0 -0
  81. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-AppCommand-update-tonecontrol.xml +0 -0
  82. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-AppCommand-update.xml +0 -0
  83. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-Deviceinfo.xml +0 -0
  84. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXml.xml +0 -0
  85. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  86. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3311CI-formNetAudio_StatusXml.xml +0 -0
  87. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-AppCommand-setup.xml +0 -0
  88. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-AppCommand-update-soundmode.xml +0 -0
  89. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-AppCommand-update-tonecontrol.xml +0 -0
  90. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-AppCommand-update.xml +0 -0
  91. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-Deviceinfo.xml +0 -0
  92. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formMainZone_MainZoneXml.xml +0 -0
  93. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formMainZone_MainZoneXmlStatus.xml +0 -0
  94. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formNetAudio_StatusXml.xml +0 -0
  95. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formTuner_HdXml.xml +0 -0
  96. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formTuner_TunerXml.xml +0 -0
  97. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formZone2_Zone2XmlStatus.xml +0 -0
  98. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3312-formZone3_Zone3XmlStatus.xml +0 -0
  99. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-AppCommand-setup.xml +0 -0
  100. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-AppCommand-update-soundmode.xml +0 -0
  101. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-AppCommand-update-tonecontrol.xml +0 -0
  102. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-AppCommand-update.xml +0 -0
  103. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-Deviceinfo.xml +0 -0
  104. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formMainZone_MainZoneXml.xml +0 -0
  105. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formMainZone_MainZoneXmlStatus.xml +0 -0
  106. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formNetAudio_StatusXml.xml +0 -0
  107. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formTuner_HdXml.xml +0 -0
  108. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formTuner_TunerXml.xml +0 -0
  109. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formZone2_Zone2XmlStatus.xml +0 -0
  110. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-3313-formZone3_Zone3XmlStatus.xml +0 -0
  111. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-AppCommand-setup.xml +0 -0
  112. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-AppCommand-update-soundmode.xml +0 -0
  113. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-AppCommand-update-tonecontrol.xml +0 -0
  114. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-AppCommand-update.xml +0 -0
  115. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-Deviceinfo.xml +0 -0
  116. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formMainZone_MainZoneXml.xml +0 -0
  117. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formMainZone_MainZoneXmlStatus.xml +0 -0
  118. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formNetAudio_StatusXml.xml +0 -0
  119. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formTuner_HdXml.xml +0 -0
  120. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formTuner_TunerXml.xml +0 -0
  121. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formZone2_Zone2XmlStatus.xml +0 -0
  122. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-4810-formZone3_Zone3XmlStatus.xml +0 -0
  123. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-AppCommand-setup.xml +0 -0
  124. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-AppCommand-update-soundmode.xml +0 -0
  125. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-AppCommand-update-tonecontrol.xml +0 -0
  126. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-AppCommand-update.xml +0 -0
  127. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-Deviceinfo.xml +0 -0
  128. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXml.xml +0 -0
  129. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  130. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formNetAudio_StatusXml.xml +0 -0
  131. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formTuner_HdXml.xml +0 -0
  132. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formTuner_TunerXml.xml +0 -0
  133. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formZone2_Zone2XmlStatus.xml +0 -0
  134. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1100W-formZone3_Zone3XmlStatus.xml +0 -0
  135. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X1600H_upnp.xml +0 -0
  136. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-AppCommand-setup.xml +0 -0
  137. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-AppCommand-update-soundmode.xml +0 -0
  138. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-AppCommand-update-tonecontrol.xml +0 -0
  139. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-AppCommand-update.xml +0 -0
  140. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-Deviceinfo.xml +0 -0
  141. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXml.xml +0 -0
  142. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  143. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-2-formNetAudio_StatusXml.xml +0 -0
  144. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-AppCommand-setup.xml +0 -0
  145. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-AppCommand-update-soundmode.xml +0 -0
  146. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-AppCommand-update-tonecontrol.xml +0 -0
  147. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-AppCommand-update.xml +0 -0
  148. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-Deviceinfo.xml +0 -0
  149. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXml.xml +0 -0
  150. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXmlStatus.xml +0 -0
  151. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formNetAudio_StatusXml.xml +0 -0
  152. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formTuner_HdXml.xml +0 -0
  153. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formTuner_TunerXml.xml +0 -0
  154. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formZone2_Zone2XmlStatus.xml +0 -0
  155. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2000-formZone3_Zone3XmlStatus.xml +0 -0
  156. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-AppCommand-setup.xml +0 -0
  157. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-AppCommand-update-soundmode.xml +0 -0
  158. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-AppCommand-update-tonecontrol.xml +0 -0
  159. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-AppCommand-update.xml +0 -0
  160. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-Deviceinfo.xml +0 -0
  161. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXml.xml +0 -0
  162. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  163. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-2-formNetAudio_StatusXml.xml +0 -0
  164. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-AppCommand-setup.xml +0 -0
  165. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-AppCommand-update-soundmode.xml +0 -0
  166. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-AppCommand-update-tonecontrol.xml +0 -0
  167. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-AppCommand-update.xml +0 -0
  168. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXml.xml +0 -0
  169. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  170. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X2100W-formNetAudio_StatusXml.xml +0 -0
  171. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-AppCommand-setup.xml +0 -0
  172. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-AppCommand-update-soundmode.xml +0 -0
  173. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-AppCommand-update-tonecontrol.xml +0 -0
  174. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-AppCommand-update.xml +0 -0
  175. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-Deviceinfo.xml +0 -0
  176. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXml.xml +0 -0
  177. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXmlStatus.xml +0 -0
  178. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formNetAudio_StatusXml.xml +0 -0
  179. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formTuner_HdXml.xml +0 -0
  180. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formTuner_TunerXml.xml +0 -0
  181. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formZone2_Zone2XmlStatus.xml +0 -0
  182. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4000-formZone3_Zone3XmlStatus.xml +0 -0
  183. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-AppCommand-setup.xml +0 -0
  184. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-AppCommand-update-soundmode.xml +0 -0
  185. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-AppCommand-update-tonecontrol.xml +0 -0
  186. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-AppCommand-update.xml +0 -0
  187. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-Deviceinfo.xml +0 -0
  188. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXml.xml +0 -0
  189. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  190. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4100W-formNetAudio_StatusXml.xml +0 -0
  191. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4300H-AppCommand-setup-8080.xml +0 -0
  192. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4300H-AppCommand-update-8080.xml +0 -0
  193. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4300H-AppCommand-update-soundmode-8080.xml +0 -0
  194. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4300H-AppCommand-update-tonecontrol-8080.xml +0 -0
  195. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/AVR-X4300H-Deviceinfo-8080.xml +0 -0
  196. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-AppCommand-setup.xml +0 -0
  197. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-AppCommand-update-soundmode.xml +0 -0
  198. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-AppCommand-update-tonecontrol.xml +0 -0
  199. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-AppCommand-update.xml +0 -0
  200. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-Deviceinfo.xml +0 -0
  201. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXml.xml +0 -0
  202. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  203. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-formNetAudio_StatusXml.xml +0 -0
  204. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-formTuner_HdXml.xml +0 -0
  205. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-2-formTuner_TunerXml.xml +0 -0
  206. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-AppCommand-setup.xml +0 -0
  207. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-AppCommand-update-soundmode.xml +0 -0
  208. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-AppCommand-update-tonecontrol.xml +0 -0
  209. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-AppCommand-update.xml +0 -0
  210. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-Deviceinfo.xml +0 -0
  211. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-formMainZone_MainZoneXml.xml +0 -0
  212. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-formMainZone_MainZoneXmlStatus.xml +0 -0
  213. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-formNetAudio_StatusXml.xml +0 -0
  214. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-formTuner_HdXml.xml +0 -0
  215. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR510-formTuner_TunerXml.xml +0 -0
  216. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-AppCommand-setup.xml +0 -0
  217. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-AppCommand-update-soundmode.xml +0 -0
  218. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-AppCommand-update-tonecontrol.xml +0 -0
  219. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-AppCommand-update.xml +0 -0
  220. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-Deviceinfo.xml +0 -0
  221. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formMainZone_MainZoneXml.xml +0 -0
  222. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formMainZone_MainZoneXmlStatus.xml +0 -0
  223. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formNetAudio_StatusXml.xml +0 -0
  224. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formTuner_HdXml.xml +0 -0
  225. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formTuner_TunerXml.xml +0 -0
  226. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formZone2_Zone2XmlStatus.xml +0 -0
  227. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-CR603-formZone3_Zone3XmlStatus.xml +0 -0
  228. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-AppCommand-setup.xml +0 -0
  229. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-AppCommand-update-soundmode.xml +0 -0
  230. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-AppCommand-update-tonecontrol.xml +0 -0
  231. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-AppCommand-update.xml +0 -0
  232. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-Deviceinfo.xml +0 -0
  233. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-formMainZone_MainZoneXml.xml +0 -0
  234. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-formMainZone_MainZoneXmlStatus.xml +0 -0
  235. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-formNetAudio_StatusXml.xml +0 -0
  236. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/M-RC610-formTuner_TunerXml.xml +0 -0
  237. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-AppCommand-setup.xml +0 -0
  238. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-AppCommand-update-soundmode.xml +0 -0
  239. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-AppCommand-update-tonecontrol.xml +0 -0
  240. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-AppCommand-update.xml +0 -0
  241. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-Deviceinfo.xml +0 -0
  242. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formMainZone_MainZoneXml.xml +0 -0
  243. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formMainZone_MainZoneXmlStatus.xml +0 -0
  244. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formNetAudio_StatusXml.xml +0 -0
  245. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formTuner_HdXml.xml +0 -0
  246. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formTuner_TunerXml.xml +0 -0
  247. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formZone2_Zone2XmlStatus.xml +0 -0
  248. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1604-formZone3_Zone3XmlStatus.xml +0 -0
  249. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1609-AppCommand-setup-8080.xml +0 -0
  250. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1609-AppCommand-update-8080.xml +0 -0
  251. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1609-AppCommand-update-soundmode-8080.xml +0 -0
  252. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1609-AppCommand-update-tonecontrol-8080.xml +0 -0
  253. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/NR1609-Deviceinfo-8080.xml +0 -0
  254. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-AppCommand-setup.xml +0 -0
  255. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-AppCommand-update-soundmode.xml +0 -0
  256. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-AppCommand-update-tonecontrol.xml +0 -0
  257. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-AppCommand-update.xml +0 -0
  258. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-Deviceinfo.xml +0 -0
  259. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-formMainZone_MainZoneXml.xml +0 -0
  260. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-formMainZone_MainZoneXmlStatus.xml +0 -0
  261. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-formNetAudio_StatusXml.xml +0 -0
  262. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-formTuner_HdXml.xml +0 -0
  263. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR5008-formTuner_TunerXml.xml +0 -0
  264. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-AppCommand-setup.xml +0 -0
  265. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-AppCommand-update-soundmode.xml +0 -0
  266. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-AppCommand-update-tonecontrol.xml +0 -0
  267. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-AppCommand-update.xml +0 -0
  268. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-Deviceinfo.xml +0 -0
  269. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formMainZone_MainZoneXml.xml +0 -0
  270. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formMainZone_MainZoneXmlStatus.xml +0 -0
  271. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formNetAudio_StatusXml.xml +0 -0
  272. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formTuner_HdXml.xml +0 -0
  273. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formTuner_TunerXml.xml +0 -0
  274. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formZone2_Zone2XmlStatus.xml +0 -0
  275. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6011-formZone3_Zone3XmlStatus.xml +0 -0
  276. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6012-AppCommand-setup-8080.xml +0 -0
  277. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6012-AppCommand-update-8080.xml +0 -0
  278. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6012-AppCommand-update-soundmode-8080.xml +0 -0
  279. {denonavr-1.1.2 → denonavr-1.2.0}/tests/xml/SR6012-AppCommand-update-tonecontrol-8080.xml +0 -0
  280. {denonavr-1.1.2 → denonavr-1.2.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.2.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.2.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, cast
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():
@@ -137,13 +127,15 @@ class HTTPXAsyncClient:
137
127
  """Call GET 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,7 +477,6 @@ 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(
@@ -492,20 +484,21 @@ class DenonAVRTelnetApi:
492
484
  )
493
485
  _send_confirmation_command: str = attr.ib(converter=str, default="")
494
486
  _send_tasks: Set[asyncio.Task] = attr.ib(attr.Factory(set))
495
- _callbacks: Dict[str, List[Coroutine]] = attr.ib(
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(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."""
@@ -549,71 +542,97 @@ class DenonAVRTelnetApi:
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
+ "SLP?", # Sleep
606
+ "VSVPM ?", # Video Process
607
+ "PSLFE ?", # LFE Level
608
+ "PSBSC ?", # Bass Sync
609
+ "PSDEH ?", # Dialog Enhancer
610
+ "PSAUROPR ?", # Auro-Matic Preset
611
+ "PSAUROST ?", # Auro-Matic Strength
612
+ "PSAUROMODE ?", # AURO-3D Mode
613
+ "PSRSZ ?", # ROOM SIZE
614
+ "SPPR ?", # Speaker Preset
615
+ "PSDIC ?", # Dialog Control
616
+ "PSSP: ?", # Effect Speaker selection
617
+ "PSDRC ?", # DRC
618
+ "PSDEL ?", # DELAY TIME
619
+ "PSRSTR ?", # AUDIO RESTORER
620
+ ]
621
+
622
+ index = commands.index("MNMEN?")
623
+ if self.is_denon:
624
+ commands.insert(index := index + 1, "MSQUICK ?") # Quick Select
625
+ if not self.is_denon:
626
+ commands.insert(index + 1, "MSSMART ?") # SMART Select
627
+ index = commands.index("TR?")
628
+ commands.insert(index := index + 1, "PSMDAX ?") # MDAX
629
+ commands.insert(index := index + 1, "PSDACFIL ?") # DAC Filter
630
+ commands.insert(index := index + 1, "ILB ?") # Illumination
631
+ commands.insert(index + 1, "SSHOS ?") # Auto Lip Sync
632
+
553
633
  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,
634
+ *commands,
635
+ confirmation_timeout=0.2,
617
636
  )
618
637
 
619
638
  def _schedule_monitor(self) -> None:
@@ -713,7 +732,7 @@ class DenonAVRTelnetApi:
713
732
  self._reconnect_task = None
714
733
 
715
734
  def register_callback(
716
- self, event: str, callback: Callable[[str, str, str], Awaitable[None]]
735
+ self, event: str, callback: Callable[[str, str, str], None]
717
736
  ) -> None:
718
737
  """Register a callback handler for an event type."""
719
738
  # Validate the passed in type
@@ -727,24 +746,20 @@ class DenonAVRTelnetApi:
727
746
  self._callbacks[event].append(callback)
728
747
 
729
748
  def unregister_callback(
730
- self, event: str, callback: Callable[[str, str, str], Awaitable[None]]
749
+ self, event: str, callback: Callable[[str, str, str], None]
731
750
  ) -> None:
732
751
  """Unregister a callback handler for an event type."""
733
752
  if event not in self._callbacks.keys():
734
753
  return
735
754
  self._callbacks[event].remove(callback)
736
755
 
737
- def _register_raw_callback(
738
- self, callback: Callable[[str], Awaitable[None]]
739
- ) -> None:
756
+ def _register_raw_callback(self, callback: Callable[[str], None]) -> None:
740
757
  """Register a callback handler for raw telnet messages."""
741
758
  if callback in self._raw_callbacks:
742
759
  return
743
760
  self._raw_callbacks.append(callback)
744
761
 
745
- def _unregister_raw_callback(
746
- self, callback: Callable[[str], Awaitable[None]]
747
- ) -> None:
762
+ def _unregister_raw_callback(self, callback: Callable[[str], None]) -> None:
748
763
  """Unregister a callback handler for raw telnet messages."""
749
764
  self._raw_callbacks.remove(callback)
750
765
 
@@ -788,19 +803,15 @@ class DenonAVRTelnetApi:
788
803
  if event not in TELNET_EVENTS:
789
804
  return
790
805
 
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)
806
+ self._run_callbacks(message, event, zone, parameter)
796
807
 
797
- async def _async_run_callbacks(
808
+ def _run_callbacks(
798
809
  self, message: str, event: str, zone: str, parameter: str
799
810
  ) -> None:
800
811
  """Handle triggering the registered callbacks."""
801
812
  for callback in self._raw_callbacks:
802
813
  try:
803
- await callback(message)
814
+ callback(message)
804
815
  except Exception as err: # pylint: disable=broad-except
805
816
  # We don't want a single bad callback to trip up the
806
817
  # whole system and prevent further execution
@@ -813,7 +824,7 @@ class DenonAVRTelnetApi:
813
824
  if event in self._callbacks.keys():
814
825
  for callback in self._callbacks[event]:
815
826
  try:
816
- await callback(zone, event, parameter)
827
+ callback(zone, event, parameter)
817
828
  except Exception as err: # pylint: disable=broad-except
818
829
  # We don't want a single bad callback to trip up the
819
830
  # whole system and prevent further execution
@@ -826,7 +837,7 @@ class DenonAVRTelnetApi:
826
837
  if ALL_TELNET_EVENTS in self._callbacks.keys():
827
838
  for callback in self._callbacks[ALL_TELNET_EVENTS]:
828
839
  try:
829
- await callback(zone, event, parameter)
840
+ callback(zone, event, parameter)
830
841
  except Exception as err: # pylint: disable=broad-except
831
842
  # We don't want a single bad callback to trip up the
832
843
  # whole system and prevent further execution
@@ -844,7 +855,7 @@ class DenonAVRTelnetApi:
844
855
  return event
845
856
  return ""
846
857
 
847
- async def _async_send_confirmation_callback(self, message: str) -> None:
858
+ def _send_confirmation_callback(self, message: str) -> None:
848
859
  """Confirm that the telnet command has been executed."""
849
860
  if len(message) < 3:
850
861
  return
@@ -855,9 +866,15 @@ class DenonAVRTelnetApi:
855
866
  _LOGGER.debug("Command %s confirmed", command)
856
867
 
857
868
  async def _async_send_command(
858
- self, command: str, skip_confirmation: bool = False
869
+ self,
870
+ command: str,
871
+ skip_confirmation: bool = False,
872
+ confirmation_timeout: Optional[float] = None,
859
873
  ) -> None:
860
874
  """Send one telnet command to the receiver."""
875
+ if confirmation_timeout is None:
876
+ confirmation_timeout = self._send_confirmation_timeout
877
+
861
878
  async with self._send_lock:
862
879
  if not skip_confirmation:
863
880
  self._send_confirmation_command = command
@@ -872,26 +889,42 @@ class DenonAVRTelnetApi:
872
889
  try:
873
890
  await asyncio.wait_for(
874
891
  self._send_confirmation_event.wait(),
875
- self._send_confirmation_timeout,
892
+ confirmation_timeout,
876
893
  )
877
894
  except asyncio.TimeoutError:
878
- _LOGGER.info(
895
+ _LOGGER.debug(
879
896
  "Timeout waiting for confirmation of command: %s", command
880
897
  )
881
898
  finally:
882
899
  self._send_confirmation_command = ""
883
900
 
884
901
  async def async_send_commands(
885
- self, *commands: str, skip_confirmation: bool = False
902
+ self,
903
+ *commands: str,
904
+ skip_confirmation: bool = False,
905
+ confirmation_timeout: Optional[float] = None,
886
906
  ) -> None:
887
907
  """Send telnet commands to the receiver."""
888
908
  for command in commands:
889
- await self._async_send_command(command, skip_confirmation=skip_confirmation)
909
+ await self._async_send_command(
910
+ command,
911
+ skip_confirmation=skip_confirmation,
912
+ confirmation_timeout=confirmation_timeout,
913
+ )
890
914
 
891
- def send_commands(self, *commands: str, skip_confirmation: bool = False) -> None:
915
+ def send_commands(
916
+ self,
917
+ *commands: str,
918
+ skip_confirmation: bool = False,
919
+ confirmation_timeout: Optional[float] = None,
920
+ ) -> None:
892
921
  """Send telnet commands to the receiver."""
893
922
  task = asyncio.create_task(
894
- self.async_send_commands(*commands, skip_confirmation=skip_confirmation)
923
+ self.async_send_commands(
924
+ *commands,
925
+ skip_confirmation=skip_confirmation,
926
+ confirmation_timeout=confirmation_timeout,
927
+ )
895
928
  )
896
929
  self._send_tasks.add(task)
897
930
  task.add_done_callback(self._send_tasks.discard)
@@ -77,15 +77,11 @@ class DenonAVRAudyssey(DenonAVRFoundation):
77
77
  for tag in self.appcommand0300_attrs:
78
78
  self._device.api.add_appcommand0300_update_tag(tag)
79
79
 
80
- self._device.telnet_api.register_callback(
81
- "PS", self._async_sound_detail_callback
82
- )
80
+ self._device.telnet_api.register_callback("PS", self._sound_detail_callback)
83
81
 
84
82
  self._is_setup = True
85
83
 
86
- async def _async_sound_detail_callback(
87
- self, zone: str, event: str, parameter: str
88
- ) -> None:
84
+ def _sound_detail_callback(self, zone: str, event: str, parameter: str) -> None:
89
85
  """Handle a sound detail change event."""
90
86
  if self._device.zone != zone:
91
87
  return
@@ -114,6 +114,14 @@ ReceiverURLs = namedtuple(
114
114
  "command_panel_and_volume_lock",
115
115
  "command_graphic_eq",
116
116
  "command_headphone_eq",
117
+ "command_denon_hdmi_cec_on",
118
+ "command_denon_hdmi_cec_off",
119
+ "command_marantz_hdmi_cec_on",
120
+ "command_marantz_hdmi_cec_off",
121
+ "command_mdax", # Marantz Only
122
+ "command_dac_filter", # Marantz Only
123
+ "command_illumination", # Marantz Only
124
+ "command_auto_lip_sync", # Marantz Only
117
125
  ],
118
126
  )
119
127
  TelnetCommands = namedtuple(
@@ -209,6 +217,14 @@ TelnetCommands = namedtuple(
209
217
  "command_panel_and_volume_lock",
210
218
  "command_graphic_eq",
211
219
  "command_headphone_eq",
220
+ "command_denon_hdmi_cec_on",
221
+ "command_denon_hdmi_cec_off",
222
+ "command_marantz_hdmi_cec_on",
223
+ "command_marantz_hdmi_cec_off",
224
+ "command_mdax", # Marantz Only
225
+ "command_dac_filter", # Marantz Only
226
+ "command_illumination", # Marantz Only
227
+ "command_auto_lip_sync", # Marantz Only
212
228
  ],
213
229
  )
214
230
 
@@ -572,6 +588,16 @@ COMMAND_PANEL_LOCK = "/goform/formiPhoneAppDirect.xml?SYPANEL%20LOCK%20{mode}"
572
588
  COMMAND_PANEL_AND_VOLUME_LOCK = "/goform/formiPhoneAppDirect.xml?SYPANEL+V%20LOCK%20ON"
573
589
  COMMAND_GRAPHIC_EQ = "/goform/formiPhoneAppDirect.xml?PSGEQ%20{mode}"
574
590
  COMMAND_HEADPHONE_EQ = "/goform/formiPhoneAppDirect.xml?PSHEQ%20{mode}"
591
+ COMMAND_DENON_HDMI_CEC_ON = "/goform/formiPhoneAppDirect.xml?RCKSK0410826"
592
+ COMMAND_DENON_HDMI_CEC_OFF = "/goform/formiPhoneAppDirect.xml?RCKSK0410827"
593
+ COMMAND_MARANTZ_HDMI_CEC_ON = "/goform/formiPhoneAppDirect.xml?RCRC51608408"
594
+ COMMAND_MARANTZ_HDMI_CEC_OFF = "/goform/formiPhoneAppDirect.xml?RCRC51608409"
595
+ COMMAND_MDAX = "/goform/formiPhoneAppDirect.xml?PSMDAX%20{mode}" # Marantz Only
596
+ COMMAND_DAC_FILTER = "/goform/formiPhoneAppDirect.xml?PSDACFIL%20{mode}" # Marantz Only
597
+ COMMAND_ILLUMINATION = "/goform/formiPhoneAppDirect.xml?ILB%20{mode}" # Marantz Only
598
+ COMMAND_AUTO_LIP_SYNC = (
599
+ "/goform/formiPhoneAppDirect.xml?SSHOSALS%20{mode}" # Marantz Only
600
+ )
575
601
 
576
602
  # Zone 2 URLs
577
603
  STATUS_Z2_URL = "/goform/formZone2_Zone2XmlStatus.xml"
@@ -690,6 +716,14 @@ DENONAVR_URLS = ReceiverURLs(
690
716
  command_panel_and_volume_lock=COMMAND_PANEL_AND_VOLUME_LOCK,
691
717
  command_graphic_eq=COMMAND_GRAPHIC_EQ,
692
718
  command_headphone_eq=COMMAND_HEADPHONE_EQ,
719
+ command_denon_hdmi_cec_on=COMMAND_DENON_HDMI_CEC_ON,
720
+ command_denon_hdmi_cec_off=COMMAND_DENON_HDMI_CEC_OFF,
721
+ command_marantz_hdmi_cec_on=COMMAND_MARANTZ_HDMI_CEC_ON,
722
+ command_marantz_hdmi_cec_off=COMMAND_MARANTZ_HDMI_CEC_OFF,
723
+ command_mdax=COMMAND_MDAX, # Marantz Only
724
+ command_dac_filter=COMMAND_DAC_FILTER, # Marantz Only
725
+ command_illumination=COMMAND_ILLUMINATION, # Marantz Only
726
+ command_auto_lip_sync=COMMAND_AUTO_LIP_SYNC, # Marantz Only
693
727
  )
694
728
 
695
729
  ZONE2_URLS = ReceiverURLs(
@@ -785,6 +819,14 @@ ZONE2_URLS = ReceiverURLs(
785
819
  command_panel_and_volume_lock=COMMAND_PANEL_AND_VOLUME_LOCK,
786
820
  command_graphic_eq=COMMAND_GRAPHIC_EQ,
787
821
  command_headphone_eq=COMMAND_HEADPHONE_EQ,
822
+ command_denon_hdmi_cec_on=COMMAND_DENON_HDMI_CEC_ON,
823
+ command_denon_hdmi_cec_off=COMMAND_DENON_HDMI_CEC_OFF,
824
+ command_marantz_hdmi_cec_on=COMMAND_MARANTZ_HDMI_CEC_ON,
825
+ command_marantz_hdmi_cec_off=COMMAND_MARANTZ_HDMI_CEC_OFF,
826
+ command_mdax=COMMAND_MDAX, # Marantz Only
827
+ command_dac_filter=COMMAND_DAC_FILTER, # Marantz Only
828
+ command_illumination=COMMAND_ILLUMINATION, # Marantz Only
829
+ command_auto_lip_sync=COMMAND_AUTO_LIP_SYNC, # Marantz Only
788
830
  )
789
831
 
790
832
  ZONE3_URLS = ReceiverURLs(
@@ -880,6 +922,14 @@ ZONE3_URLS = ReceiverURLs(
880
922
  command_panel_and_volume_lock=COMMAND_PANEL_AND_VOLUME_LOCK,
881
923
  command_graphic_eq=COMMAND_GRAPHIC_EQ,
882
924
  command_headphone_eq=COMMAND_HEADPHONE_EQ,
925
+ command_denon_hdmi_cec_on=COMMAND_DENON_HDMI_CEC_ON,
926
+ command_denon_hdmi_cec_off=COMMAND_DENON_HDMI_CEC_OFF,
927
+ command_marantz_hdmi_cec_on=COMMAND_MARANTZ_HDMI_CEC_ON,
928
+ command_marantz_hdmi_cec_off=COMMAND_MARANTZ_HDMI_CEC_OFF,
929
+ command_mdax=COMMAND_MDAX, # Marantz Only
930
+ command_dac_filter=COMMAND_DAC_FILTER, # Marantz Only
931
+ command_illumination=COMMAND_ILLUMINATION, # Marantz Only
932
+ command_auto_lip_sync=COMMAND_AUTO_LIP_SYNC, # Marantz Only
883
933
  )
884
934
 
885
935
  # Telnet Events
@@ -891,6 +941,7 @@ TELNET_EVENTS = {
891
941
  "DIM",
892
942
  "ECO",
893
943
  "HD",
944
+ "ILB", # Marantz Only
894
945
  "MN",
895
946
  "MS",
896
947
  "MU",
@@ -1030,6 +1081,14 @@ DENONAVR_TELNET_COMMANDS = TelnetCommands(
1030
1081
  command_panel_and_volume_lock="SYPANEL+V LOCK ON",
1031
1082
  command_graphic_eq="PSGEQ {mode}",
1032
1083
  command_headphone_eq="PSHEQ {mode}",
1084
+ command_denon_hdmi_cec_on="RCKSK0410826",
1085
+ command_denon_hdmi_cec_off="RCKSK0410827",
1086
+ command_marantz_hdmi_cec_on="RCRC51608408",
1087
+ command_marantz_hdmi_cec_off="RCRC51608409",
1088
+ command_mdax="PSMDAX {mode}", # Marantz Only
1089
+ command_dac_filter="PSDACFIL {mode}", # Marantz Only
1090
+ command_illumination="ILB {mode}", # Marantz Only
1091
+ command_auto_lip_sync="SSHOSALS {mode}", # Marantz Only
1033
1092
  )
1034
1093
 
1035
1094
  ZONE2_TELNET_COMMANDS = TelnetCommands(
@@ -1123,6 +1182,14 @@ ZONE2_TELNET_COMMANDS = TelnetCommands(
1123
1182
  command_panel_and_volume_lock="SYPANEL+V LOCK ON",
1124
1183
  command_graphic_eq="PSGEQ {mode}",
1125
1184
  command_headphone_eq="PSHEQ {mode}",
1185
+ command_denon_hdmi_cec_on="RCKSK0410826",
1186
+ command_denon_hdmi_cec_off="RCKSK0410827",
1187
+ command_marantz_hdmi_cec_on="RCRC51608408",
1188
+ command_marantz_hdmi_cec_off="RCRC51608409",
1189
+ command_mdax="PSMDAX {mode}", # Marantz Only
1190
+ command_dac_filter="PSDACFIL {mode}", # Marantz Only
1191
+ command_illumination="ILB {mode}", # Marantz Only
1192
+ command_auto_lip_sync="SSHOSALS {mode}", # Marantz Only
1126
1193
  )
1127
1194
 
1128
1195
  ZONE3_TELNET_COMMANDS = TelnetCommands(
@@ -1216,6 +1283,14 @@ ZONE3_TELNET_COMMANDS = TelnetCommands(
1216
1283
  command_panel_and_volume_lock="SYPANEL+V LOCK ON",
1217
1284
  command_graphic_eq="PSGEQ {mode}",
1218
1285
  command_headphone_eq="PSHEQ {mode}",
1286
+ command_denon_hdmi_cec_on="RCKSK0410826",
1287
+ command_denon_hdmi_cec_off="RCKSK0410827",
1288
+ command_marantz_hdmi_cec_on="RCRC51608408",
1289
+ command_marantz_hdmi_cec_off="RCRC51608409",
1290
+ command_mdax="PSMDAX {mode}", # Marantz Only
1291
+ command_dac_filter="PSDACFIL {mode}", # Marantz Only
1292
+ command_illumination="ILB {mode}", # Marantz Only
1293
+ command_auto_lip_sync="SSHOSALS {mode}", # Marantz Only
1219
1294
  )
1220
1295
 
1221
1296
  # States
@@ -1624,3 +1699,37 @@ VIDEO_PROCESSING_MODES_MAP = {
1624
1699
  VIDEO_PROCESSING_MODES_MAP_LABELS = {
1625
1700
  value: key for key, value in VIDEO_PROCESSING_MODES_MAP.items()
1626
1701
  }
1702
+
1703
+ MDAXs = Literal["Off", "Low", "Medium", "High"]
1704
+ """M-DAX Modes."""
1705
+
1706
+ MDAX_MAP = {
1707
+ "Off": "OFF",
1708
+ "Low": "LOW",
1709
+ "Medium": "MED",
1710
+ "High": "HI",
1711
+ }
1712
+ MDAX_MAP_LABELS = {value: key for key, value in MDAX_MAP.items()}
1713
+
1714
+ DACFilters = Literal["Mode 1", "Mode 2"]
1715
+ """DAC Filter Modes."""
1716
+
1717
+ DAC_FILTERS_MAP = {
1718
+ "Mode 1": "MODE1",
1719
+ "Mode 2": "MODE2",
1720
+ }
1721
+
1722
+ DAC_FILTERS_MAP_LABELS = {value: key for key, value in DAC_FILTERS_MAP.items()}
1723
+
1724
+ Illuminations = Literal["Auto", "Bright", "Dim", "Dark", "Off"]
1725
+ """Illumination Modes."""
1726
+
1727
+ ILLUMINATION_MAP = {
1728
+ "Auto": "AUTO",
1729
+ "Bright": "BRI",
1730
+ "Dim": "DIM",
1731
+ "Dark": "DAR",
1732
+ "Off": "OFF",
1733
+ }
1734
+
1735
+ ILLUMINATION_MAP_LABELS = {value: key for key, value in ILLUMINATION_MAP.items()}