<audio id="audio" title="15 | 平台：智能家居开源平台的生态是怎样的？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d1/4e/d12683d10a704098fb70586a0416f54e.mp3"></audio>

你好，我是郭朝斌。

在学完了这门课程的前十几讲之后，你已经对物联网有了一个从整体到细节的全面了解。我想，你现在应该迫不及待地想要动手实践了吧？

在正式进入实战篇之前，我想以智能家居领域为例，带你了解一下开源平台。

## 智能家居：生态开放

为什么选择智能家居这个领域呢？最重要的原因当然是因为实战篇的动手项目是智能家居领域的。而另一个原因是，智能家居的生态环境比较开放，很有活力，而且也更贴近我们的日常生活。

在[第9讲](https://time.geekbang.org/column/article/313631)，我提到过和工业物联网相关的一些开源项目。相比之下，工业物联网领域更加封闭，如果不是行业从业人员，你很难理解它的功能需求。

那么，什么是平台，平台有什么用呢？就拿智能家居平台来说好了，它给各种智能家居产品提供了一个**统一的接入系统**，让用户可以**管理**和**控制**产品，同时也为各种智能家居产品之间的**联动**提供了条件。

如果没有智能家居平台，那么各种智能家居产品就是一个个孤立的单品，既不能远程控制，也不能实现联动功能。

如果你买过小米的智能产品，应该接触过小米的米家平台，它就是一个典型的智能家居平台。国内类似的还有阿里巴巴的天猫精灵、京东微联和海尔U+等。国外知名的智能家居平台有苹果的Apple HomeKit、亚马逊的Amazon Echo和谷歌的Google Home等。

## 开源平台：方便定制

不过，刚才提到的这些都是商业公司运营的平台，它们使用的技术和通信协议都是公司制定的，能够选择的产品也只能是已经接入平台的产品。作为开发实践者，我们可以定制的部分非常少。

所以在这一讲，我想介绍一下智能家居的开源平台生态。

一方面，开源平台能为你提供一个现成的基础，你可以在这个基础上快速地搭建出自己的智能家居系统。而且这些平台不但可以提供丰富的特性，一般也会提供各种定制能力，方便你基于自己的需求灵活地调整。

另一方面，就算你在工作中不直接使用这些开源平台，你也可以从它们的架构设计和实现逻辑中汲取灵感。

在介绍完智能家居的开源生态之后，我还会选择其中一个开源平台，带你在树莓派开发板上运行起来，这样你也可以初步体验一下智能家居软件。

## 热度比较高的开源平台

那么你觉得智能家居的开源平台多吗？我告诉你，其实非常多。这也从侧面反映出智能家居是一个非常被看好的领域。

在这一讲中，把所有的开源项目都讲一遍是不现实的，所以我精心挑选了5个热度比较高的项目介绍，供你参考。

<li>
<h4>Home Assistant</h4>
</li>

首先要说的就是[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)协议。

<li>
<h4>Domoticz</h4>
</li>

第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）开源协议。

<li>
<h4>openHAB</h4>
</li>

第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)开源协议。

<li>
<h4>Gladys Assistant</h4>
</li>

第4个要讲的是[Gladys Assistant](https://gladysassistant.com/en/)。它是一个刚刚重新设计和开发的智能家居平台。它原生支持Z-Wave、MQTT和小米等设备接口，并且在平台中嵌入了自己的 NLP（自然语言处理）对话引擎。你可以在平台上定义复杂的场景模式。

Gladys Assistant的主要交互界面是Web页面。不过这些Web界面在手机上的体验也非常好，因为它是基于PWA（Progressive 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)开源协议。

<li>
<h4>WebThingsIO</h4>
</li>

