python 网关控制家居_在树莓派上搭建智能家居网关
智能家居系統(tǒng)利用大量的物聯(lián)網(wǎng)設備(如溫濕度傳感器、安防系統(tǒng)、照明系統(tǒng))實時監(jiān)控家庭內部狀態(tài),完成智能調節(jié)、人機互動。隨著物聯(lián)網(wǎng)技術的發(fā)展,其應用范圍、數(shù)據(jù)規(guī)模、市場份額將進一步擴大,智能家居設備之間的智能聯(lián)動也將變的越來越困難,同時由于家庭數(shù)據(jù)的隱私性,用戶數(shù)據(jù)上傳至云端處理還有一定的安全問題。
為此我們將使用 Raspberry Pi + EMQ X Edge + EMQ X Kuiper 搭建智能家居網(wǎng)關,實現(xiàn)智能家居設備數(shù)據(jù)的邊緣計算處理,減少家庭私密數(shù)據(jù)外流。
本文中我們將用 BH1750FVI 光照強度傳感器采集家庭光照強度數(shù)據(jù),使用 EMQ X Kuiper 對光照強度數(shù)據(jù)進行分析和處理,并依據(jù)預先定義的數(shù)據(jù)規(guī)則對 LED 燈進行相應的控制。
所需組件
樹莓派 3b+ 以及更高版本
樹莓派3代B+ 型是一款基于 ARM 的微型計算機主板,以 SD/MicroSD卡進行存儲,該主板提供 USB 接口和以太網(wǎng)接口,可以連接鍵盤、鼠標和網(wǎng)線,該主板具備 PC 的基本功能,同時樹莓派集成了 Wi-Fi,藍牙以及大量 GPIO,是智能家居網(wǎng)關的理想選擇。
EMQ X Edge
智能家居設備之間通信協(xié)議有 MQTT,Wi-Fi,藍牙 等,其中 MQTT 協(xié)議 是基于發(fā)布/訂閱模式的物聯(lián)網(wǎng)通信協(xié)議,它簡單易實現(xiàn)、支持 QoS、報文小。在本文中我們將使 MQTT 協(xié)議作為智能家居設備之間的通信協(xié)議。
由于 Raspberry Pi 內存以及處理能力有限,我們選擇由 EMQ 開源的 EMQ X Edge 作為 MQTT broker,EMQ X Edge 是輕量級的物聯(lián)網(wǎng)邊緣計算消息中間件,支持部署在資源受限的物聯(lián)網(wǎng)邊緣硬件。
EMQ X Kuiper
智能家居設備之間數(shù)據(jù)傳輸格式不同,并且數(shù)據(jù)存在波動性,我們需要對設備上報的數(shù)據(jù)進行處理。在本文中我們將使用由 EMQ 開源的 EMQ X Kuiper 對智能家居設備數(shù)據(jù)進行邊緣化處理,EMQ X Kuiper 是基于 SQL 的輕量級邊緣流式消息處理引擎,可以運行在資源受限的邊緣設備上。
通過實時分析智能家居設備的各類數(shù)據(jù),可以實現(xiàn)對設備的即時狀態(tài)管理與控制。
其他組件
BH1750FVI 光照強度傳感器
LED
330 Ω電阻
面包板, 跳線若干
項目示意圖
環(huán)境搭建
電路連接
樹莓派配置
我們選擇 raspbian 8 作為樹莓派操作系統(tǒng),并選擇 python 3 作為項目編程語言
# 創(chuàng)建名為 smart-home-hubs 的項目目錄
mkdir ~/smart-home-hubs
EMQ X Edge 安裝與運行
$ cd ~/smart-home-hubs
# 下載軟件包
$ wget https://www.emqx.io/downloads/edge/v4.1.0/emqx-edge-raspbian8-v4.1.0.zip
$ unzip emqx-edge-raspbian8-v4.1.0.zip
$ cd ./emqx
# 運行 EMQ X Edge
$ ./bin/emqx start
EMQ X Kuiper 安裝與運行
$ cd ~/smart-home-hubs
# 下載軟件包
$ wget https://github.com/emqx/kuiper/releases/download/0.4.2/kuiper-0.4.2-linux-armv7l.zip
$ unzip kuiper-0.4.2-linux-armv7l.zip
$ mv kuiper-0.4.2-linux-armv7l ./kuiper
$ cd ./kuiper
# 創(chuàng)建 rules 目錄,用來存放規(guī)則文件
$ mkdir ./rules
# 運行 EMQ X Kuiper
$ ./bin/server
代碼編寫
BH1750FVI 光照傳感器數(shù)據(jù)上傳
編寫代碼讀取并計算 BH1750FVI 傳感器光照強度數(shù)據(jù),并以 1次/秒 的頻率將光照強度數(shù)據(jù)通過 MQTT協(xié)議 發(fā)布到 smartHomeHubs/light 主題上。
# gy30.py
import json
import time
import smbus
from paho.mqtt import client as mqtt
# BH1750FVI config
DEVICE = 0x23 # Default device I2C address
POWER_DOWN = 0x00
POWER_ON = 0x01
RESET = 0x07
CONTINUOUS_LOW_RES_MODE = 0x13
CONTINUOUS_HIGH_RES_MODE_1 = 0x10
CONTINUOUS_HIGH_RES_MODE_2 = 0x11
ONE_TIME_HIGH_RES_MODE_1 = 0x20
ONE_TIME_HIGH_RES_MODE_2 = 0x21
ONE_TIME_LOW_RES_MODE = 0x23
bus = smbus.SMBus(1)
# MQTT broker config
broker = '127.0.0.1'
port = 1883
topic = 'smartHomeHubs/light'
def read_light():
data = bus.read_i2c_block_data(DEVICE, ONE_TIME_HIGH_RES_MODE_1)
light_level = round((data[1] + (256 * data[0])) / 1.2, 2)
return light_level
def connect_mqtt():
client = mqtt.Client(client_id='light_01')
client.connect(host=broker, port=port)
return client
def run():
mqtt_client = connect_mqtt()
while True:
light_level = read_light()
publish_msg = {'lightLevel': light_level}
mqtt_client.publish(
topic,
payload=json.dumps(publish_msg)
)
print(publish_msg)
time.sleep(1)
if __name__ == "__main__":
run()
配置 EMQ X Kuiper 流處理規(guī)則
我們將在 EMQ X Kuiper 上創(chuàng)建名為 smartHomeHubs 的流,并配置規(guī)則對光照強度數(shù)據(jù)進行實時分析,以實現(xiàn)對 LED 燈的控制。
本文中我們將計算光照強度平均值,當平均光照強度 持續(xù) 5 秒 小于 55 時開啟 LED(大于 55 時關閉 LED)。
創(chuàng)建流
$ cd ~/smart-home-hubs/kuiper
$ ./bin/cli create stream smartHomeHubs '(lightLevel float) WITH (FORMAT="JSON", DATASOURCE="smartHomeHubs/light")'
編寫開啟 LED 規(guī)則(./rules/onLed.rule)
當持續(xù) 5 秒鐘平均光照強度小于 55 時,向 smartHomeHubs/led 主題發(fā)送 "{\"status\": \"on\"}" 消息打開 LED。
{
"sql":"SELECT avg(lightLevel) as avg_light from smartHomeHubs group by TUMBLINGWINDOW(ss, 5) having avg_light < 55;",
"actions":[
{
"mqtt":{
"server":"tcp://127.0.0.1:1883",
"topic":"smartHomeHubs/led",
"sendSingle":true,
"dataTemplate": "{\"status\": \"on\"}"
}
}
]
}
編寫關閉 LED 規(guī)則(./rules/offLed.rule)
當持續(xù) 5 秒鐘平均光照強度大于 55 時,向 smartHomeHubs/led 主題發(fā)送 "{\"status\": \"off\"}" 消息關閉 LED。
{
"sql":"SELECT avg(lightLevel) as avg_light from smartHomeHubs group by TUMBLINGWINDOW(ss, 5) having avg_light > 55;",
"actions":[
{
"mqtt":{
"server":"tcp://127.0.0.1:1883",
"topic":"smartHomeHubs/led",
"sendSingle":true,
"dataTemplate": "{\"status\": \"off\"}"
}
}
]
}
添加規(guī)則
$ ./bin/cli create rule onLed -f ./rules/onLed.rule
$ ./bin/cli create rule onLed -f ./rules/offLed.rule
查看規(guī)則
$ ./bin/cli show rules
LED 燈控制
編寫代碼連接到 EMQ X Edge,并訂閱 smartHomeHubs/led 主題。監(jiān)聽訂閱的 MQTT 消息內容,當 status 為 on 時打開 LED,當 status 為 off 時關閉 LED。
# led.py
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import json
# MQTT broker config
broker = '127.0.0.1'
port = 1883
topic = 'smartHomeHubs/led'
def on_connect(client, userdata, flags, rc):
print("Connecting to the MQTT broker...")
if rc == 0:
print("Connection success")
else:
print("Connected with result code "+str(rc))
client.subscribe(topic)
def on_message(client, userdata, msg):
payload = json.loads(msg.payload)
led_status = payload.get('status')
gpio_status = GPIO.input(4)
if led_status == 'on' and gpio_status == 0:
GPIO.output(4, True)
print('LED on')
elif led_status == 'off' and gpio_status == 1:
GPIO.output(4, False)
print('LED off')
else:
pass
def run():
# connect MQTT broker
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker, 1883, 60)
# set Raspberry Pi GPIO pin
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.OUT)
try:
client.loop_forever()
except KeyboardInterrupt:
GPIO.cleanup()
if __name__ == "__main__":
run()
運行測試
python gy30.py 獲取光照數(shù)據(jù),并將數(shù)據(jù)上報到 **smartHomeHubs/light ** 主題。
python led.py 訂閱 smartHomeHubs/led 主題,監(jiān)聽 LED 控制信息。
當我們手動降低或升高光照時,可以看到 LED 燈同時也開啟和關閉。
總結
我們使用 Raspberry Pi 為網(wǎng)關提供豐富的外部通信接口,使用 EMQ X Edge 為網(wǎng)關提供設備之間的通信功能,使用 EMQ X Kuiper 為網(wǎng)關提供設備數(shù)據(jù)處理以及分析功能。
之后,我們使用光照傳感器獲取光照強度,通過光照強度來控制 LED 的開和關。在整個過程中所有數(shù)據(jù)都在本地處理和分析,降低了家庭私密數(shù)據(jù)泄漏的風險。
總結
以上是生活随笔為你收集整理的python 网关控制家居_在树莓派上搭建智能家居网关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建项目_跟着团子学SAP PS:项目模
- 下一篇: python 数据库表结构转为类_Pyt