【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测

news2024/11/19 9:40:18

IPV6+Home Assistant[ESP32+MQTT+DHT11+BH1750]传感器采集上传监测

  • 1 背景
  • 2 实现效果
  • 3 Home Assistant配置
    • 3-1 MQTT配置
    • 3-2 yaml 配置
    • 3-3 加载配置
  • 4 ESP32搭建
    • 4-1 开发环境
    • 4-2 工程代码
  • 5 实现效果

1 背景

在上一小节【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)我们在docker搭建了Home Assistant,需要有设备才能让系统跑起来。

我手上有一块ESP32开发板,以及两个我们熟悉的传感器:DHT11和BH1750,在这一节我们实现将ESP32接入Home Assistant,让传感器采集的数据通过ESP32上传到Home Assistant。

在这里我们需要一个辅助的工具:MQTT。
MQTT的搭建可参考我的博客 阿里云服务器centos7上手安装-6使用EMQ搭建MQTT服务器。

2 实现效果

在教程开始之前,可以先看一下我现在的页面效果,这是手机Home Assistant的效果。

关键信息有以下几点:
1 - 手机没有连接WIFI,所以我现在是通过公网IPV6访问我的服务器。
2 - 接入的传感器有三项:湿度、光照强度、温度,这些都是实时采集的数据。

在这里插入图片描述
下面开始配置我们的Home Assistant。

3 Home Assistant配置

3-1 MQTT配置

1、添加 MQTT 集成
添加你电脑搭建的MQTT服务器
在这里插入图片描述

2、(非必须)禁用自发现
在这里插入图片描述

3-2 yaml 配置

我这里是使用 bt 的 docker 安装的,关键的配置在这里
/config/configuration.yaml

在这里插入图片描述
新旧版本的yaml配置可能有差异,我这里的是2024.9.1版本。

在这里插入图片描述

以下是我的配置

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

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

# Example configuration.yaml entry

mqtt:
  sensor:
    - name: "Bedroom Light"
      state_topic: "home/bedroom/light"
      unit_of_measurement: "lx"  # 光照强度单位
      unique_id: "bedroom_light_level_01"
      
    - name: "Bedroom Temperature"
      state_topic: "home/bedroom/data"
      value_template: "{{ value_json.temperature }}"
      unit_of_measurement: "°C"
      icon: "mdi:thermometer"  # 设置图标
      device_class: "temperature"  # 设置设备类别
      unique_id: "bedroom_temperature_01"

    - name: "Bedroom Humidity"
      state_topic: "home/bedroom/data"
      value_template: "{{ value_json.humidity }}"
      unit_of_measurement: "%"
      icon: "mdi:water-percent"  # 设置图标
      device_class: "humidity"  # 设置设备类别
      unique_id: "bedroom_humidity_01"

其中:
1- 注意yaml的格式!添加实体到mqtt->sensor节点下
2- name :在系统上显示的实体名字
3- state_topic:指定数据上传到哪个Topic下
4- unit_of_measurement:单位
5- unique_id:全局唯一ID
6- icon:显示的图标
7- device_class:设备类型
8- value_template:可解析json数据

9- BH1750采集的光照强度我们直接将采集到的数值上传到mqtt相应的主题即可,这里是 home/bedroom/light
10- DHT11具有温度和湿度,可以将数据上传到单个Topic,也可以分成两个Topic,这里用前者作为例子,使用json打包上传数据,然后通过"{{ value_json.temperature }}""{{ value_json.humidity }}"解析数据进行渲染,系统自动解析。
11- 给每个实体一个 unique_id

其他字段我们后续慢慢探索

3-3 加载配置

可以在界面中重新加载配置
在这里插入图片描述
然后可以在MQTT看到3个实体了

在这里插入图片描述

4 ESP32搭建

4-1 开发环境

编程软件:Arduino
开发板:ESP-WROOM-32
硬件1:DHT11
硬件2:BH1750
杜邦线:若干
老演员了
(都是老演员了)

