diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index 7f01da2d..23628c81 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -128,6 +128,7 @@ void setup() { hw.setTempSensorPin(config.getTempSensorPin()); hw.setVccPin(config.getVccPin()); hw.setVccMultiplier(config.getVccMultiplier()); + hw.setVccOffset(config.getVccOffset()); hw.ledBlink(LED_INTERNAL, 1); hw.ledBlink(LED_RED, 1); hw.ledBlink(LED_YELLOW, 1); @@ -276,7 +277,7 @@ bool longPressActive = false; bool wifiConnected = false; -unsigned long lastTemperatureRead = -30000; +unsigned long lastTemperatureRead = 0; float temperatures[32]; unsigned long lastRead = 0; @@ -327,39 +328,41 @@ void loop() { } } - if(now - lastTemperatureRead > 10000) { + if(now - lastTemperatureRead > 15000) { hw.updateTemperatures(); lastTemperatureRead = now; - bool anyChanged = false; - uint8_t c = hw.getTempSensorCount(); - for(int i = 0; i < c; i++) { - bool changed = false; - TempSensorData* data = hw.getTempSensorData(i); - if(data->lastValidRead > -85) { - changed = data->lastValidRead != temperatures[i]; - temperatures[i] = data->lastValidRead; - } - - if((changed && config.getMqttPayloadFormat() == 1) || config.getMqttPayloadFormat() == 2) { - mqtt.publish(String(config.getMqttPublishTopic()) + "/temperature/" + toHex(data->address), String(temperatures[i], 2)); - } - - anyChanged |= changed; - } - - if(anyChanged && config.getMqttPayloadFormat() == 0) { - StaticJsonDocument<512> json; - JsonObject temps = json.createNestedObject("temperatures"); + if(strlen(config.getMqttHost()) > 0) { + bool anyChanged = false; + uint8_t c = hw.getTempSensorCount(); for(int i = 0; i < c; i++) { - TempSensorData* data = hw.getTempSensorData(i); - JsonObject obj = temps.createNestedObject(toHex(data->address)); - obj["name"] = data->name; - obj["value"] = serialized(String(temperatures[i], 2)); + bool changed = false; + TempSensorData* data = hw.getTempSensorData(i); + if(data->lastValidRead > -85) { + changed = data->lastValidRead != temperatures[i]; + temperatures[i] = data->lastValidRead; + } + + if((changed && config.getMqttPayloadFormat() == 1) || config.getMqttPayloadFormat() == 2) { + mqtt.publish(String(config.getMqttPublishTopic()) + "/temperature/" + toHex(data->address), String(temperatures[i], 2)); + } + + anyChanged |= changed; + } + + if(anyChanged && config.getMqttPayloadFormat() == 0) { + StaticJsonDocument<512> json; + JsonObject temps = json.createNestedObject("temperatures"); + for(int i = 0; i < c; i++) { + TempSensorData* data = hw.getTempSensorData(i); + JsonObject obj = temps.createNestedObject(toHex(data->address)); + obj["name"] = data->name; + obj["value"] = serialized(String(temperatures[i], 2)); + } + String msg; + serializeJson(json, msg); + mqtt.publish(config.getMqttPublishTopic(), msg.c_str()); } - String msg; - serializeJson(json, msg); - mqtt.publish(config.getMqttPublishTopic(), msg.c_str()); } } @@ -384,7 +387,7 @@ void loop() { debugI("Successfully connected to WiFi!"); debugI("IP: %s", WiFi.localIP().toString().c_str()); } - if(strlen(config.getWifiHostname()) > 0) { + if(strlen(config.getWifiHostname()) > 0 && config.isMdnsEnable()) { MDNS.begin(config.getWifiHostname()); MDNS.addService("http", "tcp", 80); } diff --git a/src/HwTools.cpp b/src/HwTools.cpp index 09f49582..ff8bc68c 100644 --- a/src/HwTools.cpp +++ b/src/HwTools.cpp @@ -88,38 +88,53 @@ bool HwTools::updateTemperatures() { sensorApi->begin(); delay(50); tempSensorInit = true; - } - DeviceAddress addr; - sensorApi->requestTemperatures(); - int c = sensorApi->getDeviceCount(); - for(int i = 0; i < c; i++) { - bool found = false; - sensorApi->getAddress(addr, i); - float t = sensorApi->getTempC(addr); - for(int x = 0; x < sensorCount; x++) { - TempSensorData *data = tempSensors[x]; - if(isSensorAddressEqual(data->address, addr)) { - found = true; + DeviceAddress addr; + sensorApi->requestTemperatures(); + int c = sensorApi->getDeviceCount(); + Serial.print("Sensors found: "); + Serial.println(c); + for(int i = 0; i < c; i++) { + bool found = false; + sensorApi->getAddress(addr, i); + float t = sensorApi->getTempC(addr); + for(int x = 0; x < sensorCount; x++) { + TempSensorData *data = tempSensors[x]; + if(isSensorAddressEqual(data->address, addr)) { + found = true; + data->lastRead = t; + if(t > -85) { + data->lastValidRead = t; + } + } + } + if(!found) { + TempSensorData *data = new TempSensorData(); + memcpy(data->address, addr, 8); + data->common = true; data->lastRead = t; if(t > -85) { data->lastValidRead = t; } + + tempSensors[sensorCount] = data; + sensorCount++; } + delay(10); } - if(!found) { - TempSensorData *data = new TempSensorData(); - memcpy(data->address, addr, 8); - data->common = true; + } else { + sensorApi->requestTemperatures(); + + for(int x = 0; x < sensorCount; x++) { + TempSensorData *data = tempSensors[x]; + float t = sensorApi->getTempC(data->address); data->lastRead = t; if(t > -85) { data->lastValidRead = t; } - - tempSensors[sensorCount] = data; - sensorCount++; } } + return true; } return false; diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index 7748582f..2ab55b22 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -41,6 +41,7 @@ void AmsWebServer::setup(AmsConfiguration* config, MQTTClient* mqtt) { server.on("/", HTTP_POST, std::bind(&AmsWebServer::handleSetup, this)); server.on("/application.js", HTTP_GET, std::bind(&AmsWebServer::applicationJs, this)); server.on("/temperature", HTTP_GET, std::bind(&AmsWebServer::temperature, this)); + server.on("/temperature", HTTP_POST, std::bind(&AmsWebServer::temperaturePost, this)); server.on("/config-meter", HTTP_GET, std::bind(&AmsWebServer::configMeterHtml, this)); server.on("/config-wifi", HTTP_GET, std::bind(&AmsWebServer::configWifiHtml, this)); server.on("/config-mqtt", HTTP_GET, std::bind(&AmsWebServer::configMqttHtml, this)); @@ -132,20 +133,40 @@ void AmsWebServer::temperature() { server.sendHeader("Expires", "-1"); String html; - uint8_t c = hw->getTempSensorCount(); - for(int i = 0; i < c; i++) { + int c = hw->getTempSensorCount(); + + int start = server.hasArg("start") && !server.arg("start").isEmpty() ? server.arg("start").toInt() : 0; + int end = min(start + 4, c); + + for(int i = start; i < end; i++) { TempSensorData* data = hw->getTempSensorData(i); String row = String((const __FlashStringHelper*) TEMPERATURE_ROW_HTML); - row.replace("${index}", String(i, DEC)); - row.replace("${address}", toHex(data->address)); + row.replace("${index}", String(i-start, DEC)); + row.replace("${address}", toHex(data->address, 8)); row.replace("${name}", data->name); row.replace("${common}", data->common ? "checked" : ""); - row.replace("${value}", String(data->lastRead, 1)); + row.replace("${value}", data->lastRead > -85 ? String(data->lastRead, 1) : "N/A"); html += row; } + if(start > 0 || end < c) { + html += "