diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 950b1980..a13d2bf6 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -323,6 +323,8 @@ void showInfo() { myDebug_P(PSTR(" System logging set to Verbose")); } else if (sysLog == EMS_SYS_LOGGING_THERMOSTAT) { myDebug_P(PSTR(" System logging set to Thermostat only")); + } else if (sysLog == EMS_SYS_LOGGING_SOLARMODULE ) { + myDebug_P(PSTR(" System logging set to Solar Module only")); } else { myDebug_P(PSTR(" System logging set to None")); } @@ -1298,7 +1300,10 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) { } else if (strcmp(second_cmd, "t") == 0) { ems_setLogging(EMS_SYS_LOGGING_THERMOSTAT); ok = true; - } else if (strcmp(second_cmd, "r") == 0) { + } else if (strcmp(second_cmd, "s") == 0) { + ems_setLogging(EMS_SYS_LOGGING_SOLARMODULE ); + ok = true; + }else if (strcmp(second_cmd, "r") == 0) { ems_setLogging(EMS_SYS_LOGGING_RAW); ok = true; } else if (strcmp(second_cmd, "n") == 0) { diff --git a/src/ems.cpp b/src/ems.cpp index 93eb0c01..4b1906a5 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -63,6 +63,7 @@ void _process_SM100Energy(_EMS_RxTelegram * EMS_RxTelegram); // ISM1 void _process_ISM1StatusMessage(_EMS_RxTelegram * EMS_RxTelegram); +void _process_ISM1Set(_EMS_RxTelegram * EMS_RxTelegram); // HeatPump HP void _process_HPMonitor1(_EMS_RxTelegram * EMS_RxTelegram); @@ -129,6 +130,8 @@ const _EMS_Type EMS_Types[] = { {EMS_MODEL_OTHER, EMS_TYPE_HPMonitor1, "HeatPumpMonitor1", _process_HPMonitor1}, {EMS_MODEL_OTHER, EMS_TYPE_HPMonitor2, "HeatPumpMonitor2", _process_HPMonitor2}, {EMS_MODEL_OTHER, EMS_TYPE_ISM1StatusMessage, "ISM1StatusMessage", _process_ISM1StatusMessage}, + {EMS_MODEL_OTHER, EMS_TYPE_ISM1Set, "ISM1Set", _process_ISM1Set}, + // RC10 {EMS_MODEL_RC10, EMS_TYPE_RCTime, "RCTime", _process_RCTime}, @@ -301,16 +304,17 @@ void ems_init() { EMS_Boiler.pump_mod_min = EMS_VALUE_INT_NOTSET; // Boiler circuit pump modulation min. power // Solar Module values - EMS_SolarModule.collectorTemp = EMS_VALUE_SHORT_NOTSET; // collector temp from SM10/SM100 - EMS_SolarModule.bottomTemp = EMS_VALUE_SHORT_NOTSET; // bottom temp from SM10/SM100 - EMS_SolarModule.pumpModulation = EMS_VALUE_INT_NOTSET; // modulation solar pump SM10/SM100 - EMS_SolarModule.pump = EMS_VALUE_INT_NOTSET; // pump active - EMS_SolarModule.EnergyLastHour = EMS_VALUE_SHORT_NOTSET; - EMS_SolarModule.EnergyToday = EMS_VALUE_SHORT_NOTSET; - EMS_SolarModule.EnergyTotal = EMS_VALUE_SHORT_NOTSET; - EMS_SolarModule.device_id = EMS_ID_NONE; - EMS_SolarModule.model_id = EMS_MODEL_NONE; - EMS_SolarModule.product_id = EMS_ID_NONE; + EMS_SolarModule.collectorTemp = EMS_VALUE_SHORT_NOTSET; // collector temp from SM10/SM100 + EMS_SolarModule.bottomTemp = EMS_VALUE_SHORT_NOTSET; // bottom temp from SM10/SM100 + EMS_SolarModule.pumpModulation = EMS_VALUE_INT_NOTSET; // modulation solar pump SM10/SM100 + EMS_SolarModule.pump = EMS_VALUE_INT_NOTSET; // pump active + EMS_SolarModule.setpoint_maxBottomTemp = EMS_VALUE_SHORT_NOTSET; //setpoint for maximum solar boiler temperature + EMS_SolarModule.EnergyLastHour = EMS_VALUE_SHORT_NOTSET; + EMS_SolarModule.EnergyToday = EMS_VALUE_SHORT_NOTSET; + EMS_SolarModule.EnergyTotal = EMS_VALUE_SHORT_NOTSET; + EMS_SolarModule.device_id = EMS_ID_NONE; + EMS_SolarModule.model_id = EMS_MODEL_NONE; + EMS_SolarModule.product_id = EMS_ID_NONE; // Other EMS devices values EMS_Other.HPModulation = EMS_VALUE_INT_NOTSET; @@ -422,11 +426,13 @@ void ems_setLogging(_EMS_SYS_LOGGING loglevel) { myDebug_P(PSTR("System Logging set to Verbose")); } else if (loglevel == EMS_SYS_LOGGING_THERMOSTAT) { myDebug_P(PSTR("System Logging set to Thermostat only")); - } else if (loglevel == EMS_SYS_LOGGING_RAW) { + } else if (loglevel == EMS_SYS_LOGGING_SOLARMODULE) { + myDebug_P(PSTR("System Logging set to Solar Module only")); + }else if (loglevel == EMS_SYS_LOGGING_RAW) { myDebug_P(PSTR("System Logging set to Raw mode")); } } -} +} /** * Calculate CRC checksum using lookup table for speed @@ -886,12 +892,18 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) { if ((src == EMS_Thermostat.device_id) || (dest == EMS_Thermostat.device_id)) { _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); } + } else if (EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_SOLARMODULE) { + // only print ones to/from thermostat if logging is set to thermostat only + if ((src == EMS_SolarModule.device_id) || (dest == EMS_SolarModule.device_id)) { + _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); + } } else { // always print _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); } } + /** * print detailed telegram * and then call its callback if there is one defined @@ -1489,6 +1501,20 @@ void _process_ISM1StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { } } + +/* + * Junkers ISM1 Solar Module - type 0x0001 EMS+ for setting values + */ +void _process_ISM1Set(_EMS_RxTelegram * EMS_RxTelegram) { + + + if (EMS_RxTelegram->offset == 6) { + // e.g. 90 30 FF 06 00 01 50 (CRC=2C) + // to implement: change max solar boiler temperature + EMS_SolarModule.setpoint_maxBottomTemp = _toByte(0); + } +} + /** * UBASetPoint 0x1A */ @@ -1685,8 +1711,8 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) { // EMS_Other.SM = true; // we have detected a Solar Module (SM10, SM100, ISM1 ...) myDebug_P(PSTR("Solar Module support enabled.")); - EMS_SolarModule.model_id = Other_Types[i].model_id; - EMS_SolarModule.device_id = Other_Types[i].device_id; + EMS_SolarModule.model_id = SolarModule_Types[i].model_id; + EMS_SolarModule.device_id = SolarModule_Types[i].device_id; EMS_SolarModule.product_id = product_id; strlcpy(EMS_SolarModule.version, version, sizeof(EMS_SolarModule.version)); diff --git a/src/ems.h b/src/ems.h index 63680b90..d4a15887 100644 --- a/src/ems.h +++ b/src/ems.h @@ -83,6 +83,7 @@ typedef enum { EMS_SYS_LOGGING_RAW, // raw data mode EMS_SYS_LOGGING_BASIC, // only basic read/write messages EMS_SYS_LOGGING_THERMOSTAT, // only telegrams sent from thermostat + EMS_SYS_LOGGING_SOLARMODULE, // only telegrams sent from thermostat EMS_SYS_LOGGING_VERBOSE // everything } _EMS_SYS_LOGGING; @@ -270,6 +271,7 @@ typedef struct { int16_t bottomTemp; // bottom temp uint8_t pumpModulation; // modulation solar pump uint8_t pump; // pump active + int16_t setpoint_maxBottomTemp; // setpoint for maximum collector temp int16_t EnergyLastHour; int16_t EnergyToday; int16_t EnergyTotal; diff --git a/src/ems_devices.h b/src/ems_devices.h index eb20985f..fc02e839 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -48,7 +48,10 @@ #define EMS_TYPE_SM100Energy 0x028E // SM100Energy #define EMS_TYPE_HPMonitor1 0xE3 // HeatPump Monitor 1 #define EMS_TYPE_HPMonitor2 0xE5 // HeatPump Monitor 2 + #define EMS_TYPE_ISM1StatusMessage 0x0003 // Solar Module Junkers ISM1 Status +#define EMS_TYPE_ISM1Set 0x0001 // for setting values of the solar module like max boiler temp +#define EMS_OFFSET_ISM1Set_MaxBoilerTemp 6 // position of max boiler temp e.g. 50 in the following example: 90 30 FF 06 00 01 50 (CRC=2C) /* * Thermostats...