智能家居控制方案详解:如何用AI远程控制米家灯

引言:智能家居控制的痛点

在智能家居时代,能够用语音或AI助手控制家里的设备已经成为基本需求。但作为一个技术人,你可能不只是想喊一声"小爱同学,开灯",而是希望能够:

  • 编程控制:通过代码实现自动化场景
  • 远程控制:不在家时也能操作设备
  • 自定义逻辑:实现厂商没提供的复杂联动
  • 数据隐私:减少对云端的依赖
  • 高可靠性:网络故障时也能本地控制

本文将深入分析三种主流的米家设备控制方案,帮助你选择最适合的技术路线。


方案一:Clawdbot节点控制

技术原理

Clawdbot是一个支持节点控制的AI助手系统,通过在家庭服务器上部署Node客户端,可以直接调用本地网络中的米家设备。

架构图:

云端AI服务 <---> Clawdbot Gateway <---> 家庭Node <---> 米家设备
                         |
                         v
                    你的手机/电脑

实现步骤

1. 准备家庭服务器

一台运行Linux的服务器或NAS(如群晖、威联通),或者一台一直开着的树莓派。

# 系统要求
# OS: Ubuntu 20.04+, Debian 11+, CentOS 8+, OpenWrt
# 内存: 最低512MB,推荐1GB+
# 网络: 与米家设备在同一局域网

2. 安装Node客户端

# 下载Clawdbot Node
wget https://github.com/clawdbot/node/releases/latest/download/clawdbot-node-linux-amd64

# 赋予执行权限
chmod +x clawdbot-node-linux-amd64

# 创建配置文件
cat > ~/.clawdbot-node.yaml << EOF
gateway: "wss://your-gateway-url"
token: "your-node-token"
name: "home-server"
EOF

# 启动服务
./clawdbot-node-linux-amd64 --daemon

3. 通过AI控制设备

Clawdbot支持通过自然语言或直接调用节点命令:

# 示例:通过Clawdbot Python SDK控制米家灯
import requests

node_id = "home-server"
device_ip = "192.168.1.100"  # 米家灯的IP地址
token = "your-device-token"  # 米家设备的token

# 调用节点执行米家控制命令
payload = {
    "action": "mijia_control",
    "device": "philips_light",
    "method": "set_power",
    "params": ["on"]
}

response = requests.post(
    f"https://api.clawdbot.com/nodes/{node_id}/exec",
    json=payload,
    headers={"Authorization": "Bearer YOUR_API_KEY"}
)

print(response.json())

优缺点分析

优点:

  • AI原生:直接与大模型集成,自然语言控制
  • 跨网络:无需内网穿透,随时远程控制
  • 易于部署:Node客户端一键安装
  • 多设备支持:除了米家,还支持Home Assistant、OpenHAB等

缺点:

  • 依赖Gateway:需要Gateway服务在线
  • 设备发现:需要手动配置设备IP和token
  • 延迟:多了一层中转,延迟略高(约200-500ms)

方案二:Home Assistant集成

技术原理

Home Assistant(HA)是开源智能家居平台,通过Miot Auto集成可以完美控制米家设备。

架构图:

Home Assistant <---> Miot Auto <---> 米家云API <---> 米家设备
                                                        |
                   或                                  直接连接
                   v
                python-miio <----------------------> 米家设备(局域网)

实现步骤

1. 安装Home Assistant

# 方法1:使用Docker(推荐)
docker run -d \
  --name homeassistant \
  --privileged \
  --restart=unless-stopped \
  -e TZ=Asia/Shanghai \
  -v /home/homeassistant:/config \
  --network=host \
  homeassistant/home-assistant:stable

# 方法2:使用Hass.io
# https://www.home-assistant.io/installation/

2. 安装Miot Auto集成

在HA界面中:

  1. 进入 HACS -> 商店
  2. 搜索 "Miot Auto"
  3. 点击安装
  4. 重启HA

配置 configuration.yaml:

# Miot Auto配置
miot:
  username: your_xiaomi_account@example.com
  password: your_password
  country: cn  # cn表示中国大陆

# 自动发现的米家设备
# HA会自动发现并添加所有米家设备

3. 创建自动化脚本

# 配置自动化场景
automation:
  - alias: "晚上回家自动开灯"
    trigger:
      - platform: state
        entity_id: person.your_name
        to: "home"
    condition:
      - condition: time
        after: "18:00:00"
        before: "23:00:00"
    action:
      - service: switch.turn_on
        entity_id: switch.living_room_light

  - alias: "睡前关闭所有灯"
    trigger:
      - platform: time
        at: "23:00:00"
    action:
      - service: switch.turn_off
        entity_id: group.all_lights

4. 通过API控制

import requests

HA_URL = "http://192.168.1.200:8123"
HA_TOKEN = "your_long_lived_access_token"