4-2 工程代码

Arduino相关的库自己下载哈

#include <Wire.h>
#include <WiFi.h>
#include <BH1750.h>
#include <DHT.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <ArduinoJson.h>

#define DHTPIN 4          // DHT11 数据引脚连接到 GPIO 4
#define DHTTYPE DHT11     // DHT 11

// Wi-Fi 和 MQTT Broker 配置
const char* ssid = "mywifi_2.4G";            // 替换为你的 Wi-Fi SSID
const char* password = "12345666";           // 替换为你的 Wi-Fi 密码
const char* mqttServer = "192.168.66.118";   // 替换为你的 MQTT Broker IP
const int mqttPort = 1883;                    // 默认 MQTT 端口
const char* mqttUser = "YOUR_MQTT_USERNAME"; // 如果需要,替换为你的用户名
const char* mqttPassword = "YOUR_MQTT_PASSWORD"; // 如果需要,替换为你的密码

DHT dht(DHTPIN, DHTTYPE);
WiFiClient wifiClient;
Adafruit_MQTT_Client mqtt(&wifiClient, mqttServer, mqttPort, mqttUser, mqttPassword);

// 初始化 BH1750
BH1750 lightSensor;

// MQTT 主题
Adafruit_MQTT_Publish sensorDataPub = Adafruit_MQTT_Publish(&mqtt, "home/bedroom/data"); // 温湿度主题
Adafruit_MQTT_Publish lightDataPub = Adafruit_MQTT_Publish(&mqtt, "home/bedroom/light"); // 光照强度主题

void setup() {
  Serial.begin(115200);
  dht.begin();
  
  // 初始化 I2C
  Wire.begin(21, 22); // 对于 ESP32,指定 SDA 和 SCL 引脚
  
  // 初始化 BH1750
  if (lightSensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23)) {
    Serial.println("BH1750 initialized successfully");
  } else {
    Serial.println("Failed to initialize BH1750!");
  }

  // 连接到 Wi-Fi
  connectToWiFi();
  mqtt.connected();

  delay(1000);
}

void loop() {
  // 确保 Wi-Fi 连接
  if (WiFi.status() != WL_CONNECTED) {
    connectToWiFi();
  }

  // 确保 MQTT 客户端连接
  if (!mqtt.connected()) {
    reconnectMQTT();
  }
  mqtt.processPackets(10000); // 处理 MQTT 数据包

  // 上传温湿度数据
  publishTemperatureAndHumidity();

  // 上传光照强度数据
  publishLightData();

  delay(5000); // 每5秒读取一次
}

// 连接到 Wi-Fi
void connectToWiFi() {
  Serial.print("Connecting to WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("Connected to WiFi!");
}

// 重新连接到 MQTT Broker
void reconnectMQTT() {
  while (!mqtt.connected()) {
    Serial.println("Attempting MQTT connection...");
    // 尝试连接
    if (mqtt.connect()) {
      Serial.println("connected");
    } else {
      Serial.println("failed, try again in 5 seconds");
      delay(5000); // 等待 5 秒后重试
    }
  }
}

// 上传温湿度数据
void publishTemperatureAndHumidity() {
  // 读取温度和湿度
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // 摄氏度

  // 如果读取失败,返回 NAN
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // 控制温度和湿度在一位小数
  t = round(t * 10) / 10.0; // 保留一位小数
  h = round(h * 10) / 10.0; // 保留一位小数

  // 创建 JSON 数据
  StaticJsonDocument<512> jsonDoc; // 增加文档大小
  jsonDoc["temperature"] = t;
  jsonDoc["humidity"] = h;

  // 使用 String 类型存储序列化后的 JSON 数据
  String jsonString;
  serializeJson(jsonDoc, jsonString); // 将 JSON 数据序列化到 String

  // 打印主题和发布的消息
  Serial.print("Publishing to topic: home/bedroom/data");
  Serial.print(", Message: ");
  Serial.println(jsonString);

  // 发布 JSON 数据到 MQTT
  if (!sensorDataPub.publish(jsonString.c_str())) {
    Serial.println("Failed to publish sensor data.");
  }

  // 打印到串口监视器
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" °C, Humidity: ");
  Serial.print(h);
  Serial.println(" %");
}

