Replace all Serial by MessageOutput

This commit is contained in:
Thomas Basler 2022-12-19 21:01:29 +01:00
parent cd5d5edd5f
commit 8b60c29667
6 changed files with 108 additions and 99 deletions

View File

@ -3,6 +3,7 @@
* Copyright (C) 2022 Thomas Basler and others * Copyright (C) 2022 Thomas Basler and others
*/ */
#include "Configuration.h" #include "Configuration.h"
#include "MessageOutput.h"
#include "defaults.h" #include "defaults.h"
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <LittleFS.h> #include <LittleFS.h>
@ -95,7 +96,7 @@ bool ConfigurationClass::write()
// Serialize JSON to file // Serialize JSON to file
if (serializeJson(doc, f) == 0) { if (serializeJson(doc, f) == 0) {
Serial.println("Failed to write file"); MessageOutput.println("Failed to write file");
return false; return false;
} }
@ -111,7 +112,7 @@ bool ConfigurationClass::read()
// Deserialize the JSON document // Deserialize the JSON document
DeserializationError error = deserializeJson(doc, f); DeserializationError error = deserializeJson(doc, f);
if (error) { if (error) {
Serial.println(F("Failed to read file, using default configuration")); MessageOutput.println(F("Failed to read file, using default configuration"));
} }
JsonObject cfg = doc["cfg"]; JsonObject cfg = doc["cfg"];
@ -222,7 +223,7 @@ void ConfigurationClass::migrate()
if (config.Cfg_Version < 0x00011700) { if (config.Cfg_Version < 0x00011700) {
File f = LittleFS.open(CONFIG_FILENAME, "r", false); File f = LittleFS.open(CONFIG_FILENAME, "r", false);
if (!f) { if (!f) {
Serial.println(F("Failed to open file, cancel migration")); MessageOutput.println(F("Failed to open file, cancel migration"));
return; return;
} }
@ -230,7 +231,7 @@ void ConfigurationClass::migrate()
// Deserialize the JSON document // Deserialize the JSON document
DeserializationError error = deserializeJson(doc, f); DeserializationError error = deserializeJson(doc, f);
if (error) { if (error) {
Serial.println(F("Failed to read file, cancel migration")); MessageOutput.println(F("Failed to read file, cancel migration"));
return; return;
} }

View File

@ -3,6 +3,7 @@
* Copyright (C) 2022 Thomas Basler and others * Copyright (C) 2022 Thomas Basler and others
*/ */
#include "MqttHandleInverter.h" #include "MqttHandleInverter.h"
#include "MessageOutput.h"
#include "MqttSettings.h" #include "MqttSettings.h"
#include <ctime> #include <ctime>
@ -168,7 +169,7 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro
auto inv = Hoymiles.getInverterBySerial(serial); auto inv = Hoymiles.getInverterBySerial(serial);
if (inv == nullptr) { if (inv == nullptr) {
Serial.println(F("Inverter not found")); MessageOutput.println(F("Inverter not found"));
return; return;
} }
@ -185,44 +186,44 @@ void MqttHandleInverterClass::onMqttMessage(const espMqttClientTypes::MessagePro
if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_RELATIVE)) { if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_RELATIVE)) {
// Set inverter limit relative persistent // Set inverter limit relative persistent
Serial.printf("Limit Persistent: %d %%\n", payload_val); MessageOutput.printf("Limit Persistent: %d %%\n", payload_val);
inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativPersistent); inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativPersistent);
} else if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE)) { } else if (!strcmp(setting, TOPIC_SUB_LIMIT_PERSISTENT_ABSOLUTE)) {
// Set inverter limit absolute persistent // Set inverter limit absolute persistent
Serial.printf("Limit Persistent: %d W\n", payload_val); MessageOutput.printf("Limit Persistent: %d W\n", payload_val);
inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutPersistent); inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutPersistent);
} else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE)) { } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_RELATIVE)) {
// Set inverter limit relative non persistent // Set inverter limit relative non persistent
Serial.printf("Limit Non-Persistent: %d %%\n", payload_val); MessageOutput.printf("Limit Non-Persistent: %d %%\n", payload_val);
if (!properties.retain) { if (!properties.retain) {
inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativNonPersistent); inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::RelativNonPersistent);
} else { } else {
Serial.println("Ignored because retained"); MessageOutput.println("Ignored because retained");
} }
} else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE)) { } else if (!strcmp(setting, TOPIC_SUB_LIMIT_NONPERSISTENT_ABSOLUTE)) {
// Set inverter limit absolute non persistent // Set inverter limit absolute non persistent
Serial.printf("Limit Non-Persistent: %d W\n", payload_val); MessageOutput.printf("Limit Non-Persistent: %d W\n", payload_val);
if (!properties.retain) { if (!properties.retain) {
inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutNonPersistent); inv->sendActivePowerControlRequest(Hoymiles.getRadio(), payload_val, PowerLimitControlType::AbsolutNonPersistent);
} else { } else {
Serial.println("Ignored because retained"); MessageOutput.println("Ignored because retained");
} }
} else if (!strcmp(setting, TOPIC_SUB_POWER)) { } else if (!strcmp(setting, TOPIC_SUB_POWER)) {
// Turn inverter on or off // Turn inverter on or off
Serial.printf("Set inverter power to: %d\n", payload_val); MessageOutput.printf("Set inverter power to: %d\n", payload_val);
inv->sendPowerControlRequest(Hoymiles.getRadio(), payload_val > 0); inv->sendPowerControlRequest(Hoymiles.getRadio(), payload_val > 0);
} else if (!strcmp(setting, TOPIC_SUB_RESTART)) { } else if (!strcmp(setting, TOPIC_SUB_RESTART)) {
// Restart inverter // Restart inverter
Serial.printf("Restart inverter\n"); MessageOutput.printf("Restart inverter\n");
if (!properties.retain && payload_val == 1) { if (!properties.retain && payload_val == 1) {
inv->sendRestartControlRequest(Hoymiles.getRadio()); inv->sendRestartControlRequest(Hoymiles.getRadio());
} else { } else {
Serial.println("Ignored because retained"); MessageOutput.println("Ignored because retained");
} }
} }
} }

