diff --git a/Makefile b/Makefile index 7c20ab6..55fe38e 100755 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ CFLAGS = $(GCCFLAGS) $(DBG) $(LIBS) -D MG_DISABLE_MD5 -D MG_DISABLE_HTTP_DIGEST_ # Add inputs and outputs from these tool invocations to the build variables # define the C source files -SRCS = aqualinkd.c utils.c config.c aq_serial.c init_buttons.c aq_programmer.c net_services.c json_messages.c pda.c pda_menu.c pda_aq_programmer.c packetLogger.c pentair_messages.c mongoose.c +SRCS = aqualinkd.c utils.c config.c aq_serial.c init_buttons.c aq_programmer.c net_services.c json_messages.c pda.c pda_menu.c pda_aq_programmer.c aquapure.c packetLogger.c pentair_messages.c mongoose.c DBG_SRC = timespec_subtract.c # If run with `make DEBUG=true` add debug files and pass parameter for compile diff --git a/README.md b/README.md index 2f7cdc7..68cd9a5 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ Designed to mimic AqualinkRS6 All Button keypad and (like the keypad) is used to * http://aqualink.ip/simple.html <- (Simple opion if you don't like the above) * http://aqualink.ip/simulator.html <- (RS8 All Button Control Panel simulator) # +# Update in Release 1.3.9 +* Added panel Timeout mode support to UI and MQTT +* Fixed SWG bug while in Service & Timeout modes +* Cleanded up SWG code and MQTT status messages for SWG and SWG/enabled # Update in Release 1.3.8 * Fixed PDA mode from 1.3.7 * Added SWG Boost to PDA diff --git a/aqualinkd.c b/aqualinkd.c index e6c6a32..6f0601c 100644 --- a/aqualinkd.c +++ b/aqualinkd.c @@ -41,6 +41,7 @@ #include "pentair_messages.h" #include "pda_aq_programmer.h" #include "packetLogger.h" +#include "aquapure.h" #include "version.h" @@ -1085,7 +1086,7 @@ void main_loop() unsigned char packet_buffer[AQ_MAXPKTLEN+1]; bool interestedInNextAck = false; bool changed = false; - int swg_zero_cnt = 0; + //int swg_zero_cnt = 0; int swg_noreply_cnt = 0; int i; //int delayAckCnt = 0; @@ -1260,21 +1261,7 @@ void main_loop() if (packet_buffer[PKT_DEST] == DEV_MASTER && interestedInNextAck == true) { swg_noreply_cnt = 0; - if (packet_buffer[PKT_CMD] == CMD_PPM) - { - _aqualink_data.ar_swg_status = packet_buffer[5]; - if (_aqualink_data.swg_delayed_percent != TEMP_UNKNOWN && _aqualink_data.ar_swg_status == SWG_STATUS_ON) - { // We have a delayed % to set. - char sval[10]; - snprintf(sval, 9, "%d", _aqualink_data.swg_delayed_percent); - aq_programmer(AQ_SET_SWG_PERCENT, sval, &_aqualink_data); - logMessage(LOG_NOTICE, "Setting SWG %% to %d, from delayed message\n", _aqualink_data.swg_delayed_percent); - _aqualink_data.swg_delayed_percent = TEMP_UNKNOWN; - } - _aqualink_data.swg_ppm = packet_buffer[4] * 100; - changed = true; - //logMessage(LOG_DEBUG, "Read SWG PPM %d from ID 0x%02hhx\n", _aqualink_data.swg_ppm, SWG_DEV_ID); - } + processPacketFromSWG(packet_buffer, packet_length, &_aqualink_data); interestedInNextAck = false; } //else if (interestedInNextAck == true && packet_buffer[PKT_DEST] != DEV_MASTER && _aqualink_data.ar_swg_status != 0x00) @@ -1289,33 +1276,7 @@ void main_loop() else if (packet_buffer[PKT_DEST] == SWG_DEV_ID) { interestedInNextAck = true; - - // Only read message from controller to SWG to set SWG Percent if we are not programming, as we might be changing this - if (packet_buffer[3] == CMD_PERCENT && _aqualink_data.active_thread.thread_id == 0 && packet_buffer[4] != 0xFF) - { - // In service or timeout mode SWG set % message is very strange. AR %% | HEX: 0x10|0x02|0x50|0x11|0xff|0x72|0x10|0x03| - // Not really sure what to do with this, just ignore 0xff / 255 for the moment. (if statment above) - - // SWG can get ~10 messages to set to 0 then go back again for some reason, so don't go to 0 until 10 messages are received - if (swg_zero_cnt <= _config_parameters.swg_zero_ignore && packet_buffer[4] == 0x00 && packet_buffer[5] == 0x73) { - logMessage(LOG_DEBUG, "Ignoring SWG set to %d due to packet packet count %d <= %d from control panel to SWG 0x%02hhx 0x%02hhx\n", (int)packet_buffer[4],swg_zero_cnt,_config_parameters.swg_zero_ignore,packet_buffer[4],packet_buffer[5]); - swg_zero_cnt++; - } else if (swg_zero_cnt > _config_parameters.swg_zero_ignore && packet_buffer[4] == 0x00 && packet_buffer[5] == 0x73) { - _aqualink_data.swg_percent = (int)packet_buffer[4]; - changed = true; - //logMessage(LOG_DEBUG, "SWG set to %d due to packet packet count %d <= %d from control panel to SWG 0x%02hhx 0x%02hhx\n", (int)packet_buffer[4],swg_zero_cnt,SWG_ZERO_IGNORE_COUNT,packet_buffer[4],packet_buffer[5]); - //swg_zero_cnt++; - } else { - swg_zero_cnt = 0; - _aqualink_data.swg_percent = (int)packet_buffer[4]; - changed = true; - //logMessage(LOG_DEBUG, "SWG set to %d due to packet from control panel to SWG 0x%02hhx 0x%02hhx\n", _aqualink_data.swg_percent,packet_buffer[4],packet_buffer[5]); - } - if (_aqualink_data.swg_percent > 100) - _aqualink_data.boost = true; - else - _aqualink_data.boost = false; - } + processPacketToSWG(packet_buffer, packet_length, &_aqualink_data, _config_parameters.swg_zero_ignore); } else { diff --git a/aquapure.c b/aquapure.c new file mode 100644 index 0000000..56fbf7d --- /dev/null +++ b/aquapure.c @@ -0,0 +1,175 @@ + +#include + +#include "aquapure.h" +#include "aq_serial.h" +#include "aqualink.h" +#include "utils.h" +#include "aq_mqtt.h" + +bool processPacketToSWG(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata, int swg_zero_ignore) { + static int swg_zero_cnt = 0; + bool changedAnything = false; + + // Only read message from controller to SWG to set SWG Percent if we are not programming, as we might be changing this + if (packet[3] == CMD_PERCENT && aqdata->active_thread.thread_id == 0 && packet[4] != 0xFF) { + // In service or timeout mode SWG set % message is very strange. AR %% | HEX: 0x10|0x02|0x50|0x11|0xff|0x72|0x10|0x03| + // Not really sure what to do with this, just ignore 0xff / 255 for the moment. (if statment above) + + // SWG can get ~10 messages to set to 0 then go back again for some reason, so don't go to 0 until 10 messages are received + if (swg_zero_cnt <= swg_zero_ignore && packet[4] == 0x00 && packet[5] == 0x73) { + logMessage(LOG_DEBUG, "Ignoring SWG set to %d due to packet packet count %d <= %d from control panel to SWG 0x%02hhx 0x%02hhx\n", (int)packet[4], + swg_zero_cnt, swg_zero_ignore, packet[4], packet[5]); + swg_zero_cnt++; + } else if (swg_zero_cnt > swg_zero_ignore && packet[4] == 0x00 && packet[5] == 0x73) { + aqdata->swg_percent = (int)packet[4]; + changedAnything = true; + // logMessage(LOG_DEBUG, "SWG set to %d due to packet packet count %d <= %d from control panel to SWG 0x%02hhx 0x%02hhx\n", + // (int)packet[4],swg_zero_cnt,SWG_ZERO_IGNORE_COUNT,packet[4],packet[5]); swg_zero_cnt++; + } else { + swg_zero_cnt = 0; + aqdata->swg_percent = (int)packet[4]; + changedAnything = true; + // logMessage(LOG_DEBUG, "SWG set to %d due to packet from control panel to SWG 0x%02hhx 0x%02hhx\n", + // aqdata.swg_percent,packet[4],packet[5]); + } + + if (aqdata->swg_percent > 100) + aqdata->boost = true; + else + aqdata->boost = false; + } + return changedAnything; +} + +bool processPacketFromSWG(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata) { + bool changedAnything = false; + + if (packet[PKT_CMD] == CMD_PPM) { + aqdata->ar_swg_status = packet[5]; + if (aqdata->swg_delayed_percent != TEMP_UNKNOWN && aqdata->ar_swg_status == SWG_STATUS_ON) { // We have a delayed % to set. + char sval[10]; + snprintf(sval, 9, "%d", aqdata->swg_delayed_percent); + aq_programmer(AQ_SET_SWG_PERCENT, sval, aqdata); + logMessage(LOG_NOTICE, "Setting SWG %% to %d, from delayed message\n", aqdata->swg_delayed_percent); + aqdata->swg_delayed_percent = TEMP_UNKNOWN; + } + aqdata->swg_ppm = packet[4] * 100; + changedAnything = true; + // logMessage(LOG_DEBUG, "Read SWG PPM %d from ID 0x%02hhx\n", aqdata.swg_ppm, SWG_DEV_ID); + } + + return changedAnything; +} + + +aqledstate get_swg_led_state(struct aqualinkdata *aqdata) +{ + switch (aqdata->ar_swg_status) { + // Level = (0=gray, 1=green, 2=yellow, 3=orange, 4=red) + case SWG_STATUS_ON: + return (aqdata->swg_percent > 0?ON:ENABLE); + break; + case SWG_STATUS_NO_FLOW: + return ENABLE; + break; + case SWG_STATUS_LOW_SALT: + return (aqdata->swg_percent > 0?ON:ENABLE); + break; + case SWG_STATUS_HI_SALT: + return (aqdata->swg_percent > 0?ON:ENABLE); + break; + case SWG_STATUS_HIGH_CURRENT: + return (aqdata->swg_percent > 0?ON:ENABLE); + break; + case SWG_STATUS_TURNING_OFF: + return OFF; + break; + case SWG_STATUS_CLEAN_CELL: + return (aqdata->swg_percent > 0?ON:ENABLE); + return ENABLE; + break; + case SWG_STATUS_LOW_VOLTS: + return ENABLE; + break; + case SWG_STATUS_LOW_TEMP: + return ENABLE; + break; + case SWG_STATUS_CHECK_PCB: + return ENABLE; + break; + case SWG_STATUS_OFF: // THIS IS OUR OFF STATUS, NOT AQUAPURE + return OFF; + break; + default: + return (aqdata->swg_percent > 0?ON:ENABLE); + break; + } +} + +void get_swg_status_mqtt(struct aqualinkdata *aqdata, char *message, int *status, int *dzalert) +{ + switch (aqdata->ar_swg_status) { + // Level = (0=gray, 1=green, 2=yellow, 3=orange, 4=red) + case SWG_STATUS_ON: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE GENERATING CHLORINE"); + *dzalert = 1; + break; + case SWG_STATUS_NO_FLOW: + *status = SWG_OFF; + sprintf(message, "AQUAPURE NO FLOW"); + *dzalert = 2; + break; + case SWG_STATUS_LOW_SALT: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE LOW SALT"); + *dzalert = 2; + break; + case SWG_STATUS_HI_SALT: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE HIGH SALT"); + *dzalert = 3; + break; + case SWG_STATUS_HIGH_CURRENT: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE HIGH CURRENT"); + *dzalert = 4; + break; + case SWG_STATUS_TURNING_OFF: + *status = SWG_OFF; + sprintf(message, "AQUAPURE TURNING OFF"); + *dzalert = 0; + break; + case SWG_STATUS_CLEAN_CELL: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE CLEAN CELL"); + *dzalert = 2; + break; + case SWG_STATUS_LOW_VOLTS: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE LOW VOLTAGE"); + *dzalert = 3; + break; + case SWG_STATUS_LOW_TEMP: + *status = SWG_OFF; + sprintf(message, "AQUAPURE WATER TEMP LOW"); + *dzalert = 2; + break; + case SWG_STATUS_CHECK_PCB: + *status = SWG_OFF; + sprintf(message, "AQUAPURE CHECK PCB"); + *dzalert = 4; + break; + case SWG_STATUS_OFF: // THIS IS OUR OFF STATUS, NOT AQUAPURE + *status = SWG_OFF; + sprintf(message, "AQUAPURE OFF"); + *dzalert = 0; + break; + default: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE UNKNOWN STATUS"); + *dzalert = 4; + break; + } +} \ No newline at end of file diff --git a/aquapure.h b/aquapure.h new file mode 100644 index 0000000..4876183 --- /dev/null +++ b/aquapure.h @@ -0,0 +1,14 @@ +#ifndef AQUAPURE_H_ +#define AQUAPURE_H_ + +#include + +#include "aqualink.h" + +bool processPacketToSWG(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata, int swg_zero_ignore); +bool processPacketFromSWG(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata); + +void get_swg_status_mqtt(struct aqualinkdata *aqdata, char *message, int *status, int *dzalert); +aqledstate get_swg_led_state(struct aqualinkdata *aqdata); + +#endif // AQUAPURE_H_ \ No newline at end of file diff --git a/json_messages.c b/json_messages.c index 171dd29..3ebe225 100644 --- a/json_messages.c +++ b/json_messages.c @@ -28,6 +28,7 @@ #include "json_messages.h" #include "domoticz.h" #include "aq_mqtt.h" +#include "aquapure.h" #include "version.h" @@ -268,7 +269,8 @@ int build_device_JSON(struct aqualinkdata *aqdata, int programable_switch1, int SWG_TOPIC, "Salt Water Generator", aqdata->ar_swg_status == SWG_STATUS_OFF?JSON_OFF:JSON_ON, - aqdata->ar_swg_status == SWG_STATUS_OFF?JSON_OFF:JSON_ON, + //aqdata->ar_swg_status == SWG_STATUS_OFF?JSON_OFF:JSON_ON, + LED2text(get_swg_led_state(aqdata)), ((homekit)?2:0), ((homekit_f)?degFtoC(aqdata->swg_percent):aqdata->swg_percent), ((homekit)?2:0), @@ -414,6 +416,7 @@ int build_aqualink_status_JSON(struct aqualinkdata *aqdata, char* buffer, int si length += sprintf(buffer+length, ",\"leds\":{" ); for (i=0; i < TOTAL_BUTTONS; i++) { + /* char *state = JSON_OFF; switch (aqdata->aqbuttons[i].led->state) { @@ -430,7 +433,8 @@ int build_aqualink_status_JSON(struct aqualinkdata *aqdata, char* buffer, int si case ENABLE: state = JSON_ENABLED; break; - } + }*/ + char *state = LED2text(aqdata->aqbuttons[i].led->state); length += sprintf(buffer+length, "\"%s\": \"%s\"", aqdata->aqbuttons[i].name, state); if (i+1 < TOTAL_BUTTONS) @@ -438,7 +442,9 @@ int build_aqualink_status_JSON(struct aqualinkdata *aqdata, char* buffer, int si } if ( aqdata->swg_percent != TEMP_UNKNOWN ) { - length += sprintf(buffer+length, ", \"%s\": \"%s\"", SWG_TOPIC, aqdata->ar_swg_status == SWG_STATUS_OFF?JSON_OFF:JSON_ON); + + length += sprintf(buffer+length, ", \"%s\": \"%s\"", SWG_TOPIC, LED2text(get_swg_led_state(aqdata))); + //length += sprintf(buffer+length, ", \"%s\": \"%s\"", SWG_TOPIC, aqdata->ar_swg_status == SWG_STATUS_OFF?JSON_OFF:JSON_ON); length += sprintf(buffer+length, ", \"%s\": \"%s\"", SWG_BOOST_TOPIC, aqdata->boost?JSON_ON:JSON_OFF); } //NSF Need to come back and read what the display states when Freeze protection is on diff --git a/net_services.c b/net_services.c index ad2e721..7e2a66f 100644 --- a/net_services.c +++ b/net_services.c @@ -34,6 +34,7 @@ #include "domoticz.h" #include "aq_mqtt.h" #include "pda.h" +#include "aquapure.h" static struct aqconfig *_aqualink_config; @@ -398,8 +399,37 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) _last_mqtt_aqualinkdata.battery = _aqualink_data->battery; send_mqtt_string_msg(nc, BATTERY_STATE, _aqualink_data->battery==OK?MQTT_ON:MQTT_OFF); } + + if (_aqualink_data->ar_swg_status != _last_mqtt_aqualinkdata.ar_swg_status || + _aqualink_data->swg_percent != _last_mqtt_aqualinkdata.swg_percent) { // Percent can also effect status + char message[30]; + int status; + int dzalert; - //if (_aqualink_data->ar_swg_status == SWG_STATUS_ON) { // If the SWG is actually on + get_swg_status_mqtt(_aqualink_data, message, &status, &dzalert); + + if (!_aqualink_data->simulate_panel) + sprintf(_aqualink_data->last_display_message, message); + + send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, dzalert, &message[10]); + send_mqtt_int_msg(nc, SWG_TOPIC, status); + + if (_aqualink_data->ar_swg_status == SWG_STATUS_OFF) + send_mqtt_int_msg(nc, SWG_ENABELED_TOPIC, SWG_OFF); + else + send_mqtt_int_msg(nc, SWG_ENABELED_TOPIC, SWG_ON); + + send_mqtt_int_msg(nc, SWG_EXTENDED_TOPIC, (int)_aqualink_data->ar_swg_status); + + _last_mqtt_aqualinkdata.ar_swg_status = _aqualink_data->ar_swg_status; + } + + if (_aqualink_data->boost != _last_mqtt_aqualinkdata.boost) { + send_mqtt_int_msg(nc, SWG_BOOST_TOPIC, _aqualink_data->boost); + _last_mqtt_aqualinkdata.boost = _aqualink_data->boost; + } + + //if (_aqualink_data->ar_swg_status == SWG_STATUS_ON) { // If the SWG is actually on if (_aqualink_data->ar_swg_status != SWG_STATUS_OFF) { // If the SWG is actually on if (_aqualink_data->swg_percent != TEMP_UNKNOWN && (force_update || _aqualink_data->swg_percent != _last_mqtt_aqualinkdata.swg_percent)) { _last_mqtt_aqualinkdata.swg_percent = _aqualink_data->swg_percent; @@ -415,96 +445,6 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) send_domoticz_mqtt_numeric_msg(nc, _aqualink_config->dzidx_swg_ppm, _aqualink_data->swg_ppm); } } - - if (_aqualink_data->ar_swg_status != _last_mqtt_aqualinkdata.ar_swg_status) { - - send_mqtt_int_msg(nc, SWG_EXTENDED_TOPIC, (int)_aqualink_data->ar_swg_status); - - if (_aqualink_data->ar_swg_status == SWG_STATUS_OFF) - send_mqtt_int_msg(nc, SWG_ENABELED_TOPIC, SWG_OFF); - else - send_mqtt_int_msg(nc, SWG_ENABELED_TOPIC, SWG_ON); - - switch (_aqualink_data->ar_swg_status) { - // Level = (0=gray, 1=green, 2=yellow, 3=orange, 4=red) - case SWG_STATUS_ON: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure ON"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 1, "GENERATING CHLORINE"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_NO_FLOW: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure No Flow"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 2, "NO FLOW"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_OFF); - break; - case SWG_STATUS_LOW_SALT: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Low Salt"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 2, "LOW SALT"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_HI_SALT: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure High Salt"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 3, "HIGH SALT"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_HIGH_CURRENT: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure High Current"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 4, "HIGH CURRENT"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_TURNING_OFF: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Turning Off"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 0, "TURNING OFF"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_OFF); - break; - case SWG_STATUS_CLEAN_CELL: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Clean Cell"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 2, "CLEAN CELL"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_LOW_VOLTS: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Low Voltage"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 3, "LOW VOLTAGE"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - case SWG_STATUS_LOW_TEMP: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Water Temp Low"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 2, "WATER TEMP LOW"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_OFF); - break; - case SWG_STATUS_CHECK_PCB: - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure Check PCB"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 4, "CHECK PCB"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_OFF); - break; - case SWG_STATUS_OFF: // THIS IS OUR OFF STATUS, NOT AQUAPURE - if (!_aqualink_data->simulate_panel) - sprintf(_aqualink_data->last_display_message, "AquaPure OFF"); - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 0, "OFF"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_OFF); - break; - default: - send_domoticz_mqtt_status_message(nc, _aqualink_config->dzidx_swg_status, 4, "Unknown"); - send_mqtt_int_msg(nc, SWG_TOPIC, SWG_ON); - break; - } - _last_mqtt_aqualinkdata.ar_swg_status = _aqualink_data->ar_swg_status; - } - - if (_aqualink_data->boost != _last_mqtt_aqualinkdata.boost) { - send_mqtt_int_msg(nc, SWG_BOOST_TOPIC, _aqualink_data->boost); - _last_mqtt_aqualinkdata.boost = _aqualink_data->boost; - } //logMessage(LOG_INFO, "mqtt_broadcast_aqualinkstate: START LEDs\n"); diff --git a/release/aqualinkd b/release/aqualinkd index 4bf1284..488b251 100755 Binary files a/release/aqualinkd and b/release/aqualinkd differ diff --git a/version.h b/version.h index 20dab40..5171889 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define AQUALINKD_NAME "Aqualink Daemon" -#define AQUALINKD_VERSION "1.3.8a" +#define AQUALINKD_VERSION "1.3.9" diff --git a/web/controller.html b/web/controller.html index 41a32d6..8f8fba5 100644 --- a/web/controller.html +++ b/web/controller.html @@ -860,11 +860,16 @@ if (type == 'setpoint_swg') { if (tile.getAttribute('Boost') == 'on') text = "Boost"; + else if (status == 'enabled') + text = 'Enabled'; else text = 'Generating'; } else if (type == 'setpoint_thermo') - text = 'Heating to ' + tile.getAttribute('setpoint'); + if (status == 'enabled') + text = 'Heat to ' + tile.getAttribute('setpoint'); + else + text = 'Heating to ' + tile.getAttribute('setpoint'); else if (type == 'setpoint_freeze') text = 'Turn on ' + tile.getAttribute('setpoint') + "°"; //else