headers = {
    "Authorization": f"Bearer {HA_TOKEN}",
    "Content-Type": "application/json"
}

# 开灯
def turn_on_light(entity_id):
    url = f"{HA_URL}/api/services/switch/turn_on"
    data = {"entity_id": entity_id}
    response = requests.post(url, json=data, headers=headers)
    return response.json()

# 关灯
def turn_off_light(entity_id):
    url = f"{HA_URL}/api/services/switch/turn_off"
    data = {"entity_id": entity_id}
    response = requests.post(url, json=data, headers=headers)
    return response.json()

# 调用示例
turn_on_light("switch.bedroom_light")

优缺点分析

优点:

  • 生态丰富:支持2000+品牌的设备
  • 本地优先:大部分操作可在本地完成
  • 自动化强大:复杂场景、条件判断、脚本编排
  • 可视化界面:Lovelace UI非常友好
  • 社区活跃:插件和集成丰富

缺点:

  • 学习曲线:配置复杂,需要学习YAML语法
  • 资源占用:需要一定的系统资源(推荐2GB+内存)
  • 维护成本:需要定期更新和备份
  • 米家账户风险:使用官方API,账号有封禁风险

方案三:米家本地API(python-miio)

技术原理

米家设备大部分支持局域网控制,通过逆向工程开发的python-miio库可以直接与设备通信,无需经过云端。

架构图:

你的程序 <---> python-miio <---> 米家设备(局域网)
                         |
                         v
                    无需互联网

实现步骤

1. 获取设备Token

这是最关键的一步!

# 方法1:使用miio-tool(推荐)
pip install miiocli
miio discover

# 方法2:使用Android App
# 1. 安装"米家"旧版本(5.4.49或更早)
# 2. 使用adb备份:adb backup -noapk com.xiaomi.smarthome -f mi.ab
# 3. 提取token:python3 mi_backup_extractor.py mi.ab

# 方法3:抓包
# 使用Wireshark或Charles抓取米家App与设备的通信
# Token在设备握手阶段传输

2. 安装python-miio

pip install python-miio

3. Python控制脚本

#!/usr/bin/env python3
"""
米家设备本地控制脚本
支持:Yeelight灯泡、小米网关、智能插座等
"""

from miio import PhilipsBulb, Plug, AirConditioningCompanion
import sys

class MijiaController:
    def __init__(self, ip, token):
        self.ip = ip
        self.token = token
        self.device = None
    
    def connect_philips_bulb(self):
        """连接飞利浦智睿灯"""
        self.device = PhilipsBulb(ip=self.ip, token=self.token)
        return self.device
    
    def connect_plug(self):
        """连接智能插座"""
        self.device = Plug(ip=self.ip, token=self.token)
        return self.device
    
    def turn_on(self):
        """打开设备"""
        if self.device:
            return self.device.on()
    
    def turn_off(self):
        """关闭设备"""
        if self.device:
            return self.device.off()
    
    def set_brightness(self, level):
        """设置亮度(1-100)"""
        if isinstance(self.device, PhilipsBulb):
            return self.device.set_brightness(level)
    
    def set_color_temp(self, value):
        """设置色温(2700-6500K)"""
        if isinstance(self.device, PhilipsBulb):
            return self.device.set_color_temp(value)
    
    def get_status(self):
        """获取设备状态"""
        if self.device:
            return self.device.status()

# 示例使用
if __name__ == "__main__":
    # 配置设备信息
    DEVICE_IP = "192.168.1.100"
    DEVICE_TOKEN = "your_32_char_token_here"
    
    # 创建控制器
    controller = MijiaController(DEVICE_IP, DEVICE_TOKEN)
    
    # 连接设备(以飞利浦灯为例)
    controller.connect_philips_bulb()
    
    # 执行操作
    try:
        # 开灯
        print("打开灯光...")
        controller.turn_on()
        
        # 设置亮度为50%
        print("设置亮度为50%...")
        controller.set_brightness(50)
        
        # 设置色温为暖光(3000K)
        print("设置色温为3000K...")
        controller.set_color_temp(3000)
        
        # 获取状态
        status = controller.get_status()
        print(f"当前状态: {status}")
        
    except Exception as e:
        print(f"控制失败: {e}")
        sys.exit(1)

4. Shell脚本快速控制

#!/bin/bash
# mi-control.sh - 米家设备快速控制脚本

DEVICE_IP="192.168.1.100"
DEVICE_TOKEN="your_token_here"

# 开灯
function light_on() {
    miiocli philipslight --ip $DEVICE_IP --token $DEVICE_TOKEN on
}

# 关灯
function light_off() {
    miiocli philipslight --ip $DEVICE_IP --token $DEVICE_TOKEN off
}

# 设置亮度
function set_brightness() {
    miiocli philipslight --ip $DEVICE_IP --token $DEVICE_TOKEN set_brightness $1
}

