From 1091fa7f69d2f8523da08eff6ab8d13ef5cb8423 Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 20 Sep 2017 22:35:36 -0700 Subject: [PATCH] add support for switching inputs.. --- yadenon.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/yadenon.py b/yadenon.py index 967695a..079c5c7 100644 --- a/yadenon.py +++ b/yadenon.py @@ -64,6 +64,7 @@ class DenonAVR(object,basic.LineReceiver): self._speakera = None self._speakerb = None self._z2mute = None + self._input = None self._zm = None self._ms = None @@ -97,7 +98,10 @@ class DenonAVR(object,basic.LineReceiver): def setter(self, arg): arg = settrans(arg) if arg != getattr(self, attrname): - self._sendcmd(cmd, args[arg]) + try: + self._sendcmd(cmd, args[arg]) + except KeyError: + raise ValueError(arg) return property(getter, setter, doc=doc) @@ -108,6 +112,7 @@ class DenonAVR(object,basic.LineReceiver): return self._ms power = _magic('PW', '_power', bool, { True: 'ON', False: 'STANDBY' }, 'Power status, True if on') + input = _magic('SI', '_input', str, { x:x for x in ('PHONO', 'TUNER', 'CD', 'V.AUX', 'DVD', 'TV', 'SAT/CBL', 'DVR', ) }, 'Power status, True if on') mute = _magic('MU', '_mute', bool, { True: 'ON', False: 'OFF' }, 'Mute speakers, True speakers are muted (no sound)') zm = _magic('ZM', '_zm', bool, { True: 'ON', False: 'OFF' }, 'Main Zone On, True if on') z2mute = _magic('Z2MU', '_z2mute', bool, { True: 'ON', False: 'OFF' }, 'Mute Zone 2 speakers, True speakers are muted (no sound)') @@ -199,6 +204,10 @@ class DenonAVR(object,basic.LineReceiver): def proc_MS(self, arg): self._ms = arg + def proc_SI(self, arg): + self._input = arg + self._notify('input') + def proc_PS(self, arg): if arg == 'FRONT A': self._speakera = True @@ -440,6 +449,11 @@ class TestMethods(unittest.TestCase): efun.assert_called_once_with('zm') efun.reset_mock() + avr.proc_SI('TUNER') + + efun.assert_called_once_with('input') + efun.reset_mock() + avr.unregister(efun) avr.proc_PW('ON') @@ -586,3 +600,39 @@ class TestMethods(unittest.TestCase): avr.vol = 0 self.assertRaises(ValueError, setattr, avr, 'vol', 82) + + def test_proc_SI(self): + avr = self.avr + avr.proc_SI('PHONO') + self.assertEqual(avr.input, 'PHONO') + + avr.proc_SI('TUNER') + self.assertEqual(avr.input, 'TUNER') + + @mock.patch('yadenon.DenonAVR.sendLine') + def test_input(self, sendline): + avr = self.avr + + avr.input = 'PHONO' + sendline.assert_any_call('SIPHONO') + + # Verify the transition doesn't happen + self.assertIsNone(avr.input) + + # till we get notification + avr.proc_SI('PHONO') + self.assertEqual(avr.input, 'PHONO') + + avr.input = 'TUNER' + sendline.assert_any_call('SITUNER') + + avr.input = 'CD' + avr.input = 'V.AUX' + avr.input = 'DVD' + avr.input = 'TV' + avr.input = 'SAT/CBL' + avr.input = 'DVR' + + self.assertRaises(ValueError, setattr, avr, 'input', 'bogus') + self.assertRaises(ValueError, setattr, avr, 'input', True) + self.assertRaises(ValueError, setattr, avr, 'input', 34)