From dbbd0dda0cbface8096fd8350b694117209a3466 Mon Sep 17 00:00:00 2001 From: sfeakes Date: Wed, 22 May 2024 18:57:33 -0500 Subject: [PATCH] Update v3.2.5 --- Makefile | 3 +- README.md | 40 ++- aq_mqtt.h | 12 +- aq_panel.c | 15 +- aq_programmer.c | 69 ++++- aq_programmer.h | 2 + aq_serial.c | 19 ++ aq_serial.h | 40 ++- aqualink.h | 3 + aqualinkd.c | 44 +++- color_lights.c | 16 +- color_lights.h | 4 +- config.c | 32 ++- config.h | 13 +- devices_jandy.c | 391 +++++++++++++++++++++++++--- devices_jandy.h | 12 +- devices_pentair.c | 9 + extras/HASSIO.png | Bin 0 -> 146657 bytes extras/aqua.sh | 21 -- extras/aqualinkd-docker.cmd | 47 ++++ hassio.c | 444 ++++++++++++++++++++++++++++++++ hassio.h | 8 + iaqtouch.c | 430 +++++++++++++++++++++++++------ iaqtouch.h | 3 +- iaqtouch_aq_programmer.c | 321 ++++++++++++++++++++++- iaqtouch_aq_programmer.h | 2 + json_messages.c | 7 +- net_services.c | 57 +++- net_services.h | 5 + onetouch.c | 2 +- pda.c | 1 + release/aqualinkd | Bin 445508 -> 480132 bytes release/aqualinkd.conf | 12 +- release/aqualinkd.test.pda.conf | 19 +- release/serial_logger | Bin 49980 -> 50356 bytes rs_msg_utils.c | 162 +++++++++++- rs_msg_utils.h | 11 +- serial_logger.c | 4 +- utils.h | 10 + version.h | 3 +- web/config.js | 6 +- web/controller.html | 32 ++- web/hk/Aux_1-off.png | 2 +- web/hk/Aux_1-on.png | 2 +- web/hk/Aux_12-on.png | 2 +- web/hk/Aux_2-off.png | 2 +- web/hk/Aux_2-on.png | 2 +- web/hk/Aux_3-off.png | 2 +- web/hk/Aux_3-on.png | 2 +- web/hk/Aux_4-off.png | 2 +- web/hk/Aux_4-on.png | 2 +- web/hk/Aux_5-off.png | 2 +- web/hk/Aux_5-on.png | 2 +- web/hk/Aux_6-off.png | 2 +- web/hk/Aux_6-on.png | 2 +- web/hk/Aux_7-off.png | 2 +- web/hk/Aux_7-on.png | 2 +- web/hk/Aux_8-off.png | 2 +- web/hk/Aux_8-on.png | 2 +- web/hk/Aux_B1-off.png | 2 +- web/hk/Aux_B1-on.png | 2 +- web/hk/Aux_B2-off.png | 2 +- web/hk/Aux_B2-on.png | 2 +- web/hk/Aux_B3-off.png | 2 +- web/hk/Aux_B3-on.png | 2 +- web/hk/Aux_B4-off.png | 2 +- web/hk/Aux_B4-on.png | 2 +- web/hk/Aux_B5-off.png | 2 +- web/hk/Aux_B5-on.png | 2 +- web/hk/Aux_B6-off.png | 2 +- web/hk/Aux_B6-on.png | 2 +- web/hk/Aux_B7-off.png | 2 +- web/hk/Aux_B7-on.png | 2 +- web/hk/Aux_B8-off.png | 2 +- web/hk/Aux_B8-on.png | 2 +- web/hk/Filter_Pump-off.png | 2 +- web/hk/Filter_Pump-on.png | 2 +- web/hk/Pool_Heater-off.png | 2 +- web/hk/Pool_Heater-on.png | 2 +- web/hk/SWG_Boost-off.png | 2 +- web/hk/SWG_Boost-on.png | 2 +- web/hk/Solar_Heater-off.png | 2 +- web/hk/Solar_Heater-on.png | 2 +- web/hk/Spa_Heater-off.png | 2 +- web/hk/Spa_Heater-on.png | 2 +- web/hk/Spa_Mode-off.png | 2 +- web/hk/Spa_Mode-on.png | 2 +- web/onetouch_sim.html | 3 +- 88 files changed, 2156 insertions(+), 268 deletions(-) create mode 100644 extras/HASSIO.png create mode 100755 extras/aqualinkd-docker.cmd create mode 100644 hassio.c create mode 100644 hassio.h diff --git a/Makefile b/Makefile index b6b5a14..72f6808 100755 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ AQ_PDA = true AQ_ONETOUCH = true AQ_IAQTOUCH = true AQ_MANAGER =true + #AQ_RS_EXTRA_OPTS = false #AQ_CONTAINER = false // this is for compiling for containers #AQ_MEMCMP = true // Not implimented correctly yet. @@ -76,7 +77,7 @@ endif # Main source files SRCS = aqualinkd.c utils.c config.c aq_serial.c aq_panel.c aq_programmer.c net_services.c json_messages.c rs_msg_utils.c\ devices_jandy.c packetLogger.c devices_pentair.c color_lights.c serialadapter.c aq_timer.c aq_scheduler.c web_config.c\ - serial_logger.c mongoose.c simulator.c timespec_subtract.c + serial_logger.c mongoose.c hassio.c simulator.c timespec_subtract.c AQ_FLAGS = diff --git a/README.md b/README.md index d982578..f79a95c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Designed to mimic AqualinkRS devices, used to fully configure the master control * Full support for homekit scenes: ie: Create a "Spa scene" to: "turn spa on, set spa heater to X temperature and turn spa blower on", etc etc). ### In Home Assistant - + ## All Web interfaces. * http://aqualink.ip/ <- (Standard WEB UI @@ -83,7 +83,39 @@ Designed to mimic AqualinkRS devices, used to fully configure the master control * Add set time to OneTouch protocol. * Update AqualinkD Management console to manage configuration * Create iAqualink Touch Simulator +* Probably decoded enough protocols for AuqlinkD to self configure. + + +# Call for Help. +* The only Jandy devices I have not decoded yet are LX heater & Chemical Feeder. If you have either of these devices and are willing to post some logs, please let me know, or post in the [Discussions area](https://github.com/sfeakes/AqualinkD/discussions) + +# Update in Release 2.3.5 +* Added Home Assistant integration through MQTT discover + * Please read the Wiki section on this [Wiki - HASSIO](https://github.com/sfeakes/AqualinkD/wiki#HASSIO) + * There are still some enhacments to come on this. +* Added support for reading extended information for Jandy JXi heaters. +* 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 * Changes for Docker * Updated simulator code base and added new simulators for AllButton, OneTouch & PDA. @@ -95,11 +127,11 @@ Designed to mimic AqualinkRS devices, used to fully configure the master control # Update in Release 2.3.3 * Introduced Aqualink Manager UI http://aqualink.ip/aqmanager.html - * [AqualinkD Manager](#AQManager) + * [AqualinkD Manager](https://github.com/sfeakes/AqualinkD/wiki#AQManager) * Moved logging into systemd/journal (journalctl) from syslog - * [AqualinkD Log](#Log) + * [AqualinkD Log](https://github.com/sfeakes/AqualinkD/wiki#Log) * Updated to scheduler - * [AqualinkD Scheduler](#Scheduler) + * [AqualinkD Scheduler](https://github.com/sfeakes/AqualinkD/wiki#Scheduler) * Introduced RS485 frame delay / timer. * Improve PDA panels reliability (PDA pannels are slower than RS panels) * Potentially fixed Pentair VSP / SWG problems since Pentair VSP use a different protocol, this will allow a timed delay for the VSP to post a status messages. Seems to only effect RS485 bus when both a Pentair VSP and Jandy SWG are present. diff --git a/aq_mqtt.h b/aq_mqtt.h index e701d9d..4ea8a15 100644 --- a/aq_mqtt.h +++ b/aq_mqtt.h @@ -23,6 +23,9 @@ #define SWG_SETPOINT_TOPIC SWG_TOPIC "/setpoint" #define SWG_EXTENDED_TOPIC SWG_TOPIC "/fullstatus" #define SWG_BOOST_TOPIC SWG_TOPIC "/Boost" +#define SWG_BOOST_DURATION_TOPIC SWG_BOOST_TOPIC "/duration" + +#define SWG_STATUS_MSG_TOPIC SWG_TOPIC "/Display_Message" #define CHEM_TOPIC "CHEM" #define CHEM_PH_TOPIC CHEM_TOPIC "/pH" @@ -30,13 +33,18 @@ #define CHEM_ORP_TOPIC CHEM_TOPIC "/ORP" #define CHRM_ORP_F_TOPIC CHEM_TOPIC "/ORP_f" +#define LXI_TOPIC "LXi" +#define LXI_STATUS LXI_TOPIC "/Status" +#define LXI_ERROR_CODE LXI_TOPIC "/Error" +#define LXI_ERROR_MESSAGE LXI_TOPIC "/Error_Message" + #define FREEZE_PROTECT "Freeze_Protect" #define FREEZE_PROTECT_ENABELED FREEZE_PROTECT ENABELED_SUBT #define BATTERY_STATE "Battery" -#define POOL_THERMO_TEMP_TOPIC BTN_POOL_HTR "/Temperature" -#define SPA_THERMO_TEMP_TOPIC BTN_SPA_HTR "/Temperature" +//#define POOL_THERMO_TEMP_TOPIC BTN_POOL_HTR "/Temperature" +//#define SPA_THERMO_TEMP_TOPIC BTN_SPA_HTR "/Temperature" //#define PUMP_TOPIC "Pump_" #define PUMP_RPM_TOPIC "/RPM" diff --git a/aq_panel.c b/aq_panel.c index 520dad3..633911f 100644 --- a/aq_panel.c +++ b/aq_panel.c @@ -525,9 +525,14 @@ bool setDeviceState(struct aqualinkdata *aqdata, int deviceIndex, bool isON) LOG(AQUA_LOG, LOG_INFO, "received '%s' for '%s', turning '%s'\n", (isON == false ? "OFF" : "ON"), button->name, (isON == false ? "OFF" : "ON")); #ifdef AQ_PDA if (isPDA_PANEL) { - char msg[PTHREAD_ARG]; - sprintf(msg, "%-5d%-5d", deviceIndex, (isON == false ? OFF : ON)); - aq_programmer(AQ_PDA_DEVICE_ON_OFF, msg, aqdata); + if (button->special_mask & PROGRAM_LIGHT && isPDA_IAQT) { + // AqualinkTouch in PDA mode, we can program light. (if turing off, use standard AQ_PDA_DEVICE_ON_OFF below) + programDeviceLightMode(aqdata, (isON?0:-1), deviceIndex); // -1 means off 0 means use current light mode + } else { + char msg[PTHREAD_ARG]; + sprintf(msg, "%-5d%-5d", deviceIndex, (isON == false ? OFF : ON)); + aq_programmer(AQ_PDA_DEVICE_ON_OFF, msg, aqdata); + } } else #endif { @@ -598,7 +603,7 @@ void programDeviceLightMode(struct aqualinkdata *aqdata, int value, int button) int i; clight_detail *light = NULL; #ifdef AQ_PDA - if (isPDA_PANEL) { + if (isPDA_PANEL && !isPDA_IAQT) { LOG(AQUA_LOG,LOG_ERR, "Light mode control not supported in PDA mode\n"); return; } @@ -642,7 +647,7 @@ void programDeviceLightMode(struct aqualinkdata *aqdata, int value, int button) //bool panel_device_request(struct aqualinkdata *aqdata, action_type type, int deviceIndex, int value, int subIndex, bool fromMQTT) bool panel_device_request(struct aqualinkdata *aqdata, action_type type, int deviceIndex, int value, request_source source) { - //LOG(AQUA_LOG,LOG_NOTICE, "Device request type %d for deviceindex %d of value %d from %d\n",type,deviceIndex, value, source); + LOG(AQUA_LOG,LOG_INFO, "Device request type %d for deviceindex %d of value %d from %d\n",type,deviceIndex, value, source); switch (type) { case ON_OFF: //setDeviceState(&aqdata->aqbuttons[deviceIndex], value<=0?false:true, deviceIndex ); diff --git a/aq_programmer.c b/aq_programmer.c index d9c78b4..63cc128 100644 --- a/aq_programmer.c +++ b/aq_programmer.c @@ -397,8 +397,15 @@ void queueGetProgramData(emulation_type source_type, struct aqualinkdata *aq_dat } } #ifdef AQ_PDA - } else if ( source_type == AQUAPDA) { + } else if ( isPDA_PANEL && source_type == AQUAPDA) { aq_programmer(AQ_PDA_INIT, NULL, aq_data); + } else if ( isPDA_PANEL && source_type == IAQTOUCH) { + //aq_programmer(AQ_PDA_INIT, NULL, aq_data); + if (_aqconfig_.use_panel_aux_labels) { + aq_programmer(AQ_GET_AUX_LABELS, NULL, aq_data); + } + aq_programmer(AQ_GET_IAQTOUCH_SETPOINTS, NULL, aq_data); + #endif } else { // Must be all button only aq_programmer(AQ_GET_POOL_SPA_HEATER_TEMPS, NULL, aq_data); @@ -468,7 +475,8 @@ bool in_light_programming_mode(struct aqualinkdata *aq_data) { if ( ( aq_data->active_thread.thread_id != 0 ) && ( aq_data->active_thread.ptype == AQ_SET_LIGHTPROGRAM_MODE || - aq_data->active_thread.ptype == AQ_SET_LIGHTCOLOR_MODE) + aq_data->active_thread.ptype == AQ_SET_LIGHTCOLOR_MODE || + aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE) ) { return true; } @@ -527,7 +535,9 @@ bool in_iaqt_programming_mode(struct aqualinkdata *aq_data) aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_POOL_HEATER_TEMP || aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_SPA_HEATER_TEMP || aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_SET_TIME || - aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM) + aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_PUMP_VS_PROGRAM || + aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_DEVICE_ON_OFF || + aq_data->active_thread.ptype == AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE) ) { return true; } @@ -580,14 +590,14 @@ void kick_aq_program_thread(struct aqualinkdata *aq_data, emulation_type source_ LOG(ONET_LOG, LOG_DEBUG, "Kicking OneTouch thread %d,%p\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id); pthread_cond_broadcast(&aq_data->active_thread.thread_cond); } - else if (source_type == ALLBUTTON && !in_ot_programming_mode(aq_data)) { - LOG(PROG_LOG, LOG_DEBUG, "Kicking RS thread %d,%p message '%s'\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id,aq_data->last_message); - pthread_cond_broadcast(&aq_data->active_thread.thread_cond); - } else if (source_type == IAQTOUCH && in_iaqt_programming_mode(aq_data)) { LOG(IAQT_LOG, LOG_DEBUG, "Kicking IAQ Touch thread %d,%p\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id); pthread_cond_broadcast(&aq_data->active_thread.thread_cond); } + else if (source_type == ALLBUTTON && !in_ot_programming_mode(aq_data) && !in_iaqt_programming_mode(aq_data)) { + LOG(PROG_LOG, LOG_DEBUG, "Kicking RS Allbutton thread %d,%p message '%s'\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id,aq_data->last_message); + pthread_cond_broadcast(&aq_data->active_thread.thread_cond); + } #ifdef AQ_PDA else if (source_type == AQUAPDA && !in_ot_programming_mode(aq_data)) { LOG(PDA_LOG, LOG_DEBUG, "Kicking PDA thread %d,%p\n",aq_data->active_thread.ptype, aq_data->active_thread.thread_id); @@ -671,7 +681,7 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat else if (r_type == AQ_SET_SPA_HEATER_TEMP) type = AQ_SET_RSSADAPTER_SPA_HEATER_TEMP; } else if (r_type == AQ_SET_PUMP_RPM) { - if (isONET_ENABLED) + if (isONET_ENABLED || isPDA_IAQT) type = AQ_SET_ONETOUCH_PUMP_RPM; else if (isIAQT_ENABLED) type = AQ_SET_IAQTOUCH_PUMP_RPM; @@ -719,7 +729,7 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat } #endif #ifdef AQ_IAQTOUCH - else if (isIAQT_ENABLED && isEXTP_ENABLED) { + else if ((isIAQT_ENABLED && isEXTP_ENABLED) || isPDA_IAQT) { // IAQ Touch programming modes that should overite standard ones. switch (r_type){ case AQ_GET_POOL_SPA_HEATER_TEMPS: @@ -741,15 +751,30 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat case AQ_SET_TIME: type = AQ_SET_IAQTOUCH_SET_TIME; break; + case AQ_PDA_DEVICE_ON_OFF: + if (isPDA_IAQT) { + type = AQ_SET_IAQTOUCH_DEVICE_ON_OFF; + } + break; + // This isn;t going to work outside of PDA mode, if the labels are incorrect. + case AQ_SET_LIGHTCOLOR_MODE: + if (isPDA_IAQT) { + type = AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE; + } + break; default: type = r_type; break; } } #endif + + + #ifdef AQ_PDA // Check we are doing something valid request - if (isPDA_PANEL) { + if (isPDA_PANEL && !isPDA_IAQT) + { pda_reset_sleep(); if (type != AQ_PDA_INIT && type != AQ_PDA_WAKE_INIT && @@ -1028,6 +1053,12 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat return; } break; + case AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE: + if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_light_colormode, (void*)programmingthread) < 0) { + LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); + return; + } + break; #endif #ifdef AQ_PDA case AQ_PDA_INIT: @@ -1054,6 +1085,12 @@ void _aq_programmer(program_type r_type, char *args, struct aqualinkdata *aq_dat return; } break; + case AQ_SET_IAQTOUCH_DEVICE_ON_OFF: + if( pthread_create( &programmingthread->thread_id , NULL , set_aqualink_iaqtouch_device_on_off, (void*)programmingthread) < 0) { + LOG(PROG_LOG, LOG_ERR, "could not create thread\n"); + return; + } + break; #endif default: @@ -1522,7 +1559,7 @@ void *set_aqualink_light_colormode( void *ptr ) use_current_mode = true; LOG(PROG_LOG, LOG_INFO, "Light Programming #: %d, on button: %s, color light type: %d, using current mode\n", val, button->label, typ); } else { - mode_name = light_mode_name(typ, val-1); + mode_name = light_mode_name(typ, val-1, ALLBUTTON); use_current_mode = false; if (mode_name == NULL) { LOG(PROG_LOG, LOG_ERR, "Light Programming #: %d, on button: %s, color light type: %d, couldn't find mode name '%s'\n", val, button->label, typ, mode_name); @@ -2615,6 +2652,12 @@ const char *ptypeName(program_type type) case AQ_SET_IAQTOUCH_SET_TIME: return "Set iAqualink Set Time"; break; + case AQ_SET_IAQTOUCH_DEVICE_ON_OFF: + return "Set iAqualink Device On/Off"; + break; + case AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE: + return "Set iAqualink Light Color (using panel)"; + break; #endif #ifdef AQ_PDA case AQ_PDA_INIT: @@ -2680,6 +2723,7 @@ const char *programtypeDisplayName(program_type type) break; case AQ_SET_LIGHTPROGRAM_MODE: case AQ_SET_LIGHTCOLOR_MODE: + case AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE: return "Programming: setting light color"; break; case AQ_SET_SWG_PERCENT: @@ -2709,6 +2753,9 @@ const char *programtypeDisplayName(program_type type) case AQ_GET_IAQTOUCH_VSP_ASSIGNMENT: return "Get Pump Assignment"; break; + case AQ_SET_IAQTOUCH_DEVICE_ON_OFF: + return "Programming: setting device on/off"; + break; #ifdef AQ_PDA case AQ_PDA_DEVICE_STATUS: return "Programming: retrieving PDA Device status"; diff --git a/aq_programmer.h b/aq_programmer.h index b3e8a00..65ebb54 100644 --- a/aq_programmer.h +++ b/aq_programmer.h @@ -83,6 +83,8 @@ typedef enum { AQ_SET_IAQTOUCH_POOL_HEATER_TEMP, AQ_SET_IAQTOUCH_SPA_HEATER_TEMP, AQ_SET_IAQTOUCH_SET_TIME, + AQ_SET_IAQTOUCH_DEVICE_ON_OFF, + AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE, AQ_GET_RSSADAPTER_SETPOINTS, AQ_SET_RSSADAPTER_POOL_HEATER_TEMP, AQ_SET_RSSADAPTER_SPA_HEATER_TEMP, diff --git a/aq_serial.c b/aq_serial.c index 652a6e0..503757b 100644 --- a/aq_serial.c +++ b/aq_serial.c @@ -140,6 +140,12 @@ const char* get_packet_type(unsigned char* packet , int length) case CMD_IAQ_STARTUP: return "iAq init"; break; + case CMD_IAQ_TITLE_MESSAGE: + return "iAq ProductName"; + break; + case CMD_IAQ_MSG_LONG: + return "iAq Popup message"; + break; case RSSA_DEV_STATUS: // This is a fail reply 0x10|0x02|0x48|0x13|0x02|0x00|0x10|0x00|0x7f|0x10|0x03| // Rather than check all, just check 0x02 and checksum sin't I'm not sure 0x10 means faiure without 0x00 around it. @@ -165,6 +171,19 @@ const char* get_packet_type(unsigned char* packet , int length) case CMD_EPUMP_WATTS: return "ePump get Watts"; break; + case CMD_JXI_PING: + if (packet[4] == 0x19) + return "LXi heater on"; + else // 0x11 is normal off + return "LXi heater ping"; + break; + case CMD_JXI_STATUS: + if (packet[6] == 0x10) + return "LXi error"; + else + return "LXi status"; + break; + default: sprintf(buf, "Unknown '0x%02hhx'", packet[PKT_CMD]); return buf; diff --git a/aq_serial.h b/aq_serial.h index 2b9d5c7..8b639d4 100644 --- a/aq_serial.h +++ b/aq_serial.h @@ -38,12 +38,16 @@ */ #define PENTAIR_DEC_PUMP_MIN 96 // 0x60 #define PENTAIR_DEC_PUMP_MAX 111 // 0x6F -#define JANDY_DEC_PUMP_MIN 120 // 0x80 -#define JANDY_DEC_PUMP_MAX 123 // 0x83 -#define JANDY_DEC_LX_MIN 56 // 0x40 -#define JANDY_DEC_LX_MAX 59 // 0x43 -#define JANDY_DEC_LXI_MIN 104 // 0x60 -#define JANDY_DEC_LXI_MAX 107 // 0x6B +#define JANDY_DEC_SWG_MIN 80 // 0x50 +#define JANDY_DEC_SWG_MAX 83 // 0x53 +#define JANDY_DEC_PUMP_MIN 120 // 0x78 +#define JANDY_DEC_PUMP_MAX 123 // 0x7b +#define JANDY_DEC_JXI_MIN 104 // 0x68 +#define JANDY_DEC_JXI_MAX 107 // 0x6B +#define JANDY_DEC_LX_MIN 56 // 0x38 +#define JANDY_DEC_LX_MAX 59 // 0x3B +#define JANDY_DEC_CHEM_MIN 128 // 0x80 +#define JANDY_DEC_CHEM_MAX 131 // 0x83 // PACKET DEFINES Jandy @@ -125,6 +129,10 @@ #define CMD_PERCENT 0x11 // Set Percent #define CMD_PPM 0x16 // Received PPM +/* LXi Heater commands */ +#define CMD_JXI_PING 0x0c +#define CMD_JXI_STATUS 0x0d + /* PDA KEY CODES */ // Just plating at the moment #define KEY_PDA_UP 0x06 #define KEY_PDA_DOWN 0x05 @@ -294,8 +302,9 @@ SPILLOVER IS DISABLED WHILE SPA IS ON //#define SWG_STATUS_OFFLINE 0xFE //#define SWG_STATUS_UNKNOWN -128 // Idiot. unsigned char....Derr. -#define SWG_STATUS_OFF 0xFF // Documented this as off in API, so don't change. -#define SWG_STATUS_UNKNOWN 0xFE +#define SWG_STATUS_OFF 0xFF // Documented this as off in API, so don't change. +#define SWG_STATUS_UNKNOWN 0xFE +#define SWG_STATUS_GENFAULT 0xFD //This is displayed in the panel, so adding it // These are actual from RS485 #define SWG_STATUS_ON 0x00 @@ -337,7 +346,7 @@ SPILLOVER IS DISABLED WHILE SPA IS ON #define CMD_IAQ_POLL 0x30 // Poll message or ready to receive command #define CMD_IAQ_CTRL_READY 0x31 // Get this when we can send big control command #define CMD_IAQ_PAGE_CONTINUE 0x40 // Seems we get this on AUX device page when there is another page, keeps circuling through pages. - +#define CMD_IAQ_TITLE_MESSAGE 0x2d // This is what the product name is set to (Jandy RS) usually //#define CMD_IAQ_VSP_ERROR 0x2c // Error when setting speed too high #define CMD_IAQ_MSG_LONG 0x2c // This this is display popup message. Next 2 bytes 0x00|0x01 = wait and then 0x00|0x00 clear /* @@ -355,6 +364,10 @@ SPILLOVER IS DISABLED WHILE SPA IS ON #define KEY_IAQTCH_STATUS 0x06 #define KEY_IAQTCH_PREV_PAGE 0x20 #define KEY_IAQTCH_NEXT_PAGE 0x21 +#define KEY_IAQTCH_OK 0x01 //HEX: 0x10|0x02|0x00|0x01|0x00|0x01|0x14|0x10|0x03|. OK BUTTON + +#define KEY_IAQTCH_PREV_PAGE_ALTERNATE 0x1d // System setup prev +#define KEY_IAQTCH_NEXT_PAGE_ALTERNATE 0x1e // System setup next // PAGE1 (Horosontal keys) (These are duplicate so probable delete) #define KEY_IAQTCH_HOMEP_KEY01 0x11 @@ -390,6 +403,7 @@ SPILLOVER IS DISABLED WHILE SPA IS ON #define IAQ_PAGE_STATUS2 0x2a // Something get this for Status rather than 0x5b #define IAQ_PAGE_DEVICES 0x36 #define IAQ_PAGE_DEVICES2 0x35 +#define IAQ_PAGE_DEVICES3 0x51 #define IAQ_PAGE_SET_TEMP 0x39 #define IAQ_PAGE_MENU 0x0f #define IAQ_PAGE_SET_VSP 0x1e @@ -401,10 +415,14 @@ SPILLOVER IS DISABLED WHILE SPA IS ON #define IAQ_PAGE_ONETOUCH 0x4d #define IAQ_PAGE_COLOR_LIGHT 0x48 #define IAQ_PAGE_SYSTEM_SETUP 0x14 +#define IAQ_PAGE_SYSTEM_SETUP2 0x49 +#define IAQ_PAGE_SYSTEM_SETUP3 0x4a #define IAQ_PAGE_VSP_SETUP 0x2d #define IAQ_PAGE_FREEZE_PROTECT 0x11 #define IAQ_PAGE_LABEL_AUX 0x32 +#define IAQ_PAGE_HELP 0x0c //#define IAQ_PAGE_START_BOOST 0x3f +//#define IAQ_PAGE_DEGREES 0xFF // Added this as never want to actually select the page, just go to it. @@ -426,7 +444,9 @@ typedef enum { DRS_NONE, DRS_SWG, DRS_EPUMP, - DRS_LXI + DRS_JXI, + DRS_LX, + DRS_CHEM } rsDeviceType; typedef enum { diff --git a/aqualink.h b/aqualink.h index d3dd383..b0508f7 100644 --- a/aqualink.h +++ b/aqualink.h @@ -205,6 +205,7 @@ struct aqualinkdata char time[AQ_MSGLEN]; char last_message[AQ_MSGLONGLEN+1]; // Last ascii message from panel - allbutton (or PDA) protocol char last_display_message[AQ_MSGLONGLEN+1]; // Last message to display in web UI + bool is_display_message_programming; aqled aqualinkleds[TOTAL_LEDS]; aqkey aqbuttons[TOTAL_BUTTONS]; unsigned short total_buttons; @@ -220,6 +221,7 @@ struct aqualinkdata int swg_percent; int swg_ppm; unsigned char ar_swg_device_status; // Actual state + unsigned char heater_err_status; aqledstate swg_led_state; // Display state for UI's aqledstate service_mode_state; aqledstate frz_protect_state; @@ -229,6 +231,7 @@ struct aqualinkdata clight_detail lights[MAX_LIGHTS]; bool boost; char boost_msg[10]; + int boost_duration; // need to remove boost message and use this float ph; int orp; diff --git a/aqualinkd.c b/aqualinkd.c index 65665e1..0d57192 100644 --- a/aqualinkd.c +++ b/aqualinkd.c @@ -180,6 +180,12 @@ bool checkAqualinkTime() LOG(AQUA_LOG,LOG_DEBUG, "time not checked, will check in %d seconds\n", TIME_CHECK_INTERVAL - time_difference); return true; } + else if (strlen(_aqualink_data.date) <=0 || + strlen(_aqualink_data.time) <=0) + { + LOG(AQUA_LOG,LOG_DEBUG, "time not checked, no time from panel\n"); + return true; + } else { last_checked = now; @@ -188,7 +194,7 @@ bool checkAqualinkTime() char datestr[DATE_STRING_LEN]; #ifdef AQ_PDA - if (isPDA_PANEL) { + if (isPDA_PANEL && !isPDA_IAQT) { LOG(AQUA_LOG,LOG_DEBUG, "PDA Time Check\n"); // date is simply a day or week for PDA. localtime_r(&now, &aq_tm); @@ -358,6 +364,7 @@ int16_t RS16_endswithLEDstate(char *msg) #endif + void _processMessage(char *message, bool reset); void processMessage(char *message) @@ -454,6 +461,7 @@ void _processMessage(char *message, bool reset) if ((msg_loop & MSG_BOOST) != MSG_BOOST) { _aqualink_data.boost = false; _aqualink_data.boost_msg[0] = '\0'; + _aqualink_data.boost_duration = 0; //if (_aqualink_data.swg_percent >= 101) // _aqualink_data.swg_percent = 0; } @@ -619,7 +627,8 @@ void _processMessage(char *message, bool reset) else if (strcasestr(msg, MSG_SWG_HIGH_SALT) != NULL) setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_HI_SALT); else if (strcasestr(msg, MSG_SWG_FAULT) != NULL) - setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_CHECK_PCB); + setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_GENFAULT); + //setSWGdeviceStatus(&_aqualink_data, ALLBUTTON, SWG_STATUS_CHECK_PCB); // Any of these messages want to display. strcpy(_aqualink_data.last_display_message, msg); @@ -730,9 +739,11 @@ void _processMessage(char *message, bool reset) // Ignore messages if in programming mode. We get one of these turning off for some strange reason. if (in_programming_mode(&_aqualink_data) == false) { snprintf(_aqualink_data.boost_msg, 6, "%s", &msg[11]); + _aqualink_data.boost_duration = rsm_HHMM2min(_aqualink_data.boost_msg); _aqualink_data.boost = true; msg_loop |= MSG_BOOST; msg_loop |= MSG_SWG; + //convert_boost_to_duration(_aqualink_data.boost_msg) //if (_aqualink_data.ar_swg_status != SWG_STATUS_ON) {_aqualink_data.ar_swg_status = SWG_STATUS_ON;} if (_aqualink_data.swg_percent != 101) {changeSWGpercent(&_aqualink_data, 101);} //boost_msg_count = 0; @@ -807,6 +818,9 @@ bool process_packet(unsigned char *packet, int length) #ifdef AQ_PDA if (isPDA_PANEL) { + if (isPDA_IAQT) { + return false; + } return process_pda_packet(packet, length); } #endif @@ -987,7 +1001,7 @@ void action_delayed_request() } else { - LOG(AQUA_LOG,LOG_NOTICE, "SWG % is already %d, not changing\n", _aqualink_data.unactioned.value); + LOG(AQUA_LOG,LOG_NOTICE, "SWG %% is already %d, not changing\n", _aqualink_data.unactioned.value); } } // Let's just tell everyone we set it, before we actually did. Makes homekit happy, and it will re-correct on error. @@ -1168,7 +1182,7 @@ int startup(char *self, char *cfgFile) return EXIT_FAILURE; } } else if (isPDA_PANEL) { - if (_aqconfig_.device_id >= 0x60 && _aqconfig_.device_id <= 0x63) { + if ( (_aqconfig_.device_id >= 0x60 && _aqconfig_.device_id <= 0x63) || _aqconfig_.device_id == 0x33 ) { // We are good } else { LOG(AQUA_LOG,LOG_ERR, "Device ID 0x%02hhx does not match PDA panel, please check config!\n", _aqconfig_.device_id); @@ -1313,6 +1327,9 @@ int startup(char *self, char *cfgFile) LOG(AQUA_LOG,LOG_NOTICE, "Read SWG direct = %s\n", bool2text(READ_RSDEV_SWG)); LOG(AQUA_LOG,LOG_NOTICE, "Read ePump direct = %s\n", bool2text(READ_RSDEV_ePUMP)); LOG(AQUA_LOG,LOG_NOTICE, "Read vsfPump direct = %s\n", bool2text(READ_RSDEV_vsfPUMP)); + LOG(AQUA_LOG,LOG_NOTICE, "Read JXi heater direct = %s\n", bool2text(READ_RSDEV_JXI)); + LOG(AQUA_LOG,LOG_NOTICE, "Read LX heater direct = %s\n", bool2text(READ_RSDEV_LX)); + LOG(AQUA_LOG,LOG_NOTICE, "Read Chem Feeder direct = %s\n", bool2text(READ_RSDEV_CHEM)); if (READ_RSDEV_SWG && _aqconfig_.swg_zero_ignore != DEFAULT_SWG_ZERO_IGNORE_COUNT) LOG(AQUA_LOG,LOG_NOTICE, "Ignore SWG 0 msg count = %d\n", _aqconfig_.swg_zero_ignore); @@ -1507,6 +1524,7 @@ void main_loop() int blank_read_reconnect = MAX_ZERO_READ_BEFORE_RECONNECT_BLOCKING; // Will get reset if non blocking sprintf(_aqualink_data.last_display_message, "%s", "Connecting to Control Panel"); + _aqualink_data.is_display_message_programming = false; //_aqualink_data.simulate_panel = false; _aqualink_data.active_thread.thread_id = 0; _aqualink_data.air_temp = TEMP_UNKNOWN; @@ -1519,6 +1537,7 @@ void main_loop() _aqualink_data.swg_percent = TEMP_UNKNOWN; _aqualink_data.swg_ppm = TEMP_UNKNOWN; _aqualink_data.ar_swg_device_status = SWG_STATUS_UNKNOWN; + _aqualink_data.heater_err_status = NUL; // 0x00 is no error _aqualink_data.swg_led_state = LED_S_UNKNOWN; _aqualink_data.swg_delayed_percent = TEMP_UNKNOWN; _aqualink_data.temp_units = UNKNOWN; @@ -1530,6 +1549,8 @@ void main_loop() _aqualink_data.orp = TEMP_UNKNOWN; _aqualink_data.simulator_id = NUL; _aqualink_data.simulator_active = SIM_NONE; + _aqualink_data.boost_duration = 0; + _aqualink_data.boost = false; pthread_mutex_init(&_aqualink_data.active_thread.thread_mutex, NULL); pthread_cond_init(&_aqualink_data.active_thread.thread_cond, NULL); @@ -1547,6 +1568,11 @@ void main_loop() _aqualink_data.swg_ppm = 0; } + if (_aqconfig_.force_chem_feeder == true) { + _aqualink_data.ph = 0; + _aqualink_data.orp = 0; + } + signal(SIGINT, intHandler); signal(SIGTERM, intHandler); signal(SIGQUIT, intHandler); @@ -1881,7 +1907,15 @@ void main_loop() #ifdef AQ_PDA if (isPDA_PANEL) { // If we are in simulator mode, the sim has already send the ack - if (_aqualink_data.simulator_active == SIM_NONE) { + if (isPDA_IAQT) { + //printf("****PDA IAQT Code\n"); + _aqualink_data.updated = process_iaqtouch_packet(packet_buffer, packet_length, &_aqualink_data); + _aqualink_data.updated = true; // FORCE UPDATE SINCE THIS IS NOT WORKING YET + caculate_ack_packet(rs_fd, packet_buffer, IAQTOUCH); + if (checkAqualinkTime() == false) // Need to do this better. + {aq_programmer(AQ_SET_TIME, NULL, &_aqualink_data);} + } + else /*if (_aqualink_data.simulator_active == SIM_NONE)*/ { caculate_ack_packet(rs_fd, packet_buffer, AQUAPDA); } } diff --git a/color_lights.c b/color_lights.c index 262d788..4f8ef5f 100644 --- a/color_lights.c +++ b/color_lights.c @@ -6,6 +6,7 @@ //#define COLOR_LIGHTS_C_ #include "color_lights.h" + /****** This list MUST be in order of clight_type enum *******/ const char *_color_light_options[NUMBER_LIGHT_COLOR_TYPES][LIGHT_COLOR_OPTIONS] = { @@ -50,9 +51,9 @@ const char *_color_light_options[NUMBER_LIGHT_COLOR_TYPES][LIGHT_COLOR_OPTIONS] }, { // Color Logic "Voodoo Lounge", - "Blue Sea", - "Royal Blue", - "Afternoon Skies", + "Deep Blue Sea", + //"Royal Blue", + "Afternoon Skies", // 'Afternoon Sky' on allbutton, Skies on iaqtouch //"Aqua Green", "Emerald", "Sangria", @@ -91,8 +92,15 @@ const char *_color_light_options[NUMBER_LIGHT_COLOR_TYPES][LIGHT_COLOR_OPTIONS] }; -const char *light_mode_name(clight_type type, int index) +const char *light_mode_name(clight_type type, int index, emulation_type protocol) { + // Rename any modes depending on emulation type + if (protocol == ALLBUTTON) { + if (strcmp(_color_light_options[type][index],"Afternoon Skies") == 0) { + return "Afternoon Sky"; + } + } + return _color_light_options[type][index]; } diff --git a/color_lights.h b/color_lights.h index f96981b..11bc441 100644 --- a/color_lights.h +++ b/color_lights.h @@ -3,6 +3,7 @@ #define COLOR_LIGHTS_H_ #include "aqualink.h" +#include "aq_programmer.h" #define LIGHT_COLOR_NAME 16 #define LIGHT_COLOR_OPTIONS 17 @@ -19,7 +20,8 @@ typedef enum clight_type { LC_INTELLIB } clight_type; */ -const char *light_mode_name(clight_type type, int index); +//const char *light_mode_name(clight_type type, int index); +const char *light_mode_name(clight_type type, int index, emulation_type protocol); int build_color_lights_js(struct aqualinkdata *aqdata, char* buffer, int size); diff --git a/config.c b/config.c index 54c6c9b..8c1cfe2 100644 --- a/config.c +++ b/config.c @@ -92,6 +92,7 @@ void init_parameters (struct aqconfig * parms) parms->mqtt_dz_sub_topic = DEFAULT_MQTT_DZ_OUT; parms->mqtt_dz_pub_topic = DEFAULT_MQTT_DZ_IN; + parms->mqtt_hass_discover_topic = DEFAULT_HASS_DISCOVER; parms->mqtt_aq_topic = DEFAULT_MQTT_AQ_TP; parms->mqtt_server = DEFAULT_MQTT_SERVER; parms->mqtt_user = DEFAULT_MQTT_USER; @@ -129,6 +130,7 @@ void init_parameters (struct aqconfig * parms) parms->force_swg = false; parms->force_ps_setpoints = false; parms->force_frzprotect_setpoints = false; + parms->force_chem_feeder = false; //parms->swg_pool_and_spa = false; parms->swg_zero_ignore = DEFAULT_SWG_ZERO_IGNORE_COUNT; parms->display_warnings_web = false; @@ -442,6 +444,15 @@ bool setConfigValue(struct aqualinkdata *aqdata, char *param, char *value) { } else if (strncasecmp(param, "mqtt_dz_pub_topic", 17) == 0) { _aqconfig_.mqtt_dz_pub_topic = cleanalloc(value); rtn=true; + } else if (strncasecmp(param, "mqtt_hassio_discover_topic", 26) == 0) { + _aqconfig_.mqtt_hass_discover_topic = cleanalloc(value); + /* It might also make sence to also set these to true. Since aqualinkd does not know the state at the time discover topics are published. + _aqconfig_.force_swg; + _aqconfig_.force_ps_setpoints; + _aqconfig_.force_frzprotect_setpoints; + force_chem_feeder + */ + rtn=true; } else if (strncasecmp(param, "mqtt_aq_topic", 13) == 0) { _aqconfig_.mqtt_aq_topic = cleanalloc(value); rtn=true; @@ -552,11 +563,23 @@ bool setConfigValue(struct aqualinkdata *aqdata, char *param, char *value) { else _aqconfig_.read_RS485_devmask &= ~READ_RS485_PEN_PUMP; rtn=true; - } else if (strncasecmp (param, "read_RS485_LXi", 14) == 0) { + } else if (strncasecmp (param, "read_RS485_JXi", 14) == 0) { + if (text2bool(value)) + _aqconfig_.read_RS485_devmask |= READ_RS485_JAN_JXI; + else + _aqconfig_.read_RS485_devmask &= ~READ_RS485_JAN_JXI; + rtn=true; + } else if (strncasecmp (param, "read_RS485_LX", 14) == 0) { if (text2bool(value)) - _aqconfig_.read_RS485_devmask |= READ_RS485_JAN_LXI; + _aqconfig_.read_RS485_devmask |= READ_RS485_JAN_LX; else - _aqconfig_.read_RS485_devmask &= ~READ_RS485_JAN_LXI; + _aqconfig_.read_RS485_devmask &= ~READ_RS485_JAN_LX; + rtn=true; + } else if (strncasecmp (param, "read_RS485_Chem", 14) == 0) { + if (text2bool(value)) + _aqconfig_.read_RS485_devmask |= READ_RS485_JAN_CHEM; + else + _aqconfig_.read_RS485_devmask &= ~READ_RS485_JAN_CHEM; rtn=true; } else if (strncasecmp (param, "use_panel_aux_labels", 20) == 0) { _aqconfig_.use_panel_aux_labels = text2bool(value); @@ -570,6 +593,9 @@ bool setConfigValue(struct aqualinkdata *aqdata, char *param, char *value) { } else if (strncasecmp (param, "force_frzprotect_setpoints", 26) == 0) { _aqconfig_.force_frzprotect_setpoints = text2bool(value); rtn=true; + } else if (strncasecmp (param, "force_chem_feeder", 17) == 0) { + _aqconfig_.force_chem_feeder = text2bool(value); + rtn=true; } else if (strncasecmp (param, "debug_RSProtocol_bytes", 22) == 0) { _aqconfig_.log_raw_bytes = text2bool(value); rtn=true; diff --git a/config.h b/config.h index c28cb6e..65db598 100644 --- a/config.h +++ b/config.h @@ -15,6 +15,7 @@ #define DEFAULT_DEVICE_ID "0x0a" #define DEFAULT_MQTT_DZ_IN NULL #define DEFAULT_MQTT_DZ_OUT NULL +#define DEFAULT_HASS_DISCOVER NULL #define DEFAULT_MQTT_AQ_TP NULL #define DEFAULT_MQTT_SERVER NULL #define DEFAULT_MQTT_USER NULL @@ -27,8 +28,9 @@ #define READ_RS485_SWG (1 << 0) // 1 SWG #define READ_RS485_JAN_PUMP (1 << 1) // 2 Jandy Pump #define READ_RS485_PEN_PUMP (1 << 2) // 4 Pentair Pump -#define READ_RS485_JAN_LXI (1 << 3) // Jandy LX & LXi heater -//#define READ_RS485_JAN_LXI (1 << 4) // Jandy LXi heater +#define READ_RS485_JAN_JXI (1 << 3) // Jandy JX & LXi heater +#define READ_RS485_JAN_LX (1 << 4) // Jandy LX heater +#define READ_RS485_JAN_CHEM (1 << 5) // Jandy Chemical Feeder struct aqconfig { @@ -51,6 +53,7 @@ struct aqconfig char *mqtt_dz_sub_topic; char *mqtt_dz_pub_topic; char *mqtt_aq_topic; + char *mqtt_hass_discover_topic; char *mqtt_server; char *mqtt_user; char *mqtt_passwd; @@ -79,6 +82,7 @@ struct aqconfig bool force_swg; bool force_ps_setpoints; bool force_frzprotect_setpoints; + bool force_chem_feeder; int swg_zero_ignore; bool display_warnings_web; bool log_protocol_packets; // Read & Write as packets @@ -112,8 +116,11 @@ struct aqconfig _aqconfig_; #define READ_RSDEV_SWG ((_aqconfig_.read_RS485_devmask & READ_RS485_SWG) == READ_RS485_SWG) #define READ_RSDEV_ePUMP ((_aqconfig_.read_RS485_devmask & READ_RS485_JAN_PUMP) == READ_RS485_JAN_PUMP) #define READ_RSDEV_vsfPUMP ((_aqconfig_.read_RS485_devmask & READ_RS485_PEN_PUMP) == READ_RS485_PEN_PUMP) -#define READ_RSDEV_LXI ((_aqconfig_.read_RS485_devmask & READ_RS485_JAN_LXI) == READ_RS485_JAN_LXI) +#define READ_RSDEV_JXI ((_aqconfig_.read_RS485_devmask & READ_RS485_JAN_JXI) == READ_RS485_JAN_JXI) +#define READ_RSDEV_LX ((_aqconfig_.read_RS485_devmask & READ_RS485_JAN_LX) == READ_RS485_JAN_LX) +#define READ_RSDEV_CHEM ((_aqconfig_.read_RS485_devmask & READ_RS485_JAN_CHEM) == READ_RS485_JAN_CHEM) +#define isPDA_IAQT (_aqconfig_.device_id == 0x33) //#define isPDA ((_aqconfig_.paneltype_mask & RSP_PDA) == RSP_PDA) diff --git a/devices_jandy.c b/devices_jandy.c index 7bc5285..27d967f 100644 --- a/devices_jandy.c +++ b/devices_jandy.c @@ -39,6 +39,7 @@ bool processJandyPacket(unsigned char *packet_buffer, int packet_length, struct static rsDeviceType interestedInNextAck = DRS_NONE; static unsigned char previous_packet_to = NUL; // bad name, it's not previous, it's previous that we were interested in. int rtn = false; + // We received the ack from a Jandy device we are interested in if (packet_buffer[PKT_DEST] == DEV_MASTER && interestedInNextAck != DRS_NONE) { @@ -50,9 +51,17 @@ bool processJandyPacket(unsigned char *packet_buffer, int packet_length, struct { rtn = processPacketFromJandyPump(packet_buffer, packet_length, aqdata, previous_packet_to); } - else if (interestedInNextAck == DRS_LXI) + else if (interestedInNextAck == DRS_JXI) + { + rtn = processPacketFromJandyJXiHeater(packet_buffer, packet_length, aqdata, previous_packet_to); + } + else if (interestedInNextAck == DRS_LX) { - rtn = processPacketFromJandyHeater(packet_buffer, packet_length, aqdata, previous_packet_to); + rtn = processPacketFromJandyLXHeater(packet_buffer, packet_length, aqdata, previous_packet_to); + } + else if (interestedInNextAck == DRS_CHEM) + { + rtn = processPacketFromJandyChemFeeder(packet_buffer, packet_length, aqdata, previous_packet_to); } interestedInNextAck = DRS_NONE; previous_packet_to = NUL; @@ -71,7 +80,7 @@ bool processJandyPacket(unsigned char *packet_buffer, int packet_length, struct interestedInNextAck = DRS_NONE; previous_packet_to = NUL; } - else if (READ_RSDEV_SWG && packet_buffer[PKT_DEST] == SWG_DEV_ID) + else if (READ_RSDEV_SWG && packet_buffer[PKT_DEST] >= JANDY_DEC_SWG_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_SWG_MAX) { interestedInNextAck = DRS_SWG; rtn = processPacketToSWG(packet_buffer, packet_length, aqdata, _aqconfig_.swg_zero_ignore); @@ -83,11 +92,22 @@ bool processJandyPacket(unsigned char *packet_buffer, int packet_length, struct rtn = processPacketToJandyPump(packet_buffer, packet_length, aqdata); previous_packet_to = packet_buffer[PKT_DEST]; } - else if (READ_RSDEV_LXI && ( (packet_buffer[PKT_DEST] >= JANDY_DEC_LX_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_LX_MAX) - || (packet_buffer[PKT_DEST] >= JANDY_DEC_LXI_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_LXI_MAX))) + else if (READ_RSDEV_JXI && packet_buffer[PKT_DEST] >= JANDY_DEC_JXI_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_JXI_MAX) + { + interestedInNextAck = DRS_JXI; + rtn = processPacketToJandyJXiHeater(packet_buffer, packet_length, aqdata); + previous_packet_to = packet_buffer[PKT_DEST]; + } + else if (READ_RSDEV_LX && packet_buffer[PKT_DEST] >= JANDY_DEC_LX_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_LX_MAX) + { + interestedInNextAck = DRS_LX; + rtn = processPacketToJandyLXHeater(packet_buffer, packet_length, aqdata); + previous_packet_to = packet_buffer[PKT_DEST]; + } + else if (READ_RSDEV_CHEM && packet_buffer[PKT_DEST] >= JANDY_DEC_CHEM_MIN && packet_buffer[PKT_DEST] <= JANDY_DEC_CHEM_MAX) { - interestedInNextAck = DRS_LXI; - rtn = processPacketToJandyHeater(packet_buffer, packet_length, aqdata); + interestedInNextAck = DRS_CHEM; + rtn = processPacketToJandyChemFeeder(packet_buffer, packet_length, aqdata); previous_packet_to = packet_buffer[PKT_DEST]; } else @@ -109,13 +129,13 @@ bool processPacketToSWG(unsigned char *packet, int packet_length, struct aqualin static int swg_zero_cnt = 0; bool changedAnything = false; - if (getLogLevel(DJAN_LOG) == LOG_DEBUG) { + // Only log if we are jandy debug move and not serial (otherwise it'll print twice) + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { char buff[1024]; - beautifyPacket(buff, packet, packet_length, false); - LOG(DJAN_LOG,LOG_DEBUG, "%s", buff); + beautifyPacket(buff, packet, packet_length, true); + LOG(DJAN_LOG,LOG_DEBUG, "To SWG: %s", buff); } - // 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| @@ -161,10 +181,11 @@ bool processPacketFromSWG(unsigned char *packet, int packet_length, struct aqual bool changedAnything = false; _swg_noreply_cnt = 0; - if (getLogLevel(DJAN_LOG) == LOG_DEBUG) { + // Only log if we are jandy debug move and not serial (otherwise it'll print twice) + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { char buff[1024]; beautifyPacket(buff, packet, packet_length, true); - LOG(DJAN_LOG,LOG_DEBUG, "%s", buff); + LOG(DJAN_LOG,LOG_DEBUG, "From SWG: %s", buff); } if (packet[PKT_CMD] == CMD_PPM) { @@ -213,6 +234,7 @@ bool isSWGDeviceErrorState(unsigned char status) status == SWG_STATUS_LOW_TEMP || status == SWG_STATUS_HIGH_CURRENT || status == SWG_STATUS_NO_FLOW) + // Maybe add CLEAN_CELL and GENFAULT here return true; else return false; @@ -220,6 +242,17 @@ bool isSWGDeviceErrorState(unsigned char status) void setSWGdeviceStatus(struct aqualinkdata *aqdata, emulation_type requester, unsigned char status) { static unsigned char last_status = SWG_STATUS_UNKNOWN; + /* This is only needed for DEBUG + static bool haveSeenRSSWG = false; + + if (requester == JANDY_DEVICE) { + haveSeenRSSWG = true; + } + */ + // If we are reading state directly from RS458, then ignore everything else. + if ( READ_RSDEV_SWG && requester != JANDY_DEVICE ) { + return; + } if ((aqdata->ar_swg_device_status == status) || (last_status == status)) { //LOG(DJAN_LOG, LOG_DEBUG, "Set SWG device state to '0x%02hhx', request from %d\n", aqdata->ar_swg_device_status, requester); @@ -227,10 +260,15 @@ void setSWGdeviceStatus(struct aqualinkdata *aqdata, emulation_type requester, u } last_status = status; - // If we get (ALLBUTTON, SWG_STATUS_CHECK_PCB), it sends this for many status, like clean cell. + // If we get (ALLBUTTON, SWG_STATUS_CHECK_PCB // GENFAULT), it sends this for many status, like clean cell. // So if we are in one of those states, don't use it. - if (requester == ALLBUTTON && status == SWG_STATUS_CHECK_PCB ) { + // Need to rethink this. Use general fault only if we are not reading SWG status direct from device + //if ( READ_RSDEV_SWG && requester == ALLBUTTON && status == SWG_STATUS_GENFAULT ) { + + // SWG_STATUS_GENFAULT is shown on panels for many reasons, if we are NOT reading the status directly from the SWG + // then use it, otherwise disguard it as we will have a better status + if (requester == ALLBUTTON && status == SWG_STATUS_GENFAULT ) { if (aqdata->ar_swg_device_status > SWG_STATUS_ON && aqdata->ar_swg_device_status < SWG_STATUS_TURNING_OFF) { LOG(DJAN_LOG, LOG_DEBUG, "Ignoring set SWG device state to '0x%02hhx', request from %d\n", aqdata->ar_swg_device_status, requester); @@ -250,6 +288,7 @@ void setSWGdeviceStatus(struct aqualinkdata *aqdata, emulation_type requester, u case SWG_STATUS_LOW_VOLTS: case SWG_STATUS_LOW_TEMP: case SWG_STATUS_CHECK_PCB: + case SWG_STATUS_GENFAULT: aqdata->ar_swg_device_status = status; aqdata->swg_led_state = isSWGDeviceErrorState(status)?ENABLE:ON; break; @@ -393,6 +432,9 @@ aqledstate get_swg_led_state(struct aqualinkdata *aqdata) case SWG_STATUS_OFF: // THIS IS OUR OFF STATUS, NOT AQUAPURE return OFF; break; + case SWG_STATUS_GENFAULT: + return ENABLE; + break; default: return (aqdata->swg_percent > 0?ON:ENABLE); break; @@ -466,6 +508,11 @@ void get_swg_status_mqtt(struct aqualinkdata *aqdata, char *message, int *status sprintf(message, "AQUAPURE OFF"); *dzalert = 0; break; + case SWG_STATUS_GENFAULT: + *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); + sprintf(message, "AQUAPURE GENERAL FAULT"); + *dzalert = 2; + break; default: *status = (aqdata->swg_percent > 0?SWG_ON:SWG_OFF); sprintf(message, "AQUAPURE UNKNOWN STATUS"); @@ -498,6 +545,12 @@ bool processPacketToJandyPump(unsigned char *packet_buffer, int packet_length, s Type 0x1F and cmd 0x45 is RPM = 39 * (256) + 96 / 4 = 2520 or Byte 8 * 265 + Byte 7 / 4 */ + // Only log if we are jandy debug move and not serial (otherwise it'll print twice) + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { + char msg[1000]; + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_DEBUG, "To ePump: %s\n", msg); + } // If type 0x45 and 0x44 set to interested in next command. if (packet_buffer[3] == CMD_EPUMP_RPM) { @@ -506,11 +559,8 @@ bool processPacketToJandyPump(unsigned char *packet_buffer, int packet_length, s } else if (packet_buffer[3] == CMD_EPUMP_WATTS) { LOG(DJAN_LOG, LOG_DEBUG, "ControlPanel request Pump ID 0x%02hhx get watts\n",packet_buffer[PKT_DEST]); } - - if (getLogLevel(DJAN_LOG) >= LOG_DEBUG) { - char msg[1000]; - beautifyPacket(msg, packet_buffer, packet_length, true); - LOG(DJAN_LOG, LOG_DEBUG, "To ePump: %s\n", msg); + + if (getLogLevel(DJAN_LOG) == LOG_DEBUG) { //find pump for message for (int i=0; i < aqdata->num_pumps; i++) { if (aqdata->pumps[i].pumpID == packet_buffer[PKT_DEST]) { @@ -527,6 +577,14 @@ bool processPacketFromJandyPump(unsigned char *packet_buffer, int packet_length, { bool found=false; + // Only log if we are jandy debug move and not serial (otherwise it'll print twice) + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { + char msg[1000]; + //logMessage(LOG_DEBUG, "Need to log ePump message here for future\n"); + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_DEBUG, "From ePump: %s\n", msg); + } + if (packet_buffer[3] == CMD_EPUMP_STATUS && packet_buffer[4] == CMD_EPUMP_RPM) { for (int i = 0; i < MAX_PUMPS; i++) { if ( aqdata->pumps[i].prclType == JANDY && aqdata->pumps[i].pumpID == previous_packet_to ) { @@ -552,33 +610,219 @@ bool processPacketFromJandyPump(unsigned char *packet_buffer, int packet_length, LOG(DJAN_LOG, LOG_NOTICE, "Jandy Pump found at ID 0x%02hhx with WATTS %d, but not configured, information ignored!\n",previous_packet_to, (packet_buffer[EP_HI_B_WAT] * 256) + packet_buffer[EP_LO_B_WAT]); } - if (getLogLevel(DJAN_LOG) >= LOG_DEBUG) { + + return false; +} + +void processMissingAckPacketFromJandyPump(unsigned char destination, struct aqualinkdata *aqdata) +{ + // Do nothing for the moment. + return; +} + + + + + + +bool processPacketToJandyJXiHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata) +{ + + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { char msg[1000]; //logMessage(LOG_DEBUG, "Need to log ePump message here for future\n"); beautifyPacket(msg, packet_buffer, packet_length, true); - LOG(DJAN_LOG, LOG_DEBUG, "From ePump: %s\n", msg); + LOG(DJAN_LOG, LOG_DEBUG, "To JXi: %s\n", msg); + } + + if (packet_buffer[3] != CMD_JXI_PING) { + // Not sure what this message is, so ignore + // Maybe print a messsage. + return false; } + /* + Below counfing first as bit 0 + 4th bit 0x00 no pump on (nothing) + 0x10 seems to be JXi came online. nothing more + 0x11 (pool mode) + 0x12 (spa mode) + 0x19 heat pool + 0x1a heat spa + 5th bit 0x55 = 85 deg. (current pool setpoint) + 6th bit 0x66 = 102 deg. (current spa setpoint) + 7th bit 0x4f = current water temp 79 (0xFF is off / 255) + */ + + if (packet_buffer[5] != aqdata->pool_htr_set_point) { + LOG(DJAN_LOG, LOG_DEBUG, "JXi pool setpoint %d, Pool heater sp %d (changing to LXi)\n", packet_buffer[5], aqdata->pool_htr_set_point); + aqdata->pool_htr_set_point = packet_buffer[5]; + } + + if (packet_buffer[6] != aqdata->spa_htr_set_point) { + LOG(DJAN_LOG, LOG_DEBUG, "JXi spa setpoint %d, Spa heater sp %d (changing to LXi)\n", packet_buffer[6], aqdata->spa_htr_set_point); + aqdata->spa_htr_set_point = packet_buffer[6]; + } + + if (packet_buffer[7] != 0xff && packet_buffer[4] != 0x00) { + if (packet_buffer[4] == 0x11 || packet_buffer[4] == 0x19) { + if (aqdata->pool_temp != packet_buffer[7]) { + LOG(DJAN_LOG, LOG_DEBUG, "JXi pool water temp %d, pool water temp %d (changing to LXi)\n", packet_buffer[7], aqdata->pool_temp); + aqdata->pool_temp = packet_buffer[7]; + } + } else if (packet_buffer[4] == 0x12 || packet_buffer[4] == 0x1a) { + if (aqdata->spa_temp != packet_buffer[7]) { + LOG(DJAN_LOG, LOG_DEBUG, "JXi spa water temp %d, spa water temp %d (changing to LXi)\n", packet_buffer[7], aqdata->spa_temp); + aqdata->spa_temp = packet_buffer[7]; + } + } + } + + switch (packet_buffer[4]) { + case 0x11: // Pool heat off or enabled + break; + case 0x12: // Pool Heat enabled or heating + break; + case 0x19: // Spa heat off or enabled + break; + case 0x1a: // Spa Hear Heat enabled or heating + break; + } + + /* + char msg[1000]; + int length = 0; + + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_INFO, "To JXi Heater: %s\n", msg); + + length += sprintf(msg+length, "Last panel info "); + + for (int i=0; i < aqdata->total_buttons; i++) + { + if ( strcmp(BTN_POOL_HTR,aqdata->aqbuttons[i].name) == 0) { + length += sprintf(msg+length, ", Pool Heat LED=%d ",aqdata->aqbuttons[i].led->state); + } + if ( strcmp(BTN_SPA_HTR,aqdata->aqbuttons[i].name) == 0) { + length += sprintf(msg+length, ", Spa Heat LED=%d ",aqdata->aqbuttons[i].led->state); + } + } + + length += sprintf(msg+length, ", Pool SP=%d, Spa SP=%d",aqdata->pool_htr_set_point, aqdata->spa_htr_set_point); + length += sprintf(msg+length, ", Pool temp=%d, Spa temp=%d",aqdata->pool_temp, aqdata->spa_temp); + + LOG(DJAN_LOG, LOG_INFO, "%s\n", msg); + return false; + */ + + return true; } -void processMissingAckPacketFromJandyPump(unsigned char destination, struct aqualinkdata *aqdata) +void getJandyHeaterError(struct aqualinkdata *aqdata, char *message) { - // Do nothing for the moment. - return; + if (aqdata->heater_err_status == NUL) { + return; + } + + int size = sprintf(message, "JXi Heater "); + getJandyHeaterErrorMQTT(aqdata, message+size); } +void getJandyHeaterErrorMQTT(struct aqualinkdata *aqdata, char *message) +{ + switch (aqdata->heater_err_status) { + case 0x00: + //sprintf(message, ""); + break; + case 0x10: + sprintf(message, "FAULT HIGH LIMIT"); + break; + case 0x02: + sprintf(message, "FAULT H20 SENSOR"); + break; + case 0x08: + sprintf(message, "FAULT AUX MONITOR"); + break; + default: + // + /* Error we haven't decoded yet + ?x?? check flow + 0x10 Fault high limit + ?x?? Fault High Flu temp + ?x?? Fault Check Igntion Control + 0x02 Fault Short H20 sensor (or Fault open water sensor) + ?x?? Pump fault + 0x08 AUX Monitor + */ + sprintf(message, "FAULT 0x%02hhx",aqdata->heater_err_status); + break; + } +} +bool processPacketFromJandyJXiHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to) +{ + if (getLogLevel(DJAN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { + char msg[1000]; + //logMessage(LOG_DEBUG, "Need to log ePump message here for future\n"); + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_DEBUG, "From JXi: %s\n", msg); + } + + if (packet_buffer[3] != CMD_JXI_STATUS) { + // Not sure what this message is, so ignore + // Maybe print a messsage. + return false; + } + + // No error is 0x00, so blindly set it. + aqdata->heater_err_status = packet_buffer[6]; + // Check if error first + if (packet_buffer[6] != 0x00) { + + } else if (packet_buffer[4] == 0x00) { + // Not heating. + // Heater off or enabeled + } else if (packet_buffer[4] == 0x08) { + // Heating + // Heater on of enabled + } + /* + char msg[1000]; + int length = 0; + + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_INFO, "From JXi Heater: %s\n", msg); + + length += sprintf(msg+length, "Last panel info "); + + for (int i=0; i < aqdata->total_buttons; i++) + { + if ( strcmp(BTN_POOL_HTR,aqdata->aqbuttons[i].name) == 0) { + length += sprintf(msg+length, ", Pool Heat LED=%d ",aqdata->aqbuttons[i].led->state); + } + if ( strcmp(BTN_SPA_HTR,aqdata->aqbuttons[i].name) == 0) { + length += sprintf(msg+length, ", Spa Heat LED=%d ",aqdata->aqbuttons[i].led->state); + } + } + length += sprintf(msg+length, ", Pool SP=%d, Spa SP=%d",aqdata->pool_htr_set_point, aqdata->spa_htr_set_point); + length += sprintf(msg+length, ", Pool temp=%d, Spa temp=%d",aqdata->pool_temp, aqdata->spa_temp); + LOG(DJAN_LOG, LOG_INFO, "%s\n", msg); + return false; + */ + return true; +} -bool processPacketToJandyHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata) +bool processPacketToJandyLXHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata) { + char msg[1000]; int length = 0; beautifyPacket(msg, packet_buffer, packet_length, true); - LOG(DJAN_LOG, LOG_INFO, "To Heater: %s\n", msg); + LOG(DJAN_LOG, LOG_INFO, "To LX: %s\n", msg); length += sprintf(msg+length, "Last panel info "); @@ -598,15 +842,16 @@ bool processPacketToJandyHeater(unsigned char *packet_buffer, int packet_length, LOG(DJAN_LOG, LOG_INFO, "%s\n", msg); return false; + } -bool processPacketFromJandyHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to) +bool processPacketFromJandyLXHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to) { char msg[1000]; int length = 0; beautifyPacket(msg, packet_buffer, packet_length, true); - LOG(DJAN_LOG, LOG_INFO, "From Heater: %s\n", msg); + LOG(DJAN_LOG, LOG_INFO, "From LX: %s\n", msg); length += sprintf(msg+length, "Last panel info "); @@ -629,3 +874,91 @@ bool processPacketFromJandyHeater(unsigned char *packet_buffer, int packet_lengt } +bool processPacketToJandyChemFeeder(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata) +{ + char msg[1000]; + int length = 0; + + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_INFO, "To Chem: %s\n", msg); + + length += sprintf(msg+length, "Last panel info "); + + length += sprintf(msg+length, ", pH=%f, ORP=%d",aqdata->ph, aqdata->orp); + + LOG(DJAN_LOG, LOG_INFO, "%s\n", msg); + + return false; +} + +bool processPacketFromJandyChemFeeder(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to){ + char msg[1000]; + int length = 0; + + beautifyPacket(msg, packet_buffer, packet_length, true); + LOG(DJAN_LOG, LOG_INFO, "From Chem: %s\n", msg); + + length += sprintf(msg+length, "Last panel info "); + + length += sprintf(msg+length, ", pH=%f, ORP=%d",aqdata->ph, aqdata->orp); + + LOG(DJAN_LOG, LOG_INFO, "%s\n", msg); + + return false; +} + + + + +/* + +// JXi Heater + +// Normal ping and return +5th bit 0x00 no pump on (nothing) + 0x10 seems to be JXi came online. nothing more + 0x11 (pool mode) + 0x12 (spa mode) + 0x19 heat pool + 0x1a heat spa +6th bit 0x55 = 85 deg. (current pool setpoint) +7th bit 0x66 = 102 deg. (current spa setpoint) +8th bit 0x4f = current water temp 79 (0xFF is off / 255) + +Jandy To 0x68 of type Unknown '0x0c' | HEX: 0x10|0x02|0x68|0x0c|0x11|0x55|0x66|0x4f|0xa1|0x10|0x03| +Jandy From 0x68 of type Unknown '0x0d' | HEX: 0x10|0x02|0x00|0x0d|0x00|0x00|0x00|0x1f|0x10|0x03| + +Request to turn on 85 +5th bit 0x19 looks like turn on +6th bit 0x55 = 85 deg. +7th bit 0x4f = current temp 79 +Jandy To 0x68 of type Unknown '0x0c' | HEX: 0x10|0x02|0x68|0x0c|0x19|0x55|0x66|0x4f|0xa9|0x10|0x03| +Jandy From 0x68 of type Unknown '0x0d' | HEX: 0x10|0x02|0x00|0x0d|0x08|0x00|0x00|0x27|0x10|0x03| + +Request to turn on 90 +5th bit 0x19 looks like turn on +6th bit 0x5a = 90 deg. +Jandy To 0x68 of type Unknown '0x0c' | HEX: 0x10|0x02|0x68|0x0c|0x19|0x5a|0x66|0x4f|0xae|0x10|0x03| +Jandy From 0x68 of type Unknown '0x0d' | HEX: 0x10|0x02|0x00|0x0d|0x08|0x00|0x00|0x27|0x10|0x03| + +Request to turn off (standard ping) // return had hi limit error in it +Jandy To 0x68 of type Unknown '0x0c' | HEX: 0x10|0x02|0x68|0x0c|0x11|0x55|0x66|0x4f|0xa1|0x10|0x03| +Jandy From 0x68 of type Unknown '0x0d' | HEX: 0x10|0x02|0x00|0x0d|0x00|0x00|0x10|0x2f|0x10|0x03| + +Returns + +5th bit is type 0x00 nothing (or enabeled) - 0x08 looks like heat +Hi limit error return +7th bit 0x10 looks like the error +Jandy To 0x68 of type Unknown '0x0c' | HEX: 0x10|0x02|0x68|0x0c|0x19|0x5a|0x66|0x4f|0xae|0x10|0x03| +Jandy From 0x68 of type Unknown '0x0d' | HEX: 0x10|0x02|0x00|0x0d|0x08|0x00|0x10|0x37|0x10|0x03| + +Errors are -> +check flow +Fault high limit -> 0x10 +Fault High Flu temp +Fault Check Igntion Control +Fault Short H20 sensor (or Fault open water sensor) -> 0x02 +Pump fault +AUX Monitor -> 0x08 +*/ \ No newline at end of file diff --git a/devices_jandy.h b/devices_jandy.h index 161cad0..aaf427e 100644 --- a/devices_jandy.h +++ b/devices_jandy.h @@ -14,8 +14,13 @@ bool processPacketFromJandyPump(unsigned char *packet_buffer, int packet_length, void processMissingAckPacketFromSWG(unsigned char destination, struct aqualinkdata *aqdata); void processMissingAckPacketFromJandyPump(unsigned char destination, struct aqualinkdata *aqdata); -bool processPacketFromJandyHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to ); -bool processPacketToJandyHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata); +bool processPacketFromJandyJXiHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to ); +bool processPacketToJandyJXiHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata); +bool processPacketFromJandyLXHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to ); +bool processPacketToJandyLXHeater(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata); + +bool processPacketFromJandyChemFeeder(unsigned char *packet_buffer, int packet_length, struct aqualinkdata *aqdata, const unsigned char previous_packet_to ); +bool processPacketToJandyChemFeeder(unsigned char *packet_buffer, 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); @@ -27,4 +32,7 @@ void setSWGenabled(struct aqualinkdata *aqdata); bool setSWGboost(struct aqualinkdata *aqdata, bool on); void setSWGdeviceStatus(struct aqualinkdata *aqdata, emulation_type requester, unsigned char status); +void getJandyHeaterError(struct aqualinkdata *aqdata, char *message); +void getJandyHeaterErrorMQTT(struct aqualinkdata *aqdata, char *message); + #endif // AQUAPURE_H_ \ No newline at end of file diff --git a/devices_pentair.c b/devices_pentair.c index f7abac0..4ab5e21 100644 --- a/devices_pentair.c +++ b/devices_pentair.c @@ -24,11 +24,20 @@ #include "aq_serial.h" #include "devices_pentair.h" #include "utils.h" +#include "packetLogger.h" bool processPentairPacket(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata) { bool changedAnything = false; int i; + + // Only log if we are pentair debug move and not serial (otherwise it'll print twice) + if (getLogLevel(DPEN_LOG) == LOG_DEBUG && getLogLevel(RSSD_LOG) < LOG_DEBUG ) { + char buff[1024]; + beautifyPacket(buff, packet, packet_length, true); + LOG(DPEN_LOG,LOG_DEBUG, "%s", buff); + } + //ID's 96 to 111 = Pentair (or 0x60 to 0x6F) // Need to find a better way to support pump index diff --git a/extras/HASSIO.png b/extras/HASSIO.png new file mode 100644 index 0000000000000000000000000000000000000000..49d1bdc683fe6bc7d67c1c57e92ca8156dfff04d GIT binary patch literal 146657 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%0DAN}b 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 literal 0 HcmV?d00001 diff --git a/extras/aqua.sh b/extras/aqua.sh index 86f1ed6..c0a805b 100755 --- a/extras/aqua.sh +++ b/extras/aqua.sh @@ -182,33 +182,12 @@ function check_git_installed { function check_curl_installed { command -v curl >/dev/null 2>&1 || { echoerr "curl is not installed. Installing"; exit 1; } } - -# -# Main -# - -# Check we are on a arm 32 bit machine. - -# below is compatable on all linux. -#if file -Lb /usr/bin/ld | grep -s -i armhf > /dev/null; then -# dpkg is good for debain distros. -if dpkg --print-architecture | grep -s -i armhf > /dev/null; then - echo "Architecture is armhf"; -else - echo "Architecture is '`dpkg --print-architecture`'" - echo "This does not look like linux running on a arm 32 platform" - echo "Please use another install method" - echo "https://github.com/sfeakes/AqualinkD/wiki#Install" - exit -fi - # Check something was passed if [[ $# -eq 0 ]]; then print_usage exit fi - # Pass command line if [ "$1" == "release" ]; then check_curl_installed diff --git a/extras/aqualinkd-docker.cmd b/extras/aqualinkd-docker.cmd new file mode 100755 index 0000000..0946a25 --- /dev/null +++ b/extras/aqualinkd-docker.cmd @@ -0,0 +1,47 @@ +#!/bin/bash + + +# Script to start AqualinkD inside container. + +CONFDIR=/aquadconf +AQUA_CONF=$CONFDIR/aqualinkd.conf + +# Check we have a config directory +if [ -d "$CONFDIR" ]; then + + # Check we have config file, if not copy default + if [ ! -f "$AQUA_CONF" ]; then + echo "Warning no aqualinkd.conf in $CONFDIR", using default + cp /etc/aqualinkd.conf $CONFDIR + fi + + # Replace local filesystem config with mounted config + ln -sf "$AQUA_CONF" /etc/aqualinkd.conf + + # If we have a web config, replace the local filesystem with mounted + if [ -f "$CONFDIR/config.js" ]; then + ln -sf "$CONFDIR/config.js" /var/www/aqualinkd/config.js + fi + + # If don't have a cron file, create one + if [ ! -f "$CONFDIR/aqualinkd.schedule" ]; then + echo "#***** AUTO GENERATED DO NOT EDIT *****" > "$CONFDIR/aqualinkd.schedule" + fi + + # link mounted cron file to local filesystem. + ln -sf "$CONFDIR/aqualinkd.schedule" /etc/cron.d/aqualinkd + chmod 644 "$CONFDIR/aqualinkd.schedule" +else + # No conig dir, show warning + echo "WARNING no config directory, AqualinkD starting with default config, no changes will be saved" + AQUA_CONF="/etc/aqualinkd.conf" +fi + + + +# Start cron +service cron start + +# Start AqualinkD not in daemon mode +/usr/local/bin/aqualinkd -d -c $AQUA_CONF + diff --git a/hassio.c b/hassio.c new file mode 100644 index 0000000..93a5186 --- /dev/null +++ b/hassio.c @@ -0,0 +1,444 @@ + +#include +#include +#include + +#include "mongoose.h" + +#include "aqualink.h" +#include "net_services.h" +#include "json_messages.h" +#include "aq_mqtt.h" +#include "rs_msg_utils.h" +#include "config.h" +#include "version.h" + + +// NSF Need to find a better way, this is not thread safe, so don;t want to expost it from net_services.h. +void send_mqtt(struct mg_connection *nc, const char *toppic, const char *message); + +#define HASS_DEVICE "\"identifiers\": " \ + "[\"" AQUALINKD_SHORT_NAME "\"]," \ + " \"sw_version\": \"" AQUALINKD_VERSION "\"," \ + " \"model\": \"" AQUALINKD_NAME "\"," \ + " \"name\": \"AqualinkD\"," \ + " \"manufacturer\": \"" AQUALINKD_SHORT_NAME "\"," \ + " \"suggested_area\": \"pool\"" + +#define HASS_AVAILABILITY "\"payload_available\" : \"1\"," \ + "\"payload_not_available\" : \"0\"," \ + "\"topic\": \"%s/" MQTT_LWM_TOPIC "\"" + + +const char *HASSIO_CLIMATE_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"climate\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"modes\": [\"off\", \"heat\"]," + "\"send_if_off\": true," + "\"initial\": 36," + "\"power_command_topic\": \"%s/%s/set\"," + "\"payload_on\": \"1\"," + "\"payload_off\": \"0\"," + "\"current_temperature_topic\": \"%s/%s\"," + "\"min_temp\": 36," + "\"max_temp\": 104," + "\"mode_command_topic\": \"%s/%s/set\"," + "\"mode_state_topic\": \"%s/%s/enabled\"," + "\"mode_state_template\": \"{%% set values = { '0':'off', '1':'heat'} %%}{{ values[value] if value in values.keys() else 'off' }}\"," + "\"temperature_command_topic\": \"%s/%s/setpoint/set\"," + "\"temperature_state_topic\": \"%s/%s/setpoint\"," + "\"temperature_state_template\": \"{{ value_json }}\"," + "\"qos\": 1," + "\"retain\": false" +"}"; + +const char *HASSIO_FREEZE_PROTECT_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"climate\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"Freeze Protect\"," + "\"modes\": [\"off\", \"auto\"]," + "\"send_if_off\": true," + "\"initial\": 34," + "\"payload_on\": \"1\"," + "\"payload_off\": \"0\"," + "\"current_temperature_topic\": \"%s/%s\"," + "\"min_temp\": 34," + "\"max_temp\": 42," + "\"mode_state_topic\": \"%s/%s\"," + "\"mode_state_template\": \"{%% set values = { '0':'off', '1':'auto'} %%}{{ values[value] if value in values.keys() else 'off' }}\"," + "\"temperature_command_topic\": \"%s/%s/setpoint/set\"," + "\"temperature_state_topic\": \"%s/%s/setpoint\"," + "\"temperature_state_template\": \"{{ value_json }}\"" +"}"; + +const char *HASSIO_SWG_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"humidifier\"," + "\"device_class\": \"humidifier\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"Salt Water Generator\"," + "\"state_topic\": \"%s/%s\"," + "\"state_template\": \"{%% set values = { '0':'off', '2':'on'} %%}{{ values[value] if value in values.keys() else 'off' }}\"," + "\"command_topic\": \"%s/%s/set\"," + "\"current_humidity_topic\": \"%s/%s\"," + "\"target_humidity_command_topic\": \"%s/%s/set\"," + "\"target_humidity_state_topic\": \"%s/%s\"," + "\"payload_on\": \"2\"," + "\"payload_off\": \"0\"," + "\"min_humidity\":0," + "\"max_humidity\":100," + "\"optimistic\": false" +"}"; + +// Need to add timer attributes to the switches, once figure out how to use in homeassistant +// ie aqualinkd/Filter_Pump/timer/duration + +const char *HASSIO_SWITCH_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"switch\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"state_topic\": \"%s/%s\"," + "\"command_topic\": \"%s/%s/set\"," + "\"json_attributes_topic\": \"%s/%s/delay\"," + "\"json_attributes_topic\": \"%s/%s/delay\"," + "\"json_attributes_template\": \"{{ {'delay': value|int} | tojson }}\"," + "\"payload_on\": \"1\"," + "\"payload_off\": \"0\"," + "\"qos\": 1," + "\"retain\": false" +"}"; + +const char *HASSIO_TEMP_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s Temp\"," + "\"state_topic\": \"%s/%s\"," + "\"value_template\": \"{{ value_json }}\"," + "\"unit_of_measurement\": \"°F\"," + "\"device_class\": \"temperature\"," + "\"icon\": \"%s\"" +"}"; + +const char *HASSIO_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"state_topic\": \"%s/%s\"," + "\"value_template\": \"{{ value_json }}\"," + "\"unit_of_measurement\": \"%s\"," + "\"icon\": \"%s\"" +"}"; + +const char *HASSIO_ONOFF_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"state_topic\": \"%s/%s\"," + "\"payload_on\": \"1\"," + "\"payload_off\": \"0\"," + "\"value_template\": \"{%% set values = { '0':'off', '1':'on'} %%}{{ values[value] if value in values.keys() else 'off' }}\"," + "\"icon\": \"%s\"" +"}"; + +const char *HASSIO_PUMP_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_%s%d_%s\"," + "\"name\": \"%s %s %s\"," + "\"state_topic\": \"%s/%s%s\"," + "\"value_template\": \"{{ value_json }}\"," + "\"unit_of_measurement\": \"%s\"," + "\"icon\": \"mdi:pump\"" +"}"; + +const char *HASSIO_TEXT_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"state_topic\": \"%s/%s\"," + "\"icon\": \"mdi:card-text\"" +"}"; + +const char *HASSIO_SWG_TEXT_SENSOR_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"availability\": {" HASS_AVAILABILITY "}," + "\"type\": \"sensor\"," + "\"unique_id\": \"%s\"," + "\"name\": \"%s\"," + "\"state_topic\": \"%s/%s\"," + "\"payload_on\": \"0\"," + "\"payload_off\": \"255\"," + "\"value_template\": \"{%% set values = { '0':'Generating'," + "'1':'No flow', " + "'2':'low salt', " + "'4':'high salt', " + "'8':'clean cell', " + "'9':'turning off', " + "'16':'high current', " + "'32':'low volts', " + "'64':'low temp', " + "'128':'Check PCB'," + "'253':'General Fault'," + "'254':'Unknown'," + "'255':'Off'} %%}" + "{{ values[value] if value in values.keys() else 'off' }}\"," + "\"icon\": \"mdi:card-text\"" +"}"; + +/* +char *HASSIO_TEXT_DISCOVER = "{" + "\"device\": {" HASS_DEVICE "}," + "\"type\": \"text\"," + "\"unique_id\": \"aqualinkd_%s\"," + "\"name\": \"%s\"," + "\"command_topic\": \"junk/null\"," + "\"state_topic\": \"%s/%s\"" +"}"; +*/ +/* +char *HASSIO_SERVICE_MODE_DISCOVER = "{" + "\"type\": \"sensor\"," + "\"unique_id\": \"aqualinkd_Service_Mode\"," + "\"name\": \"Service Mode\"," + "\"state_topic\": \"aqualinkd/Service_Mode\"," + "\"value_template\": \"{% set values = { '0':'off', '1':'on'} %}{{ values[value] if value in values.keys() else 'off' }}\"," + "\"icon\": \"mdi:account-wrench\"" +"}"; +*/ + +/* +Others to add + +{ + "type": "text", + "unique_id": "display", + "name": "AqualinkD Display Message", + "command_topic": "junk/null", + "state_topic": "aqualinkd/Display_Message" +} + +{ + "type": "sensor", + "unique_id": "Service_Mode", + "name": "Service Mode", + "state_topic": "aqualinkd/Service_Mode", + "value_template": "{% set values = { '0':'off', '1':'on'} %}{{ values[value] if value in values.keys() else 'off' }}", + "icon": "mdi:account-wrench" +} + +mdi:pump + +mdi:water-outline // orph, ph, ppm, swg + +mdi:water-thermometer // water +mdi:thermometer // air + +mdi:account-wrench // server +*/ + + +void publish_mqtt_hassio_discover(struct aqualinkdata *aqdata, struct mg_connection *nc) +{ + if (_aqconfig_.mqtt_hass_discover_topic == NULL) + return; + + int i; + char msg[JSON_STATUS_SIZE]; + char topic[250]; + char idbuf[128]; + + LOG(NET_LOG,LOG_INFO, "MQTT: Publishing discover messages to '%s'\n", _aqconfig_.mqtt_hass_discover_topic); + + for (i=0; i < aqdata->total_buttons; i++) + { // Heaters + if ( (strcmp(BTN_POOL_HTR,aqdata->aqbuttons[i].name) == 0 && (_aqconfig_.force_ps_setpoints || aqdata->pool_htr_set_point != TEMP_UNKNOWN)) || + (strcmp(BTN_SPA_HTR,aqdata->aqbuttons[i].name)==0 && (_aqconfig_.force_ps_setpoints || aqdata->spa_htr_set_point != TEMP_UNKNOWN)) ) { + sprintf(msg,HASSIO_CLIMATE_DISCOVER, + _aqconfig_.mqtt_aq_topic, + aqdata->aqbuttons[i].name, + aqdata->aqbuttons[i].label, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,(strcmp(BTN_POOL_HTR,aqdata->aqbuttons[i].name) == 0)?POOL_TEMP_TOPIC:SPA_TEMP_TOPIC, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name); + sprintf(topic, "%s/climate/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, aqdata->aqbuttons[i].name); + send_mqtt(nc, topic, msg); + } else if (strcmp("NONE",aqdata->aqbuttons[i].label) != 0 ) { + // Switches + //sprintf(msg,"{\"type\": \"switch\",\"unique_id\": \"%s\",\"name\": \"%s\",\"state_topic\": \"aqualinkd/%s\",\"command_topic\": \"aqualinkd/%s/set\",\"json_attributes_topic\": \"aqualinkd/%s/delay\",\"json_attributes_topic\": \"aqualinkd/%s/delay\",\"json_attributes_template\": \"{{ {'delay': value|int} | tojson }}\",\"payload_on\": \"1\",\"payload_off\": \"0\",\"qos\": 1,\"retain\": false}" , + sprintf(msg, HASSIO_SWITCH_DISCOVER, + _aqconfig_.mqtt_aq_topic, + aqdata->aqbuttons[i].name, + aqdata->aqbuttons[i].label, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name, + _aqconfig_.mqtt_aq_topic,aqdata->aqbuttons[i].name); + sprintf(topic, "%s/switch/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, aqdata->aqbuttons[i].name); + send_mqtt(nc, topic, msg); + } + } + + // Freezeprotect + if ( _aqconfig_.force_frzprotect_setpoints || (aqdata->frz_protect_set_point != TEMP_UNKNOWN && aqdata->air_temp != TEMP_UNKNOWN) ) { + sprintf(msg, HASSIO_FREEZE_PROTECT_DISCOVER, + _aqconfig_.mqtt_aq_topic, + FREEZE_PROTECT, + _aqconfig_.mqtt_aq_topic,AIR_TEMP_TOPIC, + _aqconfig_.mqtt_aq_topic,FREEZE_PROTECT_ENABELED, + _aqconfig_.mqtt_aq_topic,FREEZE_PROTECT, + _aqconfig_.mqtt_aq_topic,FREEZE_PROTECT, + _aqconfig_.mqtt_aq_topic,FREEZE_PROTECT + ); + sprintf(topic, "%s/climate/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, FREEZE_PROTECT); + send_mqtt(nc, topic, msg); + } + + + // SWG + if ( aqdata->swg_percent != TEMP_UNKNOWN ) { + + sprintf(msg, HASSIO_SWG_DISCOVER, + _aqconfig_.mqtt_aq_topic, + SWG_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_PERCENT_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_PERCENT_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_PERCENT_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_PERCENT_TOPIC + ); + sprintf(topic, "%s/humidifier/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, SWG_TOPIC); + send_mqtt(nc, topic, msg); + + rsm_char_replace(idbuf, SWG_BOOST_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SWITCH_DISCOVER, + _aqconfig_.mqtt_aq_topic, + idbuf, + "SWG Boost", + _aqconfig_.mqtt_aq_topic,SWG_BOOST_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_BOOST_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_BOOST_TOPIC, + _aqconfig_.mqtt_aq_topic,SWG_BOOST_TOPIC); + sprintf(topic, "%s/switch/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + + rsm_char_replace(idbuf, SWG_PERCENT_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,idbuf,"SWG Percent",_aqconfig_.mqtt_aq_topic,SWG_PERCENT_TOPIC, "%", "mdi:water-outline"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + + rsm_char_replace(idbuf, SWG_PPM_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,idbuf,"SWG PPM",_aqconfig_.mqtt_aq_topic,SWG_PPM_TOPIC, "ppm", "mdi:water-outline"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + + rsm_char_replace(idbuf, SWG_EXTENDED_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SWG_TEXT_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,idbuf,"SWG Msg",_aqconfig_.mqtt_aq_topic,SWG_EXTENDED_TOPIC); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + /* + // SWG Display message (move to SWG area) + rsm_char_replace(idbuf, SWG_STATUS_MSG_TOPIC, "/", "_"); + sprintf(msg, HASSIO_TEXT_SENSOR_DISCOVER,idbuf,"SWG Msg",_aqconfig_.mqtt_aq_topic,SWG_STATUS_MSG_TOPIC); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + */ + } + + // Temperatures + sprintf(msg, HASSIO_TEMP_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,"Pool","Pool",_aqconfig_.mqtt_aq_topic,POOL_TEMP_TOPIC,"mdi:water-thermometer"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Pool"); + send_mqtt(nc, topic, msg); + + sprintf(msg, HASSIO_TEMP_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,"Spa","Spa",_aqconfig_.mqtt_aq_topic,SPA_TEMP_TOPIC,"mdi:water-thermometer"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Spa"); + send_mqtt(nc, topic, msg); + + sprintf(msg, HASSIO_TEMP_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,"Air","Air",_aqconfig_.mqtt_aq_topic,AIR_TEMP_TOPIC,"mdi:thermometer"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Air"); + send_mqtt(nc, topic, msg); + + // Pumps + for (i=0; i < aqdata->num_pumps; i++) { + int pn=i+1; + if (aqdata->pumps[i].pumpType==VFPUMP) { + // We have GPM info + sprintf(msg, HASSIO_PUMP_SENSOR_DISCOVER, + _aqconfig_.mqtt_aq_topic, + "Pump",pn,"GPM", + aqdata->pumps[i].button->label,(rsm_strncasestr(aqdata->pumps[i].button->label,"pump",strlen(aqdata->pumps[i].button->label))!=NULL)?"":"Pump","GPM", + _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name ,PUMP_GPM_TOPIC, + "GPM"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s%d_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Pump",pn,"GPM"); + send_mqtt(nc, topic, msg); + } + sprintf(msg, HASSIO_PUMP_SENSOR_DISCOVER, + _aqconfig_.mqtt_aq_topic, + "Pump",pn,"RPM", + aqdata->pumps[i].button->label,(rsm_strncasestr(aqdata->pumps[i].button->label,"pump",strlen(aqdata->pumps[i].button->label))!=NULL)?"":"Pump","RPM", + _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name ,PUMP_RPM_TOPIC, + "RPM"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s%d_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Pump",pn,"RPM"); + send_mqtt(nc, topic, msg); + + sprintf(msg, HASSIO_PUMP_SENSOR_DISCOVER, + _aqconfig_.mqtt_aq_topic, + "Pump",pn,"Watts", + aqdata->pumps[i].button->label,(rsm_strncasestr(aqdata->pumps[i].button->label,"pump",strlen(aqdata->pumps[i].button->label))!=NULL)?"":"Pump","Watts", + _aqconfig_.mqtt_aq_topic,aqdata->pumps[i].button->name ,PUMP_WATTS_TOPIC, + "Watts"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s%d_%s/config", _aqconfig_.mqtt_hass_discover_topic, "Pump",pn,"Watts"); + send_mqtt(nc, topic, msg); + } + + // Chem feeder (ph/orp) + if (_aqconfig_.force_chem_feeder || aqdata->ph != TEMP_UNKNOWN) { + rsm_char_replace(idbuf, CHEM_PH_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,idbuf,"Water Chemistry pH",_aqconfig_.mqtt_aq_topic,CHEM_PH_TOPIC, "pH", "mdi:water-outline"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + } + + if (_aqconfig_.force_chem_feeder || aqdata->orp != TEMP_UNKNOWN) { + rsm_char_replace(idbuf, CHEM_ORP_TOPIC, "/", "_"); + sprintf(msg, HASSIO_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,idbuf,"Water Chemistry ORP",_aqconfig_.mqtt_aq_topic,CHEM_ORP_TOPIC, "orp", "mdi:water-outline"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, idbuf); + send_mqtt(nc, topic, msg); + } + + // Misc stuff + sprintf(msg, HASSIO_ONOFF_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,SERVICE_MODE_TOPIC,"Service Mode",_aqconfig_.mqtt_aq_topic,SERVICE_MODE_TOPIC, "mdi:account-wrench"); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, SERVICE_MODE_TOPIC); + send_mqtt(nc, topic, msg); + + /* // Leave below if we decide to go back to a text box + sprintf(msg, HASSIO_TEXT_DISCOVER,DISPLAY_MSG_TOPIC,"Display Messages",_aqconfig_.mqtt_aq_topic,DISPLAY_MSG_TOPIC); + sprintf(topic, "%s/text/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, DISPLAY_MSG_TOPIC); + */ + // It actually works better posting this to sensor and not text. + sprintf(msg, HASSIO_TEXT_SENSOR_DISCOVER,_aqconfig_.mqtt_aq_topic,DISPLAY_MSG_TOPIC,"Display Msg",_aqconfig_.mqtt_aq_topic,DISPLAY_MSG_TOPIC); + sprintf(topic, "%s/sensor/aqualinkd/aqualinkd_%s/config", _aqconfig_.mqtt_hass_discover_topic, DISPLAY_MSG_TOPIC); + send_mqtt(nc, topic, msg); + + + +} \ No newline at end of file diff --git a/hassio.h b/hassio.h new file mode 100644 index 0000000..ad9fe2f --- /dev/null +++ b/hassio.h @@ -0,0 +1,8 @@ +#ifndef HASSIO_H_ +#define HASSIO_H_ + + + +void publish_mqtt_hassio_discover(struct aqualinkdata *aqdata, struct mg_connection *nc); + +#endif // HASSIO_H_ \ No newline at end of file diff --git a/iaqtouch.c b/iaqtouch.c index 7b17c31..bb1a035 100644 --- a/iaqtouch.c +++ b/iaqtouch.c @@ -16,6 +16,7 @@ #include #include +#include #include "aq_serial.h" #include "aqualink.h" @@ -69,14 +70,15 @@ unsigned char _lastMsgType = 0x00; //unsigned char _last_kick_type = -1; int _deviceStatusLines = 0; +char _homeStatus[IAQ_STATUS_PAGE_LINES][AQ_MSGLEN+1]; char _deviceStatus[IAQ_STATUS_PAGE_LINES][AQ_MSGLEN+1]; char _tableInformation[IAQ_MSG_TABLE_LINES][IAQT_TABLE_MSGLEN+1]; struct iaqt_page_button _pageButtons[IAQ_PAGE_BUTTONS]; +struct iaqt_page_button _homeButtons[IAQ_PAGE_BUTTONS]; -// Need to cache these two pages, as only get updates after initial load. -struct iaqt_page_button _devicePageButtons[IAQ_PAGE_BUTTONS]; -struct iaqt_page_button _devicePage2Buttons[IAQ_PAGE_BUTTONS]; -struct iaqt_page_button _deviceSystemSetupButtons[IAQ_PAGE_BUTTONS]; +// Need to cache these pages, as only get updates after initial load. +struct iaqt_page_button _devicePageButtons[3][IAQ_PAGE_BUTTONS]; +struct iaqt_page_button _deviceSystemSetupButtons[3][IAQ_PAGE_BUTTONS]; unsigned char iaqtLastMsg() { @@ -110,6 +112,11 @@ unsigned char iaqtCurrentPage() { return _currentPage; } +unsigned char iaqtCurrentPageLoading() +{ + return _currentPageLoading; +} + const char *iaqtGetMessageLine(int index) { if (index < IAQ_STATUS_PAGE_LINES) @@ -129,12 +136,20 @@ struct iaqt_page_button *iaqtFindButtonByIndex(int index) { struct iaqt_page_button *buttons; // NSF Need to merge this from iaqtFindButtonByLabel function - if (_currentPage == IAQ_PAGE_DEVICES ) - buttons = _devicePageButtons; - else if (_currentPage == IAQ_PAGE_DEVICES2 ) - buttons = _devicePage2Buttons; + if (_currentPage == IAQ_PAGE_DEVICES) + buttons = _devicePageButtons[0]; + else if (_currentPage == IAQ_PAGE_DEVICES2) + buttons = _devicePageButtons[1]; + else if (_currentPage == IAQ_PAGE_DEVICES3) + buttons = _devicePageButtons[2]; else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP ) - buttons = _deviceSystemSetupButtons; + buttons = _deviceSystemSetupButtons[0]; + else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP2 ) + buttons = _deviceSystemSetupButtons[1]; + else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP3 ) + buttons = _deviceSystemSetupButtons[2]; + else if (_currentPage == IAQ_PAGE_HOME ) + buttons = _homeButtons; else buttons = _pageButtons; @@ -145,16 +160,24 @@ struct iaqt_page_button *iaqtFindButtonByIndex(int index) { return NULL; } -struct iaqt_page_button *iaqtFindButtonByLabel(char *label) { +struct iaqt_page_button *iaqtFindButtonByLabel(const char *label) { int i; struct iaqt_page_button *buttons; - if (_currentPage == IAQ_PAGE_DEVICES ) - buttons = _devicePageButtons; - else if (_currentPage == IAQ_PAGE_DEVICES2 ) - buttons = _devicePage2Buttons; + if (_currentPage == IAQ_PAGE_DEVICES) + buttons = _devicePageButtons[0]; + else if (_currentPage == IAQ_PAGE_DEVICES2) + buttons = _devicePageButtons[1]; + else if (_currentPage == IAQ_PAGE_DEVICES3) + buttons = _devicePageButtons[2]; else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP ) - buttons = _deviceSystemSetupButtons; + buttons = _deviceSystemSetupButtons[0]; + else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP2 ) + buttons = _deviceSystemSetupButtons[1]; + else if (_currentPage == IAQ_PAGE_SYSTEM_SETUP3 ) + buttons = _deviceSystemSetupButtons[2]; + else if (_currentPage == IAQ_PAGE_HOME ) + buttons = _homeButtons; else buttons = _pageButtons; @@ -237,8 +260,10 @@ void processPageMessage(unsigned char *message, int length) LOG(IAQT_LOG,LOG_ERR, "Run out of IAQT message buffer, need %d have %d\n",(int)message[PKT_IAQT_MSGINDX],IAQ_STATUS_PAGE_LINES); return; } - // 2nd page of device status doesn;t gine us new page message - if (_currentPageLoading == IAQ_PAGE_STATUS || _currentPage == IAQ_PAGE_STATUS) { + + if (_currentPageLoading == IAQ_PAGE_HOME || _currentPage == IAQ_PAGE_HOME) { + rsm_strncpy(_homeStatus[(int)message[PKT_IAQT_MSGINDX]], &message[PKT_IAQT_MSGDATA], AQ_MSGLEN, length-PKT_IAQT_MSGDATA-3); + } else if (_currentPageLoading == IAQ_PAGE_STATUS || _currentPage == IAQ_PAGE_STATUS) { // 2nd page of device status doesn;t gine us new page message //sprintf(_deviceStatus[(int)message[4]], message[5], AQ_MSGLEN); //strncpy(_deviceStatus[(int)message[PKT_IAQT_MSGINDX]], (char *)message + PKT_IAQT_MSGDATA, AQ_MSGLEN); rsm_strncpy(_deviceStatus[(int)message[PKT_IAQT_MSGINDX]], &message[PKT_IAQT_MSGDATA], AQ_MSGLEN, length-PKT_IAQT_MSGDATA-3); @@ -259,19 +284,30 @@ void processTableMessage(unsigned char *message, int length) LOG(IAQT_LOG,LOG_ERR, "Run out of IAQT table buffer, need %d have %d\n",(int)message[5],IAQ_MSG_TABLE_LINES); } -void processPageButton(unsigned char *message, int length) +void processPageButton(unsigned char *message, int length, struct aqualinkdata *aq_data) { struct iaqt_page_button *button; int index = (int)message[PKT_IAQT_BUTINDX]; - if (_currentPageLoading == IAQ_PAGE_DEVICES ) - button = &_devicePageButtons[index]; - else if (_currentPageLoading == IAQ_PAGE_DEVICES2 ) - button = &_devicePage2Buttons[index]; - else if (_currentPageLoading == IAQ_PAGE_SYSTEM_SETUP ) - button = &_deviceSystemSetupButtons[index]; - else + if (_currentPageLoading == IAQ_PAGE_DEVICES) + button = &_devicePageButtons[0][index]; + else if (_currentPageLoading == IAQ_PAGE_DEVICES2) + button = &_devicePageButtons[1][index]; + else if (_currentPageLoading == IAQ_PAGE_DEVICES3) + button = &_devicePageButtons[2][index]; + else if (_currentPageLoading == IAQ_PAGE_SYSTEM_SETUP) + button = &_deviceSystemSetupButtons[0][index]; + else if (_currentPageLoading == IAQ_PAGE_SYSTEM_SETUP2) + button = &_deviceSystemSetupButtons[1][index]; + else if (_currentPageLoading == IAQ_PAGE_SYSTEM_SETUP3) + button = &_deviceSystemSetupButtons[2][index]; + else if (_currentPageLoading == IAQ_PAGE_HOME ) + button = &_homeButtons[index]; + else { button = &_pageButtons[index]; + // if _currentPageLoading = 0x00 then we should use current page + LOG(IAQT_LOG,LOG_INFO, "Not sure where to add Button %d %s - LoadingPage = %s\n",index,button->name,iaqt_page_name(_currentPageLoading)); + } button->state = message[PKT_IAQT_BUTSTATE]; button->type = message[PKT_IAQT_BUTTYPE]; @@ -285,19 +321,74 @@ void processPageButton(unsigned char *message, int length) // This doesn't work with return which is 0x00 //strncpy(&button->name, (char *)message + PKT_IAQT_BUTDATA, AQ_MSGLEN); + memset(button->name, 0, sizeof(button->name)); rsm_strncpy_nul2sp((char *)button->name, &message[PKT_IAQT_BUTDATA], IAQT_MSGLEN, length-PKT_IAQT_BUTDATA-3); - LOG(IAQT_LOG,LOG_DEBUG, "Added Button %d %s\n",index,button->name); + LOG(IAQT_LOG,LOG_DEBUG, "Added Button %d %s - LoadingPage = %s\n",index,button->name,iaqt_page_name(_currentPageLoading)); -/* - _pageButtons[index].state = (int)message[5]; - _pageButtons[index].type = (int)message[7]; - _pageButtons[index].unknownByte = (int)message[6]; - // This doesn't work with return which is 0x00 - strncpy(&_pageButtons[index].name, (char *)message + 8, AQ_MSGLEN); + // This get's called or every device state change in PDA mode, since we page over all the devices. + // So capture and update the device state - LOG(IAQT_LOG,LOG_NOTICE, "Added Button %d %s\n",index,_pageButtons[index].name); -*/ + if (isPDA_PANEL || PANEL_SIZE() >= 16 ) { + int start = 0; + int end = aq_data->total_buttons; + +#ifdef AQ_RS16 + if (PANEL_SIZE() >= 16) { + start = aq_data->rs16_vbutton_start; + end = aq_data->rs16_vbutton_end + 1; // Using < in comparison and not <=, so +1 +//printf("************ CHECK RS16 BUTTONS ************\n"); + } +#endif + + for (int i = start; i < end; i++) + { + + int rtn=-1; + //LOG(IAQT_LOG,LOG_DEBUG, "Button compare '%s' to '%s'\n",button->name, aq_data->aqbuttons[i].label); + // If we are loading HOME page then simply button name is the label ie "Aux3" + // If loading DEVICES? page then button name + statusis "Aux3 OFF " + + if (_currentPageLoading == IAQ_PAGE_HOME) + rtn = rsm_strmatch((const char *)button->name, aq_data->aqbuttons[i].label); + else + rtn = rsm_strmatch_ignore((const char *)button->name, aq_data->aqbuttons[i].label,5); // 5 = 3 chars and 2 spaces ' OFF ' + + if (rtn == 0) + { + LOG(IAQT_LOG,LOG_DEBUG, "*** Found Status for %s state 0x%02hhx\n", aq_data->aqbuttons[i].label, button->state); + switch(button->state) { + case 0x00: + if (aq_data->aqbuttons[i].led->state != OFF) { + aq_data->aqbuttons[i].led->state = OFF; + aq_data->updated = true; + } + break; + case 0x01: + if (aq_data->aqbuttons[i].led->state != ON) { + aq_data->aqbuttons[i].led->state = ON; + aq_data->updated = true; + } + break; + case 0x02: + if (aq_data->aqbuttons[i].led->state != FLASH) { + aq_data->aqbuttons[i].led->state = FLASH; + aq_data->updated = true; + } + break; + case 0x03: + if (aq_data->aqbuttons[i].led->state != ENABLE) { + aq_data->aqbuttons[i].led->state = ENABLE; + aq_data->updated = true; + } + break; + default: + LOG(IAQT_LOG,LOG_NOTICE, "Unknown state 0x%02hhx for button %s\n",button->state,button->name); + break; + } + } + } + } } @@ -367,39 +458,45 @@ void passDeviceStatusPage(struct aqualinkdata *aq_data) continue; } else if (rsm_strcmp(_deviceStatus[i],"RPM:") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->rpm = rsm_atoi(&_deviceStatus[i][9]); - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; } else if (rsm_strcmp(_deviceStatus[i],"GPM:") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->gpm = rsm_atoi(&_deviceStatus[i][9]); - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; } else if (rsm_strcmp(_deviceStatus[i],"Watts:") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->watts = rsm_atoi(&_deviceStatus[i][9]); - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; } else if (rsm_strcmp(_deviceStatus[i],"*** Priming ***") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->rpm = PUMP_PRIMING; - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; } else if (rsm_strcmp(_deviceStatus[i],"(Offline)") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->rpm = PUMP_OFFLINE; - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; } else if (rsm_strcmp(_deviceStatus[i],"(Priming Error)") == 0) { - if (pump != NULL) + if (pump != NULL) { pump->rpm = PUMP_ERROR; - else + aq_data->updated = true; + } else LOG(IAQT_LOG,LOG_WARNING, "Got pump message '%s' but can't find pump\n",_deviceStatus[i]); continue; // Need to catch messages like @@ -422,22 +519,27 @@ void passDeviceStatusPage(struct aqualinkdata *aq_data) aq_data->ph = ph; aq_data->orp = orp; } + aq_data->updated = true; LOG(IAQT_LOG,LOG_INFO, "Set Cemlink ORP = %d PH = %f from message '%s'\n",orp,ph,_deviceStatus[i]); } } -#ifdef READ_SWG_FROM_EXTENDED_ID - else if (rsm_strcmp(_deviceStatus[i],"AQUAPURE") == 0) { +//#ifdef READ_SWG_FROM_EXTENDED_ID + else if (isPDA_PANEL) { + if (rsm_strcmp(_deviceStatus[i],"AQUAPURE") == 0) { //aq_data->swg_percent = rsm_atoi(&_deviceStatus[i][9]); if (changeSWGpercent(aq_data, rsm_atoi(&_deviceStatus[i][9]))) LOG(IAQT_LOG,LOG_DEBUG, "Set swg %% to %d from message'%s'\n",aq_data->swg_percent,_deviceStatus[i]); - } else if (rsm_strcmp(_deviceStatus[i],"salt") == 0) { + } else if (rsm_strcmp(_deviceStatus[i],"salt") == 0) { aq_data->swg_ppm = rsm_atoi(&_deviceStatus[i][5]); + aq_data->updated = true; LOG(IAQT_LOG,LOG_DEBUG, "Set swg PPM to %d from message'%s'\n",aq_data->swg_ppm,_deviceStatus[i]); - } else if (rsm_strcmp(_deviceStatus[i],"Boost Pool") == 0) { + } else if (rsm_strcmp(_deviceStatus[i],"Boost Pool") == 0) { aq_data->boost = true; + aq_data->updated = true; // Let RS pickup time remaing message. - } -#endif + } + } +//#endif } // for } @@ -451,9 +553,13 @@ void debugPrintButtons(struct iaqt_page_button buttons[]) } } +//#define member_size(type, member) (sizeof( ((type*)0)->member )) + void processPage(struct aqualinkdata *aq_data) { + //static int _home_cnt = 0; int i; + int dp = 0; LOG(IAQT_LOG,LOG_INFO, "Page: %s | 0x%02hhx\n",iaqt_page_name(_currentPage),_currentPage); @@ -468,18 +574,36 @@ void processPage(struct aqualinkdata *aq_data) debugPrintButtons(_pageButtons); passDeviceStatusPage(aq_data); // If button 1 is type 0x02 then there is a next page. Since status page isn't used for programming, hit the next page button. - if (_pageButtons[1].type == 0x02) + if (_pageButtons[1].type == 0x02) { iaqt_queue_cmd(KEY_IAQTCH_KEY02); - else + } else { iaqt_pump_update(aq_data, -1); // Reset pumps. + if ( (isPDA_PANEL || PANEL_SIZE() >= 16) && !in_iaqt_programming_mode(aq_data) ) { + iaqt_queue_cmd(KEY_IAQTCH_HOME); + } + } break; case IAQ_PAGE_DEVICES: - //LOG(IAQT_LOG,LOG_INFO, "Devices Page #1:-\n"); - debugPrintButtons(_devicePageButtons); - break; case IAQ_PAGE_DEVICES2: - //LOG(IAQT_LOG,LOG_INFO, "Devices Page #2:-\n"); - debugPrintButtons(_devicePage2Buttons); + case IAQ_PAGE_DEVICES3: + if (_currentPage == IAQ_PAGE_DEVICES) + dp = 0; + else if (_currentPage == IAQ_PAGE_DEVICES2) + dp = 1; + else if (_currentPage == IAQ_PAGE_DEVICES3) + dp = 2; + //LOG(IAQT_LOG,LOG_INFO, "Devices Page #1:-\n"); + debugPrintButtons(_devicePageButtons[dp]); + + // If Button 15 has type 0x02 then we have previous, if 0x00 nothing (previous send code KEY_IAQTCH_PREV_PAGE) + // If Button 16 has type 0x03 then we have next, if 0x00 nothing (next send code KEY_IAQTCH_NEXT_PAGE) + if ( (isPDA_PANEL || PANEL_SIZE() >= 16) && !in_iaqt_programming_mode(aq_data) ) { + if (_devicePageButtons[dp][16].type == 0x03) { + iaqt_queue_cmd(KEY_IAQTCH_NEXT_PAGE); + } else { + iaqt_queue_cmd(KEY_IAQTCH_STATUS); + } + } break; case IAQ_PAGE_COLOR_LIGHT: //LOG(IAQT_LOG,LOG_INFO, "Color Light Page :-\n"); @@ -491,15 +615,68 @@ void processPage(struct aqualinkdata *aq_data) if (_deviceStatus[i][0] != 0) LOG(IAQT_LOG,LOG_INFO, "Status page %.2d| %s\n",i,_deviceStatus[i]); - debugPrintButtons(_pageButtons); + for (i=0; i air_temp = atoi(_homeStatus[1]); + LOG(IAQT_LOG,LOG_DEBUG, "Air Temp set to %d\n",aq_data->air_temp); + aq_data->updated = true; + } + if (rsm_strcmp(_homeStatus[4],"Pool Temp") == 0) { + aq_data->pool_temp = atoi(_homeStatus[0]); + LOG(IAQT_LOG,LOG_DEBUG, "Pool Temp set to %d\n",aq_data->air_temp); + aq_data->updated = true; + } else if (rsm_strcmp(_homeStatus[4],"Spa Temp") == 0) { + aq_data->spa_temp = atoi(_homeStatus[0]); + LOG(IAQT_LOG,LOG_DEBUG, "Spa Temp set to %d\n",aq_data->spa_temp); + aq_data->updated = true; + } + } + + //passHomePage(aq_data); + debugPrintButtons(_homeButtons); break; case IAQ_PAGE_SYSTEM_SETUP: //LOG(IAQT_LOG,LOG_INFO, "System Setup :-\n"); - debugPrintButtons(_deviceSystemSetupButtons); + debugPrintButtons(_deviceSystemSetupButtons[0]); + break; + case IAQ_PAGE_SYSTEM_SETUP2: + //LOG(IAQT_LOG,LOG_INFO, "System Setup :-\n"); + debugPrintButtons(_deviceSystemSetupButtons[1]); + break; + case IAQ_PAGE_SYSTEM_SETUP3: + //LOG(IAQT_LOG,LOG_INFO, "System Setup :-\n"); + debugPrintButtons(_deviceSystemSetupButtons[2]); break; case IAQ_PAGE_SET_VSP: debugPrintButtons(_pageButtons); break; + case IAQ_PAGE_HELP: + /* + Info: iAQ Touch: Table Messages 01| Interface: AquaLink Touch + Info: iAQ Touch: Table Messages 02| Model: RS-8 Combo + Info: iAQ Touch: Table Messages 03| AquaLink: REV T.0.1 + Info: iAQ Touch: Table Messages 04| CPU p/n: B0029221 + Info: iAQ Touch: Table Messages 05| TL Rev: + */ + if (isPDA_PANEL && ((char *)_tableInformation[03]) > 0) { + if ( rsm_get_revision(aq_data->revision,(char *)_tableInformation[3], sizeof(aq_data->revision) ) == TRUE) { + int len = rsm_get_boardcpu(aq_data->version, sizeof(aq_data->version), (char *)_tableInformation[4], IAQT_TABLE_MSGLEN ); + sprintf(aq_data->version+len, " REV %s",aq_data->revision); + LOG(IAQT_LOG,LOG_NOTICE, "Control Panel revision %s\n", aq_data->revision); + LOG(IAQT_LOG,LOG_NOTICE, "Control Panel version %s\n", aq_data->version); + aq_data->updated = true; + } + } + + break; default: //LOG(IAQT_LOG,LOG_INFO, "** UNKNOWN PAGE 0x%02hhx **\n",_currentPage); @@ -521,11 +698,27 @@ void processPage(struct aqualinkdata *aq_data) bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkdata *aq_data) { + static bool gotInit = false; static int cnt = 0; static bool gotStatus = true; + static char message[AQ_MSGLONGLEN + 1]; + bool fake_pageend = false; //char buff[1024]; + // NSF Take this out + + if ( packet[3] != CMD_IAQ_POLL && getLogLevel(IAQT_LOG) >= LOG_DEBUG ) { + //if ( getLogLevel(IAQT_LOG) >= LOG_DEBUG ) { + char buff[1000]; + beautifyPacket(buff, packet, length, false); + LOG(IAQT_LOG,LOG_DEBUG, "Received message : %s", buff); + } + if (packet[PKT_CMD] == CMD_IAQ_PAGE_START) { + // Reset and messages on new page + aq_data->last_display_message[0] = ' '; + aq_data->last_display_message[1] = '\0'; + aq_data->is_display_message_programming = false; LOG(IAQT_LOG,LOG_DEBUG, "Turning IAQ SEND off\n"); set_iaq_cansend(false); _currentPageLoading = packet[PKT_IAQT_PAGTYPE]; @@ -533,6 +726,7 @@ bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkd memset(_pageButtons, 0, IAQ_PAGE_BUTTONS * sizeof(struct iaqt_page_button)); memset(_deviceStatus, 0, sizeof(char) * IAQ_STATUS_PAGE_LINES * AQ_MSGLEN+1 ); memset(_tableInformation, 0, sizeof(char) * IAQ_MSG_TABLE_LINES * AQ_MSGLEN+1 ); + //memset(_devicePageButtons, 0, IAQ_PAGE_BUTTONS * sizeof(struct iaqt_page_button)); // Fix bug with control panel where after a few hours status page disapears and you need to hit menu. if (gotStatus == false) gotStatus = true; @@ -542,17 +736,32 @@ bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkd LOG(IAQT_LOG,LOG_DEBUG, "Turning IAQ SEND on\n"); if (_currentPageLoading != NUL) { _currentPage = _currentPageLoading; - _currentPageLoading = NUL; + //_currentPageLoading = NUL; } else { LOG(IAQT_LOG,LOG_DEBUG, "Page end message without proceding page start, ignoring!\n"); } + + if (isPDA_PANEL) { + // Time is in the page end command + // 1/18/2011 13:42 + //Hex |0x10|0x02|0x33|0x28|0x01|0x12|0x0b|0x0d|0x2a|0xc2|0x10|0x03| + //Dec | 16| 2| 51| 40| 1| 18| 11| 13| 42| 194| 16| 3 + //Ascii | | | 3| (| | | | | *| | | + snprintf(aq_data->date, sizeof(aq_data->date), "%02d/%02d/%02d", packet[4],packet[5],packet[6]); + if (packet[7] <= 12) + snprintf(aq_data->time, sizeof(aq_data->date), "%d:%02d am", packet[7],packet[8]); + else + snprintf(aq_data->time, sizeof(aq_data->date), "%d:%02d pm", (packet[7] - 12),packet[8]); + } + processPage(aq_data); + } else if (packet[PKT_CMD] == CMD_IAQ_TABLE_MSG) { processTableMessage(packet, length); } else if (packet[PKT_CMD] == CMD_IAQ_PAGE_MSG) { processPageMessage(packet, length); } else if (packet[PKT_CMD] == CMD_IAQ_PAGE_BUTTON) { - processPageButton(packet, length); + processPageButton(packet, length, aq_data); // Second page on status doesn't send start & end, but button is message, so use that to kick off next page. if (_currentPage == IAQ_PAGE_STATUS) { /* Notice: Added Button 1 @@ -567,32 +776,71 @@ bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkd // if we get a button with 0x00 state on Light Page, that's the end of page. if (_currentPageLoading == IAQ_PAGE_COLOR_LIGHT) { - if (packet[7] == 0x00) { + if (packet[7] == 0x00 && packet[4] == 0x0e) { // packet[4] is button number 0x0e is 14 (last button) //printf("** MANUAL PAGE END\n"); LOG(IAQT_LOG,LOG_DEBUG, "MANUAL PAGE END\n"); _currentPage = _currentPageLoading; - _currentPageLoading = NUL; + //_currentPageLoading = NUL; processPage(aq_data); set_iaq_cansend(true); + // For programming mode + fake_pageend = true; // Also END page here, as you can send commands. // NEED to rethink this approach. ie, selecting light needs to hold open while showing page, no page end, then select light color, then message "please wait", the finally done } } - } + } else if (isPDA_PANEL && packet[PKT_CMD] == CMD_IAQ_MSG_LONG) { + char *sp; + // Set disply message if PDA panel + memset(message, 0, AQ_MSGLONGLEN + 1); + rsm_strncpy(message, packet + 6, AQ_MSGLONGLEN, length-9); + LOG(IAQT_LOG,LOG_NOTICE, "Popup message '%s'\n",message); + + // Change this message, since you can't press OK. 'Light will turn off in 5 seconds. To change colors press Ok now.' + if ((sp = rsm_strncasestr(message, "To change colors press Ok now", strlen(message))) != NULL) + { + *sp = '\0'; + } + + strcpy(aq_data->last_display_message, message); // Also display the message on web UI + + if (in_programming_mode(aq_data)) { + aq_data->is_display_message_programming = true; + } else { + aq_data->is_display_message_programming = false; + } + /* + for(int i=0; i REQUEST_STATUS_POLL_COUNT && in_programming_mode(aq_data) == false ) { - iaqt_queue_cmd(KEY_IAQTCH_STATUS); + if (isPDA_PANEL || PANEL_SIZE() >= 16) { + iaqt_queue_cmd(KEY_IAQTCH_HOMEP_KEY08); + } else { + iaqt_queue_cmd(KEY_IAQTCH_STATUS); + } gotStatus = false; // Reset if we got status page, for fix panel bug. //aq_programmer(AQ_GET_IAQTOUCH_VSP_ASSIGNMENT, NULL, aq_data); cnt = 0; @@ -600,21 +848,32 @@ bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkd // Fix bug with control panel where after a few hours status page disapears and you need to hit menu. LOG(IAQT_LOG,LOG_INFO, "Overcomming Jandy control panel bug, (missing status, goto menu)\n",cnt); iaqt_queue_cmd(KEY_IAQTCH_HOME); - iaqt_queue_cmd(KEY_IAQTCH_STATUS); + cnt = REQUEST_STATUS_POLL_COUNT - 5; + /* + if (isPDA_PANEL) { + iaqt_queue_cmd(KEY_IAQTCH_HOMEP_KEY08); + } else { + iaqt_queue_cmd(KEY_IAQTCH_STATUS); + } + */ } else if (in_programming_mode(aq_data) == true) { // Set count to something close to above, so we will pull latest info once programming has finished. // This is goot for VSP GPM programming as it takes number of seconds to register once finished programming. // -5 seems to be too quick for VSP/GPM so using 10 cnt = REQUEST_STATUS_POLL_COUNT - 10; } - + // On poll no need to kick programming threads return false; } //debuglogPacket(IAQT_LOG ,packet, length); //_lastMsgType = packet[PKT_CMD]; - set_iaqtouch_lastmsg(packet[PKT_CMD]); + if (fake_pageend){ + set_iaqtouch_lastmsg(CMD_IAQ_PAGE_END); + } else { + set_iaqtouch_lastmsg(packet[PKT_CMD]); + } //debuglogPacket(IAQT_LOG ,packet, length); //beautifyPacket(buff, packet, length); //LOG(IAQT_LOG,LOG_DEBUG, "%s", buff); @@ -623,12 +882,15 @@ bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkd kick_aq_program_thread(aq_data, IAQTOUCH); - return false; + return true; } +//char _namebuf[40]; const char *iaqt_page_name(const unsigned char page) { + static char _namebuf[40]; + switch (page){ case IAQ_PAGE_HOME: return "HOME"; @@ -645,6 +907,9 @@ const char *iaqt_page_name(const unsigned char page) case IAQ_PAGE_DEVICES2: return "Devices #2"; break; + case IAQ_PAGE_DEVICES3: + return "Devices #2"; + break; case IAQ_PAGE_SET_TEMP: return "Set Temp"; break; @@ -678,6 +943,12 @@ const char *iaqt_page_name(const unsigned char page) case IAQ_PAGE_SYSTEM_SETUP: return "System Setup"; break; + case IAQ_PAGE_SYSTEM_SETUP2: + return "System Setup #2"; + break; + case IAQ_PAGE_SYSTEM_SETUP3: + return "System Setup #3"; + break; case IAQ_PAGE_VSP_SETUP: return "VSP Setup"; break; @@ -687,8 +958,13 @@ const char *iaqt_page_name(const unsigned char page) case IAQ_PAGE_LABEL_AUX: return "Label Aux"; break; + case IAQ_PAGE_HELP: + return "Help Page"; + break; default: - return "** Unknown **"; + sprintf (_namebuf,"** Unknown 0x%02hhx **",page); + return _namebuf; + //return "** Unknown **"; break; } return ""; @@ -921,4 +1197,4 @@ Notice: Jandy Packet | HEX: 0x10|0x02|0x31|0x24|0x01|0x00|0x00|0x02|0x00|0x00 Button | 1 | 0x02 | |-| |-| -off- -*/ \ No newline at end of file +*/ diff --git a/iaqtouch.h b/iaqtouch.h index 74b3a4b..61deb7e 100644 --- a/iaqtouch.h +++ b/iaqtouch.h @@ -15,8 +15,9 @@ struct iaqt_page_button { bool process_iaqtouch_packet(unsigned char *packet, int length, struct aqualinkdata *aq_data); unsigned char iaqtThreadKickType(); unsigned char iaqtCurrentPage(); +unsigned char iaqtCurrentPageLoading(); bool wasiaqtThreadKickTypePage(); -struct iaqt_page_button *iaqtFindButtonByLabel(char *label); +struct iaqt_page_button *iaqtFindButtonByLabel(const char *label); struct iaqt_page_button *iaqtFindButtonByIndex(int index); const char *iaqtGetMessageLine(int index); const char *iaqtGetTableInfoLine(int index); diff --git a/iaqtouch_aq_programmer.c b/iaqtouch_aq_programmer.c index 7fd3b10..86bff4a 100644 --- a/iaqtouch_aq_programmer.c +++ b/iaqtouch_aq_programmer.c @@ -32,6 +32,7 @@ #include "config.h" #include "devices_jandy.h" #include "packetLogger.h" +#include "color_lights.h" // System Page is obfiously fixed and not dynamic loaded, so set buttons to stop confustion. @@ -98,6 +99,12 @@ void waitfor_iaqt_queue2empty() delay(PROGRAMMING_POLL_DELAY_TIME); } + // Initial startup can take some time, _cansend should be false during this time. + // If we start programming before we receive the first status page, nothing works, this forces that wait + while(_cansend == false) { + delay(PROGRAMMING_POLL_DELAY_TIME * 2); + } + if (_iaqt_pgm_command != NUL) { // Wait for longer interval while ( (_iaqt_pgm_command != NUL) && ( i++ < PROGRAMMING_POLL_COUNTER * 2 ) ) { @@ -167,9 +174,64 @@ bool waitfor_iaqt_ctrl_queue2empty() } return true; } +/* +unsigned const char _waitfor_iaqt_nextPage(struct aqualinkdata *aq_data, int numMessageReceived) { + + waitfor_iaqt_queue2empty(); + + int i=0; + + pthread_mutex_lock(&aq_data->active_thread.thread_mutex); + + while( ++i <= numMessageReceived) + { + //LOG(IAQT_LOG,LOG_DEBUG, "waitfor_iaqt_nextPage (%d of %d)\n",i,numMessageReceived); + pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); + if(wasiaqtThreadKickTypePage()) break; + } + + LOG(IAQT_LOG,LOG_DEBUG, "waitfor_iaqt_nextPage finished in (%d of %d)\n",i,numMessageReceived); + + pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); + + if(wasiaqtThreadKickTypePage()) + return iaqtCurrentPage(); + else + return NUL; + +} + +unsigned const char shortwaitfor_iaqt_nextPage(struct aqualinkdata *aq_data) { + return _waitfor_iaqt_nextPage(aq_data, 3); +} +*/ +unsigned const char waitfor_iaqt_messages(struct aqualinkdata *aq_data, int numMessageReceived) { + //return _waitfor_iaqt_nextPage(aq_data, 30); + + waitfor_iaqt_queue2empty(); + + int i=0; + + LOG(IAQT_LOG,LOG_DEBUG, "waitfor_iaqt_messages (%d of %d)\n",i,numMessageReceived); + + pthread_mutex_lock(&aq_data->active_thread.thread_mutex); + + while( ++i <= numMessageReceived) + { + //LOG(IAQT_LOG,LOG_DEBUG, "waitfor_iaqt_nextPage (%d of %d)\n",i,numMessageReceived); + pthread_cond_wait(&aq_data->active_thread.thread_cond, &aq_data->active_thread.thread_mutex); + + } + + LOG(IAQT_LOG,LOG_DEBUG, "waitfor_iaqt_messages finished in (%d of %d)\n",i,numMessageReceived); + pthread_mutex_unlock(&aq_data->active_thread.thread_mutex); + + return iaqtLastMsg(); +} unsigned const char waitfor_iaqt_nextPage(struct aqualinkdata *aq_data) { + //return _waitfor_iaqt_nextPage(aq_data, 30); waitfor_iaqt_queue2empty(); @@ -193,9 +255,10 @@ unsigned const char waitfor_iaqt_nextPage(struct aqualinkdata *aq_data) { return iaqtCurrentPage(); else return NUL; - } + + unsigned const char waitfor_iaqt_nextMessage(struct aqualinkdata *aq_data, const unsigned char msg_type) { waitfor_iaqt_queue2empty(); @@ -317,7 +380,8 @@ bool goto_iaqt_page(const unsigned char pageID, struct aqualinkdata *aq_data) { LOG(IAQT_LOG, LOG_DEBUG, "IAQ Touch got to Device page\n"); return true; } else if (pageID == IAQ_PAGE_MENU || pageID == IAQ_PAGE_SET_TEMP || pageID == IAQ_PAGE_SET_TIME || pageID == IAQ_PAGE_SET_SWG || - pageID == IAQ_PAGE_SYSTEM_SETUP || pageID == IAQ_PAGE_FREEZE_PROTECT || pageID == IAQ_PAGE_LABEL_AUX || pageID == IAQ_PAGE_VSP_SETUP) { + pageID == IAQ_PAGE_SYSTEM_SETUP || pageID == IAQ_PAGE_FREEZE_PROTECT || pageID == IAQ_PAGE_LABEL_AUX || + pageID == IAQ_PAGE_VSP_SETUP) { // All other pages require us to go to Menu page send_aqt_cmd(KEY_IAQTCH_MENU); if (waitfor_iaqt_nextPage(aq_data) != IAQ_PAGE_MENU) { @@ -388,8 +452,14 @@ bool goto_iaqt_page(const unsigned char pageID, struct aqualinkdata *aq_data) { button = iaqtFindButtonByLabel(menuText); if (button == NULL) { - LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did not find '%s' button on page setup\n", menuText); - return false; + //send_aqt_cmd(KEY_IAQTCH_NEXT_PAGE); + // Try Next Page + //unsigned char page = waitfor_iaqt_nextPage(aq_data); + //LOG(IAQT_LOG, LOG_ERR, "PAGE RETURN IS 0x%02hhx\n",page); + //if (waitfor_iaqt_nextPage(aq_data) != pageID) { + LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did not find '%s' button on page setup\n", menuText); + return false; + //} } // send_aqt_cmd(KEY_IAQTCH_KEY01); send_aqt_cmd(button->keycode); @@ -406,6 +476,207 @@ bool goto_iaqt_page(const unsigned char pageID, struct aqualinkdata *aq_data) { return false; } +void *set_aqualink_iaqtouch_device_on_off( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + char *buf = (char*)threadCtrl->thread_args; + //char device_name[15]; + struct iaqt_page_button *button; + + unsigned int device = atoi(&buf[0]); + unsigned int state = atoi(&buf[5]); + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_IAQTOUCH_DEVICE_ON_OFF); + + if (device > aq_data->total_buttons) { + LOG(IAQT_LOG,LOG_ERR, "(PDA mode) Device On/Off :- bad device number '%d'\n",device); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + LOG(IAQT_LOG,LOG_INFO, "PDA Device On/Off, device '%s', state %d\n",aq_data->aqbuttons[device].label,state); + + // See if it's on the current page + button = iaqtFindButtonByLabel(aq_data->aqbuttons[device].label); + + if (button == NULL) { + // No luck, go to the device page + if ( goto_iaqt_page(IAQ_PAGE_DEVICES, aq_data) == false ) + goto f_end; + + button = iaqtFindButtonByLabel(aq_data->aqbuttons[device].label); + + // If not found see if page has next + if (button == NULL && iaqtFindButtonByIndex(16)->type == 0x03 ) { + iaqt_queue_cmd(KEY_IAQTCH_NEXT_PAGE); + waitfor_iaqt_nextPage(aq_data); + // This will fail, since not looking at device page 2 buttons + button = iaqtFindButtonByLabel(aq_data->aqbuttons[device].label); + } + } + + if (button == NULL) { + LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did not find '%s' button on device list\n", aq_data->aqbuttons[device].label); + goto f_end; + } + + send_aqt_cmd(button->keycode); + //LOG(IAQT_LOG, LOG_ERR, "******* CURRENT MENU '0x%02hhx' *****\n",iaqtCurrentPage()); + // NSF NEED TO CHECK FOR POPUP MESSAGE, AND KILL IT. + //page IAQ_PAGE_SET_TEMP hit button 0 + //page IAQ_PAGE_COLOR_LIGHT hit button ??????? + // Heater popup can be cleared with a home button and still turn on. + // Color light can be cleared with a home button, but won;t turn on. + + waitfor_iaqt_queue2empty(); + //waitfor_iaqt_messages(aq_data,1); + + // OR maybe use waitfor_iaqt_messages(aq_data,1) + + // Turn spa on when pump off, ned to remove message "spa will turn on after safty delay", home doesn't clear. + send_aqt_cmd(KEY_IAQTCH_HOME); + + // Turn spa off need to read message if heater is on AND hit ok...... + + f_end: + goto_iaqt_page(IAQ_PAGE_HOME, aq_data); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + +void *set_aqualink_iaqtouch_light_colormode( void *ptr ) +{ + struct programmingThreadCtrl *threadCtrl; + threadCtrl = (struct programmingThreadCtrl *) ptr; + struct aqualinkdata *aq_data = threadCtrl->aq_data; + char *buf = (char*)threadCtrl->thread_args; + //char device_name[15]; + struct iaqt_page_button *button; + const char *mode_name; + int val = atoi(&buf[0]); + int btn = atoi(&buf[5]); + int typ = atoi(&buf[10]); + bool use_current_mode = false; + bool turn_off = false; + + waitForSingleThreadOrTerminate(threadCtrl, AQ_SET_IAQTOUCH_LIGHTCOLOR_MODE); + + //char *buf = (char*)threadCtrl->thread_args; + + + if (btn < 0 || btn >= aq_data->total_buttons ) { + LOG(IAQT_LOG, LOG_ERR, "Can't program light mode on button %d\n", btn); + cleanAndTerminateThread(threadCtrl); + return ptr; + } + + aqkey *key = &aq_data->aqbuttons[btn]; + //unsigned char code = key->code; + + // We also need to cater for light being ON AND changing the color mode. we have extra OK to hit. + if (val == 0) { + use_current_mode = true; + LOG(IAQT_LOG, LOG_INFO, "Light Programming #: %d, button: %s, color light type: %d, using current mode\n", val, key->label, typ); + // NOT SURE WHAT TO DO HERE..... No color mode and iaatouch doesn;t support last color in PDA mode. + } else if (val == -1) { + turn_off = true; + LOG(IAQT_LOG, LOG_INFO, "Light Programming #: %d, button: %s, color light type: %d, Turning off\n", val, key->label, typ); + } else { + mode_name = light_mode_name(typ, val-1, IAQTOUCH); + use_current_mode = false; + if (mode_name == NULL) { + LOG(IAQT_LOG, LOG_ERR, "Light Programming #: %d, button: %s, color light type: %d, couldn't find mode name '%s'\n", val, key->label, typ, mode_name); + cleanAndTerminateThread(threadCtrl); + return ptr; + } else { + LOG(IAQT_LOG, LOG_INFO, "Light Programming #: %d, button: %s, color light type: %d, name '%s'\n", val, key->label, typ, mode_name); + } + } + + // See if it's on the current page + button = iaqtFindButtonByLabel(key->label); + + if (button == NULL) { + // No luck, go to the device page + if ( goto_iaqt_page(IAQ_PAGE_DEVICES, aq_data) == false ) + goto f_end; + + button = iaqtFindButtonByLabel(key->label); + + // If not found see if page has next + if (button == NULL && iaqtFindButtonByIndex(16)->type == 0x03 ) { + iaqt_queue_cmd(KEY_IAQTCH_NEXT_PAGE); + waitfor_iaqt_nextPage(aq_data); + // This will fail, since not looking at device page 2 buttons + button = iaqtFindButtonByLabel(key->label); + } + } + + if (button == NULL) { + LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did not find '%s' button on device list\n", key->label); + goto f_end; + } + // WE have a iaqualink button, press it. + send_aqt_cmd(button->keycode); + + // See if we want to use the last color, or turn it off + if (use_current_mode || turn_off) { + // After pressing the button, Just need to wait for 5 seconds and it will :- + // a) if off turn on and default to last color. + // b) if on, turn off. (pain that we need to wait 5 seconds.) + waitfor_iaqt_queue2empty(); + waitfor_iaqt_nextPage(aq_data); + if (use_current_mode) { + // Their is no message for this, so give one. + sprintf(aq_data->last_display_message, "Light will turn on in 5 seconds"); + aq_data->is_display_message_programming = true; + aq_data->updated = true; + } + // Wait for next page maybe? + // Below needs a timeout. + while (waitfor_iaqt_nextPage(aq_data) == IAQ_PAGE_COLOR_LIGHT); + goto f_end; + } + + // BELOW WE NEED TO CATER FOR OK POPUP IF LIGHT IS ALREADY ON + if (button->state == 0x01) { // Light is on, need to select the BUTTON + waitfor_iaqt_queue2empty(); + // We Should wait for popup message, before sending code + send_aqt_cmd(KEY_IAQTCH_OK); + } + + if (waitfor_iaqt_nextPage(aq_data) != IAQ_PAGE_COLOR_LIGHT) { + LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did not color light page\n"); + goto f_end; + } + + button = iaqtFindButtonByLabel(mode_name); + + if (button == NULL) { + LOG(IAQT_LOG, LOG_ERR, "IAQ Touch did find color '%s' in color light page\n",mode_name); + goto f_end; + } + + //LOG(IAQT_LOG, LOG_ERR, "IAQ Touch WAIYING FOR 1 MESSAGES\n"); + //waitfor_iaqt_messages(aq_data, 1); + + // Finally found the color. select it + send_aqt_cmd(button->keycode); + waitfor_iaqt_nextPage(aq_data); + + f_end: + goto_iaqt_page(IAQ_PAGE_HOME, aq_data); + cleanAndTerminateThread(threadCtrl); + + // just stop compiler error, ptr is not valid as it's just been freed + return ptr; +} + + void *set_aqualink_iaqtouch_pump_rpm( void *ptr ) { struct programmingThreadCtrl *threadCtrl; @@ -486,7 +757,9 @@ void *set_aqualink_iaqtouch_pump_rpm( void *ptr ) //send_aqt_cmd(0x80); // Go to status page on startup to read devices - goto_iaqt_page(IAQ_PAGE_STATUS, aq_data); + // This is too soon + //goto_iaqt_page(IAQ_PAGE_STATUS, aq_data); + //waitfor_iaqt_nextPage(aq_data); f_end: goto_iaqt_page(IAQ_PAGE_HOME, aq_data); @@ -587,6 +860,10 @@ void *get_aqualink_iaqtouch_setpoints( void *ptr ) waitForSingleThreadOrTerminate(threadCtrl, AQ_GET_IAQTOUCH_SETPOINTS); + // Get product info. + send_aqt_cmd(KEY_IAQTCH_HELP); + waitfor_iaqt_nextPage(aq_data); + if ( goto_iaqt_page(IAQ_PAGE_SET_TEMP, aq_data) == false ) goto f_end; @@ -636,6 +913,40 @@ void *get_aqualink_iaqtouch_setpoints( void *ptr ) LOG(IAQT_LOG,LOG_NOTICE, "IAQ Touch Freeze Protection setpoint %d\n",frz); } + // Get the temperature units if we are in iaq touch PDA mode + if (isPDA_PANEL) { + // If we are here, hit back then next button to get button with degrees on it. + // Only if in PDA mode + send_aqt_cmd(KEY_IAQTCH_BACK); // Clear the feeze protect menu and go back to system setup + + if ( waitfor_iaqt_nextPage(aq_data) != IAQ_PAGE_SYSTEM_SETUP ) + { + LOG(IAQT_LOG,LOG_ERR, "Couldn't get back to setup page, Temperature units unknown, default to DegF\n"); + aq_data->temp_units = FAHRENHEIT; + goto f_end; + } + + send_aqt_cmd(KEY_IAQTCH_NEXT_PAGE_ALTERNATE); // Go to page 2 + + if ( waitfor_iaqt_nextPage(aq_data) != IAQ_PAGE_SYSTEM_SETUP2 ) + { + LOG(IAQT_LOG,LOG_ERR, "Couldn't get back to setup page, Temperature units unknown, default to DegF\n"); + aq_data->temp_units = FAHRENHEIT; + goto f_end; + } + + button = iaqtFindButtonByLabel("Degrees"); + + if (button != NULL) { + LOG(IAQT_LOG,LOG_NOTICE, "Temperature units are '%s'\n",button->name); + if (*button->name[8] == 'C') { + aq_data->temp_units = CELSIUS; + } else { + aq_data->temp_units = FAHRENHEIT; + } + } + } + // Need to run over table messages and check ens with X for on off. // Go to status page on startup to read devices diff --git a/iaqtouch_aq_programmer.h b/iaqtouch_aq_programmer.h index db51aa8..94d943f 100644 --- a/iaqtouch_aq_programmer.h +++ b/iaqtouch_aq_programmer.h @@ -19,6 +19,8 @@ void *set_aqualink_iaqtouch_spa_heater_temp( void *ptr ); void *set_aqualink_iaqtouch_pool_heater_temp( void *ptr ); void *set_aqualink_iaqtouch_time( void *ptr ); void *set_aqualink_iaqtouch_pump_vs_program( void *ptr ); +void *set_aqualink_iaqtouch_light_colormode( void *ptr ); +void *set_aqualink_iaqtouch_device_on_off( void *ptr ); // For PDA only int ref_iaqt_control_cmd(unsigned char **cmd); void rem_iaqt_control_cmd(unsigned char *cmd); diff --git a/json_messages.c b/json_messages.c index 5d0940a..dd77ae0 100644 --- a/json_messages.c +++ b/json_messages.c @@ -98,6 +98,11 @@ const char* _getStatus(struct aqualinkdata *aqdata, const char *blankmsg) return programtypeDisplayName(aqdata->active_thread.ptype); } */ + if (aqdata->active_thread.thread_id != 0) { + if (!aqdata->is_display_message_programming || rsm_isempy(aqdata->last_display_message,strlen(aqdata->last_display_message))){ + return programtypeDisplayName(aqdata->active_thread.ptype); + } + } //if (aqdata->last_message != NULL && stristr(aqdata->last_message, "SERVICE") != NULL ) { if (aqdata->service_mode_state == ON) { @@ -611,7 +616,7 @@ int build_aqualink_status_JSON(struct aqualinkdata *aqdata, char* buffer, int si if ( aqdata->orp != TEMP_UNKNOWN ) length += sprintf(buffer+length, ",\"chem_orp\":\"%d\"",aqdata->orp ); - if ( READ_RSDEV_SWG ) + //if ( READ_RSDEV_SWG ) length += sprintf(buffer+length, ",\"swg_fullstatus\": \"%d\"", aqdata->ar_swg_device_status); length += sprintf(buffer+length, ",\"leds\":{" ); diff --git a/net_services.c b/net_services.c index 6e42890..f770dfa 100644 --- a/net_services.c +++ b/net_services.c @@ -44,6 +44,7 @@ #include "aq_scheduler.h" #include "rs_msg_utils.h" #include "simulator.h" +#include "hassio.h" #include "version.h" #ifdef AQ_PDA @@ -685,14 +686,17 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) const char *status; if (_aqconfig_.mqtt_timed_update) { +#ifdef AQ_NO_THREAD_NETSERVICE if (cnt > 300) { // 100 = about every 2 minutes. +#else + if (cnt > 30) { // 30 = about every 2 minutes. +#endif reset_last_mqtt_status(); cnt = 0; } else { cnt++; } } - //LOG(NET_LOG,LOG_INFO, "mqtt_broadcast_aqualinkstate: START\n"); @@ -819,6 +823,12 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) send_mqtt_int_msg(nc, SWG_BOOST_TOPIC, _aqualink_data->boost); _last_mqtt_aqualinkdata.boost = _aqualink_data->boost; } + + if ( _aqualink_data->boost_duration != _last_mqtt_aqualinkdata.boost_duration ) { + send_mqtt_int_msg(nc, SWG_BOOST_DURATION_TOPIC, _aqualink_data->boost_duration); + _last_mqtt_aqualinkdata.boost_duration = _aqualink_data->boost_duration; + } + } else { //LOG(NET_LOG,LOG_DEBUG, "SWG status unknown\n"); } @@ -831,9 +841,10 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) int dzalert; get_swg_status_mqtt(_aqualink_data, message, &status, &dzalert); - send_domoticz_mqtt_status_message(nc, _aqconfig_.dzidx_swg_status, dzalert, &message[9]); + send_domoticz_mqtt_status_message(nc, _aqconfig_.dzidx_swg_status, dzalert, &message[9]); send_mqtt_int_msg(nc, SWG_EXTENDED_TOPIC, (int)_aqualink_data->ar_swg_device_status); + send_mqtt_string_msg(nc, SWG_STATUS_MSG_TOPIC, message); _last_mqtt_aqualinkdata.ar_swg_device_status = _aqualink_data->ar_swg_device_status; //LOG(NET_LOG,LOG_DEBUG, "SWG Extended sending cur=%d sent=%d\n",_aqualink_data->ar_swg_device_status,_last_mqtt_aqualinkdata.ar_swg_device_status); @@ -844,6 +855,22 @@ void mqtt_broadcast_aqualinkstate(struct mg_connection *nc) //LOG(NET_LOG,LOG_DEBUG, "SWG Extended unknown\n"); } + if (READ_RSDEV_JXI && _aqualink_data->heater_err_status != _last_mqtt_aqualinkdata.heater_err_status) { + char message[30]; + + if (_aqualink_data->heater_err_status == NUL) { + send_mqtt_int_msg(nc, LXI_ERROR_CODE, (int)_aqualink_data->heater_err_status); + send_mqtt_string_msg(nc, LXI_ERROR_MESSAGE, ""); + } else { + //send_mqtt_int_msg(nc, LXI_STATUS, (int)_aqualink_data->heater_err_status); + send_mqtt_int_msg(nc, LXI_ERROR_CODE, (int)_aqualink_data->heater_err_status); + getJandyHeaterErrorMQTT(_aqualink_data, message); + send_mqtt_string_msg(nc, LXI_ERROR_MESSAGE, status); + } + + _last_mqtt_aqualinkdata.heater_err_status = _aqualink_data->heater_err_status; + } + // LOG(NET_LOG,LOG_INFO, "mqtt_broadcast_aqualinkstate: START LEDs\n"); // if (time(NULL) % 2) {} <-- use to determin odd/even second in time to make state flash on enabled. @@ -952,6 +979,7 @@ uriAtype action_URI(request_source from, const char *URI, int uri_length, float char *ri1 = (char *)URI; char *ri2 = NULL; char *ri3 = NULL; + //bool charvalue=false; //char *ri4 = NULL; LOG(NET_LOG,LOG_DEBUG, "%s: URI Request '%.*s': value %.2f\n", actionName[from], uri_length, URI, value); @@ -1325,7 +1353,21 @@ void action_mqtt_message(struct mg_connection *nc, struct mg_mqtt_message *msg) strncpy(tmp, msg->payload.p, msg->payload.len); tmp[msg->payload.len] = '\0'; - float value = atof(tmp); + //float value = atof(tmp); + + // Check value like on/off/heat/cool and convery to int. + // HASSIO doesn't support `mode_command_template` so easier to code around their limotation here. + char *end; + float value = strtof(tmp, &end); + if (tmp == end) { // Not a number + // See if any test resembeling 1, of not leave at zero. + if (rsm_strcmp(tmp, "on")==0 || rsm_strcmp(tmp, "heat")==0 || rsm_strcmp(tmp, "cool")==0) + value = 1; + + LOG(NET_LOG,LOG_NOTICE, "MQTT: converted value from '%s' to '%.0f', from message '%.*s'\n",tmp,value,msg->topic.len, msg->topic.p); + } + + //int val = _aqualink_data->unactioned.value = (_aqualink_data->temp_units != CELSIUS && _aqconfig_.convert_mqtt_temp) ? round(degCtoF(value)) : round(value); bool convert = (_aqualink_data->temp_units != CELSIUS && _aqconfig_.convert_mqtt_temp)?true:false; int offset = strlen(_aqconfig_.mqtt_aq_topic)+1; @@ -1821,6 +1863,8 @@ static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { mg_mqtt_subscribe(nc, topics, 1, 42); LOG(NET_LOG,LOG_INFO, "MQTT: Subscribing to '%s'\n", _aqconfig_.mqtt_dz_sub_topic); } + + publish_mqtt_hassio_discover( _aqualink_data, nc); } break; case MG_EV_MQTT_PUBACK: @@ -1876,6 +1920,13 @@ void reset_last_mqtt_status() _last_mqtt_aqualinkdata.boost = -1; _last_mqtt_aqualinkdata.swg_percent = -1; _last_mqtt_aqualinkdata.swg_ppm = -1; + _last_mqtt_aqualinkdata.heater_err_status = NUL; // 0x00 + + for (i=0; i < _aqualink_data->num_pumps; i++) { + _last_mqtt_aqualinkdata.pumps[i].gpm = -1; + _last_mqtt_aqualinkdata.pumps[i].rpm = -1; + _last_mqtt_aqualinkdata.pumps[i].watts = -1; + } } diff --git a/net_services.h b/net_services.h index b2449e4..a53be00 100644 --- a/net_services.h +++ b/net_services.h @@ -31,6 +31,11 @@ void broadcast_aqualinkstate(); void broadcast_aqualinkstate_error(char *msg); void broadcast_simulator_message(); + + +// NSF Need to find a better way, this is not thread safe, so don;t like exposting it. +//void send_mqtt(struct mg_connection *nc, const char *toppic, const char *message); + // superseded with systemd/sd-journal //void broadcast_log(char *msg); //#endif diff --git a/onetouch.c b/onetouch.c index 1b928f6..f25ff26 100644 --- a/onetouch.c +++ b/onetouch.c @@ -589,8 +589,8 @@ bool log_qeuiptment_status_VP2(struct aqualinkdata *aq_data) } else if (PANEL_SIZE() >= 16 ) { // Loop over RS 16 buttons. get_RS16buttoninfo_from_menu(aq_data, i); -#endif } +#endif } return rtn; diff --git a/pda.c b/pda.c index 267a9db..e72539e 100644 --- a/pda.c +++ b/pda.c @@ -687,6 +687,7 @@ void process_pda_packet_msg_long_equiptment_status(const char *msg_line, int lin //snprintf(_aqualink_data->boost_msg, sizeof(_aqualink_data->boost_msg), "%s", msg+2); //Message is ' 23:21 Remain', we only want time part snprintf(_aqualink_data->boost_msg, 6, "%s", msg); + _aqualink_data->boost_duration = rsm_HHMM2min(_aqualink_data->boost_msg); } else if ((index = rsm_strncasestr(msg, MSG_SWG_PCT, AQ_MSGLEN)) != NULL) { diff --git a/release/aqualinkd b/release/aqualinkd index 2652deb06c1b01c6bf30af912c11f8e98062fa9a..db895834c2986979abf6f278a4c43d581ee1ee23 100755 GIT binary patch delta 213191 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

