Windows 下面安装ESPHOME出错的解决方法

在Windows下面安装ESPHOME也很简单,但是安装好以后使用的时候,编译,上传窗口都不会有任何的内容,但是可以创建yaml文件。命令行窗口则会出现TypeError: ‘NoneType’ object is not callable错误。具体如下:

1

网上找不到解决方案。研究了一下,结果还是从命令行工具解决了。

1. 使用localhost:6052 创建一个yaml文件。其实手工创建也可以的。

2

2. 使用命令行编译, esphome config/test.yaml compile

3. 编译完成以后会得到一个firmware.bin的文件,地址在C:\Users\pzhang\config\test\.pioenvs\test里面,注意test就是你创建的yaml文件名称

4. 使用https://github.com/esphome/esphome-flasher/releases 这个页面下载的工具,把这个固件烧录到ESP8266里面

Capture

这个时候就可以在homeassistant的页面里面发现并使用了。因为只是做实验,所以并没有任何可以操控的内容。

3

现在回过头来分析一下,是不是编译路径问题造成网页版的无法使用呢?现在还不知道。但是我的两台MAC电脑都可以使用网页版的进行编译、烧录。

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

  Home Assistant 是一款基于 Python 3 的智能家居开源系统,支持众多品牌的智能家居设备,可以轻松实现设备的语音控制、自动化等。

了解智能家居的朋友,相信肯定听过小米米家,米家目前是国内智能家居领域集成度、生态都建设地比较好的设备厂商。相比于苹果的HomeKit设备,米家的东西性价比确实不错,但是唯一有一个缺点,它是闭源的!尽管有些米家设备支持接入Homekit,但是米家生态链是闭源的,只整合小米生态链内的企业、设备商。也就是说:比如你家用的是格力、美的空调,是不能接入米家的…要想接入智能控制?请买小米空调,emmmmmm

   从本篇文章开始,我将会更新一系列文章,主要解决的就是家里各个设备接入智能化控制的过程,其中可能会有一些我自己DIY的控制设备,因为我本身是电子行业从业,与其买现成的设备刷机、改装,不如买几个模块自己做,说到底还是折(mei)腾(qian),没有这方面基础的朋友,可以直接买现成设备去改装,后面文章会详说。

本篇文章是介绍如何在群晖上安装HomeAssistant,为解决直接安装可能带引入的各种依赖问题,这里采用Docker方式,简单明了。


第一步:安装Docker

在套件中心找到Docker并安装,安装好了之后打开,点击注册表,搜索homeassistant选择第一项,注意千万别选错了。

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

右键下载此映像,选择默认latest最新版,下载比较慢,大概需要20分钟左右。


第二步:安装homeassistant

启动安装

点击 映像,选择刚刚下载的镜像,左上角点击启动,开始安装。

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

容器名称可以自定义,但是请安图上的写,然后点击高级设置,对容器安装环境进行设置。

1、高级设置:

  • 勾选自动重新启动

  • 创建桌面快捷方式
    智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

2、 设置:

点击文件/文件夹下面框,然后添加文件夹,选择你文件夹下用于存放HomeAssistant文件的目录,我这里存放于docker/HA路径下,装载路径框下面直接写/config,即默认配置文件是在docker/HA下。
智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

3、网络设置:

勾选网络下面使用与Docker Host相同的网络即可

4、环境设置:

点击上方号,在 可变 那里填写TZ 填写Asia/Shanghai,然后点击应用。
智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

然后,下一步,在这个页面勾选 向导完成后运行此容器,点击应用即可完成安装。

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心


第三步:登陆HomeAssistant

登陆管理界面,在浏览器输入群晖IP:8123即可打开HomeAssistant管理界面。首次登陆会要求设置管理员、密码。我这里是远程登陆界面演示。

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

至此,你已经完成了搭建智能家居的第一步,构建HomeAssistant智能控制中心,后面就可以开始逐步添加各种传感器、设备了。

PS:如果你要实现远程访问(我强烈不建议开放远程访问),那么需要在路由器上设置一条转发规则,将xxxx你自定义外网端口转发至群晖IP8123端口。




智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心

觉得好看,点个【在看】~~~

智能家居篇-1:群晖搭建HomeAssistant,构建智能家居控制中心


智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

介绍

  ESPHome 是一个配置、管理智能硬件的系统。它通过简单但功能强大的配置文件,控制ESP8266 / ESP32硬件,实现家庭自动化控制。

开篇之前,先简明介绍一下本篇文章内涉及到的一些可能带有一点专业性的名词:

固件:也叫“程序”,就是通过编写代码实现特定控制功能的文件,它能够烧录(写)进特定芯片里面。比如:洗衣机、空调、智能电饭煲等,里面都有控制芯片,那么实现智能化的,就是芯片里面的程序了,程序编写好了之后是固定不变的,所以也叫固件。

编译环境:就是在编写代码的时,调试、运行代码所需要的环境,它需要包含了特定的头文件、依赖文件、库文件等等。

编译固件:就是在编写完代码之后,生成“固件”的过程;

配置文件:就是对硬件、软件起配置、初始化作用的文件。HomeAssistant 和 ESPHome 的配置文件格式都为.yaml

  ESPHome简而言之,它就是一个在线编译的系统、环境,它尽可能减少你的学习成本 or 学习难度,直接使用这个环境(系统)就能够编译出特定需求、使用场景的硬件固件,让你直接刷入就可以使用了。emmmm,是不是还有点不明白?

前言

举个栗子:
  假如你有一个ESP8266,一个温度传感器(DHT11/DHT22),还有一个继电器模块,你想要对你家那台老破旧的台式电风扇做个改装,让它实现智能化。比如:当温度超过 36° 就自动打开风扇,并调到最大档,当温度在 30-36° 就打开为第二档,当温度小于30° 的时候,打开为第一档,微风模式。或者把它连入手机,让我躺在床上就能控制它开关、换挡呢?

在以前,没有ESPHome的时候,你需要的工具有:Arduinoesptool + 基本的C语言编程知识(最起码别人写的代码你得看得懂 = =),而且,就算你使用别人写好的代码 + 官方库,使用Arduino编译固件,可能还会带来一系列的依赖、报错信息,这大概劝退了80%的人。而有了ESPHome之后,你根本不需要考虑编译环境的问题,只需要自己编写一个.yaml配置文件,就能生成固件了。

听到这里,是不是还是有很多朋友要告辞23333…且慢,听我讲完。.yaml配置文件其实很简单的 = =、不会写可以参(zhao)考(chao)别人写好的啊.


前面介绍了那么多,下面开始正题:群晖Docker安装ESPHome,为啥这么喜欢Docker,因为简单、高效,问题少。

第一步:安装Docker

看过第一篇文章的朋友,可以忽略这一步。在群晖“套件中心” 搜索“Docker” ,点击安装。

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境


第二步:安装ESPHome

1、安装完成之后,打开 Docker ,点“注册表” ,搜索“esphome”,选择第一个,即Star数最多的那一个,右键—下载此映像,弹出的框选择latest最新版本。
智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

2、下载完成之后,在“映像”中, 选择刚刚下载的映像,点击“启动”,开始安装ESPHome。容器名称可以自定义,然后点击高级设置。

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

3、在“高级设置”中:勾选

  • 启动自动重新启动

  • 创建桌面快捷方式
    智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

4、选择“网络”,勾选使用与Docker Host相同的网络,点击“应用”。再 “下一步”,然后点击“应用”即可完成安装
智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境


登陆ESPHome

安装好了之后,在Docker 容器界面,就能看到刚刚安装的ESPHome了,然后打开浏览器,输入群晖IP:6052就能打开ESPHome的配置页面了。

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

至此,ESPHome 的安装已经完成,



智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境

觉得好看,点个【在看】~~~

智能家居篇-2:群晖Docker搭建ESPHome环境 ,为智能硬件构建编译环境


智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

前言

  ESP-01/01S应该是目前最便宜的ESP8266系列模块了。在未涨价之前,单个模块价格在3-4块之间,不知为啥现在都涨价了= =、现在价格在6-8块之间,安信可官方店里卖10块,加上一个继电器模块,总价在10-15块之间。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(ESP01/01S模块)

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(ESP01/01S + 继电器 模块)

也就是说:通过研读本篇文章,你只需花3-4瓶快乐水的钱,即可让你桌面上的台灯接入HomeAssistant,实现APP or Siri 智能控制。如果换成是现成的设备呢?

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(HomeKit认证的插座 288块,够我买半年快乐水了,打扰了…)

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(小米米家插座,49块)

