开源智能家居控制系统Home-Assistant
一直喜欢科技感,想打造一套属于自己的智能家居系统
一、什么是Home Assistant?
二、安装Home Assistant
(一)docker安装
- 命令行拉取镜像
#拉取hass的最新版镜像(注意:根据自己需求选择对应版本,并不是越新越好)
sudo docker pull homeassistant/home-assistant:latest
#创建容器并运行
docker run -d --name="hass" -v /home/hass/config:/config -p 8123:8123 --restart=always homeassistant/home-assistant:latest
# 解释:
# -d:表示在后台运行
# –name:给容器设置一个名称,用于识别,这里起名叫做hass
# -v:配置目录映射(容器内的指定目录直接映射到本地主机的对应目录,比如上面那句命令,意思就是将容器里hass的 config 目录映射到 /home/hass/config 这个目录里面)
# -p:映射端口(将容器内的8123端口直接映射到物理机的8123端口,这样服务器的IP地址+端口号即可访问hass页面)最后就是运行刚才下载的容器镜像了,对于其他的版本了,注意要加上tag,避免自动下载最新版本。
(二)docker-compose一键安装
docker-compose.yaml:
version: '3'
services:
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
volumes:
- /PATH_TO_YOUR_CONFIG:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
运行:
sudo docker-compose up -d
进入HA
http://ip:8123
第一次进入要设置用户名密码
三、安装插件、商店HACS
HA插件是以安装配置config目录内的custom_components
目录内,我是用openwrt的docker安装的,在:/overlay/Configs/HomeAssistant/custom_components
目录结构类似:
root@iStoreOS:/overlay/Configs/HomeAssistant/custom_components# tree -L 2
.
├── ha_file_explorer
│ ├── __init__.py
│ ├── ...
├── ha_file_explorer-2022.10.14
│ ├── ...
├── hacs
│ ├── __init__.py
│ ├── ...
├── hasslife
│ ├── __init__.py
│ ├── ...
├── havcs
│ ├── __init__.py
│ ├── ...
├── huawei_mesh_router
│ ├── __init__.py
│ ├── ...
└── xiaomi_miot_raw
├── __init__.py
├── ...
ha_file_explorer在线编辑器
https://github.com/shaonianzhentan/ha_file_explorer
手动安装插件
将插件包解压到 custom_components 目录内,重启HA。
四、接入设备
HA 设备的接入方式并非一键连接,需要在树莓派目录 \usr\share\hassio\homeassistant 下修改配置文件 configuration.yaml 。
1.
进入 HA 管理界面,点击侧边栏 Supervisor 中的 Add-on store ,安装并启动 File editor 插件便可在网页对 configuration.yaml 文件进行直接编
Broadlink 博联全系列
博联接入 HA 最为省心。以博联智能开关为例,
# 「switch:」只需填写一次
switch:
- platform: broadlink
host: IP地址 1
mac: MAC地址 1
- platform: broadlink
host: IP地址 2
mac: MAC地址 2
配置远程唤醒设备
安装好wakeonlan插件
在configuration.yaml 加入:
switch:
- platform: wake_on_lan
name: "笔记本"
mac: "your mac address"
host: "192.168.1.xxx" //可以不要,不过有了这个可以知道机子是不是在线
broadcast_address: "192.168.1.255"
broadcast_port: "9"
- platform: wake_on_lan
name: "nas"
mac: "your mac address"
host: "192.168.1.xxx"
broadcast_address: "192.168.1.255"
broadcast_port: "9"
远程关闭电脑
摘自:https://bbs.hassbian.com/thread-15940-1-1.html
不需要增加任何硬件成本,但是电脑必须支持WOL(远程唤醒)
原理自析:被控制端电脑运行一个休眠和关机监听服务,基于python3,这个服务占用资源少,再在HA内对监听端口访问,发出指令进行操作。
windows
1、安装 python3,并安装 jsonrpclib-pelix 库
pip3 install jsonrpclib-pelix
2、按win+R键输入: shell:startup 会打开一个文件夹,在此文件夹新建一个后缀名为.pyw文件,然后右键打开方式 设置为 python 复制粘贴以下内容:
import subprocess
import socket
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
def poweroff(on_off):
if on_off.lower() == "sleep": #休眠
print(f"on_off: {on_off.lower()}")
res = subprocess.run('rundll32.exe powrprof.dll,SetSuspendState 0,1,0',shell=True,encoding='utf-8',stdout=subprocess.PIPE)
return "ON"
elif on_off.lower() == "off": #关机
print(f"on_off: {on_off.lower()}")
res = subprocess.run('shutdown -s -f -t 03',shell=True,encoding='utf-8',stdout=subprocess.PIPE)
return "OFF"
return "unknown"
# 单线程
print(f"Server Start")
server = SimpleJSONRPCServer(('192.168.1.123', 1234)) #本地IP地址和监听端口
server.register_function(poweroff, 'poweroff')
server.serve_forever()
#curl -X POST -d '{"id": "1234", "method": "poweroff", "params": ["off"], "jsonrpc": "2.0"}' "http://192.168.1.123:1234"
Linux系统
1、安装 python3,并安装 jsonrpclib-pelix 库
pip3 install jsonrpclib-pelix
2、新建pyw文件,如guanji.pyw
import subprocess
import socket
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
def poweroff(on_off):
if on_off.lower() == "sleep": #休眠
print(f"on_off: {on_off.lower()}")
res = subprocess.run('shutdown -h 1',shell=True,encoding='utf-8',stdout=subprocess.PIPE)
return "ON"
elif on_off.lower() == "off": #关机
print(f"on_off: {on_off.lower()}")
res = subprocess.run('shutdown -f 1',shell=True,encoding='utf-8',stdout=subprocess.PIPE)
return "OFF"
return "unknown"
# 单线程
print(f"Server Start")
server = SimpleJSONRPCServer(('192.168.1.3', 1234)) #本地IP地址和监听端口
server.register_function(poweroff, 'poweroff')
server.serve_forever()
#curl -X POST -d '{"id": "1234", "method": "poweroff", "params": ["off"], "jsonrpc": "2.0"}' "http://192.168.1.123:1234"
让此文件随系统启动运行,方式多样,自行百度。
- 做好以上步骤,下面就是HA的配置了:
编辑Homeassistant 配置文件在 switch下添加:
vi configuration.yaml
在switch 分支下加入块:
- platform: command_line
switches:
poweroff_mycomputer:
friendly_name: 台式机关机
command_on: >
curl -X POST -d '{"id": "123", "method": "poweroff", "params": ["sleep"], "jsonrpc": "2.0"}' "http://192.168.1.123:1234"
command_off: >
curl -X POST -d '{"id": "123", "method": "poweroff", "params": ["off"], "jsonrpc": "2.0"}' "http://192.168.1.123:1234"
unique_id: poweroff_mycomputer
value_template: '{{ value_json.result=="ON"}}'
其实有很多种玩法,根据需要改一下文件和调用就行。
HA远程关闭linux(win)的另一种方法(ssh命令法):
也就是通过ssh远程登陆主机,发送关机命令
linux关机命令:
ssh usr@192.168.1.X sudo shutdown -f 1
windows:关机命令:
ssh Administrator@192.168.1.X rundll32.exe powrProf.dll,SetSuspendState
首先第一步Windows主机部署OpenSSH服务,Linux主机可以跳过此步
受控的Windows主机若是win10以前的版本,譬如win7,安装OpenSSH使Win主机获得SSH的支持
具体部署请参考:win7下安装openSSHhttps://blog.csdn.net/youlinhuanyan/article/details/105925666
若受控主机是win10后的版本,系统已经自带OpenSSH,但是需要启用功能和设置系统启动自动运行服务
请参考:win10自带的openssh使用教程https://www.dadighost.com/help/39658.html
第二步 进入HA的SSH生成密匙对,并将公匙放置受控主机authorized_keys里
(Tips:如果是安装在容器下的HA,宿主机SSH可以用docker exec -it 容器名称 bash命令进入到内部容器终端,容器名称可以用docker ps命令查看。也可以安装portainer容器管理器点console在网页上使用容器内部终端。使用群晖的Docker套件的话,则可以右键单击容器——详情——终端机
Docker 图形化工具 Portainerhttps://www.jianshu.com/p/e76054edabe1
)
HA的SSH下输入ssh-keygen生成密匙对
然后输入ls /root/.ssh/ -a查看目录下是否已生成id_rsa.pub公钥文件
退出容器的终端,回到宿主机的终端,输入
docker cp homeassistant:/root/.ssh/id_rsa.pub /tmp/ (homeassistant为容器名称,/tmp/为宿主机临时目录)
第三步:拷贝生成的公匙到受控主机
Win系统:使用WinSCP这个软件登录宿主机,用户名和密码与宿主机SSH登录名密码一致,把宿主机上/tmp/id_rsa.pub文件拷贝回Windows系统目录上,为了举例方便,我拷贝至C:\Users\Administrator.ssh\里,Administrator是有管理员权限的用户,.ssh目录如果不存在,请先在cmd用mkdir .ssh创建此目录,右键无法新建。然后把id_rsa.pub复制一份并改名为authorized_keys,然后再拷贝一份id_rsa.pub至C:\ProgramData\ssh目录下并改名为administrators_authorized_keys
(完成这步此时你的受控win主机C:\Users\Administrator.ssh\目录里应有authorized_keys文件、和C:\ProgramData\ssh目录里应有administrators_authorized_keys文件。若这步我表达得不够清楚,可以参照微软官方的文档,部署公匙——标准用户、管理用户,这两块都要操作 OpenSSH 密钥管理https://docs.microsoft.com/zh-cn … enssh_keymanagement)
Linux系统:受控主机输入scp HA宿主机管理用户名@HA宿主机IP:/tmp/id_rsa.pub /root/.ssh/authorized_keys把id_rsa.pub拷贝成authorized_keys放在.ssh目录下
第四步:HA测试SSH连接受控主机
回到HA的终端,输入命令ssh 受控主机用户名@受控主机IP,例如ssh root@192.168.1.110,第一次可能会提示添加密匙,键入yes回车就行了。然后看看是否会提示输入受控主机的用户名和密码,如果没有提示,则通过密匙免密登录受控机成功,然后HA就可以通过shell command来控制受控主机了!
HA的配置部分,实体为开关,yaml内容参考:
switch:
- platform: wake_on_lan
mac: "00:E0:67:02:44:33"
name: "Win7 PC"
host: "192.168.1.110"
turn_off:
service: shell_command.suspend_win7pc
shell_command:
suspend_win7pc: "ssh Administrator@192.168.1.110 rundll32.exe powrProf.dll,SetSuspendState"
Linux:
ssh:
username: usrname
password: password
host: 192.168.1.X
port: 22
shell_command:
suspend_linux: "ssh usrname@192.168.1.X sudo shutdown -f 1"
其中,
mac是受控主机网卡mac地址
name是在HA中生成开关实体的名字,你起个方便你自己记的
host是受控主机的ip地址,建议受控主机采用手动固定地址或者通过添加路由器DHCP固定分配地址
turn_off:
service: shell_command.suspend_win7pc 为安排开关关闭时调用哪个shell_command命令
对应的shell_command:命令可以在下方填写,rundll32.exe powrProf.dll,SetSuspendState为Windows系统进入低功耗睡眠状态,修改为shutdown.exe -s -t 00则为关机命令
Linux系统的话则可以改为shutdown或者poweroff
至此,操作完成!受控主机状态带在线检测反馈到开关上的,一键远程软开机关机搞定,测试完美~
在HA首页加入仪表盘(实体)
参考(windows 设置ssh)
安装OpenSSH
需要安装OpenSSH客户端和服务器,win10自带客户端,我们安装服务器即可。
设置 -- 应用 -- 可选功能 -- 添加 -- 添加 OpenSSH 服务器
将id_rsa.pub加入.ssh\authorized_keys 文件中;
权限设置:
将 .ssh\authorized_keys 文件右键属性 -- 安全 -- 高级 -- 点击“禁用继承”--当出现提示时,选择“将继承的权限转换为此对象的显式权限”。然后将权限条目删除至只剩“SYSTEM”、自己的账户、“Administrators”。(此步我默认就是这三个用户,所以只用修改禁用继承)
重启服务:
net stop sshd
net start sshd
修改配置
打开sshd配置文件 C:\ProgramData\ssh\sshd.config ,注意 ProgramData 是隐藏文件夹;
编辑配置文件:
确保以下3条没有被注释
PubkeyAuthentication yes # 使用公钥
AuthorizedKeysFile .ssh/authorized_keys # 公钥位置
PasswordAuthentication no # 免密登录
确保以下2条有注释掉
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
重启服务:
net stop sshd
net start sshd
测试
回到客户端 ssh your_userName@your_IP_Adress,此时无需密码直接登录说明正常(首次登陆可能会提示是否加入known_hosts,yes即可)。
关闭sshd服务 net stop sshd;
使用 sshd -d 开启sshd服务;
手机访问
安装Home Assistant 手机版,界面和web版是一样的。
项目地址
https://github.com/home-assistant/android/releases
安装后设置访问地址和用户密码即可访问,可设置在家连接内部WIFI 时通过内网地址访问,在外网是通过域名访问,具体自己摸索。
推荐集成:
虽然不详细教大家安装了,但推荐几个我在用的集成。
1、直接可以安装的:
- HomeKit:这个就是用来把HomeAssistant里的设备接入HomeKit的,IOS用户必装
2、需要现在HACS下载的:
- bemfa:用于把不支持米家但能接入HomeAssistant的设备接入小爱同学或天猫精灵语音控制
- Xiaomi Miot Auto:能够把大多数米家设备直接接入HomeAssistant
- Xiaomi Miot:和刚刚的插件功能相同,是另外一位大神制作的,如果上一个插件接入不了的设备,可以试试这个,我个人觉着比Xiaomi Miot Auto略微弱一丢丢
- Midea AC LAN:可以把美的、华凌空调接入HomeAssistant
- 彩云天气:天气预报插件,可以基于天气情况实现联动
- Xiaomi Gateway 3:专门用来接入米家和Aqara的Zigbee协议设备的插件
- hacs_proxy:代理设置,https://github.com/ryanh7/hacs-proxy/tree/master
接入天猫精灵(小爱音箱)
接入易微联sonoff设备
Homeassistant安装sonoff插件
1、下载homeassistant插件:
下载地址在https://github.com/AlexxIT/SonoffLAN
解压后文件中的custom_components文件夹下。
2、配置
打开你homeassistant文件夹下的配置文件configuration.ymal然后在末尾添加如下代码:
sonoff:
username: name #修改成你的易微联app的账号,注意冒号后面必须有一个空格
password: password #修改成你的易微联app的密码
mode: local
reload: always #每次homeassistant重启时自动从易微联服务器拉取设备列表
default_class: switch # 可选
配置完成后保存重启homeassistant:配置——服务控制——重新启动
重启完成后我们可以在开发者工具——状态栏,看到所有设备,然后找到新添加的sonoff设备,最后在UI前端添加显示界面即可。
HA接入博联设备
接入Yeelight
以 Yeelight 灯带为例(非原生 Homekit 设备)。HA 自动搜索无法正确配置 Yeelight 灯带,因此需要手动加入。从路由器或 App 中获取设备的 IP 地址即可无缝接入 HA。
将以下内容拷贝至 configuration.yaml 中并更改 IP 地址。(注意 yaml 格式和缩进)
# 该方法不适用于已支持 Homekit 设备
discovery:
ignore:
- yeelight
yeelight:
devices:
192.168.1.110:
name: 灯带 1
192.168.2.111:
name: 灯带 2
在 配置 - 服务器控制 重新启动后便可在首页看到设备。
接入Broadlink 博联全系列
博联接入 HA 最为省心。以博联智能开关为例,
# 「switch:」只需填写一次
switch:
- platform: broadlink
host: IP地址 1
mac: MAC地址 1
- platform: broadlink
host: IP地址 2
mac: MAC地址 2
接入XIAOMI 小米系列
区别于其他智能设备,小米设备不光要获取 IP 地址,还要要获取设备 API token
Token 的获取方法有很多,这里介绍最简单的一种。由 SchumyHao1 分享,下载 apk 在手机安装。在 app 通用设置 - 网络信息 中即可看到设备 token 。iOS 用户须下载安卓模拟器运行。
以小米智能开关为例,
# 「switch:」只需填写一次
switch:
- platform: xiaomi_miio
host: IP 地址
token: TOKEN 码
小米智能网关需用 key 连接。还是用到之前的 App ,在网关页面中点击 关于 ,多次点击 插件版本 位置打开开发者模式。打开 局域网通信协议 便可获取 key 。
xiaomi_aqara:
discovery_retry: 10
gateways:
- key: 获取的密码
连接成功后,小米网关下的所有智能硬件将自动接入 HA 。
接入Homekit
设备连接 HA 后,可利用 HA 内置的 Homekit 插件将所有设备接入家庭,用 iPhone 统一控制。在 configuration.yaml 中写入:
homekit:
exclude_entities:
#以下实体不在 Homekit 中显示 (非必填,格式展示请勿复制)
- binary_sensor.switch_xxxxxx
- binary_sensor.wall_switch_xxxxxx
- ……
重启 HA ,在通知中可看到二维码和 8 位连接码,扫描或手动接入即可。原生 Homekit 设备需先在家庭 App 中移除, HA 会自动发现,输入 Homekit 设备 8 位连接码后即可接入 HA 。
更多设备的接入可在 官方整合文档 中查询。
至此,Homeassistant 的设备接入工作完成。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 vault@coolxy.cn