本帖最后由 甜甜的苦咖啡 于 2020-11-30 22:47 编辑
更新情况
2020/11/30更新
修改token期限 refresh_token 90天
2020/09/24更新
新增管理页面配置设备及按照设备类别配置设备具体的操作(即:代码中不支持的设备,可以通过自定义配置来支持了。。);升级需要删除原有容器和镜像,拉取最新镜像,并需要修改配置初始化数据库基础数据,修改配置中 initialization-mode : always,启动后停止在修改为
initialization-mode : never 。
具体配置
在应用启动和访问
https://yourddns:2000/main
出现以下页面,在设备设置中可以添加tmall发现的设备,添加后homeassistant配置文件中可以不用添加相关配置了。
在设备类别中可以添加 该设备类别的一些操作(如打开,关闭,设置模式等)
举例如下为空调的操作
图 2
一些说明
操作表
操作 至该设备类别 如空调支持的tmall操作指令,如图 空调添加了打开、关闭、设备模式、设置温度
操作代码为tmall请求参数中的name值如下图(具体tmall支持的操作及代码请参考https://www.yuque.com/qw5nze/ga14hc/rftwyo#OKWVd )
响应代码为 响应给tmall开发平台的参数 需满足tmall的要求。
服务 为执行这个tmall平台的请求 需要调用的 homeassistant的服务 可在homeassistant的开发者工具--服务中查看
参数表
为具体调用homeassistant的服务需要传递的参数,默认已经传递entity_id 参数 不需要再添加,
如 打开关闭设备这个不需要其他参数 只需要 entity_id 故设置为以上 图 2。
设置模式 需调用该服务 需传递 参数 hvac_mode 而且该参数需要转化 如图 2.
温度设置
温度设置 需要多个参数(实际只需要 temperature 即可 ),(注意:目前只支持添加一个参数)
设置为不需要转化,默认会把请求中的value值 直接传递给 参数 temperature
{
"header":{
"namespace":"AliGenie.Iot.Device.Control",
"name":"SetTemperature",
"messageId":"1bd5d003-31b9-476f-ad03-71d471922820",
"payLoadVersion":1
},
"payload":{
"accessToken":"access token",
"deviceId":"34234",
"deviceType":"XXX",
"attribute":"temperature",
"value":"27",
"extensions":{
"extension1":"",
"extension2":""
}
}
}
复制代码
添加后需要在 设备类别---刷新缓存 中执行刷新缓存
添加后 执行tmall精灵的控制指令,默认是先从缓存中 根据设备类别获取用户自定义的操作来调取homeassistant的相关服务,若用户没有设置会按照代码内置的一些逻辑来调取homeassistant的服务(内置支持的设备较少。。)
2020/09/11更新
删除原有容器和镜像,拉取最新镜像重新运行即可,不需要修改配置;支持设备属性查询 ,需要在homeassistant配置中添加需要查询的设备的一些配置,具体看帖子第6点中的配置。由于天猫开发平台云云接入不支持具体的传感器类别(如温湿度传感器,目前我是没找到实现方式,有大佬实现的欢迎交流),传感器和设备的属性只支持以类似 “ 查询客厅空气净化器温度 ” ,“查询餐厅传感器温度”这样的指令 ,不支持“ 室内温度多少 ”这种指令。
情况说明
1、目前只测试了格力空调 和 小米空气净化器 switch和light 理论上支持开关但没有设备测试。笔者家中目前只测试了这两个设备。后续的请大家留言需要支持的设备 entityId,我会根据情况完善目前版本。
2、代码在github上,有兴趣的可以fork自己开发,若大家觉得作者写的不错可以点亮小星星。https://github.com/292427558/aligenieHomeAssistant
3、由于接入homeassistant的设备种类多,支持众多设备代码会很臃肿,笔者正在按自己想法写一个将homeassistant的设备控制服务参数配置在数据库的方式,去调用homeassistant的方式。若实现了,大家就可以根据自己的家设备灵活配置,若没实现。。。希望大家可以支持我一下。4、作者玩homeassistant的时间也不久,有些不合理的地方,请大佬们留下宝贵的意见,不喜勿喷。作者不会php和python,这是我选择自己采用java来实现的原因。
目前实现的部分 框图
https://bbs.hassbian.com/thread-1862-1-1.html
跟这个差不多,大家可以产考,只是实现的开发语言由php更改为了java,采取springboot + springsecurity + springData,部署采取docker容器部署。
部署要求
总体来说就是 docker 容器部署,拉取镜像,修改配置,配置 https 证书
1、需要自己有公网ip,其他内网穿透方式没测试过。作者是动态公网ip 然后ddns方式。
2、证书文件 配置https,作者采取homeassistant的插件duck dns生成的证书文件。
3、树莓派 或者其他可以运行java 或者 docker的环境,作者直接是 部署在运行homeassistant的树莓派上。
4、需要mysql数据库用于存储token及一些配置信息,没有的推荐使用docker 安装一个。
5、homeassistant 开启了rest api访问。
6、天猫开发平台 注册了开发者身份。
准备ddns动态域名解析及证书文件
已经有的可以跳过
这儿我直接采用了 homeassistant内部的插件 duckdns
具体如何安装配置 请参考其文档
先在supervisor中安装Duck dns
再在https://www.duckdns.org/ 登录后添加domain我直接使用google账号登录
添加自己的地址后 复制token
马赛克位置
duckdns配置如下
安装配置好后 可以使用ping 命令测试 ping 你在https://www.duckdns.org/ 上注册的domain若有返回的ip地址为自己路由获取的公网ip地址即配置正常(路由若关闭 响应icmp ping 则不能响应ping 命令)查看证书文件目录
使用xshell连接homeassistant的安装服务器 我这是树莓派
查看正在运行的容器
会看到有一个名称为 addon_core_duckdns 的容器
在使用
docker inspect 4c0d964b9f7c
复制代码
命令查看容器信息 docker inspect 后为红框的id
这儿看到证书目录挂载在了 /usr/share/hassio/ssl 目录下
将这两个证书文件使用xftp保存到windows
转换证书格式
转换网址https://www.racent.com/cert-convert
新文件密码 自己设置 记录下 后面配置需要使用,点击转换证书格式会下载一个 fullchain.jks 证书文件。
homeassistant创建长期访问令牌
创建后 复制保存 本应用调取homeassistant rest api需要该令牌
部署
1、创建数据库
这儿使用了navicat连接 创建名称为tmall的数据库。
2、拉取镜像
提供了 x86桌面平台和 arm64镜像,提供了docker hub和阿里云两个镜像仓库供大家下载docker hub
docker pull 292427558/aligeniehomeassistant:latest
复制代码
若以上地址下载失败或下载速度较慢 请选择如下阿里云镜像仓库
docker pull registry.cn-hangzhou.aliyuncs.com/junge/aligeniehomeassistant:latest
复制代码
创建目录
用来存放配置文件 及证书文件
mkdir -p /opt/tmallx1/config
复制代码
将前面转换证书的下载得到的证书文件fullchain.jks放入/opt/tmallx1/config 目录下
创建容器
注意若为阿里云下载镜像 将以下 292427558/aligeniehomeassistant:latest 部分替换为 registry.cn-hangzhou.aliyuncs.com/junge/aligeniehomeassistant:latest
docker create --name tmall 292427558/aligeniehomeassistant:latest
复制代码
从容器内拷贝配置文件
docker cp tmall:/opt/aligenie/config /opt/tmallx1
复制代码
进入目录
cd /opt/tmallx1/config/
复制代码
会看到有一个 application.yml文件和fullchain.jks证书文件
删除之前创建的容器
file:///C:/Users/29242/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
3、修改配置
可以使用 vim命令编辑 或者使用 xshell的xftp工具编辑 application.yml
推荐使用 xftp 下载下来 修改后再上传覆盖
注意修改以下 红框部分,需要注意 冒号后面有空格
修改https证书配置
key-store-password 为之前转换证书时记录的密码
修改数据库连接配置
这儿我的 数据库和此应用都在一台树莓派上 但因运行在容器中不能填写回环地址,这儿修改为局域网地址
注意
initialization-mode : always 第一次运行需设置为always 应用会初始化数据库 后面在启动需设置为
initialization-mode : never
否则数据库数据在第二次启动应用时清空
修改登录用户配置
修改调用homeassistant api配置
这儿我的 homeassistant和此应用都在一台机器上 但因运行在容器中不能填写回环地址,这儿修改为局域网地址
token为前面创建的长期访问令牌
4、启动容器
若为阿里云下载的镜像注意替换 镜像名称
292427558/aligeniehomeassistant:latest 替换为 registry.cn-hangzhou.aliyuncs.com/junge/aligeniehomeassistant:latest
docker run -it -p 2000:2000 -v /opt/tmallx1/config:/opt/aligenie/config --name tmall 292427558/aligeniehomeassistant:latest
复制代码
若出现这种错误 代表证书相关配置不对 请检查配置文件中证书文件名称和密码是否写错或者
运行命令中的 -v后面的 目录和之前放配置文件的目录不一致
若出现错误 请先删除容器
docker rm tmall
修改配置后
在
运行容器
docker run -it -p 2000:2000 -v /opt/tmallx1/config:/opt/aligenie/config --name tmall 292427558/aligeniehomeassistant:latest
复制代码
若出现该日志表示应用正常运行了
可按 ctrl + c 结束运行
修改数据库初始化设置
修改数据库初始化设置
修改数据库初始化设置
重要的事情说三遍
再次修改配置文件将
initialization-mode: 设置为never
initialization-mode : never
否则再次启动应用会清空数据库!!!
否则再次启动应用会清空数据库!!!
否则再次启动应用会清空数据库!!!
以后启停可使用以下命令
启动容器
停止容器
重启容器
docker restart tmall
复制代码
5、测试应用启动成功后 需要在路由器上设置端口转发才可以 公网访问应用 不同路由器不一样
asus 在外部网络 ---》 端口转发中设置
我设置了 外网2000 端口转发至 树莓派的2000端口
设置完成后就可以访问以下地址测试了 把yourddns替换为你的ddns地址 也就是duckdns配置的domains
https://yourddns:2000/main
出现该登录页面代表配置成功了 可以使用配置的账号密码登录,登录后的页面 请大家忽略该,该页面为暂未实现的功能 ,尽情期待
6、homeassistant设置 在配置文件中添加以下内容,这儿参考了论坛的实现方式
参数解读
climate.zhu_wo_kong_diao为设备的entityid 请根据自己实际情况配置
tmall_genie: true 设置为true tmall发现设备才会识别到该设备
tmall_genie_type: 设备类型,与天猫精灵官方支持的类型 必须一致,看好,设备类型填英文,不是前面的中文;
tmall_genie_zone: 设备位置,也不可乱填,必须包含在官方所给的列表 中;
tmall_genie_name: 设备名称,同样不可乱填,必须包含在官方给出的列表 中。
device_brand: GREE 品牌 可不填
device_model: KFR-26GW/(26564) 设备型号 可不填
查询相关参数
在需要查询属性的实体下添加如下属性
query:
position: attributes
querymap:
humidity: humidity
temperature: temperature
===================================
position:代表属性获取位置 取值有
state 从设备状态(state)字段获取,
attributes 从属性attributes 中获取,
all 从状态和属性中获取
querymap: homeassistant和tmall的查询参数对应,其下面的参数humidity: humidity 表示 :前面的humidity表示homeassistant中获取值的属性
:号后面的 humidity表示天猫支持的属性查询参考下表(下表数据来源 ),若从状态获取 冒号前需配置为 state,具体需要查询的值从哪儿获取可以在开发者工具 --- 状态查看实体具体信息 下面两种图 温湿度计的湿度就是从状态中获取 值为68.1 ,空气净化器的温度就是从属性中获取。
天猫支持的属性查询 目前我这边对接支持数值型查询,非数值型除非(homeassistant的属性值和,和下表属性值参考值一致)
属性
说明
属性值参考
AliGenie 所支持的对应单位
powerstate
电源状态
on(打开),off(关闭)
无
color
颜色
参考颜色对应表
无
temperature
温度
数值
摄氏度
windspeed
风速
数值
档
brightness
亮度
数值
无
fog
雾量
数值
无
humidity
湿度
数值
无
pm2.5
pm2.5
数值
无
channel
电视频道
标准的频道名称
无
number
电视频道号
数值
无
direction
方向
取值left,right,forward,back,up,down
无
angle
角度
数值
度
anion
负离子功能
on(打开),off(关闭)
无
effluent
出水功能
on(打开),off(关闭)
无
mode
模式
参考mode 设置中的mode取值表
无
lefttime
剩余时间
数值
无
remotestatus
设备远程状态
on(打开),off(关闭)
无
onlinestate
设备在线状态
online(在线),offline(离线)
无
修改后重启homeassistant
查询为从属性获取
homeassistant:
name: Home
unit_system: metric
customize:
# Add an entry for each entity that you want to overwrite.
climate.zhu_wo_kong_diao:
tmall_genie: true
tmall_genie_zone: 主卧
tmall_genie_name: 空调
tmall_genie_type: aircondition
device_brand: GREE
device_model: KFR-26GW/(26564)
climate.ke_wo_kong_diao:
tmall_genie: true
tmall_genie_zone: 次卧
tmall_genie_name: 空调
tmall_genie_type: aircondition
device_brand: GREE
device_model: KFR-26GW/(26564)
climate.er_tong_fang_kong_diao:
tmall_genie: true
tmall_genie_zone: 儿童房
tmall_genie_name: 空调
tmall_genie_type: aircondition
device_brand: GREE
device_model: KFR-26GW/(26564)
fan.xiao_mi_kong_qi_jing_hua_qi:
tmall_genie: true
tmall_genie_zone: 餐厅
tmall_genie_name: 空气净化器
tmall_genie_type: airpurifier
device_brand: xiaomi
device_model: 小米空气净化器 PRO3
query:
position: attributes
querymap:
humidity: humidity
temperature: temperature
复制代码
一个传感器查询配置例子(供参考)---从状态获取属性
homeassistant:
name: Home
unit_system: metric
customize:
# Add an entry for each entity that you want to overwrite.
sensor.humidity_158d00012caxxx:
tmall_genie: true
tmall_genie_zone: 餐厅
tmall_genie_name: 传感器
tmall_genie_type: sensor
device_brand: 222
device_model: 222
query:
position: state
querymap:
state: humidity
复制代码
一个传感器查询配置例子(供参考)---从状态及从属性获取属性
homeassistant:
name: Home
unit_system: metric
customize:
# Add an entry for each entity that you want to overwrite.
fan.xiao_mi_kong_qi_jing_hua_qi:
tmall_genie: true
tmall_genie_zone: 餐厅
tmall_genie_name: 空气净化器
tmall_genie_type: airpurifier
device_brand: xiaomi
device_model: 小米空气净化器 PRO3
query:
position: all
querymap:
humidity: humidity
temperature: temperature
state: powerstate
复制代码
7、天猫开放平台设置
若没有注册开发者身份的请自行申请。
在该网址 配置技能
在 内容 &iot技能处 添加技能
其服务设置如下
其中马赛克的地方为替换为 你的外网访问地址,
测试验证
这儿选择新窗口打开
点击账户配置
输入配置的登录的账户密码
弹出授权页面 选择授权
成功后会返回设备列表
然后就可以使用天猫精灵语音控制设备了
。。。
如:
打开主卧空调
主卧空调通风
主卧空调温度设置为XX
等等
设备支持说明
目前只支持 空调和风扇(空气净化器);switch和light(无设备测试,没测试)
目前支持设备较少,若大家有新的设备支持需求请留言,需要以下信息,便于作者开发支持新的设备,当然感兴趣的也可以自己开发
仓库地址
https://github.com/292427558/aligenieHomeAssistant
实体的一些状态信息,通常包含一部分控制参数
后续更新
按照此贴的教程配置的后续只需要删除原本容器和镜像,拉取新镜像运行即可。
停止容器
删除容器
删除镜像
docker rmi 292427558/aligeniehomeassistant:latest
复制代码
拉取新的镜像并运行
若为阿里云 镜像 注意安装前面的替换规则替换
docker run -it -p 2000:2000 -v /opt/tmallx1/config:/opt/aligenie/config --name tmall 292427558/aligeniehomeassistant:latest
复制代码
日志及其他说明
查看日志
运行日志会生成在/opt/tmallx1/config/logs目录下生成
查看日志
tail -100f /opt/tmallx1/config/logs/app.log
复制代码
内存限制
若觉得运行占用了树莓派过多内存资源
可在运行容器的时候指定jvm参数 如下限制堆内存最大为256m
docker run -it -p 2000:2000 -v /opt/tmallx1/config:/opt/aligenie/config -e "JAVA_OPTS=-Xmx256m" --name tmall 292427558/aligeniehomeassistant:latest
复制代码
容器加入开机启动
首先需要docker设置为开机启动,不同系统可能不一样
systemctl enable docker
复制代码
设置容器开机启动
docker update --restart=always tmall
复制代码
转载请注明出处