3步用Python控制智能家居:零基础也能搞定灯光空调自动化,保姆级教程

3步用Python控制智能家居:零基础也能搞定灯光空调自动化,保姆级教程 一

文章目录CloseOpen

第一步:环境搭建与工具准备

别一听到“环境搭建”就头大,这一步其实就像“给手机装App”一样简单,我会把每一步的操作都写清楚,你跟着复制粘贴就行。

首先得在电脑上装Python,这是整个控制逻辑的“大脑”。推荐你直接装Python 3.9或以上版本(我之前用3.7时,有些智能家居库不兼容,后来换成3.9就顺利多了,省得踩坑)。访问Python官网,根据你的系统(Windows/Mac)选对应的安装包,安装时记得勾选“Add Python to PATH”(把Python添加到系统路径),这样后面在命令行里就能直接调用Python了。

装好Python后,需要安装几个“工具包”(就像给手机装微信、支付宝这些实用App),这些工具包能帮我们连接设备、发送控制指令。打开电脑的命令行(Windows按Win+R输入cmd,Mac打开终端),复制粘贴下面这几行命令,按回车执行就行:

pip install paho-mqtt # 处理设备通信的“对讲机”

pip install requests # 给设备发送控制指令的“快递员”

pip install pycryptodome # 给指令加密的“安全锁”(部分品牌设备需要)

pip install python-dotenv # 管理设备密钥的“小本本”(避免代码里直接写密码)

安装过程中如果出现“timeout”(超时),可以试试加个国内镜像源,比如pip install paho-mqtt -i https://pypi.tuna.tsinghua.edu.cn/simple,速度会快很多。

接下来需要选个“记事本”来写代码,推荐用VS Code(官网下载),免费又好用,装完后在扩展里搜“Python”,装个Python插件,写代码时会有语法提示,新手不容易出错。

最后一步是获取设备的“控制权限”。智能设备就像带密码的门,你得拿到“钥匙”(API密钥、设备ID)才能控制它。不同品牌的设备获取方式略有不同,我整理了常见品牌的操作步骤,你照着做就行:

品牌 获取API密钥步骤 设备ID查看位置 是否需要加密
小米 登录小米开放平台,创建“智能家居应用” 米家App → 设备详情 → 设备信息 是(需AppSecret)
华为 华为开发者联盟注册,开通“智能家居服务” 华为智能家居App → 设备 → 右上角设置 否(OAuth2.0授权)
天猫精灵 阿里IoT平台创建项目,获取AccessKey 天猫精灵App → 设备 → 设备设置 是(需签名验证)

比如小米设备,你在米家App里找到设备详情,记下“设备ID”(通常是一串数字),再去小米开放平台创建应用,拿到“AppID”和“AppSecret”(就像设备的“用户名”和“密码”),把这些信息存到一个叫.env的文件里(用VS Code新建文件,文件名.env),格式如下:

MI_APP_ID=你的AppID

MI_APP_SECRET=你的AppSecret

MI_DEVICE_ID=你的设备ID

这样后面写代码时,直接调用这些变量就行,不用把密钥写在代码里,更安全(之前帮朋友做的时候,他一开始把密钥直接写在代码里,结果代码传到GitHub上,设备差点被人远程控制,吓出一身冷汗)。

第二步:设备连接与协议解析

设备和权限准备好了,现在要让Python和设备“说上话”。你可以把这一步理解为“教Python学设备的方言”——不同品牌的设备用不同的“语言”(协议)通信,我们得搞清楚它们怎么“聊天”,才能让Python给设备下命令。

最常见的“聊天语言”有两种:MQTT和HTTP。简单说,MQTT就像“对讲机”,设备和Python一直保持连接,一方说话另一方马上能听到(适合实时控制,比如灯光开关);HTTP就像“发短信”,Python给设备发一条指令,设备执行后回复一条消息(适合单次控制,比如查询空调当前温度)。大部分智能设备会支持其中一种或两种,你可以在设备的开发者文档里查到(比如小米的多模网关用MQTT,华为的空调用HTTP)。

我以小米智能灯(MQTT协议)为例,教你怎么让Python和设备“打招呼”。首先需要连接到设备所在的“聊天频道”(MQTT主题),每个设备都有自己的专属频道,比如小米灯的主题通常是miio/{设备ID}/props(设备状态上报)和miio/{设备ID}/command(控制指令下发)。用paho-mqtt库连接的代码大概长这样(我加了详细注释,你照着改设备ID和密钥就行):

import paho.mqtt.client as mqtt

from dotenv import load_dotenv

import os

从.env文件里读取设备信息

load_dotenv()

device_id = os.getenv("MI_DEVICE_ID")

app_secret = os.getenv("MI_APP_SECRET")

