This commit is contained in:
ap044002 committed 2020-07-06 16:29:44 -05:00
1 parent 64ef847590
commit 722495f019
6 files changed
+221 -165

No files matched your search

+1
View File
@@ -2,3 +2,4 @@
.piolibdeps
.clang_complete
.gcc-flags.json
.pio
+7
View File
@@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}
+5
View File
@@ -0,0 +1,5 @@
{
"files.associations": {
"functional": "cpp"
}
}
+11 -15
View File
@@ -6,7 +6,6 @@
<link rel="stylesheet" href="/css/custom.css">
<link href="/css/bootstrap.min.css" rel="stylesheet" title="main">
<link rel="stylesheet" href="/css/cover.css">
<!-- <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/superhero/bootstrap.min.css" rel="stylesheet" title="main"> -->
<!-- <script src="//cdn.rawgit.com/Mikhus/canvas-gauges/gh-pages/download/2.1.5/all/gauge.min.js"></script> -->
<title>BBQ Master</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -48,23 +47,23 @@
<div class="row bg-dark rounded p-3 p-md-5 m-md-3 text-center">
<ul class="nav nav-pills">
<li><a href="#">
<div class="span badge pull-right" id="batvoltage">-</div>Battery Voltage</a></li>
Battery Level<div class="span badge pull-right" id="batvoltage">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor0">-</div>Sen 1</a></li>
Sen 1<div class="span badge pull-right" id="sensor0">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor1">-</div>Sen 2</a></li>
Sen 2<div class="span badge pull-right" id="sensor1">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor2">-</div>Sen 3</a></li>
Sen 3<div class="span badge pull-right" id="sensor2">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor3">-</div>Sen 4</a></li>
Sen 4<div class="span badge pull-right" id="sensor3">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor4">-</div>Sen 5</a></li>
Sen 5<div class="span badge pull-right" id="sensor4">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor5">-</div>Sen 6</a></li>
Sen 6<div class="span badge pull-right" id="sensor5">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor6">-</div>Sen 7</a></li>
Sen 7<div class="span badge pull-right" id="sensor6">-</div></a></li>
<li><a href="#">
<div class="span badge pull-right" id="sensor7">-</div>Sen 8</a></li>
Sen 8<div class="span badge pull-right" id="sensor7">-</div></a></li>
</ul>
</div>
@@ -327,7 +326,7 @@
// Hide the bar element if value is invalid
document.getElementById('sensorBar' + i).style.display = "none";
}
$('#batvoltage').html("<b>" + data.bat + "v </b>");
$('#batvoltage').html("<b>" + data.bat + "% </b>");
// TempValues.push(data.sensors[i].v);
document.getElementById('sensorBar' + i).getElementsByClassName('label')[0].innerText = data.sensors[i].n;
@@ -445,9 +444,6 @@
<!-- TODO -->
<!--
* Stick to one theme
* Be able to set the Tempurature probe names
* Have everything surved under local storage #done
* Select a proper output for sensor data #done
* Be able to set the Temperature probe names
* Battery output indication
* Be able to set a warninig level -> push that to MQTT (min and max values)
* -->
+3 -3
View File
@@ -16,16 +16,16 @@ framework = arduino
lib_deps =
OneWire
DallasTemperature
Time
https://github.com/PaulStoffregen/Time
PubSubClient
https://github.com/mcspr/NtpClient.git#platformio-manifest
https://github.com/mcspr/NtpClient.git
https://github.com/adafruit/Adafruit_ADS1X15.git
https://github.com/me-no-dev/ESPAsyncWebServer.git
https://github.com/alanswx/ESPAsyncWiFiManager.git
https://github.com/bblanchon/ArduinoJson.git
https://github.com/Phillaf/Arduino-SimpleList.git
; upload_port = COM5
; upload_port = COM6
; upload_speed = 921600
upload_protocol = espota
upload_port = bbq_master
+194 -147
View File
@@ -19,21 +19,6 @@
// #define DEBUG_TELNET
// #define DEBUG_EXTRA_OUTPUT
#define I2C_SDA_PIN 23
#define I2C_SCL_PIN 22
#define BATTERY_V_PIN 35
#define BAT_RATIO 0.0017240449438202
#define NTC_MAX_ADC 27550.00
#define NTC_REF_RES 62000
#define NTC_SMP_TMP 25.81
#define NTC_SMP_RES 52250
#define NTC_BCOEFFICIENT 4200 //3950
#define HIST_SIZE 20
#define HIST_INT 5000
#define SENSOR_READ_INT 1500
#define MQTT_PUBLISH_PERIOD 10000
// Macros for debugging
#ifdef DEBUG_TELNET
#define DEBUG_TELNET_PORT 23
@@ -55,42 +40,61 @@
#define DEBUG_PRINTLN_WITH_FMT(x, fmt)
#endif
#define I2C_SDA_PIN 23
#define I2C_SCL_PIN 22
#define BATTERY_V_PIN 35
#define BAT_RATIO 0.0017240449438202
#define NTC_MAX_ADC 27550.00
#define NTC_REF_RES 62000
#define NTC_SMP_TMP 25.81
#define NTC_SMP_RES 52250
#define NTC_BCOEFFICIENT 4200 //3950
#define HIST_SIZE 20
#define HIST_INT 5000
#define SENSOR_READ_INT 1500
#define MQTT_PUBLISH_PERIOD 10000
Adafruit_ADS1115 g_ads (0x49); /* Use this for the 16-bit version */
AsyncWebServer g_server (80);
OneWire g_oneWireTemp (17);
DallasTemperature g_thermoCouples (&g_oneWireTemp);
DNSServer dns;
// MAX31850KATB+-ND
// MAX31850KATB+-ND sensors
DeviceAddress g_sensor1 = {0x3B, 0x45, 0x21, 0x18, 0x00, 0x00, 0x00, 0x2D};
DeviceAddress g_sensor2 = {0x3B, 0xF1, 0x22, 0x18, 0x00, 0x00, 0x00, 0xB8};
DeviceAddress g_sensor3 = {0x3B, 0xF3, 0x22, 0x18, 0x00, 0x00, 0x00, 0xD6};
DeviceAddress g_sensor4 = {0x3B, 0x43, 0x21, 0x18, 0x00, 0x00, 0x00, 0x9F};
double g_batteryVoltage = 0;
bool g_ntpError = false;
double g_batteryLevel = 0;
short g_maxWorkingSensors = 0;
bool firmwareUpdating = false;
bool g_shouldSaveConfig = false;
// Host name of the device.
const char* g_hostName= "BBQ_Master";
// MQTT stuff
WiFiClient espClient;
PubSubClient g_mqttClient(espClient);
WiFiClient g_espClient;
PubSubClient g_mqttClient(g_espClient);
// MQTT configs
#define MQTT_HOME_ASSISTANT_DISCOVERY_PREFIX "homeassistant"
char g_mqtt_server[40] = "example.com";
char g_mqtt_port[6] = "1883";
char g_topicMQTTHeader[22 + 11];
char g_topicAvailability[22 + 11 + 10];
char g_topicState[22 + 11 + 10];
char g_topicMQTTDiscover[22 + 11 + 10];
char g_uniqueId[5];
// Representation of one temperature probe
struct Sensor
{
// Availability flag
bool m_ind;
// Temperature
double m_tempF;
// Name of the sensor
String m_name;
public:
@@ -111,9 +115,6 @@ DataPoint g_lastSenUpdate;
// Saving the history for the histogram
SimpleList<DataPoint> g_tempHist;
// Flag for saving data from wifi portal
bool g_shouldSaveConfig = false;
// Handle telnet debuging
#if defined(DEBUG_TELNET)
void handleTelnet(void) {
@@ -134,8 +135,8 @@ void handleTelnet(void) {
void setupOTA(const char *hostname)
{
// Config OTA updates
ArduinoOTA.onStart([]() { DEBUG_PRINTLN("Start"); });
ArduinoOTA.onEnd([]() { DEBUG_PRINTLN("\nEnd"); });
ArduinoOTA.onStart([]() { DEBUG_PRINTLN("Start. Disbling regular work!"); firmwareUpdating=true;});
ArduinoOTA.onEnd([]() { DEBUG_PRINTLN("\nEnd"); firmwareUpdating = false;});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { DEBUG_PRINT_WITH_FMT("Progress: %u%%\r", (progress / (total / 100))); });
ArduinoOTA.onError([](ota_error_t error) {
DEBUG_PRINT_WITH_FMT("Error[%u]: ", error);
@@ -144,13 +145,14 @@ void setupOTA(const char *hostname)
else if (error == OTA_CONNECT_ERROR) DEBUG_PRINTLN("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) DEBUG_PRINTLN("Receive Failed");
else if (error == OTA_END_ERROR) DEBUG_PRINTLN("End Failed");
firmwareUpdating = false;
});
ArduinoOTA.setHostname(hostname);
ArduinoOTA.begin();
}
// Saving the config to SPIFF
void SaveConfig () {
void saveConfig () {
DynamicJsonDocument json (256);
json["mqtt_server"] = g_mqtt_server;
json["mqtt_port"] = g_mqtt_port;
@@ -164,7 +166,7 @@ void SaveConfig () {
}
// Reading the config from SPIFF
void ReadConfig ()
void readConfig ()
{
if (SPIFFS.begin()) {
DEBUG_PRINTLN("SPIFFS started");
@@ -190,14 +192,12 @@ void ReadConfig ()
} else {
DEBUG_PRINTLN("failed to load json config");
SaveConfig ();
saveConfig ();
}
}
}
else
{
SaveConfig ();
}
saveConfig ();
} else {
DEBUG_PRINTLN("Formatting the flash...");
SPIFFS.format();
@@ -205,14 +205,8 @@ void ReadConfig ()
}
}
// Call back for saving the config.
void SaveConfigCallback () {
DEBUG_PRINTLN("Should save config");
g_shouldSaveConfig = true;
}
// Manages wifi portal
void ManageWifi (bool reset_config = false)
void manageWifi (bool reset_config = false)
{
// The extra parameters to be configured (can be either global or just in the setup)
AsyncWiFiManagerParameter custom_mqtt_server("server", "MQTT server", g_mqtt_server, 39);
@@ -224,7 +218,9 @@ void ManageWifi (bool reset_config = false)
wifiManager.setMinimumSignalQuality(10);
wifiManager.addParameter(&custom_mqtt_server);
wifiManager.addParameter(&custom_mqtt_port);
wifiManager.setSaveConfigCallback(&SaveConfigCallback);
wifiManager.setSaveConfigCallback([](){
g_shouldSaveConfig = true;
});
if (reset_config)
wifiManager.startConfigPortal(g_hostName);
@@ -235,13 +231,13 @@ void ManageWifi (bool reset_config = false)
{
strncpy(g_mqtt_server, custom_mqtt_server.getValue(), 39);
strncpy(g_mqtt_port, custom_mqtt_port.getValue(), 5);
SaveConfig ();
saveConfig ();
g_shouldSaveConfig = false;
}
}
// Calculate NTC temp using steinhart equation
float NTCTemp (int16_t adcValue)
float calculateNTCTemp (int16_t adcValue)
{
if (adcValue < NTC_MAX_ADC)
{
@@ -264,7 +260,7 @@ float NTCTemp (int16_t adcValue)
}
// Check whether temperature is valid.
bool IsValidTemp (float temp)
bool isValidTemp (float temp)
{
if (temp <= 32.0 || temp > 1000.00)
return false;
@@ -272,10 +268,26 @@ bool IsValidTemp (float temp)
return true;
}
// Read all the sensors
void ReadSensors ()
// Battery precentage calculator
float batteryLevel()
{
g_batteryVoltage = analogRead (BATTERY_V_PIN) * BAT_RATIO;
float output = 0.0; //output value
const float battery_max = 4.20; //maximum voltage of battery
const float battery_min = 3.5; //minimum voltage of battery before shutdown
output = ((g_batteryVoltage - battery_min) / (battery_max - battery_min)) * 100;
if (output < 100)
return output;
else
return 100.0f;
}
// Read all the sensors
void readSensors ()
{
int16_t adc0, adc1, adc2, adc3;
float ntc0, ntc1, ntc2, ntc3;
// NTC readings
@@ -284,10 +296,10 @@ void ReadSensors ()
adc2 = g_ads.readADC_SingleEnded (2);
adc3 = g_ads.readADC_SingleEnded (3);
ntc0 = NTCTemp (adc0);
ntc1 = NTCTemp (adc1);
ntc2 = NTCTemp (adc2);
ntc3 = NTCTemp (adc3);
ntc0 = calculateNTCTemp (adc0);
ntc1 = calculateNTCTemp (adc1);
ntc2 = calculateNTCTemp (adc2);
ntc3 = calculateNTCTemp (adc3);
float tcp0, tcp1, tcp2, tcp3;
tcp0 = g_thermoCouples.getTempF (g_sensor1);
@@ -299,19 +311,19 @@ void ReadSensors ()
if (tps > 0)
{
g_lastSenUpdate.m_time = tps;
g_lastSenUpdate.m_sensors[0] = Sensor (IsValidTemp (ntc0), ntc0, "NTC1");
g_lastSenUpdate.m_sensors[1] = Sensor (IsValidTemp (ntc1), ntc1, "NTC2");
g_lastSenUpdate.m_sensors[2] = Sensor (IsValidTemp (ntc2), ntc2, "NTC3");
g_lastSenUpdate.m_sensors[3] = Sensor (IsValidTemp (ntc3), ntc3, "NTC4");
g_lastSenUpdate.m_sensors[0] = Sensor (isValidTemp (ntc0), ntc0, "NTC1");
g_lastSenUpdate.m_sensors[1] = Sensor (isValidTemp (ntc1), ntc1, "NTC2");
g_lastSenUpdate.m_sensors[2] = Sensor (isValidTemp (ntc2), ntc2, "NTC3");
g_lastSenUpdate.m_sensors[3] = Sensor (isValidTemp (ntc3), ntc3, "NTC4");
// Thermocouple readings
g_lastSenUpdate.m_sensors[4] = Sensor (IsValidTemp (tcp0), tcp0, "TC1");
g_lastSenUpdate.m_sensors[5] = Sensor (IsValidTemp (tcp1), tcp1, "TC2");
g_lastSenUpdate.m_sensors[6] = Sensor (IsValidTemp (tcp2), tcp2, "TC3");
g_lastSenUpdate.m_sensors[7] = Sensor (IsValidTemp (tcp3), tcp3, "TC4");
g_lastSenUpdate.m_sensors[4] = Sensor (isValidTemp (tcp0), tcp0, "TC1");
g_lastSenUpdate.m_sensors[5] = Sensor (isValidTemp (tcp1), tcp1, "TC2");
g_lastSenUpdate.m_sensors[6] = Sensor (isValidTemp (tcp2), tcp2, "TC3");
g_lastSenUpdate.m_sensors[7] = Sensor (isValidTemp (tcp3), tcp3, "TC4");
}
g_batteryVoltage = analogRead (BATTERY_V_PIN) * BAT_RATIO;
g_batteryLevel = batteryLevel ();
// Request thermo couple data
g_thermoCouples.setWaitForConversion(false); // makes it async
@@ -347,7 +359,7 @@ void ReadSensors ()
DynamicJsonDocument jsonSensorData ()
{
DynamicJsonDocument json(1024); // Current JSON static buffer
json["bat"] = g_batteryVoltage;
json["bat"] = g_batteryLevel;
json["t"] = g_lastSenUpdate.m_time;
JsonArray sensors = json.createNestedArray ("sensors");
@@ -362,18 +374,16 @@ DynamicJsonDocument jsonSensorData ()
return json;
}
// Send the last sensor data reading in json format.
void SendMeasures (AsyncWebServerRequest *request)
void sendMeasures (AsyncWebServerRequest *request)
{
char tempJson[1024];
serializeJson(jsonSensorData (), tempJson);
request->send (200, "application/json", tempJson); // Send history data to the web client
}
// Send the history in JSON format.
void SendHistory (AsyncWebServerRequest *request)
void sendHistory (AsyncWebServerRequest *request)
{
DEBUG_PRINTLN("Sending History");
DynamicJsonDocument json(5560 + 100); // Current JSON static buffer
@@ -401,7 +411,7 @@ void SendHistory (AsyncWebServerRequest *request)
}
// Add a data point to the history
void AddDataPointToHistory ()
void addDataPointToHistory ()
{
short validSensors = 0;
bool validData = false;
@@ -435,6 +445,7 @@ void AddDataPointToHistory ()
#endif
}
// Publish the MQTT payload.
void publishToMQTT(const char* p_topic,const char* p_payload) {
if (g_mqttClient.publish(p_topic, p_payload, true)) {
DEBUG_PRINT(F("INFO: MQTT message published successfully, topic: "));
@@ -452,7 +463,9 @@ void publishToMQTT(const char* p_topic,const char* p_payload) {
// Function that publishes birthMessage
void publishAvailability()
{
g_mqttClient.publish(g_topicAvailability, "online", true);
char topicAvailability[22 + 11 + 10];
snprintf(topicAvailability, 22 + 11 + 10, "%s/avail",g_topicMQTTHeader);
g_mqttClient.publish(topicAvailability, "online", true);
}
// Function that publishes availability of each sensor
@@ -469,77 +482,103 @@ void publishSensorAvailability()
}
}
// publish MQTT discovery config to let hassio auto discover the sensors.
// Publish MQTT discovery config to let hassio auto discover the sensors.
void publishDiscovery(void)
{
// Create json config for battery level.
StaticJsonDocument<220> root;
char uniqueId[15];
snprintf(uniqueId, 15, "%sbat", g_uniqueId);
char batDiscoverTopic[22 + 11 + 10];
snprintf(batDiscoverTopic, 22 + 11 + 10, "%s/bat/config", g_topicMQTTHeader);
StaticJsonDocument<500> root;
root["~"] = g_topicMQTTHeader;
root["dev_cla"] = "battery";
char batName[30];
snprintf(batName, 30, "%s Battery.", g_hostName);
root["name"] = batName;
root["avty_t"] = g_topicAvailability;
root["stat_t"] = g_topicState;
root["unit_of_meas"] = "V";
root["uniq_id"] = uniqueId;
root["name"] = "Battery";
root["avty_t"] = "~/avail";
root["stat_t"] = "~/state";
root["unit_of_meas"] = "%";
root["val_tpl"] = "{{value_json.bat}}";
char outgoingJsonBuffer[220];
root["device"]["ids"] = g_uniqueId;
root["device"]["name"] = g_hostName;
root["device"]["mf"] = "DIY";
root["device"]["mdl"] = "DIY";
root["device"]["sw"] = "1.1";
char outgoingJsonBuffer[500];
serializeJson(root, outgoingJsonBuffer);
publishToMQTT(g_topicMQTTDiscover, outgoingJsonBuffer);
publishToMQTT(batDiscoverTopic, outgoingJsonBuffer);
// Create json config for each sensor.
for (int i = 0; i < 8; i++)
{
char sensorTopicHeader[22 + 11 + 20];
snprintf(sensorTopicHeader, 22 + 11 + 20, "%s/%s/config", g_topicMQTTHeader, g_lastSenUpdate.m_sensors[i].m_name.c_str());
char sensorConfigTopic[22 + 11 + 20];
snprintf(sensorConfigTopic, 22 + 11 + 20, "%s/%s/config", g_topicMQTTHeader, g_lastSenUpdate.m_sensors[i].m_name.c_str());
char availabilitySensorTopic[15];
snprintf(availabilitySensorTopic, 15, "~/%s/avail", g_lastSenUpdate.m_sensors[i].m_name.c_str());
StaticJsonDocument<250> sensorRoot;
sensorRoot["dev_cla"] = "temperature";
char sensorId[15];
snprintf(sensorId, 15, "%s%s", g_uniqueId, g_lastSenUpdate.m_sensors[i].m_name.c_str());
char sensorName[30];
snprintf(sensorName, 30, "%s %s Temperature.", g_hostName, g_lastSenUpdate.m_sensors[i].m_name.c_str());
sensorRoot["name"] = sensorName;
char availabilitySensorTopic[50];
snprintf(availabilitySensorTopic, 22 + 11 + 20, "%s/%s/avail", g_topicMQTTHeader, g_lastSenUpdate.m_sensors[i].m_name.c_str());
sensorRoot["avty_t"] = availabilitySensorTopic;
sensorRoot["stat_t"] = g_topicState;
sensorRoot["unit_of_meas"] = "°F";
snprintf(sensorName, 30, "%s Temperature.", g_lastSenUpdate.m_sensors[i].m_name.c_str());
String jsonTemplate = "{{value_json.sensors[" + String(i) + "].v}}";
sensorRoot["val_tpl"] = jsonTemplate;
sensorRoot["exp_aft"] = MQTT_PUBLISH_PERIOD/1000 + 5;
char sensorDisBuffer[250];
StaticJsonDocument<500> sensorRoot;
sensorRoot["~"] = g_topicMQTTHeader;
sensorRoot["dev_cla"] = "temperature";
sensorRoot["uniq_id"] = sensorId;
sensorRoot["name"] = sensorName;
sensorRoot["avty_t"] = availabilitySensorTopic;
sensorRoot["stat_t"] = "~/state";
sensorRoot["unit_of_meas"] = "°F";
sensorRoot["val_tpl"] = jsonTemplate;
sensorRoot["exp_aft"] = MQTT_PUBLISH_PERIOD/1000 + 5; // Invalidate the data if there is no data for 15seconds.
sensorRoot["device"]["ids"] = g_uniqueId;
sensorRoot["device"]["name"] = g_hostName;
sensorRoot["device"]["mf"] = "DIY";
sensorRoot["device"]["mdl"] = "DIY";
sensorRoot["device"]["sw"] = "1.1";
char sensorDisBuffer[500];
serializeJson(sensorRoot, sensorDisBuffer);
publishToMQTT(sensorTopicHeader, sensorDisBuffer);
publishToMQTT(sensorConfigTopic, sensorDisBuffer);
}
}
// MQTT Connect.
void connectToMqtt()
{
DEBUG_PRINT("Connecting to MQTT with client id ");
String clientId = "BBQMaster_";
clientId += String(random(0xffff), HEX);
DEBUG_PRINT(clientId);
DEBUG_PRINTLN("...");
// Attempt to connect
if (g_mqttClient.connect(clientId.c_str(), "", "", g_topicAvailability, 0, true, "offline"))
{
DEBUG_PRINT("Connecting to MQTT with client id ");
String clientId = "BBQMaster_";
clientId += String(random(0xffff), HEX);
DEBUG_PRINT(clientId);
DEBUG_PRINTLN("...");
char topicAvailability[22 + 11 + 10];
snprintf(topicAvailability, 22 + 11 + 10, "%s/avail",g_topicMQTTHeader);
// Attempt to connect
if (g_mqttClient.connect(clientId.c_str(), "", "", topicAvailability, 0, true, "offline"))
{
publishAvailability();
publishDiscovery();
}
else
{
}
else
{
DEBUG_PRINT("Failed to connect to MQTT! ");
DEBUG_PRINT(g_mqttClient.state());
DEBUG_PRINTLN(" Trying again in 5 seconds");
}
DEBUG_PRINTLN(" Trying again in 60 seconds");
}
}
// Publish MQTT states
void publishMqtt()
void publishDataToMqtt()
{
char topicState[22 + 11 + 10];
snprintf(topicState, 22 + 11 + 10, "%s/state", g_topicMQTTHeader);
char tempJson[1024];
serializeJson(jsonSensorData (), tempJson);
publishToMQTT (g_topicState, tempJson);
publishToMQTT (topicState, tempJson);
publishSensorAvailability();
}
@@ -559,14 +598,15 @@ void setup (void)
g_thermoCouples.setResolution (12);
// Read mqtt config from SPIFF
ReadConfig ();
readConfig ();
// WIFI connect
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
WiFi.setHostname(g_hostName);
WiFi.mode(WIFI_STA);
ManageWifi ();
manageWifi ();
// Start the telnet server
#if defined(DEBUG_TELNET)
telnetServer.begin();
telnetServer.setNoDelay(true);
@@ -577,11 +617,17 @@ void setup (void)
// OTA stuff
setupOTA (g_hostName);
// Get a unique ID using the mac address
byte mac[7];
WiFi.macAddress(mac);
mac[6] = '\0';
snprintf(g_uniqueId, 20, "%02X%02X", mac[4], mac[5]);
// Web server stuff
if (!SPIFFS.begin ())
DEBUG_PRINTLN("SPIFFS Mount failed"); // Problème avec le stockage SPIFFS - Serious problem with SPIFFS
g_server.on ("/measures.json", SendMeasures);
g_server.on ("/history.json", SendHistory);
g_server.on ("/measures.json", sendMeasures);
g_server.on ("/history.json", sendHistory);
g_server.serveStatic ("/js/bootstrap.min.js", SPIFFS, "/js/bootstrap.min.js", "max-age=86400");
g_server.serveStatic ("/js/jquery.min.js", SPIFFS, "/js/jquery-3.3.1.min.js", "max-age=86400");
@@ -606,7 +652,6 @@ void setup (void)
DEBUG_PRINTLN("NTP server not reachable");
else if (error == invalidAddress)
DEBUG_PRINTLN("Invalid NTP server address");
g_ntpError = true;
}
else
{
@@ -619,60 +664,62 @@ void setup (void)
NTP.setInterval (240);
// MQTT Config
snprintf(g_topicMQTTHeader, 22 + 11, "homeassistant/sensor/%s", g_hostName);
snprintf(g_topicAvailability, 22 + 11 + 10, "%s/avail",g_topicMQTTHeader);
snprintf(g_topicState, 22 + 11 + 10, "%s/state", g_topicMQTTHeader);
snprintf(g_topicMQTTDiscover, 22 + 11 + 10, "%s/config", g_topicMQTTHeader);
snprintf(g_topicMQTTHeader, 22 + 11, "%s/sensor/%s", MQTT_HOME_ASSISTANT_DISCOVERY_PREFIX, g_hostName);
g_mqttClient.setServer(g_mqtt_server, atoi(g_mqtt_port));
g_mqttClient.setBufferSize(512);
// connectToMqtt ();
randomSeed(micros());
}
void loop (void)
{
// handle the Telnet connection
// handle the Telnet connection
#if defined(DEBUG_TELNET)
handleTelnet();
handleTelnet();
#endif
unsigned long currentMillis = millis (); // Time now
// Handle server requests
ArduinoOTA.handle ();
// Connect to MQTT server
if (!g_mqttClient.connected())
if (!firmwareUpdating)
{
static unsigned long mqttConnectWaitPeriod;
if (currentMillis - mqttConnectWaitPeriod >= 5000)
// Connect to MQTT server
if (!g_mqttClient.connected())
{
mqttConnectWaitPeriod = currentMillis;
connectToMqtt ();
static unsigned long mqttConnectWaitPeriod;
if (currentMillis - mqttConnectWaitPeriod >= 30000)
{
mqttConnectWaitPeriod = currentMillis;
connectToMqtt ();
}
}
g_mqttClient.loop();
// Add a point to the history over time.
static unsigned long histPreviousMillis;
if (currentMillis - histPreviousMillis > HIST_INT)
{
histPreviousMillis = currentMillis;
addDataPointToHistory ();
}
}
g_mqttClient.loop();
// Add a point to the history over time.
static unsigned long histPreviousMillis;
if (currentMillis - histPreviousMillis > HIST_INT)
{
histPreviousMillis = currentMillis;
AddDataPointToHistory ();
}
// Read the sensor data.
static unsigned long prevMilForInputRead;
if (currentMillis - prevMilForInputRead >= SENSOR_READ_INT)
{
prevMilForInputRead = currentMillis;
readSensors ();
}
// Read the sensor data.
static unsigned long prevMilForInputRead;
if (currentMillis - prevMilForInputRead >= SENSOR_READ_INT)
{
prevMilForInputRead = currentMillis;
ReadSensors ();
}
// Send MQTT state.
static unsigned long prevMilForMqttPublish;
if (currentMillis - prevMilForMqttPublish >= MQTT_PUBLISH_PERIOD)
{
prevMilForMqttPublish = currentMillis;
publishMqtt ();
// Send MQTT state.
static unsigned long prevMilForMqttPublish;
if (currentMillis - prevMilForMqttPublish >= MQTT_PUBLISH_PERIOD)
{
prevMilForMqttPublish = currentMillis;
if (g_mqttClient.connected())
publishDataToMqtt ();
}
}
}