Commit 50939fa5 authored by Stéphan Bernard's avatar Stéphan Bernard
Browse files

Version utilisée par le nœud capteur à partir du 8 novembre 2022

No related merge requests found
Showing with 102 additions and 98 deletions
+102 -98
......@@ -30,6 +30,7 @@
#define DEFAULT_SSID "irstea_invite"
#define DEFAULT_HOST "CO2opain"
#define DEFAULT_AP_PASSWD "CO2chon2"
#define DEFAULT_MQTT_BROKER "10.63.65.95"
/* ------------------------------------------------- */
/* Keep some usual Strings static and shared */
......@@ -63,7 +64,7 @@ static int ntpUpdateInterval = NTP_UPDATE_INTERVAL;
static bool writeData = false;
static String ntpServerName = "fr.pool.ntp.org";
static String timezone = "Europe/Paris";
static String timezone = "Europe/Brussels";
const char *timeformat = "Y-m-d~TH:i:s;T";
/* ---------- filesystem ---------- */
......@@ -111,11 +112,11 @@ static char cbuf[BUF_SIZE];
static bool LED_STATUS = false;
/* ---------- MQTT ------------------------*/
const char *mqtt_broker = "10.63.65.95";
static char mqtt_broker[16];
const char *topic_co2 = "N4/ESP8266/SDC30/CO2";
const char *topic_temp = "N4/ESP8266/SDC30/airTemperature";
const char *topic_hum = "N4/ESP8266/SDC30/airHumidity";
const int mqtt_port = 1883;
static int mqtt_port = 1883;
const char *client_id = "CO2Pain";
WiFiClient espClient;
......@@ -125,31 +126,18 @@ PubSubClient client(espClient);
/*----------- MQTT ---------- */
void publishMQTT()
{
for (int i = 0; i < 5; i++)
{
{
if (!client.connected())
{
client.connect(client_id);
delay(2000);
}
else
{
break;
}
}
char *co2_str[8];
dtostrf(co2, 5, 0, co2_str);
client.publish(topic_co2, co2_str);
char *temp_str[8];
dtostrf(temperature, 6, 2, temp_str);
client.publish(topic_temp, temp_str);
char *hum_str[8];
dtostrf(humidity, 6, 2, hum_str);
client.publish(topic_hum, hum_str);
void publishMQTT() {
for (int i = 0; (i < 5) && (!client.connected()); i++) {
client.connect(client_id);
delay(2000);
}
if (!client.connected()) return;
dtostrf(co2, 5, 0, cbuf);
client.publish(topic_co2, cbuf);
dtostrf(temperature, 6, 2, cbuf);
client.publish(topic_temp, cbuf);
dtostrf(humidity, 6, 2, cbuf);
client.publish(topic_hum, cbuf);
}
/* ---------- HTTP ---------- */
......@@ -376,41 +364,46 @@ bool initWifi()
delay(100);
WiFi.softAP(host, ap_password);
delay(100);
client.setServer(mqtt_broker, mqtt_port);
delay(100);
return wifiConnect(ssid, password);
}
template <typename ServerType>
void handleWifiSet(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server)
{
bool cnx, donotsave = true;
void handleWifiSet(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server) {
bool modif = false, cnx, donotsave = true;
#ifndef DEMO_MODE
buf = (*server).arg("broker");
if (buf.length() > 0) {
modif = true;
buf.toCharArray(mqtt_broker, sizeof(mqtt_broker));
buf = (*server).arg("port");
mqtt_port = buf.toInt();
}
buf = (*server).arg("ssid");
if (buf.length() > 0)
{
if (buf.length() > 0) {
modif = true;
buf.toCharArray(ssid, sizeof(ssid));
buf = (*server).arg("pass");
buf.toCharArray(password, sizeof(password));
donotsave = (*server).hasArg("save");
}
else
return;
if (!modif) return;
cnx = initWifi();
if (cnx)
{
if ((fsOK) && (!donotsave))
{
if (cnx) {
if ((fsOK) && (!donotsave)) {
Serial.print(MSG[INFO]);
Serial.println(F("Saving Wifi configuration."));
File file = fileSystem->open("/wifiSetup.cfg", "w");
file.println(ssid);
file.println(password);
file.println(mqtt_broker);
file.println(mqtt_port);
delay(10);
file.close();
}
}
else
{
} else {
Serial.print(MSG[WARN]);
Serial.println(F("Resetting."));
ESP.reset();
......@@ -440,6 +433,19 @@ void handleAP(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server)
void HTTPhandleAP() { return handleAP(&HTTPserver); }
void HTTPShandleAP() { return handleAP(&HTTPSserver); }
template <typename ServerType>
void handleMQTTbroker(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server) {
buf = "{\"broker\":\"";
buf += mqtt_broker;
buf += "\",\"port\":\"";
buf += mqtt_port;
buf += "\"}";
(*server).send(200, MSG[MIME_JSON], buf);
}
void HTTPhandleMQTTbroker() { return handleMQTTbroker(&HTTPserver); }
void HTTPShandleMQTTbroker() { return handleMQTTbroker(&HTTPSserver); }
template <typename ServerType>
void handleAPSet(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server)
{
......@@ -474,6 +480,8 @@ void handleAPSet(esp8266webserver::ESP8266WebServerTemplate<ServerType> *server)
#endif
handleFileRead(server, "/");
}
void HTTPhandleAPSet() { return handleAPSet(&HTTPserver); }
void HTTPShandleAPSet() { return handleAPSet(&HTTPSserver); }
......@@ -785,6 +793,8 @@ void setup()
buf.toCharArray(host, sizeof(host));
buf = DEFAULT_AP_PASSWD;
buf.toCharArray(ap_password, sizeof(ap_password));
buf = DEFAULT_MQTT_BROKER;
buf.toCharArray(mqtt_broker, sizeof(mqtt_broker));
buf = "";
buf.toCharArray(password, sizeof(password));
......@@ -804,24 +814,22 @@ void setup()
fileSystem->setConfig(fileSystemConfig);
fsOK = fileSystem->begin();
if (!fsOK)
{
if (!fsOK) {
Serial.print(MSG[WARN]);
Serial.println(F("Filesystem init failed !"));
}
else
{
} else {
Serial.print(MSG[INFO]);
Serial.println(F("Reading configuration files."));
File file = fileSystem->open("/wifiSetup.cfg", "r");
if (file)
{
if (file) {
readLineInFile(file, ssid, sizeof(ssid));
readLineInFile(file, password, sizeof(password));
readLineInFile(file, mqtt_broker, sizeof(mqtt_broker));
readLineInFile(file, cbuf, sizeof(cbuf));
buf = cbuf;
mqtt_port = buf.toInt();
file.close();
}
else
{
} else {
Serial.print(MSG[WARN]);
Serial.println(F("No wifi setup file found."));
}
......@@ -899,13 +907,10 @@ void setup()
Serial.print(F("AP IP address: "));
Serial.println(WiFi.softAPIP());
if (MDNS.begin(host))
{
if (MDNS.begin(host)) {
MDNS.addService("http", "tcp", 80);
MDNS.addService("https", "tcp", 443);
}
else
{
} else {
Serial.print(MSG[WARN]);
Serial.println(F("Error setting up MDNS responder!"));
}
......@@ -919,6 +924,7 @@ void setup()
HTTPserver.on("/sensor", HTTP_GET, HTTPhandleSensor);
HTTPserver.on("/listfiles", HTTP_GET, HTTPhandleFileList);
HTTPserver.on("/scan", HTTP_GET, HTTPhandleWifiScan);
HTTPserver.on("/mqttbroker", HTTP_GET, HTTPhandleMQTTbroker);
HTTPserver.on("/ap", HTTP_GET, HTTPhandleAP);
HTTPserver.on("/status", HTTP_GET, HTTPhandleStatus);
HTTPserver.on("/dtz", HTTP_GET, HTTPhandleDateTimeZone);
......@@ -935,6 +941,7 @@ void setup()
HTTPSserver.on("/sensor", HTTP_GET, HTTPShandleSensor);
HTTPSserver.on("/listfiles", HTTP_GET, HTTPShandleFileList);
HTTPSserver.on("/scan", HTTP_GET, HTTPShandleWifiScan);
HTTPSserver.on("/mqttbroker", HTTP_GET, HTTPShandleMQTTbroker);
HTTPSserver.on("/ap", HTTP_GET, HTTPShandleAP);
HTTPSserver.on("/status", HTTP_GET, HTTPShandleStatus);
HTTPSserver.on("/dtz", HTTP_GET, HTTPShandleDateTimeZone);
......@@ -953,8 +960,7 @@ void setup()
setServer(ntpServerName);
waitForSync(60); /* Waits NTP sync for max. 60 seconds. */
setInterval(120); /* Try every 2 minutes until success */
if (!tz.setLocation(timezone))
{
if (!tz.setLocation(timezone)) {
Serial.print(MSG[WARN]);
Serial.print(F("Timezone setting failed -> "));
Serial.println(timezone);
......@@ -964,14 +970,12 @@ void setup()
delay(1000);
i = 0;
while ((!(sensorOK = airSensor.begin())) && (i++ < 6))
{
while ((!(sensorOK = airSensor.begin())) && (i++ < 6)) {
Serial.print(MSG[ERR]);
Serial.println(F("Air sensor not detected. Please check wiring. Waiting 10s..."));
delay(10000);
}
if (sensorOK)
{
if (sensorOK) {
airSensor.setMeasurementInterval(interval);
airSensor.setAltitudeCompensation(altitude);
}
......@@ -979,26 +983,20 @@ void setup()
/* Set datafile name */
tzOK = (timeStatus() == timeSet);
if (tzOK)
{
if (tzOK) {
setInterval(ntpUpdateInterval);
datafile = "data/" + tz.dateTime("YmdHi") + ".csv";
Serial.print(MSG[INFO]);
Serial.print(F("NTP date and time set : "));
Serial.println(tz.dateTime(timeformat));
}
else
{
} else {
Serial.print(MSG[WARN]);
Serial.println(F("NTP date and time not set."));
if (fsOK)
{ /* If !(fsOK), we won't save any data. */
if (fsOK) { /* If !(fsOK), we won't save any data. */
Dir dir = fileSystem->openDir("/data");
j = 0;
while (dir.next())
{
if (!dir.isDirectory())
{
while (dir.next()) {
if (!dir.isDirectory()) {
// Always return names without leading "/"
if (dir.fileName()[0] == '/')
buf = &(dir.fileName()[1]);
......@@ -1013,21 +1011,18 @@ void setup()
datafile = "data/" + String(j) + "-NS.csv";
else
datafile = F("data/197001010000-NS.csv");
}
else
{
} else {
datafile = "";
}
}
if ((datafile.length() > 0) && (writeData))
{
if ((datafile.length() > 0) && (writeData)) {
Serial.print(MSG[INFO]);
Serial.print(F("Writing data into "));
Serial.println(datafile);
}
/* --- MQTT --- */
publishMQTT();
/*publishMQTT();*/ /* La première mesure est vide */
}
void loop()
......@@ -1067,8 +1062,7 @@ void loop()
}
/* --- Get sensor data if available and write it to file. --- */
if (getSensorData())
{
if (getSensorData()) {
/* Write to file */
cbuf[0] = ';';
buf = tzOK ? tz.dateTime(timeformat) : "";
......@@ -1082,19 +1076,14 @@ void loop()
buf += millis();
Serial.print(F("[MEASURE] "));
Serial.println(buf);
if ((writeData) && (fsOK))
{ /* Write to file */
if ((writeData) && (fsOK)) { /* Write to file */
file = LittleFS.open(datafile, "a");
if (!file)
{
if (!file) {
Serial.print(MSG[ERR]);
Serial.print(F("Failed to open file for appending : "));
Serial.println(datafile);
}
else
{
if (!file.println(buf))
{
} else {
if (!file.println(buf)) {
Serial.print(MSG[ERR]);
Serial.print(F("Failed to write data to file "));
Serial.println(datafile);
......@@ -1102,11 +1091,10 @@ void loop()
file.close();
}
}
/* --- MQTT --- */
publishMQTT();
}
/* --- MQTT --- */
publishMQTT();
HTTPserver.handleClient();
HTTPSserver.handleClient();
MDNS.update();
......
......@@ -27,7 +27,7 @@ var opts=`
ffEtc/Greenwichĸ+00¸Greenwich Mean Time : Dublin—Edinburgh—Lisbon—Londonə
ff¦Amsterdamĸ+01¸Amsterdam—Berlin—Bern—Rome—Stockholm—Viennaə
ff¦Belgradeĸ+01¸Belgrade—Bratislava—Budapest—Ljubljana—Pragueə
ff¦Parisĸ+01¸Brussels—Copenhagen—Madrid—Parisə
ff¦Brusselsĸ+01¸Brussels—Copenhagen—Madrid—Parisə
ff¦Sarajevoĸ+01¸Sarajevo—Skopje—Warsaw—Zagrebəff¶Lagosĸ+01¸West Central Africaə
ff¤Ammanĸ+02¸Ammanəff¦Athensĸ+02¸Athens—Bucharest—Istanbuləff¤Beirutĸ+02¸Beirutə
ff¶Cairoĸ+02¸Cairoəff¶Harareĸ+02¸Harare—Pretoriaə
......
......@@ -12,6 +12,13 @@
.then(function (response) {return response.json();})
.then(function (data) { listScan(data);})
.catch(function (err) { console.log('error: ' + err); });
fetch('mqttbroker')
.then(function (response) {return response.json();})
.then(function (data) { fillForm(data);})
.catch(function (err) { console.log('error: ' + err); });
function fillForm(data) {
document.getElementById("mqtt").value = data.broker;
document.getElementById("port").value = data.port; }
function listScan(data) {
var mainContainer = document.getElementById("listwifi");
if (data.length == 0) {
......@@ -62,16 +69,25 @@
<tr><td>Password : </td><td><input type='password' id='pass' name='pass' length=64 /></td></tr>
</table></div>
<div class="itxt"><div class="chk"><input type="checkbox" onclick="showPw()">Show Password</div></div>
</div></div>
<div class="linfo"><div class="ititle">MQTT</div><div class="icont"><div class="itxt">
<table>
<tr><td>Broker : </td><td><input type='text' id='mqtt' name='broker' length=16 /></td></tr>
<tr><td>Port : </td><td><input type='text' id='port' name='port' length=5 /></td></tr>
</table>
</div></div></div>
<div class="linfo"><div class="icont">
<div class="itxt"><div class="chk"><input type='checkbox' id='donotsave' name='save'>
<label for='donotsave'>Do not save to flash.</label></div></div>
<div class="itxt"><div class="btn"><input type='submit' value='Set' /></div></div>
</div></div></form>
</div></div>
</form>
<form id="donotsend">
<div class="linfo"><div class="ititle">Detected AP</div><div class="icont">
<div id="listwifi"><div class="itxt"><div class="loader"></div></div></div>
</div></div></form>
</div>
</form></div></body></html>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment