资讯详情

物联网 | HASS+MQTT+树莓派室内监测小型物联网系统

实践说明

本次实践将部署在阿里云服务器上Home Assistant服务和MQTT在树莓派4服务B上通过GPIO将温度和湿度、火焰和烟雾传感器连接到。最后,编写Python程序将树莓派通过MQTT连接到Home Assistant,室内环境条件的远程监测效果如下图所示。 效果图

目录

文章目录

  • 实践说明
  • 目录
  • 物料清单
  • 部署过程
    • Home Assistant部署
    • EMQX部署
    • 树莓派IoT接入MQTT服务器

物料清单

表1 实践中使用的主要材料及说明

Raspberry Pi 4B 1 物联网终端设备主机
闪迪Micro SD 16GB 1 为树莓派烧录系统
树莓派专用电源适配器及电源线 1 供电树莓派
MQ-2烟雾传感器 1 检测燃烧产生的烟雾和有害气体
火焰传感器 1 检测一定线性范围内的火焰
DHT11温湿度传感器 1 检测室内温度和相对湿度
杜邦线 9 连接传感器和树莓派电脑
阿里云服务器2G内存50G磁盘 1 部署HASS和MQTT服务

部署过程

这次实践将在我的另一篇文章中基于树莓派4B在室内环境监测预警系统中物联网设备的基础上,进一步扩展和修改,设计和部署包括服务器、信息中间件、自制在内的相对完善的小型智能物联网系统IoT设备和用户客户端(Web(具体GPIO看另一篇博文,介绍接线和传感器。 实践主要分为以下两个步骤:

  1. 部署Home Assistant和MQTT服务器;
  2. 修改原监测设备并通过MQTT接入Home Assistant。

第一步需要做Home Assistant和组件EMQX安装在系统中,因为docker该技术易于使用,上述框架和组件都是基于docker技术下的linux在系统下安装配置。这里就不赘述了,按照网上其他流程走就行了。下面主要提一下。Home Assistant安装参数。

Home Assistant部署

表2 系统状态参数表

版本 core-2021.12.8
安装类型 Home Assistant Container
开发版 false
Supervisor false
Docker true
用户 root
虚拟环境 false
Python 版本 3.9.7
操作系统系列 Linux
操作系统版本 4.18.0-305.19.1.el8_4.x86_64
CPU 架构 x86_64
时区 Asia/Shanghai

EMQX部署

树莓派IoT接入MQTT服务器

物联网设备(基于树莓派GPIO接入传感设备Home Assistant前,需要先通过MQTT将设备连接到客户端MQTT服务器。 首先,通过联网设备通过新闻中间件和HASS通信过程。物联网设备(基于树莓派GPIO传感设备)称为ClientA,将Home Assistant称为ClientB,EMQX服务器为Broker。一条传感器信息通过MQTT订阅机制传输过程如下:

  1. ClientA 连接到 Broker;
  2. ClientB 连接到 Broker,并订阅主题 Topic1;
  3. ClientA 发送给 Broker 以消息为主题的消息 Topic1;
  4. Broker 收到 ClientA 新闻,发现 ClientB 订阅了 Topic1.然后将消息转发到 ClientB;
  5. ClientB 从 Broker 收到消息。

Eclipse Paho Python (opens new window)为 Eclipse Paho 项目下的 Python 语言版客户端库可以连接到 MQTT Broker 发布消息,订阅主题,接收发布消息。我们将通过Paho连接树莓派MQTT服务器。

[1]MQTT Python 客户端库 | EMQX 文档

先用树莓派 PyPi 包管理工具安装:

pip3 install paho-mqtt 

然后用树莓派Python编写主控程序,读取传感器数据,并通过一定的采样间隔MQTT Broker发送传感器数据。主控程序代码如下:

# Python 3.7.3 (/usr/bin/python3) # main_for_raspberry.py import time import sys import Adafruit_DHT import RPi.GPIO as GPIO  import time import logging from datetime import datetime import json
import paho.mqtt.client as mqtt

logging.basicConfig(level=logging.DEBUG)

# MQTT服务器配置
MQTT_SERVER_IP = 'xxx.xxx.xxx.xxx' # 你的服务器地址
MQTT_SERVER_PORT = 1883
MQTT_SERVER_KEEPALIVE = 60

# 传感器引脚配置
DHT11_chanel = 23 #BCM,GPIO.4
MQ2_chanel = 17 #BCM,GPIO.0
fire_sensor_chanel = 24 #BCM,GPIO.5

# init GPIO
GPIO.setmode(GPIO.BCM) 
GPIO.setup(MQ2_chanel,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(fire_sensor_chanel,GPIO.IN)

# 连接成功回调
def on_connect(client, userdata, flags, rc):
    print('Connected with result code '+str(rc))

# 消息接收回调
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

def main():
    client = mqtt.Client()

    # 指定回调函数
    client.on_connect = on_connect
    client.on_message = on_message
    
    # 建立连接
    client.connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, MQTT_SERVER_KEEPALIVE)

    while(True):
        # 获取并打包传感器信息为JSON格式
        recDate = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        hum,temp = getHumiAndTemp()
        fireState = isFireOK()
        smokeState = isMQ2OK()
        data_obj = json.dumps({ 
        'Temperature':temp,
        'Humidity':hum,
        'Fire':fireState,
        'Smoke':smokeState,
        'Date':recDate})
    print(data_obj)
    # 发布消息
    client.publish('homeassistant/tp_rasp',payload=str(data_obj),qos=0)
    time.sleep(5)

    client.loop_forever()

# 获取DHT11传感器的温湿度数据
def getHumiAndTemp():
    return Adafruit_DHT.read_retry(11,DHT11_chanel)

# 二值型传感器被触发则返回"on"
# 获取MQ-2烟雾传感器的状态
def isMQ2OK():
    if(bool(GPIO.input(MQ2_chanel))):
        return "off"
    else:
        return "on" 

# 获取火焰传感器的状态
def isFireOK():
    if GPIO.input(fire_sensor_chanel) == GPIO.HIGH:
        return "off"
    else:
        return "on"

if __name__ == '__main__':
    main()

如果提示找不到依赖,则需要分别安装依赖:

# 安装树莓派GPIO驱动
pip3 install PRi.GPIO

# 安装DHT11传感器依赖
pip3 install Adafruit_Python_DHT

# 其它自行安装

确保树莓派主机可以访问互联网的情况下,启动主控程序。 接着就需要在部署Home Assistant的服务器上,打开配置文件configuration.yaml,本次实践部署中,这个文件在/home/hass/config下,使用nano命令打开(也可用vim):

nano /home/hass/config/configuration.yaml

将其修改为(mqtt项下username和password已去除,实际需要填入):

# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

# Text to speech
tts:
  - platform: google_translate

group: !include groups.yaml
  automation: !include automations.yaml
  script: !include scripts.yaml
  scene: !include scenes.yaml

# MQTT
mqtt:
  broker: localhost #MQTT服务器地址
  port: 1883 #MQTT服务器端口
  username: #MQTT服务器用户名
  password: #MQTT服务器密码
  discovery: true
  discovery_prefix: homeassistant

# 温湿度传感器的温度值
sensor 1:
  platform: mqtt
  name: "temperature"
  state_topic: "homeassistant/tp_rasp"
  unit_of_measurement: "℃"
  value_template: '{ 
        { value_json.Temperature }}'
  device_class: temperature

# 温湿度传感器的湿度值
sensor 2:
  platform: mqtt
  name: "humidity"
  state_topic: "homeassistant/tp_rasp"
  unit_of_measurement: "%"
  value_template: '{ 
        { value_json.Humidity }}'
  device_class: humidity

# 火焰传感器
binary_sensor 1:
  platform: mqtt
  name: "fire"
  state_topic: "homeassistant/tp_rasp"
  value_template: '{ 
        { value_json.Fire }}'
  device_class: problem

# 烟雾传感器
binary_sensor 2:
  platform: mqtt
  name: "smoke"
  state_topic: "homeassistant/tp_rasp"
  value_template: '{ 
        { value_json.Smoke }}'
  device_class: smoke

Ctrl+O保存,Ctrl+X退出。再用浏览器打开Home Assistant的Web管理页面,在概览页右上角三个点内点击编辑仪表盘选项,添加卡片可以找到配置的传感器。按照规则添加完成以后,部署就完成了。 完成后还可以前往Home Assistant的Github仓库下载安卓端APP,简单连接到部署在服务器的服务程序后,就可以通过手机监控传感器数据了,同时也会将手机的一些传感器信息上传到Home Assistant。最终在Web管理后台的效果如下图: 在Home Assistant的安卓移动App上显示效果如下: 在安卓手机桌面上使用上使用Home Assistant的桌面小部件: 树莓派与传感器组成的IoT设备在运行时如下图所示:

博客首发:https://ranlychan.top/archives/489.html

标签: rohm光电传感器透射型rpi

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台