Awesome Open Source
Awesome Open Source

Phodal's Smart Home Guide

这是一个探索性项目,旨在提供一个完整的智能家居搭建指南。

视频演示地址:腾讯视频

架构图:

Architecture

架构简介

  • 使用 Home Assistant、HomeBridge 作为智能家居的核心
  • 使用 Amazon Echo 作为语音输入工具(当前仅支持英语)
  • 使用 iPhone 的“家庭”应用作为控制工具
  • 可以使用任何的设备连接 Home Assistant 服务来控制应用

目录

基础知识篇

智能家居简介

当前,我们谈论智能家居的时候,我们实现上是在讨论:家庭自动化。引自维基百科,对于智能家居的介绍^wiki_home_automation

Home automation or smart home (also known as domotics) is building automation for the home.

随着机器学习和深度学习等 AI 技术的进一步普及,这一点(智能化)在最近几年里,应该会发生一些剧烈的变化。而无论如何,我可不太希望我要被机器催着起床。

开始实战之前,让我们先关注于当前智能家居的几个关键点:

  • 设备。这些设备要么使用 WiFi,要么要使用蓝牙,方便使用手机连接上这些设备。依当前的情况来看,主要是以 WiFi 为主,在手机上配置完后,可以轻松地实现远程控制。与此同时,他们在与手机通讯的时候,会使用一些自定义的通讯规则,并且似乎很容易被破解(参见仿真器一节)。如 Philips Hue 智能灯、Wemo 开关等等,他们都已经可以被仿真,并作为 Homekit 组件使用。
  • 自动化。自动化是指你可以定时也开关某个特定的设备,闹钟一响,便打开灯诸如此类的。
  • 场景(规则)。与自动化稍微区别的是,场景是某个特定场合下,对一系列设备的操作,如早起,便开灯、打开窗帘,离开家,则锁门、关闭一系列用电器、开启防盗功能等等。
  • 中心网关。当我们所使用的一系列设备拥有 WiFi 功能时,装有各种软件的手机便相当于控制中枢。而这样的设计本身是不合理的,你要在手机上安装一系列的应用。这个时候,便需要一个额外的软件作为中心,来接入这些设备,而手机上也不需要多余的额外软件。如 HomeKit、Home Assistant 就是这样的例子。

而作为一个普通的用户,我们只需要关注便利的生活。作为一个极客,我们则关注于如何改造成需要的功能。

智能音箱

学术上有个概念是“传声器阵列”,主要由一定数目的声学传感器组成,用来对声场的空间特性进行采样并处理的系统。

如下图所示 Amazon Echo 的电路板:

Amazon Echo 电路板

其及对应的麦克风的位置:

Amazon Echo 麦克风位置

其所要主要解决远距离语音识别的问题,以保证真实场景下的语音识别率。而这些设备的主要原理,都是将语音信号发送到服务器端,由服务器端识别,并匹配到对应的指令上

Amazon Echo

实验表明 AWS 的服务并不是那么可靠的~~,经常出现:Your Echo dot is not connected

自定义组件的原理,如下图所示:

Amazon Echo 自定义 Skill

中心网关

Home Assistant

Home Assistant 是一个运行在 Python 3 上的开源家庭自动化平台。能跟踪和控制家庭中的所有设备,并实现自动化控制,同时还完美的支持在 Raspberry Pi 上。

通过 Home Assistant 插件,它可以直接兼容各式硬件设备。其原理是通过 WiFi、BLE、Zigbee、MQTT 等不同的协议,来与不同的本地设备互联,并提供一个响应式的 Web 界面、PWA 应用、iOS 应用,让用户可以轻松地与设备进行交互。

其在桌面浏览器上的界面如下图所示:

Home Assistant 桌面

手机浏览器的界面如下图所示:

Home Assistant 调色-small

对于提供丰富功能(如 RGB 灯)的设备来说,它也能支持丰富的操作,即上图。同时,还能接上 Amazon Echo、HomeKit 等各式各样的中心。

HomeBridge

HomeKit 是由 Apple 公司推出的智能家居平台,包括iOS 上的 SDK、智能家居硬件通信协议 (HAP: HomeKit Accessory Protocol) 、以及 MFi(Made for iPhone/iPod/iPad) 认证等等。

借助于 iPhone、iPad、iWatch 等设备及『家庭』应用,用户可以轻松地掌控各种 HomeKit 配件。并且可以通过设备上 Siri 应用、Homepod,直接用语音来与设备交互。

当前要在 Homekit,有三种方法:

  • 购买昂贵的 MFi 设备。
  • 借助于 Home Assistant,来自建 Homekit API 服务连接设备。
  • 模拟现有的 MFi 设备。诸如使用 ESP8266 仿真 Philip Hues。

