Skip to content

Commit

Permalink
DHWdelta set and mqtt broker timeout improvements for not blocking loop
Browse files Browse the repository at this point in the history
  • Loading branch information
IgorYbema committed Dec 17, 2020
1 parent 85bce71 commit 711f8b7
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 28 deletions.
54 changes: 33 additions & 21 deletions HeishaMon/HeishaMon.ino
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ settingsStruct heishamonSettings;

bool sending = false; // mutex for sending data
bool mqttcallbackinprogress = false; // mutex for processing mqtt callback
unsigned long nextMqttReconnectAttempt = 0;
#define MQTTRECONNECTTIMER 30000
unsigned long nexttime = 0;

unsigned long allowreadtime = 0; //set to millis value during send, allow to wait millis for answer
Expand Down Expand Up @@ -78,31 +80,39 @@ PubSubClient mqtt_client(mqtt_wifi_client);

void mqtt_reconnect()
{
log_message((char*)"Reconnecting to mqtt server ...");
char topic[256];
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_willtopic);
if (mqtt_client.connect(heishamonSettings.wifi_hostname, heishamonSettings.mqtt_username, heishamonSettings.mqtt_password, topic, 1, true, "Offline"))
{
mqttReconnects++;
sprintf(topic, "%s/%s/#", heishamonSettings.mqtt_topic_base, mqtt_topic_commands);
mqtt_client.subscribe(topic);
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_send_raw_value_topic);
mqtt_client.subscribe(topic);
unsigned long now = millis();
if (now > nextMqttReconnectAttempt) {
nextMqttReconnectAttempt = now + MQTTRECONNECTTIMER;
log_message((char*)"Reconnecting to mqtt server ...");
char topic[256];
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_willtopic);
mqtt_client.publish(topic, "Online");
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_iptopic);
mqtt_client.publish(topic, WiFi.localIP().toString().c_str(), true);
if (mqtt_client.connect(heishamonSettings.wifi_hostname, heishamonSettings.mqtt_username, heishamonSettings.mqtt_password, topic, 1, true, "Offline"))
{
mqttReconnects++;
sprintf(topic, "%s/%s/#", heishamonSettings.mqtt_topic_base, mqtt_topic_commands);
mqtt_client.loop(); mqtt_client.subscribe(topic); mqtt_client.loop();
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_send_raw_value_topic);
mqtt_client.loop(); mqtt_client.subscribe(topic); mqtt_client.loop();
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_willtopic);
mqtt_client.loop(); mqtt_client.publish(topic, "Online"); mqtt_client.loop();
sprintf(topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_iptopic);
mqtt_client.loop(); mqtt_client.publish(topic, WiFi.localIP().toString().c_str(), true); mqtt_client.loop();
}
}
}

void log_message(char* string)
{
if (heishamonSettings.logSerial1) Serial1.println(string);
if (heishamonSettings.logSerial1) {
Serial1.print(millis());
Serial1.print(": ");
Serial1.println(string);
}
if (heishamonSettings.logMqtt)
{
char log_topic[256];
sprintf(log_topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_logtopic);
mqtt_client.publish(log_topic, string);
mqtt_client.loop(); mqtt_client.publish(log_topic, string); mqtt_client.loop();
}
}

