AqualinkD/source/config.h

365 lines
15 KiB
C

#ifndef CONFIG_H_
#define CONFIG_H_
#include "utils.h"
#include "aq_serial.h"
#include "aqualink.h"
#define CONFIG_DEV_TEST
#define CONFIG_EDITOR
//#define DEFAULT_LOG_LEVEL 10
#define DEFAULT_LOG_LEVEL LOG_NOTICE
//#define DEFAULT_WEBPORT "6580"
//#define DEFAULT_WEBROOT "./"
#define DEFAULT_WEBPORT "80"
#define DEFAULT_WEBROOT "/var/www/aqualinkd/"
#define DEFAULT_SERIALPORT "/dev/ttyUSB0"
#define DEFAULT_DEVICE_ID "0x0a"
#define DEFAULT_MQTT_DZ_IN NULL // "domoticz/in"
#define DEFAULT_MQTT_DZ_OUT NULL // "domoticz/out"
#define DEFAULT_HASS_DISCOVER "homeassistant"
#define DEFAULT_MQTT_AQ_TP "aqualinkd"
#define DEFAULT_MQTT_SERVER NULL
#define DEFAULT_MQTT_USER NULL
#define DEFAULT_MQTT_PASSWD NULL
//#define DEFAULT_SWG_ZERO_IGNORE_COUNT 0
#define MQTT_ID_LEN 18 // 20 seems to kill mosquitto 1.6
// For aqconfig.read_RS485_devmask
#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_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
#define READ_RS485_IAQUALNK (1 << 6) // Read iAqualink messages
#define READ_RS485_HEATPUMP (1 << 7) // Read HeatPump messages
#define MAX_RSSD_LOG_FILTERS 4
struct aqconfig
{
char *config_file;
char *serial_port;
unsigned int log_level;
char *socket_port;
char *web_directory;
unsigned char device_id;
unsigned char rssa_device_id;
int16_t paneltype_mask;
#if defined AQ_ONETOUCH || defined AQ_IAQTOUCH
unsigned char extended_device_id;
unsigned char extended_device_id2;
bool extended_device_id_programming;
bool enable_iaqualink;
//bool enable_RS_device_value_print;
#endif
bool deamonize;
#ifndef AQ_MANAGER // Need to uncomment and clean up referances in future.
char *log_file;
#endif
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;
bool mqtt_hass_discover_use_mac;
char mqtt_ID[MQTT_ID_LEN+1];
int dzidx_air_temp;
int dzidx_pool_water_temp;
int dzidx_spa_water_temp;
int dzidx_swg_percent;
int dzidx_swg_ppm;
int dzidx_swg_status;
float light_programming_mode;
int light_programming_initial_on;
int light_programming_initial_off;
bool override_freeze_protect;
#ifdef AQ_PDA
bool pda_sleep_mode;
#endif
bool convert_mqtt_temp;
bool convert_dz_temp;
bool report_zero_spa_temp;
bool report_zero_pool_temp;
//bool read_all_devices;
//bool read_pentair_packets;
uint8_t read_RS485_devmask;
bool use_panel_aux_labels; // Took this option out of config
uint8_t force_device_devmask;
//int swg_zero_ignore; // This can be removed since this was due to VSP that's been fixed.
bool display_warnings_web;
bool log_protocol_packets; // Read & Write as packets
bool log_raw_bytes; // Read as bytes
unsigned char RSSD_LOG_filter[MAX_RSSD_LOG_FILTERS];
//bool log_raw_RS_bytes;
bool mqtt_timed_update;
bool sync_panel_time;
bool enable_scheduler;
int8_t schedule_event_mask; // Was int16_t, but no need
int sched_chk_pumpon_hour;
int sched_chk_pumpoff_hour;
bool ftdi_low_latency;
int frame_delay;
bool device_pre_state;
#ifdef AQ_NO_THREAD_NETSERVICE
int rs_poll_speed; // Need to remove
bool thread_netservices; // Need to remove
#endif
};
#ifndef CONFIG_C
extern struct aqconfig _aqconfig_;
#else
struct aqconfig _aqconfig_;
#endif
#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_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 READ_RSDEV_iAQLNK ((_aqconfig_.read_RS485_devmask & READ_RS485_IAQUALNK) == READ_RS485_IAQUALNK)
#define READ_RSDEV_HPUMP ((_aqconfig_.read_RS485_devmask & READ_RS485_HEATPUMP) == READ_RS485_HEATPUMP)
#define isPDA_IAQT (_aqconfig_.device_id == 0x33)
//#define isPDA ((_aqconfig_.paneltype_mask & RSP_PDA) == RSP_PDA)
#define FORCE_SWG_SP (1 << 0)
#define FORCE_POOLSPA_SP (1 << 1)
#define FORCE_FREEZEPROTECT_SP (1 << 2)
#define FORCE_CHEM_FEEDER (1 << 3)
#define FORCE_CHILLER (1 << 4)
#define ENABLE_SWG ((_aqconfig_.force_device_devmask & FORCE_SWG_SP) == FORCE_SWG_SP)
#define ENABLE_HEATERS ((_aqconfig_.force_device_devmask & FORCE_POOLSPA_SP) == FORCE_POOLSPA_SP)
#define ENABLE_FREEZEPROTECT ((_aqconfig_.force_device_devmask & FORCE_FREEZEPROTECT_SP) == FORCE_FREEZEPROTECT_SP)
#define ENABLE_CHEM_FEEDER ((_aqconfig_.force_device_devmask & FORCE_CHEM_FEEDER) == FORCE_CHEM_FEEDER)
#define ENABLE_CHILLER ((_aqconfig_.force_device_devmask & FORCE_CHILLER) == FORCE_CHILLER)
/*
#ifndef CONFIG_C
#ifdef AQUALINKD_C
extern struct aqconfig _aqconfig_;
#else
extern const struct aqconfig _aqconfig_;
#endif
#endif
*/
void init_parameters (struct aqconfig * parms);
//bool parse_config (struct aqconfig * parms, char *cfgfile);
//void readCfg (struct aqconfig *config_parameters, char *cfgFile);
//void readCfg (struct aqconfig *config_parameters, struct aqualinkdata *aqualink_data, char *cfgFile);
void read_config(struct aqualinkdata *aqdata, char *cfgFile);
void init_config();
bool writeCfg (struct aqualinkdata *aqdata);
bool setConfigValue(struct aqualinkdata *aqdata, char *param, char *value);
bool mac(char *buf, int len, bool useDelimiter);
char *cleanalloc(char *str);
char *ncleanalloc(char *str, int length);
const char *pumpType2String(pump_type ptype);
#ifdef CONFIG_EDITOR
int save_config_js(const char* inBuf, int inSize, char* outBuf, int outSize, struct aqualinkdata *aqdata);
void check_print_config (struct aqualinkdata *aqdata);
#endif
#if defined(CONFIG_DEV_TEST) || defined(CONFIG_EDITOR)
typedef enum cfg_value_type{
CFG_STRING,
CFG_INT,
CFG_FLOAT,
CFG_HEX,
CFG_BOOL,
CFG_BITMASK,
CFG_SPECIAL
} cfg_value_type;
#endif
#ifdef CONFIG_DEV_TEST
typedef struct cfgParam {
void *value_ptr;
void *default_value;
//int max_value; // Max length of string (maybe mad int as well)
cfg_value_type value_type;
char *name;
char *valid_values;
uint8_t mask;
bool advanced;
} cfgParam;
#ifndef CONFIG_C
extern cfgParam _cfgParams[];
extern int _numCfgParams;
#else
cfgParam _cfgParams[100];
int _numCfgParams;
#endif // CONFIG_C
#endif // CONFIG_DEV_TEST
// Below are missed
//RSSD_LOG_filter
//debug_log_mask
#define CFG_V_BOOL "[\"Yes\", \"No\"]"
#define CFG_N_serial_port "serial_port"
#define CFG_C_serial_port 11
#define CFG_N_log_level "log_level"
#define CFG_V_log_level "[\"DEBUG\", \"INFO\", \"NOTICE\", \"WARNING\", \"ERROR\"]"
#define CFG_C_log_level 9
#define CFG_N_socket_port "socket_port" // Change to Web_socket
#define CFG_C_socket_port 11
#define CFG_N_web_directory "web_directory"
#define CFG_C_web_directory 13
#define CFG_N_device_id "device_id"
#define CFG_V_device_id "[\"0x0a\", \"0x0b\", \"0x09\", \"0x08\", \"0x60\", \"0xFF\"]"
#define CFG_C_device_id 9
#define CFG_N_rssa_device_id "rssa_device_id"
#define CFG_V_rssa_device_id "[\"0x00\", \"0x48\", \"0xFF\"]"
#define CFG_C_rssa_device_id 14
#define CFG_N_RSSD_LOG_filter "RSSD_LOG_filter"
#define CFG_C_RSSD_LOG_filter 15
#define CFG_N_panel_type "panel_type"
#define CFG_C_panel_type 10
#define CFG_N_extended_device_id "extended_device_id"
#define CFG_V_extended_device_id "[\"0x00\", \"0x30\", \"0x31\", \"0x32\", \"0x33\", \"0x40\", \"0x41\", \"0x42\", \"0x43\", \"0xFF\"]"
#define CFG_C_extended_device_id 18
#define CFG_N_sync_panel_time "sync_panel_time"
#define CFG_C_sync_panel_time 15
//#define CFG_N_extended_device_id2 "extended_device_id2"
//#define CFG_C_extended_device_id2 20
#define CFG_N_extended_device_id_programming "extended_device_id_programming"
#define CFG_C_extended_device_id_programming 30
#define CFG_N_enable_iaqualink "enable_iaqualink"
#define CFG_C_enable_iaqualink 16
#define CFG_N_log_file "log_file"
#define CFG_C_log_file 8
#define CFG_N_mqtt_aq_topic "mqtt_aq_topic"
#define CFG_C_mqtt_aq_topic 13
#define CFG_N_mqtt_server "mqtt_address"
#define CFG_C_mqtt_server 12
#define CFG_N_mqtt_user "mqtt_user"
#define CFG_C_mqtt_user 9
#define CFG_N_mqtt_passwd "mqtt_passwd"
#define CFG_C_mqtt_passwd 11
#define CFG_N_mqtt_hass_discover_topic "mqtt_ha_discover_topic"
#define CFG_C_mqtt_hass_discover_topic 24
#define CFG_N_mqtt_hass_discover_use_mac "mqtt_ha_discover_use_mac"
#define CFG_C_mqtt_hass_discover_use_mac 27
#define CFG_N_mqtt_timed_update "mqtt_timed_update"
#define CFG_C_mqtt_timed_update 17
//#define CFG_N_mqtt_ID "mqtt_ID"
//#define CFG_C_mqtt_ID 7
#define CFG_N_mqtt_dz_sub_topic "mqtt_dz_sub_topic"
#define CFG_C_mqtt_dz_sub_topic 17
#define CFG_N_mqtt_dz_pub_topic "mqtt_dz_pub_topic"
#define CFG_C_mqtt_dz_pub_topic 17
#define CFG_N_dzidx_air_temp "dzidx_air_temp"
#define CFG_C_dzidx_air_temp 14
#define CFG_N_dzidx_pool_water_temp "dzidx_pool_water_temp"
#define CFG_C_dzidx_pool_water_temp 21
#define CFG_N_dzidx_spa_water_temp "dzidx_spa_water_temp"
#define CFG_C_dzidx_spa_water_temp 20
#define CFG_N_dzidx_swg_percent "dzidx_SWG_percent"
#define CFG_C_dzidx_swg_percent 17
#define CFG_N_dzidx_swg_ppm "dzidx_SWG_PPM"
#define CFG_C_dzidx_swg_ppm 13
#define CFG_N_dzidx_swg_status "dzidx_SWG_Status"
#define CFG_C_dzidx_swg_status 16
#define CFG_N_light_programming_mode "light_programming_mode"
#define CFG_C_light_programming_mode 22
#define CFG_N_light_programming_initial_on "light_programming_initial_on"
#define CFG_C_light_programming_initial_on 28
#define CFG_N_light_programming_initial_off "light_programming_initial_off"
#define CFG_C_light_programming_initial_off 29
#define CFG_N_override_freeze_protect "override_freeze_protect"
#define CFG_C_override_freeze_protect 23
#define CFG_N_pda_sleep_mode "pda_sleep_mode"
#define CFG_C_pda_sleep_mode 14
#define CFG_N_convert_mqtt_temp "mqtt_convert_temp_to_c"
#define CFG_C_convert_mqtt_temp 22
#define CFG_N_convert_dz_temp "dz_convert_temp_to_c"
#define CFG_C_convert_dz_temp 20
#define CFG_N_report_zero_spa_temp "report_zero_spa_temp"
#define CFG_C_report_zero_spa_temp 20
#define CFG_N_report_zero_pool_temp "report_zero_pool_temp"
#define CFG_C_report_zero_pool_temp 21
#define CFG_N_read_RS485_devmask "read_RS485_devmask"
#define CFG_C_read_RS485_devmask 18
#define CFG_N_use_panel_aux_labels "use_panel_aux_labels"
#define CFG_C_use_panel_aux_labels 20
#define CFG_N_force_swg "force_swg"
#define CFG_C_force_swg 9
#define CFG_N_force_ps_setpoints "force_ps_setpoints"
#define CFG_C_force_ps_setpoints 18
#define CFG_N_force_frzprotect_setpoints "force_frzprotect_setpoints"
#define CFG_C_force_frzprotect_setpoints 26
#define CFG_N_force_chem_feeder "force_chem_feeder"
#define CFG_C_force_chem_feeder 17
#define CFG_N_force_chiller "force_chiller"
#define CFG_N_display_warnings_web "display_warnings_web"
#define CFG_C_display_warnings_web 20
#define CFG_N_log_protocol_packets "log_protocol_packets"
#define CFG_C_log_protocol_packets 20
#define CFG_N_device_pre_state "device_pre_state"
#define CFG_C_device_pre_state 16
#define CFG_N_read_RS485_swg "read_RS485_swg"
#define CFG_C_read_RS485_swg 14
#define CFG_N_read_RS485_ePump "read_RS485_ePump"
#define CFG_C_read_RS485_ePump 16
#define CFG_N_read_RS485_vsfPump "read_RS485_vsfPump"
#define CFG_C_read_RS485_vsfPump 18
#define CFG_N_read_RS485_JXi "read_RS485_JXi"
#define CFG_C_read_RS485_JXi 14
#define CFG_N_read_RS485_LX "read_RS485_LX"
#define CFG_C_read_RS485_LX 13
#define CFG_N_read_RS485_Chem "read_RS485_Chem"
#define CFG_C_read_RS485_Chem 15
#define CFG_N_read_RS485_iAqualink "read_RS485_iAqualink"
#define CFG_C_read_RS485_iAqualink 20
#define CFG_N_read_RS485_HeatPump "read_RS485_HeatPump"
#define CFG_N_enable_scheduler "enable_scheduler"
#define CFG_C_enable_scheduler 16
#define CFG_N_event_check_poweron "event_poweron_check_pump"
#define CFG_C_event_check_poweron 24
#define CFG_N_event_check_freezeprotectoff "event_freezeprotectoff_check_pump"
#define CFG_C_event_check_freezeprotectoff 33
#define CFG_N_event_check_boostoff "event_boostoff_check_pump"
#define CFG_C_event_check_boostoff 25
#define CFG_N_event_check_pumpon_hour "event_check_pumpon_hour"
#define CFG_C_event_check_pumpon_hour 23
#define CFG_N_event_check_pumpoff_hour "event_check_pumpoff_hour"
#define CFG_C_event_check_pumpoff_hour 24
#define CFG_N_event_check_usecron "event_check_use_scheduler_times"
#define CFG_C_event_check_usecron 32
#define CFG_N_ftdi_low_latency "ftdi_low_latency"
#define CFG_C_ftdi_low_latency 16
#define CFG_N_rs485_frame_delay "rs485_frame_delay"
#define CFG_C_rs485_frame_delay 17
#endif