引自:使用iOS Homekit控制树莓派:HAP 协议部分是需要加入 MFi Program 才能获取文档,而且 MFi Program 无法以个人开发者身份加入。

因此,这个时候我们就需要借助于 Homebridge。

Homebridge 是一个用 Node.js 实现的轻量级后台,可以在家庭网络上运行,用于模拟iOS HomeKit API。 它支持插件——由社区提供的模块,这些插件能提供从 HomeKit 到 “智能家居” 设备制造商,提供的各种第三方API的基本桥梁。

Homekit 示例

而我们只需要有一个 iPhone 在手便可以了。

设备

如果只有上面的几种中心网关,而缺少设备,那么整个智能的中心就是不完善的。而这也是最近几年来,限制智能家居发展的一个因素:找不到合适的用户需求。

通讯机制与协议

WeMo

ZigBee

WiFi

BLE

这是一种无线技术标准,用来让固定与移动设备,在短距离间交换数据,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由2.4至2.485 GHz的ISM频段来进行通信。

红外摇控

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点。

常见的设备有电视机、电调的遥控器。

旧设备中枢

如小米的万能遥控、Broadlink RM Pro

仿真设备

设备:

  • Amazone Echo Dot
  • NodeMCU
  • Broadlink RM Pro
  • Yeelight
  • Raspberry Pi 2
  • Android、iOS 设备

实战设备篇

ESP8266 仿真设备

  • Wemo:可以被 Amazon Echo 识别
  • Philips Hue:可以被 HomeKit 识别 ?

ESP8266 仿真 Wemo

要求:下载 Ardunio IDE,地址: http://www.arduino.cc/en/main/software

一、安装 Arduino ESP8266

Arduino ESP8266 GitHub 地址: https://awesomeopensource.com/project/esp8266/Arduino

安装方法:

  1. 启动 Arduino IDE,并进入 Preferences 窗口
  2. 在 Additional Board Manager URLs 中输入: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  3. 从 Tools > Board  菜单中打开 Boards Manager,并输入安装 esp8266 平台

二、测试仿真

下载安装包:https://awesomeopensource.com/project/kakopappa/arduino-esp8266-alexa-multiple-wemo-switch

Setup 步骤:

  • 下载代码
  • 在编辑器中打开 wemos.ino
  • 修改 WiFi 设置
  • 定义开关及其回调,在 officeLightsOnofficeLightsOffkitchenLightsOnkitchenLightsOff
  • 烧录

相似项目 Arduino Esp8266 Alexa Wemo switch emulator:https://awesomeopensource.com/project/witnessmenow/esp8266-alexa-wemo-emulator

ESP8266 仿真 Philips Hue

ESP8266 Hue Emulator 项目地址:ESP8266HueEmulator

这个 Demo 需要这么几个库NeoPixelBusaJsonTimeNtpClient,同时还需要修改一些相关的配置。

因此直接使用这个脚本安装,比较简单:

注意:如果是 Mac OS,需要将下面脚本中的 $HOME/Arduino/libraries/ 改为 $HOME/Documents/Arduino/libraries/

mkdir -p $HOME/Arduino/libraries/
cd $HOME/Arduino/libraries/
git clone --branch 2.1.4 https://github.com/Makuna/NeoPixelBus.git
git clone https://github.com/interactive-matter/aJson.git
git clone https://github.com/PaulStoffregen/Time.git
git clone https://github.com/gmag11/NtpClient.git
sed -i -e 's|#define PRINT_BUFFER_LEN 256|#define PRINT_BUFFER_LEN 4096|g'  aJson/aJSON.h
cd -
git clone https://github.com/probonopd/ESP8266HueEmulator.git
sed -i -e 's|#include "/secrets.h"|//#include "/secrets.h"|g' ESP8266HueEmulator/ESP8266HueEmulator/ESP8266HueEmulator.ino
sed -i -e 's|//const char|const char|g' ESP8266HueEmulator/ESP8266HueEmulator/ESP8266HueEmulator.ino

再将代码烧录到 ESP8266 上,就可以在 Homekit 看到相应的配置。

小米智能插座

寻找设备

npm install -g miio
miio --discover
npm install --save miio

集成网关篇

Raspberry Pi Home Assistant

Images: https://home-assistant.io/docs/hassbian/installation/

Images Downloader: https://etcher.io/

发现文档好像有点问题,便手动地尝试安装:

pip3 install --upgrade homeassistant

运行

sudo -u homeassistant -H /srv/homeassistant/bin/hass

并不没工作,于是执行官方的安装脚本:

curl -O https://raw.githubusercontent.com/home-assistant/fabric-home-assistant/master/hass_rpi_installer.sh && sudo chown pi:pi hass_rpi_installer.sh && bash hass_rpi_installer.sh