Expand Down Expand Up @@ -386,6 +396,7 @@ void switchSerial() {

void setupMqtt() {
mqtt_client.setBufferSize(1024);
mqtt_client.setSocketTimeout(2); mqtt_client.setKeepAlive(2); //fast timeout, any slower will block the main loop too long
mqtt_client.setServer(heishamonSettings.mqtt_server, atoi(heishamonSettings.mqtt_port));
mqtt_client.setCallback(mqtt_callback);
mqtt_reconnect();
Expand All @@ -407,14 +418,14 @@ void setup() {

//load optional PCB data from flash
if (heishamonSettings.optionalPCB) {
if (loadOptionalPCB(optionalPCBQuery, OPTIONALPCBQUERYSIZE)){
if (loadOptionalPCB(optionalPCBQuery, OPTIONALPCBQUERYSIZE)) {
log_message((char*)"Succesfully loaded optional PCB data from saved flash!");
}
else {
log_message((char*)"Failed to load optional PCB data from flash!");
}
}

}

void send_panasonic_query() {
Expand Down Expand Up @@ -462,14 +473,15 @@ void loop() {

if (heishamonSettings.use_s0) s0Loop(mqtt_client, log_message, heishamonSettings.mqtt_topic_base, heishamonSettings.s0Settings);


if ((!sending) && (!heishamonSettings.listenonly) && (heishamonSettings.optionalPCB)) send_optionalpcb_query();

// run the data query only each WAITTIME
if (millis() > nexttime) {

String message = "Heishamon stats: Uptime: " + getUptime() + " ## Free memory: " + getFreeMemory() + "% " + ESP.getFreeHeap() + " bytes ## Wifi: " + getWifiQuality() + "% ## Mqtt reconnects: " + mqttReconnects;
log_message((char*)message.c_str());
if (!mqtt_client.connected())
{
log_message((char *)"Lost MQTT connection, reconnecting...");
if (WiFi.status() != WL_CONNECTED) {
log_message((char *)"Lost WiFi connection, rebooting...");
delay(1000);
Expand All @@ -484,10 +496,10 @@ void loop() {
}
nexttime = millis() + (1000 * heishamonSettings.waitTime);
if (!heishamonSettings.listenonly) send_panasonic_query();
if ((!heishamonSettings.listenonly) && (heishamonSettings.optionalPCB)) send_optionalpcb_query();

MDNS.announce();
//Make sure the LWT is set to Online, even if the broker have marked it dead.
sprintf(mqtt_topic, "%s/%s", heishamonSettings.mqtt_topic_base, mqtt_willtopic);
mqtt_client.publish(mqtt_topic, "Online");
mqtt_client.loop(); mqtt_client.publish(mqtt_topic, "Online"); mqtt_client.loop();
}
}
22 changes: 22 additions & 0 deletions HeishaMon/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,28 @@ unsigned int set_floor_cool_delta(char *msg, unsigned char *cmd, char *log_msg)
return len;
}

unsigned int set_dhw_heat_delta(char *msg, unsigned char *cmd, char *log_msg) {
unsigned int len = 0;
String set_temperature_string(msg);

byte request_temp = set_temperature_string.toInt() + 128;

{
char tmp[256] = { 0 };
snprintf(tmp, 255, "set floor heat delta to %d", request_temp - 128 );
memcpy(log_msg, tmp, sizeof(tmp));
}

{
unsigned char tmp[] = {0xf1, 0x6c, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
tmp[99] = request_temp;
len = sizeof(tmp);
memcpy(cmd, tmp, len);
}

return len;
}


//start of optional pcb commands
unsigned int set_byte_6(int val, int base, int bit, char *log_msg, const char *func) {
Expand Down
2 changes: 2 additions & 0 deletions HeishaMon/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ unsigned int set_curves(char *msg, unsigned char *cmd,char *log_msg);
unsigned int set_zones(char *msg, unsigned char *cmd,char *log_msg);
unsigned int set_floor_heat_delta(char *msg, unsigned char *cmd,char *log_msg);
unsigned int set_floor_cool_delta(char *msg, unsigned char *cmd,char *log_msg);
unsigned int set_dhw_heat_delta(char *msg, unsigned char *cmd,char *log_msg);


//optional pcb commands
Expand Down Expand Up @@ -99,6 +100,7 @@ struct {
{ "SetZones", set_zones },
{ "SetFloorHeatDelta", set_floor_heat_delta },
{ "SetFloorCoolDelta", set_floor_cool_delta },
{ "SetDHWHeatDelta", set_dhw_heat_delta },
};

struct {
Expand Down
2 changes: 1 addition & 1 deletion HeishaMon/dallas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void readNewDallasTemp(PubSubClient &mqtt_client, void (*log_message)(char*), ch
actDallasData[i].temperature = temp;
sprintf(log_msg, "Received 1wire sensor temperature (%s): %.2f", actDallasData[i].address, actDallasData[i].temperature); log_message(log_msg);
sprintf(valueStr, "%.2f", actDallasData[i].temperature);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_1wire, actDallasData[i].address); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_1wire, actDallasData[i].address); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES); mqtt_client.loop();
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions HeishaMon/decode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ void decode_heatpump_data(char* data, String actData[], PubSubClient &mqtt_clien
if ((updatenow) || ( actData[Topic_Number] != Topic_Value )) {
actData[Topic_Number] = Topic_Value;
sprintf(log_msg, "received TOP%d %s: %s", Topic_Number, topics[Topic_Number], Topic_Value.c_str()); log_message(log_msg);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_values, topics[Topic_Number]); mqtt_client.publish(mqtt_topic, Topic_Value.c_str(), MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_values, topics[Topic_Number]); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, Topic_Value.c_str(), MQTT_RETAIN_VALUES); mqtt_client.loop();
}
}
}
Expand Down Expand Up @@ -248,7 +248,7 @@ void decode_optional_heatpump_data(char* data, String actOptData[], PubSubClient
if ((updatenow) || ( actOptData[Topic_Number] != Topic_Value )) {
actOptData[Topic_Number] = Topic_Value;
sprintf(log_msg, "received OPT%d %s: %s", Topic_Number, Topic_Name.c_str(), Topic_Value.c_str()); log_message(log_msg);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_pcbvalues, Topic_Name.c_str()); mqtt_client.publish(mqtt_topic, Topic_Value.c_str(), MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/%s", mqtt_topic_base, mqtt_topic_pcbvalues, Topic_Name.c_str()); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, Topic_Value.c_str(), MQTT_RETAIN_VALUES); mqtt_client.loop();
}
}
//response to heatpump should contain the data from heatpump on byte 4 and 5
Expand Down
6 changes: 3 additions & 3 deletions HeishaMon/s0.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,14 +118,14 @@ void s0Loop(PubSubClient &mqtt_client, void (*log_message)(char*), char* mqtt_to
char valueStr[20];
sprintf(log_msg, "Measured Watthour on S0 port %d: %.2f", (i + 1), Watthour ); log_message(log_msg);
sprintf(valueStr, "%.2f", Watthour);
sprintf(mqtt_topic, "%s/%s/Watthour/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/Watthour/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES); mqtt_client.loop();
float WatthourTotal = (actS0Data[i].pulsesTotal * ( 1000.0 / actS0Settings[i].ppkwh));
sprintf(log_msg, "Measured total Watthour on S0 port %d: %.2f", (i + 1), WatthourTotal ); log_message(log_msg);
sprintf(valueStr, "%.2f", WatthourTotal);
sprintf(mqtt_topic, "%s/%s/WatthourTotal/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/WatthourTotal/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES); mqtt_client.loop();
sprintf(log_msg, "Calculated Watt on S0 port %d: %u", (i + 1), actS0Data[i].watt); log_message(log_msg);
sprintf(valueStr, "%u", actS0Data[i].watt);
sprintf(mqtt_topic, "%s/%s/Watt/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES);
sprintf(mqtt_topic, "%s/%s/Watt/%d", mqtt_topic_base, mqtt_topic_s0, (i + 1)); mqtt_client.loop(); mqtt_client.publish(mqtt_topic, valueStr, MQTT_RETAIN_VALUES); mqtt_client.loop();
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion HeishaMon/version.h
Original file line number Diff line number Diff line change
@@ -1 +1 @@
static const char* heishamon_version = "0.9b-iy-22-LittleFS";
static const char* heishamon_version = "0.9b-iy-23-LittleFS";
1 change: 1 addition & 0 deletions MQTT-Topics.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ SET16 | SetCurves | Set zones heat/cool curves | JSON document (see below)
SET17 | SetZones | Set zones to active | 0 = zone 1 active, 1 = zone2 active, 2 = zone1 and zone2 active
SET18 | SetFloorHeatDelta | Set floor heating delta in Kelvin | 1-15
SET19 | SetFloorCoolDelta | Set floor cooling delta in Kelvin | 1-15
SET20 | SetDHWHeatDelta | Set DHW heating delta in Kelvin | 1-15


*If you operate your heatpump with direct temperature setup: topics ending xxxRequestTemperature will set the absolute target temperature*
Expand Down
Binary file not shown.

0 comments on commit 711f8b7

Please sign in to comment.