连接MQTT服务器(小米的MQTT服务器地址和端口可以在开发者文档查到)

client = mqtt.Client(client_id="python_smart_home")

client.username_pw_set(username=device_id, password=app_secret) # 用设备ID和密钥登录

client.connect("mqtt.mi.com", port=1883, keepalive=60) # 连接服务器

连接成功后,订阅设备状态频道(监听设备当前状态,比如灯是否亮着)

def on_connect(client, userdata, flags, rc):

print("设备连接成功!")

client.subscribe(f"miio/{device_id}/props") # 订阅状态频道

收到设备消息时的处理(比如灯的亮度变化)

def on_message(client, userdata, msg):

print(f"设备状态:{msg.payload.decode()}") # 打印设备发来的消息

client.on_connect = on_connect

client.on_message = on_message

client.loop_start() # 开始监听消息

运行这段代码,如果控制台显示“设备连接成功!”,说明Python已经和灯“搭上话”了。这时候你用米家App控制灯开关,控制台会打印出设备状态(比如{"power":"on","brightness":100},表示灯亮着,亮度100%),是不是很神奇?

如果你的设备用HTTP协议(比如华为空调),连接方式更简单,直接用requests库发“短信”就行。比如查询空调温度的代码:

import requests

from dotenv import load_dotenv

import os

load_dotenv()

huawei_token = os.getenv("HUAWEI_TOKEN") # 华为设备的授权令牌(从开发者平台获取)

device_id = os.getenv("HUAWEI_DEVICE_ID")

发送查询温度的HTTP请求

url = f"https://iot-api.cloud.huawei.com/v1/devices/{device_id}/properties"

headers = {"Authorization": f"Bearer {huawei_token}"}

response = requests.get(url, headers=headers)

temperature = response.json()["properties"][0]["value"] # 提取温度值

print(f"当前空调温度:{temperature}℃")

连接过程中如果遇到“连接失败”,先检查这几点:设备和电脑连同一个WiFi(别用手机热点,可能有防火墙)、密钥是否填对(特别是AppSecret,区分大小写)、MQTT端口是否被路由器屏蔽(部分路由器会拦截1883端口,在路由器设置里开放就行)。我之前帮网友调试时,他就是因为路由器开了“IoT设备隔离”,导致Python连不上设备,关了这个功能就好了。

如果你想同时控制多个品牌的设备,可以用“协议转换”的思路——比如用Python作为“翻译官”,接收小米灯的MQTT消息,转换成华为空调能懂的HTTP指令,这样不同品牌的设备就能“协同工作”了。这也是智能家居自动化的核心:让设备之间能“互相说话”。

第三步:自动化脚本编写与场景实现

现在Python能和设备“聊天”了,接下来要让它们“懂事”——根据你的生活习惯自动执行操作。这一步就像“教设备做填空题”:当满足某个条件时(比如“晚上7点”“门窗打开”“温度高于30℃”),设备执行某个动作(比如“开灯”“开空调”“关窗帘”)。我会带你实现3个最实用的场景,你可以照葫芦画瓢扩展更多功能。

场景一:定时开关灯(固定时间自动执行)

每天早上7点开灯、晚上10点关灯,不用再手动操作。实现这个功能需要用到“定时任务”工具,推荐用APScheduler(安装命令pip install apscheduler),它能像闹钟一样,到点就执行代码。下面是完整的定时开灯脚本(以小米灯为例):

from apscheduler.schedulers.blocking import BlockingScheduler

import paho.mqtt.client as mqtt

from dotenv import load_dotenv

import os

load_dotenv()

初始化MQTT连接(和第二步的连接代码类似)

client = mqtt.Client()

client.username_pw_set(os.getenv("MI_DEVICE_ID"), os.getenv("MI_APP_SECRET"))

client.connect("mqtt.mi.com", 1883)

定义“开灯”函数

def turn_on_light():

command = '{"id":1,"method":"set_power","params":["on"]}' # 灯的开关指令(从设备文档查)

client.publish(f"miio/{os.getenv('MI_DEVICE_ID')}/command", command) # 发送指令

print("灯已打开")

定义“关灯”函数

def turn_off_light():

command = '{"id":1,"method":"set_power","params":["off"]}'

client.publish(f"miio/{os.getenv('MI_DEVICE_ID')}/command", command)

print("灯已关闭")

设置定时任务(每天7:00开灯,22:00关灯)

scheduler = BlockingScheduler()

scheduler.add_job(turn_on_light, 'cron', hour=7, minute=0) # 每天7点执行

scheduler.add_job(turn_off_light, 'cron', hour=22, minute=0) # 每天22点执行

scheduler.start() # 启动定时任务

