From 4977f627faad0de908214295aca7cc9149bb5990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Libor=20=C5=A0af=C3=A1=C5=99?= Date: Sun, 7 Apr 2024 12:03:50 +0200 Subject: [PATCH] Add set volume function --- sonyapilib/device.py | 30 ++++++++++++++++++++--- tests/data/{volume.xml => get_volume.xml} | 0 tests/data/set_volume.xml | 7 ++++++ tests/device_test.py | 30 +++++++++++++++++++---- 4 files changed, 58 insertions(+), 9 deletions(-) rename tests/data/{volume.xml => get_volume.xml} (100%) create mode 100644 tests/data/set_volume.xml diff --git a/sonyapilib/device.py b/sonyapilib/device.py index 941890b..bcd822e 100644 --- a/sonyapilib/device.py +++ b/sonyapilib/device.py @@ -758,11 +758,13 @@ def get_playing_status(self): return "OFF" return find_in_xml(content, [".//CurrentTransportState"]).text - def get_volume(self): + def get_volume(self, channel=None, instance_id=0): """Get device volume.""" - data = """ - 0 - Master + channel = channel or "Master" + + data = f""" + {instance_id} + {channel} """ action = "urn:schemas-upnp-org:service:RenderingControl:1#GetVolume" @@ -775,6 +777,26 @@ def get_volume(self): return int(find_in_xml(content, [".//CurrentVolume"]).text) + def set_volume(self, volume, channel=None, instance_id=0): + """Set device volume.""" + channel = channel or "Master" + + data = f""" + {instance_id} + {channel} + {volume} + """ + + action = "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" + + content = self._post_soap_request( + url=self.rendering_control_url, params=data, action=action) + + if not content: + return False + + return "SetVolumeResponse" in content + def get_power_status(self): """Check if the device is online.""" if self.api_version < 4: diff --git a/tests/data/volume.xml b/tests/data/get_volume.xml similarity index 100% rename from tests/data/volume.xml rename to tests/data/get_volume.xml diff --git a/tests/data/set_volume.xml b/tests/data/set_volume.xml new file mode 100644 index 0000000..0349ee1 --- /dev/null +++ b/tests/data/set_volume.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/tests/device_test.py b/tests/device_test.py index 91fa906..167878a 100644 --- a/tests/device_test.py +++ b/tests/device_test.py @@ -48,7 +48,8 @@ BASE_URL = 'http://test/sony' AV_TRANSPORT_URL = 'http://test:52323/upnp/control/AVTransport' AV_TRANSPORT_URL_NO_MEDIA = 'http://test2:52323/upnp/control/AVTransport' -RENDERING_CONTROL_URL = 'http://test:52323/upnp/control/RenderingControl' +RENDERING_CONTROL_URL_GET_VOLUME = 'http://test:52323/upnp/control/RenderingControl' +RENDERING_CONTROL_URL_SET_VOLUME = 'http://test2:52323/upnp/control/RenderingControl' REQUESTS_ERROR = 'http://ERROR' ACTION_LIST = [ @@ -169,11 +170,19 @@ def mocked_requests_post(*args, **kwargs): read_file( 'data/playing_status_legacy_no_media.xml')) - elif url == RENDERING_CONTROL_URL: + elif url == RENDERING_CONTROL_URL_GET_VOLUME: return MockResponse(None, 200, read_file( - 'data/volume.xml')) + 'data/get_volume.xml')) + + elif url == RENDERING_CONTROL_URL_SET_VOLUME: + # return MockResponse(None, 500) + + return MockResponse(None, + 200, + read_file( + 'data/set_volume.xml')) elif url == COMMAND_LIST_V4: json_data = jsonpickle.decode(read_file('data/commandList.json')) @@ -857,13 +866,24 @@ def test_playing_status_no_media_legacy(self, mocked_requests_post): self.assertEqual("PLAYING", device.get_playing_status()) @mock.patch('requests.post', side_effect=mocked_requests_post) - def test_volume(self, mocked_requests_post): + def test_get_volume(self, mocked_requests_post): device = self.create_device() self.assertEqual(-1, device.get_volume()) - device.rendering_control_url = RENDERING_CONTROL_URL + device.rendering_control_url = RENDERING_CONTROL_URL_GET_VOLUME self.assertEqual(64, device.get_volume()) + @mock.patch('requests.post', side_effect=mocked_requests_post) + def test_set_volume(self, mocked_requests_post): + device = self.create_device() + + device.rendering_control_url = RENDERING_CONTROL_URL_SET_VOLUME + # self.assertEqual(False, device.set_volume(-10)) + # self.assertEqual(False, device.set_volume(200)) + + self.assertEqual(True, device.set_volume(50)) + self.assertEqual(True, device.set_volume(0)) + def test_irrc_is_dmr(self): dev = SonyDevice(host="none", nickname="none", ircc_port=42, dmr_port=42) self.assertEqual(dev.dmr_url, dev.ircc_url)