diff --git a/amgpelletstove.cpp b/amgpelletstove.cpp index 69a5274..67d8e49 100644 --- a/amgpelletstove.cpp +++ b/amgpelletstove.cpp @@ -9,9 +9,9 @@ static String amgtempcmd = ""; static uint8_t amgcmdnr = 0; static bool cooldown_phase_1 = false; -void(*_amgpelletstove_callback)(char *, String); +void(*_amgpelletstove_callback)(const char *, String); -void amgpelletstove_init(void(*callback)(char *, String)) +void amgpelletstove_init(void(*callback)(const char *, String)) { _amgpelletstove_callback = callback; Serial.setDebugOutput(false); diff --git a/amgpelletstove.h b/amgpelletstove.h index bf902a1..2b12db2 100644 --- a/amgpelletstove.h +++ b/amgpelletstove.h @@ -7,5 +7,5 @@ void amgpelletstove_receivemqtt(String topicstring, String payloadstring); -void amgpelletstove_init(void(*callback)(char *,String)); +void amgpelletstove_init(void(*callback)(const char *,String)); void amgpelletstove_handle(); diff --git a/bht002.cpp b/bht002.cpp index 53f85f0..dcb0d0a 100644 --- a/bht002.cpp +++ b/bht002.cpp @@ -13,7 +13,7 @@ bool bht002_preventdeviceoff = true; bool bht002_wificonnected = false; bool bht002_initready = false; -void(*_bht002_callback)(char *, String); +void(*_bht002_callback)(const char *, String); void bht002_commandCharsToSerial(unsigned int length, unsigned char* command) { @@ -66,7 +66,7 @@ void bht002_sendtime() bht002_commandCharsToSerial(14, cancelConfigCommand); } -void bht002_init(void(*callback)(char *, String)) +void bht002_init(void(*callback)(const char *, String)) { Serial.begin(9600, SERIAL_8N1); Serial.setRxBufferSize(200); diff --git a/bht002.h b/bht002.h index cd6fbf7..32b8cbd 100644 --- a/bht002.h +++ b/bht002.h @@ -1,4 +1,4 @@ -void bht002_init(void(*callback)(char *,String)); +void bht002_init(void(*callback)(const char *,String)); void bht002_connected(); void bht002_disconnected(); void bht002_handle(); diff --git a/ducobox.cpp b/ducobox.cpp index b9ae656..e17ac0a 100644 --- a/ducobox.cpp +++ b/ducobox.cpp @@ -15,7 +15,7 @@ static String _serialsendqueue = ""; static unsigned long _nextupdatetime = 0; static bool recvok = 1; -void(*_ducobox_callback)(char *, String); +void(*_ducobox_callback)(const char *, String); void _ducobox_writeserialqueue() // The ducobox can't handle serial data at full speed, so send char followed by a pause before next char @@ -275,7 +275,7 @@ void ducobox_handle() } } -void ducobox_init(uint8_t ducobox_relay0, uint8_t ducobox_relay1, uint8_t ducobox_refreshtime, void(*callback)(char *, String)) +void ducobox_init(uint8_t ducobox_relay0, uint8_t ducobox_relay1, uint8_t ducobox_refreshtime, void(*callback)(const char *, String)) { _ducobox_callback = callback; _ducobox_relay0 = ducobox_relay0; diff --git a/ducobox.h b/ducobox.h index f426b9d..257382e 100644 --- a/ducobox.h +++ b/ducobox.h @@ -1,3 +1,3 @@ -void ducobox_init(uint8_t ducobox_relay0, uint8_t ducobox_relay1, uint8_t ducobox_refreshtime, void(*callback)(char * ,String)); +void ducobox_init(uint8_t ducobox_relay0, uint8_t ducobox_relay1, uint8_t ducobox_refreshtime, void(*callback)(const char * ,String)); void ducobox_setfan(uint8_t value); void ducobox_handle(); diff --git a/espMQTT.ino b/espMQTT.ino index 60a926c..7f1d6ae 100644 --- a/espMQTT.ino +++ b/espMQTT.ino @@ -35,8 +35,8 @@ // #define ESPMQTT_BEDROOM2 // #define ESPMQTT_OPENTHERM // #define ESPMQTT_SMARTMETER -// #define ESPMQTT_GROWATT -#define ESPMQTT_GROWATT_MODBUS +#define ESPMQTT_GROWATT +// #define ESPMQTT_GROWATT_MODBUS // #define ESPMQTT_SDM120 // #define ESPMQTT_DDM18SD // #define ESPMQTT_WATERMETER @@ -238,7 +238,7 @@ QsWifiSwitch qswifiswitch(QSWIFISWITCHCHANNELS); #define FLASHBUTTON D3 #define ESPLED D4 #include "amgpelletstove.h" -#undef SERIALLOG +//#undef SERIALLOG #endif #ifdef ESPMQTT_WEATHER @@ -681,7 +681,7 @@ uint16_t mqttlastpublishedpacketid = 0; -SimpleMap *dataMap = new SimpleMap([](char* &a, char* &b) -> int { +SimpleMap *dataMap = new SimpleMap([](const char* &a, const char* &b) -> int { if (a == b) return 0; // a and b are equal else if (a > b) return 1; // a is bigger than b else return -1; // a is smaller than b @@ -695,42 +695,42 @@ SimpleMap *eepromMap = new SimpleMap([](int &a, int &b static const char *dataNames[] PROGMEM = - { "hostname", - "firmware/name", - "firmware/target", - "firmware/sourcefile", - "firmware/version", - "firmware/compiletime", - "status", - "status/upgrade", - "flash/id", - "flash/size/real", - "flash/size/ide", - "flash/mode", - "flash/speed", - "system/chipid", - "system/uptime", - "system/freeram", - "wifi/mac", - "wifi/state", - "wifi/localip", - "wifi/ssid", - "wifi/bssid", - "wifi/rssi", - "wifi/externalip", - "mqtt/server", - "mqtt/port", - "mqtt/sll", - "mqtt/state", - "mqtt/user", - "mqtt/clientid", - "mqtt/user" - }; - +{ "hostname", + "firmware/name", + "firmware/target", + "firmware/sourcefile", + "firmware/version", + "firmware/compiletime", + "status", + "status/upgrade", + "flash/id", + "flash/size/real", + "flash/size/ide", + "flash/mode", + "flash/speed", + "system/chipid", + "system/uptime", + "system/freeram", + "wifi/mac", + "wifi/state", + "wifi/localip", + "wifi/ssid", + "wifi/bssid", + "wifi/rssi", + "wifi/externalip", + "mqtt/server", + "mqtt/port", + "mqtt/sll", + "mqtt/state", + "mqtt/user", + "mqtt/clientid", + "mqtt/user" +}; + struct { - char status[10] = "online"; - char status_upgrade[10] = "online"; + char status[10] = "online"; + char status_upgrade[10] = "online"; } dataValues; const char* getDataValue(const char *dataName) @@ -748,7 +748,7 @@ const char* getDataValue(const char *dataName) bool sendupdate = false; bool forceupdate = false; bool publishregular = false; - + } status[20]; if (!initialized) @@ -768,7 +768,7 @@ const char* getDataValue(const char *dataName) status[10].value = flash_size_ide; status[11].value = flash_mode; - + strcat(compiletime, __DATE__); strcat(compiletime, " "); strcat(compiletime, __TIME__); @@ -904,7 +904,7 @@ String getRandomString(int len) { void updateexternalip(); -String getdatamap(char *topic) +String getdatamap(const char *topic) { return dataMap->get(topic).payload; yield(); @@ -919,42 +919,46 @@ void showdatamap() } } -void putdatamap(char *topic, String value, bool sendupdate = true, bool forceupdate = false, bool publishregular = true) +void putdatamap(const char *topic, String value, bool sendupdate = true, bool forceupdate = false, bool publishregular = true) { dataMapStruct datamapstruct = dataMap->get(topic); - if ((String(datamapstruct.payload) != value) || forceupdate) + if (dataMap->has(topic)) { - // Do not output debug for uptime - if (topic != "system/uptime") DEBUG_D ("DATAMAP %s=%s (sendupdate=%d, oldval=%s oldsend=%d forceupdate=%d)\n", topic, value.c_str(), sendupdate, datamapstruct.payload, datamapstruct.send, forceupdate); - if (topic == "status") + if ((strcmp (datamapstruct.payload , value.c_str()) == 0) && !forceupdate) return; + + if (strcmp(topic, "status") == 0) { - if (datamapstruct.payload == "upgrading") + if (strcmp (datamapstruct.payload, "upgrading") == 0) { // When upgrading only accept upgradefailed or upgradedone as value if ((value != "upgrade_exit") && (value != "rebooting")) return; if (value == "upgrade_exit") value = "online"; } } - datamapstruct.onair = false; - datamapstruct.send = sendupdate; - datamapstruct.publishregular = publishregular; - - int n = value.length() + 1; - - // declaring character array - char *char_array; - char_array = (char*) malloc(n*sizeof(char)); - - // copying the contents of the - // string to char array - strcpy(char_array, value.c_str()); - - free(datamapstruct.payload); - - datamapstruct.payload = char_array; - dataMap->put(topic, datamapstruct); } + + // Do not output debug for uptime + if (strcmp(topic, "system/uptime") != 0) DEBUG_D ("DATAMAP %s=%s (sendupdate=%d, oldval=%s oldsend=%d forceupdate=%d)\n", topic, value.c_str(), sendupdate, datamapstruct.payload, datamapstruct.send, forceupdate); + + datamapstruct.onair = false; + datamapstruct.send = sendupdate; + datamapstruct.publishregular = publishregular; + + int n = value.length() + 1; + + // declaring character array + char *char_array; + char_array = (char*) malloc(n * sizeof(char)); + + // copying the contents of the + // string to char array + strcpy(char_array, value.c_str()); + + free(datamapstruct.payload); + + datamapstruct.payload = char_array; + dataMap->put(topic, datamapstruct); } #ifdef ESPMQTT_BBQTEMP double MAX6675_readCelsius(uint8_t cs) @@ -2886,7 +2890,10 @@ void sonoff_handle() inverse = true; #endif String relaystate = digitalRead(sonoff_relays[i]) != inverse ? "1" : "0"; - putdatamap ("relay/" + String(i), relaystate); + if (i == 0) putdatamap ("relay/0", relaystate); + if (i == 1) putdatamap ("relay/1", relaystate); + if (i == 2) putdatamap ("relay/2", relaystate); + if (i == 3) putdatamap ("relay/3", relaystate); } #ifdef HLW8012_CF_PIN @@ -2947,7 +2954,7 @@ void publishdatamap(int32_t packetId, bool publishall, bool init, bool publishre int32_t publishallpointer = 0; while (publishallpointer < dataMap->size()) { - char *topic = dataMap->getKey(publishallpointer); + const char *topic = dataMap->getKey(publishallpointer); dataMapStruct data = dataMap->getData(publishallpointer); data.onair = false; if (publishall) data.send = true; @@ -2969,7 +2976,7 @@ void publishdatamap(int32_t packetId, bool publishall, bool init, bool publishre // If packetId == 0 resend because packet was not acked DEBUG_V("Not received mqtt ack id=%d\n", packetId); waitingforack = true; - char *topic = dataMap->getKey(datamappointer); + const char *topic = dataMap->getKey(datamappointer); String sendtopic = String("home/" + esp_hostname + "/" + topic); dataMapStruct data = dataMap->getData(datamappointer); String payload = data.payload; @@ -2985,7 +2992,7 @@ void publishdatamap(int32_t packetId, bool publishall, bool init, bool publishre { // Packet succesfull delivered proceed to next item DEBUG_V("Received mqtt ack id=%d\n", packetId); - char *topic = dataMap->getKey(datamappointer); + const char *topic = dataMap->getKey(datamappointer); dataMapStruct data = dataMap->getData(datamappointer); if (data.onair) { @@ -3006,7 +3013,7 @@ void publishdatamap(int32_t packetId, bool publishall, bool init, bool publishre nextpacketId = -1; while ((datamappointer < dataMap->size()) && (nextpacketId == -1)) { - char *topic = dataMap->getKey(datamappointer); + const char *topic = dataMap->getKey(datamappointer); dataMapStruct data = dataMap->getData(datamappointer); //DEBUG ("datamappointer=%d datamapsize=%d send=%d\n", datamappointer, dataMap->size(), data.send); if (data.send) @@ -3567,8 +3574,16 @@ void qswifidimmer_callback (uint8_t , uint8_t dimvalue, bool dimstate) #if (QSWIFIDIMMERCHANNELS == 2) void qswifidimmer_callback (uint8_t dimchannel, uint8_t dimvalue, bool dimstate) { - putdatamap ("dimvalue/" + String(dimchannel), String(dimvalue)); - putdatamap ("dimstate/" + String(dimchannel), String(dimstate)); + if (dimchannel == 0) + { + putdatamap ("dimvalue/0", String(dimvalue)); + putdatamap ("dimstate/0", String(dimstate)); + } + if (dimchannel == 1) + { + putdatamap ("dimvalue/1", String(dimvalue)); + putdatamap ("dimstate/1", String(dimstate)); + } } #endif @@ -3581,7 +3596,8 @@ void qswifidimmer_switchcallback(uint8_t , bool switchstate) #if (QSWIFIDIMMERCHANNELS == 2) void qswifidimmer_switchcallback(uint8_t dimchannel, bool switchstate) { - putdatamap ("switchstate/" + String(dimchannel), String(switchstate)); + if (dimchannel == 0) putdatamap ("switchstate/0", String(switchstate)); + if (dimchannel == 1) putdatamap ("switchstate/0", String(switchstate)); } #endif @@ -3598,43 +3614,45 @@ void qswifiswitch_switchcallback(uint8_t , bool switchstate) #if (QSWIFISWITCHCHANNELS == 2) void qswifiswitch_relaycallback(uint8_t channel, bool state) { - putdatamap ("relaystate/" + String(channel), String(state)); + if (channel == 0) putdatamap ("relaystate/0", String(state)); + if (channel == 1) putdatamap ("relaystate/1", String(state)); } void qswifiswitch_switchcallback(uint8_t channel, bool switchstate) { - putdatamap ("switchstate/" + String(channel), String(switchstate)); + if (channel == 0) putdatamap ("switchstate/0", String(switchstate)); + if (channel == 1) putdatamap ("switchstate/1", String(switchstate)); } #endif -void ducoboxcallback (char *topic, String payload) +void ducoboxcallback (const char *topic, String payload) { putdatamap(topic, payload); } -void amgpelletstovecallback (char *topic, String payload) +void amgpelletstovecallback (const char *topic, String payload) { putdatamap(topic, payload); } -void bht002callback (char *topic, String payload) +void bht002callback (const char *topic, String payload) { putdatamap(topic, payload); yield(); } -void tuyacallback (char *topic, String payload) +void tuyacallback (const char *topic, String payload) { putdatamap(topic, payload); yield(); } -void openthermcallback (char *topic, String payload) +void openthermcallback (const char *topic, String payload) { putdatamap(topic, payload); } #ifdef ESPMQTT_GROWATT -void growattcallback (char *topic, String payload) +void growattcallback (const char *topic, String payload) { if (topic == "status") { @@ -3646,7 +3664,7 @@ void growattcallback (char *topic, String payload) #endif #ifdef ESPMQTT_GROWATT_MODBUS -void growattModbuscallback (char *topic, String payload) +void growattModbuscallback (const char *topic, String payload) { if (topic == "status") { @@ -3658,7 +3676,7 @@ void growattModbuscallback (char *topic, String payload) #endif #ifdef ESPMQTT_SMARTMETER -void smartmetercallback (char *topic, String payload) +void smartmetercallback (const char *topic, String payload) { static uint32 nextupdatetime = 0; static bool sendupdate = 0; @@ -3668,7 +3686,7 @@ void smartmetercallback (char *topic, String payload) if (payload == "receiving") digitalWrite(NODEMCULEDPIN, 1); else digitalWrite(NODEMCULEDPIN, 0); } - + if ((nextupdatetime < uptime) && (topic == "status") && (payload == "receiving")) // wait for start of new packet from smartmeter { sendupdate = 1; @@ -4198,7 +4216,7 @@ void setup() { } -static void handleDataExternalIpServer(void*, AsyncClient* client, void *data, size_t len) { +static void handleDataExternalIpServer(void*, AsyncClient * client, void *data, size_t len) { char *chardata = (char *)data; String datastring = ""; for (unsigned int i = 0; i < len; i++) @@ -4216,7 +4234,7 @@ static void handleDataExternalIpServer(void*, AsyncClient* client, void *data, s client->close(); } -void onConnectExternalIpServer(void*, AsyncClient* client) { +void onConnectExternalIpServer(void*, AsyncClient * client) { client->add("GET /extip.php\r\n", 16); client->send(); } diff --git a/growatt.cpp b/growatt.cpp index 85375b3..9ab21a3 100644 --- a/growatt.cpp +++ b/growatt.cpp @@ -8,7 +8,7 @@ #define _GROWAT_PWM_RANGE (PWMRANGE-GROWATT_FANSPEED_OFFSET) #define _GROWATT_FAN_PWM_FREQ 32 -void(*_growatt_callback)(char *,String); +void(*_growatt_callback)(const char *,String); static int _growatt_fanpin = 0; static int _growatt_fanspeed = 0; static float _growatt_fan_pid_p = 0; @@ -18,7 +18,7 @@ static float _growatt_fan_pid_error = 0; static float _growatt_fan_pid_preverror = 0; -void growatt_init(void(*callback)(char *,String), int fanpin) +void growatt_init(void(*callback)(const char *,String), int fanpin) { _growatt_callback = callback; Serial.setRxBufferSize(100); diff --git a/growatt.h b/growatt.h index 73b0506..48ebddb 100644 --- a/growatt.h +++ b/growatt.h @@ -1,4 +1,4 @@ -void growatt_init(void(*callback)(char *,String), int fanpin = -1); +void growatt_init(void(*callback)(const char *,String), int fanpin = -1); void growatt_handle(); #define GROWATT_FANSPEED_OFFSET 150 diff --git a/growattmodbus.cpp b/growattmodbus.cpp index 540e2f0..8f0b30b 100644 --- a/growattmodbus.cpp +++ b/growattmodbus.cpp @@ -10,9 +10,9 @@ ModbusMaster node; -void(*_growattModbus_callback)(char *, String); +void(*_growattModbus_callback)(const char*, String); -void growattModbus_init(void(*callback)(char *, String), int fanpin) +void growattModbus_init(void(*callback)(const char *, String), int fanpin) { _growattModbus_callback = callback; Serial.setRxBufferSize(10); @@ -44,7 +44,9 @@ bool update_growatt() { switch (itteration) { + default: case 0: + itteration = 0; _growattModbus_callback("status", "querying"); result = node.readInputRegisters(0, 11); break; diff --git a/growattmodbus.h b/growattmodbus.h index 4987a37..66c2a75 100644 --- a/growattmodbus.h +++ b/growattmodbus.h @@ -1,4 +1,4 @@ -void growattModbus_init(void(*callback)(char *,String), int fanpin = -1); +void growattModbus_init(void(*callback)(const char *,String), int fanpin = -1); void growattModbus_handle(); #define GROWATTMODBUS_POLL_TIMER 1 diff --git a/opentherm.cpp b/opentherm.cpp index 73aa494..e4b2db7 100644 --- a/opentherm.cpp +++ b/opentherm.cpp @@ -9,9 +9,9 @@ WiFiServer otserver(25238); uint32_t wdresettimeout = 0; uint8_t resetstate = 1; -void(*_opentherm_callback)(char *, String); +void(*_opentherm_callback)(const char *, String); -void opentherm_callback(char * topic, String payload) +void opentherm_callback(const char* topic, String payload) { yield(); _opentherm_callback(topic, payload); @@ -60,7 +60,7 @@ void opentherm_reset() resetstate = 1; } -void opentherm_init(void(*callback)(char *, String)) +void opentherm_init(void(*callback)(const char *, String)) { Serial.setDebugOutput(false); Serial.setRxBufferSize(100); @@ -110,7 +110,7 @@ int opentherm_handle() DEBUG_V("%sSERIAL RX:%s %s\n", COLOR_GREEN, COLOR_RESET, otmessage.c_str()); yield(); String otvalue = ""; - char *topic; + const char *topic; uint16_t otintvalue = 0; if (otmessage.substring(0, 4) == "TC: ") diff --git a/opentherm.h b/opentherm.h index 2acbb3e..110d178 100644 --- a/opentherm.h +++ b/opentherm.h @@ -1,4 +1,4 @@ -void opentherm_init(void(*callback)(char *,String)); +void opentherm_init(void(*callback)(const char *,String)); int opentherm_handle(); void opentherm_setthermosttattemporary(double value); void opentherm_setthermosttatcontinue(double value); diff --git a/smartmeter.cpp b/smartmeter.cpp index b43c152..a7e7d40 100644 --- a/smartmeter.cpp +++ b/smartmeter.cpp @@ -1,9 +1,9 @@ #include "espMQTT.h" #include "smartmeter.h" -void(*_smartmeter_callback)(char *,String); +void(*_smartmeter_callback)(const char*,String); -void smartmeter_init(void(*callback)(char *,String)) +void smartmeter_init(void(*callback)(const char *,String)) { _smartmeter_callback = callback; diff --git a/smartmeter.h b/smartmeter.h index abdda88..d1dfb39 100644 --- a/smartmeter.h +++ b/smartmeter.h @@ -1,2 +1,2 @@ int8_t smartmeter_handle(); -void smartmeter_init(void(*callback)(char *,String)); +void smartmeter_init(void(*callback)(const char *,String)); diff --git a/tuya.cpp b/tuya.cpp index 113b4c8..684e0c4 100644 --- a/tuya.cpp +++ b/tuya.cpp @@ -26,7 +26,7 @@ static uint8_t tuya_dimstate0 = 0; static uint8_t tuya_dimstate1 = 0; -void(*_tuya_callback)(String, String); +void(*_tuya_callback)(const char *, String); void tuya_commandCharsToSerial(unsigned int length, unsigned char* command) { @@ -53,7 +53,7 @@ void tuya_commandCharsToSerial(unsigned int length, unsigned char* command) Serial.flush(); } -void tuya_init(void(*callback)(String, String)) +void tuya_init(void(*callback)(const char *, String)) { Serial.begin(9600, SERIAL_8N1); Serial.setRxBufferSize(100); diff --git a/tuya.h b/tuya.h index e910cbe..97cbe80 100644 --- a/tuya.h +++ b/tuya.h @@ -1,4 +1,4 @@ -void tuya_init(void(*callback)(String,String)); +void tuya_init(void(*callback)(const char *,String)); void tuya_handle(); void tuya_connected(); void tuya_connectedMQTT();