JMGO-MQTT-Remote
更新于 2026-11-03 15:22:37
这是什么
JMGO-MQTT-Remote 是一套跑在 ESP32 上的固件,把 JMGO 投影仪接入 MQTT 与 Home Assistant。它并不是简单地发红外或模拟遥控器,而是复刻了手机 App 与投影仪之间的两条真实通路:
- BLE 广播唤醒:发送蓝牙广播包把待机中的投影仪唤醒;
- 局域网 TCP 控制:连接投影仪的 LAN 控制端口
9005,发送导航与电源菜单指令; - MQTT 桥接:订阅命令主题、发布状态主题,方便自动化编排。
为什么值得关注
投影仪这类设备的官方 App 通常只支持手机、且难以接入自动化。这个项目把「开机 → 切 HDMI1 → 关机」这类日常动作固化成了 MQTT 命令,接上 Home Assistant 后可以和灯光、幕布、音响做场景联动,比如「观影模式」一键完成降幕布、开投影、切 HDMI、调暗灯光。
硬件与依赖
- 开发板:ESP32 Dev Module / DevKit、ESP32-WROOM-32、ESP32-WROVER 系列均可
- 框架:PlatformIO + Arduino
- 关键库:
h2zero/NimBLE-Arduino(BLE 广播唤醒)knolleary/PubSubClient(MQTT 客户端)
- 环境要求:JMGO 投影仪与 ESP32 在同一局域网,另需一个 MQTT Broker(Mosquitto 或 Home Assistant 内置 MQTT)
已测试机型
- JMGO N1
- JMGO N1S
- JMGO N1 Ultra
同系列机型大概率可用,但 LAN 指令序列和端口是否一致需要自行验证。
MQTT 用法
默认主题:
jmgo/remote/cmd
jmgo/remote/state
支持的命令:
| 命令 | 动作 |
|---|---|
wake |
仅发送 BLE 唤醒广播 |
on / wake_hdmi1 / power_on |
唤醒投影仪,等待启动后切到 HDMI1 |
hdmi1 |
执行切 HDMI1 的 LAN 导航宏 |
power_menu |
打开电源菜单 |
power_off / off |
打开电源菜单、下移、确认关机 |
up / down / right / ok / enter |
发送单个 LAN 遥控按键 |
示例:
mosquitto_pub -h <mqtt-host> -p 1883 -u <user> -P '<password>' \
-t jmgo/remote/cmd -m hdmi1
状态主题使用 retained 消息,重启后的订阅者也能立刻拿到当前状态。
配置与烧录
项目不把密钥写进仓库,需要在 PlatformIO 的 include 路径下自建 secrets.h,填写 Wi-Fi、MQTT、OTA、投影仪 IP 等参数;.env.example 只是同名变量的说明。
pio run -e esp32dev # 编译
pio run -e esp32dev -t upload # USB 烧录
pio run -e esp32ota -t upload # OTA 烧录
pio device monitor -b 115200 # 串口日志
使用建议
- 先在串口把投影仪 IP 固定下来(路由器里做 DHCP 静态绑定),避免 IP 变化导致控制失效。
- 唤醒后需要留出启动时间再切 HDMI,固件里已有等待逻辑,但不同机型启动速度不同,可以按需调整。
- 关机是「菜单 + 下移 + 确认」的按键宏,如果投影仪菜单布局变化,需要同步修改按键序列。
- 建议在 Home Assistant 里封装成
button/switch模板实体,配合「观影模式」脚本使用。
适用场景
想把投影仪纳入全屋自动化、又不想依赖厂商云服务的用户;手上有闲置 ESP32、且投影仪就在同一网段的情况最合适。