把这段代码保存为light_timer.py,在命令行里输入python light_timer.py运行,到点灯就会自动开关。如果你想调整时间,改hourminute参数就行(比如hour=6, minute=30就是早上6点半)。

场景二:温度触发空调调节(条件满足时执行)

夏天当室内温度高于28℃时,自动打开空调制冷;低于24℃时关闭。需要一个温度传感器(比如小米温湿度传感器)和空调配合,传感器实时上报温度,Python判断温度是否达到阈值,再控制空调开关。

代码思路是:用MQTT订阅传感器的温度主题,当收到温度数据时,判断是否大于28℃,如果是就发指令开空调。核心代码片段(结合了传感器和空调控制):

import json

import paho.mqtt.client as mqtt

from dotenv import load_dotenv

import os

import requests

load_dotenv()

连接传感器的MQTT(接收温度数据)

sensor_client = mqtt.Client()

sensor_client.username_pw_set(os.getenv("SENSOR_DEVICE_ID"), os.getenv("SENSOR_SECRET"))

sensor_client.connect("mqtt.mi.com", 1883)

收到传感器消息时的处理函数

def on_sensor_message(client, userdata, msg):

sensor_data = json.loads(msg.payload.decode())

temperature = sensor_data["temperature"] # 提取温度值

print(f"当前室温:{temperature}℃")

# 判断温度是否高于28℃,如果是就开空调

if temperature > 28:

# 调用空调的HTTP控制接口(华为空调为例)

headers = {"Authorization": f"Bearer {os.getenv('HUAWEI_TOKEN')}"}

data = {"properties": [{"serviceId": "Thermostat", "property": "power", "value": "on"}]}

requests.put(os.getenv("HUAWEI_AC_URL"), headers=headers, json=data)

print("温度过高,已打开空调")

elif temperature < 24:

# 关闭空调

data = {"properties": [{"serviceId": "Thermostat", "property": "power", "value": "off"}]}

requests.put(os.getenv("HUAWEI_AC_URL"), headers=headers, json=data)

print("温度过低,已关闭空调")

sensor_client.on_message = on_sensor_message

sensor_client.subscribe(f"miio/{os.getenv('SENSOR_DEVICE_ID')}/props") # 订阅传感器主题

sensor_client.loop_forever() # 一直监听传感器消息

这里有个小技巧:传感器上报温度可能有延迟(通常10-30秒一次),可以在代码里加个“防抖”逻辑,比如连续3次检测到温度高于28℃才开空调,避免偶尔的温度波动导致空调频繁开关(我朋友家一开始没加防抖,有次做饭厨房温度骤升,空调反复开关,后来加了连续检测就稳定多了)。

场景三:多设备联动(复杂场景自动化)

更高级的玩法是多设备联动,比如“回家模式”:当门窗传感器检测到门被打开(人回家),自动开灯、开空调、拉开窗帘。需要门窗传感器、灯、空调、窗帘电机四个设备协同,Python作为“总指挥”,接收传感器信号后,依次给其他设备发指令。

这种场景可以用“状态机”的思路设计:定义不同的“模式”(回家、离家、睡眠),每种模式对应一组设备动作。核心代码结构如下:

# 定义“回家模式”动作

def home_mode():

print("检测到回家,启动回家模式...")

turn_on_light() # 开灯

set_air_conditioner(26) # 空调设为26℃

open_curtain() # 拉开窗帘

定义“离家模式”动作

def away_mode():

print("检测到离家,启动离家模式...")

turn_off_all_lights() # 关闭所有灯

turn_off_air_conditioner() # 关闭空调

close_curtain() # 关闭窗帘

监听门窗传感器状态

def on_door_sensor_message(client, userdata, msg):

door_status = json.loads(msg.payload.decode())["status"] # 门的状态:"open"或"close"

if door_status == "open":

home_mode() # 门打开,启动回家模式

else:

# 可以加个延时,确认人已离开再启动离家模式(比如30秒后仍关闭)

pass

启动传感器监听

door_client = mqtt.Client()

door_client.on_message = on_door_sensor_message

door_client.subscribe("miio/door_sensor/props")

door_client.loop_forever()

