Files
chongming-config/workers/aibox_sophon_adapter/config.toml
T

146 lines
8.2 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ====== 插件注册信息(控制加载方式) ======
[workers]
type = "aibox_sophon_adapter"
module = "plugins.aibox_sophon_adapter"
factory = "create_workers"
cleanup = "cleanup"
count = 1
[worker]
name = "aibox_sophon_adapter"
version = "0.1.0"
description = "AI Box Sophon 设备适配器 — MQTT 心跳上报与设备状态监控"
config_version = "1.0"
defaults = { method = "GET", timeout = 30, auth_required = false, cacheable = false, internal = false }
[worker.registration]
router_prefix = "/aibox_sophon_adapter"
tags = ["aibox_sophon_adapter", "sophon", "adapter"]
# ====== MQTT Bridge 额外订阅主题(本插件声明,网关自动订阅并路由到本插件) ======
# topic: 订阅主题,支持 +(单级)/ #(多级,须在末尾)通配符
# subject: 可选,目标 Zenoh subject,支持 {1} {2}... 占位符;
# 默认 "<插件类型>.<topic 最后一段>"
# response_topic: 可选,响应发布主题,支持占位符;默认 "<实际匹配主题>/response"
# 请求负载为信封协议: {"meta": {"method"/"timeout"/"cacheable"}, "data": {...}}
# meta 各字段可选(method 默认 GET,timeout 默认 30s,cacheable 默认 false)
# 兼容非信封原始报文(如盒子心跳 JSON):整包视为 data、meta 置空照常路由
# 盒子侧只支持设置根主题:根主题已改为 box(非 chongming 保留命名空间,避免被网关 Bridge 拦截),
# 盒子心跳发布到 box/aibox_sophon/board_ping,映射到本插件的心跳 RPC。
[[workers.mqtt_topics]]
topic = "box/aibox_sophon/board_ping"
subject = "aibox_sophon_adapter.board_ping"
# response_topic = "box/aibox_sophon/board_ping/response" # 默认即 "<实际匹配主题>/response"
# ====== Worker 运行时配置(由 lifespan_setup 传递给 create_workers) ======
[workers.config]
data_dir = "./data"
# mediamtx_addr = "rtsp://127.0.0.1:8554" # MediaMTX 地址
mediamtx_addr = "rtsp://127.0.0.1/channel" # MediaMTX 地址
link_path = "/data/bm-app" # 软链接路径
[workers.config.database]
type = "postgresql"
url = "postgresql+asyncpg://postgres:postgres@localhost:5432/aibox_sophon_adapter"
[workers.config.heartbeat]
interval = 5 # 设备上报间隔(秒)
timeout = 15 # 超时阈值(秒),超过此时间未收到心跳视为离线
check_interval = 10 # 服务端检查离线设备的间隔(秒)
[workers.config.mqtt_forward]
enabled = true
# uri 含凭据,请勿提交到仓库:留空时从环境变量 AIBOX_MQTT_URI 读取
# 格式 mqtt://user:pass@host:port,密码中特殊字符需 URL 编码(@ → %40)
uri = ""
topic = "/board_ping" # 转发目标主题
# ====== 外部 MQTT 订阅(本插件直接订阅外部 Broker,不走网关 Bridge) ======
# enabled: 是否启用外部订阅
# uri: 外部 Broker 地址(mqtt://user:pass@host:port,密码中特殊字符需 URL 编码)
# topics: 订阅主题列表,每项包含
# topic: 订阅主题,支持 +(单级)/ #(多级,须在末尾)通配符
# handler: 处理函数名,按序从插件 router 模块、插件包自身查找
# 若该函数首个参数为 Pydantic 模型,则以消息 JSON 构造模型后调用;
# 否则将消息 JSON 作为关键字参数展开调用
# reply_topic: 可选,回复主题;处理后返回值(非 None)发布到该主题
# 支持 {1} {2}... 占位符(填充 topic 通配符捕获值)
[workers.config.mqtt_subscribe]
enabled = true
# uri 含凭据,请勿提交到仓库:留空时从环境变量 AIBOX_MQTT_URI 读取(格式同 mqtt_forward)
uri = ""
# 边缘应用控制器:请求-响应协议
# 请求: 发布到 /edge_app_controller,消息 {"command": "query_status", ...}
# 回复: 处理结果发布到 /edge_app_controller_reply,统一封装 {"code": 0, "msg": "ok", "data": {...}}
[[workers.config.mqtt_subscribe.topics]]
topic = "/edge_app_controller" # 订阅主题(外部请求)
handler = "edge_app_controller" # 处理函数(按 command 分发)
reply_topic = "/edge_app_controller_reply" # 回复主题
# ====== 内部 MQTT 请求-响应客户端 ======
# 供外部订阅 handler 内部对任意应用进程发起请求-响应(主题显式传入,不依赖 chongming 协议)
# uri: 目标 Broker(默认内部 127.0.0.1:1883;如需连外部可改为外部地址)
# 使用示例(handler 内):
# resp = await internal_mqtt.request(
# request_topic="/other_app/request", # 目标应用监听的请求主题
# response_topic="/other_app/reply/#", # 目标应用回复的主题(支持 +/# 或 {rid} 模板)
# payload={"BoardId": ...},
# timeout=30,
# )
[workers.config.internal_mqtt]
enabled = true
uri = "mqtt://127.0.0.1:1883"
# 内部请求-响应主题(edge_app_controller 的 alg_media_fetch 命令使用)。
# 与盒子侧约定一致:盒子只设根主题 box(非 chongming 保留命名空间),
# 子路径固定 aibox_sophon/...,回复主题固定为 ..._reply。
# 不要用 chongming/{插件}/{操作}——网关 MQTT Bridge 订阅 chongming/+/+,
# 会拦截 3 级主题并按 Worker RPC 路由,而 edge_app_controller 不是 @rpc_method,
# 会导致 worker_manager 报 "Worker ... 无回复,尝试重试"。
request_topic = "box/aibox_sophon/edge_app_controller"
response_topic = "box/aibox_sophon/edge_app_controller_reply"
[workers.config.alarm_retention]
max_records = 100 # 最多保留的告警记录数,设为 0 表示不限制
[workers.config.doubao_analysis]
enabled = false # 是否启用豆包 AI 分析告警图片
[workers.config.ip_sound_column]
enabled = false # 是否开启IP音柱报警
volume = 50
tts = {}
[workers.config.alarm_forward]
# enabled = false # 是否启用告警转发到外部平台
enabled = true # 是否启用告警转发到外部平台
# url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receive" # 外部告警接收地址
url = "http://192.168.1.6:48092/open-api/event-alarm/receive" # 外部告警接收地址
# video_upload_url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receiveVideoUpload" # 外部视频上传地址
video_upload_url = "http://192.168.1.6:49092/open-api/event-alarm/receiveVideoUpload" # 外部视频上传地址
timeout = 10.0 # 转发请求超时(秒)
# ====== IN2 数字输入控制任务启停 ======
# 监听盒子 IN2 DI 输入,电平变化时控制全部算法任务:
# IN2 有电(电平 1)→ 启动全部算法任务;IN2 断电(电平 0)→ 停止全部算法任务
# 盒子接口:POST {api_base}/api/alg_task_fetch(查询任务)、POST {api_base}/api/alg_task_control(启停控制)
# 后端自适应(diwatch.make_in2_backend):
# SE9 — sysfs 状态文件 /sys/bus/platform/devices/gpio-in-2/gpio_status(轮询+抗抖)
# SE5 — 无 gpio-in-2,回退 gpio-keys event 设备(默认 /dev/input/event1,键码 key,默认 KEY_DOWN=108)
# 注意:
# - 只响应电平跳变,不按插件启动时的初始电平动作(避免重启时误触发全量启停)
# - event 后端需要 /dev/input/event* 读权限:linaro 用户执行
# `sudo usermod -aG input linaro` 并重新登录(服务以 root 运行则无此问题)
# - 操作 IN2 无反应时,先运行 `python3 -m diwatch detect` 查实际键码再填 key
[workers.config.task_switch]
enabled = true
api_base = "http://127.0.0.1" # 盒子 HTTP API 地址(网关与盒子同机部署用 127.0.0.1)
start_command = 1 # 启动任务的 ControlCommand
stop_command = 0 # 停止任务的 ControlCommand
poll_interval = 0.05 # IN2 轮询间隔(秒,sysfs 后端)
debounce = 3 # 抗抖:连续 N 次采样一致才确认跳变(sysfs 后端)
# active_low = false # 电平取反(默认 false:1=有电=启动任务)
# device = "/dev/input/event1" # 显式指定 event 设备(默认自动查找 gpio-keys)
# key = 108 # SE5 event 键码(用 diwatch detect 查实际键码后填写)