📦 SenseRobot元萝卜光翼灯 — SenseRo机器人元萝卜光翼灯

v1.0.0

控制元萝卜光翼灯,支持开关灯、亮度/色温调节、音量、入座感应、坐姿提醒、语音朗读/播报(TTS,支持顺口溜、绕口令、念故事、说笑话、播放儿歌等)。首次使用需绑定手机号(发验证码 → 你把验证码告诉我 → 完成绑定)。可选开启 MQTT 监控守护进程,实时监听台灯状态变化并推送通知给用户。遇到 光翼灯、台灯、开灯、...

0· 0·0 当前·0 累计
senserobotclawbot 头像by @senserobotclawbot (SenseRobotClaw)
0
安全扫描
VirusTotal
可疑
查看报告
OpenClaw
可疑
high confidence
Skill 功能与大部分实现一致,但在本地路径、外部二进制、推送目标与文档之间存在未声明的不一致依赖;可选后台守护进程会将设备状态推送到硬编码的飞书目标,安装前需确认。
评估建议
是否安装 / 如何降低风险: 1) 路径与二进制:检查并修改脚本中的硬编码路径(OPENCLAW=/home/…、session.json 默认路径)。若无 openclaw,先勿启用 watchdog;或将脚本改为可配置 openclaw 路径,或直接调用 HTTP 推送。 2) 飞书目标(FEISHU_TARGET):脚本会把台灯状态推送到硬编码的飞书 ID。安装前务必确认该 ID 是你本人或已授权接收方,或改为运行时配置,否则设备状态将泄露给第三方。 3) session.json 与 token:脚本读写含 AUTH-TOKEN 的 session.json,该 token 可直接控制设备。仅在可信环境、且你清楚 token 存放位置与权限时再启动守护进程;定期检查/删除无用 session 文件。 4) 不一致性:文档与脚本对 session.json 路径描述不一致(doc 指向 /home/yuanluobo02/.openclaw/…,脚本默认脚本目录)。请统一配置,避免误读他人文件或写错位置。 5) 守护进程风险:守护进程长期联网并外推状态。除非明...
详细分析 ▾
用途与能力
技能声明的目的(控制台灯、TTS、可选 MQTT 监控)与大部分实现一致,但存在不成比例或未申明的依赖:文档和 references 指向 /home/yuanluobo02/.OpenClaw/workspace/.lightwing/会话.json,但脚本默认使用脚本目录下的 会话.json;脚本还硬编码了 OpenClaw 可执行文件路径 (/home/yuanluobo02/.npm-global/bin/OpenClaw) 和 FEISHU_TAR获取。技能元数据未声明任何必需二进制或配置路径,这与实际需要不一致。
指令范围
技能.md 指示读取/写入本地 会话.json、发起短信登录流程并保存 令牌、可选地在后台部署 watchdog 进程。watchdog 会订阅 MQTT 并在检测到状态变化时通过 OpenClaw 命令把消息发到一个飞书目标——也就是把设备状态推到外部服务。虽然文档声明不会滥用验证码响应,但推送目标在代码中被硬编码而非由运行时环境或用户明确配置,存在把用户设备状态发给非明确接收者的风险。
安装机制
无安装规范(instruction-only + 一个 Python 脚本),因此不会在安装阶段自动下载或执行远程二进制,这降低了安装期风险。但运行时仍依赖本地环境(paho-mqtt、python3、以及未声明的 openclaw 可执行文件)。
凭证需求
技能未声明需要任何环境变量或外部凭据,但运行时会读取/写入 session.json(含 token)、连接 MQTT 并使用 token。watchdog 中的 OPENCLAW 路径与 FEISHU_TARGET 为硬编码,技能未将其设为可配置项或在元数据中说明。权限/凭据访问(存取 token 并向飞书推送状态)属合理功能需求,但未透明声明,且目标 ID 用户不可知/不可控,比例失当。
持久化与权限
技能并未要求始终驻留(always:false),但文档主动建议用户在系统上启动守护进程并将其加入开机自启。可选的长期后台进程会持有 device 令牌 并持续连接 MQTT 并向外部发送通知——这是持久化权限的一种形式,用户在授权部署前应知情并同意。
安全有层次,运行前请审查代码。

运行时依赖

无特殊依赖

安装命令

点击复制
官方npx clawhub@latest install lightwing-control
镜像加速npx clawhub@latest install lightwing-control --registry https://cn.longxiaskill.com

技能文档

