Данный датчик приобретал на Aliexpress: http://alii.pub/6bd3rp
ESP32: http://alii.pub/68cn69
Сервер Home Assistant работает на orange pi zero2: http://alii.pub/68uelr
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Я решил данный датчик ASG02MA подружить с home Assistant.
Я обычно все делаю в ESPHome. Но данный датчик довольно новый и совсем сейчас не популярный. ПО этому поддержки ESPHome у него нет.
Но у нас есть старый добрый MQTT. Через который мы можем отправлять данные в Home Assitant.
Я взял пример ppb значений с библиотеки от датчика AGS20MA
И собственно получился вот такой скетч:
//
// FILE: AGS02MA_PPM.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: test application
// DATE: 2021-09-23
// URL: https://github.com/RobTillaart/AGS02MA
//
#include "AGS02MA.h"
#include
#include
#include
#include
extern "C" {
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
}
#include
#define WIFI_SSID "SSID"
#define WIFI_PASSWORD "password"
// Raspberry Pi Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 31, 145)
// For a cloud MQTT broker, type the domain name
//#define MQTT_HOST "example.com"
#define MQTT_PORT 1883
// Temperature MQTT Topics
#define MQTT_PUB_TEMP "esp32/ags02ma/tvoc"
AGS02MA AGS(26);
float tvoc;
AsyncMqttClient mqttClient;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer;
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // Interval at which to publish sensor readings
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
void WiFiEvent(WiFiEvent_t event) {
Serial.printf("[WiFi-event] event: %d\n", event);
switch(event) {
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
connectToMqtt();
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WiFi lost connection");
xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
xTimerStart(wifiReconnectTimer, 0);
break;
}
}
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
xTimerStart(mqttReconnectTimer, 0);
}
}
void onMqttPublish(uint16_t packetId) {
Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Wire.begin();
Serial.print("AGS02MA_LIB_VERSION: ");
Serial.println(AGS02MA_LIB_VERSION);
Serial.println();
bool b = AGS.begin();
Serial.print("BEGIN:\t");
Serial.println(b);
Serial.print("VERSION:\t");
Serial.println(AGS.getSensorVersion());
// pre-heating improves measurement quality
// can be skipped
Serial.println("\nWarming up (120 seconds = 24 dots)");
while (AGS.isHeated() == false)
{
delay(5000);
Serial.print(".");
}
Serial.println();
b = AGS.setPPBMode();
uint8_t m = AGS.getMode();
Serial.print("MODE:\t");
Serial.print(b);
Serial.print("\t");
Serial.println(m);
uint8_t version = AGS.getSensorVersion();
Serial.print("VERS:\t");
Serial.println(version);
mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToMqtt));
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToWifi));
WiFi.onEvent(WiFiEvent);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// If your broker requires authentication (username and password), set them below
mqttClient.setCredentials("mqtt", "mqtt");
connectToWifi();
}
void loop()
{
tvoc = AGS.readPPB();
delay(3000);
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(tvoc).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", tvoc);
Serial.print("PPM:\t");
Serial.print(AGS.readPPB(), 3);
Serial.print("\t");
Serial.print(AGS.dataReady(), HEX);
Serial.print("\t");
Serial.print(AGS.lastStatus(), HEX);
Serial.print("\t");
Serial.print(AGS.lastError(), HEX);
Serial.println();
}
// -- END OF FILE --
Так-же его можно скачать отсюда:
https://disk.yandex.ru/d/-wsPcp8R5eA6mQ
Собственно тут надо менять только ssid и пароль от wi-fi сети.
ip адрес mqtt сервера. У меня сервер установлен на сервере Home Assistant и его ip адрес 192.168.31.145.
Еще можно поменять топик, куда отправляются данные. А можно оставить такой-же. Мой топик: esp32/asg02ma/tvoc.
Подключать датчик AGS02MA нужно к шине i2c. Схема датчика вот такая:
Ну и в Home Assistant с установленным сервером mosquitto broker, нужно прописать в Configuration.yaml следующее:
- platform: "mqtt"
name: "AGS02MA_TVOC"
state_topic: "esp32/ags02ma/tvoc"
value_template: "{{ value }}"
unit_of_measurement: "ppb"
icon: "mdi:radiator"
Ну и все. После добавления этих строчек в файл Configuration.yaml у Вас появится сенсор sensor.AGS02MA_TVOC. Который можно добавить на главный экран и получать данные с датчика =).