2.6.8 (Dev)

master
sfeakes 2025-06-14 13:14:11 -05:00
parent 5b704cf3fb
commit 62943ab133
8 changed files with 113 additions and 34 deletions

View File

@ -126,6 +126,10 @@ NEED TO FIX FOR THIS RELEASE.
* Try an auto-update
* Update Mongoose
-->
# Updates in 2.6.8 (Dev)
* Fixed some UI bugs
* Heatpump / chiller updates
# Updates in 2.6.7 (May 23 2025)
* Fixed bug with iaqualink protocol when no virtual buttons configured.
* Updated RS timing debug messages.

Binary file not shown.

Binary file not shown.

View File

@ -42,7 +42,13 @@ typedef enum heatpumpstate{
HP_UNKNOWN
} heatpumpstate;
void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualinkdata *aqdata, bool fromMessage);
typedef enum heatpumpmsgfrom{
HP_TO_PANEL,
HP_FROM_PANEL,
HP_DISPLAY
} heatpumpmsgfrom;
void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualinkdata *aqdata, heatpumpmsgfrom from);
bool processJandyPacket(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata)
{
@ -989,25 +995,39 @@ bool processPacketToHeatPump(unsigned char *packet_buffer, int packet_length, st
0x0c|0x00 = Request off
0x0c|0x09 = Request Heat
0x0c|0x29 = Request Cool
*/
/*
0x0c|0x00|0x00|0x00|0x00| CMD HP Disabled
0x0c|0x0a|0x00|0x00|0x00| CMD HP Heat SPA
0x0c|0x01|0x00|0x00|0x00| CMD HP Enabled Pool
0x0c|0x02|0x00|0x00|0x00| CMD HP Enabled SPA
0x0c|0x09|0x00|0x00|0x00| CMD HP Heat Pool
*/
if (packet_buffer[3] == 0x0c ) {
if (packet_buffer[4] == 0x00) {
// Heat Pump is off
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Off - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(false, OFF, aqdata, false);
} else if (packet_buffer[4] == 0x09) {
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Heat - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
// Heat
updateHeatPumpLed(false, ENABLE, aqdata, false);
} else if (packet_buffer[4] == 0x29) {
// Cool
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Cool - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(true, ENABLE, aqdata, false);
} else {
// Heat Pump is on or enabled (not sure what state), but set to something other than off
LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx request to (unknown status) 0x%02hhx\n",packet_buffer[PKT_DEST], packet_buffer[4]);
if (aqdata->chiller_button != NULL && aqdata->chiller_button->led->state == OFF)
updateHeatPumpLed(false, ENABLE, aqdata, false); // Guess at enabled. ()
switch(packet_buffer[4]) {
case 0x00: // Heat Pump is off
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Off - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(HP_UNKNOWN, OFF, aqdata, HP_FROM_PANEL);
break;
case 0x09: // Heat Pool
case 0x0a: // Heat Spa
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Heat - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(HP_HEAT, ON, aqdata, HP_FROM_PANEL);
break;
case 0x01: // Enabled Pool
case 0x02: // Enabled SPA
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx Enabled - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(HP_UNKNOWN, ENABLE, aqdata, HP_FROM_PANEL);
break;
case 0x29: // Cool
LOG(DJAN_LOG, LOG_DEBUG, "Heat Pump 0x%02hhx request to Cool - status 0x%02hhx\n",packet_buffer[PKT_DEST],packet_buffer[4] );
updateHeatPumpLed(HP_COOL, ENABLE, aqdata, HP_FROM_PANEL);
break;
default:
LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx request to (unknown status) 0x%02hhx\n",packet_buffer[PKT_DEST], packet_buffer[4]);
//if (aqdata->chiller_button != NULL && aqdata->chiller_button->led->state == OFF)
// updateHeatPumpLed(HP_UNKNOWN, ENABLE, aqdata, HP_FROM_PANEL); // Guess at enabled. ()
break;
}
} else {
LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx request unknown 0x%02hhx 0x%02hhx\n",packet_buffer[PKT_DEST], packet_buffer[3] , packet_buffer[4]);
@ -1032,11 +1052,12 @@ bool processPacketFromHeatPump(unsigned char *packet_buffer, int packet_length,
if (packet_buffer[3] == 0x0d ) {
if (packet_buffer[4] == 0x40) {
updateHeatPumpLed(HP_HEAT, OFF, aqdata, false);
//updateHeatPumpLed(HP_HEAT, OFF, aqdata, HP_TO_PANEL);
updateHeatPumpLed(HP_HEAT, ENABLE, aqdata, HP_TO_PANEL);
} else if (packet_buffer[4] == 0x48) {
updateHeatPumpLed(HP_HEAT, ON, aqdata, false);
updateHeatPumpLed(HP_HEAT, ON, aqdata, HP_TO_PANEL);
} else if (packet_buffer[4] == 0x68) {
updateHeatPumpLed(HP_COOL, ON, aqdata, false);
updateHeatPumpLed(HP_COOL, ON, aqdata, HP_TO_PANEL);
} else {
//LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx ");
LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx returned unknown state 0x%02hhx\n",packet_buffer[PKT_DEST], packet_buffer[4]);
@ -1067,11 +1088,11 @@ void processHeatPumpDisplayMessage(char *msg, struct aqualinkdata *aqdata) {
hpstate = HP_COOL;
}
if (stristr(msg," ENA") != NULL) {
updateHeatPumpLed(hpstate, ENABLE, aqdata, true);
updateHeatPumpLed(hpstate, ENABLE, aqdata, HP_DISPLAY);
} else if (stristr(msg," OFF") != NULL) {
updateHeatPumpLed(hpstate, OFF, aqdata, true);
updateHeatPumpLed(hpstate, OFF, aqdata, HP_DISPLAY);
} else if (stristr(msg," ON") != NULL) {
updateHeatPumpLed(hpstate, ON, aqdata, true);
updateHeatPumpLed(hpstate, ON, aqdata, HP_DISPLAY);
}
LOG(AQUA_LOG,LOG_DEBUG, "Set %s to %s from message '%s'",
@ -1080,11 +1101,28 @@ void processHeatPumpDisplayMessage(char *msg, struct aqualinkdata *aqdata) {
}
//void updateHeatPumpLed(bool chiller, aqledstate state, struct aqualinkdata *aqdata) {
void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualinkdata *aqdata, bool fromMessage)
void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualinkdata *aqdata, heatpumpmsgfrom from)
{
if (aqdata->chiller_button == NULL)
return;
// ledstate Enabled is valied from Display and FromPanel HP_FROM_PANEL, HP_DISPLAY (NOT valid from HP ie HP_TO_PANEL)
// ledstate on off is only valid from HP or DISPLAY HP_TO_PANEL or HP_TO_PANEL (NOT FROM HP_FROM_PANEL)
if ( (ledstate == ENABLE && (from == HP_DISPLAY || from == HP_FROM_PANEL)) ||
( (ledstate == ON || ledstate == OFF) && (from == HP_DISPLAY || from == HP_TO_PANEL) )) {
if ( ledstate != aqdata->chiller_button->led->state) {
aqdata->chiller_button->led->state == ledstate;
aqdata->updated = true;
}
}
if (state == HP_COOL) {
((vbutton_detail *)aqdata->chiller_button->special_mask_ptr)->in_alt_mode = true;
} else if (state == HP_HEAT) {
((vbutton_detail *)aqdata->chiller_button->special_mask_ptr)->in_alt_mode = false;
}
/*
// If LED state is enable (that's a reqest), so only change if off.
// if froma displayed message, that's from ON to ENA, so set that one.
if ( !fromMessage && ledstate == ENABLE && aqdata->chiller_button->led->state == ON) {
@ -1104,6 +1142,7 @@ void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualink
} else {
//printf("**** Heat Pump %s, already %s, ignore!\n",LED2text(ledstate),LED2text(aqdata->chiller_button->led->state));
}
*/
}
/*
@ -1173,6 +1212,9 @@ LXi status | HEX: 0x10|0x02|0x00|0x0d|0x40|0x00|0x00|0x5f|0x10|0x03|
LXi heater ping | HEX: 0x10|0x02|0x70|0x0c|0x29|0x00|0x00|0x00|0xb7|0x10|0x03|. byte 4 0x29 This is some on / enable
LXi status | HEX: 0x10|0x02|0x00|0x0d|0x68|0x00|0x00|0x87|0x10|0x03| 0x68 probably is chiller ON
Below is when heatpump chiller is enabled but NOT on (heat or cool)
JandyDvce: To HPump: Read Jandy packet To 0x70 of type LXi heater ping | HEX: 0x10|0x02|0x70|0x0c|0x01|0x00|0x00|0x00|0x8f|0x10|0x03|
JandyDvce: From HPump: Read Jandy packet To 0x00 of type LXi status | HEX: 0x10|0x02|0x00|0x0d|0x40|0x00|0x00|0x5f|0x10|0x03|
0x0c|0x01 = Enabled
0x0c|0x29 = Chiller on

View File

@ -4,4 +4,4 @@
#define AQUALINKD_SHORT_NAME "AqualinkD"
// Use Magor . Minor . Patch
#define AQUALINKD_VERSION "2.6.7"
#define AQUALINKD_VERSION "2.6.8 (dev)"

View File

@ -1438,6 +1438,26 @@
} catch (Error) { }
}
function delayedVersionCheck(currentVersion, call=0) {
//console.log("DELAY VERSION call="+call+" - "+currentVersion+". latest "+_latestVersionAvailable);
if (_latestVersionAvailable == 0) {
if (call > 5) {
console.log("ERROR getting latest Aqualinkd version information");
return;
}
setTimeout(function() {
delayedVersionCheck(currentVersion, ++call);
}, 100);
} else {
//console.log("VERSION call="+call+" - "+currentVersion+". latest "+_latestVersionAvailable);
if ( isNewerVersion(_latestVersionAvailable, currentVersion ) || _urlParams.get('upgrade') != null) {
enablebutton("upgrade");
} else {
disablebutton("upgrade");
}
}
}
function setAqManagerOptions(data) {
/*
read deamonized logging2file logfilename debugmasks[] loglevels[]
@ -1462,10 +1482,11 @@
} else {
document.getElementById("latesversionavailable").classList.add("newversion");
}
if ( isNewerVersion(_latestVersionAvailable, data['aqualinkd_version'] ) || _urlParams.get('upgrade') != null) {
enablebutton("upgrade");
} else {
disablebutton("upgrade");
delayedVersionCheck(data['aqualinkd_version']);
if (_urlParams.get('upgrade') != null) {
enablebutton("upgrade");
}
}
}

View File

@ -4,6 +4,8 @@
// For a complete list returned from your particular aqualinkd instance
// use the below URL and look at the ID value for each device.
// http://aqualink.ip.address/api/devices
var devices = [
"Filter_Pump",
"Spa",

View File

@ -1284,13 +1284,21 @@
return num.toString().padStart(2, "0");
}
function caseInsensitiveIndexOf(array, searchString) {
const lowerCaseArray = array.map(element => String(element).toLowerCase());
return lowerCaseArray.indexOf(searchString.toLowerCase());
}
function createTile(object) {
//console.log("Create tile "+object.id);
if (object.name == 'NONE') {
//console.log("Create tile <exclude name> "+object);
return;
}
if (typeof devices !== 'undefined' && devices.indexOf(object.id) < 0) {
//console.log("Create tile <exclude list> "+object.label);
//if (typeof devices !== 'undefined' && devices.indexOf(object.id) < 0) {
if (typeof devices !== 'undefined' && caseInsensitiveIndexOf(devices, object.id) < 0) {
console.log("Create tile <exclude list> "+object);
console.log(object);
return;
}
//if (object.type == 'switch' || object.type == 'switch_program') {
@ -2494,8 +2502,10 @@
var pa;
var pb;
try {
pa = devices.indexOf(a.id);
pb = devices.indexOf(b.id);
//pa = devices.indexOf(a.id);
//pb = devices.indexOf(b.id);
pa = caseInsensitiveIndexOf(devices,a.id);
pb = caseInsensitiveIndexOf(devices,b.id);
if (pa > pb)
return 1;
else if (pa < pb)