Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[P109] Add Inverted relay-state and Setpoint-delay settings #4409

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 26 additions & 7 deletions src/_P109_ThermOLED.ino
Expand Up @@ -43,6 +43,8 @@
------------------------------------------------------------------------------------------
Copyleft Nagy Sándor 2018 - https://bitekmindenhol.blog.hu/
------------------------------------------------------------------------------------------
2022-12-08 tonhuisman: Add Relay invert state option, reorder config option Contrast
Add setpoint delay option, switch relay after delay seconds
2022-10-11 tonhuisman: Fix initialization issue for relay state when switching tasks
2022-10-10 tonhuisman: Save pending thermo-settings on plugin exit (while waiting for the 30 seconds to have passed)
Always force Auto mode on plugin start, and timeout 0, reset timeout to 0 on mode change
Expand Down Expand Up @@ -110,6 +112,12 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string)
break;
}

case PLUGIN_SET_DEFAULTS:
{
P109_CONFIG_RELAYPIN = -1; // Set to None
break;
}

case PLUGIN_I2C_HAS_ADDRESS:
case PLUGIN_WEBFORM_SHOW_I2C_PARAMS:
{
Expand Down Expand Up @@ -143,6 +151,8 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string)

OLedFormRotation(F("rotate"), P109_CONFIG_ROTATION);

OLedFormContrast(F("contrast"), P109_CONFIG_CONTRAST);

{
P109_data_struct *P109_data = new (std::nothrow) P109_data_struct();

Expand All @@ -158,7 +168,7 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string)

addFormPinSelect(PinSelectPurpose::Generic_output, F("Relay"), F("heatrelay"), P109_CONFIG_RELAYPIN);

OLedFormContrast(F("contrast"), P109_CONFIG_CONTRAST);
addFormCheckBox(F("Invert relay-state (0=on, 1=off)"), F("invertrelay"), P109_GET_RELAY_INVERT);

{
const __FlashStringHelper *options4[] = { F("0.2"), F("0.5"), F("1") };
Expand All @@ -172,21 +182,29 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string)
addFormCheckBox(F("Use Taskname instead of Sysname"), F("ptask"), P109_GET_TASKNAME_IN_TITLE == 1);
}

{
if (P109_CONFIG_SETPOINT_DELAY == 0) { P109_CONFIG_SETPOINT_DELAY = P109_DEFAULT_SETPOINT_DELAY + P109_SETPOINT_OFFSET; }
addFormNumericBox(F("Delay on setpoint change"), F("setpdelay"), P109_CONFIG_SETPOINT_DELAY - P109_SETPOINT_OFFSET, 1, 10);
addUnit(F("1..10 sec."));
}

success = true;
break;
}

