denonavr 0.11.6__tar.gz → 1.0.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 (276) hide show
  1. denonavr-1.0.0/PKG-INFO +158 -0
  2. denonavr-1.0.0/README.md +114 -0
  3. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/__init__.py +1 -24
  4. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/api.py +46 -35
  5. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/audyssey.py +12 -7
  6. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/const.py +168 -59
  7. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/decorators.py +6 -46
  8. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/denonavr.py +46 -186
  9. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/foundation.py +120 -33
  10. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/input.py +13 -6
  11. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/soundmode.py +51 -36
  12. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/tonecontrol.py +47 -12
  13. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/volume.py +4 -2
  14. denonavr-1.0.0/denonavr.egg-info/PKG-INFO +158 -0
  15. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr.egg-info/SOURCES.txt +54 -0
  16. {denonavr-0.11.6 → denonavr-1.0.0}/pyproject.toml +3 -2
  17. {denonavr-0.11.6 → denonavr-1.0.0}/tests/test_denonavr.py +5 -1
  18. denonavr-1.0.0/tests/xml/AV7703-AppCommand-update-soundmode-8080.xml +6 -0
  19. denonavr-1.0.0/tests/xml/AV7703-AppCommand-update-tonecontrol-8080.xml +11 -0
  20. denonavr-1.0.0/tests/xml/AVC-8500H-AppCommand-update-soundmode-8080.xml +6 -0
  21. denonavr-1.0.0/tests/xml/AVC-8500H-AppCommand-update-tonecontrol-8080.xml +11 -0
  22. denonavr-1.0.0/tests/xml/AVC-X3700H-AppCommand-update-soundmode-8080.xml +6 -0
  23. denonavr-1.0.0/tests/xml/AVC-X3700H-AppCommand-update-tonecontrol-8080.xml +11 -0
  24. denonavr-1.0.0/tests/xml/AVR-1713-AppCommand-update-soundmode.xml +6 -0
  25. denonavr-1.0.0/tests/xml/AVR-1713-AppCommand-update-tonecontrol.xml +4 -0
  26. denonavr-1.0.0/tests/xml/AVR-2312CI-Deviceinfo.xml +3 -0
  27. denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-setup.xml +3 -0
  28. denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update-soundmode.xml +3 -0
  29. denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update-tonecontrol.xml +3 -0
  30. denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update.xml +3 -0
  31. denonavr-1.0.0/tests/xml/AVR-3311CI-Deviceinfo.xml +3 -0
  32. denonavr-1.0.0/tests/xml/AVR-3313-AppCommand-update-soundmode.xml +6 -0
  33. denonavr-1.0.0/tests/xml/AVR-3313-AppCommand-update-tonecontrol.xml +4 -0
  34. denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update-tonecontrol.xml +4 -0
  35. denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update.xml +4 -0
  36. denonavr-1.0.0/tests/xml/AVR-X1100W-AppCommand-update-soundmode.xml +6 -0
  37. denonavr-1.0.0/tests/xml/AVR-X1100W-AppCommand-update-tonecontrol.xml +11 -0
  38. denonavr-1.0.0/tests/xml/AVR-X2000-AppCommand-update-soundmode.xml +3 -0
  39. denonavr-1.0.0/tests/xml/AVR-X2000-AppCommand-update-tonecontrol.xml +3 -0
  40. denonavr-1.0.0/tests/xml/AVR-X2100W-2-AppCommand-update-soundmode.xml +3 -0
  41. denonavr-1.0.0/tests/xml/AVR-X2100W-2-AppCommand-update-tonecontrol.xml +3 -0
  42. denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-setup.xml +3 -0
  43. denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update-soundmode.xml +3 -0
  44. denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update-tonecontrol.xml +3 -0
  45. denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update.xml +3 -0
  46. denonavr-1.0.0/tests/xml/AVR-X4000-AppCommand-update-soundmode.xml +6 -0
  47. denonavr-1.0.0/tests/xml/AVR-X4000-AppCommand-update-tonecontrol.xml +4 -0
  48. denonavr-1.0.0/tests/xml/AVR-X4100W-AppCommand-update-soundmode.xml +6 -0
  49. denonavr-1.0.0/tests/xml/AVR-X4100W-AppCommand-update-tonecontrol.xml +11 -0
  50. denonavr-1.0.0/tests/xml/AVR-X4300H-AppCommand-update-soundmode-8080.xml +6 -0
  51. denonavr-1.0.0/tests/xml/AVR-X4300H-AppCommand-update-tonecontrol-8080.xml +11 -0
  52. denonavr-1.0.0/tests/xml/M-CR510-2-AppCommand-update-soundmode.xml +6 -0
  53. denonavr-1.0.0/tests/xml/M-CR510-2-AppCommand-update-tonecontrol.xml +4 -0
  54. denonavr-1.0.0/tests/xml/M-CR510-AppCommand-update-soundmode.xml +6 -0
  55. denonavr-1.0.0/tests/xml/M-CR510-AppCommand-update-tonecontrol.xml +4 -0
  56. denonavr-1.0.0/tests/xml/M-CR603-AppCommand-setup.xml +4 -0
  57. denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update-soundmode.xml +4 -0
  58. denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update-tonecontrol.xml +4 -0
  59. denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update.xml +4 -0
  60. denonavr-1.0.0/tests/xml/M-RC610-AppCommand-update-soundmode.xml +3 -0
  61. denonavr-1.0.0/tests/xml/M-RC610-AppCommand-update-tonecontrol.xml +3 -0
  62. denonavr-1.0.0/tests/xml/NR1604-AppCommand-update-soundmode.xml +3 -0
  63. denonavr-1.0.0/tests/xml/NR1604-AppCommand-update-tonecontrol.xml +3 -0
  64. denonavr-1.0.0/tests/xml/NR1609-AppCommand-update-soundmode-8080.xml +6 -0
  65. denonavr-1.0.0/tests/xml/NR1609-AppCommand-update-tonecontrol-8080.xml +11 -0
  66. denonavr-1.0.0/tests/xml/SR5008-AppCommand-update-tonecontrol.xml +3 -0
  67. denonavr-1.0.0/tests/xml/SR5008-AppCommand-update.xml +3 -0
  68. denonavr-1.0.0/tests/xml/SR6011-AppCommand-update-soundmode.xml +6 -0
  69. denonavr-1.0.0/tests/xml/SR6011-AppCommand-update-tonecontrol.xml +11 -0
  70. denonavr-1.0.0/tests/xml/SR6012-AppCommand-update-soundmode-8080.xml +6 -0
  71. denonavr-1.0.0/tests/xml/SR6012-AppCommand-update-tonecontrol-8080.xml +11 -0
  72. denonavr-0.11.6/PKG-INFO +0 -290
  73. denonavr-0.11.6/README.md +0 -247
  74. denonavr-0.11.6/denonavr.egg-info/PKG-INFO +0 -290
  75. {denonavr-0.11.6 → denonavr-1.0.0}/LICENSE +0 -0
  76. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/appcommand.py +0 -0
  77. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/exceptions.py +0 -0
  78. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr/ssdp.py +0 -0
  79. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr.egg-info/dependency_links.txt +0 -0
  80. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr.egg-info/not-zip-safe +0 -0
  81. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr.egg-info/requires.txt +0 -0
  82. {denonavr-0.11.6 → denonavr-1.0.0}/denonavr.egg-info/top_level.txt +0 -0
  83. {denonavr-0.11.6 → denonavr-1.0.0}/setup.cfg +0 -0
  84. {denonavr-0.11.6 → denonavr-1.0.0}/tests/__init__.py +0 -0
  85. {denonavr-0.11.6 → denonavr-1.0.0}/tests/test_ssdp.py +0 -0
  86. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AV7703-AppCommand-setup-8080.xml +0 -0
  87. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AV7703-AppCommand-update-8080.xml +0 -0
  88. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AV7703-Deviceinfo-8080.xml +0 -0
  89. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-8500H-AppCommand-setup-8080.xml +0 -0
  90. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-8500H-AppCommand-update-8080.xml +0 -0
  91. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-8500H-Deviceinfo-8080.xml +0 -0
  92. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-X3700H-AppCommand-setup-8080.xml +0 -0
  93. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-X3700H-AppCommand-update-8080.xml +0 -0
  94. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVC-X3700H-Deviceinfo-8080.xml +0 -0
  95. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-AppCommand-setup.xml +0 -0
  96. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-AppCommand-update.xml +0 -0
  97. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-Deviceinfo.xml +0 -0
  98. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formMainZone_MainZoneXml.xml +0 -0
  99. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formMainZone_MainZoneXmlStatus.xml +0 -0
  100. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formNetAudio_StatusXml.xml +0 -0
  101. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formTuner_HdXml.xml +0 -0
  102. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formTuner_TunerXml.xml +0 -0
  103. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formZone2_Zone2XmlStatus.xml +0 -0
  104. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1713-formZone3_Zone3XmlStatus.xml +0 -0
  105. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1912-AppCommand-setup.xml +0 -0
  106. /denonavr-0.11.6/tests/xml/AVR-1912-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update-soundmode.xml +0 -0
  107. /denonavr-0.11.6/tests/xml/AVR-1912-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update-tonecontrol.xml +0 -0
  108. /denonavr-0.11.6/tests/xml/AVR-2312CI-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update.xml +0 -0
  109. /denonavr-0.11.6/tests/xml/AVR-2312CI-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-1912-Deviceinfo.xml +0 -0
  110. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1912-formMainZone_MainZoneXml.xml +0 -0
  111. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1912-formMainZone_MainZoneXmlStatus.xml +0 -0
  112. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-1912-formNetAudio_StatusXml.xml +0 -0
  113. /denonavr-0.11.6/tests/xml/AVR-2312CI-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-setup.xml +0 -0
  114. /denonavr-0.11.6/tests/xml/AVR-3311CI-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update-soundmode.xml +0 -0
  115. /denonavr-0.11.6/tests/xml/AVR-3311CI-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update-tonecontrol.xml +0 -0
  116. /denonavr-0.11.6/tests/xml/AVR-3311CI-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update.xml +0 -0
  117. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXml.xml +0 -0
  118. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  119. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formNetAudio_StatusXml.xml +0 -0
  120. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXml.xml +0 -0
  121. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXmlStatus.xml +0 -0
  122. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formNetAudio_StatusXml.xml +0 -0
  123. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-AppCommand-setup.xml +0 -0
  124. /denonavr-0.11.6/tests/xml/AVR-3312-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update-soundmode.xml +0 -0
  125. /denonavr-0.11.6/tests/xml/AVR-4810-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update-tonecontrol.xml +0 -0
  126. /denonavr-0.11.6/tests/xml/AVR-4810-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update.xml +0 -0
  127. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-Deviceinfo.xml +0 -0
  128. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formMainZone_MainZoneXml.xml +0 -0
  129. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formMainZone_MainZoneXmlStatus.xml +0 -0
  130. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formNetAudio_StatusXml.xml +0 -0
  131. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formTuner_HdXml.xml +0 -0
  132. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formTuner_TunerXml.xml +0 -0
  133. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formZone2_Zone2XmlStatus.xml +0 -0
  134. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3312-formZone3_Zone3XmlStatus.xml +0 -0
  135. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-AppCommand-setup.xml +0 -0
  136. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-AppCommand-update.xml +0 -0
  137. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-Deviceinfo.xml +0 -0
  138. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formMainZone_MainZoneXml.xml +0 -0
  139. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formMainZone_MainZoneXmlStatus.xml +0 -0
  140. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formNetAudio_StatusXml.xml +0 -0
  141. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formTuner_HdXml.xml +0 -0
  142. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formTuner_TunerXml.xml +0 -0
  143. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formZone2_Zone2XmlStatus.xml +0 -0
  144. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-3313-formZone3_Zone3XmlStatus.xml +0 -0
  145. /denonavr-0.11.6/tests/xml/M-CR603-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-setup.xml +0 -0
  146. /denonavr-0.11.6/tests/xml/M-CR603-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update-soundmode.xml +0 -0
  147. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-Deviceinfo.xml +0 -0
  148. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formMainZone_MainZoneXml.xml +0 -0
  149. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formMainZone_MainZoneXmlStatus.xml +0 -0
  150. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formNetAudio_StatusXml.xml +0 -0
  151. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formTuner_HdXml.xml +0 -0
  152. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formTuner_TunerXml.xml +0 -0
  153. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formZone2_Zone2XmlStatus.xml +0 -0
  154. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-4810-formZone3_Zone3XmlStatus.xml +0 -0
  155. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-AppCommand-setup.xml +0 -0
  156. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-AppCommand-update.xml +0 -0
  157. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-Deviceinfo.xml +0 -0
  158. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXml.xml +0 -0
  159. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  160. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formNetAudio_StatusXml.xml +0 -0
  161. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formTuner_HdXml.xml +0 -0
  162. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formTuner_TunerXml.xml +0 -0
  163. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formZone2_Zone2XmlStatus.xml +0 -0
  164. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formZone3_Zone3XmlStatus.xml +0 -0
  165. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X1600H_upnp.xml +0 -0
  166. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-AppCommand-setup.xml +0 -0
  167. /denonavr-0.11.6/tests/xml/AVR-X2000-2-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update-soundmode.xml +0 -0
  168. /denonavr-0.11.6/tests/xml/AVR-X2100W-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update-tonecontrol.xml +0 -0
  169. /denonavr-0.11.6/tests/xml/AVR-X2100W-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update.xml +0 -0
  170. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-Deviceinfo.xml +0 -0
  171. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXml.xml +0 -0
  172. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  173. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formNetAudio_StatusXml.xml +0 -0
  174. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-AppCommand-setup.xml +0 -0
  175. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-AppCommand-update.xml +0 -0
  176. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-Deviceinfo.xml +0 -0
  177. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXml.xml +0 -0
  178. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXmlStatus.xml +0 -0
  179. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formNetAudio_StatusXml.xml +0 -0
  180. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formTuner_HdXml.xml +0 -0
  181. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formTuner_TunerXml.xml +0 -0
  182. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formZone2_Zone2XmlStatus.xml +0 -0
  183. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2000-formZone3_Zone3XmlStatus.xml +0 -0
  184. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-AppCommand-setup.xml +0 -0
  185. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-AppCommand-update.xml +0 -0
  186. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-Deviceinfo.xml +0 -0
  187. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXml.xml +0 -0
  188. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  189. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formNetAudio_StatusXml.xml +0 -0
  190. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXml.xml +0 -0
  191. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  192. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formNetAudio_StatusXml.xml +0 -0
  193. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-AppCommand-setup.xml +0 -0
  194. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-AppCommand-update.xml +0 -0
  195. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-Deviceinfo.xml +0 -0
  196. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXml.xml +0 -0
  197. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXmlStatus.xml +0 -0
  198. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formNetAudio_StatusXml.xml +0 -0
  199. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formTuner_HdXml.xml +0 -0
  200. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formTuner_TunerXml.xml +0 -0
  201. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formZone2_Zone2XmlStatus.xml +0 -0
  202. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4000-formZone3_Zone3XmlStatus.xml +0 -0
  203. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-AppCommand-setup.xml +0 -0
  204. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-AppCommand-update.xml +0 -0
  205. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-Deviceinfo.xml +0 -0
  206. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXml.xml +0 -0
  207. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXmlStatus.xml +0 -0
  208. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formNetAudio_StatusXml.xml +0 -0
  209. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4300H-AppCommand-setup-8080.xml +0 -0
  210. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4300H-AppCommand-update-8080.xml +0 -0
  211. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/AVR-X4300H-Deviceinfo-8080.xml +0 -0
  212. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-AppCommand-setup.xml +0 -0
  213. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-AppCommand-update.xml +0 -0
  214. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-Deviceinfo.xml +0 -0
  215. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXml.xml +0 -0
  216. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXmlStatus.xml +0 -0
  217. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-formNetAudio_StatusXml.xml +0 -0
  218. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-formTuner_HdXml.xml +0 -0
  219. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-2-formTuner_TunerXml.xml +0 -0
  220. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-AppCommand-setup.xml +0 -0
  221. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-AppCommand-update.xml +0 -0
  222. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-Deviceinfo.xml +0 -0
  223. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-formMainZone_MainZoneXml.xml +0 -0
  224. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-formMainZone_MainZoneXmlStatus.xml +0 -0
  225. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-formNetAudio_StatusXml.xml +0 -0
  226. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-formTuner_HdXml.xml +0 -0
  227. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR510-formTuner_TunerXml.xml +0 -0
  228. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-Deviceinfo.xml +0 -0
  229. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formMainZone_MainZoneXml.xml +0 -0
  230. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formMainZone_MainZoneXmlStatus.xml +0 -0
  231. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formNetAudio_StatusXml.xml +0 -0
  232. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formTuner_HdXml.xml +0 -0
  233. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formTuner_TunerXml.xml +0 -0
  234. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formZone2_Zone2XmlStatus.xml +0 -0
  235. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-CR603-formZone3_Zone3XmlStatus.xml +0 -0
  236. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-AppCommand-setup.xml +0 -0
  237. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-AppCommand-update.xml +0 -0
  238. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-Deviceinfo.xml +0 -0
  239. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-formMainZone_MainZoneXml.xml +0 -0
  240. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-formMainZone_MainZoneXmlStatus.xml +0 -0
  241. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-formNetAudio_StatusXml.xml +0 -0
  242. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/M-RC610-formTuner_TunerXml.xml +0 -0
  243. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-AppCommand-setup.xml +0 -0
  244. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-AppCommand-update.xml +0 -0
  245. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-Deviceinfo.xml +0 -0
  246. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formMainZone_MainZoneXml.xml +0 -0
  247. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formMainZone_MainZoneXmlStatus.xml +0 -0
  248. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formNetAudio_StatusXml.xml +0 -0
  249. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formTuner_HdXml.xml +0 -0
  250. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formTuner_TunerXml.xml +0 -0
  251. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formZone2_Zone2XmlStatus.xml +0 -0
  252. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1604-formZone3_Zone3XmlStatus.xml +0 -0
  253. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1609-AppCommand-setup-8080.xml +0 -0
  254. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1609-AppCommand-update-8080.xml +0 -0
  255. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/NR1609-Deviceinfo-8080.xml +0 -0
  256. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-AppCommand-setup.xml +0 -0
  257. /denonavr-0.11.6/tests/xml/SR5008-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/SR5008-AppCommand-update-soundmode.xml +0 -0
  258. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-Deviceinfo.xml +0 -0
  259. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-formMainZone_MainZoneXml.xml +0 -0
  260. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-formMainZone_MainZoneXmlStatus.xml +0 -0
  261. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-formNetAudio_StatusXml.xml +0 -0
  262. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-formTuner_HdXml.xml +0 -0
  263. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR5008-formTuner_TunerXml.xml +0 -0
  264. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-AppCommand-setup.xml +0 -0
  265. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-AppCommand-update.xml +0 -0
  266. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-Deviceinfo.xml +0 -0
  267. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formMainZone_MainZoneXml.xml +0 -0
  268. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formMainZone_MainZoneXmlStatus.xml +0 -0
  269. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formNetAudio_StatusXml.xml +0 -0
  270. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formTuner_HdXml.xml +0 -0
  271. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formTuner_TunerXml.xml +0 -0
  272. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formZone2_Zone2XmlStatus.xml +0 -0
  273. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6011-formZone3_Zone3XmlStatus.xml +0 -0
  274. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6012-AppCommand-setup-8080.xml +0 -0
  275. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6012-AppCommand-update-8080.xml +0 -0
  276. {denonavr-0.11.6 → denonavr-1.0.0}/tests/xml/SR6012-Deviceinfo-8080.xml +0 -0