// 上传光照强度数据
void publishLightData() {
  // 读取光照数据
  float lightLevel = lightSensor.readLightLevel(); // 读取光照数据

  if (lightLevel == -1 || lightLevel == -2) {
    Serial.println("Failed to read light level!");
  } else {
    // 打印主题和光照强度
    Serial.print("Publishing to topic: home/bedroom/light");
    Serial.print(", Light Level: ");
    Serial.println(lightLevel);

    // 发布光照强度数据到 MQTT
    if (!lightDataPub.publish(lightLevel)) {
      Serial.println("Failed to publish light data.");
    }
  }
}

5 实现效果

  • 采集数据的趋势图:

在这里插入图片描述
在这里插入图片描述

  • 串口打印输出:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

luogu基础课题单 入门 上

【深基2.例5】苹果采购 题目描述 现在需要采购一些苹果&#xff0c;每名同学都可以分到固定数量的苹果&#xff0c;并且已经知道了同学的数量&#xff0c;请问需要采购多少个苹果&#xff1f; 输入格式 输入两个不超过 1 0 9 10^9 109 正整数&#xff0c;分别表示每人分到…

chapter1-项目搭建

文章目录 序章1. 项目开发基础概念1.1 企业开发中常见的web项目类型1.2 企业项目开发流程1.3 立项申请阶段 2. 需求分析2.1 首页2.2 登录注册2.3 课程列表2.4 课程详情2.5 购物车2.6 商品结算2.7 购买成功2.8 个人中心2.9 我的课程及课程学习 3. 环境搭建3.1 创建虚拟环境3.2 相…

2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘

1.编写一个图像二维卷积程序。它应该能够处理任何灰度输入图像&#xff0c;并使用以下内核进行操作&#xff1a; %matplotlib inline import numpy as np import matplotlib.pyplot as plt from scipy import linalg import random as rm import math import cv2# import and …

基于云端的SIEM解决方案

最近的一项市场研究爆出了一组惊人的数字&#xff0c;在2024年&#xff0c;网络攻击增加了600%&#xff01;更加令人担忧的是&#xff0c;这恐怕只是冰山一角。世界各地的组织都已经认识到了这一威胁&#xff0c;并正在采取多重措施来抵御来自线下和远程混合式办公模式带来的网…

SpringBoot项目获取统一前缀配置以及获取非确定名称配置

SpringBoot项目获取统一前缀配置以及获取非确定名称配置 在SpringBoot项目中&#xff0c;我们经常看到统一前缀的配置&#xff0c;我们该怎么统一获取 my.config.a.namexiaoming my.config.a.age18 my.config.a.addressguangdong my.config.b.namexiaomli my.config.b.age20 my…

【Unity】手写图片轮播

最近项目空闲&#xff0c;回顾了一下之前写的杂七杂八的软件&#xff0c;比较多&#xff0c;而且比较杂乱&#xff0c;代码能看明白&#xff0c;但是非常不科学&#xff0c;不符合逻辑&#xff0c;然后我就有点无奈&#xff0c;虽说是做了很多年的老程序的&#xff0c;但是遇到…

小目标检测顶会新思路!最新成果刷爆遥感SOTA,参数小了18倍

遥感领域的小目标检测一直是个具有挑战性和趣味性的研究方向&#xff0c;同时也是顶会顶刊的常客。但不得不说&#xff0c;今年关于遥感小目标检测的研究热情尤其高涨&#xff0c;已经出现了很多非常优秀的成果。 比如SuperYOLO方法&#xff0c;通过融合多模态数据并执行高分辨…

数据库安全性控制

