From c13cb5795cf45903be400c3e0924d83f07f6d11e Mon Sep 17 00:00:00 2001 From: Stefan Tatschner Date: Thu, 24 Oct 2024 10:58:39 +0200 Subject: [PATCH] feat: Add support for RND power supplies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A very limited port of this: https://github.com/rumpelsepp/opennetzteil/blob/master/devices/rnd/rnd320.go However, these devices are so buggy that only switch on/off works reliably … (in most cases). --- contrib/rnd.rules | 1 + src/opennetzteil/__init__.py | 3 +- src/opennetzteil/devices/rnd.py | 67 ++++++++++++++++++++++++ src/opennetzteil/devices/rnd/__init__.py | 0 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 contrib/rnd.rules create mode 100644 src/opennetzteil/devices/rnd.py delete mode 100644 src/opennetzteil/devices/rnd/__init__.py diff --git a/contrib/rnd.rules b/contrib/rnd.rules new file mode 100644 index 000000000..487f1dd0b --- /dev/null +++ b/contrib/rnd.rules @@ -0,0 +1 @@ +KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0416", ATTRS{idProduct}=="5011", SYMLINK+="rnd-netzteil" diff --git a/src/opennetzteil/__init__.py b/src/opennetzteil/__init__.py index 7aed4015c..fe1eeaba4 100644 --- a/src/opennetzteil/__init__.py +++ b/src/opennetzteil/__init__.py @@ -3,7 +3,8 @@ # SPDX-License-Identifier: Apache-2.0 from opennetzteil.devices.http.client import HTTPNetzteil +from opennetzteil.devices.rnd import RND320 from opennetzteil.devices.rs.hmc804 import HMC804 from opennetzteil.netzteil import BaseNetzteil -netzteile: list[type[BaseNetzteil]] = [HTTPNetzteil, HMC804] +netzteile: list[type[BaseNetzteil]] = [HTTPNetzteil, HMC804, RND320] diff --git a/src/opennetzteil/devices/rnd.py b/src/opennetzteil/devices/rnd.py new file mode 100644 index 000000000..34f394003 --- /dev/null +++ b/src/opennetzteil/devices/rnd.py @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: AISEC Pentesting Team +# +# SPDX-License-Identifier: Apache-2.0 + +import asyncio +from pathlib import Path +from typing import Any + +from opennetzteil.exceptions import OperationNotSupportedError +from opennetzteil.netzteil import BaseNetzteil + + +class RND320(BaseNetzteil): + PRODUCT_ID = "RND320" + + async def _send(self, data: str) -> None: + with Path(self.target.path).open("w") as f: + await asyncio.to_thread(f.write, data) + + async def get_ident(self) -> str: + raise OperationNotSupportedError() + + async def get_master(self) -> bool: + raise OperationNotSupportedError() + + async def set_master(self, enabled: bool) -> None: + cmd = "OUT1" if enabled else "OUT0" + await self._send(cmd) + + async def get_channels(self) -> int: + return 1 + + async def get_current(self, channel: int) -> float: + raise OperationNotSupportedError() + + async def set_current(self, channel: int, value: float) -> None: + raise OperationNotSupportedError() + + async def get_voltage(self, channel: int) -> float: + raise OperationNotSupportedError() + + async def set_voltage(self, channel: int, value: float) -> None: + raise OperationNotSupportedError() + + async def get_output(self, channel: int) -> bool: + raise OperationNotSupportedError() + + async def set_output(self, channel: int, enabled: bool) -> None: + await self.set_master(enabled) + + async def status(self) -> dict[str, Any]: + raise OperationNotSupportedError() + + async def get_ocp(self, channel: int) -> bool: + raise OperationNotSupportedError() + + async def set_ocp(self, channel: int, enabled: bool) -> None: + raise OperationNotSupportedError() + + async def get_ovp(self, channel: int) -> bool: + raise OperationNotSupportedError() + + async def set_ovp(self, channel: int, enabled: bool) -> None: + raise OperationNotSupportedError() + + async def set_beep(self, enabled: bool) -> None: + raise OperationNotSupportedError() diff --git a/src/opennetzteil/devices/rnd/__init__.py b/src/opennetzteil/devices/rnd/__init__.py deleted file mode 100644 index e69de29bb..000000000