这么一看,小米是真的很良心啊!确实,价格屠夫嘛,可是米家设备闭源,不支持开放协议,虽然也可以通过米家Aqara二代网关接入,但是,二代网关多少钱?比我半年快乐水还多23333…


好了进入正题,本片文章讲的是如何使用ESP01/01S通过刷ESPHome固件接入HomeAssistant 的过程,可能会比较长,但是比较简单,跟着教程基本能100%实现。本篇文章会分两个部分,第一部分为ESPHome固件的编译与烧录;第二部分为ESPHome设备添加到HomeAssistant实现智能控制。

第一部分

第一步:准备工作

准备材料、工具、环境:

  • 准备材料:ESP01/01S(注意:这是两个不同的模块,01和01S都可以),继电器模块。可以直接买上面一套的那种,10.2 元的,还需要有一个烧录工具

  • 工具:小螺丝刀,烧录工具,杜邦线等

  • 环境:HomeAssistant ,ESPHome 环境,参考前两篇连载文章;

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(需使用到的模块)

最右边的是一个烧录工具,它与上面我提供的链接里的不一样,但是功能是一样的。提供链接里的烧录器不需要上电GPIO-0拉高,但我图中的这种是需要拉高,才能进去烧录模式。


第二步:添加ESPHome硬件

在局域网内,打开ESPHome管理界面,浏览器输入群晖IP:6052,打开主界面。点击右上角加号,开始添加设备的操作

1、在第一栏输入设备名称,可以自定义,只能由小写字母,不能大写字母开头,可以使用下划线、拼音,不遵循驼峰命名法则,写好之后点击蓝色按钮CONITNUE

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

2、设备类型选择:Generic ESP8266即默认的就可以。点击CONITNUE

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

3、输入Wifi信息,注意:ESP8266 只支持2.4G wifi,不支持5G wifi,请不要搞错了。OTA & HA 连接密码,我这里填的是1,这里需要记住,后面要用到。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

4、输入完成之后,最后一步点击SUBMIT即可完成对设备的初步设定。
智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制


第三步:编写配置文件代码

这是关键的一步,在这里你需要通过编写一些配置代码,实现对这个设备的控制,一些简单的控制逻辑、传感器算法也是在这里配置的。不会很难,很简单的 = =、

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

回到ESPHome配置界面,找到刚刚新建出来的switch硬件,点击②EDIT 进入编辑,代码如下:


为防止爬虫恶意采集,此处内容需要评论回复后方可阅读。



第四步:校验-编译-下载

.yaml配置文件对空格、换行敏感,请特别注意!编写好了之后,点击右下角SAVE,然后点击④VALIDATE 检查一下配置文件有没有错误,如下图,出现右上角标志,表示配置文件没有错误,能通过校验。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

通过校验之后,点击CLOSE关闭校验窗口,回到主界面,点击switch右上角三个点,弹出来选择Compile开始编译固件,大概需要3-5分钟即可完成编译。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(开始编译)

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(编译成功)

然后点击DOWNLOAD BINARY将固件下载到桌面。

2019.9.4,接着更…

上面编译完成的固件下载保存到桌面之后之后,就需要通过下载工具烧录到ESP01/01S中了。

第五步:烧录固件

烧录软件点击下面链接获取

复制地址到浏览器打开:http://www.codess-yun.top:6860/index.php?share/file&user=1&sid=mZRfKghx

提取密码:EkEe9

或者Github下载:下载工具

首先,把ESP01/01S接上烧录工具,注意方向,否则直接烧报废,还有GPIO0需要拉低才能进入擦除Flash模式,也就是:拉低GPIO0再插入电脑USB

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(烧录成功)


第六步:接入HomeAssistant

让ESP插上继电器模块接入5v电源,注意:ESP01/01S模块的CH_PD引脚需要拉高至VCC才能正常工作!,如下图:

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(这里是为了演示引脚接法,实际使用中请不要直接使用焊锡飞线)

稍等一会儿在路由器管理界面就能看到接入的ESP设备,地址就是上面配置文件中你设置的地址,在这里就能测试继电器模块是否能正常工作,能显示这个界面,肯定是能工作的。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制
(WEB管理界面,也可以在这里进行固件的升级)

然后打开 HomeAssistant管理界面,配置-Server Control ,重启一下服务,稍等一会儿,再刷新一下就能看到一个新设备了。

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

按照步骤添加就行了

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

下面的是你设置的连接HA密码,我设的是1;
智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

然后,在主界面,点击右上角三个点,“未使用的实体” 就能发现你刚添加的继电器了,然后“配置UI” — “原始UI编辑器” 加上下面的卡片代码:


- entities:
- switch.test_switch_relay
show_header_toggle: false
theme: default
title: 测试房间
type: entities

(注意:这里只是一张自定义卡片,请严格遵循缩进)

卡片示意图:

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

打开HomeAssistant APP 和 Apple家庭应用:

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

自动添加,完美~

此时呼唤一句:嘿~ Siri,打开“测试开关”试试?

到了这里,台灯的智能改造已经完成95%了,至于后面怎么接入、改造台灯部分,那就自己发挥啦,强电一定要注意安全哦。





智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制

觉得好看,点个【在看】~~~

智能家居篇-3:ESP-01/01S 接入HomeAssistant,实现Siri控制


智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制
(图来自互联网,若有侵权请告知删除)

视频如下:


  上一篇介绍了如何利用ESP01/01S + 继电器模块实现台灯的改造,其实不局限于台灯,那个模块可以应用于你想要控制的任何开关场合,比如:热水器,风扇,鱼缸水泵等等。。。这一篇文章玩一点有趣的,刚好手头上有一块WS2812B RGB模块,查了下资料,ESPHome 刚好支持,于是就开始折腾啦。

首先,准备材料有:

  • WS2812B 模块;

  • ESP01/01S模块;

  • ESP01 烧录器;

  • 220Vac 转 5V dc模块;

第一步:创建rgblight

在ESPHome 管理界面中新建一个rgb_light 硬件,详细步骤请参考上一篇:智能家居篇-3,rgb_light配置代码如下:


为防止爬虫恶意采集,此处内容需要评论回复后方可阅读。


按照上一篇的步骤,进行编译,下载,烧录就行了

安装模块

需要注意的是:ESP01/01S模块是3.3V dc供电,WS2812B是5V 供电,台灯多数是220V ac,所以需要使用一个小变压器模块,将220V ac 转为 5V dc,且在接ESP时,要将5v降压到3.3v ,还有在操作电路时,
切记不能带电操作,强电、弱电做好绝缘隔离
切记不能带电操作,强电、弱电做好绝缘隔离
切记不能带电操作,强电、弱电做好绝缘隔离

推荐下面这种,220v ac ~ 5V dc 模块。
智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

这个位置可以焊接ASM1117-3.3 芯片,实现多一路3.3v输出

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

我这是之前买了个LED台灯,就随手把它拆了,发现拆掉里面的LED电路板,刚好能容纳ESP01S + WS2812b,所以就把变压器模块放到了台灯底座上,这也是考虑到如果将ESP01S放在底座上,会无法接收到wifi信号,因为底座是金属的,放在里面基本完全屏蔽了电磁信号,真机智如我…

(没有热缩管了,在接线处打胶,防止产生电弧)
智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

变压器模块置于底部,并用电工胶布包好,因为RGB灯功率不高(最多1.5W),所以基本不用担心发热导致胶布融化问题。

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

将ESP01S + WS2812B 置于灯泡内部,这样灯泡也能旋转出来,需要注意的是电源正负极不要搞反了,接入灯泡的是5V,所以需要在这里面加一个3.3v 降压芯片。

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

直接用AB胶把WS2812B 粘在ESP01S 上,应该不会影响信号吧 = =

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

合上雾面灯罩,一个智能 RGB灯就诞生了23333,还能让Siri 改变颜色、亮度哦~

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

试试APP 上的效果~

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

哈哈哈哈



智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制

觉得好看,点个【在看】~~~

智能家居篇-4:ESP01/01S + RGB 接入HomeAssistant,实现Siri控制


智能家居篇-5:ESP01 + DHT22 接入HomeAssistant

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant
(包含ESP01、DHT22和继电器模块的盒子)

  前几篇文章介绍了如何将安装HomeAssistant、ESPHome并通过ESP01模块,将继电器、RGB接入HomeAssistant的教程,这篇文章介绍如何做一个智能浇花系统,通过DHT22温湿度传感器和继电器,控制一个小水泵,让你家阳台的花花草草,不再被晒死。。。

