diff --git a/tasmota/xsns_83_neopool.ino b/tasmota/xsns_83_neopool.ino index 599cbd502..b1c9fbcbc 100644 --- a/tasmota/xsns_83_neopool.ino +++ b/tasmota/xsns_83_neopool.ino @@ -78,13 +78,13 @@ /*********************************************************************************************\ - * Sugar Valley Modbus Register (* register are currently used) + * Sugar Valley Modbus Register (addresses marked with * are queried with each polling cycle) * (see https://downloads.vodnici.net/uploads/wpforo/attachments/69/171-Modbus-registers.pdf) \*********************************************************************************************/ enum NeoPoolRegister { // addr Unit Description // ------ ------ ------------------------------------------------------------ - // MODBUS page (0x0000 - 0x002E - unknown - for internal use only) + // MODBUS page (0x00xx) - undocumented - for internal use MBF_POWER_MODULE_VERSION = 0x0002, // 0x0002 undocumented - power module version (MSB=Major, LSB=Minor) MBF_POWER_MODULE_NODEID = 0x0004, // 0x0004 undocumented - power module Node ID (6 register 0x0004 - 0x0009) MBF_POWER_MODULE_REGISTER = 0x000C, // 0x000C undocumented - Writing an address in this register causes the power module register address to be read out into MBF_POWER_MODULE_DATA, see MBF_POWER_MODULE_REG_* @@ -595,6 +595,7 @@ bool neopool_first_read = true; #endif // NEOPOOL_OPTIMIZE_READINGS bool neopool_error = true; +uint16_t neopool_model_option; uint16_t neopool_power_module_version; uint16_t neopool_power_module_nodeid[6]; @@ -613,10 +614,9 @@ struct { const uint16_t cnt; uint16_t *data; } NeoPoolReg[] = { - // 8 entries each poll needs 2 sec for complete register set + // complete poll cycle needs 7x250 ms to read complete register set {MBF_ION_CURRENT, MBF_NOTIFICATION - MBF_ION_CURRENT + 1, nullptr}, {MBF_CELL_RUNTIME_LOW, MBF_CELL_RUNTIME_POL_CHANGES_HIGH - MBF_CELL_RUNTIME_LOW + 1, nullptr}, - {MBF_PAR_VERSION, MBF_PAR_MODEL - MBF_PAR_VERSION + 1, nullptr}, {MBF_PAR_TIME_LOW, MBF_PAR_FILT_GPIO - MBF_PAR_TIME_LOW + 1, nullptr}, {MBF_PAR_ION, MBF_PAR_FILTRATION_CONF - MBF_PAR_ION + 1, nullptr}, {MBF_PAR_UICFG_MACHINE, MBF_PAR_UICFG_MACH_VISUAL_STYLE - MBF_PAR_UICFG_MACHINE + 1, nullptr}, @@ -981,7 +981,7 @@ void (* const NPCommand[])(void) PROGMEM = { /*********************************************************************************************/ -void NeoPool250ms(void) // Every 250 mSec +void NeoPoolPoll(void) // Every 250 mSec { if (!neopool_poll) { return; @@ -1098,6 +1098,7 @@ bool NeoPoolInitData(void) bool res = false; neopool_error = true; + neopool_model_option = 0xFFFF; neopool_power_module_version = 0; memset(neopool_power_module_nodeid, 0, sizeof(neopool_power_module_nodeid)); for (uint32_t i = 0; i < nitems(NeoPoolReg); i++) { @@ -1346,9 +1347,18 @@ uint32_t NeoPoolGetSpeedIndex(uint16_t speedvalue) } +uint16_t NeoPoolModelOption(void) +{ + if (0xFFFF == neopool_model_option) { + neopool_model_option = NeoPoolGetData(MBF_PAR_MODEL); + } + return neopool_model_option; +} + + bool NeoPoolIsHydrolysis(void) { - return (((NeoPoolGetData(MBF_PAR_MODEL) & MBMSK_MODEL_HIDRO)) || + return (((NeoPoolModelOption() & MBMSK_MODEL_HIDRO)) || (NeoPoolGetData(MBF_HIDRO_STATUS) & (MBMSK_HIDRO_STATUS_CTRL_ACTIVE | MBMSK_HIDRO_STATUS_CTRL_ACTIVE))); } @@ -1379,7 +1389,7 @@ bool NeoPoolIsConductivity(void) bool NeoPoolIsIonization(void) { - return (NeoPoolGetData(MBF_PAR_MODEL) & MBMSK_MODEL_ION); + return (NeoPoolModelOption() & MBMSK_MODEL_ION); } @@ -2466,7 +2476,7 @@ bool Xsns83(uint8_t function) } else if (neopool_active) { switch (function) { case FUNC_EVERY_250_MSECOND: - NeoPool250ms(); + NeoPoolPoll(); break; case FUNC_COMMAND: result = DecodeCommand(kNPCommands, NPCommand);