你可以根据自己的生活习惯扩展更多模式,比如“观影模式”(关灯、拉窗帘、打开电视)、“起床模式”(打开窗帘、


你要是想让Python脚本24小时不打烊,一直帮你盯着家里的设备,其实有好几种省心的办法,不用天天守着电脑。最简单的就是翻出家里的旧设备——比如以前淘汰的笔记本电脑,或者买个树莓派小主机。我自己用的就是树莓派,巴掌大的东西,插在客厅插座上,半年多没关过机,除了偶尔停电重启一下,基本没掉过链子。树莓派好处是功耗低,一个月电费也就5块钱不到,比开个路由器还省,放在电视柜后面藏着,不占地方还安静。要是你家有旧笔记本,也别闲着,充上电开盖放着就行,屏幕可以合上,只要别让它进入休眠模式,脚本就能一直跑,我朋友之前用他淘汰的联想本,照样撑了大半年,控制全屋灯和空调一点问题没有。

要是不想专门留个设备开机,也能让脚本在你常用的电脑上“后台摸鱼”。Windows系统的话,你搜“任务计划程序”,跟着向导创建个基本任务,选“启动程序”,然后把Python的安装路径(一般是C:Python39python.exe这种)和你的脚本路径(比如D:smart_homeauto_control.py)填进去,设置“触发器”为“开机时”,这样电脑一启动,脚本就自动跑起来了,你该用电脑办公、看剧都不耽误。Mac或者Linux系统更简单,打开终端,输入“nohup python 你的脚本名.py &”,按回车,这个“nohup”就是“不挂断”的意思,哪怕你关掉终端窗口,脚本也会在后台偷偷干活。我之前在Mac上试过,关了终端去睡觉,第二天起来看日志,脚本照样记录着温度变化,给空调发指令,稳得很。

要是家里实在没设备长期开机,云服务器也是个选择。你去阿里云、腾讯云看看,学生机或者轻量应用服务器,每月就几十块,配置不用太高,1核2G内存足够跑脚本了。买了服务器后,把脚本传上去,再设置个开机自启——比如用systemd服务,创建个“.service”文件,写几行配置,告诉服务器“开机后帮我启动这个脚本”,以后就算服务器重启,脚本也会自己站起来继续工作。我邻居家没旧电脑,就用的阿里云学生机,每月20块,跑了快一年,除了偶尔服务器维护重启,没掉过线,他还加了个邮件通知功能,脚本出问题会发邮件提醒,省心又放心。


我没有编程基础,能学会用Python控制智能家居吗?

完全可以。本文教程针对零基础设计,所有步骤都拆解为“复制粘贴代码”“填写设备信息”等简单操作,不需要理解复杂编程逻辑。比如环境搭建只需安装Python和几个工具包,设备连接时跟着复制示例代码修改密钥即可,就像“给手机装App并登录账号”一样简单。去年我帮一位完全不懂编程的朋友实操,他花2小时就成功让Python控制了家里的灯,关键是跟着步骤一步步来,不用纠结原理细节。

我的智能设备是XX品牌(比如格力、美的),能用这套方法控制吗?

大部分主流智能设备支持,具体取决于设备是否开放API接口。小米、华为、天猫精灵等品牌有成熟的开发者平台和开放协议(MQTT/HTTP),教程中的方法直接适用;部分传统品牌(如格力、美的)可能需要先确认是否支持“开放平台”或“第三方控制”功能(可在设备说明书或品牌官网查询)。如果设备支持接入智能家居生态(如米家、华为智能家居App),即使品牌不同,也能通过生态平台的API间接控制。

用Python控制智能家居会泄露隐私或被黑客攻击吗?

做好防护措施就能避免。教程中强调了“不公开设备密钥”(用.env文件存储)、“不将代码上传到公开平台”(如GitHub),这些操作能防止密钥泄露。 定期更换设备API密钥(在品牌开发者平台操作),避免使用弱密码,脚本运行时确保设备和电脑/服务器在家庭局域网内(不通过公网直接暴露设备)。只要不泄露关键信息,安全性和官方App控制相当。

如何让Python脚本一直运行,实现24小时自动化控制?

可以通过三种方式实现:

  • 用家里的旧电脑或树莓派作为服务器,开机后运行脚本(树莓派功耗低,适合长期开机);
  • 在电脑上用后台运行工具,比如Windows用“任务计划程序”设置开机启动,Mac/Linux用nohup python 脚本名.py &让脚本在后台持续运行;3. 上传脚本到云服务器(如阿里云、腾讯云),设置开机自启。我自己用树莓派运行脚本,半年来稳定无间断,电费每月不到5元。
  • 脚本运行时提示“连接失败”,可能是什么原因?

    先检查三个常见问题:

  • 设备和运行脚本的设备(电脑/树莓派)是否连同一WiFi,部分路由器的“IoT设备隔离”功能会阻止设备间通信,需在路由器设置中关闭;
  • .env文件中的密钥是否填写正确(区分大小写,注意不要有空格),可重新从品牌开发者平台获取并核对;3. 防火墙是否拦截了端口(MQTT常用1883端口,HTTP常用443端口),在系统防火墙设置中允许对应端口的入站/出站规则。按这三步排查,90%的连接问题都能解决。
  • 0
    显示验证码
    没有账号?注册  忘记密码?