又在我的 MBP 上安装尝试

pip3 install homeassistant
hass --open-ui

然后发现安装完就可以了。

Home Assistant Broadlink PM PRO

configuration.yaml 文件中添加下面的配置:

# Example configuration.yaml entry
switch:
  - platform: broadlink
    host: IP_ADDRESS
    mac: 'MAC_ADDRESS'
    switches:
      reciever:
        command_on: 'switch_packet on'
        command_off: 'switch_packet off'

获取 Broadlink 配置

  1. https://awesomeopensource.com/project/NightRang3r/Broadlink-e-control-db-dump 获取数据导出脚本
  2. 打开 易控(英语:E-Control) 应用,点击菜单 -> 共享 -> 云分享 就会生成相应的配置文件
  3. 浏览手机上的 /broadlink/newremote/SharedData/ 目录,复制出 jsonSubIrjsonButtonjsonIrCode 三个文件
  4. 安装好 python 环境, 并安装 pip install simplejson
  5. 执行第一步代码中的脚本,python getBroadlinkSharedData.py
  6. 安装python-broadlink,地址 https://github.com/mjg59/python-broadlink.git

不知道是不是我的空调问题,获取到的配置是空的。

Homebridge

相关的插件:

安装 Homebridge

编辑软件源

sudo vim /etc/apt/sources.list

修改为阿里云,速度会更快一些:

deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib

安装 Node.js ARM 版 :

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs

安装 avahi

sudo apt-get install libavahi-compat-libdnssd-dev

安装 homebridge

npm install -g homebridge

安装相应的插件

sudo npm install -g homebridge-yeelight
sudo npm install -g homebridge-homeassistant
sudo npm install -g homebridge-broadlink-sp
sudo npm install -g homebridge-broadlink-rm
sudo npm install -g homebridge-platform-wemo
sudo npm install -g homebridge-miio

对应的配置在 home-assistant 目录下的 configuration.yaml 文件。

开机启动

在 /etc/default 目录下创建 homebridge 文件,内容如下:

#Defaults / Configuration options for homebridge
#The following settings tells homebridge where to find the config.json file and where to persist the data (i.e. pairing and others)
HOMEBRIDGE_OPTS=-U /var/lib/homebridge

# If you uncomment the following line, homebridge will log more
# You can display this via systemd's journalctl: journalctl -f -u homebridge
# DEBUG=*

在 /etc/systemd/system 目录下创建 homebridge.service 文件,内容如下:

[Unit]
Description=Node.js HomeKit Server
After=syslog.target network-online.target

[Service]
Type=simple
User=homebridge
EnvironmentFile=/etc/default/homebridge
# Adapt this to your specific setup (could be /usr/bin/homebridge)
# See comments below for more information
ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reload
systemctl enable homebridge
systemctl start homebridge

HomeBridge 集成 Home Assistant

安装插件:

npm install -g homebridge-homeassistant

添加配置:

"platforms": [
  {
    "platform": "HomeAssistant",
    "name": "HomeAssistant",
    "host": "http://127.0.0.1:8123",
    "password": "yourapipassword",
    "supported_types": ["binary_sensor", "climate", "cover", "device_tracker", "fan", "group", "input_boolean", "light", "lock", "media_player", "scene", "sensor", "switch"],
    "logging": true
  }
]

Amazon Echo 设置

我用的是 Amazon Echo Dot 2 就是那个 Mini 版的

  • 安装 Yeelight Skill
  • 安装 Mijia

两者需要登录小米的账号,才能授权获得控制。

结合 HomeAssistant 和 Amazon Echo

文档:https://home-assistant.io/components/alexa/

如果只是为了打开、关闭设备,可以直接使用 emulated_hue 组件,它可以提供一个虚拟的 Philips Hue 桥。

只开关设备

使用 Home Assistant 的 Emulated Hue 组件就可以了,添加如下的配置:

emulated_hue:
  host_ip: 192.168.199.242

其中的 192.168.199.242 即是 Home Assistant 的服务器地址

更详细的配置,如:https://awesomeopensource.com/project/Teagan42/HomeAssistantConfig

定制命令

为了使用更多的功能,则需要使用将 Home Assistant 暴露到公网上——使用诸如花生壳等。(PS:由于当前家里使用的是光纤,需要光纤猫,实施上比较困难;因此,外部访问需要使用一级跌幅,暂时没有进行这方面的尝试)。

随后在 Amazon developer console

创建相应的 Alexa Skill,并添加 Endpoing:https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD

必须使用 HTTPS

定制 Home Assistant

Home Assistant RESTful API 地址:Home Assistant API

Home Assistant

