V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
19888888888x
V2EX  ›  iOS

iOS 上的米家自动化替代方案:用快捷指令 + 中转服务实现设备控制

  •  
  •   19888888888x · 25 天前 · 1553 次点击

    背景与痛点

    • 米家自动化 在 iOS 上想完全后台运行,常要求 App 获得「始终定位」权限,比如连接 WiFi 自动执行操作,并且长期后台定位让我有点莫名不爽。
    • 快捷指令自动化 能在锁屏时触发,快捷指令的自动化无法调用第三方软件的功能,无法在后台执行在米家直接添加到快捷指令的场景

    为此,我上班摸鱼写了一个 加密中转服务( Go 自托管 / Cloudflare Worker 两种版本)来代替米家 App 完成签名、Cookie 注入。快捷指令只需向中转服务发送一段 JSON ,就能在后台控制米家,包括设备控制和场景触发。


    整体方案

    1. 扫码登录
      访问 /login/qrcode,用米家 App 扫码,获得
      userId / ssecurity (securityToken) / deviceId / serviceToken 四个关键参数。
    2. 快捷指令 POST
      向中转服务 POST 一段 JSON ,由服务器补齐签名后转发至 https://api.io.mi.com
    3. iOS 自动化触发
      无需米家常驻后台,快捷指令在「到达某地点 / 连接某 Wi-Fi 」等场景触发后即刻发请求。

    示例请求体:

    {
      "userId": "123456789",
      "serviceToken": "xxx",
      "deviceId": "abc123",
      "securityToken": "Q0eQ7tKq...", // 即 ssecurity
      "data": {
        "did": "xxx",
        "method": "set_props",
        "params": [ ["power", 1] ]
      }
    }
    

    iOS 定位坐标系坑

    • 「快捷指令 ➜ 获取当前位置」返回的是 GCJ-02(与高德一致);
    • 「快捷指令自动化 ➜ 到达某位置」触发条件却使用 WGS-84

    因此直接填写 GCJ-02 坐标会出现数百米偏差,导致自动化难以触发。
    解决办法:先用快捷指令读取 GCJ-02 → 在线或本地转换为 WGS-84 ,再把转换后的坐标写到自动化里。
    我做了一个快捷指令转换示例:https://www.icloud.com/shortcuts/5161a59573f248399e58a8584eb93468


    代码与部署

    https://gist.github.com/Zayrick/62701850c833c4051356268fa9afc3ff 其中包含一个 sever.go ( Go 版本)和 worker.js ( Cloudflare Worker 版本)

    • Go 版本(自托管 / 内网优先)
    • Cloudflare Worker 版本(无服务器快速部署)

    部署详情参照 gist 中的 README.md


    风险警告 ⚠️

    风险 说明
    账号安全 扫码登录使用真实米家账号,存在被封或 Cookie 泄露风险
    网络安全 中转服务需走 HTTPS ,防止中间人窃听;同时禁止公网暴露调试接口
    设备权限 serviceToken/ssecurity 拥有完整设备控制权限,请加密存储
    隐私泄露 服务器可访问全部家庭与设备信息,建议专号 + 内网部署

    参考资料

    📚 常用米家 API

    操作 请求方式
    读取设备属性 POST https://api.io.mi.com/app/miotspec/prop/get
    设置设备属性 POST https://api.io.mi.com/app/miotspec/prop/set
    执行动作 POST https://api.io.mi.com/app/miotspec/action
    获取设备列表 POST https://api.io.mi.com/app/home/home_device_list
    获取家庭列表 POST https://api.io.mi.com/app/v2/homeroom/gethome_merged
    获取场景列表 POST https://api.io.mi.com/app/appgateway/miot/appsceneservice/AppSceneService/GetSceneList

    💡 设备控制 API 查这里:https://home.miot-spec.com

    免责声明:自己玩可以,别滥用,风险自负 🫡

    14 条回复    2025-08-09 01:44:03 +08:00
    Lentin
        1
    Lentin  
       25 天前
    大部分操作都可以加到 siri 里面再搭配捷径使用的吧……用得到这么折腾吗
    19888888888x
        2
    19888888888x  
    OP
       25 天前 via iPhone
    @Lentin 但是没办法做到后台,比如说锁屏情况下的自动运行🫠而且米家那个快捷指令还会有个弹窗很烦
    georgex
        3
    georgex  
       25 天前
    ha 实现不了吗
    19888888888x
        4
    19888888888x  
    OP
       25 天前
    @georgex 应该也可以,没深入用过🤔
    wyd011011daniel
        5
    wyd011011daniel  
       25 天前
    感觉可以作为给米家用户轻量化替代,也可以接入其他设备来远程控制。

    不过如果有 appletv 或者 homepod 的话我更倾向于 HA 接入苹果家庭。

    再者 HA 部署之后内网穿透也一下也能类似效果。
    MacsedProtoss
        6
    MacsedProtoss  
       24 天前 via iPhone
    你是否在找:home assistant
    这才是正确的打开方式
    Kaiyuan
        7
    Kaiyuan  
       24 天前
    本地网关有类似的操作吗?
    Lin0000
        8
    Lin0000  
       24 天前
    我直接就是 home assistant 里面用 xiaomi home (小米官方开源插件),再接个 home bridge ,直连家庭
    icestraw
        9
    icestraw  
       24 天前
    太麻烦了,还搞这些。你只需要笔记本连公网,然后随便写个 API ,用 TTS 说出指令,然后电脑旁边放一个小爱同学就可以了,用不着注入啥的,而且批量执行啥的都能搞定。
    CivAx
        10
    CivAx  
       24 天前
    干得不错,但大家都在用 HA
    19888888888x
        11
    19888888888x  
    OP
       24 天前
    我注意到大家都在提 HomeAssistant ,我之所以没用这个因为这个需要一台内网服务器/软路由还要配合一个 homekit 音响,娃刚从学校出来实习实在没啥钱盘这些东西,只能出一个简化版本的方案
    internelp
        12
    internelp  
       24 天前
    @19888888888x 玩客云 30 元包邮,podman 启动一个 hass 即可,待机 5W 内。比你用自动化方便多了。
    zhaidoudou123
        13
    zhaidoudou123  
       24 天前
    几十块买个 n1 ,跑 ha 吧,一劳永逸
    gigishy
        14
    gigishy  
       23 天前 via iPhone
    我也觉奇怪,用 ha 不好吗?
    另,那个坐标转换快捷指令,满网都是一模一样的,是你的原创?
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:04 · PVG 22:04 · LAX 07:04 · JFK 10:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.