mirror of https://github.com/sfeakes/AqualinkD.git
2.6.8 (Dev)
parent
5b704cf3fb
commit
62943ab133
|
@ -126,6 +126,10 @@ NEED TO FIX FOR THIS RELEASE.
|
||||||
* Try an auto-update
|
* Try an auto-update
|
||||||
* Update Mongoose
|
* Update Mongoose
|
||||||
-->
|
-->
|
||||||
|
# Updates in 2.6.8 (Dev)
|
||||||
|
* Fixed some UI bugs
|
||||||
|
* Heatpump / chiller updates
|
||||||
|
|
||||||
# Updates in 2.6.7 (May 23 2025)
|
# Updates in 2.6.7 (May 23 2025)
|
||||||
* Fixed bug with iaqualink protocol when no virtual buttons configured.
|
* Fixed bug with iaqualink protocol when no virtual buttons configured.
|
||||||
* Updated RS timing debug messages.
|
* Updated RS timing debug messages.
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -42,7 +42,13 @@ typedef enum heatpumpstate{
|
||||||
HP_UNKNOWN
|
HP_UNKNOWN
|
||||||
} heatpumpstate;
|
} 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)
|
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|0x00 = Request off
|
||||||
0x0c|0x09 = Request Heat
|
0x0c|0x09 = Request Heat
|
||||||
0x0c|0x29 = Request Cool
|
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[3] == 0x0c ) {
|
||||||
if (packet_buffer[4] == 0x00) {
|
switch(packet_buffer[4]) {
|
||||||
// Heat Pump is off
|
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] );
|
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);
|
updateHeatPumpLed(HP_UNKNOWN, OFF, aqdata, HP_FROM_PANEL);
|
||||||
} else if (packet_buffer[4] == 0x09) {
|
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] );
|
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(HP_HEAT, ON, aqdata, HP_FROM_PANEL);
|
||||||
updateHeatPumpLed(false, ENABLE, aqdata, false);
|
break;
|
||||||
} else if (packet_buffer[4] == 0x29) {
|
case 0x01: // Enabled Pool
|
||||||
// Cool
|
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] );
|
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);
|
updateHeatPumpLed(HP_COOL, ENABLE, aqdata, HP_FROM_PANEL);
|
||||||
} else {
|
break;
|
||||||
// Heat Pump is on or enabled (not sure what state), but set to something other than off
|
default:
|
||||||
LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx request to (unknown status) 0x%02hhx\n",packet_buffer[PKT_DEST], packet_buffer[4]);
|
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)
|
//if (aqdata->chiller_button != NULL && aqdata->chiller_button->led->state == OFF)
|
||||||
updateHeatPumpLed(false, ENABLE, aqdata, false); // Guess at enabled. ()
|
// updateHeatPumpLed(HP_UNKNOWN, ENABLE, aqdata, HP_FROM_PANEL); // Guess at enabled. ()
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} 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]);
|
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[3] == 0x0d ) {
|
||||||
if (packet_buffer[4] == 0x40) {
|
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) {
|
} 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) {
|
} else if (packet_buffer[4] == 0x68) {
|
||||||
updateHeatPumpLed(HP_COOL, ON, aqdata, false);
|
updateHeatPumpLed(HP_COOL, ON, aqdata, HP_TO_PANEL);
|
||||||
} else {
|
} else {
|
||||||
//LOG(DJAN_LOG, LOG_INFO, "Heat Pump 0x%02hhx ");
|
//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]);
|
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;
|
hpstate = HP_COOL;
|
||||||
}
|
}
|
||||||
if (stristr(msg," ENA") != NULL) {
|
if (stristr(msg," ENA") != NULL) {
|
||||||
updateHeatPumpLed(hpstate, ENABLE, aqdata, true);
|
updateHeatPumpLed(hpstate, ENABLE, aqdata, HP_DISPLAY);
|
||||||
} else if (stristr(msg," OFF") != NULL) {
|
} else if (stristr(msg," OFF") != NULL) {
|
||||||
updateHeatPumpLed(hpstate, OFF, aqdata, true);
|
updateHeatPumpLed(hpstate, OFF, aqdata, HP_DISPLAY);
|
||||||
} else if (stristr(msg," ON") != NULL) {
|
} 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'",
|
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(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)
|
if (aqdata->chiller_button == NULL)
|
||||||
return;
|
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 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 froma displayed message, that's from ON to ENA, so set that one.
|
||||||
if ( !fromMessage && ledstate == ENABLE && aqdata->chiller_button->led->state == ON) {
|
if ( !fromMessage && ledstate == ENABLE && aqdata->chiller_button->led->state == ON) {
|
||||||
|
@ -1104,6 +1142,7 @@ void updateHeatPumpLed(heatpumpstate state, aqledstate ledstate, struct aqualink
|
||||||
} else {
|
} else {
|
||||||
//printf("**** Heat Pump %s, already %s, ignore!\n",LED2text(ledstate),LED2text(aqdata->chiller_button->led->state));
|
//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 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
|
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|0x01 = Enabled
|
||||||
0x0c|0x29 = Chiller on
|
0x0c|0x29 = Chiller on
|
||||||
|
|
|
@ -4,4 +4,4 @@
|
||||||
#define AQUALINKD_SHORT_NAME "AqualinkD"
|
#define AQUALINKD_SHORT_NAME "AqualinkD"
|
||||||
|
|
||||||
// Use Magor . Minor . Patch
|
// Use Magor . Minor . Patch
|
||||||
#define AQUALINKD_VERSION "2.6.7"
|
#define AQUALINKD_VERSION "2.6.8 (dev)"
|
||||||
|
|
|
@ -1438,6 +1438,26 @@
|
||||||
} catch (Error) { }
|
} 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) {
|
function setAqManagerOptions(data) {
|
||||||
/*
|
/*
|
||||||
read deamonized logging2file logfilename debugmasks[] loglevels[]
|
read deamonized logging2file logfilename debugmasks[] loglevels[]
|
||||||
|
@ -1462,10 +1482,11 @@
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("latesversionavailable").classList.add("newversion");
|
document.getElementById("latesversionavailable").classList.add("newversion");
|
||||||
}
|
}
|
||||||
if ( isNewerVersion(_latestVersionAvailable, data['aqualinkd_version'] ) || _urlParams.get('upgrade') != null) {
|
|
||||||
|
delayedVersionCheck(data['aqualinkd_version']);
|
||||||
|
|
||||||
|
if (_urlParams.get('upgrade') != null) {
|
||||||
enablebutton("upgrade");
|
enablebutton("upgrade");
|
||||||
} else {
|
|
||||||
disablebutton("upgrade");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
// For a complete list returned from your particular aqualinkd instance
|
// For a complete list returned from your particular aqualinkd instance
|
||||||
// use the below URL and look at the ID value for each device.
|
// use the below URL and look at the ID value for each device.
|
||||||
// http://aqualink.ip.address/api/devices
|
// http://aqualink.ip.address/api/devices
|
||||||
|
|
||||||
|
|
||||||
var devices = [
|
var devices = [
|
||||||
"Filter_Pump",
|
"Filter_Pump",
|
||||||
"Spa",
|
"Spa",
|
||||||
|
|
|
@ -1284,13 +1284,21 @@
|
||||||
return num.toString().padStart(2, "0");
|
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) {
|
function createTile(object) {
|
||||||
//console.log("Create tile "+object.id);
|
//console.log("Create tile "+object.id);
|
||||||
if (object.name == 'NONE') {
|
if (object.name == 'NONE') {
|
||||||
|
//console.log("Create tile <exclude name> "+object);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (typeof devices !== 'undefined' && devices.indexOf(object.id) < 0) {
|
//if (typeof devices !== 'undefined' && devices.indexOf(object.id) < 0) {
|
||||||
//console.log("Create tile <exclude list> "+object.label);
|
if (typeof devices !== 'undefined' && caseInsensitiveIndexOf(devices, object.id) < 0) {
|
||||||
|
console.log("Create tile <exclude list> "+object);
|
||||||
|
console.log(object);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//if (object.type == 'switch' || object.type == 'switch_program') {
|
//if (object.type == 'switch' || object.type == 'switch_program') {
|
||||||
|
@ -2494,8 +2502,10 @@
|
||||||
var pa;
|
var pa;
|
||||||
var pb;
|
var pb;
|
||||||
try {
|
try {
|
||||||
pa = devices.indexOf(a.id);
|
//pa = devices.indexOf(a.id);
|
||||||
pb = devices.indexOf(b.id);
|
//pb = devices.indexOf(b.id);
|
||||||
|
pa = caseInsensitiveIndexOf(devices,a.id);
|
||||||
|
pb = caseInsensitiveIndexOf(devices,b.id);
|
||||||
if (pa > pb)
|
if (pa > pb)
|
||||||
return 1;
|
return 1;
|
||||||
else if (pa < pb)
|
else if (pa < pb)
|
||||||
|
|
Loading…
Reference in New Issue