自用智能家居控制系统。简化、模仿 Home Assistant 的拙作,但核心诉求是一致的:本地化部署、保护隐私。
2022.01.15:
- 拆分设备描述文件,每一个设备单独一个 json 文件;
- 首页启动时不再获取全部设备最新状态,延迟到用户浏览具体设备时更新。
2022.02.05:
- 集成美的空调发现功能。因为美的的 token 和 key 每次重新供电时都会变化。
2023.02.02:
- 使用此库 替换原有美的库。新库代码更清晰,动态获取 token 环节上更可靠——我的美的空调终于可以稳定使用了。
前端:React.js + Spectre.css AntD
后端:Flask Sanic
数据模型:model/devices.json
常用属性:
-
ui
:设备对应的 svg 图片 url。 -
color
:shape
的填充色。 -
properties
:可调节的设备参数集。"name": "开关"
是预置属性,关联设备的开关状态。通常所有设备都应该有且唯一,可以通过查询name
获取设备是否正在运行。 -
timers
:定时任务。内含一组properties
子集,达到设定时间时批量应用设备参数新值。定时器规则描述完全遵从 APScheduler 参数,从而可以解包后直接透传到 APScheduler 接口。 -
scenes
:预设场景。同样用作批量应用一组设备参数的新值。 -
设备参数描述属性:根据不同设备能力各自不同,但格式统一:必须是
properties
数组下的一个对象;必须有id
和value
两个固定属性。id
要求全局唯一;value
标识设备参数当前值。
其它主要依赖:
- python-miio,小米Iot 设备协议规范 的 Python 实现。
- midea-msmart,社区实现的美的空调控制协议的 Python 实现。
- APScheduler,时间调度,用来完成定时控制。
首页以 SVG 绘制出户型图后,通过数据模型动态放置所有设备到 SVG 图相应位置。点击设备后跳转到设备编辑页面。
这部分不是重点,仅摘要记录,做备忘。
设备:树莓派 3B
Python:3.7.3
HTTP 服务器:nginx
网关:Gunicorn
-
安装所有依赖库;
-
复制 SmartHome 工程到树莓派;
-
写启动脚本
boot.sh
:
sudo /etc/init.d/nginx start
cd /home/pi/SmartHome
python3 -m sanic server.app --host=127.0.0.1 --port=9876 --workers=4
- 开机启动:
nano /etc/rc.local
# Append this to rc.local above exit 0
su pi -c "exec /home/pi/StartHome/boot.sh"
- 配置 nginx:
nano /etc/nginx/sites-available/default
完成后的完整配置应该是这样的(去掉了默认的注释):
server {
listen 80 default_server;
listen [::]:80 default_server;
# HERE CHANGED
root /home/pi/SmartHome;
index index.html index.htm index.nginx-debian.html;
server_name _;
# HERE CHANGED
location / {
proxy_pass http://127.0.0.1:9876;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
include /etc/nginx/mime.types;
}
}
下半年搬了新家再更新
- Nanoleaf 灯带。可调节亮度、颜色、色温。
- 小米空调
- 美的空调
- Aqara A1 窗帘电机
1. 美的空调在断电重连时会重新分配 token 和 key。应该将 midea-discover 设备发现功能集成到 msmart。