python-swidget 1.4.11__tar.gz → 1.4.12__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-swidget
3
- Version: 1.4.11
3
+ Version: 1.4.12
4
4
  Summary: Python API for Swidget smart devices
5
5
  Home-page: https://github.com/swidget/python-swidget
6
6
  License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-swidget"
3
- version = "1.4.11"
3
+ version = "1.4.12"
4
4
  description = "Python API for Swidget smart devices"
5
5
  license = "GPL-3.0-or-later"
6
6
  authors = ["Swidget"]
@@ -381,6 +381,18 @@ class SwidgetDevice:
381
381
  self.device_config = DeviceConfiguration(config)
382
382
  self._last_update = int(time.time())
383
383
 
384
+ async def set_device_config(self, updates: Dict[str, Any]) -> None:
385
+ """POST a partial device_config update.
386
+
387
+ The firmware accepts a sparse dict mirroring the full config tree
388
+ (only the changed leaves), so callers should pass the same nested
389
+ shape ``get_device_config()`` returns. After the POST succeeds the
390
+ local cache is refreshed so reads see the new value immediately.
391
+ """
392
+ _LOGGER.debug("SwidgetDevice.set_device_config(%s) called", updates)
393
+ await self.make_http_request("POST", "device_config", json_payload=updates)
394
+ await self.get_device_config()
395
+
384
396
  async def get_summary(self) -> None:
385
397
  """Get a summary of the device over HTTP."""
386
398
  _LOGGER.debug("SwidgetDevice.get_summary() called")
@@ -889,6 +901,29 @@ class SwidgetDevice:
889
901
  return True
890
902
  return False
891
903
 
904
+ @property
905
+ def rtsp_enabled(self) -> Optional[bool]:
906
+ """Return whether the video insert's RTSP server is enabled.
907
+
908
+ Returns None when the config hasn't been fetched yet or the path
909
+ isn't present (non-video insert, or older firmware that omits the
910
+ key). Callers should treat None as "unknown" rather than False.
911
+ """
912
+ try:
913
+ return bool(
914
+ self.device_config.config["insert"]["components"]["video"]["rtsp"][
915
+ "enable"
916
+ ]
917
+ )
918
+ except (KeyError, TypeError):
919
+ return None
920
+
921
+ async def set_rtsp_enabled(self, enabled: bool) -> None:
922
+ """Enable or disable the video insert's RTSP server."""
923
+ await self.set_device_config(
924
+ {"insert": {"components": {"video": {"rtsp": {"enable": bool(enabled)}}}}}
925
+ )
926
+
892
927
  async def __aenter__(self) -> "SwidgetDevice":
893
928
  """Initialize and connect the Swidget Websocket client."""
894
929
  await self.connect()