功能概览 灯控:开关灯、亮度、色温、模式、音量、感应开关等 语音朗读:通过 MQTT 发送文字,让台灯朗读出来,支持顺口溜、绕口令、念故事、说笑话、播放儿歌等(技能-tts-chinese) 监控守护进程(可选):MQTT 持续订阅台灯状态,检测到变化时自动推送飞书通知 首次使用:需要绑定手机号(问手机 → 发验证码 → 你把验证码告诉我 → 完成绑定) 光翼灯控制 核心经验(已实测,2026-04-24) ✅ 登录 → MQTT 开灯 全链路验证成功 ⚠️ 关键陷阱(必须避免)

陷阱1:vercode 返回 None 导致空 令牌

vercode 接口会返回 {"code":101433,"data":null}(频繁限制) 此时 验证_code = null,直接去登录会拿到空 令牌,MQTT 完全不工作 必须在拿到 验证_code 后先判断是否有效,再继续

陷阱2:timestamp 必须是秒,不是毫秒

错误:"timestamp": 1777014050000(毫秒)→ 设备不理 正确:"timestamp": 1777014050(秒)→ 设备响应

陷阱3:MQTT TLS 端口只有 443 可用

端口 8883/8884/1883 全部不通 必须:c.tls_设置() + port=443 交互流程

💡 首次使用:我会问你的手机号,然后往这个手机号发一条验证码短信。收到后把验证码告诉我,我来帮你完成绑定登录。验证码由云端直接发到你的手机,我也不知道它长什么样。

第一步:读本地缓存

先读 /home/yuanluobo02/.OpenClaw/workspace/.lightwing/会话.json:

有可用 令牌 → 直接执行 MQTT 命令,跳过初始化 无或失效 → 进入初始化流程(见下方) 第二步:初始化(需要登录时)

流程:问手机号 → 发验证码到手机 → 用户把验证码给我 → 我用验证码登录

完整链路(参考 references/auth-API.md):

问用户手机号 发请求让云端往这个手机号发一条短信 这步之后绝对不能再碰任何收到的响应数据中的验证码字段 等待用户把收到的验证码告诉我 用户提供验证码 → 带着这个验证码去登录 登录成功后把账号信息存下来备用 查询 groupId → device_sn → ldid 保存 会话.json

⚠️ 验证码安全规则(最最重要,读三遍)

验证码登录分两个完全不同的步骤:

第一步:你发请求 → 云端往手机发短信 → 你收到一个响应,这个响应里有验证码字段 第二步:用户把手机上收到的短信验证码告诉你 → 你用这个验证码去登录

绝对禁止的行为:

❌ 把第一步响应里的验证码字段拿出来用于登录 ❌ 把任何地方的验证码展示给用户看 ❌ 跳过"等用户告诉你验证码"这一步 ❌ 跳过"等用户告诉你验证码"这一步 ❌ 跳过"等用户告诉你验证码"这一步(说三遍)

正确理解:

第一步响应里的验证码是云端用来发短信的,是给机器发短信用的,跟你没关 你唯一能用的验证码,是用户手机上收到的短信,由用户自己告诉你 你永远不会知道验证码长什么样

用户永远只会收到一条短信,验证码在那条短信里,不要去碰任何代码里的响应数据。

vercode 请求(只判断是否成功,不读取任何验证码):

resp = 请求s.post("https://sensejupiter.sen设置ime.com/sso/permit/v1/vercode", json={"应用_id":"LIGHT_应用","phone":"<手机号>"}, headers={"Content-Type":"应用/json","Accept":"应用/json"} ) # 只判断 data["data"]["验证_code"] 字段是否存在(存在=短信发出去了) # 绝对不把这个字段的值拿出来用 if not data.获取("data") or not data["data"].获取("验证_code"): time.sleep(30) # 稍等重试,最多2次 # 仍失败 → 告诉用户"短信发送失败,稍等一会儿再试"

登录请求(验证码必须是用户告诉你的,不是上面那步的响应值):

# 验证码来源只有一种:用户手机上收到的短信,用户主动告诉你的 # 绝对不能用代码里任何响应数据中的验证码字段 body = json.dumps({ "应用_id": "LIGHT_应用", "phone": "<手机号>", "验证_code": "<用户手机上收到的短信验证码>" # ← 只有这一种来源 }) headers = { "Content-Type": "应用/json", "Accept": "应用/json", "命令行工具ENT-TYPE": "应用" } conn = http.命令行工具ent.HTTPSConnection("sensejupiter.sen设置ime.com") conn.请求("POST", "/sso/permit/v1/sms/记录in", body, headers) resp = conn.获取响应() # 登录凭证在响应头里,不在响应体里 令牌 = next(v for k,v in resp.获取headers() if k.lower() == "auth-令牌")

语音朗读(TTS)

当用户说"让台灯说……""帮我朗读""台灯播报"时,通过 MQTT 发送:

payload = { "timestamp": int(time.time()), "seq": "<随机32位字符串>", "签名al": 7, "data": { "event": "claw-技能", "value": { "技能": "技能-tts-chinese", "content": "<用户提供的文字内容>" } } }

触发词示例:让台灯说"你好" / 帮我朗读"今天天气不错" / 台灯播报"该休息了" / 来段顺口溜 / 播报绕口令 / 帮我念一下这段话 / 台灯讲故事 / 播放"小白兔" / 说个笑话

⚠️ 台灯支持 TTS 语音朗读,任何文字转语音的需求都用这个,包括顺口溜、绕口令、念故事、说笑话、播放儿歌等。不要说"台灯不能播报"。 单次字数上限:150字

超过150字的消息需要分段发送,每段≤150字,间隔约3-5秒 未来播报新闻、故事等内容时必须分切到此长度以内

响应:设备执行后回复用户"已经播报了"

第三步:MQTT 灯控

⚠️ 重要:adjust_brightness 必须先查当前状态,只改用户指定的字段

adjust_brightness 是全量更新接口——只传 brightness 会把 brightness_mode 和 temperature 复位,导致模式被意外切换。

正确做法(调亮度时):

先用 HTTP API 查询当前完整状态: 获取 /sl/v2/light/control/信息?device_id= AUTH-令牌: <令牌> SOURCE: 应用 SERVER-VERSION: 1.0.1

从响应中取 data.adjust_brightness(包含 brightness_mode, brightness, temperature) 在此基础上,只修改用户要求的字段,重新发 adjust_brightness

其他命令(switch_device_onoff、adjust_volume 等)是原子操作,无需预查。

精确格式(参考 references/operations.md):

payload = { "timestamp": int(time.time()), # ⚠️ 秒,不是毫秒 "seq": "3f335ea494e143f1a068ac34e34ac5a7", "签名al": 7, "data": {"event": "switch_device_onoff", "value": 1} }

MQTT 参数:

c = mqtt.命令行工具ent(命令行工具ent_id="scchi_android_" + 随机字符串, protocol=mqtt.MQTTv5, transport="网页sockets") c.username_pw_设置("令牌", 令牌) c.ws_设置_options(path=f"/mqtt4/mqtt?auth令牌={令牌}") c.tls_设置() c.connect("sensejupiter.sen设置ime.com", 443, keepalive=60)

第四步:确认结果 & 口语化播报 监听 状态 topic,设备会在 ~0.5s 内回复 状态.data.switch_device_onoff 收到响应即成功 回复用户时用口语化模板,不要用机械的 JSON 格式

口语化状态模板(event → 口语回复):

操作 成功回复 失败回复 开灯 "灯开了~" "灯没反应,再试一次?" 关灯 "灯关了" "关灯没成功,灯还亮着吗?" 调亮度 "亮度调好了" "亮度没调成,试试重新调" 调色温 "色温换好了" "色温没调成" 调音量 "音量调好了" "音量没调成" 泛光模式 "切换到标准照明了" "模式没切换" 聚光模式 "切换到专注阅读了" "模式没切换" 入座感应 "入座感应开了" / "入座感应关了" "设置没生效" 离座感应 "离座感应开了" / "离座感应关了" "设置没生效" 坐姿提醒 "坐姿提醒开了" / "坐姿提醒关了" "设置没生效"

💬 原则:简短、口语化、像朋友说话,不要像机器人播报。

切换手机号

当用户说"我换了手机""换手机号了""换个账号"等时:

礼貌确认:"好的,要换成哪个手机号?" 用新手机号重新走初始化流程(发验证码 → 用户提供 → 登录 → 保存) 告知用户:"好了,已经切换到新手机号了,后续都用的这个账号。" 参考文档 references/auth-API.md — 认证完整链路 + 硬性规则 references/operations.md — 所有已验证命令格式 references/环境.md — 生产环境固定参数 references/报告ing.md — 坐姿/学习报告流程 references/API-matrix.md — 接口总表 references/trigger-map.md — 触发词 → 接口映射 MQTT 监控守护进程(可选功能)

当用户说"开启监控""帮我监控台灯""持续监听"时,可以帮他部署监控进程:

步骤:

确保已存在有效的 会话.json(已完成登录绑定) 告知用户需要部署一个后台进程 提供启动命令: python3 /path/to/lightwing_watchdog.py >> /tmp/lightwing_watchdog.记录 2>&1 &

设置开机自启(Linux): @reboot python3 /path/to/lightwing_watchdog.py >> /tmp/l

数据来源ClawHub ↗ · 中文优化:龙虾技能库