case PLUGIN_WEBFORM_SAVE:
{
P109_CONFIG_I2CADDRESS = getFormItemInt(F("pi2caddr"));
P109_CONFIG_ROTATION = getFormItemInt(F("rotate"));
P109_CONFIG_DISPLAYTYPE = getFormItemInt(F("controller"));
P109_CONFIG_CONTRAST = getFormItemInt(F("contrast"));
P109_CONFIG_RELAYPIN = getFormItemInt(F("heatrelay"));
P109_CONFIG_HYSTERESIS = (getFormItemInt(F("hyst")) / 10.0f);
P109_CONFIG_I2CADDRESS = getFormItemInt(F("pi2caddr"));
P109_CONFIG_ROTATION = getFormItemInt(F("rotate"));
P109_CONFIG_DISPLAYTYPE = getFormItemInt(F("controller"));
P109_CONFIG_CONTRAST = getFormItemInt(F("contrast"));
P109_CONFIG_RELAYPIN = getFormItemInt(F("heatrelay"));
P109_CONFIG_HYSTERESIS = (getFormItemInt(F("hyst")) / 10.0f);
P109_CONFIG_SETPOINT_DELAY = getFormItemInt(F("setpdelay")) + P109_SETPOINT_OFFSET;
uint32_t lSettings = 0u;
bitWrite(lSettings, P109_FLAG_TASKNAME_IN_TITLE, isFormItemChecked(F("ptask")));
bitWrite(lSettings, P109_FLAG_ALTERNATE_HEADER, !isFormItemChecked(F("palt"))); // Inverted
bitWrite(lSettings, P109_FLAG_RELAY_INVERT, isFormItemChecked(F("invertrelay")));
P109_FLAGS = lSettings;

{
Expand All @@ -208,6 +226,7 @@ boolean Plugin_109(uint8_t function, struct EventStruct *event, String& string)
P109_data_struct *P109_data = static_cast<P109_data_struct *>(getPluginTaskData(event->TaskIndex));

if (nullptr != P109_data) {
if (P109_CONFIG_SETPOINT_DELAY == 0) { P109_CONFIG_SETPOINT_DELAY = P109_DEFAULT_SETPOINT_DELAY + P109_SETPOINT_OFFSET; }
success = P109_data->plugin_init(event); // Start plugin
}

Expand Down
16 changes: 9 additions & 7 deletions src/src/PluginStructs/P109_data_struct.cpp
Expand Up @@ -8,7 +8,7 @@
* Constructor
*************************************************************************/
P109_data_struct::P109_data_struct():
_display(nullptr), _taskIndex(0), _varIndex(0)
_display(nullptr), _taskIndex(0), _varIndex(0)
{
for (int i = 0; i < P109_Nlines; ++i) {
ZERO_FILL(_deviceTemplate[i]);
Expand Down Expand Up @@ -81,9 +81,11 @@ bool P109_data_struct::plugin_init(struct EventStruct *event) {
delete _display;
_display = nullptr;
}
_taskIndex = event->TaskIndex;
_varIndex = event->BaseVarIndex;
_relaypin = P109_CONFIG_RELAYPIN;
_taskIndex = event->TaskIndex;
_varIndex = event->BaseVarIndex;
_relaypin = P109_CONFIG_RELAYPIN;
_relayInverted = P109_GET_RELAY_INVERT;
_setpointTimeout = P109_CONFIG_SETPOINT_DELAY - P109_SETPOINT_OFFSET;

if (P109_CONFIG_DISPLAYTYPE == 1) {
_display = new (std::nothrow) SSD1306Wire(P109_CONFIG_I2CADDRESS, Settings.Pin_i2c_sda, Settings.Pin_i2c_scl);
Expand Down Expand Up @@ -623,7 +625,7 @@ void P109_data_struct::display_setpoint_temp(const uint8_t& force) {

if (isDif) {
_changed = 1;
_setpointDelay = P109_DEFAULT_SETPOINT_DELAY; // Start delay
_setpointDelay = _setpointTimeout; // Start delay
}
}
}
Expand Down Expand Up @@ -743,13 +745,13 @@ void P109_data_struct::setHeatRelay(const uint8_t& state) {

log += concat(F("Thermo : Set Relay"), static_cast<int>(_relaypin));
log += '=';
log += state;
log += _relayInverted ? !state : state;
addLogMove(LOG_LEVEL_INFO, log);
}
# endif // ifndef BUILD_NO_DEBUG

pinMode(_relaypin, OUTPUT);
digitalWrite(_relaypin, state);
digitalWrite(_relaypin, _relayInverted ? !state : state);
}
}

Expand Down
29 changes: 18 additions & 11 deletions src/src/PluginStructs/P109_data_struct.h
Expand Up @@ -43,20 +43,25 @@ const char flameimg[] PROGMEM = {
# define P109_MODE_STATE_INITIAL 1
# define P109_BUTTON_DEBOUNCE_TIME_MS 300
# define P109_DEFAULT_SETPOINT_DELAY (5 + 1) // Seconds + 1 before the relay state is changed after the setpoint is changed
# define P109_DELAY_BETWEEN_SAVE 30000 // 30 seconds
# define P109_DELAY_BETWEEN_SAVE 30000 // 30 seconds

# define P109_CONFIG_I2CADDRESS PCONFIG(0)
# define P109_CONFIG_ROTATION PCONFIG(1)
# define P109_CONFIG_DISPLAYTYPE PCONFIG(2)
# define P109_CONFIG_CONTRAST PCONFIG(3)
# define P109_CONFIG_RELAYPIN PCONFIG(4)
# define P109_CONFIG_SETPOINT_DELAY PCONFIG(5)
# define P109_CONFIG_HYSTERESIS PCONFIG_FLOAT(0)

# define P109_SETPOINT_OFFSET 1 // 1 second offset, to allow changing unset (0) to default

# define P109_FLAGS PCONFIG_ULONG(0)
# define P109_FLAG_TASKNAME_IN_TITLE 0
# define P109_FLAG_ALTERNATE_HEADER 1
# define P109_FLAG_RELAY_INVERT 2
# define P109_GET_TASKNAME_IN_TITLE bitRead(P109_FLAGS, P109_FLAG_TASKNAME_IN_TITLE)
# define P109_GET_ALTERNATE_HEADER bitRead(P109_FLAGS, P109_FLAG_ALTERNATE_HEADER)
# define P109_GET_RELAY_INVERT bitRead(P109_FLAGS, P109_FLAG_RELAY_INVERT)

struct P109_data_struct : public PluginTaskData_base {
P109_data_struct();
Expand All @@ -77,22 +82,24 @@ struct P109_data_struct : public PluginTaskData_base {
OLEDDisplay *_display = nullptr;

uint32_t _lastchangetime = 0;
uint32_t _buttons[3] = { 0 };
uint32_t _buttons[3] = { 0 };

float _prev_temp = P109_TEMP_STATE_UNSET;
float _prev_setpoint = P109_SETPOINT_STATE_UNSET;
float _prev_timeout = P109_TIMEOUT_STATE_UNSET;
float _save_setpoint = P109_SETPOINT_STATE_UNSET;

int8_t _lastWiFiState = P109_WIFI_STATE_UNSET;
uint8_t _prev_heating = P109_HEATING_STATE_UNSET;
uint8_t _prev_mode = P109_MODE_STATE_UNSET;
uint8_t _taskIndex = 0;
uint8_t _varIndex = 0;
uint8_t _changed = 0;
uint8_t _saveneeded = 0;
uint8_t _setpointDelay = 0;
int8_t _relaypin = -1;
int8_t _lastWiFiState = P109_WIFI_STATE_UNSET;
uint8_t _prev_heating = P109_HEATING_STATE_UNSET;
uint8_t _prev_mode = P109_MODE_STATE_UNSET;
uint8_t _taskIndex = 0;
uint8_t _varIndex = 0;
uint8_t _changed = 0;
uint8_t _saveneeded = 0;
uint8_t _setpointDelay = 0;
uint8_t _setpointTimeout = 0;
int8_t _relaypin = -1;
bool _relayInverted = false;
String _last_heater;

String _title;
Expand Down