这里有一个小Bug,DHT22传感器测量的是空气中的温湿度,并不是土壤的温湿度,土壤湿度传感器的接入放在下篇文章讲。


电路设计

电路比较简单,ESP01的GPIO-0接继电器,控制水泵的开合,GPIO-2接DHT22,都是采用现成模块,随便找了个合适的盒子。

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant
(盒子内部构造)


程序设计

程序也比较简单,两个设备,DHT22温湿度传感器 和 relay继电器模块,程序如下:


为防止爬虫恶意采集,此处内容需要评论回复后方可阅读。


按照上两篇教程的方法,将ESPHome环境中编译好的固件,烧录到ESP01中即可,然后再HomeAssistant 管理后台,添加设备,即可完成所有设置。

打开手机,即可发现设备已经添加进来,此时已经可以通过APP or Siri 进行控制了~

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant

PS:这里还存在一个问题,HomeKit无法发现并显示湿度数据,我查阅了一些资料,目前暂未解决,我的HomeAssistant版本是0.98.1,若有知道怎么弄的朋友,望告知一下,非常感谢~~



智能家居篇-5:ESP01 + DHT22 接入HomeAssistant

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant

觉得好看,点个【在看】~~~

智能家居篇-5:ESP01 + DHT22 接入HomeAssistant


最具性价比的智能家居wifi开关方案(迄今为止)

折腾了那么久的家居智能,前后用过小米的wifi开关,控客的小K系列,不知名的智能插座,以及廉价版的Sonoff等等,前阵子捣鼓esphome,总结出一套性价比非常高的wifi开关方案。

最具性价比的智能家居wifi开关方案(迄今为止)

一句话就是通过ESP-01S,烧ESPHOME固件来控制继电器开关。

看看下面主要设备ESP-01S的价格:


最具性价比的智能家居wifi开关方案(迄今为止)


再加上220v-3.3v的电源隔离开关以及继电器,成本控制在15元应该不是问题,这样就适合大规模的改装了。

最具性价比的智能家居wifi开关方案(迄今为止)

如果改装的是已经有3.3v电源,或者不需要继电器,可以gpio直接控制的设备,那么一个esp-01s就足以撑起整个改装,成本就是6.4元。



分析了成本和方案,接下来要讲讲技术活了。


最具性价比的智能家居wifi开关方案(迄今为止)


ESP-01与ESP-01S的区别


ESP01-S实际上是大名鼎鼎的ESP8266的简配版,Sonoff开关用的就是这款芯片。

宝搜索的话,还会发现有esp-01和esp-01s两种型号,具体区别如下:

外观区别1:ESP8266-01S天线区域右下角只有一个指示灯,ESP8266-01天线区域右下角有两个示灯。

 外观区别2:ESP8266-01S背面有引脚说明,ESP8266-01背面有没有引脚说明。

内部区别:ESP8266-01S内部电路相对应ESP8266-01做了优化,使用建议大家购买的时候买ESP8266-01S


ESP-01S接线


最具性价比的智能家居wifi开关方案(迄今为止)

可以看到,esp01-s在烧写程序的时候,需要将gpio0接地,ch-pd拉高,烧写完以后,再恢复正常使用。这点比直接用Sonoff开关麻烦。

同时因为有两个gpio可以使用,理论上也可以接两个继电器,做成一个双模的wifi开关。


ESPHOME控制代


最后再上一段esphome中的代码,实现了定时开启关闭和button控制继电器的功能。

关于什么是ESPHOME,以及如何详细使用,可以前往官网查看:

https://esphome.io/

esphome:  name: esp01s_1  platform: ESP8266  board: esp01_1m
wifi:  ssid: "你的wifi ssid"  password: "你的wifi密码"
api:
logger:
ota:
#设置定时开启和关闭time: - platform: homeassistant on_time: # Every time on weekdays and weekends - seconds: 0 minutes: 0 hours: 0 days_of_week: MON-SUN then: - switch.turn_on: relay - seconds: 0 minutes: 0 hours: 4 days_of_week: MON-SUN then: - switch.turn_off: my_switch
#按键binary_sensor: - platform: gpio pin: number: GPIO0 mode: INPUT_PULLUP inverted: True name: "Sonoff Basic Button" on_press: - switch.toggle: my_switch
switch: - platform: gpio name: "Sonoff Basic Relay"    pin: GPIO2 id: my_switch
status_led: pin: number: GPIO13 inverted: yes


✄——————————————————–



最具性价比的智能家居wifi开关方案(迄今为止)


初探智能家居 Home Assistant

前言

初探智能家居 Home Assistant

上面的画面是否有一种浓浓的科技感?没有错,这就是苹果在iOS10中带来的智能家居应用HomeKit。图中的每一个元素都是家中电器设备或传感单元的控制接口。为什么笔者要弄智能家居呢?来源于一个非常小的需求:家里的门锁总感觉不可靠,即使有了淘宝神器也不能完全安心,每天还是会纠结门是否关好。聊天的时候淡淡说有那种门窗传感器可以了解一下,于是乎上什么值得买搜了一下,找到了一个讲小米智能家居全家桶排雷的文章,里面介绍到了Home Assistant开源智能家居平台,可以和苹果的HomeKit进行对接,这样就可以在手机上监控家中的情况。这篇文章让我想起了国庆去托马斯家住的时候,早上七点钟灯会自动开起来,当时托马斯很自豪地说这是他设置的智能家居程式,让我羡慕不已,感觉有种赛博朋克的味道!正好,在实验室里面找到了闲置许久的树莓派,拿来做家庭控制中心正好不过了!

什么是智能家居?请看Home Assistant官网的概括:

初探智能家居 Home Assistant

可以看到,智能家居主要分三个层次:

  1. Home Control,收集组件的信息并对组件进行控制,同样也接收来自用户的控制并返回信息。

  2. Home Automation,根据用户的配置,自动发送控制指令(通过用户指导来替代用户层的操作)。

  3. Smart Home,根据各种之前的控制行为与结果,自学习到下一次发送的控制指令(无需用户指导而替代用户层的操作)。

根据上述的架构,显然当前智能家居还停留在自定义的控制规则上,和人工智能的“智能”二字相去甚远,但说到底其本意是为了方便生活中的一些小细节,因此也算是一个很有意义的“大人的玩具”了!再者,当前大的互联网公司在布局自己的智能家居产品时,或多或少会收集一些用户数据,这些数据日后经过训练,都有可能作为一种智能服务提供给消费者,真正做到Smart Home这一级别的智能家居。

那么,这么多智能家居平台,要选择哪一家呢?虽然每个公司都有自己的战略布局,但当前对于开发者的友好程度并不一致。例如,有小米博联这样的“半开放”平台(虽然加塞了自己的东西但是可以很好地接入第三方平台)和阿里京东这样的“封闭”平台(截止目前,天猫精灵AI联盟里面买的东西还是只能用天猫精灵控制,也就是从自家的app里面添加以外别无他法)。其实我们最经常能接触到的智能家居控制中心便是苹果的HomeKit,界面非常符合苹果一贯的简洁风格,但是HomeKit的配件都很贵,预算有限的人(包括我)常常会望而却步,才不得不考虑买其他家的智能家居产品。如果不介意都买一家公司的“全家桶”,那么这家公司自己的智能家庭APP已经可以满足你的需求。如果考虑到价格和性能,每种产品都选择了不同家的公司,那手机里装的APP就要塞不下了。

初探智能家居 Home Assistant

因此,为了将很多家智能家居设备整合在一起,需要用到第三方的开放平台。首先要说开源的HomeBridge,它由前HomeKit程序员创建,用Node.js编写,让无法接入HomeKit的第三方产品通过插件兼容桥接入。然后就是本文的重点Home Assistant(HA,下同),它属于新兴力量,基于Python且UI友好,崇尚“Simplicity”,社区活跃而文档丰富,每周都有新版本的小插件发布。此外还有其他一些好平台,比如Domoticz,openHAB等,笔者尚未接触过。根据网路上的描述,OpenHAB基于Java开发,社区非常成熟,但插件审核严格,更新较慢;而Domoticz用C++实现,体积小可扩展性高,但其中文社区不够活跃,文档也相对较少。

初探智能家居 Home Assistant