# 获取状态
function get_status() {
    miiocli philipslight --ip $DEVICE_IP --token $DEVICE_TOKEN status
}

# 根据参数执行操作
case "$1" in
    on)
        light_on
        ;;
    off)
        light_off
        ;;
    brightness)
        set_brightness $2
        ;;
    status)
        get_status
        ;;
    *)
        echo "用法: $0 {on|off|brightness <1-100>|status}"
        exit 1
esac

使用示例:

chmod +x mi-control.sh

# 开灯
./mi-control.sh on

# 关灯
./mi-control.sh off

# 设置亮度为70%
./mi-control.sh brightness 70

# 查看状态
./mi-control.sh status

优缺点分析

优点:

  • 完全本地:无需互联网,断网也能控制
  • 响应最快:局域网直连,延迟<50ms
  • 轻量级:只需Python环境,无额外依赖
  • 灵活编程:完全可控的代码逻辑
  • 数据隐私:所有数据都在本地

缺点:

  • Token获取难:需要一定的技术水平
  • 设备限制:不是所有设备都支持局域网控制
  • 无云端同步:无法使用米家App的远程功能
  • 维护成本:固件升级可能导致Token失效

三种方案全面对比

维度Clawdbot节点控制Home Assistant米家本地API
实现难度⭐⭐ 简单⭐⭐⭐⭐ 复杂⭐⭐⭐ 中等
配置复杂度低(一键安装)高(YAML配置)中(需获取Token)
响应速度200-500ms50-200ms<50ms
网络依赖需要互联网本地优先完全本地
可靠性中(依赖Gateway)高(本地为主)最高(纯本地)
数据隐私中(数据经Gateway)高(大部分本地)最高(完全本地)
扩展性优秀(支持多平台)优秀(2000+设备)一般(仅米家)
AI集成原生支持需配置需自己开发
学习成本
适用场景远程AI控制全屋智能系统单设备自动化

推荐方案与选择建议

场景1:AI远程控制

推荐:Clawdbot节点控制

如果你想要:

  • 随时随地通过AI控制设备
  • 简单部署,不想折腾配置
  • 享受智能对话的便利

场景2:全屋智能家居

推荐:Home Assistant

如果你想要:

  • 整合多品牌设备
  • 复杂的自动化场景
  • 可视化控制面板
  • 长期投入智能家居

场景3:单设备快速控制

推荐:米家本地API

如果你想要:

  • 最快的响应速度
  • 完全本地化,保护隐私
  • 精简的控制逻辑
  • 学习智能家居技术

组合方案(最佳实践)

我的推荐配置:

核心:Home Assistant(本地中枢)
    ↓
集成:Miot Auto(米家设备)
    ↓
增强:Clawdbot节点(AI远程控制)
    ↓
备用:python-miio(本地应急控制)

实现逻辑:

  1. 日常使用Home Assistant自动化
  2. 通过Clawdbot实现远程AI控制
  3. 网络故障时切换到python-miio本地控制

常见问题与避坑指南

Q1: 米家设备Token怎么获取最简单?

A: 使用Android版米家5.4.49及以下版本,通过adb备份提取:

# 安装miio-token-extractor
pip install miio-token-extractor

# 提取token
miio-token-extractor backup.ab

Q2: 设备IP变了怎么办?

A: 在路由器设置DHCP保留,固定设备IP:

# OpenWrt示例
uci set network.lan.dhcp_option='6,192.168.1.1'
uci set dhcp.lan.leasetime='12h'
uci commit dhcp
/etc/init.d/dnsmasq restart

Q3: python-miio控制失败?

A: 常见原因:

  • Token错误(重新获取)
  • 设备固件升级(降级或重新抓包)
  • 网络隔离(确保在同一VLAN)
  • 防火墙阻止(开放端口54321)

Q4: Home Assistant占用资源太多?

A: 优化方案:

# configuration.yaml
# 禁用不必要的组件
default_config:

logger:
  default: warning
  logs:
    homeassistant.components.mqtt: debug

使用Docker限制资源:

docker run -d \
  --memory="1g" \
  --cpus="1.0" \
  --name homeassistant \
  homeassistant/home-assistant:stable

展望:智能家居控制的未来

随着Matter协议的普及,未来智能家居将更加开放和统一。但目前,我们仍然需要:

  1. 本地优先:减少对云端的依赖
  2. 隐私保护:数据留在本地
  3. AI增强:更智能的自动化场景
  4. 跨平台整合:打破品牌壁垒

希望本文能帮助你选择合适的米家控制方案,享受智能家居带来的便利!


参考资源


作者按: 本文基于实际项目经验总结,如有技术问题欢迎讨论。技术栈在不断演进,建议关注官方文档获取最新信息。

标签: 智能家居, 米家, Home Assistant, Python

添加新评论