Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 102 additions & 2 deletions AirQUserDemo.ino
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@
#include "MainAppView.hpp"
#include "Sensor.hpp"
#include "AppWeb.hpp"
#include <PubSubClient.h>

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

class AirQ_GFX : public lgfx::LGFX_Device {
lgfx::Panel_GDEW0154D67 _panel_instance;
Expand Down Expand Up @@ -524,7 +527,34 @@ void mainApp(ButtonEvent_t *buttonEvent) {
if (WiFi.isConnected() && runingEzdataUpload && ezdataUploadCount-- > 0) {
ezdataHanlder.setDeviceToken(db.ezdata2.devToken);
BUTTON_TONE();
if (uploadSensorRawData(ezdataHanlder)) {
bool ok = false;

if(db.ezdata2.enabled) {
ok = uploadSensorRawData(ezdataHanlder);
}

if(db.mqtt.host != "") {
// Инициализация MQTT клиента
IPAddress serverIP;
if (serverIP.fromString(db.mqtt.host.c_str())) {
mqttClient.setServer(serverIP, 1883);
log_i("using ip addr from host %s", db.mqtt.host.c_str());
} else {
mqttClient.setServer(db.mqtt.host.c_str(), 1883);
log_i("using host %s as domain", db.mqtt.host.c_str());
}
mqttClient.setBufferSize(1024);
mqttClient.setCallback(mqttCallback);
if (!mqttClient.connect(db.nickname.c_str(), db.mqtt.login.c_str(), db.mqtt.password.c_str())) {
log_i("cannot connect to mqtt with %s: %s (result=%d)", db.mqtt.host.c_str(), db.mqtt.login.c_str(), mqttClient.state());
}

if (uploadSensorMqttData(mqttClient, db.mqtt.topic.c_str())) {
ok = true;
}
}

if (ok) {
successCounter += 1;
preferences.putUInt("OK", successCounter);
String msg = "OK:" + String(successCounter);
Expand Down Expand Up @@ -975,6 +1005,14 @@ void listDirectory(fs::FS &fs, const char * dirname, uint8_t levels) {
}


// Callback при получении сообщения
void mqttCallback(char* topic, byte* payload, unsigned int length) {
char *message = (char *)malloc(length);
snprintf(message, length, "%s", payload);
log_i("MQTT debug topic=%s: %s", topic, message);
free(message);
}

void wifiAPSTASetup() {
log_i("WiFi setup...");

Expand Down Expand Up @@ -1004,7 +1042,6 @@ void wifiAPSTASetup() {
log_i("softAP MAC: %s", mac.c_str());
}


void wifiStartAP() {
WiFi.softAPdisconnect();
WiFi.disconnect();
Expand Down Expand Up @@ -1190,6 +1227,69 @@ OUT1:
}


bool uploadSensorMqttData(PubSubClient &mqttClient, const char *topic) {
bool ret = false;
cJSON *rootObject = NULL;
cJSON *sen55Object = NULL;
cJSON *scd40Object = NULL;
cJSON *rtcObject = NULL;
cJSON *profileObject = NULL;
char *buf = NULL;
String data;

rootObject = cJSON_CreateObject();
if (rootObject == NULL) {
goto OUT1;
}

sen55Object = cJSON_CreateObject();
if (sen55Object == NULL) {
goto OUT;
}
cJSON_AddItemToObject(rootObject, "sen55", sen55Object);

scd40Object = cJSON_CreateObject();
if (scd40Object == NULL) {
goto OUT;
}
cJSON_AddItemToObject(rootObject, "scd40", scd40Object);

cJSON_AddNumberToObject(sen55Object, "pm1.0", sensor.sen55.massConcentrationPm1p0);
cJSON_AddNumberToObject(sen55Object, "pm2.5", sensor.sen55.massConcentrationPm2p5);
cJSON_AddNumberToObject(sen55Object, "pm4.0", sensor.sen55.massConcentrationPm4p0);
cJSON_AddNumberToObject(sen55Object, "pm10.0", sensor.sen55.massConcentrationPm10p0);
cJSON_AddNumberToObject(sen55Object, "humidity", sensor.sen55.ambientHumidity);
cJSON_AddNumberToObject(sen55Object, "temperature", sensor.sen55.ambientTemperature);
cJSON_AddNumberToObject(sen55Object, "voc", sensor.sen55.vocIndex);
cJSON_AddNumberToObject(sen55Object, "nox", sensor.sen55.noxIndex);

cJSON_AddNumberToObject(scd40Object, "co2", sensor.scd40.co2);
cJSON_AddNumberToObject(scd40Object, "humidity", sensor.scd40.humidity);
cJSON_AddNumberToObject(scd40Object, "temperature", sensor.scd40.temperature);

// cJSON_AddNumberToObject(rtcObject, "sleep_interval", db.rtc.sleepInterval);
// cJSON_AddStringToObject(profileObject, "nickname", db.nickname.c_str());

buf = cJSON_PrintUnformatted(rootObject);
data = buf;
// data.replace("\"", "\\\"");

if (mqttClient.connected() && mqttClient.publish(topic, data.c_str())) {
log_i("mqtt publish ok, topic: %s", topic);
ret = true;
} else {
log_w("mqtt publish failed, connected: %d", mqttClient.connected());
ret = false;
}

OUT:
free(buf);
cJSON_Delete(rootObject);
OUT1:
return ret;
}


/**
* This method of obtaining wake status is not 100% accurate.
*/
Expand Down
28 changes: 27 additions & 1 deletion AppWeb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <SensirionI2CScd4x.h>
#include <SensirionI2CSen5x.h>
#include <PubSubClient.h>

#include "config.h"
#include "DataBase.hpp"
Expand All @@ -17,6 +18,7 @@ bool webServerState = false;

extern SensirionI2CScd4x scd4x;
extern SensirionI2CSen5x sen5x;
extern PubSubClient mqttClient;

static void postWiFiConnect();
static void getWiFiStatus();
Expand Down Expand Up @@ -451,10 +453,34 @@ static void postConfig() {
}
}

cJSON *mqttObject = cJSON_GetObjectItem(configObject, "mqtt");
if (mqttObject) {
cJSON *mqttHostObject = cJSON_GetObjectItem(mqttObject, "host");
cJSON *mqttTopicObject = cJSON_GetObjectItem(mqttObject, "topic");
cJSON *mqttLoginObject = cJSON_GetObjectItem(mqttObject, "login");
cJSON *mqttPasswordObject = cJSON_GetObjectItem(mqttObject, "password");
if (String(mqttHostObject->valuestring) != db.mqtt.host
|| String(mqttTopicObject->valuestring) != db.mqtt.topic
|| String(mqttLoginObject->valuestring) != db.mqtt.login
|| String(mqttPasswordObject->valuestring) != db.mqtt.password
) {
db.mqtt.host = String(mqttHostObject->valuestring);
db.mqtt.topic = String(mqttTopicObject->valuestring);
db.mqtt.login = String(mqttLoginObject->valuestring);
db.mqtt.password = String(mqttPasswordObject->valuestring);
mqttClient.setServer(db.mqtt.host.c_str(), 1883);
flag = true;
}
}

ezdataObject = cJSON_GetObjectItem(configObject, "ezdata2");
if (ezdataObject) {
cJSON *tokenObject = cJSON_GetObjectItem(ezdataObject, "dev_token");
db.ezdata2.devToken = tokenObject->valuestring;
if (tokenObject) {
db.ezdata2.devToken = tokenObject->valuestring;
}
cJSON *enabledObject = cJSON_GetObjectItem(ezdataObject, "enabled");
db.ezdata2.enabled = cJSON_IsTrue(enabledObject);
db.factoryState = false;
}

Expand Down
41 changes: 38 additions & 3 deletions DataBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ void DataBase::saveToFile() {
cJSON *rootObject = NULL;
cJSON *configObject = NULL;
cJSON *wifiObject = NULL;
cJSON *mqttObject = NULL;
cJSON *rtcObject = NULL;
cJSON *ntpObject = NULL;
cJSON *ezdataObject = NULL;
Expand Down Expand Up @@ -37,6 +38,16 @@ void DataBase::saveToFile() {
cJSON_AddStringToObject(wifiObject, "ssid", wifi.ssid.c_str());
cJSON_AddStringToObject(wifiObject, "password", wifi.password.c_str());

mqttObject = cJSON_CreateObject();
if (mqttObject == NULL) {
goto OUT;
}
cJSON_AddItemToObject(configObject, "mqtt", mqttObject);
cJSON_AddStringToObject(mqttObject, "login", mqtt.login.c_str());
cJSON_AddStringToObject(mqttObject, "password", mqtt.password.c_str());
cJSON_AddStringToObject(mqttObject, "host", mqtt.host.c_str());
cJSON_AddStringToObject(mqttObject, "topic", mqtt.topic.c_str());

rtcObject = cJSON_CreateObject();
if (rtcObject == NULL) {
goto OUT;
Expand All @@ -59,6 +70,7 @@ void DataBase::saveToFile() {
}
cJSON_AddItemToObject(configObject, "ezdata2", ezdataObject);
cJSON_AddStringToObject(ezdataObject, "dev_token", ezdata2.devToken.c_str());
cJSON_AddBoolToObject(ezdataObject, "enabled", ezdata2.enabled);

buzzerObject = cJSON_CreateObject();
if (buzzerObject == NULL) {
Expand Down Expand Up @@ -91,6 +103,12 @@ void DataBase::dump() {
log_d(" ssid: %s", wifi.ssid.c_str());
log_d(" password: %s", wifi.password.c_str());

log_d(" mqtt:");
log_d(" login: %s", mqtt.login.c_str());
log_d(" password: %s", mqtt.password.c_str());
log_d(" host: %s", mqtt.host.c_str());
log_d(" topic: %s", mqtt.topic.c_str());

log_d(" rtc:");
log_d(" sleep_interval: %d", rtc.sleepInterval);

Expand All @@ -101,6 +119,7 @@ void DataBase::dump() {

log_d(" ezdata2:");
log_d(" dev_token: %s", ezdata2.devToken.c_str());
log_d(" enabled: %d", ezdata2.enabled);

log_d(" buzzer:");
log_d(" onoff: %d", buzzer.onoff);
Expand Down Expand Up @@ -140,6 +159,18 @@ void DataBase::loadFromFile(void) {
wifi.ssid = String(ssidObject->valuestring);
wifi.password = String(pskObject->valuestring);

cJSON *mqttObject = cJSON_GetObjectItem(configObject, "mqtt");
if (mqttObject) {
cJSON *loginObject = cJSON_GetObjectItem(mqttObject, "login");
cJSON *passObject = cJSON_GetObjectItem(mqttObject, "password");
cJSON *hostObject = cJSON_GetObjectItem(mqttObject, "host");
cJSON *topicObject = cJSON_GetObjectItem(mqttObject, "topic");
if (loginObject) mqtt.login = String(loginObject->valuestring);
if (passObject) mqtt.password = String(passObject->valuestring);
if (hostObject) mqtt.host = String(hostObject->valuestring);
if (topicObject) mqtt.topic = String(topicObject->valuestring);
}

cJSON *factoryStateObject = cJSON_GetObjectItem(configObject, "factory_state");
factoryState = cJSON_IsTrue(factoryStateObject);

Expand All @@ -156,11 +187,15 @@ void DataBase::loadFromFile(void) {
ntp.tz = String(tzObject->valuestring);

cJSON *ezdataObject = cJSON_GetObjectItem(configObject, "ezdata2");
cJSON *tokenObject = cJSON_GetObjectItem(ezdataObject, "dev_token");
ezdata2.devToken = String(tokenObject->valuestring);
if (ezdataObject) {
cJSON *tokenObject = cJSON_GetObjectItem(ezdataObject, "dev_token");
ezdata2.devToken = String(tokenObject->valuestring);
cJSON *enabledObject = cJSON_GetObjectItem(ezdataObject, "enabled");
ezdata2.enabled = cJSON_IsTrue(enabledObject);
}

cJSON *buzzerObject = cJSON_GetObjectItem(configObject, "buzzer");
if (cJSON_IsTrue(cJSON_GetObjectItem(buzzerObject, "mute"))) {
if (buzzerObject && cJSON_IsTrue(cJSON_GetObjectItem(buzzerObject, "mute"))) {
buzzer.onoff = true;
} else {
buzzer.onoff = false;
Expand Down
7 changes: 7 additions & 0 deletions DataBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,17 @@ class DataBase {
String ntpServer1;
String tz;
} ntp;
struct {
String host;
String topic;
String login;
String password;
} mqtt;
struct {
String devToken;
String loginName;
String password;
bool enabled;
} ezdata2;
struct {
bool onoff;
Expand Down
Loading