不知道你是否还记得，我在加餐的书单推荐中提到过[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个开源的智能家居平台的特性总结为一个表格，方便你随时参考。

<img src="https://static001.geekbang.org/resource/image/3f/6a/3f957676a982afacb7619925ed19986a.jpg" alt="">

## Gladys Assistant具体使用：动手实践

这5个比较有代表性的智能家居开源平台，对于树莓派的支持都不错的。现在，我们就开始动手，在树莓派上安装一个开源平台，体验一下通过智能家居系统监测设备数值的过程。

使用哪个平台呢？我们就选择Gladys Assistant吧。它的优势是Web页面在手机上体验不错，不需要你去搜索或者编译手机上的App了。

其他几个开源平台的安装和使用方法都差不多。你掌握了一个，那么利用镜像文件安装其他几个也不成问题。

### 第一步：准备器材

首先我介绍一下需要准备的器材有哪些：

1. **树莓派Raspberry Pi 4B**，要求内存2GB以上，但是8GB内存版本要谨慎选择，因为有些开源平台软件对Arm 64bit芯片支持不够好。
1. **供电电源**，要求支持3A以上电流。
1. **Micro SD卡**，也叫TF卡，存储容量最好在16GB以上。在选择的时候，你要关注读写速度等级，比如U3表示最低写入速度是30MB/s。同时你也要关注[应用性能等级](https://www.sdcard.org/chs/developers/overview/application/index.html)，它定义了Micro SD卡进行随机读写的性能，最好是选择Application Performance Class 2（卡面上标识A2图标）。在卡上存储应用程序和应用程序数据时，这个性能指标非常重要。

<img src="https://static001.geekbang.org/resource/image/f4/66/f4928d8a87bde8b4e235b8cdf057d266.jpg" alt="">

1. **Micro SD卡读卡器**。有些电脑自带这个接口，如果没有的话，你可以买一个便宜的使用。
1. **普通网线**。如果你希望以有线的方式使用树莓派，可以准备一根。同时，我也会介绍树莓派接入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软件，按照步骤把镜像文件烧录到存储卡中。

<img src="https://static001.geekbang.org/resource/image/1b/73/1bcbb300760c8febe63898a0174c3273.png" alt="">

树莓派支持网线接口，不过，如果你希望树莓派接入家里的Wi-Fi热点，而不是使用网线访问网络，那么就需要在Micro SD卡中增加一个配置文件。

这个配置文件的文件名必须是wpa_supplicant.conf。你可以在电脑上使用自己熟悉的文本编辑器创建这个文件，并且在文件中输入下面的内容：

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN


network={
 ssid=&quot;你的Wi-Fi热点SSID名称&quot;
 psk=&quot;你的Wi-Fi热点密码&quot;
 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 Scanner，iOS手机上安装iNet来扫描网络。

<img src="https://static001.geekbang.org/resource/image/60/cf/600490ac2f908cb13ce81b379a8fdacf.png" alt="">

那么，为什么不给树莓派接一个显示器，而要通过你的电脑上的浏览器来访问呢？这是因为Gladys Assistant 为了简化镜像，没有提供可视化的桌面环境。其实你只要熟悉了操作方法，就会发现这样的设计是非常方便的，因为你不需要为树莓派再准备个显示器了。

### 第四步：在Gladys Assistant上添加设备

因为我们是第一次配置Gladys Assistant，所以要在上面的页面中选择“Create local account with your Email”，来创建一个本地账号。

创建完账号后，其他的步骤不是必填项，你根据喜好填写就行了。房屋配置部分，你可以创建一个名称为bedroom的房间，后面会用到。最后，你应该可以看到这个Dashboard页面。

<img src="https://static001.geekbang.org/resource/image/14/3a/14de681771577c2b8d56fc3590f12d3a.png" alt="">

接下来，我们来添加一个设备，来体验一下Gladys Assistant的功能。

那么，添加什么设备呢？我们还没有讲到实战篇的具体项目呢。不过，我们可以用电脑来模拟一个设备。你还记得第8讲介绍的MQTT协议吗？Gladys Assistant系统支持MQTT通信协议的设备。所以，我们可以通过电脑终端的命令行来模拟一个设备，发送MQTT消息给Gladys Assistant，让Gladys Assistant来展示这个设备。

首先，我们在Gladys Assistant上准备MQTT Broker。选择Dashboard 上部的标签页“Integrations”，点击MQTT标签。

<img src="https://static001.geekbang.org/resource/image/a2/ab/a2f23d7ce6f2e95d557dce9c93481dab.png" alt="">

进入MQTT设置界面后，你现在需要点击左边的Setup，开始安装MQTT Broker。我们通过默认选项，即使用Docker的方式来完成。

<img src="https://static001.geekbang.org/resource/image/ce/1a/ce2016b8d4ee5ed95e91856a04f44d1a.png" alt="">

这个过程需要几分钟时间。完成后，你就可以看到MQTT Broker的用户名和密码。我将密码改成了geektimetest，为了便于记忆，你也可以选择一个自己的密码。同时，你需要将用户名和密码记录下来，因为后面模拟设备发送MQTT消息时会用到。

<img src="https://static001.geekbang.org/resource/image/52/89/52d0ccc87753ea79c670d8d5b798dd89.png" alt="">

接着，我们点击左边的Device，切换到MQTT设备页面。点击右上角的New打开创建页面。设备名称我们可以选择Temperature Sensor，External ID填写mqtt:bedroom:temperature-sensor。字符串中bedroom是和下一项房间填写的信息一致的。

<img src="https://static001.geekbang.org/resource/image/55/d6/554e038f3a7a7f8e2bbd3c14632269d6.png" alt="">

然后，我们为设备添加特性（Features）。这里，我们选择Temperature 类型。

<img src="https://static001.geekbang.org/resource/image/e8/db/e8f806569bf36852abe3712c6fed5fdb.png" alt="">

选择完类型后，我们点击Add feature，开始设置具体的特性参数。你可以按照下图的内容来设置自己的参数。其中，external ID填写mqtt:bedroom:temperature-sensor:temperature字符串。最下面的MQTT Topic，你需要记录下来，后面发送消息时需要用到。

<img src="https://static001.geekbang.org/resource/image/a0/ae/a03735551ee3e3124131169c1b4d60ae.png" alt="">

点击下部的保存（Save）和返回（Back），然后我们可以看到创建完成的MQTT设备。

<img src="https://static001.geekbang.org/resource/image/cc/e2/cc37b26e8d548465a4c3aa1dba87a1e2.png" alt="">

在模拟发送MQTT消息之前，我们还需要编辑一下Dashboard界面。你需要点击左上角切换回Home标签页，然后点击右上角的Edit按键。在编辑界面的Column 1 选择Devices in room类别。然后依次选择bedroom和我们刚创建的设备Temperature Sensor传感器。

<img src="https://static001.geekbang.org/resource/image/2e/9e/2e2bd7fyyaa7ba7b7eb79026db90f89e.png" alt="">

点击页面右下角的Save，保存Dashboard的编辑界面。

<img src="https://static001.geekbang.org/resource/image/16/07/16ca1f18eb80eb0fd2efd37d04a49c07.png" alt="">

当然，现在传感器没有数值显示。

### 第五步：模拟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界面，这时你就可以看到设备卡片显示出来了刚才发送的温度数值。

<img src="https://static001.geekbang.org/resource/image/c9/4d/c931174c7c4dd9cafde673ee795bf24d.png" alt="">

## 小结

总结一下，在这一讲中，我介绍了智能家居开源平台的生态，并且带你动手在树莓派上安装了Gladys Assistant，然后体验了一下使用过程。

1. 智能家居平台为各种智能家居产品提供了一个统一的接入系统，让用户可以管理和控制产品，同时也为各种智能家居产品之间的联动提供了条件。
1. 了解开源的智能家居平台有两大好处，一是你可以基于它们快速地搭建智能家居系统，另一个是你可以在工作中借鉴它们的设计思想和架构。
1. 开源的智能家居平台有很多，热度比较高的平台有5个，分别是Home Assistant、Domoticz、openHAB、Gladys Assistant 和WebThingsIO。
1. 利用开源平台，在树莓派开发板上搭建智能家居系统的一般步骤包括：准备器材，烧录系统镜像，启动系统，添加设备，接收和显示设备信息等。

在实战篇，等你掌握了开发智能硬件的基本方法，可以将这一讲中的模拟设备替换为真实的温度传感器设备。期待你的动手实践。

而且之后，等你熟悉树莓派开发板的使用方法，你也可以在树莓派上尝试一下其它几个开源平台。它们的基本功能都比较接近，你可以根据自己喜好，或者熟悉的编程语言选择。

## 思考题

最后，我给你留一个思考题吧。

在这一讲的动手实验环节，我们是通过访问[http://gladys.local](http://gladys.local) 来查看Gladys Assistant的Dashboard等Web应用界面的。为什么我们可以通过gladys.local 域名来访问树莓派开发板呢？为什么有的老版本电脑系统不支持呢？这是使用了什么网络协议？

欢迎你在留言区写一写自己的答案，也欢迎你将这一讲分享给对智能家居 DIY感兴趣的朋友，大家一起交流学习。
