You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
19 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 15 | 平台:智能家居开源平台的生态是怎样的?
你好,我是郭朝斌。
在学完了这门课程的前十几讲之后,你已经对物联网有了一个从整体到细节的全面了解。我想,你现在应该迫不及待地想要动手实践了吧?
在正式进入实战篇之前,我想以智能家居领域为例,带你了解一下开源平台。
## 智能家居:生态开放
为什么选择智能家居这个领域呢?最重要的原因当然是因为实战篇的动手项目是智能家居领域的。而另一个原因是,智能家居的生态环境比较开放,很有活力,而且也更贴近我们的日常生活。
在[第9讲](https://time.geekbang.org/column/article/313631),我提到过和工业物联网相关的一些开源项目。相比之下,工业物联网领域更加封闭,如果不是行业从业人员,你很难理解它的功能需求。
那么,什么是平台,平台有什么用呢?就拿智能家居平台来说好了,它给各种智能家居产品提供了一个**统一的接入系统**,让用户可以**管理**和**控制**产品,同时也为各种智能家居产品之间的**联动**提供了条件。
如果没有智能家居平台,那么各种智能家居产品就是一个个孤立的单品,既不能远程控制,也不能实现联动功能。
如果你买过小米的智能产品应该接触过小米的米家平台它就是一个典型的智能家居平台。国内类似的还有阿里巴巴的天猫精灵、京东微联和海尔U+等。国外知名的智能家居平台有苹果的Apple HomeKit、亚马逊的Amazon Echo和谷歌的Google Home等。
## 开源平台:方便定制
不过,刚才提到的这些都是商业公司运营的平台,它们使用的技术和通信协议都是公司制定的,能够选择的产品也只能是已经接入平台的产品。作为开发实践者,我们可以定制的部分非常少。
所以在这一讲,我想介绍一下智能家居的开源平台生态。
一方面,开源平台能为你提供一个现成的基础,你可以在这个基础上快速地搭建出自己的智能家居系统。而且这些平台不但可以提供丰富的特性,一般也会提供各种定制能力,方便你基于自己的需求灵活地调整。
另一方面,就算你在工作中不直接使用这些开源平台,你也可以从它们的架构设计和实现逻辑中汲取灵感。
在介绍完智能家居的开源生态之后,我还会选择其中一个开源平台,带你在树莓派开发板上运行起来,这样你也可以初步体验一下智能家居软件。
## 热度比较高的开源平台
那么你觉得智能家居的开源平台多吗?我告诉你,其实非常多。这也从侧面反映出智能家居是一个非常被看好的领域。
在这一讲中把所有的开源项目都讲一遍是不现实的所以我精心挑选了5个热度比较高的项目介绍供你参考。
1. #### Home Assistant
首先要说的就是[Home Assistant](https://www.home-assistant.io/)。由于支持丰富的硬件和软件组件能够实现自由灵活的配置和定制开发所以它是现在热度最高的开源平台。大量极客用户组成了庞大而活跃的社群他们贡献了很多基于Home Assistant的开源组件和丰富的使用资料。
这些组件要怎么配置呢在Home Assistant中你需要通过configuration.yaml配置文件来定义你需要使用的组件以及组件之间的联动方式等。
从文件的扩展名你应该可以看出,它的配置文件使用的是[YAML语言](https://yaml.org/)。这种语言是专门为配置文件设计的写起来比JSON要简单得多。
另外Home Assistant是基于Python 3语言实现的理论上支持在任何有Python 3的系统环境中运行当然也包括树莓派。它对于树莓派的支持非常好。
虽然是开源软件但是我们也需要注意开源许可协议。Home Assistant的代码采用的是[Apache License 2.0](https://github.com/home-assistant/core/blob/master/LICENSE.md)协议。
2. #### Domoticz
第2个要讲的是[Domoticz](https://www.domoticz.com/)它是一个开源的家居自动化平台可以帮你实现对智能家居设备和传感器的控制和监测等目的。除了它原生支持的设备你还可以使用很多开源插件。当然你也可以选择用Python语言开发自己的插件从而支持自己特有的设备。
Domoticz主要是通过Web界面来进行自定义和配置。它还同时提供了iOS和Android两大系统的App供你查看和控制设备。
Domoticz是基于C++语言开发的。跟Python语言开发的软件不同它还需要编译不同的安装包这显然不够方便。不过Domoticz官方已经为Windows和Linux系统准备了二进制安装包包括使用ARM架构芯片的树莓派也已经有了编译好的可执行文件。
Domoticz代码采用的是[GNU General Public License v3.0](https://github.com/domoticz/domoticz/blob/master/License.txt)GPLv3开源协议。
3. #### openHAB
第3个要讲的是openHAB。它的出发点是提供一个家庭自动化的总线所以在设计上尽量抽象而模糊设备本身便于你根据需求添加设备和插件。在openHAB中插件是通过Bindings来实现设备和openHAB内核的交换信息的。
交互界面方面openHAB也提供了丰富的选择包括原生的iOS和Android平台的App以及Web页面和Windows 10应用程序等。
openHAB是基于Java语言开发的。除了常见的电脑平台它还支持用Docker镜像的方式安装使用。另外它还专门提供了openHABian系统的镜像文件所以在树莓派上使用openHAB软件是非常方便的。
openHAB代码采用的是[Eclipse Public License 2.0](https://github.com/openhab/openhab-core/blob/master/LICENSE)开源协议。
4. #### Gladys Assistant
第4个要讲的是[Gladys Assistant](https://gladysassistant.com/en/)。它是一个刚刚重新设计和开发的智能家居平台。它原生支持Z-Wave、MQTT和小米等设备接口并且在平台中嵌入了自己的 NLP自然语言处理对话引擎。你可以在平台上定义复杂的场景模式。
Gladys Assistant的主要交互界面是Web页面。不过这些Web界面在手机上的体验也非常好因为它是基于PWAProgressive Web App实现的。PWA技术使Web应用在手机的体验基本和原生App一致。
Gladys Assistant使用JavaScript语言实现的。它对于树莓派的支持非常不错提供了基于Raspbian的系统镜像。另外通过Docker的方式对MacOS和Windows系统也提供了支持。
Gladys Assistant代码采用的是 [Apache License 2.0](https://github.com/GladysAssistant/Gladys/blob/master/LICENSE)开源协议。
5. #### WebThingsIO
不知道你是否还记得,我在加餐的书单推荐中提到过[WoT](https://www.w3.org/WoT/)标准。这里我要介绍的[WebThingsIO](https://iot.mozilla.org/)项目正是Mozilla在领导开发的一个基于WoT理念的开源实现。
其中WebThings Gateway是一个智能家居网关软件也就是控制中心实现你可以使用它提供的Web界面来实现对设备的查看和控制。它也支持定义联动的规则还提供了用插件方式来扩展对其他设备的支持。
WebThings Gateway主要是使用JavaScript语言实现的。它为树莓派专门制作了系统镜像文件你可以直接烧录使用。对于常用的Linux系统也可以直接通过软件包管理器安装使用。
WebThings Framework是一个软件组件集合你可以基于这些组件来开发支持[Web Thing API](https://iot.mozilla.org/wot/)的硬件设备。它有不同的编程语言实现包括Node.js、Python包括MicroPython、Java、Rust、C++Arduino实现
WebThingsIO的代码采用的是[Mozilla Public License 2.0](https://github.com/WebThingsIO/gateway/blob/master/LICENSE)开源协议。
这里我把这5个开源的智能家居平台的特性总结为一个表格方便你随时参考。
![](https://static001.geekbang.org/resource/image/3f/6a/3f957676a982afacb7619925ed19986a.jpg)
## Gladys Assistant具体使用动手实践
这5个比较有代表性的智能家居开源平台对于树莓派的支持都不错的。现在我们就开始动手在树莓派上安装一个开源平台体验一下通过智能家居系统监测设备数值的过程。
使用哪个平台呢我们就选择Gladys Assistant吧。它的优势是Web页面在手机上体验不错不需要你去搜索或者编译手机上的App了。
其他几个开源平台的安装和使用方法都差不多。你掌握了一个,那么利用镜像文件安装其他几个也不成问题。
### 第一步:准备器材
首先我介绍一下需要准备的器材有哪些:
1. **树莓派Raspberry Pi 4B**要求内存2GB以上但是8GB内存版本要谨慎选择因为有些开源平台软件对Arm 64bit芯片支持不够好。
2. **供电电源**要求支持3A以上电流。
3. **Micro SD卡**也叫TF卡存储容量最好在16GB以上。在选择的时候你要关注读写速度等级比如U3表示最低写入速度是30MB/s。同时你也要关注[应用性能等级](https://www.sdcard.org/chs/developers/overview/application/index.html)它定义了Micro SD卡进行随机读写的性能最好是选择Application Performance Class 2卡面上标识A2图标。在卡上存储应用程序和应用程序数据时这个性能指标非常重要。
![](https://static001.geekbang.org/resource/image/f4/66/f4928d8a87bde8b4e235b8cdf057d266.jpg)
4. **Micro SD卡读卡器**。有些电脑自带这个接口,如果没有的话,你可以买一个便宜的使用。
5. **普通网线**。如果你希望以有线的方式使用树莓派可以准备一根。同时我也会介绍树莓派接入Wi-Fi的方式。
### 第二步:烧录系统镜像
树莓派板子在启动的时候会从SD卡读取操作系统镜像文件完成操作系统的引导启动工作。所以我们接下来要在SD卡上烧录系统镜像。
具体怎么烧录呢?我们可以使用一个免费的烧录工具,**Etcher**。它支持MacOS、Windows和Linux三种主流的电脑系统你可以从[官方网站](https://etcher.io/)上下载和安装。也可以点击[这个链接](https://github.com/balena-io/etcher/releases)下载最新版。
然后,下载树莓派的系统镜像文件。树莓派有官方的操作系统镜像 Raspbian可以选择但是为了避免手动在 Raspbian系统中安装 Gladys Assistant 软件的麻烦我们直接选择官方提供的已经配置好Gladys Assistant的Raspbian镜像文件。
从[这个链接](https://cdn.elephantcdn.com/gh/gladysassistant/gladys/releases/download/v4.0.0/gladys-4.0.0-rev3.img.zip)中下载好镜像文件,并且解压缩得到"img"扩展名的文件。然后把Micro SD卡插入读卡器或者直接插入你的电脑接口中。运行Etcher软件按照步骤把镜像文件烧录到存储卡中。
![](https://static001.geekbang.org/resource/image/1b/73/1bcbb300760c8febe63898a0174c3273.png)
树莓派支持网线接口不过如果你希望树莓派接入家里的Wi-Fi热点而不是使用网线访问网络那么就需要在Micro SD卡中增加一个配置文件。
这个配置文件的文件名必须是wpa\_supplicant.conf。你可以在电脑上使用自己熟悉的文本编辑器创建这个文件并且在文件中输入下面的内容
```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN
network={
ssid="你的Wi-Fi热点SSID名称"
psk="你的Wi-Fi热点密码"
key_mgmt=WPA-PSK
}
```
注意将Wi-Fi热点的SSID和密码替换为你家里的Wi-Fi路由器的真实情况。
然后将这个文件拷贝到Micro SD卡的根目录。这时你就可以把Micro SD卡插入树莓派开发板了。
### 第三步:启动系统
烧录好镜像文件准备好Micro SD卡后你可以把Micro SD卡从读卡器取出插入树莓派的对应接口中。
接着,接上电源线(如果你使用网线方式,记得也将网线接入树莓派板的网口上)。这时树莓派将自动启动运行,需要等待一段时间。
过一会儿之后,在你的电脑上,打开浏览器,输入 "[http://gladys.local](http://gladys.local)" 来访问树莓派上的Gladys Assistant系统如下图所示。
如果你使用的电脑系统是比较老的Windows版本可能无法通过这种方式访问树莓派而是需要将“gladys.local”替换为树莓派的IP地址。
怎么获取到树莓派的IP地址呢你可以使用一些网络分析软件比如Android手机上安装Network ScanneriOS手机上安装iNet来扫描网络。
![](https://static001.geekbang.org/resource/image/60/cf/600490ac2f908cb13ce81b379a8fdacf.png)
那么为什么不给树莓派接一个显示器而要通过你的电脑上的浏览器来访问呢这是因为Gladys Assistant 为了简化镜像,没有提供可视化的桌面环境。其实你只要熟悉了操作方法,就会发现这样的设计是非常方便的,因为你不需要为树莓派再准备个显示器了。
### 第四步在Gladys Assistant上添加设备
因为我们是第一次配置Gladys Assistant所以要在上面的页面中选择“Create local account with your Email”来创建一个本地账号。
创建完账号后其他的步骤不是必填项你根据喜好填写就行了。房屋配置部分你可以创建一个名称为bedroom的房间后面会用到。最后你应该可以看到这个Dashboard页面。
![](https://static001.geekbang.org/resource/image/14/3a/14de681771577c2b8d56fc3590f12d3a.png)
接下来我们来添加一个设备来体验一下Gladys Assistant的功能。
那么添加什么设备呢我们还没有讲到实战篇的具体项目呢。不过我们可以用电脑来模拟一个设备。你还记得第8讲介绍的MQTT协议吗Gladys Assistant系统支持MQTT通信协议的设备。所以我们可以通过电脑终端的命令行来模拟一个设备发送MQTT消息给Gladys Assistant让Gladys Assistant来展示这个设备。
首先我们在Gladys Assistant上准备MQTT Broker。选择Dashboard 上部的标签页“Integrations”点击MQTT标签。
![](https://static001.geekbang.org/resource/image/a2/ab/a2f23d7ce6f2e95d557dce9c93481dab.png)
进入MQTT设置界面后你现在需要点击左边的Setup开始安装MQTT Broker。我们通过默认选项即使用Docker的方式来完成。
![](https://static001.geekbang.org/resource/image/ce/1a/ce2016b8d4ee5ed95e91856a04f44d1a.png)
这个过程需要几分钟时间。完成后你就可以看到MQTT Broker的用户名和密码。我将密码改成了geektimetest为了便于记忆你也可以选择一个自己的密码。同时你需要将用户名和密码记录下来因为后面模拟设备发送MQTT消息时会用到。
![](https://static001.geekbang.org/resource/image/52/89/52d0ccc87753ea79c670d8d5b798dd89.png)
接着我们点击左边的Device切换到MQTT设备页面。点击右上角的New打开创建页面。设备名称我们可以选择Temperature SensorExternal ID填写mqtt:bedroom:temperature-sensor。字符串中bedroom是和下一项房间填写的信息一致的。
![](https://static001.geekbang.org/resource/image/55/d6/554e038f3a7a7f8e2bbd3c14632269d6.png)
然后我们为设备添加特性Features。这里我们选择Temperature 类型。
![](https://static001.geekbang.org/resource/image/e8/db/e8f806569bf36852abe3712c6fed5fdb.png)
选择完类型后我们点击Add feature开始设置具体的特性参数。你可以按照下图的内容来设置自己的参数。其中external ID填写mqtt:bedroom:temperature-sensor:temperature字符串。最下面的MQTT Topic你需要记录下来后面发送消息时需要用到。
![](https://static001.geekbang.org/resource/image/a0/ae/a03735551ee3e3124131169c1b4d60ae.png)
点击下部的保存Save和返回Back然后我们可以看到创建完成的MQTT设备。
![](https://static001.geekbang.org/resource/image/cc/e2/cc37b26e8d548465a4c3aa1dba87a1e2.png)
在模拟发送MQTT消息之前我们还需要编辑一下Dashboard界面。你需要点击左上角切换回Home标签页然后点击右上角的Edit按键。在编辑界面的Column 1 选择Devices in room类别。然后依次选择bedroom和我们刚创建的设备Temperature Sensor传感器。
![](https://static001.geekbang.org/resource/image/2e/9e/2e2bd7fyyaa7ba7b7eb79026db90f89e.png)
点击页面右下角的Save保存Dashboard的编辑界面。
![](https://static001.geekbang.org/resource/image/16/07/16ca1f18eb80eb0fd2efd37d04a49c07.png)
当然,现在传感器没有数值显示。
### 第五步模拟MQTT设备
接下来,我们打开一个终端命令窗口,输入下面的命令:
```
hbmqtt_pub -d --url mqtt://gladys:geektimetest@gladys.local:1883 -t gladys/master/device/mqtt:bedroom:temperature-sensor/feature/mqtt:bedroom:temperature-sensor:temperature/state -m 25.2
```
其中gladys:geektimetest是用户名和密码它们以分号相连。gladys.local是树莓派的域名。-t后面的消息主题就是你刚才记录的MQTT Topic字符串。-m后面是温度数值。
执行这个命令后你再打开Gladys Assistant的Dashboard界面这时你就可以看到设备卡片显示出来了刚才发送的温度数值。
![](https://static001.geekbang.org/resource/image/c9/4d/c931174c7c4dd9cafde673ee795bf24d.png)
## 小结
总结一下在这一讲中我介绍了智能家居开源平台的生态并且带你动手在树莓派上安装了Gladys Assistant然后体验了一下使用过程。
1. 智能家居平台为各种智能家居产品提供了一个统一的接入系统,让用户可以管理和控制产品,同时也为各种智能家居产品之间的联动提供了条件。
2. 了解开源的智能家居平台有两大好处,一是你可以基于它们快速地搭建智能家居系统,另一个是你可以在工作中借鉴它们的设计思想和架构。
3. 开源的智能家居平台有很多热度比较高的平台有5个分别是Home Assistant、Domoticz、openHAB、Gladys Assistant 和WebThingsIO。
4. 利用开源平台,在树莓派开发板上搭建智能家居系统的一般步骤包括:准备器材,烧录系统镜像,启动系统,添加设备,接收和显示设备信息等。
在实战篇,等你掌握了开发智能硬件的基本方法,可以将这一讲中的模拟设备替换为真实的温度传感器设备。期待你的动手实践。
而且之后,等你熟悉树莓派开发板的使用方法,你也可以在树莓派上尝试一下其它几个开源平台。它们的基本功能都比较接近,你可以根据自己喜好,或者熟悉的编程语言选择。
## 思考题
最后,我给你留一个思考题吧。
在这一讲的动手实验环节,我们是通过访问[http://gladys.local](http://gladys.local) 来查看Gladys Assistant的Dashboard等Web应用界面的。为什么我们可以通过gladys.local 域名来访问树莓派开发板呢?为什么有的老版本电脑系统不支持呢?这是使用了什么网络协议?
欢迎你在留言区写一写自己的答案,也欢迎你将这一讲分享给对智能家居 DIY感兴趣的朋友大家一起交流学习。