所以,最后综合考虑,我选择了HA作为控制中心!先来上一张效果图吧~对UI没有强迫症的我用的都是默认的UI设置。

初探智能家居 Home Assistant

1. 安装与配置Home Assistant

任何电脑,任何操作系统,只要能运行python,都可以运行HA:笔记本、台式机、Mac、微型电脑…等等。选择树莓派的原因是自己刚好就有一块,而且放在那里常开功率也不会太大,不会进入睡眠模式。虽然亲测初代B版树莓派也是可以满足需求的,但是在编译安装HA和其他插件的过程中总会出现这样那样的错误,和内存与算力均有关系。考虑到未来会加入摄像头(ffmpeg),或者希望自带WiFi(可以放在任何角落而不需要放在路由器旁边),树莓派三代B+版本是最好的选择。

初探智能家居 Home Assistant

因为HA是基于Python的,所以安装只需简单给出命令:

1$ sudo pip3 install homeassistant

运行HA的方法是:

1$ hass --open-ui

第一次运行需要来以root权限运行HA,即sudo hass --open-ui,其目的是为了安装一些必要的插件(需要权限)。随时去http://树莓派IP地址:8123 看看是不是安装好了。等到安装好以后,以后都只需以普通用户身份运行HA,值得注意的是运行必要的一些配置文件,如configuration.yamlgroups.yamlautomations.yaml等,需要在本地的.homeassistant/中再建一个(一般是/home/{your_username}/.homeassistant/),原来的配置都放在/root/.homeassistant下了。具体需要哪些请在以普通身份运行HA时看终端的输出~下面贴出基本的配置参数:

 1homeassistant:
2  # HA的名字
3  name: RIVERSIDE
4  # 经纬度,用于判断太阳升起落下的时间
5  latitude: !secret latitude
6  longitude: !secret longitude
7  # 海拔
8  elevation: 0
9  # 公制,英制单位
10  unit_system: metric
11  # 时区,请在: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones中查找
12  time_zone: Asia/Shanghai
13  # 个性化设置文件位置,例如改变实体名称,改变在HA中是否可见的状态等等
14  customize: !include customize.yaml
15  packages: !include_dir_named packages
16
17# 开启前端
18frontend:
19
20# 开启配置管理的UI
21config:
22
23# 如果使用 SSL/TLS, 或者运行在 Docker 容器内,请注释掉这个
24http:
25#   旧的验证方式,不安全,但某些插件需要这个密码
26  api_password: !secret http_password
27
28# 系统更新器,会上传主机的参数,详见https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
29updater:
30
31# 自动嗅探新的设备
32discovery:
33
34# 保存设备状态的历史
35history:
36
37#保存HA的日志
38logbook:
39
40# 查看跟踪设备的地图位置
41map:
42
43# 太阳所在的位置
44sun:
45
46# 数据库
47recorder:
48
49# google文字转语音
50tts:
51  - platform: google
52
53# 天气预测,使用yr天气组件预测24小时后的温度
54sensor:
55  - platform: yr
56    forecast: 24
57    monitored_conditions:
58      - temperature
59      - dewpointTemperature
60      - symbol
61
62# 分组、自动化和脚本文件所在的位置
63group: !include groups.yaml
64automation: !include automations.yaml
65script: !include scripts.yaml

如果是在树莓派上,还可以考虑官方的Hass.io,一个基于Docker的HA系统,将镜像烧录到SD卡上就可以即插即用!笔者不考虑Hass.io的原因是希望在树莓派上还可以运行一些别的程序,比如HomeBridge或者媒体中心之类的,因此就选择了手动安装啦~

2. 原理与接入HomeKit

HA的基本原理用其官网的一张图就可以概括:

初探智能家居 Home Assistant

可以看到,HA的核心是Events Bus,它不断侦听和产生不同的事件,就好像心脏不停在跳动一般给HA输送血液;各种不同的组件,如灯、开关、传感器等等的状态通过状态机模块记录,一旦有状态变化就会产生一个“状态变化”事件发送给Event Bus;服务中心侦听Events Bus的服务请求,并根据组件们事先注册好的服务来发送控制指令;计时器模块每秒钟发送“时间变化”事件,就好像时钟电路的上升沿触发作用一样。

核心机制在每个HA系统中都是固定的,而让每个HA与众不同的关键便是:组件(Component)。组件分两种,一种是和各种物联网设备交互的组件,另一种是响应HA中发生的各种事件的组件。例如在上述配置文件configuration.yaml中,sensor:tts:都代表了组件。我们来看看HA中“当太阳下山,而家里有人时打开灯”这一过程中涉及的组件:

初探智能家居 Home Assistant

  1. 第一种组件将不同的物联网设备封装起来,通过统一的接口向外提供状态信息,并在服务中心注册服务使得HA能够控制它们。例如不同类型的开关都可以通过Switch组件接入HA,它们在HA中的状态都是“开/关”,并且都可以呼叫服务对它们进行“打开开关”和“关闭开关”的控制操作。

  2. 第二种组件其实就是一些系统内置和用户自定义的自动化操作,我的理解是将前一种类型组件的状态和这些组件对应的服务进行打包的一个集合。

把HA和上述智能家居层次图进行对比,可以看到HA实际上是Home Control+Home Automation的集合,Smart Home功能并没有实现(毕竟需要大量数据)。展开来看,完整的HA架构和流程如下图所示(以灯组件和开灯自动化为例):

初探智能家居 Home Assistant


因此,HA确实是一个相对复杂的系统(相较于其他几个系统已经好很多了),那么如果想更简单地监测和控制家里的电器,要怎么办呢?这里就不得不说苹果的HomeKit了,真·傻瓜式操作,界面清新。可以将HA和HomeKit进行对接吗?答案是完全可以!这里列举一下使用HA对接HomeKit的几个好处:

  1. 可以用Siri来控制家电啦!

  2. 有一台iPad或者Mac的话,就能作为家庭中心,在外面也能访问HomeKit,进而控制家电。HA的外网接入比较麻烦。