结合 ESP8266 + Broadlink + Amazon Echo

在上面我们说到,ESP8266 可以模拟成 Wemo 设备,而 Wemo 可以直接由 Amazon Echo 识别。但是 Broadlink 直接与 Amazon Echo 配合,不可避免地出现了一些问题。在看到了python-broadlink 库,便想着是不是直接拿 flask 结合一下 broadlink 就可以实现一个简单的 HTTP 服务。随后,ESP8266 只需要几个请求吧,就能直接对家电进行控制。

Broadlink HTTP Server

为了避免自己造底层的轮子,想在 GitHub 上寻觅了一番,找到 broadlink-http-rest 项目,修改成适合自己需求的代码,放在了 GitHub 上:https://awesomeopensource.com/project/phodal/broadlink-http-rest

实际上,我们所需要做的就是,修改自己的 settings.py 文件。并且这部分的内容可以直接由 API 来生成。搭建之前,先下载上面的代码:

git clone https://github.com/phodal/broadlink-http-rest

然后安装依赖:

pip install -r requirements.txt

再运行起服务: python server.py

然后访问:http://localhost:8080/learnCommand/tvon,就可以直接学习红外指令。

接着通过访问:http://localhost:8080/sendCommand/tvon,就可以发送相应的红外编码。

同时,它会在 settings.py 下生成相应的 tvon 命令及编码,如下:

[Commands]
tvon = 9bff369b8c9f94d6a2ec86e2b83749670662283a956794365cfb8ecf42d42cc41256a408c128a0bcbe56e6050b561e1436c998299ff9adc8a17d8350d55341e83eca9d5bb905472e5a23bc035f94dab944af2de6513b09502c17b385fca66090

同样的,对于关闭设备来说,我们就需要使用 tvoff。

以此类推,我们就可以录入所有的设备。

使用 ESP8266 控制 Broadlink

打开 smart-home/emulator/esp8266-wemos/esp8266-wemos.ino 文件,写个负责发请求的方法:

void httpServer(String command) {
    HTTPClient http;

    Serial.print("[HTTP] begin...\n");
    // configure traged server and url
    //http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS
    http.begin("http://192.168.199.170:8080/sendCommand/" + command); //HTTP

    Serial.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();

    // httpCode will be negative on error
    if(httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);

        // file found at server
        if(httpCode == HTTP_CODE_OK) {
            String payload = http.getString();
            Serial.println(payload);
        }
    } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
}

对应的,我们只需要写相应的控制逻辑:

void tvOn() {
      httpServer("tvon");
}

void tvOff() {
      httpServer("tvoff");
}

void boxOn() {
      httpServer("mion");
}

void boxOff() {
      httpServer("mioff");
}


void airOn() {
      httpServer("airon");
}

void airOff() {
      httpServer("airoff");
}

便可以使用 ESP8266 控制 Broadlink。

最后,便是烧录程序,然后直接使用 Amazon Echo 控制。

Raspberry Pi Cornata

官方文档:Use Cortana Function on IoT Core

下载 Windows 10 IoT Core Dashboard

下载地址:https://developer.microsoft.com/en-us/windows/iot/docs/iotdashboard

安装最新镜像

打开 Windows 10 IoT Core Dashboard,为 RPi 烧录镜像,如下图所示:

Windows 10 IoT Dashboard

官方建议要更新到最新。使用 Web 界面打开设备的 Windows Update,http://:8080/#Windows%20Update,如http://192.168.199.223:8080/#Windows%20Update

然后到 Devices 中看是否出现相应的 Microphone 设置。。

Windows 10 IoT Audio

开机启动 Cortana

在首页的 Device Settigns 最下面有一个 Start Cortana on Boot 的选项。

使用 Windows IoT Remote Server 访问:在 http://192.168.199.223:8080/#Remote 在勾上 Enable Windows IoT Remote Server

设置 speechlanguage 成中文

打开 Processes -> Run command,执行:

IoTSettings -set region CN
IoTSettings -set speechlanguage zh-Hans-CN

学习用户习惯

TBD

工具集

Tools:

LICENSE

Phodal's Idea

© 2017 A Phodal Huang's Idea. This code is distributed under the MIT license. See LICENSE in this directory.

待我代码编成,娶你为妻可好

Alternatives To Smart Home
Select To Compare


Alternative Project Comparisons
Related Awesome Lists
Top Programming Languages
Top Projects

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
C Plus Plus (238,360
Raspberry Pi (22,304
Iot (11,908
Amazon (11,125
Esp (8,425
Home Assistant (3,709
Home Automation (2,211
Hue (1,904
Homebridge (1,520
Homekit (1,086
Amazon Echo (241
Yeelight (105
Wemo (18
Broadlink Rm (7