Version 2.6.6

pull/428/head V2.6.6
sfeakes 2025-05-23 18:11:24 -05:00
parent 94fc20191b
commit d7e45594b3
15 changed files with 146 additions and 25 deletions

View File

@ -126,16 +126,23 @@ NEED TO FIX FOR THIS RELEASE.
* Try an auto-update
* Update Mongoose
-->
# Updates in 2.6.5
# Updates in 2.6.6 (May 23 2025)
* Fixed some HTTP response codes.
* Added checks for protocols vs panel revision.
* Fixed auto_configure for panel REV I & K.
* Updates to install scripts.
* Update to WebUI dimmers.
# Updates in 2.6.5 (May 5 2025)
* Changes to virtual buttons.
# Updates in 2.6.4
# Updates in 2.6.4 (Apr 28 2025)
* Fix docker crash where journal not configured correctly.
* Updates to config editor.
* Increased number of virtual buttons. (previous limitation only effected RS 16 panels).
* Changed to dimmable lights.
# Updates in 2.6.3
# Updates in 2.6.3 (April 13 2025)
* AqualinkD can how self-update directly from github. use `Upgrade AqualinkD` button in Aqmanager
* New install and remote_install scripts.
* Changed MQTT posting frequency when Timers are enabled for better
@ -145,13 +152,13 @@ NEED TO FIX FOR THIS RELEASE.
* -or-
* `curl -fsSL https://raw.githubusercontent.com/aqualinkd/AqualinkD/master/release/remote_install.sh | sudo bash -s -- latest`
# Updates in 2.6.1
# Updates in 2.6.1 (Mar 26 2025)
* Added External Sensors to Web UI & HomeKit.
* Added Heat Pump / Chiller Thermostat to Web UI & HomeKit.
* Fixed some bugs in Configuration Editor.
* Link device/virtual/onetouch button with SWG BOOST. (Allows you to set VSP RPM when in Boost mode)
# Updates in 2.6.0
# Updates in 2.6.0 (Mar 22 2025)
* Added configuration editor in aqmanager. [Wiki - AQManager](https://github.com/aqualinkd/AqualinkD/wiki#AQManager)
* Can now self-configure on startup. set `device_id=0xFF`
* Added scheduling of pump after events (Power On, Freeze Protect, Boost)
@ -162,8 +169,10 @@ NEED TO FIX FOR THIS RELEASE.
* Reworked PDA sleep mode.
* Added support for Heat Pump / Chiller support.
# Updates in 2.5.1 (Dec 7 2024)
* Patch
# Updates in 2.5.0
# Updates in 2.5.0 (Nov 16 2024)
* PDA panel Rev 6.0 or newer that do not have a Jandy iAqualink device attached can use the AqualinkTouch protocol rather than PDA protocol.
* This is faster, more reliable and does not intefear with the physical PDA device (like existing implimentation)
* Please consider this very much BETA at the moment.
@ -183,7 +192,7 @@ NEED TO FIX FOR THIS RELEASE.
* Faster OneTouch device support.
# Updates in Release 2.4.0
# Updates in Release 2.4.0 (Sept 7 2024)
* <b>WARNING</b> Breaking change if you use dimmer (please change button_??_lightMode from 6 to 10)
* Fixed bugs with particular Jandy panel versions and color lights.
* Added support for more color lights, and sped up programming
@ -200,10 +209,10 @@ NEED TO FIX FOR THIS RELEASE.
* look at `virtual_button??_label` in aqualinkd.conf
* have to use AqualinkTouch protocol for `extended_device_id` 0x31->0x33 in aqualinkd.conf
# Updates in Release 2.3.8
# Updates in Release 2.3.8 (Sept 3 2024)
* Release removed. Bug with light program 0.
# Updates in Release 2.3.7
# Updates in Release 2.3.7 (Jun 11 2024)
* Fix for Pentair VSP losing connection & bouncing SWG to 0 and back.
* Added more VSP data (Mode, Status, Pressure Curve, both RPM & GPM) for all Pentair Pumps (VS/VF/VSF).
* Few updates to HomeAssistant integration.
@ -215,14 +224,14 @@ NEED TO FIX FOR THIS RELEASE.
* Fix freeze protect button in UI not showing enabled.
* Few updates to AQmanager UI.
# Update in Release 2.3.6
# Update in Release 2.3.6 (May 31 2024)
* No functionality changes
* Build & Docker changes
* Going forward AqualinkD will release binaries for both armhf & arm64
* armhf = any Pi (or equiv board) running 32 bit Debain based OS, stretch or newer
* arm64 = Pi3/4/2w running 64 bit Debain based OS, buster or newer
# Update in Release 2.3.5
# Update in Release 2.3.5 (May 23 2024)
* Added Home Assistant integration through MQTT discover
* Please read the Home Assistant section of the [Wiki - HASSIO](https://github.com/aqualinkd/AqualinkD/wiki#HASSIO)
* There are still some enhacments to come on this.
@ -232,7 +241,7 @@ NEED TO FIX FOR THIS RELEASE.
* Added Color Light to iAqualinkTouch protocol.
* Fixed issue mqtt_timed_update (1~2 min rather than between 2 & 20 min)
# Update in Release 2.3.4
# Update in Release 2.3.4 (May 13 2024)
* Changes for Docker
* Updated simulator code base and added new simulators for AllButton, OneTouch & PDA.
* <aqualinkd.ip>/allbutton_sim.html
@ -241,7 +250,7 @@ NEED TO FIX FOR THIS RELEASE.
* On PDA only panel AqualinkD has to share the same ID with the PDA simulator. Therefore for AqualinkD will not respond to commands while simulator is active.
* Now you can completely program the control panel with the simulators removing the need to have Jandy device.
# Update in Release 2.3.3
# Update in Release 2.3.3 (May 30 2024)
* Introduced Aqualink Manager UI http://aqualink.ip/aqmanager.html
* [AqualinkD Manager](https://github.com/aqualinkd/AqualinkD/wiki#AQManager)
* Moved logging into systemd/journal (journalctl) from syslog
@ -254,12 +263,12 @@ NEED TO FIX FOR THIS RELEASE.
* Add ```rs485_frame_delay = 4``` to /etc/aqualinkd.conf, 4 is number of milliseconds between frames, 0 will turn off ie no pause.
* PDA Changes to support SWG and Boot.
# Update in Release 2.3.2
# Update in Release 2.3.2 (Jul 8 2023)
* Added support for VSP on panel versions REV 0.1 & 0.2
* Can change heater sliver min/max values in web UI. `./web/config.js`
* Added reading ePump RPM/Watts directly from RS485 bus.
# Update in Release 2.3.1
# Update in Release 2.3.1 (Jun 23 2023)
* Changed a lot of logic around different protocols.
* Added low latency support for FTDI usb driver.
* AqualinkD will find out the fastest way to change something depending on the protocols available.

Binary file not shown.

Binary file not shown.

View File

@ -259,7 +259,7 @@ function cleanup {
#
# See if we are called from curl ot local dir.
# See if we are called from curl or local dir.
# with curl no tty input and script name wil be blank.
if ! tty > /dev/null 2>&1; then
script=$(basename "$0")

Binary file not shown.

Binary file not shown.

View File

@ -33,6 +33,11 @@ void programDeviceLightMode(struct aqualinkdata *aqdata, int value, int button);
void printPanelSupport(struct aqualinkdata *aqdata);
uint16_t setPanelSupport(struct aqualinkdata *aqdata);
void removePanelRSserialAdapterInterface();
void removePanelOneTouchInterface();
void removePanelIAQTouchInterface();
char *name2label(char *str)
{
int len = strlen(str);
@ -117,6 +122,40 @@ const char* find_rev_chars(const char *str, int length, int *out_len) {
return NULL; // Pattern not found
}
void checkPanelConfig(struct aqualinkdata *aqdata) {
// Check panel rev for common errors.
// Aqualink Touch.
if ( _aqconfig_.extended_device_id >= 0x30 && _aqconfig_.extended_device_id <= 0x33) {
if ( !isMASKSET(aqdata->panel_support_options, RSP_SUP_AQLT)) {
LOG(PANL_LOG, LOG_ERR, "Panel REV %s does not support AqualinkTouch protocol, please change configuration option '%s'\n",aqdata->panel_rev, CFG_N_extended_device_id);
LOG(PANL_LOG, LOG_WARNING, "Removing option '%s', please correct configuration\n",CFG_N_extended_device_id);
_aqconfig_.extended_device_id = 0x00;
removePanelIAQTouchInterface();
}
}
// One Touch
if ( _aqconfig_.extended_device_id >= 0x40 && _aqconfig_.extended_device_id <= 0x43) {
if ( !isMASKSET(aqdata->panel_support_options, RSP_SUP_ONET)) {
LOG(PANL_LOG, LOG_ERR, "Panel REV %s does not support OneTouch protocol, please change configuration option '%s'\n",aqdata->panel_rev, CFG_N_extended_device_id);
LOG(PANL_LOG, LOG_WARNING, "Removing option '%s', please correct configuration\n",CFG_N_extended_device_id);
_aqconfig_.extended_device_id = 0x00;
removePanelOneTouchInterface();
}
}
// Serial Adapter
if ( _aqconfig_.rssa_device_id >= 0x48 && _aqconfig_.rssa_device_id <= 0x49) {
if ( !isMASKSET(aqdata->panel_support_options, RSP_SUP_RSSA)) {
LOG(PANL_LOG, LOG_ERR, "Panel REV %s does not support RS SerialAdapter protocol, please change configuration option '%s'\n",aqdata->panel_rev, CFG_N_rssa_device_id);
LOG(PANL_LOG, LOG_WARNING, "Removing option '%s', please correct configuration\n",CFG_N_rssa_device_id);
_aqconfig_.rssa_device_id = 0x00;
removePanelRSserialAdapterInterface();
}
}
}
/*
pull board CPU, revision & panel string from strings like
@ -164,6 +203,12 @@ uint8_t setPanelInformationFromPanelMsg(struct aqualinkdata *aqdata, const char
LOG(PANL_LOG, LOG_NOTICE, "Panel REV %s from %s\n",aqdata->panel_rev,getJandyDeviceName(source));
setPanelSupport(aqdata);
//printPanelSupport(aqdata);
if (source == SIM_NONE) {
// We pass SIM_NONE when we are in auto_config mode, so reset the panel name so we get it again when we fully start
aqdata->panel_rev[0] = '\0';
} else {
checkPanelConfig(aqdata);
}
} else {
//printf("Failed to find REV, length\n");
}
@ -397,6 +442,16 @@ void addPanelIAQTouchInterface() {
_aqconfig_.paneltype_mask &= ~RSP_ONET;
}
void removePanelRSserialAdapterInterface() {
_aqconfig_.paneltype_mask &= ~RSP_RSSA;
}
void removePanelOneTouchInterface() {
_aqconfig_.paneltype_mask &= ~RSP_ONET;
}
void removePanelIAQTouchInterface() {
_aqconfig_.paneltype_mask &= ~RSP_IAQT;
}
int PANEL_SIZE() {
if ((_aqconfig_.paneltype_mask & RSP_4) == RSP_4)
return 4;

View File

@ -121,6 +121,9 @@ const char *getJandyDeviceName(emulation_type etype) {
case AQUAPDA:
return "PDA";
break;
case SIM_NONE:
return "AutoConfig";
break;
default:
return "Unknown";
break;

View File

@ -740,7 +740,7 @@ void caculate_ack_packet(int rs_fd, unsigned char *packet_buffer, emulation_type
#define MAX_AUTO_PACKETS 1200
bool auto_configure(unsigned char* packet) {
bool auto_configure(unsigned char* packet, int rs_fd) {
// Loop over PROBE packets and store any we can use,
// once we see the 2nd probe of any ID we fave stored, then the loop is complete,
// set ID's and exit true, exit falce to get called again.
@ -755,9 +755,14 @@ bool auto_configure(unsigned char* packet) {
static unsigned char firstprobe = 0x00;
static unsigned char lastID = 0x00;
static bool seen_iAqualink2 = false;
static bool ignore_AqualinkTouch = false;
static int foundIDs = 0;
static int packetsReceived=0;
static bool gotRev = false;
static unsigned char gettingRevID = 0xFF;
//static char message[AQ_MSGLONGLEN + 1];
if (++packetsReceived >= MAX_AUTO_PACKETS ) {
LOG(AQUA_LOG,LOG_ERR, "Received %d packets, and didn't get a full probe cycle, stoping Auto Configure!\n",packetsReceived);
return true;
@ -766,6 +771,35 @@ bool auto_configure(unsigned char* packet) {
if ( packet[PKT_CMD] == CMD_PROBE ) {
LOG(AQUA_LOG,LOG_INFO, "Got Probe on ID 0x%02hhx\n",packet[PKT_DEST]);
//printf(" *** Got Probe on ID 0x%02hhx\n",packet[PKT_DEST]);
if ( packet[PKT_DEST] >= 0x08 && packet[PKT_DEST] <= 0x0B && gotRev == false && gettingRevID == 0xFF) {
// Try replying to get panel rev
gettingRevID = packet[PKT_DEST];
caculate_ack_packet(rs_fd, packet, ALLBUTTON);
return false; // We don't want to store this ID since we use it for getting REV and is won't go back to probe when AqualinkD starts
}
} else if (packet[PKT_DEST] == gettingRevID) {
if ( packet[PKT_CMD] == CMD_MSG ) {
if ( rsm_strnstr((char *)&packet[5], " REV", AQ_MSGLEN) != NULL ) {
// We need to get the rev to cater for panel rev I & k (maybe others) that send AqualinkTouch probe messages
// then they don't support that protocol.
LOG(AQUA_LOG,LOG_DEBUG, "Got %15s from ID 0x%02hhx\n",(char *)&packet[5],packet[PKT_DEST]);
gotRev = true;
gettingRevID = 0xFF;
setPanelInformationFromPanelMsg(&_aqualink_data, (char *)&packet[5], PANEL_CPU | PANEL_REV, SIM_NONE);
if ( !isMASKSET(_aqualink_data.panel_support_options, RSP_SUP_AQLT)) {
LOG(AQUA_LOG,LOG_NOTICE, "Ignoring AqualinkTouch probes due to panel rev\n");
ignore_AqualinkTouch = true;
if ( _aqconfig_.extended_device_id >= 0x30 && _aqconfig_.extended_device_id <= 0x33 ) {
_aqconfig_.extended_device_id = 0x00;
_aqconfig_.enable_iaqualink = false;
_aqconfig_.read_RS485_devmask &= ~ READ_RS485_IAQUALNK;
//firstprobe = 0x00;
foundIDs--;
}
}
}
}
caculate_ack_packet(rs_fd, packet, ALLBUTTON);
}
if (lastID != 0x00 && packet[PKT_DEST] == DEV_MASTER ) { // Can't use got a reply to the late probe.
@ -803,7 +837,7 @@ bool auto_configure(unsigned char* packet) {
_aqconfig_.extended_device_id_programming = true;
// Don't increase foundIDs as we prefer not to use this one.
LOG(AQUA_LOG,LOG_NOTICE, "Found valid unused extended ID 0x%02hhx\n",lastID);
} else if ( (lastID >= 0x30 && lastID <= 0x33) &&
} else if ( (lastID >= 0x30 && lastID <= 0x33) && ignore_AqualinkTouch == false &&
(_aqconfig_.extended_device_id < 0x30 || _aqconfig_.extended_device_id > 0x33)) { //Overide is it's been set to Touch or not set.
_aqconfig_.extended_device_id = lastID;
_aqconfig_.extended_device_id_programming = true;
@ -816,6 +850,8 @@ bool auto_configure(unsigned char* packet) {
}
// Now reset ID
lastID = 0x00;
return false;
}
if ( foundIDs >= 3 || (packet[PKT_DEST] == firstprobe && packet[PKT_CMD] == CMD_PROBE) ) {
@ -1084,7 +1120,7 @@ void main_loop()
if (packet_length > 0 && auto_config_complete == false) {
blank_read = 0;
auto_config_complete = auto_configure(packet_buffer);
auto_config_complete = auto_configure(packet_buffer, rs_fd);
AddAQDstatusMask(AUTOCONFIGURE_ID);
_aqualink_data.updated = true;
if (auto_config_complete) {

View File

@ -1539,7 +1539,7 @@ void check_print_config (struct aqualinkdata *aqdata)
// Sanity checks
// If no panel has been set, use default one
if (_aqconfig_.paneltype_mask == 0) {
//printf("Set temp panel info Size=%d, RS=%d, combo=%d, dual=%d\n",_defaultPanel.size,_defaultPanel.rs,_defaultPanel.combo, _defaultPanel.dual);

View File

@ -227,7 +227,7 @@ int _numCfgParams;
#define CFG_N_serial_port "serial_port"
#define CFG_C_serial_port 11
#define CFG_N_log_level "log_level"
#define CFG_V_log_level "[\"DEBUG\", \"INFO\", \"NOTICE\", \"WARNING\", \"ERROR\"]"
#define CFG_V_log_level "[\"DEBUG_SERIAL\", \"DEBUG\", \"INFO\", \"NOTICE\", \"WARNING\", \"ERROR\"]"
#define CFG_C_log_level 9
#define CFG_N_socket_port "socket_port" // Change to Web_socket
#define CFG_C_socket_port 11

View File

@ -1344,6 +1344,8 @@ uriAtype action_URI(request_source from, const char *URI, int uri_length, float
*rtnmsg = NO_PLIGHT_DEVICE;
LOG(NET_LOG,LOG_WARNING, "%s: Didn't find device that matched URI '%.*s'\n",actionName[from], uri_length, URI);
rtn = uBad;
} else {
rtn = uActioned;
}
} else if ((ri3 != NULL && (strncasecmp(ri2, "brightness", 10) == 0) && (strncasecmp(ri3, "set", 3) == 0))) {
found = false;
@ -1360,6 +1362,8 @@ uriAtype action_URI(request_source from, const char *URI, int uri_length, float
*rtnmsg = NO_PLIGHT_DEVICE;
LOG(NET_LOG,LOG_WARNING, "%s: Didn't find device that matched URI '%.*s'\n",actionName[from], uri_length, URI);
rtn = uBad;
} else {
rtn = uActioned;
}
// Action a pump RPM/GPM message
} else if ((ri3 != NULL && ((strncasecmp(ri2, "RPM", 3) == 0) || (strncasecmp(ri2, "GPM", 3) == 0) || (strncasecmp(ri2, "Speed", 5) == 0) || (strncasecmp(ri2, "VSP", 3) == 0)) && (strncasecmp(ri3, "set", 3) == 0))) {

View File

@ -300,13 +300,13 @@ bool log_panelversion(struct aqualinkdata *aq_data)
if (strlen(aq_data->version) > 0) {
// If another protocol set the version, we need to check the rev.
if (!revTest){
LOG(ONET_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision);
//LOG(ONET_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision);
if ( strcmp(aq_data->revision, "O.1") == 0 || strcmp(aq_data->revision, "O.2") == 0 ) {
LOG(ONET_LOG,LOG_NOTICE, "Setting early version for OneTouch\n");
_panel_version_P2 = true;
revTest = true;
}
LOG(ONET_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision);
//LOG(ONET_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision);
}
return false;
}

View File

@ -4,4 +4,4 @@
#define AQUALINKD_SHORT_NAME "AqualinkD"
// Use Magor . Minor . Patch
#define AQUALINKD_VERSION "2.6.5"
#define AQUALINKD_VERSION "2.6.6"

View File

@ -1784,12 +1784,26 @@
setTileState(id, state);
}
} else if (type == 'light_dimmer') {
//console.log("DIMMER "+state+" - "+tile.getAttribute('status'));
var value = slider.value;
if (state == (tile.getAttribute('status') == 'off')) {
if (state == false) { //Turn off
//console.log("State off");
setTileState(id, state);
} else if (sp_value != slider.value && dimmer_slider_changed == true) {
//console.log("SLIDER CHANGED");
setThermostatSetpoint(id, slider.value);
} else {
//console.log("State on/off");
setTileState(id, state);
}
/*
if (state == (tile.getAttribute('status') == 'off')) {
console.log("ON/OFF "+state+" = "+(tile.getAttribute('status') == 'off'));
setTileState(id, state);
} else if (sp_value != slider.value && dimmer_slider_changed == true) {
console.log("SLIDER CHANGED");
setThermostatSetpoint(id, slider.value);
}*/
} else if (type == 'setpoint_swg') {
//console.log ("Boost attribute = "+tile.getAttribute('boost'));
//console.log ("state = "+state);