开源智能家居控制系统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

接入天猫精灵(小爱音箱)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 vault@coolxy.cn

×

喜欢就点赞,疼爱就打赏

github