开源智能家居控制系统Home-Assistant

开源智能家居控制系统Home-Assistant

一直喜欢科技感,想打造一套属于自己的智能家居系统

一、什么是Home Assistant?

二、安装Home Assistant

(一)docker安装

  1. 命令行拉取镜像
#拉取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 文件进行直接编

博联接入 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

配置 - 服务器控制 重新启动后便可在首页看到设备。

博联接入 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

×

喜欢就点赞,疼爱就打赏

github