@@ -0,0 +1,158 @@
1
+ Metadata-Version: 2.1
2
+ Name: denonavr
3
+ Version: 1.0.0
4
+ Summary: Automation Library for Denon AVR receivers
5
+ Author-email: Oliver Goetz <scarface@mywoh.de>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/ol-iver/denonavr
8
+ Project-URL: Source, https://github.com/ol-iver/denonavr
9
+ Project-URL: Tracker, https://github.com/ol-iver/denonavr/issues
10
+ Platform: any
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Topic :: Software Development :: Libraries
16
+ Classifier: Topic :: Home Automation
17
+ Classifier: Programming Language :: Python :: 3.7
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Requires-Python: >=3.7
25
+ Description-Content-Type: text/markdown; charset=UTF-8
26
+ License-File: LICENSE
27
+ Requires-Dist: asyncstdlib>=3.10.2
28
+ Requires-Dist: attrs>=21.2.0
29
+ Requires-Dist: defusedxml>=0.7.1
30
+ Requires-Dist: ftfy>=6.1.1
31
+ Requires-Dist: httpx>=0.23.1
32
+ Requires-Dist: netifaces>=0.11.0
33
+ Requires-Dist: async-timeout>=4.0.2; python_version < "3.11"
34
+ Provides-Extra: testing
35
+ Requires-Dist: pydocstyle; extra == "testing"
36
+ Requires-Dist: pylint; extra == "testing"
37
+ Requires-Dist: pytest; extra == "testing"
38
+ Requires-Dist: pytest-cov; extra == "testing"
39
+ Requires-Dist: pytest-timeout; extra == "testing"
40
+ Requires-Dist: pytest-asyncio; extra == "testing"
41
+ Requires-Dist: pytest-httpx; extra == "testing"
42
+ Requires-Dist: flake8-docstrings; extra == "testing"
43
+ Requires-Dist: flake8; extra == "testing"
44
+
45
+ # denonavr
46
+ [![Release](https://img.shields.io/github/v/release/ol-iver/denonavr?sort=semver)](https://github.com/ol-iver/denonavr/releases/latest)
47
+ [![Build Status](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml/badge.svg)](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml)
48
+ [![PyPi](https://img.shields.io/pypi/v/denonavr.svg)](https://pypi.org/project/denonavr)
49
+ [![License](https://img.shields.io/github/license/ol-iver/denonavr.svg)](LICENSE)
50
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
51
+
52
+ Automation Library for Denon AVR receivers
53
+
54
+ ## Installation
55
+
56
+ Use pip:
57
+
58
+ ```$ pip install denonavr```
59
+
60
+ or
61
+
62
+ ```$ pip install --use-wheel denonavr```
63
+
64
+ ## Usage with `async`
65
+
66
+ Writing `async` and `await` methods are outside the scope of the documentation. You can test `async` usage from the Python REPL. In a terminal run:
67
+
68
+ `python3 -m asyncio`
69
+
70
+ The `asyncio` library should automatically be imported in the REPL. Import the `denonavr` library and set up your receiver. If you know the IP address, enter it below replacing `192.168.1.119`.
71
+
72
+ ```
73
+ >>> import asyncio
74
+ >>> import denonavr
75
+ >>> d = denonavr.DenonAVR("192.168.1.119")
76
+ >>> await d.async_setup()
77
+ >>> await d.async_update()
78
+ >>> print(d.volume)
79
+ -36.5
80
+ ```
81
+
82
+ ### Monitoring with telnet
83
+ In addition to retrieving the current device status via HTTP calls, `denonavr` library also has the ability to setup a task that will connect to the receiver via telnet on TCP port 23 and listen for real-time events to notify of status changes.
84
+ This provides instant updates via a callback when the device status changes. Receivers support only one active telnet connection.
85
+
86
+ ```
87
+ >>> import asyncio
88
+ >>> import denonavr
89
+ >>> d = denonavr.DenonAVR("192.168.1.119")
90
+ >>> await d.async_setup()
91
+ >>> await d.async_telnet_connect()
92
+ >>> await d.async_update()
93
+ >>> async def update_callback(zone, event, parameter):
94
+ >>>>>> print("Zone: " + zone + " Event: " + event + " Parameter: " + parameter)
95
+ >>> d.register_callback("ALL", update_callback)
96
+ ```
97
+
98
+ ### Power & Input
99
+ ```
100
+ >>> await d.async_power_on()
101
+ >>> await d.async_update()
102
+ >>> d.power
103
+ 'ON'
104
+
105
+ >>> await d.async_power_off()
106
+ >>> await d.async_update()
107
+ >>> d.power
108
+ 'OFF'
109
+
110
+ >>> d.input_func
111
+ 'Tuner'
112
+ >>> await d.async_set_input_func("Phono")
113
+ >>> d.input_func
114
+ 'Phono'
115
+ ```
116
+ ### Sound
117
+ ```
118
+ >>> await d.async_mute(True)
119
+ >>> await d.async_mute(False)
120
+ ```
121
+
122
+ ### Other methods
123
+
124
+ Other `async` methods available include:
125
+
126
+ * `d.async_bass_down`
127
+ * `d.async_bass_up`
128
+ * `d.async_treble_down`
129
+ * `d.async_treble_up`
130
+ * `d.async_volume_down`
131
+ * `d.async_volume_up`
132
+ * `d.async_set_volume(50)`
133
+
134
+ ## Collection of HTTP calls
135
+ For a collection of HTTP calls for Denon receivers please have a look at the `doc` folder.
136
+
137
+ ## License
138
+ MIT
139
+
140
+ ## Author
141
+ @ol-iver: https://github.com/ol-iver
142
+
143
+ ## Contributors
144
+ @soldag: https://github.com/soldag
145
+ @shapiromatron: https://github.com/shapiromatron
146
+ @glance-: https://github.com/glance-
147
+ @p3dda: https://github.com/p3dda
148
+ @russel: https://github.com/russell
149
+ @starkillerOG: https://github.com/starkillerOG
150
+ @andrewsayre: https://github.com/andrewsayre
151
+ @JPHutchins: https://github.com/JPHutchins
152
+ @MarBra: https://github.com/MarBra
153
+ @dcmeglio: https://github.com/dcmeglio
154
+ @bdraco: https://github.com/bdraco
155
+
156
+ ## Users
157
+ Home Assistant: https://github.com/home-assistant/home-assistant/
158
+ denonavr-cli: https://pypi.org/project/denonavr-cli/
@@ -0,0 +1,114 @@
1
+ # denonavr
2
+ [![Release](https://img.shields.io/github/v/release/ol-iver/denonavr?sort=semver)](https://github.com/ol-iver/denonavr/releases/latest)
3
+ [![Build Status](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml/badge.svg)](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml)
4
+ [![PyPi](https://img.shields.io/pypi/v/denonavr.svg)](https://pypi.org/project/denonavr)
5
+ [![License](https://img.shields.io/github/license/ol-iver/denonavr.svg)](LICENSE)
6
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
7
+
8
+ Automation Library for Denon AVR receivers
9
+
10
+ ## Installation
11
+
12
+ Use pip:
13
+
14
+ ```$ pip install denonavr```
15
+
16
+ or
17
+
18
+ ```$ pip install --use-wheel denonavr```
19
+
20
+ ## Usage with `async`
21
+
22
+ Writing `async` and `await` methods are outside the scope of the documentation. You can test `async` usage from the Python REPL. In a terminal run:
23
+
24
+ `python3 -m asyncio`
25
+
26
+ The `asyncio` library should automatically be imported in the REPL. Import the `denonavr` library and set up your receiver. If you know the IP address, enter it below replacing `192.168.1.119`.
27
+
28
+ ```
29
+ >>> import asyncio
30
+ >>> import denonavr
31
+ >>> d = denonavr.DenonAVR("192.168.1.119")
32
+ >>> await d.async_setup()
33
+ >>> await d.async_update()
34
+ >>> print(d.volume)
35
+ -36.5
36
+ ```
37
+
38
+ ### Monitoring with telnet
39
+ In addition to retrieving the current device status via HTTP calls, `denonavr` library also has the ability to setup a task that will connect to the receiver via telnet on TCP port 23 and listen for real-time events to notify of status changes.
40
+ This provides instant updates via a callback when the device status changes. Receivers support only one active telnet connection.
41
+
42
+ ```
43
+ >>> import asyncio
44
+ >>> import denonavr
45
+ >>> d = denonavr.DenonAVR("192.168.1.119")
46
+ >>> await d.async_setup()
47
+ >>> await d.async_telnet_connect()
48
+ >>> await d.async_update()
49
+ >>> async def update_callback(zone, event, parameter):
50
+ >>>>>> print("Zone: " + zone + " Event: " + event + " Parameter: " + parameter)
51
+ >>> d.register_callback("ALL", update_callback)
52
+ ```
53
+
54
+ ### Power & Input
55
+ ```
56
+ >>> await d.async_power_on()
57
+ >>> await d.async_update()
58
+ >>> d.power
59
+ 'ON'
60
+
61
+ >>> await d.async_power_off()
62
+ >>> await d.async_update()
63
+ >>> d.power
64
+ 'OFF'
65
+
66
+ >>> d.input_func
67
+ 'Tuner'
68
+ >>> await d.async_set_input_func("Phono")
69
+ >>> d.input_func
70
+ 'Phono'
71
+ ```
72
+ ### Sound
73
+ ```
74
+ >>> await d.async_mute(True)
75
+ >>> await d.async_mute(False)
76
+ ```
77
+
78
+ ### Other methods
79
+
80
+ Other `async` methods available include:
81
+
82
+ * `d.async_bass_down`
83
+ * `d.async_bass_up`
84
+ * `d.async_treble_down`
85
+ * `d.async_treble_up`
86
+ * `d.async_volume_down`
87
+ * `d.async_volume_up`
88
+ * `d.async_set_volume(50)`
89
+
90
+ ## Collection of HTTP calls
91
+ For a collection of HTTP calls for Denon receivers please have a look at the `doc` folder.
92
+
93
+ ## License
94
+ MIT
95
+
96
+ ## Author
97
+ @ol-iver: https://github.com/ol-iver
98
+
99
+ ## Contributors
100
+ @soldag: https://github.com/soldag
101
+ @shapiromatron: https://github.com/shapiromatron
102
+ @glance-: https://github.com/glance-
103
+ @p3dda: https://github.com/p3dda
104
+ @russel: https://github.com/russell
105
+ @starkillerOG: https://github.com/starkillerOG
106
+ @andrewsayre: https://github.com/andrewsayre
107
+ @JPHutchins: https://github.com/JPHutchins
108
+ @MarBra: https://github.com/MarBra
109
+ @dcmeglio: https://github.com/dcmeglio
110
+ @bdraco: https://github.com/bdraco
111
+
112
+ ## Users
113
+ Home Assistant: https://github.com/home-assistant/home-assistant/
114
+ denonavr-cli: https://pypi.org/project/denonavr-cli/
@@ -10,8 +10,6 @@ Automation Library for Denon AVR receivers.
10
10
  # Set default logging handler to avoid "No handler found" warnings.
11
11
  import logging
12
12
 
13
- from .decorators import run_async_synchronously
14
-
15
13
  # Import denonavr module
16
14
  from .denonavr import DenonAVR
17
15
  from .ssdp import async_identify_denonavr_receivers
@@ -19,7 +17,7 @@ from .ssdp import async_identify_denonavr_receivers
19
17
  logging.getLogger(__name__).addHandler(logging.NullHandler())
20
18
 
21
19
  __title__ = "denonavr"
22
- __version__ = "0.11.6"
20
+ __version__ = "1.0.0"
23
21
 
24
22
 
25
23
  async def async_discover():
@@ -33,17 +31,6 @@ async def async_discover():
33
31
  return await async_identify_denonavr_receivers()
34
32
 
35
33
 
36
- @run_async_synchronously(async_func=async_discover)
37
- def discover():
38
- """
39
- Discover all Denon AVR devices in LAN zone.
40
-
41
- Returns a list of dictionaries which includes all discovered Denon AVR
42
- devices with keys "host", "modelName", "friendlyName", "presentationURL".
43
- By default SSDP broadcasts are sent once with a 2 seconds timeout.
44
- """
45
-
46
-
47
34
  async def async_init_all_receivers():
48
35
  """
49
36
  Initialize all discovered Denon AVR receivers in LAN zone.
@@ -58,13 +45,3 @@ async def async_init_all_receivers():
58
45
  init_receiver = DenonAVR(receiver["host"])
59
46
  init_receivers.append(init_receiver)
60
47
  return init_receivers
61
-
62
-
63
- @run_async_synchronously(async_func=async_init_all_receivers)
64
- def init_all_receivers():
65
- """
66
- Initialize all discovered Denon AVR receivers in LAN zone.
67
-
68
- Returns a list of created Denon AVR instances.
69
- By default SSDP broadcasts are sent up to 3 times with a 2 seconds timeout.
70
- """
@@ -401,9 +401,9 @@ class DenonAVRTelnetProtocol(asyncio.Protocol):
401
401
 
402
402
  def connection_lost(self, exc: Optional[Exception]) -> None:
403
403
  """Handle connection lost."""
404
- self.transport = None
405
404
  self._on_connection_lost()
406
- return super().connection_lost(exc)
405
+ super().connection_lost(exc)
406
+ self.transport = None
407
407
 
408
408
 
409
409
  @attr.s(auto_attribs=True, hash=False, on_setattr=DENON_ATTR_SETATTR)
@@ -413,9 +413,6 @@ class DenonAVRTelnetApi:
413
413
  host: str = attr.ib(converter=str, default="localhost")
414
414
  timeout: float = attr.ib(converter=float, default=2.0)
415
415
  _connection_enabled: bool = attr.ib(default=False)
416
- _healthy: Optional[bool] = attr.ib(
417
- converter=attr.converters.optional(bool), default=None
418
- )
419
416
  _last_message_time: float = attr.ib(default=-1.0)
420
417
  _connect_lock: asyncio.Lock = attr.ib(default=attr.Factory(asyncio.Lock))
421
418
  _reconnect_task: asyncio.Task = attr.ib(default=None)
@@ -474,17 +471,17 @@ class DenonAVRTelnetApi:
474
471
  raise AvrTimoutError(f"TimeoutException: {err}", "telnet connect") from err
475
472
  except ConnectionRefusedError as err:
476
473
  _LOGGER.debug(
477
- "%s: Connection refused on telnet connect", self.host, exc_info=True
474
+ "%s: Connection refused on telnet connect: %s", self.host, err
478
475
  )
479
476
  raise AvrNetworkError(
480
477
  f"ConnectionRefusedError: {err}", "telnet connect"
481
478
  ) from err
482
479
  except (OSError, IOError) as err:
483
480
  _LOGGER.debug(
484
- "%s: Connection failed on telnet reconnect", self.host, exc_info=True
481
+ "%s: Connection failed on telnet reconnect: %s", self.host, err
485
482
  )
486
483
  raise AvrNetworkError(f"OSError: {err}", "telnet connect") from err
487
- _LOGGER.debug("%s: telnet connection complete", self.host)
484
+ _LOGGER.debug("%s: telnet connection established", self.host)
488
485
  self._protocol = cast(DenonAVRTelnetProtocol, transport_protocol[1])
489
486
  self._connection_enabled = True
490
487
  self._last_message_time = time.monotonic()
@@ -507,6 +504,7 @@ class DenonAVRTelnetApi:
507
504
  "PSREFLEV ?",
508
505
  "PSDYNVOL ?",
509
506
  "MS?",
507
+ skip_confirmation=True,
510
508
  )
511
509
 
512
510
  def _schedule_monitor(self) -> None:
@@ -527,8 +525,6 @@ class DenonAVRTelnetApi:
527
525
  _LOGGER.info(
528
526
  "%s: Keep alive failed, disconnecting and reconnecting", self.host
529
527
  )
530
- if self._protocol is not None:
531
- self._protocol.close()
532
528
  self._handle_disconnected()
533
529
  return
534
530
 
@@ -540,8 +536,10 @@ class DenonAVRTelnetApi:
540
536
 
541
537
  def _handle_disconnected(self) -> None:
542
538
  """Handle disconnected."""
543
- _LOGGER.debug("%s: disconnected", self.host)
544
- self._protocol = None
539
+ _LOGGER.debug("%s: handle disconnected", self.host)
540
+ if self._protocol is not None:
541
+ self._protocol.close()
542
+ self._protocol = None
545
543
  self._stop_monitor()
546
544
  if not self._connection_enabled:
547
545
  return
@@ -550,6 +548,7 @@ class DenonAVRTelnetApi:
550
548
  async def async_disconnect(self) -> None:
551
549
  """Close the connection to the receiver asynchronously."""
552
550
  async with self._connect_lock:
551
+ _LOGGER.debug("%s: telnet disconnecting", self.host)
553
552
  self._connection_enabled = False
554
553
  self._stop_monitor()
555
554
  reconnect_task = self._reconnect_task
@@ -565,6 +564,7 @@ class DenonAVRTelnetApi:
565
564
  await reconnect_task
566
565
  except asyncio.CancelledError:
567
566
  pass
567
+ _LOGGER.debug("%s: telnet disconnected", self.host)
568
568
 
569
569
  async def _async_reconnect(self) -> None:
570
570
  """Reconnect to the receiver asynchronously."""
@@ -572,19 +572,20 @@ class DenonAVRTelnetApi:
572
572
 
573
573
  while self._connection_enabled and not self.healthy:
574
574
  async with self._connect_lock:
575
+ _LOGGER.debug("%s: Telnet reconnecting", self.host)
575
576
  try:
576
577
  await self._async_establish_connection()
577
578
  except AvrTimoutError:
578
579
  _LOGGER.debug(
579
580
  "%s: Timeout exception on telnet reconnect", self.host
580
581
  )
581
- except AvrNetworkError as ex:
582
- _LOGGER.debug("%s: %s", self.host, ex, exc_info=True)
583
- except Exception: # pylint: disable=broad-except
582
+ except AvrNetworkError as err:
583
+ _LOGGER.debug("%s: %s", self.host, err)
584
+ except Exception as err: # pylint: disable=broad-except
584
585
  _LOGGER.error(
585
586
  "%s: Unexpected exception on telnet reconnect",
586
587
  self.host,
587
- exc_info=True,
588
+ exc_info=err,
588
589
  )
589
590
  else:
590
591
  _LOGGER.info("%s: Telnet reconnected", self.host)
@@ -682,7 +683,7 @@ class DenonAVRTelnetApi:
682
683
  # We don't want a single bad callback to trip up the
683
684
  # whole system and prevent further execution
684
685
  _LOGGER.error(
685
- "%s: Raw callback caused an unhandled exception %s",
686
+ "%s: Raw callback caused an unhandled exception: %s",
686
687
  self.host,
687
688
  err,
688
689
  )
@@ -695,7 +696,7 @@ class DenonAVRTelnetApi:
695
696
  # We don't want a single bad callback to trip up the
696
697
  # whole system and prevent further execution
697
698
  _LOGGER.error(
698
- "%s: Event callback caused an unhandled exception %s",
699
+ "%s: Event callback caused an unhandled exception: %s",
699
700
  self.host,
700
701
  err,
701
702
  )
@@ -708,7 +709,7 @@ class DenonAVRTelnetApi:
708
709
  # We don't want a single bad callback to trip up the
709
710
  # whole system and prevent further execution
710
711
  _LOGGER.error(
711
- "%s: Event callback caused an unhandled exception %s",
712
+ "%s: Event callback caused an unhandled exception: %s",
712
713
  self.host,
713
714
  err,
714
715
  )
@@ -731,35 +732,45 @@ class DenonAVRTelnetApi:
731
732
  self._send_confirmation_event.set()
732
733
  _LOGGER.debug("Command %s confirmed", command)
733
734
 
734
- async def _async_send_command(self, command: str) -> None:
735
+ async def _async_send_command(
736
+ self, command: str, skip_confirmation: bool = False
737
+ ) -> None:
735
738
  """Send one telnet command to the receiver."""
736
739
  async with self._send_lock:
737
- self._send_confirmation_command = command
738
- self._send_confirmation_event.clear()
740
+ if not skip_confirmation:
741
+ self._send_confirmation_command = command
742
+ self._send_confirmation_event.clear()
739
743
  if not self.connected or not self.healthy:
740
744
  raise AvrProcessingError(
741
745
  f"Error sending command {command}. Telnet connected: "
742
746
  f"{self.connected}, Connection healthy: {self.healthy}"
743
747
  )
744
748
  self._protocol.write(f"{command}\r")
745
- try:
746
- await asyncio.wait_for(
747
- self._send_confirmation_event.wait(),
748
- self._send_confirmation_timeout,
749
- )
750
- except asyncio.TimeoutError:
751
- _LOGGER.info("Timeout waiting for confirmation of command: %s", command)
752
- finally:
753
- self._send_confirmation_command = ""
749
+ if not skip_confirmation:
750
+ try:
751
+ await asyncio.wait_for(
752
+ self._send_confirmation_event.wait(),
753
+ self._send_confirmation_timeout,
754
+ )
755
+ except asyncio.TimeoutError:
756
+ _LOGGER.info(
757
+ "Timeout waiting for confirmation of command: %s", command
758
+ )
759
+ finally:
760
+ self._send_confirmation_command = ""
754
761
 
755
- async def async_send_commands(self, *commands: str) -> None:
762
+ async def async_send_commands(
763
+ self, *commands: str, skip_confirmation: bool = False
764
+ ) -> None:
756
765
  """Send telnet commands to the receiver."""
757
766
  for command in commands:
758
- await self._async_send_command(command)
767
+ await self._async_send_command(command, skip_confirmation=skip_confirmation)
759
768
 
760
- def send_commands(self, *commands: str) -> None:
769
+ def send_commands(self, *commands: str, skip_confirmation: bool = False) -> None:
761
770
  """Send telnet commands to the receiver."""
762
- task = asyncio.create_task(self.async_send_commands(*commands))
771
+ task = asyncio.create_task(
772
+ self.async_send_commands(*commands, skip_confirmation=skip_confirmation)
773
+ )
763
774
  self._send_tasks.add(task)
764
775
  task.add_done_callback(self._send_tasks.discard)
765
776
 
@@ -99,12 +99,14 @@ class DenonAVRAudyssey(DenonAVRFoundation):
99
99
  self, global_update: bool = False, cache_id: Optional[Hashable] = None
100
100
  ) -> None:
101
101
  """Update Audyssey asynchronously."""
102
+ _LOGGER.debug("Starting Audyssey update")
102
103
  # Ensure instance is setup before updating
103
104
  if not self._is_setup:
104
105
  self.setup()
105
106
 
106
107
  # Update state
107
108
  await self.async_update_audyssey(global_update=global_update, cache_id=cache_id)
109
+ _LOGGER.debug("Finished Audyssey update")
108
110
 
109
111
  async def async_update_audyssey(
110
112
  self, global_update: bool = False, cache_id: Optional[Hashable] = None
@@ -117,13 +119,16 @@ class DenonAVRAudyssey(DenonAVRFoundation):
117
119
 
118
120
  # Audyssey is only available for avr 2016 update
119
121
  if self._device.use_avr_2016_update:
120
- await self.async_update_attrs_appcommand(
121
- self.appcommand0300_attrs,
122
- appcommand0300=True,
123
- global_update=global_update,
124
- cache_id=cache_id,
125
- ignore_missing_response=True,
126
- )
122
+ try:
123
+ await self.async_update_attrs_appcommand(
124
+ self.appcommand0300_attrs,
125
+ appcommand0300=True,
126
+ global_update=global_update,
127
+ cache_id=cache_id,
128
+ )
129
+ except AvrProcessingError as err:
130
+ # Don't raise an error here, because not all devices support it
131
+ _LOGGER.debug("Updating Audyssey failed: %s", err)
127
132
 
128
133
  async def _async_set_audyssey(self, cmd: AppCommandCmd) -> None:
129
134
  """Set Audyssey parameter."""