Skip to content

Commit

Permalink
Fix const char * references going out of scope in change_states (#7)
Browse files Browse the repository at this point in the history
  • Loading branch information
floatplane authored Jan 16, 2024
1 parent b9cdb7c commit 86e1dff
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 55 deletions.
38 changes: 38 additions & 0 deletions src/mitsubishi2mqtt/HeatpumpSettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <Arduino.h>
#include <HeatPump.h>

class HeatpumpSettings {
public:
HeatpumpSettings(const heatpumpSettings& settings) {
power = settings.power;
mode = settings.mode;
temperature = settings.temperature;
fan = settings.fan;
vane = settings.vane;
wideVane = settings.wideVane;
iSee = settings.iSee;
connected = settings.connected;
}

heatpumpSettings getRaw() const {
return heatpumpSettings{
power : power.c_str(),
mode : mode.c_str(),
temperature : temperature,
fan : fan.c_str(),
vane : vane.c_str(),
wideVane : wideVane.c_str(),
iSee : iSee,
connected : connected
};
}

String power;
String mode;
float temperature;
String fan;
String vane; // vertical vane, up/down
String wideVane; // horizontal vane, left/right
bool iSee; // iSee sensor, at the moment can only detect it, not set it
bool connected;
};
107 changes: 55 additions & 52 deletions src/mitsubishi2mqtt/mitsubishi2mqtt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "mitsubishi2mqtt.h"

#include "FS.h" // SPIFFS for store config
#include "HeatpumpSettings.h"
#ifdef ESP32
#include <ESPmDNS.h> // mDNS for ESP32
#include <WebServer.h> // webServer for ESP32
Expand Down Expand Up @@ -180,7 +181,7 @@ void setup() {
hp.enableAutoUpdate();
hp.connect(&Serial);
heatpumpStatus currentStatus = hp.getStatus();
heatpumpSettings currentSettings = hp.getSettings();
HeatpumpSettings currentSettings = hp.getSettings();
rootInfo["roomTemperature"] =
convertCelsiusToLocalUnit(currentStatus.roomTemperature, useFahrenheit);
rootInfo["temperature"] = convertCelsiusToLocalUnit(currentSettings.temperature, useFahrenheit);
Expand Down Expand Up @@ -845,7 +846,7 @@ void handleControl() {
server.send(302);
return;
}
heatpumpSettings settings = hp.getSettings();
HeatpumpSettings settings = hp.getSettings();
settings = change_states(settings);
String controlPage = FPSTR(html_page_control);
String headerContent = FPSTR(html_common_header);
Expand Down Expand Up @@ -884,69 +885,69 @@ void handleControl() {
controlPage.replace("_TXT_F_SWING_", FPSTR(txt_f_swing));
controlPage.replace("_TXT_F_POS_", FPSTR(txt_f_pos));

if (strcmp(settings.power, "ON") == 0) {
if (settings.power == "ON") {
controlPage.replace("_POWER_ON_", "selected");
} else if (strcmp(settings.power, "OFF") == 0) {
} else if (settings.power = "OFF") {
controlPage.replace("_POWER_OFF_", "selected");
}

if (strcmp(settings.mode, "HEAT") == 0) {
if (settings.mode == "HEAT") {
controlPage.replace("_MODE_H_", "selected");
} else if (strcmp(settings.mode, "DRY") == 0) {
} else if (settings.mode == "DRY") {
controlPage.replace("_MODE_D_", "selected");
} else if (strcmp(settings.mode, "COOL") == 0) {
} else if (settings.mode == "COOL") {
controlPage.replace("_MODE_C_", "selected");
} else if (strcmp(settings.mode, "FAN") == 0) {
} else if (settings.mode == "FAN") {
controlPage.replace("_MODE_F_", "selected");
} else if (strcmp(settings.mode, "AUTO") == 0) {
} else if (settings.mode == "AUTO") {
controlPage.replace("_MODE_A_", "selected");
}

if (strcmp(settings.fan, "AUTO") == 0) {
if (settings.fan == "AUTO") {
controlPage.replace("_FAN_A_", "selected");
} else if (strcmp(settings.fan, "QUIET") == 0) {
} else if (settings.fan == "QUIET") {
controlPage.replace("_FAN_Q_", "selected");
} else if (strcmp(settings.fan, "1") == 0) {
} else if (settings.fan == "1") {
controlPage.replace("_FAN_1_", "selected");
} else if (strcmp(settings.fan, "2") == 0) {
} else if (settings.fan == "2") {
controlPage.replace("_FAN_2_", "selected");
} else if (strcmp(settings.fan, "3") == 0) {
} else if (settings.fan == "3") {
controlPage.replace("_FAN_3_", "selected");
} else if (strcmp(settings.fan, "4") == 0) {
} else if (settings.fan == "4") {
controlPage.replace("_FAN_4_", "selected");
}

controlPage.replace("_VANE_V_", settings.vane);
if (strcmp(settings.vane, "AUTO") == 0) {
if (settings.vane == "AUTO") {
controlPage.replace("_VANE_A_", "selected");
} else if (strcmp(settings.vane, "1") == 0) {
} else if (settings.vane == "1") {
controlPage.replace("_VANE_1_", "selected");
} else if (strcmp(settings.vane, "2") == 0) {
} else if (settings.vane == "2") {
controlPage.replace("_VANE_2_", "selected");
} else if (strcmp(settings.vane, "3") == 0) {
} else if (settings.vane == "3") {
controlPage.replace("_VANE_3_", "selected");
} else if (strcmp(settings.vane, "4") == 0) {
} else if (settings.vane == "4") {
controlPage.replace("_VANE_4_", "selected");
} else if (strcmp(settings.vane, "5") == 0) {
} else if (settings.vane == "5") {
controlPage.replace("_VANE_5_", "selected");
} else if (strcmp(settings.vane, "SWING") == 0) {
} else if (settings.vane == "SWING") {
controlPage.replace("_VANE_S_", "selected");
}

controlPage.replace("_WIDEVANE_V_", settings.wideVane);
if (strcmp(settings.wideVane, "<<") == 0) {
if (settings.wideVane == "<<") {
controlPage.replace("_WVANE_1_", "selected");
} else if (strcmp(settings.wideVane, "<") == 0) {
} else if (settings.wideVane == "<") {
controlPage.replace("_WVANE_2_", "selected");
} else if (strcmp(settings.wideVane, "|") == 0) {
} else if (settings.wideVane == "|") {
controlPage.replace("_WVANE_3_", "selected");
} else if (strcmp(settings.wideVane, ">") == 0) {
} else if (settings.wideVane == ">") {
controlPage.replace("_WVANE_4_", "selected");
} else if (strcmp(settings.wideVane, ">>") == 0) {
} else if (settings.wideVane == ">>") {
controlPage.replace("_WVANE_5_", "selected");
} else if (strcmp(settings.wideVane, "<>") == 0) {
} else if (settings.wideVane == "<>") {
controlPage.replace("_WVANE_6_", "selected");
} else if (strcmp(settings.wideVane, "SWING") == 0) {
} else if (settings.wideVane == "SWING") {
controlPage.replace("_WVANE_S_", "selected");
}
controlPage.replace("_TEMP_",
Expand All @@ -967,10 +968,10 @@ void handleControl() {
void handleMetrics() {
String metrics = FPSTR(html_metrics);

heatpumpSettings currentSettings = hp.getSettings();
HeatpumpSettings currentSettings = hp.getSettings();
heatpumpStatus currentStatus = hp.getStatus();

String hppower = String(currentSettings.power) == "ON" ? "1" : "0";
String hppower = currentSettings.power == "ON" ? "1" : "0";

String hpfan = currentSettings.fan;
if (hpfan == "AUTO") hpfan = "-1";
Expand Down Expand Up @@ -1017,14 +1018,14 @@ void handleMetrics() {
metrics.replace("_UNIT_NAME_", hostname);
metrics.replace("_VERSION_", m2mqtt_version);
metrics.replace("_POWER_", hppower);
metrics.replace("_ROOMTEMP_", (String)currentStatus.roomTemperature);
metrics.replace("_TEMP_", (String)currentSettings.temperature);
metrics.replace("_ROOMTEMP_", String(currentStatus.roomTemperature));
metrics.replace("_TEMP_", String(currentSettings.temperature));
metrics.replace("_FAN_", hpfan);
metrics.replace("_VANE_", hpvane);
metrics.replace("_WIDEVANE_", hpwidevane);
metrics.replace("_MODE_", hpmode);
metrics.replace("_OPER_", (String)currentStatus.operating);
metrics.replace("_COMPFREQ_", (String)currentStatus.compressorFrequency);
metrics.replace("_OPER_", String(currentStatus.operating));
metrics.replace("_COMPFREQ_", String(currentStatus.compressorFrequency));
server.send(200, F("text/plain"), metrics);
}

Expand Down Expand Up @@ -1234,44 +1235,46 @@ void write_log(String log) {
logFile.close();
}

heatpumpSettings change_states(heatpumpSettings settings) {
HeatpumpSettings change_states(const HeatpumpSettings &settings) {
HeatpumpSettings newSettings = settings;
if (server.hasArg("CONNECT")) {
hp.connect(&Serial);
} else {
bool update = false;
if (server.hasArg("POWER")) {
settings.power = server.arg("POWER").c_str();
newSettings.power = server.arg("POWER");
update = true;
}
if (server.hasArg("MODE")) {
settings.mode = server.arg("MODE").c_str();
newSettings.mode = server.arg("MODE");
update = true;
}
if (server.hasArg("TEMP")) {
settings.temperature = convertLocalUnitToCelsius(server.arg("TEMP").toInt(), useFahrenheit);
newSettings.temperature =
convertLocalUnitToCelsius(server.arg("TEMP").toInt(), useFahrenheit);
update = true;
}
if (server.hasArg("FAN")) {
settings.fan = server.arg("FAN").c_str();
newSettings.fan = server.arg("FAN").c_str();
update = true;
}
if (server.hasArg("VANE")) {
settings.vane = server.arg("VANE").c_str();
newSettings.vane = server.arg("VANE").c_str();
update = true;
}
if (server.hasArg("WIDEVANE")) {
settings.wideVane = server.arg("WIDEVANE").c_str();
newSettings.wideVane = server.arg("WIDEVANE").c_str();
update = true;
}
if (update) {
hp.setSettings(settings);
hp.setSettings(newSettings.getRaw());
}
}
return settings;
return newSettings;
}

void readHeatPumpSettings() {
heatpumpSettings currentSettings = hp.getSettings();
HeatpumpSettings currentSettings = hp.getSettings();

rootInfo.clear();
rootInfo["temperature"] = convertCelsiusToLocalUnit(currentSettings.temperature, useFahrenheit);
Expand All @@ -1296,16 +1299,16 @@ void hpSettingsChanged() {
hpStatusChanged(hp.getStatus());
}

String hpGetMode(heatpumpSettings hpSettings) {
String hpGetMode(const HeatpumpSettings &hpSettings) {
// Map the heat pump state to one of HA's HVAC_MODE_* values.
// https://github.com/home-assistant/core/blob/master/homeassistant/components/climate/const.py#L3-L23

String hppower = String(hpSettings.power);
String hppower = hpSettings.power;
if (hppower.equalsIgnoreCase("off")) {
return "off";
}

String hpmode = String(hpSettings.mode);
String hpmode = hpSettings.mode;
hpmode.toLowerCase();

if (hpmode == "fan")
Expand All @@ -1316,16 +1319,16 @@ String hpGetMode(heatpumpSettings hpSettings) {
return hpmode; // cool, heat, dry
}

String hpGetAction(heatpumpStatus hpStatus, heatpumpSettings hpSettings) {
String hpGetAction(heatpumpStatus hpStatus, const HeatpumpSettings &hpSettings) {
// Map heat pump state to one of HA's CURRENT_HVAC_* values.
// https://github.com/home-assistant/core/blob/master/homeassistant/components/climate/const.py#L80-L86

String hppower = String(hpSettings.power);
String hppower = hpSettings.power;
if (hppower.equalsIgnoreCase("off")) {
return "off";
}

String hpmode = String(hpSettings.mode);
String hpmode = hpSettings.mode;
hpmode.toLowerCase();

if (hpmode == "fan")
Expand All @@ -1352,7 +1355,7 @@ void hpStatusChanged(heatpumpStatus currentStatus) {
// disable it and revert to the internal thermometer.

// send room temp, operating info and all information
heatpumpSettings currentSettings = hp.getSettings();
HeatpumpSettings currentSettings = hp.getSettings();

if (currentStatus.roomTemperature == 0) return;

Expand Down
8 changes: 5 additions & 3 deletions src/mitsubishi2mqtt/mitsubishi2mqtt.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include <Arduino.h>
#include <HeatPump.h>

class HeatpumpSettings;

String getId();
void setDefaults();
bool loadWifi();
Expand Down Expand Up @@ -33,13 +35,13 @@ void hpStatusChanged(heatpumpStatus newStatus);
void hpPacketDebug(byte *packet, unsigned int length, const char *packetDirection);
float convertCelsiusToLocalUnit(float temperature, bool isFahrenheit);
float convertLocalUnitToCelsius(float temperature, bool isFahrenheit);
String hpGetMode(heatpumpSettings hpSettings);
String hpGetAction(heatpumpStatus hpStatus, heatpumpSettings hpSettings);
String hpGetMode(const HeatpumpSettings &hpSettings);
String hpGetAction(heatpumpStatus hpStatus, const HeatpumpSettings &hpSettings);
void mqttCallback(char *topic, byte *payload, unsigned int length);
void mqttConnect();
bool connectWifi();
bool checkLogin();
heatpumpSettings change_states(heatpumpSettings settings);
HeatpumpSettings change_states(const HeatpumpSettings &settings);
String getTemperatureScale();
bool is_authenticated();
void hpCheckRemoteTemp();

0 comments on commit 86e1dff

Please sign in to comment.