最早将第三方平台接入HomeKit的方法是利用HomeBridge,例如米家网关利用HomeBridge-Mi-Aqara插件接入HomeBridge,从而接入HomeKit。这种方法的限制是只能够一次控制一类家居,比如 HomeBridge-Mi-Aqara 就只能控制米家类家居。而Home Assistant的引入让整个平台更加统一,兼容,因此后来有了HomeBridge-HomeAssistant插件让Home Assistant通过HomeBridge桥接进HomeKit。最后,HomeBridge-HomeAssistant这个东西被抛弃了,Home Assistant选择原生直接接入HomeKit,虽然有一些限制(仅特定的Components能接入,详情看https://www.home-assistant.io/components/HomeKit/#supported-components ,包括开关、传感器、风扇和灯具等等)。下面总结了这三种方法是如何接入HomeKit与用户交互的。

初探智能家居 Home Assistant

那么如何安装HomeBridge呢?首先需要安装Nodejs,然后命令行输入:

1sudo apt-get install libavahi-compat-libdnssd-dev
2sudo npm install -g --unsafe-perm HomeBridge

安装不再维护的HomeBridge-homeassistant插件:

1sudo npm install -g HomeBridge-homeassistant

然后在HomeBridge的配置文件/home/pi/.HomeBridge/config.json中写入:

 1{
2    "bridge": {
3        "name":"HomeBridge",
4        "username":"11:22:33:44:55:66",
5        "port":51826,
6        "pin":"123-45-678"
7    },
8
9"platforms": [
10  {
11    "platform""HomeAssistant",
12    "name""HomeAssistant",
13    "host""http://127.0.0.1:8123",
14    "password""???",

15    "supported_types": ["binary_sensor""climate""cover""device_tracker""fan""group""input_boolean""light""lock""media_player""remote""scene""sensor""switch"]
16  }]
17}

其中,username是树莓派的MAC地址,port是HomeKit的端口默认就好,pin是在 iPhone 上认证 HomeBridge 网关的密码,随喜好输入,而password是在HA中设置的访问密码。最后的supported_types就是你希望支持的组件啦!最后,运行

1HomeBridge -D

即可将HA通过HomeBridge接入HomeKit!那么,HA中原生支持的HomeKit组件怎么添加呢?只需要在配置中写上:

1homekit:

需要注意初次启用HomeKit组件后,HA 主页会出现 PIN 码,若没有出现,删除配置文件夹下 .homekit.state 重试。如果想要让一些HA中的组件不要在HomeKit中出现,只需要在filter域中添加exclude_domainsexclude_entities部分即可,例如:

1homekit:
2  filter:
3    exclude_domains: 
4      - automation
5    exclude_entities:
6      - light._2
7      - binary_sensor.k_no_motion_for_20
8      - binary_sensor.prone_to_wake

3. 设备接入

可以看到,让HA多姿多彩的重要因素是不断扩充的组件大家庭。那么,究竟在配置中要添加哪些组件呢?这还得根据你买了哪些设备来添加。为了缩减配置文件configuration.yaml的规模,同时也是便于管理,可以将配置文件根据组件类型分成不同的几个文件,例如:

 1# 传感器:
2sensor: !include sensor.yaml
3
4# 二进制传感器:
5binary_sensor: !include binary_sensor.yaml
6
7# 灯具
8light: !include lights.yaml
9
10# 开关:
11switch: !include switch.yaml

接下来,开始细说笔者家中有哪些设备,是如何接入HA的~

红外/射频遥控器

为了解决平时找遥控器怎么也找不到的难题,把所有遥控器控制集中在手机上是个不错的选择。目前市面上的遥控器不是红外控制就是射频控制,由于这两个频段不一样(包括射频自己的频段选择),因此诸如小米天猫万能遥控器有时候是不管用的。可以自己购买无线收发模块DIY,但如果追求省事那就购买博联的RM Pro吧!配置很简单,在接入网络获取到ip后,在configuration.yaml里面加入如下字段(以飞利浦电视开关为例):

 1switch:
2  - platform: broadlink
3    host: 'IP_ADDRESS'
4    mac: 'MAC_ADDRESS'
5    timeout: 15
6    switches:
7      # Will work on most Phillips TVs:
8      tv_phillips:
9        friendly_name: "Phillips Tv Power"
10        command_on: 'JgAcAB0dHB44HhweGx4cHR06HB0cHhwdHB8bHhwADQUAAAAAAAAAAAAAAAA='
11        command_off: 'JgAaABweOR4bHhwdHB4dHRw6HhsdHR0dOTocAA0FAAAAAAAAAAAAAAAAAAA='

这里的一大串数字字母组合就是学习到的码,如何获得呢?首先先把模板中字段填好,即command_on: ' 'command_off: ' '部分,保存重启HA。随后进入HA面板中的Services部分,选择switch.broadlink_learn_command这个服务并CALL SERVICE,然后按下你需要学习的遥控器按键,顺利的话在HA面板中的States部分会有一个新的Entity叫做persistent_notification.notification,查看它的message就能看到学习到的码啦,填入之前留空的模板即可!

如果是射频码的学习,稍微有一点麻烦。目前最省事的方法就是在iOS系统中下载易控这个App,按照里面的操作提示,添加你的RM pro,然后进行扫频操作,按下遥控器的按键后扫频即完成。此时再进入HA进行上述的码学习流程即可!

目前加入的遥控设备有:电视(开关,输入源选择,音量大小),阳台自动晾衣杆(照明,上升,下降),自动升降桌(上升,下降),松下遥控吸顶灯。此外,还可以利用HA的cover组件对升降类设备进行cover的模拟(卷帘车库门,自动卷帘窗等等),例如:

 1# 利用博联开关模拟车库门/卷帘窗操作(实际用处不大,因为状态不可控)
2cover:
3  - platform: template
4    covers:
5      garage_door:
6        friendly_name: "升降桌"
7        open_cover:
8          service: switch.turn_on
9          data:
10            entity_id: switch.table_up
11        close_cover:
12          service: switch.turn_on
13          data:
14            entity_id: switch.table_down
15        stop_cover:
16          service: switch.turn_off
17          data:
18            entity_id: switch.table_up

米家产品

虽然对小米其他产品无感,但是一些智能家居的产品还是很不错的!我认为一个原因是收购了一些像yeelight这样的成熟物联网平台,又有一些例如aqara的衍生产业链;另一个是产品的可控性很高,没有为了生态圈而封闭;还有就是价格低廉(一贯特征)!当初是为了门窗传感器入的坑,刚好双十一有个米家智能家居套装的优惠,里面包括了智能网关、门窗传感器、人体传感器、智能开关与智能插座,很实惠就入了。智能插座可以进行功率统计,来完成一些类似于充满电自动断电的环保功能,这里不展开叙述,聊一聊其他的产品。

网关

大部分米家产品都要先接入智能网关才能在米家APP中使用。同样,智能网关是接入HA的桥梁。打开米家APP,先选择智能网关,然后点选右上角的··· ,进入后点关于。这时候,对着空白地方不断点击,就会出现局域网通信协议网关信息选项,是不是和Android开启开发者选项很像!打开局域网通信协议,记住局域网通信协议密码以及网关的 MAC 地址,填入配置文件中:

1xiaomi_aqara:
2  gateways:
3    - mac: ???
4      key: ???

网关除了桥接作用,还有很方便的地方便是自带的光照传感器,Alarm以及亮灯功能。光照传感器作为是否需要开灯的先决条件特别重要,Alarm可以作为开门的门铃声,而灯泡可以和人体传感器结合做成自动夜灯。

门窗传感器

其实就是两块磁铁+传感+无线传输,因此买一个门磁套件+ESP8266自己DIY成本不过20人民币!但米家的这个还是很不错的~

人体传感器

也是可以DIY的低成本产品,放在大概1米~2米的位置,倒立着放90度放都是可以的!但是需要注意一下几个雷区:

  1. 不能隔着玻璃!即使能被看见。

  2. 感应到有人以后一分钟以内都是进入冻结状态的,无法进行感应。

  3. 不要用于关灯的逻辑!非常尴尬。做饭做一半、洗澡洗一半、上厕所上一半就进入黑夜的感觉很不好!因为总是无法规避有bug,或者一动不动的时候会不会误伤自己。

贴墙式开关

非嵌入式开关,因此灵活性很高,可以有单击、双击、长按三种events。结合Automation可以衍生出无数种events!

86嵌入式墙壁开关

有两种版本,一种是单火线版,一种是零火线版。据论坛上所说后者更加便宜且稳定性更高,但实际家中装修没有留出零线,因此买这类产品前一定要先拆开原来的开关看看线的情况!

另一种问题就是双控开关无法直接替换,因此如果这个开关和另一个开关共同控制负载,那么最好保留原状!一定要改装的话,可以采用一边嵌入式86开关,一边用上述的贴墙式开关,就可以实现联动了!但是原来的那些线就没有用了,且要直接短接掉(操作特别注意,小心用电安全!)。一种常见的双控开关设置如下所示,改装时候可以参考。

小米空净

空净选择小米的原因,一是性价比(打折时候入),二是可以很好地被HA支持。先将小米空净接入米家APP得到ip地址,随后参考Retrieving the access token获得access token,最后在配置中加入:

1fan:
2  - platform: xiaomi_miio
3    friendly_name: "???"
4    model: zhimi.airpurifier.v6
5    host: ???
6    token: ???

就可以像控制风扇一样控制开关和风速啦!

此外,小米空净内置的三个传感器:温度,湿度与AQI也可以被利用起来!利用HA的Template sensor模块将xiaomi_miio的attributes抽离出来:

 1- platform: template
2    sensors:
3      xiaomi_ap_aqi:
4        friendly_name: AQI
5        value_template: "{{ states.fan.xiaomi_miio_device.attributes.aqi }}"
6        unit_of_measurement: AQI
7  - platform: template
8    sensors:
9      xiaomi_ap_temp:
10        friendly_name: "温度"
11        value_template: "{{ states.fan.xiaomi_miio_device.attributes.temperature }}"
12        unit_of_measurement: °C
13        device_class: temperature        
14  - platform: template
15    sensors:
16      xiaomi_ap_humidity:
17        friendly_name: "湿度"
18        value_template: "{{ states.fan.xiaomi_miio_device.attributes.humidity }}"
19        unit_of_measurement: "%"
20        device_class: humidity

ESP8266

ESP8266是个好东西,简单理解就是一个带有Wi-Fi模块的廉价微控制器。淘宝一个Nodemcu lua v3只需要13块钱,就可以DIY出各种智能家居设备了!例如和继电器相接控制家里各自电器,或者利用GPIO接入各种类型传感器。根据需要的逻辑,对芯片进行烧写c代码,其风格让我想起了当年电子设计竞赛!

有没有更简单的方法呢?有,就是直接利用串口烧写现成的一些成熟系统,例如ESPEasy和ESPHome,然后就可以在网页上任意配置了!结合MQTT服务,可以让Nodemcu成为数据转发中心,但是我对MQTT不是非常了解,只得作罢。当前,仅用于控制简单的LED灯带而已,操作非常简单:先按照教程刷入ESPEasy,初始化后得到Nodemcu的ip地址,然后就可以在浏览器中输入简单的http请求来控制MCU的GPIO啦!例如输入http://{ip_address}/control?cmd=GPIO,12,1就可以让GPIO12拉出高电平了!接下来,在HA中添加command_line的开关组件:

1switch http:
2  - platform: command_line
3    switches:
4      lightwall:
5        friendly_name: "???"
6        command_on: 'curl -k "http://???/control?cmd=GPIO,12,1"'
7        command_off: 'curl -k "http://???/control?cmd=GPIO,12,0"'

Device Tracker

如何知道家中的成员是否在家?可以考虑使用GPS,蓝牙,摄像头…当然,这其中最省心的方法便是查看谁连接了家里的Wi-Fi!那么怎么知道家里Wi-Fi的连接情况呢?比较通用的方法是利用Nmap模块来不断嗅探,例如:

1device_tracker:
2  - platform: nmap_tracker
3    hosts: 192.168.1.0/24
4    home_interval: 10
5    exclude:
6     - 192.168.???.???
7     - 192.168.???.???

如果家里的路由器恰好使用Netgear或者Asuswrt,那么更为有效且方便的方法是:

1device_tracker:
2  - platform: netgear
3    host: ???
4    username: ???
5    interval_seconds: 10
6    consider_home: 180
7    new_device_defaults:
8      track_new_devices: false
9      hide_if_away: false

或者:

1asuswrt:
2  host: ???
3  username: ???
4  ssh_key: path_to_sshkey

这里使用ssh而不是密码的原因是为了安全,需要在路由器的控制中心中打开ssh访问(LAN only)。

具体每个device是否要track,使用什么图片作为头像,别名等等,都可以在known_devices.yaml这个配置文件里面得到编辑。

摄像头

把相机作为摄像头输入,可以使用ffmpeg或者mjpeg。以ffmpeg为例,首先从源码编译带有h264和omx的选项,即

1sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree  --enable-omx --enable-omx-rpi

然后在配置中加入:

1 ffmpeg:
2  ffmpeg_bin: '/usr/local/bin/ffmpeg'

注意替换成你的ffmpeg安装位置。对于usb摄像头,可以在/dev/下看看是video多少的编号,然后在配置中输入:

1 - platform: ffmpeg
2    name: webcam
3    input: -f v4l2 -r 30 -i /dev/video0

笔者家里没有usb摄像头,倒是有一个海康萤石的安防摄像头,如何接入呢?有两种方法。第一种是利用萤石摄像头自带的rtsp协议接入HA,也是用的ffmpeg模块。

1camera:
2  - platform: ffmpeg
3    name: ezviz
4    input: -rtsp_transport tcp -i rtsp://admin:???@???/h264/ch1/main/av_stream

第二种方法是参考,首先在HA配置文件夹中新增custom_components/camera/文件夹,放入ezviz.py文件,随后在配置文件中加入:

1camera:
2  - platform: ezviz
3     name: "ezviz"
4     id: "???"
5     key: "???"
6     sec: "???"

其中,name是设备名,deviceid(设备序列号)见 https://open.ys7.com/console/device.html ,appkey和appsecret见 https://open.ys7.com/console/application.html 。原理就是每隔30秒调用萤石的api取一次设备图像,这个时间间隔可以在ezviz.py中修改。

虽然在HA中添加了摄像头,但是其图像并不能在HomeKit中显示,因为这一部分目前还没有得到实现,怎么办呢?只能退而求其次,用HomeBridge来为摄像头桥接了。安装Camera-ffmpeg插件:

1sudo npm install -g HomeBridge-camera-ffmpeg

安装后,修改HomeBridge的配置config.json如下:

 1{
2    "bridge": {
3        "name":"HomeBridge",
4        "username":"11:22:33:44:55:66",
5        "port":51826,
6        "pin":"123-45-678"
7 },
8"platforms": [
9      {
10      "platform""Camera-ffmpeg",
11      "cameras": [
12        {
13          "name""EZVIZ",
14          "videoConfig": {
15              "source""-rtsp_transport tcp -i rtsp://admin:???@???:554/h264/ch1/main/av_stream",
16              "maxStreams"2,
17              "maxWidth"640,
18              "maxHeight"480,
19              "maxFPS"30           
20          }
21        }]}
22]
23}

运行HomeBridge后就可以在HomeKit中根据上面的pin添加摄像头啦~

FFmpeg还有另外一个功能,那就是运动检测,怎么做到呢?因为现在的视频压缩算法需要判断当前的画面和之前画面的差别,如果差别很大就会产生一个新的场景(scene),这一特性刚好可以用来判断静止的相机画面中是否有运动。正好,HA中就有一个FFmpeg Motion的组件:

1# ffmpeg motion组件,根据视频压缩中scene change的特性进行画面中的运动检测,详见https://www.home-assistant.io/components/binary_sensor.ffmpeg_motion/
2- platform: ffmpeg_motion
3  input: rtsp://admin:???@???/h264/ch1/main/av_stream
4  changes: 2
5  extra_arguments: -filter:v "crop=in_w/2:in_h:in_w/2:0"

Media player

之前捣鼓过利用树莓派DIY智能音箱,体验非常差,于是乎听歌还是老老实实手机连接蓝牙音箱。在HA中,也可以指定外接音箱播放特定语音来达到反馈的目的。

media_player组件可以在HA中虚拟出一个播放器,这个播放器和tts(Text to speech)结合就可以让HA说出任何想说的话!首先需要添加一个media_player的运行引擎,我个人喜欢用vlc,最好用的跨平台播放器!首先在树莓派中安装vlc,然后在HA配置中添加:

1media_player:
2  - platform: vlc

针对tts的HA组件默认使用的是google,即:

1tts:
2   - platform: google

调用tts.google_say服务即可!google的tts非常棒,但是不能说中文,因此如果想要中文的话可以去百度语音平台申请一个免费的应用,用于这里的tts!配置如下:

1tts:
2  - platform: baidu
3    app_id: ???
4    api_key: ???
5    secret_key: ???

这样,调用tts.baidu_say服务就可以说话啦!虽然依然存在不足,比如不能有标点符号,比如不能说英文了……

4. 自动化(Automation)

自动化是HA的重头戏!智能家居是否“智能”就体现在这里了。基本的自动化有三个要素:

  1. Trigger
    自动化触发的事件!是必须要有的环节。例如:“灯从关闭状态到打开状态”,“温度低于18度时”,“Home Assistant初次运行时”,这些都是可以作为触发的事件,重点在于“状态的改变”。

  2. Condition
    环境条件,与trigger不同,重点在“当前状态”。例如,“当前太阳落山”,“当前开着”,都是环境状态条件。

  3. Action
    运行一系列操作!例如打开灯,关闭风扇等等。

常常有人会把Trigger和Condition搞混,其实很好理解,看看官网上怎么说的:

Triggers look at the actions, while conditions look at the results: turning a light on versus a light being on.

接下来,举几个笔者写在automation.yaml里的例子,并加以说明:

  1# 回家时打开客厅和厨房的灯,并根据门口监控判断回来的是谁,播放欢迎词。判断回家的条件是:门窗传感器打开,并且此时室内无人,光照度小于250。
 2- id: id1
 3  alias: Back home
 4  trigger:
 5  - platform: state
 6    entity_id: binary_sensor.door_window_sensor_158d00023137b7
 7    from: 'off'   
 8    to: 'on'
 9  condition:
10  - condition: numeric_state
11    entity_id: sensor.illumination_7c49eb17e992
12    below: 250
13  - condition: state
14    entity_id: binary_sensor.motion_sensor_kitchen
15    state: 'off'
16  action:
17  - entity_id: switch.kitchen_left
18    service: switch.turn_on
19  - entity_id: light._5
20    service: light.turn_on
21  - service: shell_command.recog_people
22# 睡觉时候,让空气净化器进入睡眠模式。当前判断睡觉的条件是贝叶斯传感器的睡觉概率。
23- id: id2
24  alias: Good night
25  trigger:
26  - platform: state
27    entity_id: binary_sensor.sleeping
28    from: 'off'
29    to: 'on'
30  condition:
31  - condition: state
32    entity_id: fan.xiaomi_miio_device
33    state: 'on'
34  action:
35    service: fan.set_speed
36    data:
37      entity_id: fan.xiaomi_miio_device
38      speed: Silent
39# Home Assistant开机时,音量调到最大。这是vlc的一个bug修复自动化...
40- id: id3
41  alias: Startup
42  trigger:
43  - event: start
44    platform: homeassistant
45  condition: []
46  action:
47  - service: media_player.volume_set
48    data:
49      entity_id: media_player.vlc
50      volume_level: 0.99
51  - service: cover.close_cover
52    entity_id: cover.garage_door
53  - service: switch.turn_off
54    entity_id: switch.table_down
55# 如果AQI高于73,打开空气净化器并调整至最强风。
56- id: id4
57  alias: Turn on air purifier
58  trigger:
59  - platform: numeric_state
60    above: '73'
61    entity_id: sensor.filtered_pm25
62  condition:
63  - condition: state
64    entity_id: binary_sensor.sleeping
65    state: 'off'
66  - condition: state
67    entity_id: fan.xiaomi_miio_device
68    state: 'off'
69  action:
70  - service: fan.turn_on
71    entity_id: fan.xiaomi_miio_device
72  - service: fan.set_speed
73    data:
74      entity_id: fan.xiaomi_miio_device
75      speed: Favorite
76# 如果AQI小于68,关掉空气净化器。
77- id: id5
78  alias: Turn off air purifier
79  trigger:
80  - platform: numeric_state
81    below: '68'
82    entity_id: sensor.filtered_pm25
83  condition:
84  - condition: state
85    entity_id: binary_sensor.sleeping
86    state: 'off'
87  - condition: state
88    entity_id: fan.xiaomi_miio_device
89    state: 'on'
90  action:
91    service: fan.turn_off
92    entity_id: fan.xiaomi_miio_device
93# 如果有人单击无线开关,改变阳台灯的状态(开/关)
94- id: id6
95  alias: Toggle balcony light
96  trigger:
97  - platform: event
98    event_type: xiaomi_aqara.click
99    event_data:
100      click_type: single
101      entity_id: binary_sensor.switch_balcony
102  condition: []
103  action:
104    service: switch.toggle
105    entity_id: switch.balcony_light
106# 在太阳下山时,如果阳台有人,且灯是关闭状态,则把阳台灯打开。
107- id: id7
108  alias: Turn on balcony light
109  trigger:
110  - entity_id: binary_sensor.motion_sensor_balcony
111    from: 'off'
112    platform: state
113    to: 'on'
114  condition:
115  - condition: state
116    entity_id: switch.balcony_light
117    state: 'off'
118  - condition: state
119    entity_id: sun.sun
120    state: 'below_horizon'
121  action:
122  - entity_id: switch.balcony_light
123    service: switch.turn_on
124# 来自小米智能网关的光照传感器bug:当前光照会和前100次采样结果进行平均,因此数据更新经常延时。通过每3分钟不断开关智能网关的夜灯来强制更新采样结果。
125- id: id8
126  alias: Update lumen sensor
127  trigger:
128  - platform: time
129    minutes: /3
130    seconds: 0
131  action:
132  - data:
133      brightness: 2
134      entity_id: light.gateway_light
135    service: light.turn_on
136  - delay:
137      seconds: 1
138  - entity_id: light.gateway_light
139    service: light.turn_off
140# 早上Zoey出门十分钟后,把主卧插座给关了。
141- id: id9
142  alias: Turn off charging power
143 trigger:
144  - entity_id: binary_sensor.door_window_sensor_158d00023137b7
145    for: 
146      minutes: 10
147    from: 'on'
148    platform: state
149    to: 'off'
150  condition:
151  - condition: state
152    entity_id: switch.plug_158d000237cd54
153    state: 'on'
154  - condition: state
155    entity_id: device_tracker.zoey
156    state: not_home
157  action:
158  - entity_id: switch.plug_158d000237cd54
159    service: switch.turn_off

5. 进阶部分

5.1 数据优化

有时候,传感器的数值在某个时间会突然跳动很厉害,造成某些自动化的误触发(比如上述的空气质量差时自动打开空净),这时候就要使用一些方法来去掉这些outliers,或者通过滤波来让数据更加平滑。例如,可以使用Statistics sensor模块来控制:

 1sensor:
2  - platform: template
3    sensors:
4      xiaomi_ap_aqi_raw:
5        friendly_name: AQI Raw
6        value_template: "{{ states.fan.xiaomi_miio_device.attributes.aqi }}"
7        unit_of_measurement: AQI
8  - platform: statistics
9    name: "xiaomi_ap_statistics"
10    entity_id: sensor.xiaomi_ap_aqi_raw  
11  - platform: template
12    sensors:                          
13      xiaomi_aqi_mean:
14        unit_of_measurement: AQI
15        value_template: "{{ states.sensor.xiaomi_ap_statistics.attributes.mean }}"

除了mean,还有min,max,median,STD等参数可以得到统计!另一种方法便是使用Filter sensor模块来滤波,例如:

 1sensor:
2 - platform: template
3    sensors:
4      xiaomi_ap_aqi_raw:
5        friendly_name: AQI Raw
6        value_template: "{{ states.fan.xiaomi_miio_device.attributes.aqi }}"
7        unit_of_measurement: AQI
8  - platform: filter
9    name: "Filtered AQI"
10    entity_id: sensor.xiaomi_ap_aqi_raw
11    filters:
12      - filter: lowpass
13        time_constant: 10
14      - filter: time_simple_moving_average
15        window_size: 00:05
16        precision: 2

效果如下,能够最大程度减少误触发!

初探智能家居 Home Assistant

5.2 数据库替换

HA原生的SQLite数据库有时候太慢啦!能不能替换成别的数据库呢?这里介绍一下如何替换成PostgreSQL数据库,参考墨澜的博客。首先安装PostgreSQL:

1sudo apt-get install postgresql postgresql-server-dev-9.6
2sudo pip3 install psycopg2

其中postgresql-server-dev版本号自查。然后创建PostgreSQL数据库,这里沿用HA的用户名(例如用户名为pi),密码假设设为raspberry,那么:

1sudo -u postgres createuser pi
2sudo -u postgres psql
3ALTER USER pi WITH PASSWORD 'raspberry';
4q

之后创建名为homeassistant的数据库:

1sudo -u postgres createdb -O pi homeassistant

在HA的配置文件中,加入:

1recorder:
2  db_url: postgres://pi:raspberry@localhost/homeassistant

重启即可体验飞一般的感觉~

5.3 与开放AI平台结合

AI应用的例子:如何在开门时进行人形识别,判断是谁回来了,并且播放欢迎词?以下以百度AI的人体分析为例。

首先,去ai.baidu.com申请一个开发账号,在人工智能-人体分析中创建一个新的应用,获得Api Key和Secret Key。然后,在本地新建一个python文件,例如body_recognition.py。利用api key和secret key获得一个可用的token:

1import requests
2
3apikey_baidu = '???'
4apisecret_baidu = '???'
5
6host_baidu_token = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials'
7token_baidu = requests.post(host_baidu_token, data={'client_id':apikey_baidu, 'client_secret':apisecret_baidu}).json()

然后,获取一张当前摄像头的图片,并且转换为Base64编码(百度人体识别api的要求,但类似于萤石开放平台的人体识别api就可选直接输入图片url,然而笔者写下这段话的时候该功能还未开通…)。图片转换为Base64编码的方法很简单,在python的base64库中就可以利用b64encode方法来进行编码。那么图片如何获取呢?有两种方法,一种是利用摄像头自带的rtsp协议地址,让ffmpeg来帮你截图。这里利用subprocess来运行外部指令:

1from subprocess import call
2import base64
3
4call(["ffmpeg""-i""rtsp://{username}:{password}@{ip_address}:554/h264/ch1/main/av_stream""-f""image2""-t""0.001""-y""/home/pi/tmpimg/snapshot.jpg"])
5with open("/home/pi/tmpimg/snapshot.jpg""rb"as f:
6  base64_data = base64.b64encode(f.read())

或者,利用萤石开放平台的api获得当前截图的网络地址,同样需要获得设备的序列号和accessToken,具体方法不展开,请到open.ys7.com查找:

1result = requests.post('https://open.ys7.com/api/lapp/device/capture', data={'accessToken':'???','deviceSerial':'???','channelNo':1}).json()
2if (result['code']=='200'):
3  imgurl = result['data']['picUrl']
4else:
5  imgurl = ''
6base64_data = base64.b64encode(io.BytesIO(requests.get(imgurl).content).read())

不管用何种方法得到base64编码后的图片,接下来都可以上传到服务器上进行识别啦!

1host_baidu_body = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr'
2result = requests.post(host_baidu_body, data={'access_token':token_baidu['access_token'],'image':base64_data, 'type''gender,age,glasses'}).json()

这里的type可以选取你想要得到的信息,我想要得到的是性别、年龄和是否戴眼镜。所有可选的属性包括以下几种,虽然大部分的用处都不多:

 1gender-性别,
2age-年龄阶段,
3lower_wear-下身服饰,
4upper_wear-上身服饰,
5headwear-是否戴帽子,
6glasses-是否戴眼镜,
7upper_color-上身服饰颜色,
8lower_color-下身服饰颜色,
9cellphone-是否使用手机,
10upper_wear_fg-上身服饰细分类,
11upper_wear_texture-上身服饰纹理,
12orientation-身体朝向,
13umbrella-是否撑伞;
14bag-背包,
15smoke-是否吸烟,
16vehicle-交通工具,
17carrying_item-是否有手提物,
18upper_cut-上方截断,
19lower_cut-下方截断,
20occlusion-遮挡

为了防止截图中没有人,设置一个循环直到上述返回值中person_num参数不为0,并设置一个timeout参数控制循环上限:

1timeout = 10
2while result['person_num'] == 0:
3  call(["ffmpeg""-i""rtsp://{username}:{password}@{ip_address}:554/h264/ch1/main/av_stream""-f""image2""-t""0.001""-y""/home/pi/tmpimg/snapshot.jpg"])
4  with open("/home/pi/tmpimg/snapshot.jpg""rb"as f:
5    base64_data = base64.b64encode(f.read())
6  result = requests.post(host_baidu_body, data={'access_token':token_baidu['access_token'],'image':base64_data, 'type''gender,age,glasses'}).json()
7  timeout = timeout-1
8  if timeout == 0:
9      quit()

接下来,调用HA的service!这里需要import一个叫做homeassistant.remote的模块,然后传递HA的api密码(即在设置中的api_password),接着就可以自由呼叫服务了!以判断性别和人数为例,让HA报出不同的欢迎词:

 1import homeassistant.remote as remote
2
3api = remote.API('127.0.0.1''{api_password}')
4domain = 'tts'
5entity_id = 'media_player.vlc'
6message1 = "欢迎你们"
7message2 = "欢迎女主人"
8message3 = "欢迎男主人"
9message4 = "欢迎回家"
10
11if result['person_num'] > 1:
12  remote.call_service(api, domain, 'baidu_say', {'entity_id': entity_id, 'message': message1})
13elif result['person_info'][0]['attributes']['gender']['score'] < 0.75:
14  remote.call_service(api, domain, 'baidu_say', {'entity_id': entity_id, 'message': message4})
15elif result['person_info'][0]['attributes']['gender']['name'] == "女性":
16  remote.call_service(api, domain, 'baidu_say', {'entity_id': entity_id, 'message': message2})
17else:
18  remote.call_service(api, domain, 'baidu_say', {'entity_id': entity_id, 'message': message3})

那么,怎么运行这个外部的脚本呢?需要使用到Shell Command组件。在configuration.yaml里面加入:

1shell_command:
2  body_recognition: python3 /home/pi/body_recognition.py

这样,在HA的自动化中就可以用service: shell_command.body_recognition来调用这个脚本啦~

5.4 Variable的使用与贝叶斯传感器

详见Useful Sensor: Bayesian Sleep Detection in Home Assistant 和 Useful Sensor: Motion Last Seen & Meta Motion Sensor 两篇文章。

在配置中添加variable组件:

1# 变量控制,详见https://github.com/rogro82/hass-variables
2variable:  
3  last_motion:
4    value: 'Unknown'
5    restore: true
6    attributes:
7      icon: mdi:alarm
8      friendly_name: 'Last Motion'

然后在自动化文件中添加自动化:

 1# 房间内最后有人移动出现在哪里?
2- id: id10
3  alias: Update Last Motion
4  trigger:
5    - platform: state
6      entity_id: binary_sensor.motion_sensor_toilet, binary_sensor.motion_sensor_balcony, binary_sensor.motion_sensor_kitchen, binary_sensor.ffmpeg_motion
7      to: 'on'
8  action:
9    - service: variable.set_variable
10      data:
11        variable: last_motion
12        attributes_template: >
13            {
14              "history_1": "{{ variable.state }}",
15              "history_2": "{{ variable.attributes.history_1 }}",
16              "history_3": "{{ variable.attributes.history_2 }}"
17            }
18      data_template:
19        value: "{{ trigger.to_state.attributes.friendly_name }}"

在配置文件中添加基于贝叶斯传感器组件的睡眠传感器

 1# 贝叶斯传感器检测是否睡觉,详见https://www.home-assistant.io/components/binary_sensor.bayesian/
2binary_sensor:
3  - platform: bayesian
4    prior: 0.33
5    name: 'Sleeping'
6    probability_threshold: 0.85
7    observations:
8      - entity_id: 'variable.last_motion'
9        prob_given_true: 0.1
10        prob_given_false: 0.8
11        platform: 'state'
12        to_state: 'FFmpeg Motion'
13      - entity_id: 'variable.last_motion'
14        prob_given_true: 0.6
15        prob_given_false: 0.2
16        platform: 'state'
17        to_state: 'Toilet Motion'
18      - entity_id: 'variable.last_motion'
19        prob_given_true: 0.45
20        prob_given_false: 0.3
21        platform: 'state'
22        to_state: 'Kitchen Motion'
23      - entity_id: 'group.all_light'
24        prob_given_true: 1.0
25        prob_given_false: 0.8
26        platform: 'state'
27        to_state: 'off'
28      - entity_id: 'device_tracker.zoey'
29        prob_given_true: 1
30        prob_given_false: 0.625
31        platform: 'state'
32        to_state: 'not_home'
33      - entity_id: 'device_tracker.simon'
34        prob_given_true: 0.8
35        prob_given_false: 0.625
36        platform: 'state'
37        to_state: 'not_home'
38      - entity_id: 'sensor.illumination_7c49eb17e992'
39        prob_given_true: 0.8
40        prob_given_false: 0.4
41        platform: 'numeric_state'
42        below: 100
43      - entity_id: 'binary_sensor.prone_to_wake'
44        prob_given_true: 0.3
45        prob_given_false: 0.7
46        platform: 'state'
47        to_state: 'on'
48      - entity_id: 'switch.plug_158d000237cd54'
49        prob_given_true: 0.7
50        prob_given_false: 0.5
51        platform: 'state'
52        to_state: 'on'
53      - entity_id: 'binary_sensor.k_no_motion_for_20'
54        prob_given_true: 1
55        prob_given_false: 0.825
56        platform: 'state'
57        to_state: 'on'
58      - entity_id: 'binary_sensor.b_no_motion_for_20'
59        prob_given_true: 1
60        prob_given_false: 0.825
61        platform: 'state'
62        to_state: 'on'
63      - entity_id: 'binary_sensor.t_no_motion_for_20'
64        prob_given_true: 1
65        prob_given_false: 0.825
66        platform: 'state'
67        to_state: 'on'

其中,可能醒着的时间段和每个地方是否无人超过20分钟是通过模版实现的:

 1binary_sensor:
2  # 可能醒着的时间段(睡眠时间段的反)
3  - platform: template
4    sensors:
5      prone_to_wake:
6        value_template: {% raw %}'{{ states.sensor.time.state > "09:00" and states.sensor.time.state <= "21:59"}}'{% endraw %}
7  # 20分钟无人二进制传感例子
8  - platform: template
9    sensors:
10      k_no_motion_for_20:
11        value_template: {% raw %}'{{states.binary_sensor.motion_sensor_kitchen.attributes["No motion since"] | int >= 1200}}'{% endraw %}

为了Debug,可以随时监测贝叶斯传感器的触发概率:

1# 贝叶斯睡觉传感器的概率记录,用于debug
2sensor:
3  - platform: template
4    sensors:
5      sleeping_probability:
6        friendly_name: "睡觉概率"
7        value_template: {% raw %}"{{ states.binary_sensor.sleeping.attributes.probability | float * 100 }}"{% endraw %}
8        unit_of_measurement: "%"