View File

@ -3,6 +3,7 @@
* Copyright (C) 2022 Thomas Basler and others * Copyright (C) 2022 Thomas Basler and others
*/ */
#include "MqttSettings.h" #include "MqttSettings.h"
#include "MessageOutput.h"
#include "Configuration.h" #include "Configuration.h"
MqttSettingsClass::MqttSettingsClass() MqttSettingsClass::MqttSettingsClass()
@ -13,11 +14,11 @@ void MqttSettingsClass::NetworkEvent(network_event event)
{ {
switch (event) { switch (event) {
case network_event::NETWORK_GOT_IP: case network_event::NETWORK_GOT_IP:
Serial.println(F("Network connected")); MessageOutput.println(F("Network connected"));
performConnect(); performConnect();
break; break;
case network_event::NETWORK_DISCONNECTED: case network_event::NETWORK_DISCONNECTED:
Serial.println(F("Network lost connection")); MessageOutput.println(F("Network lost connection"));
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
break; break;
default: default:
@ -27,7 +28,7 @@ void MqttSettingsClass::NetworkEvent(network_event event)
void MqttSettingsClass::onMqttConnect(bool sessionPresent) void MqttSettingsClass::onMqttConnect(bool sessionPresent)
{ {
Serial.println(F("Connected to MQTT.")); MessageOutput.println(F("Connected to MQTT."));
const CONFIG_T& config = Configuration.get(); const CONFIG_T& config = Configuration.get();
publish(config.Mqtt_LwtTopic, config.Mqtt_LwtValue_Online); publish(config.Mqtt_LwtTopic, config.Mqtt_LwtValue_Online);
@ -50,30 +51,30 @@ void MqttSettingsClass::unsubscribe(const String& topic)
void MqttSettingsClass::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) void MqttSettingsClass::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason)
{ {
Serial.println(F("Disconnected from MQTT.")); MessageOutput.println(F("Disconnected from MQTT."));
Serial.print(F("Disconnect reason:")); MessageOutput.print(F("Disconnect reason:"));
switch (reason) { switch (reason) {
case espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED: case espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED:
Serial.println(F("TCP_DISCONNECTED")); MessageOutput.println(F("TCP_DISCONNECTED"));
break; break;
case espMqttClientTypes::DisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION: case espMqttClientTypes::DisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION:
Serial.println(F("MQTT_UNACCEPTABLE_PROTOCOL_VERSION")); MessageOutput.println(F("MQTT_UNACCEPTABLE_PROTOCOL_VERSION"));
break; break;
case espMqttClientTypes::DisconnectReason::MQTT_IDENTIFIER_REJECTED: case espMqttClientTypes::DisconnectReason::MQTT_IDENTIFIER_REJECTED:
Serial.println(F("MQTT_IDENTIFIER_REJECTED")); MessageOutput.println(F("MQTT_IDENTIFIER_REJECTED"));
break; break;
case espMqttClientTypes::DisconnectReason::MQTT_SERVER_UNAVAILABLE: case espMqttClientTypes::DisconnectReason::MQTT_SERVER_UNAVAILABLE:
Serial.println(F("MQTT_SERVER_UNAVAILABLE")); MessageOutput.println(F("MQTT_SERVER_UNAVAILABLE"));
break; break;
case espMqttClientTypes::DisconnectReason::MQTT_MALFORMED_CREDENTIALS: case espMqttClientTypes::DisconnectReason::MQTT_MALFORMED_CREDENTIALS:
Serial.println(F("MQTT_MALFORMED_CREDENTIALS")); MessageOutput.println(F("MQTT_MALFORMED_CREDENTIALS"));
break; break;
case espMqttClientTypes::DisconnectReason::MQTT_NOT_AUTHORIZED: case espMqttClientTypes::DisconnectReason::MQTT_NOT_AUTHORIZED:
Serial.println(F("MQTT_NOT_AUTHORIZED")); MessageOutput.println(F("MQTT_NOT_AUTHORIZED"));
break; break;
default: default:
Serial.println(F("Unknown")); MessageOutput.println(F("Unknown"));
} }
mqttReconnectTimer.once( mqttReconnectTimer.once(
2, +[](MqttSettingsClass* instance) { instance->performConnect(); }, this); 2, +[](MqttSettingsClass* instance) { instance->performConnect(); }, this);
@ -81,8 +82,8 @@ void MqttSettingsClass::onMqttDisconnect(espMqttClientTypes::DisconnectReason re
void MqttSettingsClass::onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total) void MqttSettingsClass::onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total)
{ {
Serial.print(F("Received MQTT message on topic: ")); MessageOutput.print(F("Received MQTT message on topic: "));
Serial.println(topic); MessageOutput.println(topic);
_mqttSubscribeParser.handle_message(properties, topic, payload, len, index, total); _mqttSubscribeParser.handle_message(properties, topic, payload, len, index, total);
} }
@ -96,7 +97,7 @@ void MqttSettingsClass::performConnect()
using std::placeholders::_4; using std::placeholders::_4;
using std::placeholders::_5; using std::placeholders::_5;
using std::placeholders::_6; using std::placeholders::_6;
Serial.println(F("Connecting to MQTT...")); MessageOutput.println(F("Connecting to MQTT..."));
const CONFIG_T& config = Configuration.get(); const CONFIG_T& config = Configuration.get();
willTopic = getPrefix() + config.Mqtt_LwtTopic; willTopic = getPrefix() + config.Mqtt_LwtTopic;
clientId = NetworkSettings.getApName(); clientId = NetworkSettings.getApName();

View File

@ -4,6 +4,7 @@
*/ */
#include "NetworkSettings.h" #include "NetworkSettings.h"
#include "Configuration.h" #include "Configuration.h"
#include "MessageOutput.h"
#include "Utils.h" #include "Utils.h"
#include "defaults.h" #include "defaults.h"
#ifdef OPENDTU_ETHERNET #ifdef OPENDTU_ETHERNET
@ -30,30 +31,30 @@ void NetworkSettingsClass::NetworkEvent(WiFiEvent_t event)
switch (event) { switch (event) {
#ifdef OPENDTU_ETHERNET #ifdef OPENDTU_ETHERNET
case ARDUINO_EVENT_ETH_START: case ARDUINO_EVENT_ETH_START:
Serial.println(F("ETH start")); MessageOutput.println(F("ETH start"));
if (_networkMode == network_mode::Ethernet) { if (_networkMode == network_mode::Ethernet) {
raiseEvent(network_event::NETWORK_START); raiseEvent(network_event::NETWORK_START);
} }
break; break;
case ARDUINO_EVENT_ETH_STOP: case ARDUINO_EVENT_ETH_STOP:
Serial.println(F("ETH stop")); MessageOutput.println(F("ETH stop"));
if (_networkMode == network_mode::Ethernet) { if (_networkMode == network_mode::Ethernet) {
raiseEvent(network_event::NETWORK_STOP); raiseEvent(network_event::NETWORK_STOP);
} }
break; break;
case ARDUINO_EVENT_ETH_CONNECTED: case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println(F("ETH connected")); MessageOutput.println(F("ETH connected"));
_ethConnected = true; _ethConnected = true;
raiseEvent(network_event::NETWORK_CONNECTED); raiseEvent(network_event::NETWORK_CONNECTED);
break; break;
case ARDUINO_EVENT_ETH_GOT_IP: case ARDUINO_EVENT_ETH_GOT_IP:
Serial.printf("ETH got IP: %s\n", ETH.localIP().toString().c_str()); MessageOutput.printf("ETH got IP: %s\n", ETH.localIP().toString().c_str());
if (_networkMode == network_mode::Ethernet) { if (_networkMode == network_mode::Ethernet) {
raiseEvent(network_event::NETWORK_GOT_IP); raiseEvent(network_event::NETWORK_GOT_IP);
} }
break; break;
case ARDUINO_EVENT_ETH_DISCONNECTED: case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println(F("ETH disconnected")); MessageOutput.println(F("ETH disconnected"));
_ethConnected = false; _ethConnected = false;
if (_networkMode == network_mode::Ethernet) { if (_networkMode == network_mode::Ethernet) {
raiseEvent(network_event::NETWORK_DISCONNECTED); raiseEvent(network_event::NETWORK_DISCONNECTED);
@ -61,21 +62,21 @@ void NetworkSettingsClass::NetworkEvent(WiFiEvent_t event)
break; break;
#endif #endif
case ARDUINO_EVENT_WIFI_STA_CONNECTED: case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.println(F("WiFi connected")); MessageOutput.println(F("WiFi connected"));
if (_networkMode == network_mode::WiFi) { if (_networkMode == network_mode::WiFi) {
raiseEvent(network_event::NETWORK_CONNECTED); raiseEvent(network_event::NETWORK_CONNECTED);
} }
break; break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.println(F("WiFi disconnected")); MessageOutput.println(F("WiFi disconnected"));
if (_networkMode == network_mode::WiFi) { if (_networkMode == network_mode::WiFi) {
Serial.println(F("Try reconnecting")); MessageOutput.println(F("Try reconnecting"));
WiFi.reconnect(); WiFi.reconnect();
raiseEvent(network_event::NETWORK_DISCONNECTED); raiseEvent(network_event::NETWORK_DISCONNECTED);
} }
break; break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP: case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.printf("WiFi got ip: %s\n", WiFi.localIP().toString().c_str()); MessageOutput.printf("WiFi got ip: %s\n", WiFi.localIP().toString().c_str());
if (_networkMode == network_mode::WiFi) { if (_networkMode == network_mode::WiFi) {
raiseEvent(network_event::NETWORK_GOT_IP); raiseEvent(network_event::NETWORK_GOT_IP);
} }
@ -151,7 +152,7 @@ void NetworkSettingsClass::loop()
if (_ethConnected) { if (_ethConnected) {
if (_networkMode != network_mode::Ethernet) { if (_networkMode != network_mode::Ethernet) {
// Do stuff when switching to Ethernet mode // Do stuff when switching to Ethernet mode
Serial.println(F("Switch to Ethernet mode")); MessageOutput.println(F("Switch to Ethernet mode"));
_networkMode = network_mode::Ethernet; _networkMode = network_mode::Ethernet;
WiFi.mode(WIFI_MODE_NULL); WiFi.mode(WIFI_MODE_NULL);
setStaticIp(); setStaticIp();
@ -161,7 +162,7 @@ void NetworkSettingsClass::loop()
#endif #endif
if (_networkMode != network_mode::WiFi) { if (_networkMode != network_mode::WiFi) {
// Do stuff when switching to Ethernet mode // Do stuff when switching to Ethernet mode
Serial.println(F("Switch to WiFi mode")); MessageOutput.println(F("Switch to WiFi mode"));
_networkMode = network_mode::WiFi; _networkMode = network_mode::WiFi;
enableAdminMode(); enableAdminMode();
applyConfig(); applyConfig();
@ -182,7 +183,7 @@ void NetworkSettingsClass::loop()
// seconds, disable the internal Access Point // seconds, disable the internal Access Point
if (adminTimeoutCounter > ADMIN_TIMEOUT) { if (adminTimeoutCounter > ADMIN_TIMEOUT) {
adminEnabled = false; adminEnabled = false;
Serial.println(F("Admin mode disabled")); MessageOutput.println(F("Admin mode disabled"));
setupMode(); setupMode();
} }
// It's nearly not possible to use the internal AP if the // It's nearly not possible to use the internal AP if the
@ -193,16 +194,16 @@ void NetworkSettingsClass::loop()
connectRedoTimer = 0; connectRedoTimer = 0;
} else { } else {
if (connectTimeoutTimer > WIFI_RECONNECT_TIMEOUT && !forceDisconnection) { if (connectTimeoutTimer > WIFI_RECONNECT_TIMEOUT && !forceDisconnection) {
Serial.print(F("Disable search for AP... ")); MessageOutput.print(F("Disable search for AP... "));
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
Serial.println(F("done")); MessageOutput.println(F("done"));
connectRedoTimer = 0; connectRedoTimer = 0;
forceDisconnection = true; forceDisconnection = true;
} }
if (connectRedoTimer > WIFI_RECONNECT_REDO_TIMEOUT && forceDisconnection) { if (connectRedoTimer > WIFI_RECONNECT_REDO_TIMEOUT && forceDisconnection) {
Serial.print(F("Enable search for AP... ")); MessageOutput.print(F("Enable search for AP... "));
WiFi.mode(WIFI_AP_STA); WiFi.mode(WIFI_AP_STA);
Serial.println(F("done")); MessageOutput.println(F("done"));
applyConfig(); applyConfig();
connectTimeoutTimer = 0; connectTimeoutTimer = 0;
forceDisconnection = false; forceDisconnection = false;
@ -220,28 +221,28 @@ void NetworkSettingsClass::applyConfig()
if (!strcmp(Configuration.get().WiFi_Ssid, "")) { if (!strcmp(Configuration.get().WiFi_Ssid, "")) {
return; return;
} }
Serial.print(F("Configuring WiFi STA using ")); MessageOutput.print(F("Configuring WiFi STA using "));
if (strcmp(WiFi.SSID().c_str(), Configuration.get().WiFi_Ssid) || strcmp(WiFi.psk().c_str(), Configuration.get().WiFi_Password)) { if (strcmp(WiFi.SSID().c_str(), Configuration.get().WiFi_Ssid) || strcmp(WiFi.psk().c_str(), Configuration.get().WiFi_Password)) {
Serial.print(F("new credentials... ")); MessageOutput.print(F("new credentials... "));
WiFi.begin( WiFi.begin(
Configuration.get().WiFi_Ssid, Configuration.get().WiFi_Ssid,
Configuration.get().WiFi_Password); Configuration.get().WiFi_Password);
} else { } else {
Serial.print(F("existing credentials... ")); MessageOutput.print(F("existing credentials... "));
WiFi.begin(); WiFi.begin();
} }
Serial.println(F("done")); MessageOutput.println(F("done"));
setStaticIp(); setStaticIp();
} }
void NetworkSettingsClass::setHostname() void NetworkSettingsClass::setHostname()
{ {
Serial.print(F("Setting Hostname... ")); MessageOutput.print(F("Setting Hostname... "));
if (_networkMode == network_mode::WiFi) { if (_networkMode == network_mode::WiFi) {
if (WiFi.hostname(getHostname())) { if (WiFi.hostname(getHostname())) {
Serial.println(F("done")); MessageOutput.println(F("done"));
} else { } else {
Serial.println(F("failed")); MessageOutput.println(F("failed"));
} }
// Evil bad hack to get the hostname set up correctly // Evil bad hack to get the hostname set up correctly
@ -252,9 +253,9 @@ void NetworkSettingsClass::setHostname()
#ifdef OPENDTU_ETHERNET #ifdef OPENDTU_ETHERNET
else if (_networkMode == network_mode::Ethernet) { else if (_networkMode == network_mode::Ethernet) {
if (ETH.setHostname(getHostname().c_str())) { if (ETH.setHostname(getHostname().c_str())) {
Serial.println(F("done")); MessageOutput.println(F("done"));
} else { } else {
Serial.println(F("failed")); MessageOutput.println(F("failed"));
} }
} }
#endif #endif
@ -264,35 +265,35 @@ void NetworkSettingsClass::setStaticIp()
{ {
if (_networkMode == network_mode::WiFi) { if (_networkMode == network_mode::WiFi) {
if (Configuration.get().WiFi_Dhcp) { if (Configuration.get().WiFi_Dhcp) {
Serial.print(F("Configuring WiFi STA DHCP IP... ")); MessageOutput.print(F("Configuring WiFi STA DHCP IP... "));
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
Serial.println(F("done")); MessageOutput.println(F("done"));
} else { } else {
Serial.print(F("Configuring WiFi STA static IP... ")); MessageOutput.print(F("Configuring WiFi STA static IP... "));
WiFi.config( WiFi.config(
IPAddress(Configuration.get().WiFi_Ip), IPAddress(Configuration.get().WiFi_Ip),
IPAddress(Configuration.get().WiFi_Gateway), IPAddress(Configuration.get().WiFi_Gateway),
IPAddress(Configuration.get().WiFi_Netmask), IPAddress(Configuration.get().WiFi_Netmask),
IPAddress(Configuration.get().WiFi_Dns1), IPAddress(Configuration.get().WiFi_Dns1),
IPAddress(Configuration.get().WiFi_Dns2)); IPAddress(Configuration.get().WiFi_Dns2));
Serial.println(F("done")); MessageOutput.println(F("done"));
} }
} }
#ifdef OPENDTU_ETHERNET #ifdef OPENDTU_ETHERNET
else if (_networkMode == network_mode::Ethernet) { else if (_networkMode == network_mode::Ethernet) {
if (Configuration.get().WiFi_Dhcp) { if (Configuration.get().WiFi_Dhcp) {
Serial.print(F("Configuring Ethernet DHCP IP... ")); MessageOutput.print(F("Configuring Ethernet DHCP IP... "));
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
Serial.println(F("done")); MessageOutput.println(F("done"));
} else { } else {
Serial.print(F("Configuring Ethernet static IP... ")); MessageOutput.print(F("Configuring Ethernet static IP... "));
ETH.config( ETH.config(
IPAddress(Configuration.get().WiFi_Ip), IPAddress(Configuration.get().WiFi_Ip),
IPAddress(Configuration.get().WiFi_Gateway), IPAddress(Configuration.get().WiFi_Gateway),
IPAddress(Configuration.get().WiFi_Netmask), IPAddress(Configuration.get().WiFi_Netmask),
IPAddress(Configuration.get().WiFi_Dns1), IPAddress(Configuration.get().WiFi_Dns1),
IPAddress(Configuration.get().WiFi_Dns2)); IPAddress(Configuration.get().WiFi_Dns2));
Serial.println(F("done")); MessageOutput.println(F("done"));
} }
} }
#endif #endif

View File

@ -4,6 +4,7 @@
*/ */
#include "WebApi_ws_live.h" #include "WebApi_ws_live.h"
#include "Configuration.h" #include "Configuration.h"
#include "MessageOutput.h"
#include "WebApi.h" #include "WebApi.h"
#include "defaults.h" #include "defaults.h"
#include <AsyncJson.h> #include <AsyncJson.h>
@ -198,11 +199,11 @@ void WebApiWsLiveClass::onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketC
if (type == WS_EVT_CONNECT) { if (type == WS_EVT_CONNECT) {
char str[64]; char str[64];
snprintf(str, sizeof(str), "Websocket: [%s][%u] connect", server->url(), client->id()); snprintf(str, sizeof(str), "Websocket: [%s][%u] connect", server->url(), client->id());
Serial.println(str); MessageOutput.println(str);
} else if (type == WS_EVT_DISCONNECT) { } else if (type == WS_EVT_DISCONNECT) {
char str[64]; char str[64];
snprintf(str, sizeof(str), "Websocket: [%s][%u] disconnect", server->url(), client->id()); snprintf(str, sizeof(str), "Websocket: [%s][%u] disconnect", server->url(), client->id());
Serial.println(str); MessageOutput.println(str);
} }
} }

View File

@ -3,6 +3,7 @@
* Copyright (C) 2022 Thomas Basler and others * Copyright (C) 2022 Thomas Basler and others
*/ */
#include "Configuration.h" #include "Configuration.h"
#include "MessageOutput.h"
#include "MqttHandleDtu.h" #include "MqttHandleDtu.h"
#include "MqttHandleHass.h" #include "MqttHandleHass.h"
#include "MqttHandleInverter.h" #include "MqttHandleInverter.h"
@ -22,98 +23,99 @@ void setup()
Serial.begin(SERIAL_BAUDRATE); Serial.begin(SERIAL_BAUDRATE);
while (!Serial) while (!Serial)
yield(); yield();
Serial.println(); MessageOutput.println();
Serial.println(F("Starting OpenDTU")); MessageOutput.println(F("Starting OpenDTU"));
// Initialize file system // Initialize file system
Serial.print(F("Initialize FS... ")); MessageOutput.print(F("Initialize FS... "));
if (!LittleFS.begin(false)) { // Do not format if mount failed if (!LittleFS.begin(false)) { // Do not format if mount failed
Serial.print(F("failed... trying to format...")); MessageOutput.print(F("failed... trying to format..."));
if (!LittleFS.begin(true)) { if (!LittleFS.begin(true)) {
Serial.print("success"); MessageOutput.print("success");
} else { } else {
Serial.print("failed"); MessageOutput.print("failed");
} }
} else { } else {
Serial.println(F("done")); MessageOutput.println(F("done"));
} }
// Read configuration values // Read configuration values
Serial.print(F("Reading configuration... ")); MessageOutput.print(F("Reading configuration... "));
if (!Configuration.read()) { if (!Configuration.read()) {
Serial.print(F("initializing... ")); MessageOutput.print(F("initializing... "));
Configuration.init(); Configuration.init();
if (Configuration.write()) { if (Configuration.write()) {
Serial.print(F("written... ")); MessageOutput.print(F("written... "));
} else { } else {
Serial.print(F("failed... ")); MessageOutput.print(F("failed... "));
} }
} }
if (Configuration.get().Cfg_Version != CONFIG_VERSION) { if (Configuration.get().Cfg_Version != CONFIG_VERSION) {
Serial.print(F("migrated... ")); MessageOutput.print(F("migrated... "));
Configuration.migrate(); Configuration.migrate();
} }
Serial.println(F("done")); MessageOutput.println(F("done"));
// Initialize WiFi // Initialize WiFi
Serial.print(F("Initialize Network... ")); MessageOutput.print(F("Initialize Network... "));
NetworkSettings.init(); NetworkSettings.init();
Serial.println(F("done")); MessageOutput.println(F("done"));
NetworkSettings.applyConfig(); NetworkSettings.applyConfig();
// Initialize NTP // Initialize NTP
Serial.print(F("Initialize NTP... ")); MessageOutput.print(F("Initialize NTP... "));
NtpSettings.init(); NtpSettings.init();
Serial.println(F("done")); MessageOutput.println(F("done"));
// Initialize MqTT // Initialize MqTT
Serial.print(F("Initialize MqTT... ")); MessageOutput.print(F("Initialize MqTT... "));
MqttSettings.init(); MqttSettings.init();
MqttHandleDtu.init(); MqttHandleDtu.init();
MqttHandleInverter.init(); MqttHandleInverter.init();
MqttHandleHass.init(); MqttHandleHass.init();
Serial.println(F("done")); MessageOutput.println(F("done"));
// Initialize WebApi // Initialize WebApi
Serial.print(F("Initialize WebApi... ")); MessageOutput.print(F("Initialize WebApi... "));
WebApi.init(); WebApi.init();
Serial.println(F("done")); MessageOutput.println(F("done"));
// Check for default DTU serial // Check for default DTU serial
Serial.print(F("Check for default DTU serial... ")); MessageOutput.print(F("Check for default DTU serial... "));
CONFIG_T& config = Configuration.get(); CONFIG_T& config = Configuration.get();
if (config.Dtu_Serial == DTU_SERIAL) { if (config.Dtu_Serial == DTU_SERIAL) {
Serial.print(F("generate serial based on ESP chip id: ")); MessageOutput.print(F("generate serial based on ESP chip id: "));
uint64_t dtuId = Utils::generateDtuSerial(); uint64_t dtuId = Utils::generateDtuSerial();
Serial.printf("%0x%08x... ", MessageOutput.printf("%0x%08x... ",
((uint32_t)((dtuId >> 32) & 0xFFFFFFFF)), ((uint32_t)((dtuId >> 32) & 0xFFFFFFFF)),
((uint32_t)(dtuId & 0xFFFFFFFF))); ((uint32_t)(dtuId & 0xFFFFFFFF)));
config.Dtu_Serial = dtuId; config.Dtu_Serial = dtuId;
Configuration.write(); Configuration.write();
} }
Serial.println(F("done")); MessageOutput.println(F("done"));
// Initialize inverter communication // Initialize inverter communication
Serial.print(F("Initialize Hoymiles interface... ")); MessageOutput.print(F("Initialize Hoymiles interface... "));
SPIClass* spiClass = new SPIClass(HSPI); SPIClass* spiClass = new SPIClass(HSPI);
spiClass->begin(HOYMILES_PIN_SCLK, HOYMILES_PIN_MISO, HOYMILES_PIN_MOSI, HOYMILES_PIN_CS); spiClass->begin(HOYMILES_PIN_SCLK, HOYMILES_PIN_MISO, HOYMILES_PIN_MOSI, HOYMILES_PIN_CS);
Hoymiles.setMessageOutput(&MessageOutput);
Hoymiles.init(spiClass, HOYMILES_PIN_CE, HOYMILES_PIN_IRQ); Hoymiles.init(spiClass, HOYMILES_PIN_CE, HOYMILES_PIN_IRQ);
Serial.println(F(" Setting radio PA level... ")); MessageOutput.println(F(" Setting radio PA level... "));
Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel); Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel);
Serial.println(F(" Setting DTU serial... ")); MessageOutput.println(F(" Setting DTU serial... "));
Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial); Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial);
Serial.println(F(" Setting poll interval... ")); MessageOutput.println(F(" Setting poll interval... "));
Hoymiles.setPollInterval(config.Dtu_PollInterval); Hoymiles.setPollInterval(config.Dtu_PollInterval);
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) { for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
if (config.Inverter[i].Serial > 0) { if (config.Inverter[i].Serial > 0) {
Serial.print(F(" Adding inverter: ")); MessageOutput.print(F(" Adding inverter: "));
Serial.print(config.Inverter[i].Serial, HEX); MessageOutput.print(config.Inverter[i].Serial, HEX);
Serial.print(F(" - ")); MessageOutput.print(F(" - "));
Serial.print(config.Inverter[i].Name); MessageOutput.print(config.Inverter[i].Name);
auto inv = Hoymiles.addInverter( auto inv = Hoymiles.addInverter(
config.Inverter[i].Name, config.Inverter[i].Name,
config.Inverter[i].Serial); config.Inverter[i].Serial);
@ -123,10 +125,10 @@ void setup()
inv->Statistics()->setChannelMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower); inv->Statistics()->setChannelMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);
} }
} }
Serial.println(F(" done")); MessageOutput.println(F(" done"));
} }
} }
Serial.println(F("done")); MessageOutput.println(F("done"));
} }
void loop() void loop()
@ -143,4 +145,6 @@ void loop()
yield(); yield();
WebApi.loop(); WebApi.loop();
yield(); yield();
MessageOutput.loop();
yield();
} }