denonavr 0.11.5__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.
- denonavr-1.0.0/PKG-INFO +158 -0
- denonavr-1.0.0/README.md +114 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/__init__.py +1 -24
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/api.py +46 -35
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/audyssey.py +12 -7
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/const.py +168 -59
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/decorators.py +6 -46
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/denonavr.py +46 -186
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/foundation.py +120 -33
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/input.py +16 -6
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/soundmode.py +51 -36
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/tonecontrol.py +47 -12
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/volume.py +4 -2
- denonavr-1.0.0/denonavr.egg-info/PKG-INFO +158 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr.egg-info/SOURCES.txt +54 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/pyproject.toml +3 -2
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/test_denonavr.py +5 -1
- denonavr-1.0.0/tests/xml/AV7703-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/AV7703-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-1.0.0/tests/xml/AVC-8500H-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/AVC-8500H-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-1.0.0/tests/xml/AVC-X3700H-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/AVC-X3700H-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-1.0.0/tests/xml/AVR-1713-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-1713-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/AVR-2312CI-Deviceinfo.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-setup.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3311CI-AppCommand-update.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3311CI-Deviceinfo.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-3313-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-3313-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update.xml +4 -0
- denonavr-1.0.0/tests/xml/AVR-X1100W-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-X1100W-AppCommand-update-tonecontrol.xml +11 -0
- denonavr-1.0.0/tests/xml/AVR-X2000-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2000-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-2-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-2-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-setup.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X2100W-AppCommand-update.xml +3 -0
- denonavr-1.0.0/tests/xml/AVR-X4000-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-X4000-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/AVR-X4100W-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-X4100W-AppCommand-update-tonecontrol.xml +11 -0
- denonavr-1.0.0/tests/xml/AVR-X4300H-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/AVR-X4300H-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-1.0.0/tests/xml/M-CR510-2-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/M-CR510-2-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/M-CR510-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/M-CR510-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/M-CR603-AppCommand-setup.xml +4 -0
- denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update-soundmode.xml +4 -0
- denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update-tonecontrol.xml +4 -0
- denonavr-1.0.0/tests/xml/M-CR603-AppCommand-update.xml +4 -0
- denonavr-1.0.0/tests/xml/M-RC610-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/M-RC610-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/NR1604-AppCommand-update-soundmode.xml +3 -0
- denonavr-1.0.0/tests/xml/NR1604-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/NR1609-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/NR1609-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-1.0.0/tests/xml/SR5008-AppCommand-update-tonecontrol.xml +3 -0
- denonavr-1.0.0/tests/xml/SR5008-AppCommand-update.xml +3 -0
- denonavr-1.0.0/tests/xml/SR6011-AppCommand-update-soundmode.xml +6 -0
- denonavr-1.0.0/tests/xml/SR6011-AppCommand-update-tonecontrol.xml +11 -0
- denonavr-1.0.0/tests/xml/SR6012-AppCommand-update-soundmode-8080.xml +6 -0
- denonavr-1.0.0/tests/xml/SR6012-AppCommand-update-tonecontrol-8080.xml +11 -0
- denonavr-0.11.5/PKG-INFO +0 -290
- denonavr-0.11.5/README.md +0 -247
- denonavr-0.11.5/denonavr.egg-info/PKG-INFO +0 -290
- {denonavr-0.11.5 → denonavr-1.0.0}/LICENSE +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/appcommand.py +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/exceptions.py +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr/ssdp.py +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr.egg-info/dependency_links.txt +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr.egg-info/not-zip-safe +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr.egg-info/requires.txt +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/denonavr.egg-info/top_level.txt +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/setup.cfg +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/__init__.py +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/test_ssdp.py +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AV7703-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AV7703-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AV7703-Deviceinfo-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-8500H-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-8500H-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-8500H-Deviceinfo-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-X3700H-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-X3700H-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVC-X3700H-Deviceinfo-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1713-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1912-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-1912-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update-soundmode.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-1912-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update-tonecontrol.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-2312CI-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-1912-AppCommand-update.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-2312CI-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-1912-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1912-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1912-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-1912-formNetAudio_StatusXml.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-2312CI-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-3311CI-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update-soundmode.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-3311CI-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update-tonecontrol.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-3311CI-Deviceinfo.xml → /denonavr-1.0.0/tests/xml/AVR-2312CI-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-2312CI-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3311CI-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-3312-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update-soundmode.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-4810-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update-tonecontrol.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-4810-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-3312-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3312-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-3313-formZone3_Zone3XmlStatus.xml +0 -0
- /denonavr-0.11.5/tests/xml/M-CR603-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/M-CR603-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-4810-AppCommand-update-soundmode.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-4810-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1100W-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X1600H_upnp.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-X2000-2-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update-soundmode.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-X2100W-AppCommand-setup.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update-tonecontrol.xml +0 -0
- /denonavr-0.11.5/tests/xml/AVR-X2100W-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/AVR-X2000-2-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-2-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2000-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-2-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X2100W-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4000-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4100W-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4300H-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4300H-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/AVR-X4300H-Deviceinfo-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-2-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR510-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-CR603-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/M-RC610-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1604-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1609-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1609-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/NR1609-Deviceinfo-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-AppCommand-setup.xml +0 -0
- /denonavr-0.11.5/tests/xml/SR5008-AppCommand-update.xml → /denonavr-1.0.0/tests/xml/SR5008-AppCommand-update-soundmode.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR5008-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-AppCommand-setup.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-AppCommand-update.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-Deviceinfo.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formMainZone_MainZoneXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formMainZone_MainZoneXmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formNetAudio_StatusXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formTuner_HdXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formTuner_TunerXml.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formZone2_Zone2XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6011-formZone3_Zone3XmlStatus.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6012-AppCommand-setup-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6012-AppCommand-update-8080.xml +0 -0
- {denonavr-0.11.5 → denonavr-1.0.0}/tests/xml/SR6012-Deviceinfo-8080.xml +0 -0
denonavr-1.0.0/PKG-INFO
ADDED
|
@@ -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
|
+
[](https://github.com/ol-iver/denonavr/releases/latest)
|
|
47
|
+
[](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml)
|
|
48
|
+
[](https://pypi.org/project/denonavr)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
[](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/
|
denonavr-1.0.0/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# denonavr
|
|
2
|
+
[](https://github.com/ol-iver/denonavr/releases/latest)
|
|
3
|
+
[](https://github.com/ol-iver/denonavr/actions/workflows/python-tests.yml)
|
|
4
|
+
[](https://pypi.org/project/denonavr)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](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.
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
582
|
-
_LOGGER.debug("%s: %s", self.host,
|
|
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=
|
|
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(
|
|
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
|
-
|
|
738
|
-
|
|
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
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
121
|
-
self.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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."""
|