动检/人形告警推送到自建服务:乐橙 setMessageCallback + 3 分钟验收清单
动检/人形告警推送到自建服务:乐橙 setMessageCallback + 3 分钟验收清单
现行 OpenAPI · 勿用 旧版本协议(不再维护) · 回调见 事件消息推送
我给乐橙门口机写了一个自建通知服务——动检推 Telegram,人形推 Home Assistant,打算周末搞定。
周五晚上,在 乐橙开放平台 拿到的accessToken和listDeviceDetailsByPage都通了。我在镜头前挥手,乐橙 App 立刻弹「有人」。
自建服务日志:一行都没有。
周六我把 MD5 签名对了八遍;周日才发现——从没调过setMessageCallback。App 通知走厂商通道;你的 HTTPS 服务,乐橙云不知道往哪 POST。改完回调,按下面清单3 分钟跑通,第一条human进日志。
动检和人形,为什么必须走推送而不是轮询
| 方式 | 延迟 | 配额 | 能否进自建服务 |
|---|---|---|---|
| 乐橙 App 推送 | 低 | — | 否 |
定时getAlarmMessage | 30s~分钟级 | 烧 API | 易漏、难扩展 |
| HTTP 回调 | 通常 1~3s | 友好 | 正路 |
setMessageCallback在乐橙云产生videoMotion/human时,主动 POST到你的公网 URL。
callbackFlag 与 msgType
callbackFlag msgType(回调 JSON) ────────────────────────────────────────────────── alarm → videoMotion(动检) → human(人形) deviceStatus → online / offline faceAnalysis(可选) → aiPerLine 等(行业 AI,视机型)家用乐橙 IPC常见AlarmMD+AiHuman→callbackFlag: alarm即可,不必误订faceAnalysis(设备不支持则永远收不到)。
| 能力字段(分页接口返回) | 期望 msgType | 设备端 |
|---|---|---|
AlarmMD | videoMotion | 开移动侦测 |
AiHuman | human | 开人形检测 |
边界:回调仅针对开发者主账号资产池设备;列表用listDeviceDetailsByPage,勿用停维护的deviceList方法。
计时从「桥接 HTTPS 已部署、设备 online」开始。任一步失败即停。
第 0 分钟 · 调用壳(国内网关)
// lib/platform-call.jsimportcryptofrom'node:crypto';import{randomUUID}from'node:crypto';exportfunctioncalcSign(time,nonce,appSecret){constraw=`time:${time},nonce:${nonce},appSecret:${appSecret}`;returncrypto.createHash('md5').update(raw,'utf8').digest('hex');}exportasyncfunctionplatformCall(method,params={}){constappId=process.env.APP_ID;constappSecret=process.env.APP_SECRET;constbase=process.env.OPENAPI_BASE;consttime=Math.floor(Date.now()/1000);constnonce=randomUUID();constbody={system:{ver:'1.0',appId,sign:calcSign(time,nonce,appSecret),time,nonce},id:randomUUID(),params,};constres=awaitfetch(`${base}/${method}`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body),});constjson=awaitres.json();if(json.result?.code!=='0')thrownewError(`[${json.result.code}]${json.result.msg}`);returnjson.result.data;}exportasyncfunctionadminToken(){const{accessToken}=awaitplatformCall('accessToken',{});returnaccessToken;}APP_ID=lcdxxxxxxxxxxxxAPP_SECRET=your_secretOPENAPI_BASE=https://openapi.lechange.cn/openapiCALLBACK_URL=https://your-bridge.example.com/imou/events签名规则:开发规范 ·accessToken约 3 天有效,生产 Redis 缓存。
第 1 分钟 · 资产 + 能力验收
// scripts/minute-1-verify-device.jsimport'dotenv/config';import{platformCall,adminToken}from'../lib/platform-call.js';consttoken=awaitadminToken();constpage=awaitplatformCall('listDeviceDetailsByPage',{token,pageSize:10,page:1,source:'bindAndShare',});constdev=page.deviceList?.[0];if(!dev)thrownewError('资产池为空:开发者主账号绑定设备');constability=dev.channelList?.[0]?.channelAbility??dev.deviceAbility??'';console.log({deviceId:dev.deviceId,deviceStatus:dev.deviceStatus,hasMotion:ability.includes('AlarmMD'),hasHuman:/AiHuman|AiHumanCar/.test(ability),});✅ 通过:deviceList ≥ 1·online· 含AlarmMD和/或AiHuman
踩坑 A:乐橙 App 能看、列表 0 → 私人号绑定,换 开发者主账号 重新添加。
第 2 分钟 · setMessageCallback + 读回
// scripts/minute-2-set-callback.jsimport'dotenv/config';import{platformCall,adminToken}from'../lib/platform-call.js';consttoken=awaitadminToken();awaitplatformCall('setMessageCallback',{token,status:'on',callbackUrl:process.env.CALLBACK_URL,callbackFlag:'alarm,deviceStatus',basePush:'2',});console.log(awaitplatformCall('getMessageCallback',{token}));| 参数 | 说明 |
|---|---|
callbackUrl | HTTPS 公网 |
callbackFlag | alarm,deviceStatus |
basePush: '2' | 业务接管,避免与乐橙 App 重复推送 |
getMessageCallback | 读回验收 |
踩坑 B:HTTP / 自签证书 → 校验失败。踩坑 C:漏alarm→ 收不到videoMotion/human。
第 3 分钟 · 桥接 + 实机触发
// src/alarm-bridge.jsimportexpressfrom'express';constapp=express();app.use(express.json());functionclassify(msg){if(msg.msgType==='human')return'human';if(msg.msgType==='videoMotion')return'motion';if(msg.msgType==='online'||msg.msgType==='offline')return'status';return'other';}app.post('/imou/events',(req,res)=>{res.status(200).send('ok');queueMicrotask(()=>{constmsg=req.body;console.log(JSON.stringify({kind:classify(msg),msgType:msg.msgType,deviceId:msg.did,alarmId:msg.id,}));});});app.listen(8080);镜头前走动或站立,日志应出现:
{"msgType":"videoMotion","did":"DOOR_CAM_001","cid":0,"id":2447736561}或"msgType": "human"。
踩坑 D:业务逻辑放在200之前 → 超时后平台停推(我们丢过一周告警)。
踩坑 E:App 有人形、日志只有动检 → 乐橙 App 开人形侦测,或机型无AiHuman。
验收后 · 分流与留证
asyncfunctiondispatch(msg){if(msg.msgType==='human'){/* 高优先级:推 HA / 电话提醒 */}elseif(msg.msgType==='videoMotion'){/* 普通动检 */}}constdetail=awaitplatformCall('getAlarmMessageById',{token:awaitadminToken(),deviceId:msg.did,channelId:'0',alarmId:String(msg.id),msgType:msg.msgType,});告警缩略图 URL 约1 天有效,重要场景转存 OSS。
3 分钟 Checklist(可打印)
【0′】 open.imou.com 应用 + openapi.lechange.cn + 桥接 HTTPS 【1′】 listDeviceDetailsByPage ≥1 online,AlarmMD/AiHuman 对齐需求 【2′】 setMessageCallback(on) + getMessageCallback 读回一致 【3′】 实机触发 → videoMotion 或 human ≥1,200 < 500ms幂等与补洞
asyncfunctiononce(alarmId,fn){constok=awaitredis.set(`imou:alarm:${alarmId}`,'1',{NX:true,EX:86400});if(ok)awaitfn();}- 每小时
getAlarmMessage与本地 diff,补source: backfill。 - 轮询改回调后,我的资源 配额通常明显下降。
排错速查
| 现象 | 处理 |
|---|---|
| 3 分钟无 POST | callback on + HTTPS 可达 |
| 收几天就停 | 必须先 200 |
| 只有动检无人形 | 开人形;查 AiHuman |
| App 有、服务无 | 未 setMessageCallback |
与 Home Assistant
HA Core Imou 集成 约 2 分钟轮询,毫秒联动仍建议本回调 → MQTT → automation。见同系列 HA Core 接入文。
小结
乐橙动检/人形进自建服务,最短路径:
listDeviceDetailsByPage 验收 → setMessageCallback(alarm) → 桥接 200 → msgType 分流 → 3 分钟实机验收App 能弹「有人」,只说明检测正常;Telegram、HA、工单要响,必须让乐橙云知道你的 callbackUrl。
延伸阅读
- 事件消息推送
- 分页查询设备详情
- 自建全屋智能 · 列表与回调
- 需 MQTT 扇出到多下游时,在桥接层
publish即可(工单 / HA / 大屏各订 topic)
开始接入
在乐橙开放平台 open.imou.com注册并创建应用,领取免费设备接入与媒体带宽。平台以视频技术与安全为核心,提供 OpenAPI、OpenSDK 与告警 HTTP 推送,帮助开发者快速把乐橙 IPC 动检/人形事件接进自建自动化。
建议今天:setMessageCallback 配好 → 镜头前走一圈 → 日志里看到第一条human或videoMotion。比写 200 行轮询任务值。
你卡在回调 URL、200 响应还是只有动检没有人形?评论区说说。