‍ 在当今信息化时代&#xff0c;数据库安全性 对于保护数据免受非法访问和损害至关重要。无论是个人数据还是企业机密&#xff0c;数据库安全性控制都能有效地防范潜在的威胁。本文将为你深入浅出地介绍数据库安全性控制的关键方法和机制&#xff0c;帮助你轻松掌握这一重要概…

vulnhub靶机:21 LTR: Scene1

下载 下载地址&#xff1a;https://www.vulnhub.com/entry/21ltr-scene-1,3/ 导入靶机 一直按默认的来&#xff0c;一直下一步 修改网卡 修改靶机和 kali 攻击机网络模式为仅主机模式 把仅主机模式的 IP 修改为 192.168.2.0 信息收集 主机发现 arp-scan -l 靶机 IP 是 192.…

Windows系统下安装Redis

文章目录 1、下载Redis安装包2、解压压缩包3、运行Redis4、Redis连接检测5、Redis相关设置5.1设置环境变量PATH5.2Redis 配置文件修改 1、下载Redis安装包 Windows版本的Redis可以在Github中下载&#xff1a;下载Redis 2、解压压缩包 将下载的压缩包解压到某个目录下&#…

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;Jenkins部署及环境配置 微服务CI/CD实践&#xff08;四&#xff09;…

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…

学会使用西门子博途Startdrive中的测量功能

工程师在驱动调试过程中&#xff0c;往往需要对驱动系统的性能进行分析及优化&#xff0c;比如说借助于调试软件中的驱动器测量功能&#xff0c;可以得到驱动系统的阶跃响应、波特图等&#xff0c;以此为依据工程师可以调整速度控制器、电流控制器的相关参数&#xff0c;使驱动…

今天一定要彻底卸载Windows Denfender!攻略给你了

最近有小伙伴吐槽&#xff1a;明明都已经把Windows Defender关了&#xff0c;为啥它还会时不时拦截我下载的文件&#xff1f; 小白就问&#xff1a;明明是谁&#xff1f; 嗯…… 肯定有小伙伴遇到同样的问题&#xff0c;Windows Defender已经关了&#xff0c;但好像并没有完…

利用Xinstall,轻松搭建高效App运营体系

在移动互联网时代&#xff0c;App的推广和运营成为了企业发展的关键环节。然而&#xff0c;随着流量红利的逐渐消失&#xff0c;传统的推广方式已经难以满足企业快速获客的需求。在这个背景下&#xff0c;Xinstall作为一款强大的渠道推广工具&#xff0c;凭借其独特的功能和优势…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异

测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint&#xff08;1&#xff09;的用法来实现存储0 1 作为boolean的标识列&#xff1b;但是在达梦并不允许使用 tinyint&#xff08;1&#xff09;来定义列&#xff0c;只能使用 tinyint 即 取值范围为&#xff…

《深度学习》CUDA安装配置、pytorch库、torchvision库、torchaudio库安装

目录 一、下载CUDA 1、什么是CUDA 2、查看电脑支持版本号 3、下载CUDA包 1&#xff09;进入下列下载位置 2&#xff09;选择版本 4、安装CUDA 1&#xff09;双击这个文件&#xff0c;然后得到下列图像 2&#xff09;选择自定义安装 3&#xff09;取消选项Visual Inte…

众店绿色积分模式:引领消费新风尚,共筑商业新生态

大家好&#xff0c;我是吴军&#xff0c;目前担任一家业界知名的软件开发公司产品管理的领航者。 最近&#xff0c;市场上涌动着一股创新商业模式的新浪潮&#xff0c;它不仅为消费者编织了一张省钱的网&#xff0c;更为商家铺设了一条吸引新客与增收的道路&#xff0c;甚至平…

【智能流体力学】数值模拟中的稳态和瞬态

在流体力学和数值模拟中, 稳态 (Steady State)意味着流体的物理量(如速度、压力、温度等)不随时间变化。换句话说,在稳态模拟中,系统已经达到了平衡,任何位置上的流场特性都不再随时间发生变化。 其他教程参考:https://doc.cfd.direct/openfoam/user-guide-v12/index…