common_server.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from __future__ import annotations
  2. from typing import Any
  3. from .auth import load_projects_config
  4. from .collector_api import (
  5. connect_device as api_connect_device,
  6. disconnect_device as api_disconnect_device,
  7. list_device_points as api_list_device_points,
  8. list_devices as api_list_devices,
  9. )
  10. from .mcp_app import mcp
  11. @mcp.tool(
  12. name="project.list",
  13. title="Project List",
  14. description=(
  15. "List enabled 汇采 projects available to this MCP service, including "
  16. "project_key, project_name, base_url, and data_collector_base_url. "
  17. "Call this first to choose project_key."
  18. ),
  19. tags={"project", "list"},
  20. )
  21. def project_list() -> dict[str, Any]:
  22. projects = load_projects_config()
  23. result = [
  24. {
  25. "project_key": item["project_key"],
  26. "project_name": item["project_name"],
  27. "base_url": item["base_url"],
  28. "data_collector_base_url": item["data_collector_base_url"],
  29. }
  30. for item in projects
  31. if item["enabled"]
  32. ]
  33. result.sort(key=lambda item: item["project_key"])
  34. return {"projects": result, "total": len(result)}
  35. @mcp.tool(
  36. name="collector.device_list",
  37. description=(
  38. "汇采-查询设备列表。调用 {data_collector_base_url}/api/collector/device。"
  39. "用于查看设备树、设备分组、设备连接状态、设备采集状态和点位数量;"
  40. "不返回点位明细、点位采集状态或点位当前值。"
  41. "如果目标是查看某个设备下点位的采集状态和值,请使用 collector.device_points。"
  42. "num_points 默认 false;只有需要统计设备或点位分组下的点位数量时才传 true。"
  43. "响应透传上游 JSON,state=0 表示业务成功。"
  44. ),
  45. )
  46. def collector_device_list(project_key: str, num_points: bool = False) -> dict[str, Any]:
  47. return api_list_devices(project_key, num_points=num_points)
  48. @mcp.tool(
  49. name="collector.device_connect",
  50. description=(
  51. "汇采-连接设备。调用 "
  52. "{data_collector_base_url}/api/collector/common/device/set_connect_status,"
  53. "请求 status=2。用于让指定设备进入已连接状态;连接成功不代表正在采集,"
  54. "采集状态请看响应 data.running_status 或后续查询设备/点位状态。"
  55. "device_id 是设备列表中的设备 id;device_type 默认 modbus,其他设备类型可传 "
  56. "s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  57. "响应透传上游 JSON,state=0 表示业务成功。常见状态:"
  58. "data.status 1=未连接、2=已连接、3=连接异常;"
  59. "data.running_status 0=未采集、1=采集中、2=采集异常。"
  60. ),
  61. )
  62. def collector_device_connect(
  63. project_key: str,
  64. device_id: int,
  65. device_type: str = "modbus",
  66. ) -> dict[str, Any]:
  67. return api_connect_device(project_key, device_id=device_id, device_type=device_type)
  68. @mcp.tool(
  69. name="collector.device_disconnect",
  70. description=(
  71. "汇采-断开设备。调用 "
  72. "{data_collector_base_url}/api/collector/common/device/set_connect_status,"
  73. "请求 status=1。用于停止指定设备连接/采集相关状态,使设备回到未连接或空闲状态。"
  74. "device_id 是设备列表中的设备 id;device_type 默认 modbus,其他设备类型可传 "
  75. "s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  76. "响应透传上游 JSON,state=0 表示业务成功。常见状态:"
  77. "data.status 1=未连接、2=已连接、3=连接异常;"
  78. "data.running_status 0=未采集、1=采集中、2=采集异常。"
  79. ),
  80. )
  81. def collector_device_disconnect(
  82. project_key: str,
  83. device_id: int,
  84. device_type: str = "modbus",
  85. ) -> dict[str, Any]:
  86. return api_disconnect_device(project_key, device_id=device_id, device_type=device_type)
  87. @mcp.tool(
  88. name="collector.device_points",
  89. description=(
  90. "汇采-查询设备点位列表。调用 "
  91. "{data_collector_base_url}/api/collector/common/device/get_collect_point。"
  92. "主要用于查看某个设备下点位的采集状态和值:Modbus/S7 返回 data.point[].status "
  93. "和 data.point[].present_value,status 0=未采集、1=采集正常、2=采集异常;"
  94. "present_value 是当前内存中的点位最新值。group_id 默认 0 表示查询全部点位,"
  95. "传具体点位分组 id 时只返回该分组下点位。device_type 默认 modbus,其他设备类型可传 "
  96. "s7、bacnet、ethernet-ip、opc-ua、opc-da、snmp、iec104。"
  97. "响应透传上游 JSON,state=0 表示业务成功。Modbus 点位常见字段包括 id、point_id、"
  98. "name、address、type、device_id、status、function_code、present_value、scale_ratio、"
  99. "value_offset、group_id、bit、update_time;S7 点位常见字段包括 id、point_id、name、"
  100. "address、data_type、register_type、device_id、status、present_value、scale_ratio、"
  101. "value_offset、group_id、update_time。"
  102. ),
  103. )
  104. def collector_device_points(
  105. project_key: str,
  106. device_id: int,
  107. device_type: str = "modbus",
  108. group_id: int = 0,
  109. ) -> dict[str, Any]:
  110. return api_list_device_points(
  111. project_key,
  112. device_id=device_id,
  113. device_type=device_type,
  114. group_id=group_id,
  115. )