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