s+y?}O3)OfYZAg9!8}Lz<8Y<^ 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 bKISWV!)JvrjvTrN=|(orjx62dJL3NX-mANf delta 179341 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

gL( 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�&o*K>aBd$S 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 diff --git a/rs_msg_utils.c b/rs_msg_utils.c index 76ceed7..a89349a 100644 --- a/rs_msg_utils.c +++ b/rs_msg_utils.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "utils.h" #include "rs_msg_utils.h" @@ -83,6 +85,42 @@ bool rsm_get_revision(char *dest, const char *src, int src_len) return true; } +/* +pull board CPU from strings line + ' CPU p/n: B0029221' + 'B0029221 REV T.0.1' + 'E0260801 REV. O.2' +*/ +int rsm_get_boardcpu(char *dest, int dest_len, const char *src, int src_len) +{ + //char *regexString="/\\w\\d{4,10}/gi"; + //char *regexString="/[[:alpha:]][[:digit:]]{4,10}/gi"; + char *regexString="[[:alpha:]][[:digit:]]{4,10}"; + regex_t regexCompiled; + regmatch_t match; + int rc, begin, end, len; + + if (0 != (rc = regcomp(®exCompiled, regexString, REG_EXTENDED))) { + LOG(AQUA_LOG,LOG_ERR, "regcomp() failed, returning nonzero (%d)\n", rc); + return 0; + } + + if ((regexec(®exCompiled,src,1,&match,0)) != 0) { + regfree(®exCompiled); + printf("********** ERROR didn;t line match \n"); + return 0; + } + + begin = (int)match.rm_so; + end = (int)match.rm_eo; + len = AQ_MIN((end-begin), dest_len); + + strncpy(dest, src+match.rm_so, len ); + + regfree(®exCompiled); + + return len; +} /* Find first char after a space in haystack after searching needle. @@ -110,6 +148,18 @@ char *rsm_charafterstr(const char *haystack, const char *needle, int length) return ++sp; } +/* + Check if string has printable chars and is not empty +*/ +bool rsm_isempy(const char *src, int length) +{ + int i; + for(i=0; i < length; i++) { + if (src[i] > 32 && src[i] < 127) // 32 is space + return true; + } + return false; +} /* Can probably replace this with rsm_strncasestr in all code. */ @@ -193,9 +243,82 @@ int rsm_strcmp(const char *haystack, const char *needle) return -1; // Need to write this myself for speed //LOG(AQUA_LOG,LOG_DEBUG, "Compare (reset)%d chars of '%s' to '%s'\n",strlen(sp2),sp1,sp2); + //printf("***** rsm_strcmp Compare (reset)%d chars of '%s' to '%s'\n",strlen(sp2),sp1,sp2); return strncasecmp(sp1, sp2, strlen(sp2)); } +// Match two strings, used for button labels +// exact character length once white space removed is used for match +// use case insensative for match. +// so 'spa' !- 'spa mode' +int rsm_strmatch(const char *haystack, const char *needle) +{ + return rsm_strmatch_ignore(haystack, needle, 0); + /* + char *sp1 = (char *)haystack; + char *sp2 = (char *)needle; + + char *ep1 = (char *)sp1 + strlen(sp1) - 1; + char *ep2 = (char *)sp2 + strlen(sp2) - 1; + //int i=0; + // Get rid of all padding + while(isspace(*sp1)) sp1++; + while(isspace(*sp2)) sp2++; + while(isspace(*ep1) && (ep1 >= sp1)) ep1--; + while(isspace(*ep2) && (ep2 >= sp2)) ep2--; + + int l1 = ep1 - sp1 +1; + int l2 = ep2 - sp2 +1; + + //printf("***** rsm_strmatch Compare %d chars of '%s' to %d chars in '%s'\n",l2,sp2,l1,sp1); + + if ( l1 != l2 || (ep1 - sp1) <= 0 || (ep2 - sp2) <= 0 ) { + return -1; + } + // Need to write this myself for speed + //LOG(AQUA_LOG,LOG_DEBUG, "Compare (reset)%d chars of '%s' to '%s'\n",strlen(sp2),sp1,sp2); + + return strncasecmp(sp1, sp2, l2); + */ +} + +// Match two strings, used for button labels +// exact character length once white space removed is used for match +// ignore_chars will delete the last X chars from haystack. +// use case insensative for match. +// so 'spa' !- 'spa mode' +int rsm_strmatch_ignore(const char *haystack, const char *needle, int ignore_chars) +{ + char *sp1 = (char *)haystack; + char *sp2 = (char *)needle; + + char *ep1 = (char *)sp1 + strlen(sp1) - 1; + char *ep2 = (char *)sp2 + strlen(sp2) - 1; + //int i=0; + // Get rid of all padding + while(isspace(*sp1)) sp1++; + while(isspace(*sp2)) sp2++; + while(isspace(*ep2) && (ep2 >= sp2)) ep2--; + if (ignore_chars > 0) + ep1 = ep1 - ignore_chars; + else + while(isspace(*ep1) && (ep1 >= sp1)) ep1--; + + + int l1 = ep1 - sp1 +1; + int l2 = ep2 - sp2 +1; + + //printf("***** %s() Compare %d chars of '%s' to %d chars in '%s'\n",(ignore_chars==0?"rsm_strmatch":"rsm_strmatch_ignore"),l2,sp2,l1,sp1); + + if ( l1 != l2 || (ep1 - sp1) <= 0 || (ep2 - sp2) <= 0 ) { + return -1; + } + // Need to write this myself for speed + //LOG(AQUA_LOG,LOG_DEBUG, "Compare (reset)%d chars of '%s' to '%s'\n",strlen(sp2),sp1,sp2); + + return strncasecmp(sp1, sp2, l2); +} + /* * Find last index of char in string. @@ -218,8 +341,7 @@ char *rsm_lastindexof(const char *haystack, const char *needle, size_t length) return NULL; } -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + int rsm_strncmp(const char *haystack, const char *needle, int length) { @@ -241,7 +363,27 @@ int rsm_strncmp(const char *haystack, const char *needle, int length) //LOG(AQUA_LOG,LOG_DEBUG, "CHECK haystack SP1='%c' EP1='%c' SP2='%c' '%.*s' for '%s' length=%d\n",*sp1,*ep1,*sp2,(ep1-sp1)+1,sp1,sp2,(ep1-sp1)+1); // Need to write this myself for speed // Need to check if full length string (no space on end), that the +1 is accurate. MIN should do it - return strncasecmp(sp1, sp2, MIN((ep1-sp1)+1,length)); + return strncasecmp(sp1, sp2, AQ_MIN((ep1-sp1)+1,length)); +} + + +char *rsm_char_replace(char *replaced , char *search, char *find, char *replace) +{ + int len; + int i; + char *fp = find; + char *rp = replace; + + len = strlen(search); + for(i = 0; i < len; i++){ + if (search[i] == *fp) + replaced[i] = *rp; + else + replaced[i] = search[i]; + } + replaced[i] = '\0'; + + return replaced; } // NSF Check is this works correctly. @@ -253,7 +395,7 @@ char *rsm_strncpycut(char *dest, const char *src, int dest_len, int src_len) while(isspace(*sp)) sp++; while(isspace(*ep)) ep--; - int length=MIN((ep-sp)+1,dest_len); + int length=AQ_MIN((ep-sp)+1,dest_len); memset(dest, '\0',dest_len); return strncpy(dest, sp, length); @@ -304,8 +446,6 @@ int rsm_strncpy_nul2sp(char *dest, const unsigned char *src, int dest_len, int s return _rsm_strncpy(dest, src, dest_len, src_len, true); } -#define INT_MAX +2147483647 -#define INT_MIN -2147483647 // atoi that can have blank start int rsm_atoi(const char* str) @@ -343,4 +483,14 @@ float rsm_atof(const char* str) } return atof(&str[i]); +} + +// MEssages as HH:MM ie 01:23 +int rsm_HHMM2min(char *message) { + char *ptr; + + int hour = strtoul(message, &ptr, 10); + int min = strtoul(message+3, &ptr, 10); + + return (hour*60)+min; } \ No newline at end of file diff --git a/rs_msg_utils.h b/rs_msg_utils.h index befff8f..b9d2fdf 100644 --- a/rs_msg_utils.h +++ b/rs_msg_utils.h @@ -1,16 +1,23 @@ #ifndef RS_MSG_UTILS_H_ #define RS_MSG_UTILS_H_ +//#define MIN(x, y) (((x) < (y)) ? (x) : (y)) bool rsm_get_revision(char *dest, const char *src, int src_len); +int rsm_get_boardcpu(char *dest, int dest_len, const char *src, int src_len); + char *rsm_charafterstr(const char *haystack, const char *needle, int length); +bool rsm_isempy(const char *src, int length); char *rsm_strstr(const char *haystack, const char *needle); //char *rsm_strnstr(const char *haystack, const char *needle, int length); char *rsm_strnstr(const char *haystack, const char *needle, size_t slen); char *rsm_strncasestr(const char *haystack, const char *needle, size_t length); char *rsm_lastindexof(const char *haystack, const char *needle, size_t length); +int rsm_strmatch(const char *haystack, const char *needle); +int rsm_strmatch_ignore(const char *haystack, const char *needle, int ignore_chars); + int rsm_strncpy(char *dest, const unsigned char *src, int dest_len, int src_len); int rsm_strcmp(const char *s1, const char *s2); int rsm_strncmp(const char *haystack, const char *needle, int length); @@ -18,6 +25,8 @@ int rsm_strncpy_nul2sp(char *dest, const unsigned char *src, int dest_len, int s int rsm_atoi(const char* str); float rsm_atof(const char* str); char *rsm_strncpycut(char *dest, const char *src, int dest_len, int src_len); - +//char *rsm_char_replace(char *replaced , char *search, const char find, const char replace); +char *rsm_char_replace(char *replaced , char *search, char *find, char *replace); +int rsm_HHMM2min(char *message); #endif //RS_MSG_UTILS_H_ diff --git a/serial_logger.c b/serial_logger.c index ad08f66..af75431 100644 --- a/serial_logger.c +++ b/serial_logger.c @@ -117,7 +117,7 @@ int serial_logger (int rs_fd, char *port_name, int logLevel) { #define PDA " <-- PDA Remote" #define EPUMP " <-- Jandy VSP ePump" #define CHEM " <-- Chemlink" -#define LXI_LRZ_HEATER " <-- LXi / LRZ Heater" +#define JXI_HEATER " <-- LXi / LRZ Heater" #define UNKNOWN " <-- Unknown Device" @@ -151,7 +151,7 @@ const char *getDevice(unsigned char ID) { if (ID >= 0x60 && ID <= 0x63) return PDA; if (ID >= 0x68 && ID <= 0x6B) - return LXI_LRZ_HEATER; + return JXI_HEATER; //if (ID >= 0x70 && ID <= 0x73) if (ID >= 0x78 && ID <= 0x7B) return EPUMP; diff --git a/utils.h b/utils.h index 0d6234b..f16d963 100644 --- a/utils.h +++ b/utils.h @@ -47,6 +47,16 @@ // Set scheduler log to timer log #define SCHD_LOG TIMR_LOG + +/* +#define INT_MAX +2147483647 +#define INT_MIN -2147483647 +*/ + +#define AQ_MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define AQ_MIN(x, y) (((x) < (y)) ? (x) : (y)) + + /* typedef enum { diff --git a/version.h b/version.h index 45826be..8454636 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,5 @@ #define AQUALINKD_NAME "Aqualink Daemon" -#define AQUALINKD_VERSION "2.3.4" +#define AQUALINKD_SHORT_NAME "AqualinkD" +#define AQUALINKD_VERSION "2.3.5" diff --git a/web/config.js b/web/config.js index 6d3417a..3c6bc82 100644 --- a/web/config.js +++ b/web/config.js @@ -35,8 +35,8 @@ "Spa_Water", "Freeze_Protect", "CHEM/pH", - "CHEM/ORP" - //"Solar_Heater", + "CHEM/ORP", + "Solar_Heater", ]; // This get's picked up by dynamic_config.js and used as mode 0 @@ -72,6 +72,8 @@ 32: "Low volts", 64: "Low temp", 128: "Check PCB", + 253: "General Fault", + 254: "Unknown", 255: "Off" } diff --git a/web/controller.html b/web/controller.html index da42990..8a57d4d 100644 --- a/web/controller.html +++ b/web/controller.html @@ -590,6 +590,21 @@ var _scheduler_devices_json= []; + var _swgALLStatus = { + 0: "On", + 1: "No flow", + 2: "Low salt", + 4: "High salt", + 8: "Clean cell", + 9: "Turning off", + 16: "High current", + 32: "Low volts", + 64: "Low temp", + 128: "Check PCB", + 253: "General Fault", + 254: "Unknown", + 255: "Off" + } if (typeof show_vsp_gpm !== 'undefined' && show_vsp_gpm == false) var _show_vsp_gpm=false; @@ -605,19 +620,7 @@ if (typeof swgStatus !== 'undefined') { var _swgStatus = swgStatus; } else { - var _swgStatus = { - 0: "On", - 1: "No flow", - 2: "Low salt", - 4: "High salt", - 8: "Clean cell", - 9: "Turning off", - 16: "High current", - 32: "Low volts", - 64: "Low temp", - 128: "Check PCB", - 255: "Off" - } + var _swgStatus = _swgALLStatus } function init() { @@ -1100,6 +1103,9 @@ if (exstatus > 0 && exstatus < 255) {// Not off or on //text = swgFullstatus2String(exstatus); text = _swgStatus[exstatus]; + if (typeof text == 'undefined') { + text = _swgALLStatus[exstatus]; + } } else if (tile.getAttribute('Boost') == 'on') text = "Boost"; else if (status == 'enabled') diff --git a/web/hk/Aux_1-off.png b/web/hk/Aux_1-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_1-off.png +++ b/web/hk/Aux_1-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_1-on.png b/web/hk/Aux_1-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_1-on.png +++ b/web/hk/Aux_1-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_12-on.png b/web/hk/Aux_12-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_12-on.png +++ b/web/hk/Aux_12-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_2-off.png b/web/hk/Aux_2-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_2-off.png +++ b/web/hk/Aux_2-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_2-on.png b/web/hk/Aux_2-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_2-on.png +++ b/web/hk/Aux_2-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_3-off.png b/web/hk/Aux_3-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_3-off.png +++ b/web/hk/Aux_3-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_3-on.png b/web/hk/Aux_3-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_3-on.png +++ b/web/hk/Aux_3-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_4-off.png b/web/hk/Aux_4-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_4-off.png +++ b/web/hk/Aux_4-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_4-on.png b/web/hk/Aux_4-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_4-on.png +++ b/web/hk/Aux_4-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_5-off.png b/web/hk/Aux_5-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_5-off.png +++ b/web/hk/Aux_5-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_5-on.png b/web/hk/Aux_5-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_5-on.png +++ b/web/hk/Aux_5-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_6-off.png b/web/hk/Aux_6-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_6-off.png +++ b/web/hk/Aux_6-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_6-on.png b/web/hk/Aux_6-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_6-on.png +++ b/web/hk/Aux_6-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_7-off.png b/web/hk/Aux_7-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_7-off.png +++ b/web/hk/Aux_7-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_7-on.png b/web/hk/Aux_7-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_7-on.png +++ b/web/hk/Aux_7-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_8-off.png b/web/hk/Aux_8-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_8-off.png +++ b/web/hk/Aux_8-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_8-on.png b/web/hk/Aux_8-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_8-on.png +++ b/web/hk/Aux_8-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B1-off.png b/web/hk/Aux_B1-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B1-off.png +++ b/web/hk/Aux_B1-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B1-on.png b/web/hk/Aux_B1-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B1-on.png +++ b/web/hk/Aux_B1-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B2-off.png b/web/hk/Aux_B2-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B2-off.png +++ b/web/hk/Aux_B2-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B2-on.png b/web/hk/Aux_B2-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B2-on.png +++ b/web/hk/Aux_B2-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B3-off.png b/web/hk/Aux_B3-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B3-off.png +++ b/web/hk/Aux_B3-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B3-on.png b/web/hk/Aux_B3-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B3-on.png +++ b/web/hk/Aux_B3-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B4-off.png b/web/hk/Aux_B4-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B4-off.png +++ b/web/hk/Aux_B4-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B4-on.png b/web/hk/Aux_B4-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B4-on.png +++ b/web/hk/Aux_B4-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B5-off.png b/web/hk/Aux_B5-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B5-off.png +++ b/web/hk/Aux_B5-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B5-on.png b/web/hk/Aux_B5-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B5-on.png +++ b/web/hk/Aux_B5-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B6-off.png b/web/hk/Aux_B6-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B6-off.png +++ b/web/hk/Aux_B6-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B6-on.png b/web/hk/Aux_B6-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B6-on.png +++ b/web/hk/Aux_B6-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B7-off.png b/web/hk/Aux_B7-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B7-off.png +++ b/web/hk/Aux_B7-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B7-on.png b/web/hk/Aux_B7-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B7-on.png +++ b/web/hk/Aux_B7-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Aux_B8-off.png b/web/hk/Aux_B8-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Aux_B8-off.png +++ b/web/hk/Aux_B8-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Aux_B8-on.png b/web/hk/Aux_B8-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Aux_B8-on.png +++ b/web/hk/Aux_B8-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Filter_Pump-off.png b/web/hk/Filter_Pump-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Filter_Pump-off.png +++ b/web/hk/Filter_Pump-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Filter_Pump-on.png b/web/hk/Filter_Pump-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Filter_Pump-on.png +++ b/web/hk/Filter_Pump-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Pool_Heater-off.png b/web/hk/Pool_Heater-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Pool_Heater-off.png +++ b/web/hk/Pool_Heater-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Pool_Heater-on.png b/web/hk/Pool_Heater-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Pool_Heater-on.png +++ b/web/hk/Pool_Heater-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/SWG_Boost-off.png b/web/hk/SWG_Boost-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/SWG_Boost-off.png +++ b/web/hk/SWG_Boost-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/SWG_Boost-on.png b/web/hk/SWG_Boost-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/SWG_Boost-on.png +++ b/web/hk/SWG_Boost-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Solar_Heater-off.png b/web/hk/Solar_Heater-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Solar_Heater-off.png +++ b/web/hk/Solar_Heater-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Solar_Heater-on.png b/web/hk/Solar_Heater-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Solar_Heater-on.png +++ b/web/hk/Solar_Heater-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Spa_Heater-off.png b/web/hk/Spa_Heater-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Spa_Heater-off.png +++ b/web/hk/Spa_Heater-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Spa_Heater-on.png b/web/hk/Spa_Heater-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Spa_Heater-on.png +++ b/web/hk/Spa_Heater-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/hk/Spa_Mode-off.png b/web/hk/Spa_Mode-off.png index 6ccd9a9..5f60636 120000 --- a/web/hk/Spa_Mode-off.png +++ b/web/hk/Spa_Mode-off.png @@ -1 +1 @@ -switch-off.png \ No newline at end of file +./switch-off.png \ No newline at end of file diff --git a/web/hk/Spa_Mode-on.png b/web/hk/Spa_Mode-on.png index 58a1f29..6afbc0b 120000 --- a/web/hk/Spa_Mode-on.png +++ b/web/hk/Spa_Mode-on.png @@ -1 +1 @@ -switch-on.png \ No newline at end of file +./switch-on.png \ No newline at end of file diff --git a/web/onetouch_sim.html b/web/onetouch_sim.html index ce17872..3dda6e4 100644 --- a/web/onetouch_sim.html +++ b/web/onetouch_sim.html @@ -421,13 +421,14 @@ status.classList.remove("error"); } } + function update_status(data) { // Some form of error if PDA only panel. if (data.panel_type.startsWith("PDA")) { //document.getElementById("status").innerHTML = ' !!! PDA only panels are not Supported !!! ' //document.getElementById("status").classList.add("error"); - update_status_message("PDA only panels are not Supported", true); + update_status_message("Some PDA panels do not support OneTouch", true); } const versionlabel = document.getElementById("version");

Q`575O{A?gjL`}$3kXf&iXkMyf&h^MyR*;=g8k=Nhj!!su2hJN6_g6{t$o9& zpUo;rWiRrrmiS2dVT(J4ajho*gW-Zc$Y7Dxp&tYFcx?k*D8Baa7QfvvVdTfj5V_mr z$0w={<1yGKwri|5+!+UVWEiuu5T8Q6)tkQ|Uk7fCNn4(Jkmk0w?ogg(>n?WE`j94D z_pay;|BY9$7OPr?GCRXTd=H3k0yM&p?e`&kGLgt+kZ4eCz5^-v+(@@X0jC zQeE#e}C&Xa$hVXJ%en^2b2LbGjvk+8;@Hk$4qAdVCHf?->lRujLaZbMVt-B_R)@153 zSCTrI&#t%BXQp711ZIj3i0hacMnNVDicO3Qmm==8N~#({6#{p^)a3cLeQrc(cg|(#A%&l!VPD^Y}7w%U{M9Mgrk; zn=LKjuYS>sCwDqNkheHHT=H?7iH_EJS33FGc7RvNp9yhQ@gwHv=NJ$V8KU|@lq#;%ilpfuIS>w^I`l-rs%1TA#AFb~iSXe5*zR^w{<3&c;{kZA36dg);r--w@v5ZlvTts(K7 zZ{tZIE=t@$rR49ZkR4@j)lp-~*(c~e>s1_ybzp)~`66{R+b^f0Zf1Lf_fK=?) z&|-&&`q)3WfeL5Xm=&>~g`j}_e*?J$ZAKk67Wh1-oY5v6L` zUB&96nv(uDxYeC6udCu0p{WDCMIixQ+Ca_o>If%!)F99OD72SaJND8txT?wzq4KW1 z)C_xxtIA#~29D!*0ym14t9wb?M4EPdSi5PVS}7;gshq5nO{_!Z7V@n+xcx)cp%3Fm ztzNXmG-LC+xM7)LdQq$aW@ry|(Cvd}3|sLEnlos|Z`GZtsoU>eyJ;U5gteQ787@WP zlI*6J7&o=s!*b#x^05di_ePhedeH3FZraJS?4~oEw5>@JWjLK;5(z(ws~dWpcC!{F zHr7Ns=S&c5`=71I89Z|`bLCvpEXz+J&9eM7ECTJqlZVCTw*XqWvU zQ9OwSI^ID-yh`@7sFT34)p3?YLiljD^ArW1 zbPC)}0hyi_0g+sB_gpXpDXt(|o4I+utC&WMLrD#xOy2nHyob=>)^aV*227>Q&f8fZRhIgI;?W$sK+VqM_Bn6s1+-pa{8(n5idS$CjJCK^)-HCf@yq*mBS1xi$CGJy$LxC7Ms6&;o$CDw)yA3<7FRz*55FIx8ah* zLm~JV_^nTI7W+58CPBK_m@}i zOjB;`8Q~J&+Vpv;J>+Q*pKX%W;IK*)g_+%%`~!||`wjV*lD4Zlt!c$CNnB0hwqbtd z$6lwj4cq+Y@{_NJrtk}ObvW?hmuu4!ULT0x35PdGb$d`o^46k(_SjoJuM8ddnpk!O zxhw?l!_a}h9%X1d-nf9`M^idv&!$~LT001`jSj_TLv*Mk9cO${ITUbQ(Tp0JGIJhJ zEdrOuzze~n23!cPDb)%%S$`;BuAlVSaIx zZ|ebJFrWehrG%}^yA-9Y(<<5!=atCu`@M(QT>YIpx13+Tiq?|%Tb^&#rC1;KSyNK> z{0E2YX$75YF#j6HZfV6AanWR3q_2;8yR0a3jH2Lg=4idV zU=_nz&&jVT4g-yT^>t?qYrci!jDtzq`RQL*2cuYN`$r35&dUW%}byRp-E!~_S>gLC&v--+eL6K_RtW{Af z<`0W56C#9dxjnE@k&-?#Ay-)7JrTMMne>0;3qIz^?M7dyIny7GQRH?Kjc z)UH1`ouppfybqxI8b4BpZoa_ina@55b@R@rYwG4_pAU8OSya^O=1ZSHxcja51Kpgw zm*20v&)x*1o3kX{=;o&2Rabw4d@1MGP79UnP@|lsY!v_-WAK-nXbt|Cz*BoErVYW+ zQr5?RS92*wUPF|0|6ovULg9_52HE0Pb9>^fktwUWw>tR;-U~JNCZnW}`yf=(EvfL4 zD(U`)c{d;4GJzfpW@AQ4Pj8@McGjh&6;7PAbXA_p;?k8kE# zidm7@QqD)Bm}@Cy|Bu^QgM5B}O)cDv=CE2=+k5sB;4Urv6J$lZJ6vn|76PM>R14=( z{{LAEf9c3peOfpLjAi}*Neh2qkpGw#?yk1_5!GR}@JmNf;lHZF|1Vnj_jOdb9xZ%e zYp8`E35wLMg}(u&J}tb*$#b;u#|G`qwa~g+c&k&iwibR%c|XERtA(#N)H<`H!!6{I z0M*y{4Qb&)@7Jw`vp0lV_z@~w!uNWQdi=dMNz z`@j5{vv%fyu05c&mF`?(sHJp&y1!1P8|d7rl&!6ECyI{^=-jd7%Ua$vjQLZf#Q*AJ zuU*Z2vVCrj&1{Lq$-aB0J9v@IxQ}Jez_WxJ$raPRg zrFfH7iuZq<@?4+dm4$nx7I7`b8(6~n_L7cQjTD4?gcJXww$DH%%N^Y_E5J+34a(_b_@n!)uC=Z9wne@WLYQDIMj_v3x|rCv=d3I zI@66bFEXM`L785nq-;BQEkQK zTTgR>e6`-E$#+9GYLnuT9C>~xaI$cJU(Le9gL?DAZB@T&fP;HbhKf{AX2EXBhCoaDl`hbI^k^>_cZRGac3WE#ZK-z z70yd$hJyBZRgFee{Dum--e-H3hC@#IsI}%f%<* zn#YTHmLvGMeEvx_myn<%;_|t#8PM2Yx05~LfBptO(GAXf_TcUu$ZZ`t36)w>*8i_z zJYFlL_hPz@>|uCYb}_IsO?dIgq^WFsNjP5NFWJ)&SoLfU%7W@PXxM4sm1Uvd*LDee z!Y63Y7?k$t$|f&6&B%jPxkHXN-DMZZS`S6*l?P; z2Buo+Bw0u?hDB4TS@kocb&A3+Bd69Y3>p&emkn}P>okH2?f#hKYzS(rcCM`^^J`Z4 zF)A!IygJ!XjVUCcU)QK{%?cm5{%|jb0tCekzm5v4dA6`g$Tm+hM*HC1uUPSp4tBn; zJhHK*Vl4n_mW++}!S?Wk@y|K>RH29?X3PtsxKzfcjJ#NC+dZ8R?am-y2f;IFwER@E zVYm=gpkKk^fqn!JCWD$zZ-@)DwWyic02izuM~==t=g^;Nw!Kt9h&pHQYz zB%gzP8>sP$>kjW;eNFq@5yq|XBH-;DQ}f8VPx+sG(zYi)@JwNT^gzGdB zVa7|?fw<8Qp#G#yYK3> zJiDsDr=iyEOH{%2e)MzPjb*^9ez(@D-yDNehSD}*Y|%Ls)nO{Oes7bfXIsCwcpk#I zl;^-~4$6n)7OShlH_39s{4l~|qX3MIBj3@W10ss?Jkz@7plcllB?IZQhFX_0f*I66 z<3{uN23a8LT_cr+c-5sgI+zaF%OJO{E43k!%3SY%{h8PP?-w8y`;1j z4arUp|VX4!}6u7+<-L%R8KBSkAY-juAuXoCnlaF(>a@FwVXQaC2gj3uOiO??6 z{+meVE2${oG#^>35yrh8dM>_w=ExgCGfy%2$|GomVGT6GsvGNQgb}6@`iG6sUD2)9 zZhIUm)d&iYwT-Ye;7q9I)Cgl9^l#sd8oZlywL<$^t)NH`i?7Hj+x3S-+ar!q|5Nfh zJ9}-eV=v82=lN`&FW`BfV?s}(%;%(W1Zc9VIj;*|5;omXdNyZyR&H_%T|@p32Qi@} z@l$C^E4ttCqVLI{BLhD(wC{&IIR5}nZ1XDk6X>cZ9ZFUw+(&{=uI(_eabyaYYq$?S zv2kQAX1mW*S-CsXj-I*3*fSh+|xeKD0-ea*0jjZOE_nG zN~1{D>;A(1-ZPyGr%s=gm@%_3F=5K22{%ld*p-JwkT`kP%;|}O@iQh(Lus!&_gnA9 z#?Kt`E{R4v`VSoP+CDNZwk3Mjy7Qv3pEbXH_@wa@6GO&KO-z|IzHrj4#KftyCQT?z zBogN(I?kqekUwuzrun-^_0W&G^fQ)gZ?aq8>|GjEzcxu1yd)i z`(IY<9IpfQj6`Np<7mu7NYtubCXwE3)pM z<70Pv?WXp|AcM6S79#at`7HgoOb@|FS1)q`s=*F>)QTq~C~N=Dw~#~!Xcwv%Q4qEVzP*I=%( zTywaVaINCn%(a)R*<&E$+W1I#?c^SLG`!ky&*hrPwa8q8TgC4!TnD%k5IcZtEZ1B= zsej@17Y1a6{sgko1mtT0smD6K2k2lV~Jz$*_?ldnYE$oI#f=oHWshWgwHHE>SoW zDo@Xu+_`HgsHQV0@s!z}_0{~GIQ6=zh5YU% z7fzUxh>Vei6_PlW5r2~ie9hw-_ zchu04kx1WRqx$BJ8a^;F>e7oZz3lQ!6C+0U9XV=5h;>rlP16g6HSYiM+Sqh|*SJ`h z5OY2-+qn5|Mf=fRTyWlL`xFPMuLG`AFm`#c0jh1?u8mCQKPW z<2to8?4+4aMt`d8?1J$%i;f_n{*p;kG%Osv_?AF77fzb4_jC;_QzNa;cUQf<258ry zJ~fhRmNxHK%?F2rLL}gEV(>*54o(cc=#qo~b< z;m?`{@ne+k!Q^>uD z3uj1VKKBxnzJmK&^Lst_P3HGz?pwLQnT+URhsh}AzQ_FD%RR!%fhsZWHvsb+3nbEv zdyYx(!o83A-Gh6s`8|Mpp7}kJdx7~qk^2e;1mP^?_m15tX+13FVW|OnjQd6|QM{J> zX7hUs_fjsw>-SDBQ7lBeO!^+~kv$=d$30L||r|0Tc)DlsHMgBJCeph1g<5RwqZN;HW?iNOSw zYAhhP;(c>6KQzO>MN;rWF+} z)!*l{J9FmQWAxge_uI}(%z4k}nP+BaXJ==3XJ@Ud%i^u7PsLmNzaDR;eG=<0ZiSA& zlCpSf6910EZs?+TYq~q$n!&#x!N++~Cv7M|JN|~?yzP>BD|LQ?)rEh%z|Ht;$6p6H z44WSO?qeLd6+D37doPT9x;gR7gXuRU?oYMdb4~G%%R|+TRqPG*SWXYI8r{+Y#nj2^rx`g(~%LnmSJ zM(5v+joU5bJX{rQsHv+7qH971jF&O>I7{g*{GiNE2#As+!NnEfa3lV$YpAzsY&fl` ztgPEn8$RWlhG1=Fm1U_hgr9}Eeo?>~wk$f$fBmBB05;C4pGNSdi}cWD?V`)F{EHf| zDZ_XH!|_^(i*im~e(H)vh_0y%1VfC`*8a5>!5SDrtF5qWf>K-Sq^PLfv8|#qyrUu5 z@E);o$M)^PMvO|zDlqt>%yZtN8?qKvTwPHes<^y5R2{w+@z*b^uedf;hvB~xLcv9T zm@iwD6;*2M>~M^n4cWPhplh^=HKFROgLEIhw%#dfqf^(g+EH75)sA3Ub-=YmOf9Yv zqQFsE(7hm0u1;taS-Z8AZOf=_+i01y0`<1YxfCelNjwBUjKBVb6F4w%M`Mk+q`Ka} zBzwteOU?<_200|G-M%Di$udNoU+3Qzs=EfGvn4q|{PZ_ggu>)pa23Xy(Fi*aF_ocU zMXkRw7z)v5HDXZrwLBQ>wsDZRWZ6ocu5w2MT8ZOpxpsbaT`1g0vz2tu>{x6kT@Kyj zTw8gizxeF4P`;cM%Ms%iIpkkoVeeqU5Y40))?Qg#cTKIsE5H~hFS)^g!U;EAf4$o3 zOPy-D%wMgqm8xr%a_W`AYa269@&`kWLH`n#+ke9isK;t_39LOHJ(U#=fm6c4rtqR0 zbi=k;wf|3A_J?cOwsURZH2eSKmi^%xw*9}h>}XGmUIg{|VcPin)j2wy*#5-+zwS^z zT(w7Q-Cpz`srG2C+vqnB+M&p5cY1J7-Q(f}{~_vNy^JFqr2kL{QP~xZ80I<$$BtUN zI$Tz_t*j4CmcCL)Y3E^Mde;;-Cq5i!mgb#Pv zMEBo^*?pcp7qic7r?!_m6|T=$Zigj{h3<^Ih3BS&?AP}>FX+A-9cf+d`}L#tzub|c zsAveW$MOH)cEIgF=)mCL)DCQn7!Eox_&2o!`yfMvgY4pi9lHPfk^3Qbm8~oPBaGob z%C55i55{mGWmnl^3@5u>&oS#S!FVR-z!k^sN7-NYPx{xxvpdKxs|?|OHji`;pg5>Q zpA1#^#2;dR{;Rvw);A~rLtU_akTLnczCWD{JXDltNdCUNQ|?K-y3#%2xm|E&T}@3z zZ6IdYz7)f5B;t9q3>Qxg)wur~Y>YL+WlqJl|EifS+{v;2_5SOZI1ZPb<_>V1aVPNx ze={zI&FT9?oiMJdV~bjrwWuK&uBhf%cv}U=$Z7iwnNW{B3 z?oA+$O>rxyVn?_Rw}E&y6DX_RhKmXgS;GzXjv!88wRoIX!Mi}qbH$EzF3jI&oU5Cm zI1|3NC9*xxKsjb>P?($Jma)u!pZ3NLC{x;pKLUAsg|>=0UbHc03uqAM$^GGO+cXzK=3W{0M_Y+r0;fsSp3^ zjlO^F2*KFwAV)=2(5?s{?68PADpumCsJjLe7~a1rz425^ZVe_91k)+@ci%x*#{hBwi-r%K+S&i zgX{y2u@i&he#`rg#jMDE{fUbQm)wzf(yYPKj>OWBE!l~;x4Q7xtNupuZyqLU$S`#L z?7`nWocLmLB;$vPfk@X66ZfCH1-FPBui1{A9EL{!;$?VD;5-<>?;O|BMO%s;hih@aT07_E zNIfoMG&@rmtjHZtBrdkE#a;XwJV*^=It_em@$hmB?pzURiz+S;hWu-G;DNAJ7!1|> zi!t{GzfV5dukIQ9^&?~d$tUCC4<1v~8!HZAs9qpKS$NEq;iG^Fzj)0# z>-_7^UyHJ`1Y(MmGa=?s&a7}IJOnYX1hZTk{q+r)qT=6lB_^U>!_t+k*<5mAv45jG zab@s@-HGcGBDVb{%F(oegxJBR0* z>QKnf$0vT=WX02o6{uo7f(SHP8`fOlFR9ys$t#%7;?Bi$=KF*=_b2j;XA+Od*j9}e z<;|2bvr_V+9hE>hT{IqEAW5?O#veS985IJa(1=q z`}`Qqjf#)tvu{OAUy|d5o17o~Ki!H>P4A0rrK6EByxI1X@&rc_A zj880l@hv+pvgX;uMH=f<6 zB6c4B7UFN{*v(b&b#l{r6T@a{L82L2k`IH3!P2Pu{Y7e4dp25 zzx&VrcV`%rpZ#y&Vs8QLe}9#G3b6J6-X@@k97)#osXg3h}oGf5?m_ zI%(e z|Bbf}=Rejk`aXtuYp(Ne0j7w%jA{7@g;8dI=Jt{NH{R*X+&oALq(?jH8I9k9X(haV#8^Q|^ z?0%e6+~5{<>q&;`AuRZH#Vs(=B^blf`#L@Crv!6TM(|AnsqYaC-L}TFy#`s!4Aa3L z!OUPxF!e%wJ0m&xQvku#TT6{S^|ntM zrXI$6l5TJdI3lFm>~;ifM&C*BX1KFTq;VZgAV!h&pi5+-;}5SE&PuqmKEoB{NAJm=4k| zOi~WgEG&KDu&bw8Y`=c!V~Mm+v+%hRYxE7d!*zR7W!R&O2cIgTGIvSy$rM zyU~a=3nx#@y3{zh3!DJHNjdm7_!cnD=x_i(+Q95|$Sm*}4zH!pCmvg@x|BF{DXh8u zqNeakxhU(SDOntiv`-WK8`!5|UADxJIXf*N>Wrqv!t@oGYSym9LT6>9qRwCzEiy-p zZdhR9omgiCNshyakN!FMbiRp1VcMGOIBN)1EC0rlfG^b?gg6SYbFdYmCramH=`m|u` z3C&*r`vsrJF35j_*Pv7|9c&fM4ANVSJ$1ie>bZic=Lx1>DEK^fK}8~h1_8lzP$ihU z|7LFiS_M<@Z1w8Bf}H}~Vsx7sl!^!%Obe!-bgM}~z34NBsW%Iz9&U@#1yis8Y*e@1 z=4~RJHn3ALGw2jd2Sb9X4-2L~A(;9B!PN6^(*>~I(?UTs!tEq?<1H>X%(X7Z;X`)2 zn7LL6ycdiv&x%uHhI-K-TzMw85X`CAx)1F_7v+XD>pG+-vj|uLKh3%Y5#5Mz6R18+ z6d=PLSvlzwtiQd>Ey}oEZ^0bvZlo^iIu4>B-g()1tt(6&BqL z4SGel@+6uZnU`Z63E^Yg))06Ujw$4{U~bfmVEV`#HXB8~P%!naf~l7arrsnNx@|R!2pV(Lq_Q>ktXz(7?&PFwm#J%qioL8RiRK1bgy`u%8q< z?Gs)%=~uy??Al|%z!DA!118ubxCjZzGK1zfj6>RY2&TUg!PG|uQ%`$SrMK1TGDAnG zn-ST9=^$4y9qgI*7T|zj>Y=y1dRQ>^HpS5aLuZUZ=pSAOor3AWn(^uhf~j}?)2sIj zrrz?7qniOk!Mi2_4JHM%2C~r_+~DrAe8JRP1T%fRVCs7XQ%^~tzbyQzT`=lIxJ-j- zpUIF8(q~6L@k-*c^V*V3JndQ|KYs;h6MwRarg@fNn)&e|cQ?4>lRUxH_XuYC3BlCE zhkMhv35IT4d2_u6#e(UeMKCjH6HGmiSE^2M3s@|e`o8&IJ$Zp)=jPA;R1?7rGLA6p zI5^TUb!(wv>X}CyroL4$^@3x(dc9!h=1=GGUV|yYbkKH!S055gy=RG69~DeJ?c-j3 zt6=9oLRyyBAWtwIObO-|rk-N#sgEu-Og$~zF!icshN*WMc5nWa zhN<_hFw6}038tRFn-xw_jX27xBTZTDH7F8H2m1sw1M4(nPd)u~!_>0`Q&0YcSI^hX zj+6$)Izk=QrGlx~$M9&2IX6|Hrza1=j>G&b!R~?N8-^5Fk%up>I?_gc^!@mro*=N zUcEyw^$EdFgAh!;^cb-)gmt3lKb^9e0jc||2 zw5{5}?KN@*)4_ybr-lSO1-Q(czFRQ$whE=|(UfzO2ZFx)5x&CfAni)SbdYd^VHO}; zF!f!6sSgXL-gJwbK02Dpy45(O!N_ff=^*`f!_di4~+)U!Jr-HfKX z-3UnTE@;2g>!3q09qjwES5J!=roQ!V!z^H*U?=@os55`n@1}Q|1T<*=nqfNV7fgMq z+pCWXew_U>I05(QbjQ~GO|ShJ*~wpR@%XpA29tuBVYt_;cM7Inb)Q$S7fgNp0k7`w zo2Bws1qeUrHP|Vb4tfN$MtTKP9}-M`mtg991ydh=aF)CMdY|u$G1xDd4q6{F1tf39 z8cJ?(pPWvMQyrg2ko8T?5$uu~Fvsk?9q}u$Rc;%DKOiEZJju#X2E1>P3Dyo?2WNq` z0}9zfKNOq`W)YdeLU11VZN*vCD-5q;di!z{aSTQCZ+eAA>1Pyux(?OqL>N^L#1so7ez4?b;z4S+hsrLzXZW9fO2pS~q zHVIgORKe6!pY-baf~gnn@#IFO#47z3{a7_Y0;zE!a82 zW<&%HhW_GpFe#XN|KGj(KEc!jQ(iqRnEK?KLU&G`(6vo_dL3>V5Bc^}T|rm%kg; z-OGr26X6_foU7#qcNCu@m<~#28GRf_UlX2gxTh9(;>k{&THKIky$YR-Q=oHpe;3>l zWjoDE!4c9KjYzXj0(XJ+xr!O?6Nk|neMBK%KU6Ij1)_bkVAfEpVCo&3^<_k-j!+}I zy@KgrR4^T6#G4wRo-LSqr(o*6f~ofZ-(uH=`hRZ z)pG???-$Gh4Y|x?!R>^SXL}u_3U;~r3!=>h9T^969PU=CmVggrB8U#XwA&$aG{u7hqPr7;B>I0OZD`T|u02Sg*= zbr1);nZOBitY@H;!)T>?7bP8Lbk2}VF!c_wo4+bRO0w5MhG04vo?~=!bIe0U z&Y*R}TfMCg6mACrN9 zvB{7dR4AAQXc7#47FMhXawUk6zmEdr}vE zt~E~|sEAkFVO#An4zo@)8L$9(g6VMTB(I)&vSI3_ry6GZKEc#mbByjh(+G^168hg; zLTkj60H=WE(gFDACjBV~NuL{IpPy^eJEQ)vh+qjP1ak{!1XJI-LO1}21XJ%9%=80- zsZR@D>0}@xXi%`yo55Pa)Z11@&QJ6mYxj$ICnLeM>*j-4C%D~Ak6`LUd0u@~F!lb` zUVT_Fblb`*^ctjYFiZzCG2AMS!ZWa|I>AiANnhuKy96`+F44Hlp_6svuAYrPbhn6L zf)dddb{wQFB%Nyt*aDrLj`{uiRFb*H=&aF<62o7FJ(=^TY2Rrhg6m`Q`iBt@gSl3w z<|n~iLo-R~<6y3r$t|G$0WjCxOjDcy!@WX320S77bnrg#sIs@WAfor;c&lEV3=^)@CI!>M0m0N~ z1XH)JFa@GsAeefw%N)a?6{AWRF(ew{)Ro2o6C{NU)8T%>)Mo@!&#p1{)C&YtZ+3<+ z&KSyV?OuhLo!>oZ8!PKp(h=c?Io6pd5Lq5}V?w7rR~XjzbU4{< zm^xP&mU`eG!_@2V5o6d-Awxu195b;-=&-UPb^Q?LJ~SML!_J+0TP=L)92_W|2$ zF#dpH8e~3bm?bU{>=dBitG5ci5*suCmW{gfJ6`*cEh6Y}=YZFsN3fIOV_v;kF!hP= zdi5#6)Mp00x}7v+B508PJ;U7MJi*kvcX@TL9_{pACpbr)ZB2;? z8npbxV_>xkrd}}Y)e8kv4?XGCTLn{Z{h8Ep{I!V)8Z?ba0}L1hQ%`={s|N&A-~EhN zPu*jfdgil+ov~xPh@e5*%azL>@|8M=9*B~sI4!Q+%3wi`o zpL)%k-kLH@eXn4qA61O@?;f{JubTukXckNdC2xB5fMDuvZ+Z20!PJZX;nmAs=K0Sp zK*qaXgM7hsP%w)FGzRx{T_X7FX!Yc7F@6}0_u5Yhei-)Twglv_50l~~Z-QpQ-$#NL zusl82^Vz2p+yXTVW`TdmRi39zlV~TX9ELZ@|<%uRYh` zcf%a(*RUt+3lA2cd_jVGtyooQXhGyt3vf-?zStzB;dF*!wvFTy3{x+}R|nkS)&##o zpqY9-p8`9<)q4a}&&cuUcvnJ1(4cjN$H3Ytn0i;9S055gefo5-o}6!(dZ}RN8OK%; zL4#dqm;|hWVZqebp6S(#1XFJk%=9gSsSlhb(z8tri3l1T5KISCf~gm85)Qy6f~n^f zd-Z(5)B~H1?mXA15)m{Q-eL?`fHA?;3;7`53GO~F68sVxA2~xDo`H+K_VtEs>+eXw zh&(*&(5-vI7&!Mkrv$SAouBkN>=o=g3>$Dsf)y72(l7Jc=S5ka6V^r}+$|~;%nUm| z<#o^_cpfq&r-%$Y%Dwgjg6YqyRJwkyk*On84>=L=I+zwr2M4x$^^7XR)O)Tl%w0Gv znEGgqtE2t7TbxmA63`%UqhUG-*@mg_Z#7Ik;TFTxTW>W?y+g25fX_HO+rL|YeQt!q zG}!f=xlOn9Fqc~p&sm_W!TF>39*g1);1D=jaV5A3%z1^hZvhYg+Wj63xg9*>F!E%pe%tK3U<+$d9If=d;B+uok)i!7;CwI_Rv;&!WF=tU zx*>A|yLoeq+s}K<=`iR;1S>_q(zr+5%~}GT?CNP&E_g3k&orUKJbW<54RftCq3fV; zLASM;T|)c5I}%j>s?qhcL{4z;aqs_{aaec|hdaOIb=W2NJoxDr%nU~bQ=j+}&&f_u z7Y|E^&Y|0(>O!O32vK87fgNUm%aMXmt$J>z8Hi3g6UvV>=N=mHPx6a zTa+B6hQbk(A?^L0hO20=w_oq0EMZU!12Pw6&^=?|F5`eT&?NYCuqX2>OxsU&dF^w* zYM2GG3q%ARt`$s!y@IKa3#L9PnEC<1)UB_X45=pwhK@JxL<9|*1k*v<*S!w11ylET zd-XiQ)b|Re|9yg;=Lsd>@H(g$Ob4mo^y*oHsh0|72IYdOcYVv7eps;cjzrP7y#`wa z)4@K$%wS3|^@3h+`Xa&9ci!jK`vp7KghTgx4R#BrgZ2l!dWT@@qk>t$F~QXL_IcCq zGwfay=Jk6G+62=<>LXs=FPM6{U>0DHVCw!yz3D?yR_Fh;A!EP<=}EZP?gY25J|K?! zhjEyZnS!$zIS+G6@UzgT!H9PB=fN{Ve;I6DrF6cX9*_6$;&cS~IPfgNEKrsx(8s;+ z>%Ge@4#jLh_V>&NQC};V{)!c&|8cv@k{E-qU^-|KOb4BUsdo#eJ}#L0KEcig{lF<8 z`#)6xH^N~jgI(S&*e#g)#N%E)>4%1?5AQb20_6YLF!geWo&MJ?Kv#@G;gjA3W8&;M zvKg&hp02TE)41TPz!QR*VFGrk8`7*%EM7;xpZT*9t;9ZkC}y9R&J~UDAp5*r6mTna za+)|-RQ=3s0BfL0FbmW^BF_Ib=t6`W+|zN}Q--N`3ceK?lI5tk9AZd9R>vd6AsBu!eQr2COz%P1=C;FpFFy4<%$RzjK1tKuu@(z zOua=gGZ+<2z3??-PkonQ>LXK9$MH8NA{>L)r2%xo)c3sM)yD-p`m|S{5KR5RKZMTX zKXb-J&|uof%Mb>)W7;~~F!kia408*M1ye6g_Ud85PWm}Ucdq}_MFb6o=NSWLkTu^h z^?uQlrJ<)Ia}(H+Q4d5Xj?A?dxr^B$7CoL?S|!)`v#nELz=(k8xmp&O3|W9q!A=IL zUcE^$^;W@5-zJ!PN0f2?cQS}ZxIN#HVCuty>EM81>eGU$rySueV47g+rJD8i|5hD= zeNKZe!OWmrF!iw`y%{7gG)%oU%`nrC3Z|a&F;~aps%{NrsR%L+h9i$>V!F|;W4(T? z;|$X*dy!%0(f-9hK}{~GQ9@bCmE)L%u@`r0Ihp72XDl^L zeXU?;0|Yyl2Sqt10S&@}>7Zb_S1%MyJt5btCkv+DBbffj1Ur`p;ZJ9nb_%%Kn?6afb9s;|BIqDZFdY;Kc4|m4_3|@J2IOMD7}tRJiGkHR^afw=kZ!n|vhr!>CGNwK6 zLd0M+BF%aVJS6y6;O`4&0YVp<8z+B)u7mCXcZwRpodb)^bt3gJV&D_1#&q|vTSus) zb6ha1d_ph_kj^)eoZuea8G@;I2xj^&!PM6lxao0vavc<_2;Du@ukmKkESL_G&+_Ui zf~g1AdG$8I)JNAlI!}*o0rtBQ4%49PJgU#xKFTB9`qh3mO@>c~YuJ9V{5=;k^g6ZIZVCtdE zz3Ib(srOZS^--{!zbZg-&})z@*va5Zuiht^dRoY!PIbp7K78+GP7K+oiaQSv!iC`x90r~+qxC5b3 zbYZ!UK7D? z2pUugra?$B^;W^u+XPcji(Ix0!-|>DcsJDFW|(F@pEXQ3eS)bM-|p1|f~gM(X8K)% zq1#q(yVt>xU^>XV)2nw2rk?p_ubw5CdcI&5pf_Udonb||(?rl02g(21(yGOa~=>hN%w;rXGIS=;YjG=2#(5aOE>G{QZ{?GsD~ zJ>T&bpkFZc?nh&E!PJumyn3o;JrgBQN1%gc2@3?%!Kh&B`vgr>GBEi(V2EBTp zVsz_stQSz_jA+IKU_I~|`LQ=a=1&aMVc$;;vp~B9I~hLV)rSRBANiT1^R(h_@uVB! zFbztd^E%iqnELpbSGRs^n0oVsVHU7oF!kO)Qg=>kYFy()AWog*CjabpkU43X4nlu7 z%nXJEQ=k5aS1+G2OuhIWuzOl{3sBDpC#WmWIeP5s>Pd$irh}A)hFO4e!PNbJuO1Ri zz2`)q8CKB2BqH4479i^s!_-59>7Z}9SDzG2J+RuVcM7Inwch7$zpnByIu19aS+Ao} zUM)J7I84sJMsPB?NiZGui-&+mLDxZ_<%ids0%brSUT>R-e38Jy{gJZ-YX^G^jeQaH zF~PCvD-V)B}p5|G7@T8d^Zec?GQ3DKxtnWhyN6J?Ej>}>IN`l!F(Lti^0X8bKg~1#DhHx$BxRtj~M_