『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 43260|回复: 87

[智能音箱] 天猫精灵接入home assistant docker 部署(oauth2.0)Java实现

[复制链接]

1

主题

42

帖子

375

积分

中级会员

Rank: 3Rank: 3

积分
375
金钱
333
HASS币
20
发表于 2020-9-4 11:49:51 | 显示全部楼层 |阅读模式
本帖最后由 甜甜的苦咖啡 于 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配置文件中可以不用添加相关配置了。
43.png

在设备类别中可以添加 该设备类别的一些操作(如打开,关闭,设置模式等)
举例如下为空调的操作
42.png
图 2

一些说明
操作表
操作 至该设备类别  如空调支持的tmall操作指令,如图 空调添加了打开、关闭、设备模式、设置温度
操作代码为tmall请求参数中的name值如下图(具体tmall支持的操作及代码请参考https://www.yuque.com/qw5nze/ga14hc/rftwyo#OKWVd
响应代码为 响应给tmall开发平台的参数 需满足tmall的要求。
服务 为执行这个tmall平台的请求 需要调用的 homeassistant的服务  可在homeassistant的开发者工具--服务中查看
44.png
参数表
为具体调用homeassistant的服务需要传递的参数,默认已经传递entity_id 参数 不需要再添加,
如  打开关闭设备这个不需要其他参数 只需要entity_id  故设置为以上 图 2。
设置模式  需调用该服务  需传递 参数hvac_mode  而且该参数需要转化  如图 2.
温度设置
45.png
温度设置 需要多个参数(实际只需要 temperature 即可),(注意:目前只支持添加一个参数)
设置为不需要转化,默认会把请求中的value值 直接传递给  参数 temperature
46.png
{
    "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的服务(内置支持的设备较少。。)
41.png
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容器部署。
35.png

部署要求
总体来说就是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
具体如何安装配置 请参考其文档
1.png
先在supervisor中安装Duck dns
再在https://www.duckdns.org/登录后添加domain我直接使用google账号登录
2.png
添加自己的地址后 复制token
马赛克位置
3.png
duckdns配置如下
4.png
安装配置好后 可以使用ping 命令测试 ping 你在https://www.duckdns.org/上注册的domain若有返回的ip地址为自己路由获取的公网ip地址即配置正常(路由若关闭 响应icmp ping 则不能响应ping 命令)查看证书文件目录
使用xshell连接homeassistant的安装服务器  我这是树莓派
查看正在运行的容器
docker ps

会看到有一个名称为 addon_core_duckdns 的容器
在使用
docker inspect 4c0d964b9f7c

命令查看容器信息 docker inspect 后为红框的id
5.png

6.png
这儿看到证书目录挂载在了  /usr/share/hassio/ssl 目录下
7.png

将这两个证书文件使用xftp保存到windows

转换证书格式

转换网址https://www.racent.com/cert-convert

8.png
新文件密码 自己设置  记录下  后面配置需要使用,点击转换证书格式会下载一个 fullchain.jks 证书文件。
homeassistant创建长期访问令牌

                               
登录/注册后可看大图
22.png

创建后 复制保存  本应用调取homeassistant rest api需要该令牌
部署
1、创建数据库
这儿使用了navicat连接 创建名称为tmall的数据库。
9.png

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证书文件
10.png
删除之前创建的容器
docker rm tmall

file:///C:/Users/29242/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
3、修改配置
可以使用 vim命令编辑 或者使用 xshell的xftp工具编辑 application.yml
推荐使用 xftp 下载下来 修改后再上传覆盖

注意修改以下 红框部分,需要注意 冒号后面有空格
修改https证书配置
11.png

key-store-password 为之前转换证书时记录的密码
修改数据库连接配置
这儿我的 数据库和此应用都在一台树莓派上 但因运行在容器中不能填写回环地址,这儿修改为局域网地址
注意
initialization-mode: always 第一次运行需设置为always 应用会初始化数据库 后面在启动需设置为
initialization-mode: never
否则数据库数据在第二次启动应用时清空
21.png
修改登录用户配置
13.png

修改调用homeassistant api配置
这儿我的 homeassistant和此应用都在一台机器上 但因运行在容器中不能填写回环地址,这儿修改为局域网地址
token为前面创建的长期访问令牌
14.png
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
15.png
若出现这种错误 代表证书相关配置不对  请检查配置文件中证书文件名称和密码是否写错或者
运行命令中的 -v后面的  目录和之前放配置文件的目录不一致
16.png

若出现错误  请先删除容器
docker rm tmall
修改配置后
运行容器
docker run -it  -p 2000:2000 -v /opt/tmallx1/config:/opt/aligenie/config --name tmall 292427558/aligeniehomeassistant:latest

若出现该日志表示应用正常运行了
17.png

可按 ctrl + c 结束运行
修改数据库初始化设置
修改数据库初始化设置
修改数据库初始化设置
重要的事情说三遍
再次修改配置文件将
initialization-mode: 设置为never
initialization-mode: never
否则再次启动应用会清空数据库!!!
否则再次启动应用会清空数据库!!!
否则再次启动应用会清空数据库!!!

以后启停可使用以下命令
启动容器
docker start tmall
停止容器
docker stop tmall
重启容器
docker restart tmall


5、测试应用启动成功后  需要在路由器上设置端口转发才可以 公网访问应用 不同路由器不一样
asus 在外部网络  ---》  端口转发中设置
我设置了 外网2000 端口转发至 树莓派的2000端口
19.png


设置完成后就可以访问以下地址测试了 把yourddns替换为你的ddns地址 也就是duckdns配置的domains
https://yourddns:2000/main
31.png

出现该登录页面代表配置成功了 可以使用配置的账号密码登录,登录后的页面 请大家忽略该,该页面为暂未实现的功能,尽情期待

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 ,空气净化器的温度就是从属性中获取。
40.png 39.png

天猫支持的属性查询 目前我这边对接支持数值型查询,非数值型除非(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技能处 添加技能
25.png


其服务设置如下
其中马赛克的地方为替换为 你的外网访问地址,

26.png


测试验证

27.png
这儿选择新窗口打开
点击账户配置
输入配置的登录的账户密码

32.png
弹出授权页面 选择授权
33.png
29.png

成功后会返回设备列表
34.png


然后就可以使用天猫精灵语音控制设备了
。。。
如:
打开主卧空调
主卧空调通风
主卧空调温度设置为XX
等等

设备支持说明
目前只支持 空调和风扇(空气净化器);switch和light(无设备测试,没测试)
目前支持设备较少,若大家有新的设备支持需求请留言,需要以下信息,便于作者开发支持新的设备,当然感兴趣的也可以自己开发
仓库地址
https://github.com/292427558/aligenieHomeAssistant

36.png


实体的一些状态信息,通常包含一部分控制参数
37.png


后续更新
按照此贴的教程配置的后续只需要删除原本容器和镜像,拉取新镜像运行即可。

停止容器
docker stop tmall


删除容器
docker rm tmall


删除镜像
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



转载请注明出处














评分

参与人数 3金钱 +50 HASS币 +20 收起 理由
jyz_0501 + 20 感谢楼主分享!
qjiang + 10 大神666!
Roger + 20 + 20 我来瀚思就为看你!

查看全部评分

回复

使用道具 举报

0

主题

217

帖子

1695

积分

金牌会员

Rank: 6Rank: 6

积分
1695
金钱
1478
HASS币
0
QQ
发表于 2020-9-4 13:28:15 | 显示全部楼层
感谢大神教程
回复

使用道具 举报

25

主题

416

帖子

3025

积分

元老级技术达人

积分
3025
金钱
2599
HASS币
40
发表于 2020-9-4 13:28:41 | 显示全部楼层
回复

使用道具 举报

34

主题

709

帖子

4687

积分

论坛元老

Rank: 8Rank: 8

积分
4687
金钱
3968
HASS币
50
发表于 2020-9-4 14:27:02 | 显示全部楼层
支持楼主折腾,,,,,,大家最多的设备是switch ,,light,,,应该优先支持吧
回复

使用道具 举报

1

主题

42

帖子

375

积分

中级会员

Rank: 3Rank: 3

积分
375
金钱
333
HASS币
20
 楼主| 发表于 2020-9-4 15:59:46 | 显示全部楼层
更新支持了 switch 和 light  但没设备测试,
回复

使用道具 举报

70

主题

596

帖子

3407

积分

论坛元老

Rank: 8Rank: 8

积分
3407
金钱
2811
HASS币
0
发表于 2020-9-4 18:23:06 | 显示全部楼层
又多了种方案。但好象还复杂。能象以前的MOLO就好,很简单,小白最合适。
回复

使用道具 举报

18

主题

275

帖子

2323

积分

金牌会员

Rank: 6Rank: 6

积分
2323
金钱
2048
HASS币
10
发表于 2020-9-8 13:02:48 | 显示全部楼层
群晖怎么部署?
回复

使用道具 举报

1

主题

42

帖子

375

积分

中级会员

Rank: 3Rank: 3

积分
375
金钱
333
HASS币
20
 楼主| 发表于 2020-9-8 14:03:55 | 显示全部楼层
九天 发表于 2020-9-8 13:02
群晖怎么部署?

提供了 x86 运行的docker镜像的哦,理论上群辉运行没有问题的,建议可以通过尝试通过ssh连接群辉进行部署
回复

使用道具 举报

18

主题

275

帖子

2323

积分

金牌会员

Rank: 6Rank: 6

积分
2323
金钱
2048
HASS币
10
发表于 2020-9-8 17:17:23 | 显示全部楼层
甜甜的苦咖啡 发表于 2020-9-8 14:03
提供了 x86 运行的docker镜像的哦,理论上群辉运行没有问题的,建议可以通过尝试通过ssh连接群辉进行部署 ...

卷里面 怎么设置 就是这里 不明白
回复

使用道具 举报

18

主题

275

帖子

2323

积分

金牌会员

Rank: 6Rank: 6

积分
2323
金钱
2048
HASS币
10
发表于 2020-9-8 17:19:51 | 显示全部楼层
甜甜的苦咖啡 发表于 2020-9-8 14:03
提供了 x86 运行的docker镜像的哦,理论上群辉运行没有问题的,建议可以通过尝试通过ssh连接群辉进行部署 ...

其他应该不用修改什么吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-1 09:21 , Processed in 0.219266 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表