From 94e79418b9dc7a241a0fe00473b5f667efdd06d8 Mon Sep 17 00:00:00 2001 From: KCFeng425 <2100011801@stu.pku.edu.cn> Date: Thu, 5 Jun 2025 15:36:53 +0800 Subject: [PATCH] Add Device MockSolenoidValve --- test/experiments/MockSolenoidValve.json | 25 ++++++ .../MockSolenoidValve/MockSolenoidValve.py | 89 +++++++++++++++++++ .../Mock/MockSolenoidValve/__init__.py | 0 .../registry/devices/MockSolenoidValve.yaml | 41 +++++++++ 4 files changed, 155 insertions(+) create mode 100644 test/experiments/MockSolenoidValve.json create mode 100644 unilabos/devices/Mock/MockSolenoidValve/MockSolenoidValve.py create mode 100644 unilabos/devices/Mock/MockSolenoidValve/__init__.py create mode 100644 unilabos/registry/devices/MockSolenoidValve.yaml diff --git a/test/experiments/MockSolenoidValve.json b/test/experiments/MockSolenoidValve.json new file mode 100644 index 0000000..cdf124f --- /dev/null +++ b/test/experiments/MockSolenoidValve.json @@ -0,0 +1,25 @@ +{ + "nodes": [ + { + "id": "MockSolenoidValve1", + "name": "模拟电磁阀", + "children": [], + "parent": null, + "type": "device", + "class": "MockSolenoidValve", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + "port": "MOCK" + }, + "data": { + "status": "Idle", + "valve_status": "Closed" + } + } + ], + "links": [] +} \ No newline at end of file diff --git a/unilabos/devices/Mock/MockSolenoidValve/MockSolenoidValve.py b/unilabos/devices/Mock/MockSolenoidValve/MockSolenoidValve.py new file mode 100644 index 0000000..e8cb79e --- /dev/null +++ b/unilabos/devices/Mock/MockSolenoidValve/MockSolenoidValve.py @@ -0,0 +1,89 @@ +import time + + +class MockSolenoidValve: + """ + 模拟电磁阀设备类 - 简化版本 + + 这个类提供了电磁阀的基本功能:开启、关闭和状态查询 + """ + + def __init__(self, port: str = "MOCK"): + """ + 初始化MockSolenoidValve实例 + + Args: + port (str): 设备端口,默认为"MOCK"表示模拟设备 + """ + self.port = port + self._status: str = "Idle" + self._valve_status: str = "Closed" # 阀门位置:Open, Closed + + @property + def status(self) -> str: + """设备状态 - 会被自动识别的设备属性""" + return self._status + + @property + def valve_status(self) -> str: + """阀门状态""" + return self._valve_status + + def set_valve_status(self, status: str) -> str: + """ + 设置阀门位置 + + Args: + position (str): 阀门位置,可选值:"Open", "Closed" + + Returns: + str: 操作结果状态 ("Success", "Error") + """ + if status not in ["Open", "Closed"]: + self._status = "Error: Invalid position" + return "Error" + + self._status = "Moving" + time.sleep(1) # 模拟阀门动作时间 + + self._valve_status = status + self._status = "Idle" + return "Success" + + def open_valve(self) -> str: + """打开阀门""" + return self.set_valve_status("Open") + + def close_valve(self) -> str: + """关闭阀门""" + return self.set_valve_status("Closed") + + def get_valve_status(self) -> str: + """获取阀门位置""" + return self._valve_status + + def is_open(self) -> bool: + """检查阀门是否打开""" + return self._valve_status == "Open" + + def is_closed(self) -> bool: + """检查阀门是否关闭""" + return self._valve_status == "Closed" + + +# 用于测试的主函数 +if __name__ == "__main__": + valve = MockSolenoidValve() + + print("启动电磁阀测试...") + print(f"初始状态: 位置={valve.valve_status}, 状态={valve.status}") + + # 测试开启阀门 + valve.open_valve() + print(f"开启后: 位置={valve.valve_status}, 状态={valve.status}") + + # 测试关闭阀门 + valve.close_valve() + print(f"关闭后: 位置={valve.valve_status}, 状态={valve.status}") + + print("测试完成") \ No newline at end of file diff --git a/unilabos/devices/Mock/MockSolenoidValve/__init__.py b/unilabos/devices/Mock/MockSolenoidValve/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/unilabos/registry/devices/MockSolenoidValve.yaml b/unilabos/registry/devices/MockSolenoidValve.yaml new file mode 100644 index 0000000..ca4cbd5 --- /dev/null +++ b/unilabos/registry/devices/MockSolenoidValve.yaml @@ -0,0 +1,41 @@ +MockSolenoidValve: + description: Mock Solenoid Valve Device + class: + module: unilabos.devices.Mock.MockSolenoidValve.MockSolenoidValve:MockSolenoidValve + type: python + status_types: + status: String + valve_status: String + action_value_mappings: + set_valve_status: + type: SendCmd + goal: + command: status + feedback: {} + result: + success: success + open_valve: + type: SendCmd + goal: {} + feedback: {} + result: + success: success + close_valve: + type: SendCmd + goal: {} + feedback: {} + result: + success: success + schema: + type: object + properties: + status: + type: string + description: Current status of the valve + valve_status: + type: string + description: Valve status (Open/Closed) + required: + - status + - valve_status + additionalProperties: false \ No newline at end of file