mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-12 03:04:27 +05:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c0dfc544e | ||
|
|
5fba94312b | ||
|
|
62bea87f8a | ||
|
|
f52aa8e889 | ||
|
|
df8354866f | ||
|
|
6242db7a29 | ||
|
|
dc00fdcdb6 | ||
|
|
2615e9106e | ||
|
|
0f60a07a71 | ||
|
|
f8750373d4 | ||
|
|
d5a92c47c7 | ||
|
|
bc91168bbf | ||
|
|
96c1a187cd | ||
|
|
6d3172b73b | ||
|
|
fca6dc9393 | ||
|
|
b54ea9b745 | ||
|
|
5de3238f6f | ||
|
|
2270b12b36 | ||
|
|
fd4fd119da | ||
|
|
47849eab01 | ||
|
|
ef99d2af96 | ||
|
|
826581562a | ||
|
|
d10d44bd13 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
.pio
|
.pio
|
||||||
.vscode
|
.vscode
|
||||||
|
build/*
|
||||||
98
README.md
98
README.md
@@ -7,12 +7,12 @@
|
|||||||
- PID
|
- PID
|
||||||
- Equithermic curves - adjusts the temperature based on indoor and outdoor temperatures
|
- Equithermic curves - adjusts the temperature based on indoor and outdoor temperatures
|
||||||
- Hysteresis setting (for accurate maintenance of room temperature)
|
- Hysteresis setting (for accurate maintenance of room temperature)
|
||||||
- Ability to connect an external sensor to monitor outdoor temperature (DS18B20)
|
- Ability to connect an external sensors to monitor outdoor and indoor temperature ([compatible sensors](#compatible-temperature-sensors))
|
||||||
- Emergency mode. If the Wi-Fi connection is lost or the gateway cannot connect to the MQTT server, the mode will turn on. This mode will automatically maintain the set temperature and prevent your home from freezing. In this mode it is also possible to use equithermal curves (weather-compensated control).
|
- Emergency mode. If the Wi-Fi connection is lost or the gateway cannot connect to the MQTT server, the mode will turn on. This mode will automatically maintain the set temperature and prevent your home from freezing. In this mode it is also possible to use equithermal curves (weather-compensated control).
|
||||||
- Automatic error reset (not with all boilers)
|
- Automatic error reset (not with all boilers)
|
||||||
- Diagnostics:
|
- Diagnostics:
|
||||||
- The process of heating the coolant for heating: works / does not work
|
- The process of heating the coolant for heating: works/does not work
|
||||||
- The process of heating water for hot water: working / not working
|
- The process of heating water for hot water: working/not working
|
||||||
- Display of boiler errors
|
- Display of boiler errors
|
||||||
- Burner status: on/off
|
- Burner status: on/off
|
||||||
- Burner modulation level in percent
|
- Burner modulation level in percent
|
||||||
@@ -30,51 +30,56 @@
|
|||||||
## Tested on
|
## Tested on
|
||||||
| Boiler | Master Member ID | Notes |
|
| Boiler | Master Member ID | Notes |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| BAXI ECO Nova | default or 4 | Pressure sensor not supported, modulation level not stable |
|
| BAXI ECO Nova | default | Pressure sensor not supported, modulation level not stable |
|
||||||
| BAXI Ampera | 1028 | Pressure sensor not supported, only heating (DHW not tested) |
|
| BAXI Ampera | 1028 | Pressure sensor not supported, only heating (DHW not tested) |
|
||||||
| [Remeha Calenta Ace 40C](https://github.com/Laxilef/OTGateway/issues/1#issuecomment-1726081554) | default | - |
|
| [Remeha Calenta Ace 40C](https://github.com/Laxilef/OTGateway/issues/1#issuecomment-1726081554) | default | - |
|
||||||
|
| [Baxi Nuvola DUO-TEC HT 16](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1751061488) | default | - |
|
||||||
|
| [AEG GBA124](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1765857609) | default | Pressure sensor not supported |
|
||||||
|
| [Ferroli DOMIcompact C 24](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1765310058)<br><sub>Board: MF08FA</sub> | 211 | Pressure sensor not supported |
|
||||||
|
| [Thermet Ecocondens Silver 35kW)](https://github.com/Laxilef/OTGateway/issues/3#issuecomment-1767026384) | default | Pressure sensor not supported |
|
||||||
|
|
||||||
## PCB
|
## PCB
|
||||||
<img src="/assets/pcb.svg" width="25%" /> <img src="/assets/pcb_3d.png" width="30%" /> <img src="/assets/after_assembly.png" width="37%" />
|
<img src="/assets/pcb.svg" width="27%" /> <img src="/assets/pcb_3d.png" width="30%" /> <img src="/assets/after_assembly.png" width="40%" />
|
||||||
|
|
||||||
Housing for installation on DIN rail - D2MG. Occupies only 2 DIN modules.<br>
|
Housing for installation on DIN rail - D2MG. Occupies only 2 DIN modules.<br>
|
||||||
The 220V > 5V power supply is already on the board, so additional power supplies are not needed.<br>
|
The 220V > 5V power supply is already on the board, so additional power supplies are not needed.<br>
|
||||||
To save money, 2 levels are ordered as one board. After manufacturing, the boards need to be divided into 2 parts - upper and lower.<br>
|
To save money, 2 levels are ordered as one board. After manufacturing, the boards need to be divided into 2 parts - upper and lower. The boards are inexpensively (5pcs for $2) manufactured at JLCPCB (Remove Order Number = Specify a location).<br><br>
|
||||||
**Important!** On this board opentherm IN pin = 5, OUT pin = 4
|
Some components can be replaced with similar ones (for example use a fuse and led with legs). Some SMD components (for example optocouplers) can be replaced with similar SOT components.<br>Most of the components can be purchased inexpensively on Aliexpress, the rest in your local stores.<br><br>
|
||||||
|
The outdoor temperature sensor must be connected to the **TEMP1** connector, the indoor temperature sensor must be connected to the **TEMP2** connector. The power supply for the sensors must be connected to the **3.3V** connector, GND to **GND**.<br>
|
||||||
|
**The opentherm connection polarity does not matter.**
|
||||||
|
<!-- **Important!** On this board opentherm IN pin = 5, OUT pin = 4 -->
|
||||||
|
|
||||||
- [Sheet](/assets/sheet.pdf)
|
- [Schematic](/assets/Schematic.pdf)
|
||||||
- [BOM](/assets/BOM.xlsx)
|
- [BOM](/assets/BOM.xlsx)
|
||||||
- [Gerber](/assets/gerber.zip)
|
- [Gerber](/assets/gerber.zip)
|
||||||
|
|
||||||
## Another compatible Open Therm Adapters
|
## Another compatible OpenTherm Adapters
|
||||||
- [Ihor Melnyk OpenTherm Adapter](http://ihormelnyk.com/opentherm_adapter)
|
- [Ihor Melnyk OpenTherm Adapter](http://ihormelnyk.com/opentherm_adapter)
|
||||||
|
- [DIYLESS Master OpenTherm Shield](https://diyless.com/product/master-opentherm-shield)
|
||||||
- [OpenTherm master shield for Wemos/Lolin](https://www.tindie.com/products/thehognl/opentherm-master-shield-for-wemoslolin/)
|
- [OpenTherm master shield for Wemos/Lolin](https://www.tindie.com/products/thehognl/opentherm-master-shield-for-wemoslolin/)
|
||||||
- And others. It's just that the adapter must implement [the schema](http://ihormelnyk.com/Content/Pages/opentherm_adapter/opentherm_adapter_schematic_o.png)
|
- And others. It's just that the adapter must implement [the schema](http://ihormelnyk.com/Content/Pages/opentherm_adapter/opentherm_adapter_schematic_o.png)
|
||||||
|
|
||||||
|
## Compatible Temperature Sensors
|
||||||
|
* DS18B20
|
||||||
|
* DS1822
|
||||||
|
* DS1820
|
||||||
|
* MAX31820
|
||||||
|
* MAX31850
|
||||||
|
|
||||||
|
[See more](https://github.com/milesburton/Arduino-Temperature-Control-Library#usage)
|
||||||
|
|
||||||
# Quick Start
|
# Quick Start
|
||||||
## Dependencies
|
1. Download the latest firmware from the [releases page](https://github.com/Laxilef/OTGateway/releases) (or compile yourself) and flash your ESP8266 board using the [ESP Flash Download Tool](https://www.espressif.com/en/support/download/other-tools) or other software.
|
||||||
- [ESP8266Scheduler](https://github.com/nrwiersma/ESP8266Scheduler)
|
2. Connect to *OpenTherm Gateway* hotspot, password: otgateway123456
|
||||||
- [NTPClient](https://github.com/arduino-libraries/NTPClient)
|
3. Open configuration page in browser: 192.168.4.1
|
||||||
- [ArduinoJson](https://github.com/bblanchon/ArduinoJson)
|
4. Set up a connection to your wifi network
|
||||||
- [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library)
|
5. Set up a connection to your MQTT server: ip, port, user, password
|
||||||
- [PubSubClient](https://github.com/knolleary/pubsubclient)
|
6. Set up a **Opentherm pin IN** & **Opentherm pin OUT**. No change for my board. Typically used **IN** = 4, **OUT** = 5
|
||||||
- [TelnetStream](https://github.com/jandrassy/TelnetStream)
|
7. Set up a **Outdoor sensor pin** & **Indoor sensor pin**. No change for my board.
|
||||||
- [EEManager](https://github.com/GyverLibs/EEManager)
|
8. if necessary, set up a the master member ID ([see more](#tested-on))
|
||||||
- [GyverPID](https://github.com/GyverLibs/GyverPID)
|
9. Restart module (required after changing OT pins and/or sensors pins!)
|
||||||
- [DallasTemperature](https://github.com/milesburton/Arduino-Temperature-Control-Library)
|
|
||||||
- [WiFiManager](https://github.com/tzapu/WiFiManager)
|
|
||||||
|
|
||||||
|
After connecting to your wifi network, you can go to the setup page at the address that ESP8266 received.
|
||||||
## Settings
|
|
||||||
1. Connect to *OpenTherm Gateway* hotspot, password: otgateway123456
|
|
||||||
2. Open configuration page in browser: 192.168.4.1
|
|
||||||
3. Set up a connection to your wifi network
|
|
||||||
4. Set up a connection to your MQTT server
|
|
||||||
5. Set up a **Opentherm pin IN** & **Opentherm pin OUT**. Typically used **IN** = 4, **OUT** = 5
|
|
||||||
6. if necessary, set the master member ID.
|
|
||||||
7. Restart module (required after changing OT pins!)
|
|
||||||
|
|
||||||
After connecting to your wifi network, you can go to the setup page at the address that esp8266 received.
|
|
||||||
The OTGateway device will be automatically added to homeassistant if MQTT server ip, login and password are correct.
|
The OTGateway device will be automatically added to homeassistant if MQTT server ip, login and password are correct.
|
||||||
|
|
||||||
## HomeAsssistant settings
|
## HomeAsssistant settings
|
||||||
@@ -110,7 +115,7 @@ The temperature inside the house can be set using simple automation:
|
|||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
If your boiler does not support the installation of an outdoor temperature sensor or does not provide this value via the opentherm protocol, then you can use an external DS18B20 sensor or use automation.
|
If your boiler does not support the installation of an outdoor temperature sensor or does not provide this value via the opentherm protocol, then you can use an external sensor or use automation.
|
||||||
<details>
|
<details>
|
||||||
<summary>Simple automation</summary>
|
<summary>Simple automation</summary>
|
||||||
|
|
||||||
@@ -167,13 +172,16 @@ Range: 0...10, default: 2, step 0.01
|
|||||||
#### Instructions for fit coefficients:
|
#### Instructions for fit coefficients:
|
||||||
**Tip.** I created a [table in Excel](/assets/equitherm_calc.xlsx) in which you can enter temperature parameters inside and outside the house and select coefficients. On the graph you can see the temperature that the boiler will set.
|
**Tip.** I created a [table in Excel](/assets/equitherm_calc.xlsx) in which you can enter temperature parameters inside and outside the house and select coefficients. On the graph you can see the temperature that the boiler will set.
|
||||||
|
|
||||||
1. The first thing you need to do is to fit the curve (***N*** coefficient). If your home has low heat loss, then start with 0.5. Otherwise start at 0.7. When the temperature inside the house stops changing, increase or decrease the coefficient value in increments of 0.1 to select the optimal curve.<br>
|
1. Set the ***K*** and ***T*** coefficients to 0.
|
||||||
|
2. The first thing you need to do is to fit the curve (***N*** coefficient). If your home has low heat loss, then start with 0.5. Otherwise start at 0.7. When the temperature inside the house stops changing, increase or decrease the coefficient value in increments of 0.1 to select the optimal curve.<br>
|
||||||
Please note that passive heating (sun) will affect the house temperature during curve fitting. This process is not fast and will take you 1-2 days.
|
Please note that passive heating (sun) will affect the house temperature during curve fitting. This process is not fast and will take you 1-2 days.
|
||||||
Important. During curve fitting, the temperature must be kept stable as the outside temperature changes. The temperature does not have to be equal to the set one.<br>
|
Important. During curve fitting, the temperature must be kept stable as the outside temperature changes.<br>
|
||||||
For example. You fit curve 0.67; set temperature 23; the temperature in the house is 20 degrees while the outside temperature is -10 degrees and -5 degrees. This is good.
|
At this stage, it is important for you to stabilize the indoor temperature at exactly 20 (+- 0.5) degrees.<br>
|
||||||
2. After fitting the curve, you must select the ***K*** coefficient. It influences the boiler temperature correction to maintain the set temperature.
|
For example. You fit curve 0.67; set temperature 20; the temperature in the house is 20.1 degrees while the outside temperature is -10 degrees and -5 degrees. This is good.
|
||||||
For example. Set temperature: 23 degrees; temperature in the house: 20 degrees. Try setting it to 5 and see how the temperature in the house changes after stabilization. Select the value so that the temperature in the house is close to the set.
|
3. After fitting the curve, you must select the ***K*** coefficient. It influences the boiler temperature correction to maintain the set temperature.
|
||||||
3. Now you can choose the ***T*** coefficient. Simply put, it affects the sharpness of the temperature change. If you want fast heating, then set a high value (6-10), but then the room may overheat. If you want smooth heating, set 1-5. Choose the optimal value for yourself.
|
For example. Set temperature: 23 degrees; temperature in the house: 20 degrees. Try setting it to 2 and see how the temperature in the house changes after stabilization. Select the value so that the temperature in the house is close to the set.
|
||||||
|
4. Now you can choose the ***T*** coefficient. Simply put, it affects the sharpness of the temperature change. If you want fast heating, then set a high value (6-10), but then the room may overheat. If you want smooth heating, set 1-5. Choose the optimal value for yourself.
|
||||||
|
5. Check to see if it works correctly at different set temperatures over several days.
|
||||||
|
|
||||||
Read more about the algorithm [here](https://wdn.su/blog/1154).
|
Read more about the algorithm [here](https://wdn.su/blog/1154).
|
||||||
|
|
||||||
@@ -186,6 +194,18 @@ In Google you can find instructions for tuning the PID controller.
|
|||||||
### Use Equitherm mode + PID mode
|
### Use Equitherm mode + PID mode
|
||||||
@todo
|
@todo
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
- [ESP8266Scheduler](https://github.com/nrwiersma/ESP8266Scheduler)
|
||||||
|
- [NTPClient](https://github.com/arduino-libraries/NTPClient)
|
||||||
|
- [ArduinoJson](https://github.com/bblanchon/ArduinoJson)
|
||||||
|
- [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library)
|
||||||
|
- [PubSubClient](https://github.com/knolleary/pubsubclient)
|
||||||
|
- [TelnetStream](https://github.com/jandrassy/TelnetStream)
|
||||||
|
- [EEManager](https://github.com/GyverLibs/EEManager)
|
||||||
|
- [GyverPID](https://github.com/GyverLibs/GyverPID)
|
||||||
|
- [DallasTemperature](https://github.com/milesburton/Arduino-Temperature-Control-Library)
|
||||||
|
- [WiFiManager](https://github.com/tzapu/WiFiManager)
|
||||||
|
|
||||||
## Debug
|
## Debug
|
||||||
To display DEBUG messages you must enable debug in settings (switch is disabled by default).
|
To display DEBUG messages you must enable debug in settings (switch is disabled by default).
|
||||||
You can connect via Telnet to read messages. IP: esp8266 ip, port: 23
|
You can connect via Telnet to read messages. IP: ESP8266 ip, port: 23
|
||||||
|
|||||||
1
assets/.gitignore
vendored
Normal file
1
assets/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/*.priv.*
|
||||||
BIN
assets/BOM.xlsx
BIN
assets/BOM.xlsx
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 689 KiB After Width: | Height: | Size: 716 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 236 KiB |
14
build.py
Normal file
14
build.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import shutil
|
||||||
|
import os
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
def post_build(source, target, env):
|
||||||
|
src = target[0].get_abspath()
|
||||||
|
dest = os.path.join(env["PROJECT_DIR"], "build", "firmware_%s_%s.bin" % (env.GetProjectOption("board"), env.GetProjectOption("version")))
|
||||||
|
|
||||||
|
#print("dest:"+dest)
|
||||||
|
#print("source:"+src)
|
||||||
|
|
||||||
|
shutil.copy(src, dest)
|
||||||
|
|
||||||
|
env.AddPostAction("$BUILD_DIR/firmware.bin", post_build)
|
||||||
@@ -92,7 +92,7 @@ public:
|
|||||||
const byte valueLB = response & 0xFF;
|
const byte valueLB = response & 0xFF;
|
||||||
const byte valueHB = (response >> 8) & 0xFF;
|
const byte valueHB = (response >> 8) & 0xFF;
|
||||||
|
|
||||||
float value = (int8_t) valueHB;
|
float value = (int8_t)valueHB;
|
||||||
return value + (float)valueLB / 256.0;
|
return value + (float)valueLB / 256.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
38
lib/WiFiManagerParameters/WiFiManagerParameters.h
Normal file
38
lib/WiFiManagerParameters/WiFiManagerParameters.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
class IntParameter : public WiFiManagerParameter {
|
||||||
|
public:
|
||||||
|
IntParameter(const char* id, const char* label, int value, const uint8_t length = 10) : WiFiManagerParameter("") {
|
||||||
|
init(id, label, String(value).c_str(), length, "", WFM_LABEL_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getValue() {
|
||||||
|
return atoi(WiFiManagerParameter::getValue());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CheckboxParameter : public WiFiManagerParameter {
|
||||||
|
public:
|
||||||
|
const char* checked = "type=\"checkbox\" checked";
|
||||||
|
const char* noChecked = "type=\"checkbox\"";
|
||||||
|
const char* trueVal = "T";
|
||||||
|
|
||||||
|
CheckboxParameter(const char* id, const char* label, bool value) : WiFiManagerParameter("") {
|
||||||
|
init(id, label, value ? trueVal : "0", 1, "", WFM_LABEL_AFTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* getValue() const override {
|
||||||
|
return trueVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* getCustomHTML() const override {
|
||||||
|
return strcmp(WiFiManagerParameter::getValue(), trueVal) == 0 ? checked : noChecked;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getCheckboxValue() {
|
||||||
|
return strcmp(WiFiManagerParameter::getValue(), trueVal) == 0 ? true : false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SeparatorParameter : public WiFiManagerParameter {
|
||||||
|
public:
|
||||||
|
SeparatorParameter() : WiFiManagerParameter("<hr>") {}
|
||||||
|
};
|
||||||
@@ -8,9 +8,8 @@
|
|||||||
; Please visit documentation for the other options and examples
|
; Please visit documentation for the other options and examples
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[env:d1_mini_pro]
|
[env]
|
||||||
platform = espressif8266
|
platform = espressif8266
|
||||||
board = d1_mini_pro
|
|
||||||
framework = arduino
|
framework = arduino
|
||||||
lib_deps =
|
lib_deps =
|
||||||
nrwiersma/ESP8266Scheduler@^1.0
|
nrwiersma/ESP8266Scheduler@^1.0
|
||||||
@@ -22,7 +21,19 @@ lib_deps =
|
|||||||
gyverlibs/EEManager@^2.0
|
gyverlibs/EEManager@^2.0
|
||||||
gyverlibs/GyverPID@^3.3
|
gyverlibs/GyverPID@^3.3
|
||||||
milesburton/DallasTemperature@^3.11.0
|
milesburton/DallasTemperature@^3.11.0
|
||||||
https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
|
https://github.com/Laxilef/WiFiManager/archive/refs/heads/patch-1.zip
|
||||||
|
; https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
|
||||||
build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
|
build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
|
extra_scripts = post:build.py
|
||||||
|
version = 1.3.2
|
||||||
|
|
||||||
|
[env:d1_mini]
|
||||||
|
board = d1_mini
|
||||||
|
|
||||||
|
[env:d1_mini_lite]
|
||||||
|
board = d1_mini_lite
|
||||||
|
|
||||||
|
[env:d1_mini_pro]
|
||||||
|
board = d1_mini_pro
|
||||||
|
|||||||
@@ -51,9 +51,6 @@ public:
|
|||||||
doc[F("options")][2] = F("External");
|
doc[F("options")][2] = F("External");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/select/") + _prefix + F("/outdoor_sensor_type/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/select/") + _prefix + F("/outdoor_sensor_type/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -81,9 +78,6 @@ public:
|
|||||||
doc[F("options")][1] = F("External");
|
doc[F("options")][1] = F("External");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/select/") + _prefix + F("/indoor_sensor_type/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/select/") + _prefix + F("/indoor_sensor_type/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -182,9 +176,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"debug\": false}");
|
doc[F("payload_off")] = F("{\"debug\": false}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/debug/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/debug/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -215,9 +206,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"emergency\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"emergency\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -250,9 +238,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/emergency_target/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/emergency_target/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -284,9 +269,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"emergency\": {\"useEquitherm\" : false}}");
|
doc[F("payload_off")] = F("{\"emergency\": {\"useEquitherm\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency_use_equitherm/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/emergency_use_equitherm/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -318,9 +300,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"heating\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"heating\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -351,9 +330,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"heating\": {\"turbo\" : false}}");
|
doc[F("payload_off")] = F("{\"heating\": {\"turbo\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating_turbo/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/heating_turbo/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -382,14 +358,11 @@ public:
|
|||||||
doc[F("command_topic")] = _prefix + F("/settings/set");
|
doc[F("command_topic")] = _prefix + F("/settings/set");
|
||||||
doc[F("command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}");
|
doc[F("command_template")] = F("{\"heating\": {\"target\" : {{ value }}}}");
|
||||||
doc[F("min")] = minTemp;
|
doc[F("min")] = minTemp;
|
||||||
doc[F("max")] = maxTemp <= minTemp ? maxTemp : maxTemp;
|
doc[F("max")] = maxTemp;
|
||||||
doc[F("step")] = 0.5;
|
doc[F("step")] = 0.5;
|
||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_target/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_target/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -422,9 +395,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_hysteresis/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/heating_hysteresis/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -453,9 +423,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}");
|
doc[F("value_template")] = F("{{ value_json.parameters.heatingSetpoint|int(0) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_setpoint/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_setpoint/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -607,9 +574,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"dhw\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"dhw\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -643,9 +607,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -796,9 +757,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"pid\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"pid\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/pid/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/pid/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -828,9 +786,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_p_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_p_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -860,9 +815,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_i_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_i_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -892,9 +844,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_d_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/pid_d_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -989,9 +938,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"equitherm\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"equitherm\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/equitherm/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/equitherm/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1021,9 +967,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_n_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_n_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1053,9 +996,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_k_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_k_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1087,9 +1027,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_t_factor/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/equitherm_t_factor/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1120,9 +1057,6 @@ public:
|
|||||||
doc[F("payload_off")] = F("{\"tuning\": {\"enable\" : false}}");
|
doc[F("payload_off")] = F("{\"tuning\": {\"enable\" : false}}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/tuning/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/switch/") + _prefix + F("/tuning/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1152,9 +1086,6 @@ public:
|
|||||||
doc[F("options")][1] = F("PID");
|
doc[F("options")][1] = F("PID");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/select/") + _prefix + F("/tuning_regulator/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/select/") + _prefix + F("/tuning_regulator/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1182,9 +1113,6 @@ public:
|
|||||||
doc[F("expire_after")] = 60;
|
doc[F("expire_after")] = 60;
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/status/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/status/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1210,9 +1138,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.otStatus, 'OFF', 'ON') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/ot_status/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/ot_status/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1239,9 +1164,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.heating, 'ON', 'OFF') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/heating/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1268,9 +1190,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.dhw, 'ON', 'OFF') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1297,9 +1216,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.flame, 'ON', 'OFF') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/flame/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/flame/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1327,9 +1243,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.fault, 'ON', 'OFF') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/fault/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/fault/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1356,9 +1269,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}");
|
doc[F("value_template")] = F("{{ iif(value_json.states.diagnostic, 'ON', 'OFF') }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/diagnostic/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/binary_sensor/") + _prefix + F("/diagnostic/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1385,9 +1295,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}");
|
doc[F("value_template")] = F("{{ \"E%02d\"|format(value_json.states.faultCode) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/fault_code/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/fault_code/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1416,9 +1323,6 @@ public:
|
|||||||
doc["value_template"] = "{{ value_json.states.rssi|float(0)|round(1) }}";
|
doc["value_template"] = "{{ value_json.states.rssi|float(0)|round(1) }}";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/rssi/config").c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + "/rssi/config").c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1448,9 +1352,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}");
|
doc[F("value_template")] = F("{{ value_json.sensors.modulation|float(0)|round(0) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/modulation/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/modulation/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1479,9 +1380,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}");
|
doc[F("value_template")] = F("{{ value_json.sensors.pressure|float(0)|round(2) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/pressure/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/pressure/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1515,9 +1413,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1547,9 +1442,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}");
|
doc[F("value_template")] = F("{{ value_json.temperatures.indoor|float(0)|round(1) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1582,9 +1474,6 @@ public:
|
|||||||
doc[F("mode")] = "box";
|
doc[F("mode")] = "box";
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/number/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1614,9 +1503,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}");
|
doc[F("value_template")] = F("{{ value_json.temperatures.outdoor|float(0)|round(1) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/outdoor_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1645,9 +1531,6 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}");
|
doc[F("value_template")] = F("{{ value_json.temperatures.heating|float(0)|round(2) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/heating_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1676,16 +1559,13 @@ public:
|
|||||||
doc[F("value_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}");
|
doc[F("value_template")] = F("{{ value_json.temperatures.dhw|float(0)|round(2) }}");
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) {
|
bool publishClimateHeating(byte minTemp = 20, byte maxTemp = 90, bool enabledByDefault = true) {
|
||||||
StaticJsonDocument<2048> doc;
|
StaticJsonDocument<2560> doc;
|
||||||
doc[F("availability")][F("topic")] = _prefix + F("/status");
|
doc[F("availability")][F("topic")] = _prefix + F("/status");
|
||||||
doc[F("device")][F("identifiers")][0] = _prefix;
|
doc[F("device")][F("identifiers")][0] = _prefix;
|
||||||
doc[F("device")][F("sw_version")] = _deviceVersion;
|
doc[F("device")][F("sw_version")] = _deviceVersion;
|
||||||
@@ -1734,15 +1614,12 @@ public:
|
|||||||
doc[F("temp_step")] = 0.5;
|
doc[F("temp_step")] = 0.5;
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_heating/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_heating/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) {
|
bool publishClimateDHW(byte minTemp = 40, byte maxTemp = 60, bool enabledByDefault = true) {
|
||||||
StaticJsonDocument<1536> doc;
|
StaticJsonDocument<2560> doc;
|
||||||
doc[F("availability")][F("topic")] = _prefix + F("/status");
|
doc[F("availability")][F("topic")] = _prefix + F("/status");
|
||||||
doc[F("device")][F("identifiers")][0] = _prefix;
|
doc[F("device")][F("identifiers")][0] = _prefix;
|
||||||
doc[F("device")][F("sw_version")] = _deviceVersion;
|
doc[F("device")][F("sw_version")] = _deviceVersion;
|
||||||
@@ -1783,9 +1660,6 @@ public:
|
|||||||
doc[F("max_temp")] = maxTemp;
|
doc[F("max_temp")] = maxTemp;
|
||||||
|
|
||||||
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), measureJson(doc), true);
|
client.beginPublish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), measureJson(doc), true);
|
||||||
//BufferingPrint bufferedClient(client, 32);
|
|
||||||
//serializeJson(doc, bufferedClient);
|
|
||||||
//bufferedClient.flush();
|
|
||||||
serializeJson(doc, client);
|
serializeJson(doc, client);
|
||||||
return client.endPublish();
|
return client.endPublish();
|
||||||
}
|
}
|
||||||
@@ -1807,6 +1681,42 @@ public:
|
|||||||
return client.publish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), NULL, true);
|
return client.publish((F("homeassistant/sensor/") + _prefix + F("/indoor_temp/config")).c_str(), NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool deleteSwitchDHW() {
|
||||||
|
return client.publish((F("homeassistant/switch/") + _prefix + F("/dhw/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteSensorCurrentDHWMinTemp() {
|
||||||
|
return client.publish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_min_temp/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteSensorCurrentDHWMaxTemp() {
|
||||||
|
return client.publish((F("homeassistant/sensor/") + _prefix + F("/current_dhw_max_temp/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteNumberDHWMinTemp() {
|
||||||
|
return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_min_temp/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteNumberDHWMaxTemp() {
|
||||||
|
return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_max_temp/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteBinSensorDHW() {
|
||||||
|
return client.publish((F("homeassistant/binary_sensor/") + _prefix + F("/dhw/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteSensorDHWTemp() {
|
||||||
|
return client.publish((F("homeassistant/sensor/") + _prefix + F("/dhw_temp/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteNumberDHWTarget() {
|
||||||
|
return client.publish((F("homeassistant/number/") + _prefix + F("/dhw_target/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool deleteClimateDHW() {
|
||||||
|
return client.publish((F("homeassistant/climate/") + _prefix + F("_dhw/config")).c_str(), NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String _prefix = "opentherm";
|
String _prefix = "opentherm";
|
||||||
String _deviceVersion = "1.0";
|
String _deviceVersion = "1.0";
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ extern MqttTask* tMqtt;
|
|||||||
extern SensorsTask* tSensors;
|
extern SensorsTask* tSensors;
|
||||||
extern OpenThermTask* tOt;
|
extern OpenThermTask* tOt;
|
||||||
|
|
||||||
class MainTask: public Task {
|
class MainTask : public Task {
|
||||||
public:
|
public:
|
||||||
MainTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {}
|
MainTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
unsigned long lastHeapInfo = 0;
|
unsigned long lastHeapInfo = 0;
|
||||||
@@ -25,7 +25,7 @@ protected:
|
|||||||
tMqtt->enable();
|
tMqtt->enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( firstFailConnect != 0 ) {
|
if (firstFailConnect != 0) {
|
||||||
firstFailConnect = 0;
|
firstFailConnect = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ protected:
|
|||||||
if (firstFailConnect == 0) {
|
if (firstFailConnect == 0) {
|
||||||
firstFailConnect = millis();
|
firstFailConnect = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
||||||
vars.states.emergency = true;
|
vars.states.emergency = true;
|
||||||
INFO("Emergency mode enabled");
|
INFO("Emergency mode enabled");
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ PubSubClient client(espClient);
|
|||||||
HomeAssistantHelper haHelper;
|
HomeAssistantHelper haHelper;
|
||||||
|
|
||||||
|
|
||||||
class MqttTask: public Task {
|
class MqttTask : public Task {
|
||||||
public:
|
public:
|
||||||
MqttTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {}
|
MqttTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
unsigned long lastReconnectAttempt = 0;
|
unsigned long lastReconnectAttempt = 0;
|
||||||
@@ -50,7 +50,7 @@ protected:
|
|||||||
if (firstFailConnect == 0) {
|
if (firstFailConnect == 0) {
|
||||||
firstFailConnect = millis();
|
firstFailConnect = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
||||||
vars.states.emergency = true;
|
vars.states.emergency = true;
|
||||||
INFO("Emergency mode enabled");
|
INFO("Emergency mode enabled");
|
||||||
@@ -101,7 +101,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["emergency"]["target"].isNull() && doc["emergency"]["target"].is<float>()) {
|
if (!doc["emergency"]["target"].isNull() && doc["emergency"]["target"].is<float>()) {
|
||||||
if ( doc["emergency"]["target"].as<float>() > 0 && doc["emergency"]["target"].as<float>() < 100 ) {
|
if (doc["emergency"]["target"].as<float>() > 0 && doc["emergency"]["target"].as<float>() < 100) {
|
||||||
settings.emergency.target = round(doc["emergency"]["target"].as<float>() * 10) / 10;
|
settings.emergency.target = round(doc["emergency"]["target"].as<float>() * 10) / 10;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
@@ -125,21 +125,21 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["heating"]["target"].isNull() && doc["heating"]["target"].is<float>()) {
|
if (!doc["heating"]["target"].isNull() && doc["heating"]["target"].is<float>()) {
|
||||||
if ( doc["heating"]["target"].as<float>() > 0 && doc["heating"]["target"].as<float>() < 100 ) {
|
if (doc["heating"]["target"].as<float>() > 0 && doc["heating"]["target"].as<float>() < 100) {
|
||||||
settings.heating.target = round(doc["heating"]["target"].as<float>() * 10) / 10;
|
settings.heating.target = round(doc["heating"]["target"].as<float>() * 10) / 10;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["heating"]["hysteresis"].isNull() && doc["heating"]["hysteresis"].is<float>()) {
|
if (!doc["heating"]["hysteresis"].isNull() && doc["heating"]["hysteresis"].is<float>()) {
|
||||||
if ( doc["heating"]["hysteresis"].as<float>() > 0 && doc["heating"]["hysteresis"].as<float>() <= 5 ) {
|
if (doc["heating"]["hysteresis"].as<float>() >= 0 && doc["heating"]["hysteresis"].as<float>() <= 5) {
|
||||||
settings.heating.hysteresis = round(doc["heating"]["hysteresis"].as<float>() * 10) / 10;
|
settings.heating.hysteresis = round(doc["heating"]["hysteresis"].as<float>() * 10) / 10;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["heating"]["maxTemp"].isNull() && doc["heating"]["maxTemp"].is<unsigned char>()) {
|
if (!doc["heating"]["maxTemp"].isNull() && doc["heating"]["maxTemp"].is<unsigned char>()) {
|
||||||
if ( doc["heating"]["maxTemp"].as<unsigned char>() > 0 && doc["heating"]["maxTemp"].as<unsigned char>() <= 100 && doc["heating"]["maxTemp"].as<unsigned char>() > settings.heating.minTemp ) {
|
if (doc["heating"]["maxTemp"].as<unsigned char>() > 0 && doc["heating"]["maxTemp"].as<unsigned char>() <= 100 && doc["heating"]["maxTemp"].as<unsigned char>() > settings.heating.minTemp) {
|
||||||
settings.heating.maxTemp = doc["heating"]["maxTemp"].as<unsigned char>();
|
settings.heating.maxTemp = doc["heating"]["maxTemp"].as<unsigned char>();
|
||||||
vars.parameters.heatingMaxTemp = settings.heating.maxTemp;
|
vars.parameters.heatingMaxTemp = settings.heating.maxTemp;
|
||||||
flag = true;
|
flag = true;
|
||||||
@@ -147,7 +147,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["heating"]["minTemp"].isNull() && doc["heating"]["minTemp"].is<unsigned char>()) {
|
if (!doc["heating"]["minTemp"].isNull() && doc["heating"]["minTemp"].is<unsigned char>()) {
|
||||||
if ( doc["heating"]["minTemp"].as<unsigned char>() >= 0 && doc["heating"]["minTemp"].as<unsigned char>() < 100 && doc["heating"]["minTemp"].as<unsigned char>() < settings.heating.maxTemp ) {
|
if (doc["heating"]["minTemp"].as<unsigned char>() >= 0 && doc["heating"]["minTemp"].as<unsigned char>() < 100 && doc["heating"]["minTemp"].as<unsigned char>() < settings.heating.maxTemp) {
|
||||||
settings.heating.minTemp = doc["heating"]["minTemp"].as<unsigned char>();
|
settings.heating.minTemp = doc["heating"]["minTemp"].as<unsigned char>();
|
||||||
vars.parameters.heatingMinTemp = settings.heating.minTemp;
|
vars.parameters.heatingMinTemp = settings.heating.minTemp;
|
||||||
flag = true;
|
flag = true;
|
||||||
@@ -162,14 +162,14 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["dhw"]["target"].isNull() && doc["dhw"]["target"].is<unsigned char>()) {
|
if (!doc["dhw"]["target"].isNull() && doc["dhw"]["target"].is<unsigned char>()) {
|
||||||
if ( doc["dhw"]["target"].as<unsigned char>() >= 0 && doc["dhw"]["target"].as<unsigned char>() < 100 ) {
|
if (doc["dhw"]["target"].as<unsigned char>() >= 0 && doc["dhw"]["target"].as<unsigned char>() < 100) {
|
||||||
settings.dhw.target = doc["dhw"]["target"].as<unsigned char>();
|
settings.dhw.target = doc["dhw"]["target"].as<unsigned char>();
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["dhw"]["maxTemp"].isNull() && doc["dhw"]["maxTemp"].is<unsigned char>()) {
|
if (!doc["dhw"]["maxTemp"].isNull() && doc["dhw"]["maxTemp"].is<unsigned char>()) {
|
||||||
if ( doc["dhw"]["maxTemp"].as<unsigned char>() > 0 && doc["dhw"]["maxTemp"].as<unsigned char>() <= 100 && doc["dhw"]["maxTemp"].as<unsigned char>() > settings.dhw.minTemp ) {
|
if (doc["dhw"]["maxTemp"].as<unsigned char>() > 0 && doc["dhw"]["maxTemp"].as<unsigned char>() <= 100 && doc["dhw"]["maxTemp"].as<unsigned char>() > settings.dhw.minTemp) {
|
||||||
settings.dhw.maxTemp = doc["dhw"]["maxTemp"].as<unsigned char>();
|
settings.dhw.maxTemp = doc["dhw"]["maxTemp"].as<unsigned char>();
|
||||||
vars.parameters.dhwMaxTemp = settings.dhw.maxTemp;
|
vars.parameters.dhwMaxTemp = settings.dhw.maxTemp;
|
||||||
flag = true;
|
flag = true;
|
||||||
@@ -177,7 +177,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["dhw"]["minTemp"].isNull() && doc["dhw"]["minTemp"].is<unsigned char>()) {
|
if (!doc["dhw"]["minTemp"].isNull() && doc["dhw"]["minTemp"].is<unsigned char>()) {
|
||||||
if ( doc["dhw"]["minTemp"].as<unsigned char>() >= 0 && doc["dhw"]["minTemp"].as<unsigned char>() < 100 && doc["dhw"]["minTemp"].as<unsigned char>() < settings.dhw.maxTemp ) {
|
if (doc["dhw"]["minTemp"].as<unsigned char>() >= 0 && doc["dhw"]["minTemp"].as<unsigned char>() < 100 && doc["dhw"]["minTemp"].as<unsigned char>() < settings.dhw.maxTemp) {
|
||||||
settings.dhw.minTemp = doc["dhw"]["minTemp"].as<unsigned char>();
|
settings.dhw.minTemp = doc["dhw"]["minTemp"].as<unsigned char>();
|
||||||
vars.parameters.dhwMinTemp = settings.dhw.minTemp;
|
vars.parameters.dhwMinTemp = settings.dhw.minTemp;
|
||||||
flag = true;
|
flag = true;
|
||||||
@@ -192,35 +192,35 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["pid"]["p_factor"].isNull() && doc["pid"]["p_factor"].is<float>()) {
|
if (!doc["pid"]["p_factor"].isNull() && doc["pid"]["p_factor"].is<float>()) {
|
||||||
if ( doc["pid"]["p_factor"].as<float>() >= 0 && doc["pid"]["p_factor"].as<float>() <= 20 ) {
|
if (doc["pid"]["p_factor"].as<float>() >= 0 && doc["pid"]["p_factor"].as<float>() <= 20) {
|
||||||
settings.pid.p_factor = round(doc["pid"]["p_factor"].as<float>() * 1000) / 1000;
|
settings.pid.p_factor = round(doc["pid"]["p_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["pid"]["i_factor"].isNull() && doc["pid"]["i_factor"].is<float>()) {
|
if (!doc["pid"]["i_factor"].isNull() && doc["pid"]["i_factor"].is<float>()) {
|
||||||
if ( doc["pid"]["i_factor"].as<float>() >= 0 && doc["pid"]["i_factor"].as<float>() <= 20 ) {
|
if (doc["pid"]["i_factor"].as<float>() >= 0 && doc["pid"]["i_factor"].as<float>() <= 20) {
|
||||||
settings.pid.i_factor = round(doc["pid"]["i_factor"].as<float>() * 1000) / 1000;
|
settings.pid.i_factor = round(doc["pid"]["i_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["pid"]["d_factor"].isNull() && doc["pid"]["d_factor"].is<float>()) {
|
if (!doc["pid"]["d_factor"].isNull() && doc["pid"]["d_factor"].is<float>()) {
|
||||||
if ( doc["pid"]["d_factor"].as<float>() >= 0 && doc["pid"]["d_factor"].as<float>() <= 20 ) {
|
if (doc["pid"]["d_factor"].as<float>() >= 0 && doc["pid"]["d_factor"].as<float>() <= 20) {
|
||||||
settings.pid.d_factor = round(doc["pid"]["d_factor"].as<float>() * 1000) / 1000;
|
settings.pid.d_factor = round(doc["pid"]["d_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["pid"]["maxTemp"].isNull() && doc["pid"]["maxTemp"].is<unsigned char>()) {
|
if (!doc["pid"]["maxTemp"].isNull() && doc["pid"]["maxTemp"].is<unsigned char>()) {
|
||||||
if ( doc["pid"]["maxTemp"].as<unsigned char>() > 0 && doc["pid"]["maxTemp"].as<unsigned char>() <= 100 && doc["pid"]["maxTemp"].as<unsigned char>() > settings.pid.minTemp ) {
|
if (doc["pid"]["maxTemp"].as<unsigned char>() > 0 && doc["pid"]["maxTemp"].as<unsigned char>() <= 100 && doc["pid"]["maxTemp"].as<unsigned char>() > settings.pid.minTemp) {
|
||||||
settings.pid.maxTemp = doc["pid"]["maxTemp"].as<unsigned char>();
|
settings.pid.maxTemp = doc["pid"]["maxTemp"].as<unsigned char>();
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["pid"]["minTemp"].isNull() && doc["pid"]["minTemp"].is<unsigned char>()) {
|
if (!doc["pid"]["minTemp"].isNull() && doc["pid"]["minTemp"].is<unsigned char>()) {
|
||||||
if ( doc["pid"]["minTemp"].as<unsigned char>() >= 0 && doc["pid"]["minTemp"].as<unsigned char>() < 100 && doc["pid"]["minTemp"].as<unsigned char>() < settings.pid.maxTemp ) {
|
if (doc["pid"]["minTemp"].as<unsigned char>() >= 0 && doc["pid"]["minTemp"].as<unsigned char>() < 100 && doc["pid"]["minTemp"].as<unsigned char>() < settings.pid.maxTemp) {
|
||||||
settings.pid.minTemp = doc["pid"]["minTemp"].as<unsigned char>();
|
settings.pid.minTemp = doc["pid"]["minTemp"].as<unsigned char>();
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
@@ -233,21 +233,21 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["equitherm"]["n_factor"].isNull() && doc["equitherm"]["n_factor"].is<float>()) {
|
if (!doc["equitherm"]["n_factor"].isNull() && doc["equitherm"]["n_factor"].is<float>()) {
|
||||||
if ( doc["equitherm"]["n_factor"].as<float>() >= 0 && doc["equitherm"]["n_factor"].as<float>() <= 20 ) {
|
if (doc["equitherm"]["n_factor"].as<float>() >= 0 && doc["equitherm"]["n_factor"].as<float>() <= 20) {
|
||||||
settings.equitherm.n_factor = round(doc["equitherm"]["n_factor"].as<float>() * 1000) / 1000;
|
settings.equitherm.n_factor = round(doc["equitherm"]["n_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["equitherm"]["k_factor"].isNull() && doc["equitherm"]["k_factor"].is<float>()) {
|
if (!doc["equitherm"]["k_factor"].isNull() && doc["equitherm"]["k_factor"].is<float>()) {
|
||||||
if ( doc["equitherm"]["k_factor"].as<float>() >= 0 && doc["equitherm"]["k_factor"].as<float>() <= 20 ) {
|
if (doc["equitherm"]["k_factor"].as<float>() >= 0 && doc["equitherm"]["k_factor"].as<float>() <= 20) {
|
||||||
settings.equitherm.k_factor = round(doc["equitherm"]["k_factor"].as<float>() * 1000) / 1000;
|
settings.equitherm.k_factor = round(doc["equitherm"]["k_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["equitherm"]["t_factor"].isNull() && doc["equitherm"]["t_factor"].is<float>()) {
|
if (!doc["equitherm"]["t_factor"].isNull() && doc["equitherm"]["t_factor"].is<float>()) {
|
||||||
if ( doc["equitherm"]["t_factor"].as<float>() >= 0 && doc["equitherm"]["t_factor"].as<float>() <= 20 ) {
|
if (doc["equitherm"]["t_factor"].as<float>() >= 0 && doc["equitherm"]["t_factor"].as<float>() <= 20) {
|
||||||
settings.equitherm.t_factor = round(doc["equitherm"]["t_factor"].as<float>() * 1000) / 1000;
|
settings.equitherm.t_factor = round(doc["equitherm"]["t_factor"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
@@ -256,28 +256,28 @@ protected:
|
|||||||
|
|
||||||
// sensors
|
// sensors
|
||||||
if (!doc["sensors"]["outdoor"]["type"].isNull() && doc["sensors"]["outdoor"]["type"].is<unsigned char>()) {
|
if (!doc["sensors"]["outdoor"]["type"].isNull() && doc["sensors"]["outdoor"]["type"].is<unsigned char>()) {
|
||||||
if ( doc["sensors"]["outdoor"]["type"].as<unsigned char>() >= 0 && doc["sensors"]["outdoor"]["type"].as<unsigned char>() <= 2 ) {
|
if (doc["sensors"]["outdoor"]["type"].as<unsigned char>() >= 0 && doc["sensors"]["outdoor"]["type"].as<unsigned char>() <= 2) {
|
||||||
settings.sensors.outdoor.type = doc["sensors"]["outdoor"]["type"].as<unsigned char>();
|
settings.sensors.outdoor.type = doc["sensors"]["outdoor"]["type"].as<unsigned char>();
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["sensors"]["outdoor"]["offset"].isNull() && doc["sensors"]["outdoor"]["offset"].is<float>()) {
|
if (!doc["sensors"]["outdoor"]["offset"].isNull() && doc["sensors"]["outdoor"]["offset"].is<float>()) {
|
||||||
if ( doc["sensors"]["outdoor"]["offset"].as<float>() >= -10 && doc["sensors"]["outdoor"]["offset"].as<float>() <= 10 ) {
|
if (doc["sensors"]["outdoor"]["offset"].as<float>() >= -10 && doc["sensors"]["outdoor"]["offset"].as<float>() <= 10) {
|
||||||
settings.sensors.outdoor.offset = round(doc["sensors"]["outdoor"]["offset"].as<float>() * 1000) / 1000;
|
settings.sensors.outdoor.offset = round(doc["sensors"]["outdoor"]["offset"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["sensors"]["indoor"]["type"].isNull() && doc["sensors"]["indoor"]["type"].is<unsigned char>()) {
|
if (!doc["sensors"]["indoor"]["type"].isNull() && doc["sensors"]["indoor"]["type"].is<unsigned char>()) {
|
||||||
if ( doc["sensors"]["indoor"]["type"].as<unsigned char>() >= 1 && doc["sensors"]["indoor"]["type"].as<unsigned char>() <= 2 ) {
|
if (doc["sensors"]["indoor"]["type"].as<unsigned char>() >= 1 && doc["sensors"]["indoor"]["type"].as<unsigned char>() <= 2) {
|
||||||
settings.sensors.indoor.type = doc["sensors"]["indoor"]["type"].as<unsigned char>();
|
settings.sensors.indoor.type = doc["sensors"]["indoor"]["type"].as<unsigned char>();
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["sensors"]["indoor"]["offset"].isNull() && doc["sensors"]["indoor"]["offset"].is<float>()) {
|
if (!doc["sensors"]["indoor"]["offset"].isNull() && doc["sensors"]["indoor"]["offset"].is<float>()) {
|
||||||
if ( doc["sensors"]["indoor"]["offset"].as<float>() >= -10 && doc["sensors"]["indoor"]["offset"].as<float>() <= 10 ) {
|
if (doc["sensors"]["indoor"]["offset"].as<float>() >= -10 && doc["sensors"]["indoor"]["offset"].as<float>() <= 10) {
|
||||||
settings.sensors.indoor.offset = round(doc["sensors"]["indoor"]["offset"].as<float>() * 1000) / 1000;
|
settings.sensors.indoor.offset = round(doc["sensors"]["indoor"]["offset"].as<float>() * 1000) / 1000;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
@@ -314,14 +314,14 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["temperatures"]["indoor"].isNull() && doc["temperatures"]["indoor"].is<float>()) {
|
if (!doc["temperatures"]["indoor"].isNull() && doc["temperatures"]["indoor"].is<float>()) {
|
||||||
if ( settings.sensors.indoor.type == 1 && doc["temperatures"]["indoor"].as<float>() > -100 && doc["temperatures"]["indoor"].as<float>() < 100 ) {
|
if (settings.sensors.indoor.type == 1 && doc["temperatures"]["indoor"].as<float>() > -100 && doc["temperatures"]["indoor"].as<float>() < 100) {
|
||||||
vars.temperatures.indoor = round(doc["temperatures"]["indoor"].as<float>() * 100) / 100;
|
vars.temperatures.indoor = round(doc["temperatures"]["indoor"].as<float>() * 100) / 100;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!doc["temperatures"]["outdoor"].isNull() && doc["temperatures"]["outdoor"].is<float>()) {
|
if (!doc["temperatures"]["outdoor"].isNull() && doc["temperatures"]["outdoor"].is<float>()) {
|
||||||
if ( settings.sensors.outdoor.type == 1 && doc["temperatures"]["outdoor"].as<float>() > -100 && doc["temperatures"]["outdoor"].as<float>() < 100 ) {
|
if (settings.sensors.outdoor.type == 1 && doc["temperatures"]["outdoor"].as<float>() > -100 && doc["temperatures"]["outdoor"].as<float>() < 100) {
|
||||||
vars.temperatures.outdoor = round(doc["temperatures"]["outdoor"].as<float>() * 100) / 100;
|
vars.temperatures.outdoor = round(doc["temperatures"]["outdoor"].as<float>() * 100) / 100;
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
@@ -394,14 +394,6 @@ protected:
|
|||||||
haHelper.publishNumberHeatingMinTemp(false);
|
haHelper.publishNumberHeatingMinTemp(false);
|
||||||
haHelper.publishNumberHeatingMaxTemp(false);
|
haHelper.publishNumberHeatingMaxTemp(false);
|
||||||
|
|
||||||
// dhw
|
|
||||||
haHelper.publishSwitchDHW(false);
|
|
||||||
//haHelper.publishNumberDHWTarget(false);
|
|
||||||
haHelper.publishSensorCurrentDHWMinTemp(false);
|
|
||||||
haHelper.publishSensorCurrentDHWMaxTemp(false);
|
|
||||||
haHelper.publishNumberDHWMinTemp(false);
|
|
||||||
haHelper.publishNumberDHWMaxTemp(false);
|
|
||||||
|
|
||||||
// pid
|
// pid
|
||||||
haHelper.publishSwitchPID();
|
haHelper.publishSwitchPID();
|
||||||
haHelper.publishNumberPIDFactorP();
|
haHelper.publishNumberPIDFactorP();
|
||||||
@@ -424,7 +416,6 @@ protected:
|
|||||||
haHelper.publishBinSensorStatus();
|
haHelper.publishBinSensorStatus();
|
||||||
haHelper.publishBinSensorOtStatus();
|
haHelper.publishBinSensorOtStatus();
|
||||||
haHelper.publishBinSensorHeating();
|
haHelper.publishBinSensorHeating();
|
||||||
haHelper.publishBinSensorDHW();
|
|
||||||
haHelper.publishBinSensorFlame();
|
haHelper.publishBinSensorFlame();
|
||||||
haHelper.publishBinSensorFault();
|
haHelper.publishBinSensorFault();
|
||||||
haHelper.publishBinSensorDiagnostic();
|
haHelper.publishBinSensorDiagnostic();
|
||||||
@@ -439,12 +430,11 @@ protected:
|
|||||||
haHelper.publishNumberIndoorTemp();
|
haHelper.publishNumberIndoorTemp();
|
||||||
//haHelper.publishNumberOutdoorTemp();
|
//haHelper.publishNumberOutdoorTemp();
|
||||||
haHelper.publishSensorHeatingTemp();
|
haHelper.publishSensorHeatingTemp();
|
||||||
haHelper.publishSensorDHWTemp();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool publishNonStaticHaEntities(bool force = false) {
|
static bool publishNonStaticHaEntities(bool force = false) {
|
||||||
static byte _heatingMinTemp, _heatingMaxTemp, _dhwMinTemp, _dhwMaxTemp;
|
static byte _heatingMinTemp, _heatingMaxTemp, _dhwMinTemp, _dhwMaxTemp;
|
||||||
static bool _editableOutdoorTemp, _editableIndoorTemp;
|
static bool _editableOutdoorTemp, _editableIndoorTemp, _dhwPresent;
|
||||||
|
|
||||||
bool published = false;
|
bool published = false;
|
||||||
bool isStupidMode = !settings.pid.enable && !settings.equitherm.enable;
|
bool isStupidMode = !settings.pid.enable && !settings.equitherm.enable;
|
||||||
@@ -453,6 +443,33 @@ protected:
|
|||||||
bool editableOutdoorTemp = settings.sensors.outdoor.type == 1;
|
bool editableOutdoorTemp = settings.sensors.outdoor.type == 1;
|
||||||
bool editableIndoorTemp = settings.sensors.indoor.type == 1;
|
bool editableIndoorTemp = settings.sensors.indoor.type == 1;
|
||||||
|
|
||||||
|
if (force || _dhwPresent != settings.opentherm.dhwPresent) {
|
||||||
|
_dhwPresent = settings.opentherm.dhwPresent;
|
||||||
|
|
||||||
|
if (_dhwPresent) {
|
||||||
|
haHelper.publishSwitchDHW(false);
|
||||||
|
haHelper.publishSensorCurrentDHWMinTemp(false);
|
||||||
|
haHelper.publishSensorCurrentDHWMaxTemp(false);
|
||||||
|
haHelper.publishNumberDHWMinTemp(false);
|
||||||
|
haHelper.publishNumberDHWMaxTemp(false);
|
||||||
|
haHelper.publishBinSensorDHW();
|
||||||
|
haHelper.publishSensorDHWTemp();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
haHelper.deleteSwitchDHW();
|
||||||
|
haHelper.deleteSensorCurrentDHWMinTemp();
|
||||||
|
haHelper.deleteSensorCurrentDHWMaxTemp();
|
||||||
|
haHelper.deleteNumberDHWMinTemp();
|
||||||
|
haHelper.deleteNumberDHWMaxTemp();
|
||||||
|
haHelper.deleteBinSensorDHW();
|
||||||
|
haHelper.deleteSensorDHWTemp();
|
||||||
|
haHelper.deleteNumberDHWTarget();
|
||||||
|
haHelper.deleteClimateDHW();
|
||||||
|
}
|
||||||
|
|
||||||
|
published = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (force || _heatingMinTemp != heatingMinTemp || _heatingMaxTemp != heatingMaxTemp) {
|
if (force || _heatingMinTemp != heatingMinTemp || _heatingMaxTemp != heatingMaxTemp) {
|
||||||
if (settings.heating.target < heatingMinTemp || settings.heating.target > heatingMaxTemp) {
|
if (settings.heating.target < heatingMinTemp || settings.heating.target > heatingMaxTemp) {
|
||||||
settings.heating.target = constrain(settings.heating.target, heatingMinTemp, heatingMaxTemp);
|
settings.heating.target = constrain(settings.heating.target, heatingMinTemp, heatingMaxTemp);
|
||||||
@@ -467,7 +484,7 @@ protected:
|
|||||||
published = true;
|
published = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (force || _dhwMinTemp != vars.parameters.dhwMinTemp || _dhwMaxTemp != vars.parameters.dhwMaxTemp) {
|
if (_dhwPresent && (force || _dhwMinTemp != vars.parameters.dhwMinTemp || _dhwMaxTemp != vars.parameters.dhwMaxTemp)) {
|
||||||
_dhwMinTemp = vars.parameters.dhwMinTemp;
|
_dhwMinTemp = vars.parameters.dhwMinTemp;
|
||||||
_dhwMaxTemp = vars.parameters.dhwMaxTemp;
|
_dhwMaxTemp = vars.parameters.dhwMaxTemp;
|
||||||
|
|
||||||
@@ -543,7 +560,7 @@ protected:
|
|||||||
|
|
||||||
doc["sensors"]["outdoor"]["type"] = settings.sensors.outdoor.type;
|
doc["sensors"]["outdoor"]["type"] = settings.sensors.outdoor.type;
|
||||||
doc["sensors"]["outdoor"]["offset"] = settings.sensors.outdoor.offset;
|
doc["sensors"]["outdoor"]["offset"] = settings.sensors.outdoor.offset;
|
||||||
|
|
||||||
doc["sensors"]["indoor"]["type"] = settings.sensors.indoor.type;
|
doc["sensors"]["indoor"]["type"] = settings.sensors.indoor.type;
|
||||||
doc["sensors"]["indoor"]["offset"] = settings.sensors.indoor.offset;
|
doc["sensors"]["indoor"]["offset"] = settings.sensors.indoor.offset;
|
||||||
|
|
||||||
@@ -578,6 +595,7 @@ protected:
|
|||||||
doc["temperatures"]["heating"] = vars.temperatures.heating;
|
doc["temperatures"]["heating"] = vars.temperatures.heating;
|
||||||
doc["temperatures"]["dhw"] = vars.temperatures.dhw;
|
doc["temperatures"]["dhw"] = vars.temperatures.dhw;
|
||||||
|
|
||||||
|
doc["parameters"]["heatingEnabled"] = vars.parameters.heatingEnabled;
|
||||||
doc["parameters"]["heatingMinTemp"] = vars.parameters.heatingMinTemp;
|
doc["parameters"]["heatingMinTemp"] = vars.parameters.heatingMinTemp;
|
||||||
doc["parameters"]["heatingMaxTemp"] = vars.parameters.heatingMaxTemp;
|
doc["parameters"]["heatingMaxTemp"] = vars.parameters.heatingMaxTemp;
|
||||||
doc["parameters"]["heatingSetpoint"] = vars.parameters.heatingSetpoint;
|
doc["parameters"]["heatingSetpoint"] = vars.parameters.heatingSetpoint;
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
CustomOpenTherm* ot;
|
CustomOpenTherm* ot;
|
||||||
|
|
||||||
class OpenThermTask: public Task {
|
class OpenThermTask : public Task {
|
||||||
public:
|
public:
|
||||||
OpenThermTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {}
|
OpenThermTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setup() {
|
void setup() {
|
||||||
@@ -28,7 +28,7 @@ protected:
|
|||||||
static byte currentHeatingTemp, currentDHWTemp = 0;
|
static byte currentHeatingTemp, currentDHWTemp = 0;
|
||||||
unsigned long localResponse;
|
unsigned long localResponse;
|
||||||
|
|
||||||
if ( setMasterMemberIdCode() ) {
|
if (setMasterMemberIdCode()) {
|
||||||
DEBUG_F("Slave member id code: %u\r\n", vars.parameters.slaveMemberIdCode);
|
DEBUG_F("Slave member id code: %u\r\n", vars.parameters.slaveMemberIdCode);
|
||||||
DEBUG_F("Master member id code: %u\r\n", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode);
|
DEBUG_F("Master member id code: %u\r\n", settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode);
|
||||||
|
|
||||||
@@ -36,25 +36,30 @@ protected:
|
|||||||
WARN("Slave member id failed");
|
WARN("Slave member id failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool heatingEnable = (vars.states.emergency || settings.heating.enable) && pump && isReady();
|
bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && pump && isReady();
|
||||||
localResponse = ot->setBoilerStatus(
|
localResponse = ot->setBoilerStatus(
|
||||||
heatingEnable,
|
heatingEnabled,
|
||||||
settings.dhw.enable,
|
settings.opentherm.dhwPresent && settings.dhw.enable,
|
||||||
false, false, true, false, false
|
false, false, true, false, false
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!ot->isValidResponse(localResponse)) {
|
if (!ot->isValidResponse(localResponse)) {
|
||||||
WARN_F("Invalid response after setBoilerStatus: %s\r\n", ot->statusToString(ot->getLastResponseStatus()));
|
WARN_F("Invalid response after setBoilerStatus: %s\r\n", ot->statusToString(ot->getLastResponseStatus()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
INFO_F("Heating enabled: %d\r\n", heatingEnable);
|
if (vars.parameters.heatingEnabled != heatingEnabled) {
|
||||||
setMaxModulationLevel(heatingEnable ? 100 : 0);
|
vars.parameters.heatingEnabled = heatingEnabled;
|
||||||
|
INFO_F("Heating enabled: %s\r\n", heatingEnabled ? "on\0" : "off\0");
|
||||||
|
}
|
||||||
|
|
||||||
vars.states.heating = ot->isCentralHeatingActive(localResponse);
|
vars.states.heating = ot->isCentralHeatingActive(localResponse);
|
||||||
vars.states.dhw = ot->isHotWaterActive(localResponse);
|
vars.states.dhw = settings.opentherm.dhwPresent ? ot->isHotWaterActive(localResponse) : false;
|
||||||
vars.states.flame = ot->isFlameOn(localResponse);
|
vars.states.flame = ot->isFlameOn(localResponse);
|
||||||
vars.states.fault = ot->isFault(localResponse);
|
vars.states.fault = ot->isFault(localResponse);
|
||||||
vars.states.diagnostic = ot->isDiagnostic(localResponse);
|
vars.states.diagnostic = ot->isDiagnostic(localResponse);
|
||||||
|
|
||||||
|
setMaxModulationLevel(heatingEnabled ? 100 : 0);
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
// Команды чтения данных котла
|
// Команды чтения данных котла
|
||||||
@@ -65,7 +70,9 @@ protected:
|
|||||||
DEBUG_F("Master type: %u, version: %u\r\n", vars.parameters.masterType, vars.parameters.masterVersion);
|
DEBUG_F("Master type: %u, version: %u\r\n", vars.parameters.masterType, vars.parameters.masterVersion);
|
||||||
DEBUG_F("Slave type: %u, version: %u\r\n", vars.parameters.slaveType, vars.parameters.slaveVersion);
|
DEBUG_F("Slave type: %u, version: %u\r\n", vars.parameters.slaveType, vars.parameters.slaveVersion);
|
||||||
|
|
||||||
updateMinMaxDhwTemp();
|
if (settings.opentherm.dhwPresent) {
|
||||||
|
updateMinMaxDhwTemp();
|
||||||
|
}
|
||||||
updateMinMaxHeatingTemp();
|
updateMinMaxHeatingTemp();
|
||||||
|
|
||||||
if (settings.sensors.outdoor.type == 0) {
|
if (settings.sensors.outdoor.type == 0) {
|
||||||
@@ -76,7 +83,7 @@ protected:
|
|||||||
ot->sendBoilerReset();
|
ot->sendBoilerReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( vars.states.diagnostic ) {
|
if (vars.states.diagnostic) {
|
||||||
ot->sendServiceReset();
|
ot->sendServiceReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,28 +92,27 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
updatePressure();
|
updatePressure();
|
||||||
if ( settings.dhw.enable || settings.heating.enable || heatingEnable ) {
|
if ((settings.opentherm.dhwPresent && settings.dhw.enable) || settings.heating.enable || heatingEnabled) {
|
||||||
updateModulationLevel();
|
updateModulationLevel();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
vars.sensors.modulation = 0;
|
||||||
}
|
}
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
if ( settings.dhw.enable ) {
|
if (settings.opentherm.dhwPresent) {
|
||||||
updateDHWTemp();
|
updateDHWTemp();
|
||||||
} else {
|
} else {
|
||||||
vars.temperatures.dhw = 0;
|
vars.temperatures.dhw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( settings.heating.enable || heatingEnable ) {
|
updateHeatingTemp();
|
||||||
updateHeatingTemp();
|
|
||||||
} else {
|
|
||||||
vars.temperatures.heating = 0;
|
|
||||||
}
|
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Температура ГВС
|
// Температура ГВС
|
||||||
byte newDHWTemp = settings.dhw.target;
|
byte newDHWTemp = settings.dhw.target;
|
||||||
if (settings.dhw.enable && newDHWTemp != currentDHWTemp) {
|
if (settings.opentherm.dhwPresent && settings.dhw.enable && (needSetDhwTemp() || newDHWTemp != currentDHWTemp)) {
|
||||||
if (newDHWTemp < vars.parameters.dhwMinTemp || newDHWTemp > vars.parameters.dhwMaxTemp) {
|
if (newDHWTemp < vars.parameters.dhwMinTemp || newDHWTemp > vars.parameters.dhwMaxTemp) {
|
||||||
newDHWTemp = constrain(newDHWTemp, vars.parameters.dhwMinTemp, vars.parameters.dhwMaxTemp);
|
newDHWTemp = constrain(newDHWTemp, vars.parameters.dhwMinTemp, vars.parameters.dhwMaxTemp);
|
||||||
}
|
}
|
||||||
@@ -116,6 +122,7 @@ protected:
|
|||||||
// Записываем заданную температуру ГВС
|
// Записываем заданную температуру ГВС
|
||||||
if (ot->setDHWSetpoint(newDHWTemp)) {
|
if (ot->setDHWSetpoint(newDHWTemp)) {
|
||||||
currentDHWTemp = newDHWTemp;
|
currentDHWTemp = newDHWTemp;
|
||||||
|
dhwSetTempTime = millis();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
WARN("Failed set DHW temp");
|
WARN("Failed set DHW temp");
|
||||||
@@ -124,12 +131,13 @@ protected:
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Температура отопления
|
// Температура отопления
|
||||||
if (heatingEnable && fabs(vars.parameters.heatingSetpoint - currentHeatingTemp) > 0.0001) {
|
if (heatingEnabled && (needSetHeatingTemp() || fabs(vars.parameters.heatingSetpoint - currentHeatingTemp) > 0.0001)) {
|
||||||
INFO_F("Setting heating temp = %u \n", vars.parameters.heatingSetpoint);
|
INFO_F("Setting heating temp = %u \n", vars.parameters.heatingSetpoint);
|
||||||
|
|
||||||
// Записываем заданную температуру
|
// Записываем заданную температуру
|
||||||
if (ot->setBoilerTemperature(vars.parameters.heatingSetpoint)) {
|
if (ot->setBoilerTemperature(vars.parameters.heatingSetpoint)) {
|
||||||
currentHeatingTemp = vars.parameters.heatingSetpoint;
|
currentHeatingTemp = vars.parameters.heatingSetpoint;
|
||||||
|
heatingSetTempTime = millis();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
WARN("Failed set heating temp");
|
WARN("Failed set heating temp");
|
||||||
@@ -146,7 +154,7 @@ protected:
|
|||||||
} else if (!pump && vars.temperatures.indoor - settings.heating.target - 0.0001 <= -(halfHyst)) {
|
} else if (!pump && vars.temperatures.indoor - settings.heating.target - 0.0001 <= -(halfHyst)) {
|
||||||
pump = true;
|
pump = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (!pump) {
|
} else if (!pump) {
|
||||||
pump = true;
|
pump = true;
|
||||||
}
|
}
|
||||||
@@ -193,13 +201,27 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
unsigned short readyTime = 60000;
|
||||||
|
unsigned short dhwSetTempInterval = 60000;
|
||||||
|
unsigned short heatingSetTempInterval = 60000;
|
||||||
|
|
||||||
bool pump = true;
|
bool pump = true;
|
||||||
unsigned long prevUpdateNonEssentialVars = 0;
|
unsigned long prevUpdateNonEssentialVars = 0;
|
||||||
unsigned long startupTime = millis();
|
unsigned long startupTime = millis();
|
||||||
|
unsigned long dhwSetTempTime = 0;
|
||||||
|
unsigned long heatingSetTempTime = 0;
|
||||||
|
|
||||||
|
|
||||||
bool isReady() {
|
bool isReady() {
|
||||||
return millis() - startupTime > 60000;
|
return millis() - startupTime > readyTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool needSetDhwTemp() {
|
||||||
|
return millis() - dhwSetTempTime > dhwSetTempInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool needSetHeatingTemp() {
|
||||||
|
return millis() - heatingSetTempTime > heatingSetTempInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void static printRequestDetail(OpenThermMessageID id, OpenThermResponseStatus status, unsigned long request, unsigned long response, byte attempt) {
|
void static printRequestDetail(OpenThermMessageID id, OpenThermResponseStatus status, unsigned long request, unsigned long response, byte attempt) {
|
||||||
@@ -224,33 +246,33 @@ protected:
|
|||||||
//=======================================================================================
|
//=======================================================================================
|
||||||
|
|
||||||
unsigned long response = ot->sendRequest(ot->buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, 0)); // 0xFFFF
|
unsigned long response = ot->sendRequest(ot->buildRequest(OpenThermRequestType::READ, OpenThermMessageID::SConfigSMemberIDcode, 0)); // 0xFFFF
|
||||||
/*uint8_t flags = (response & 0xFFFF) >> 8;
|
|
||||||
DEBUG_F(
|
|
||||||
"MasterMemberIdCode:\r\n DHW present: %u\r\n Control type: %u\r\n Cooling configuration: %u\r\n DHW configuration: %u\r\n Pump control: %u\r\n CH2 present: %u\r\n Remote water filling function: %u\r\n Heat/cool mode control: %u\r\n Slave MemberID Code: %u\r\n",
|
|
||||||
flags & 0x01,
|
|
||||||
flags & 0x02,
|
|
||||||
flags & 0x04,
|
|
||||||
flags & 0x08,
|
|
||||||
flags & 0x10,
|
|
||||||
flags & 0x20,
|
|
||||||
flags & 0x40,
|
|
||||||
flags & 0x80,
|
|
||||||
response & 0xFF
|
|
||||||
);*/
|
|
||||||
|
|
||||||
if (ot->isValidResponse(response)) {
|
if (ot->isValidResponse(response)) {
|
||||||
vars.parameters.slaveMemberIdCode = response & 0xFF;
|
vars.parameters.slaveMemberIdCode = response & 0xFF;
|
||||||
|
|
||||||
} else if ( settings.opentherm.memberIdCode <= 0 ) {
|
/*uint8_t flags = (response & 0xFFFF) >> 8;
|
||||||
|
DEBUG_F(
|
||||||
|
"MasterMemberIdCode:\r\n DHW present: %u\r\n Control type: %u\r\n Cooling configuration: %u\r\n DHW configuration: %u\r\n Pump control: %u\r\n CH2 present: %u\r\n Remote water filling function: %u\r\n Heat/cool mode control: %u\r\n Slave MemberID Code: %u\r\n",
|
||||||
|
flags & 0x01,
|
||||||
|
flags & 0x02,
|
||||||
|
flags & 0x04,
|
||||||
|
flags & 0x08,
|
||||||
|
flags & 0x10,
|
||||||
|
flags & 0x20,
|
||||||
|
flags & 0x40,
|
||||||
|
flags & 0x80,
|
||||||
|
response & 0xFF
|
||||||
|
);*/
|
||||||
|
|
||||||
|
} else if (settings.opentherm.memberIdCode <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
response = ot->sendRequest(ot->buildRequest(
|
response = ot->sendRequest(ot->buildRequest(
|
||||||
OpenThermRequestType::WRITE,
|
OpenThermRequestType::WRITE,
|
||||||
OpenThermMessageID::MConfigMMemberIDcode,
|
OpenThermMessageID::MConfigMMemberIDcode,
|
||||||
settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode
|
settings.opentherm.memberIdCode > 0 ? settings.opentherm.memberIdCode : vars.parameters.slaveMemberIdCode
|
||||||
));
|
));
|
||||||
|
|
||||||
return ot->isValidResponse(response);
|
return ot->isValidResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ Equitherm etRegulator;
|
|||||||
GyverPID pidRegulator(0, 0, 0);
|
GyverPID pidRegulator(0, 0, 0);
|
||||||
PIDtuner pidTuner;
|
PIDtuner pidTuner;
|
||||||
|
|
||||||
class RegulatorTask: public LeanTask {
|
class RegulatorTask : public LeanTask {
|
||||||
public:
|
public:
|
||||||
RegulatorTask(bool _enabled = false, unsigned long _interval = 0): LeanTask(_enabled, _interval) {}
|
RegulatorTask(bool _enabled = false, unsigned long _interval = 0) : LeanTask(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool tunerInit = false;
|
bool tunerInit = false;
|
||||||
@@ -123,13 +123,13 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if use pid
|
// if use pid
|
||||||
if (settings.pid.enable && vars.states.heating) {
|
if (settings.pid.enable && vars.parameters.heatingEnabled) {
|
||||||
float pidResult = getPidTemp(
|
float pidResult = getPidTemp(
|
||||||
settings.equitherm.enable ? (settings.pid.maxTemp * -1) : settings.pid.minTemp,
|
settings.equitherm.enable ? (settings.pid.maxTemp * -1) : settings.pid.minTemp,
|
||||||
settings.equitherm.enable ? settings.pid.maxTemp : settings.pid.maxTemp
|
settings.equitherm.enable ? settings.pid.maxTemp : settings.pid.maxTemp
|
||||||
);
|
);
|
||||||
|
|
||||||
if (1 || fabs(prevPidResult - pidResult) + 0.0001 >= 0.5) {
|
if (fabs(prevPidResult - pidResult) + 0.0001 >= 0.5) {
|
||||||
prevPidResult = pidResult;
|
prevPidResult = pidResult;
|
||||||
newTemp += pidResult;
|
newTemp += pidResult;
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ protected:
|
|||||||
newTemp += prevPidResult;
|
newTemp += prevPidResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ( settings.pid.enable && !vars.states.heating && prevPidResult != 0 ) {
|
} else if (settings.pid.enable && !vars.parameters.heatingEnabled && prevPidResult != 0) {
|
||||||
newTemp += prevPidResult;
|
newTemp += prevPidResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#include <OneWire.h>
|
#include <OneWire.h>
|
||||||
#include <DallasTemperature.h>
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
class SensorsTask: public LeanTask {
|
class SensorsTask : public LeanTask {
|
||||||
public:
|
public:
|
||||||
SensorsTask(bool _enabled = false, unsigned long _interval = 0): LeanTask(_enabled, _interval) {}
|
SensorsTask(bool _enabled = false, unsigned long _interval = 0) : LeanTask(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
OneWire* oneWireOutdoorSensor;
|
OneWire* oneWireOutdoorSensor;
|
||||||
@@ -24,17 +24,17 @@ protected:
|
|||||||
|
|
||||||
void setup() {}
|
void setup() {}
|
||||||
void loop() {
|
void loop() {
|
||||||
if ( settings.sensors.outdoor.type == 2 ) {
|
if (settings.sensors.outdoor.type == 2) {
|
||||||
outdoorTemperatureSensor();
|
outdoorTemperatureSensor();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( settings.sensors.indoor.type == 2 ) {
|
if (settings.sensors.indoor.type == 2) {
|
||||||
indoorTemperatureSensor();
|
indoorTemperatureSensor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void outdoorTemperatureSensor() {
|
void outdoorTemperatureSensor() {
|
||||||
if ( !initOutdoorSensor ) {
|
if (!initOutdoorSensor) {
|
||||||
oneWireOutdoorSensor = new OneWire(settings.sensors.outdoor.pin);
|
oneWireOutdoorSensor = new OneWire(settings.sensors.outdoor.pin);
|
||||||
outdoorSensor = new DallasTemperature(oneWireOutdoorSensor);
|
outdoorSensor = new DallasTemperature(oneWireOutdoorSensor);
|
||||||
outdoorSensor->begin();
|
outdoorSensor->begin();
|
||||||
@@ -46,12 +46,12 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long estimateConversionTime = millis() - startConversionTime;
|
unsigned long estimateConversionTime = millis() - startConversionTime;
|
||||||
if ( estimateConversionTime < outdoorSensor->millisToWaitForConversion() ) {
|
if (estimateConversionTime < outdoorSensor->millisToWaitForConversion()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool completed = outdoorSensor->isConversionComplete();
|
bool completed = outdoorSensor->isConversionComplete();
|
||||||
if ( !completed && estimateConversionTime >= 1000 ) {
|
if (!completed && estimateConversionTime >= 1000) {
|
||||||
// fail, retry
|
// fail, retry
|
||||||
outdoorSensor->requestTemperatures();
|
outdoorSensor->requestTemperatures();
|
||||||
startConversionTime = millis();
|
startConversionTime = millis();
|
||||||
@@ -59,7 +59,7 @@ protected:
|
|||||||
ERROR("[SENSORS][OUTDOOR] Could not read temperature data (no response)");
|
ERROR("[SENSORS][OUTDOOR] Could not read temperature data (no response)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !completed ) {
|
if (!completed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void indoorTemperatureSensor() {
|
void indoorTemperatureSensor() {
|
||||||
if ( !initIndoorSensor ) {
|
if (!initIndoorSensor) {
|
||||||
oneWireIndoorSensor = new OneWire(settings.sensors.indoor.pin);
|
oneWireIndoorSensor = new OneWire(settings.sensors.indoor.pin);
|
||||||
indoorSensor = new DallasTemperature(oneWireIndoorSensor);
|
indoorSensor = new DallasTemperature(oneWireIndoorSensor);
|
||||||
indoorSensor->begin();
|
indoorSensor->begin();
|
||||||
@@ -103,12 +103,12 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long estimateConversionTime = millis() - startConversionTime;
|
unsigned long estimateConversionTime = millis() - startConversionTime;
|
||||||
if ( estimateConversionTime < indoorSensor->millisToWaitForConversion() ) {
|
if (estimateConversionTime < indoorSensor->millisToWaitForConversion()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool completed = indoorSensor->isConversionComplete();
|
bool completed = indoorSensor->isConversionComplete();
|
||||||
if ( !completed && estimateConversionTime >= 1000 ) {
|
if (!completed && estimateConversionTime >= 1000) {
|
||||||
// fail, retry
|
// fail, retry
|
||||||
indoorSensor->requestTemperatures();
|
indoorSensor->requestTemperatures();
|
||||||
startConversionTime = millis();
|
startConversionTime = millis();
|
||||||
@@ -116,7 +116,7 @@ protected:
|
|||||||
ERROR("[SENSORS][INDOOR] Could not read temperature data (no response)");
|
ERROR("[SENSORS][INDOOR] Could not read temperature data (no response)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !completed ) {
|
if (!completed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ struct Settings {
|
|||||||
byte inPin = 4;
|
byte inPin = 4;
|
||||||
byte outPin = 5;
|
byte outPin = 5;
|
||||||
unsigned int memberIdCode = 0;
|
unsigned int memberIdCode = 0;
|
||||||
|
bool dhwPresent = true;
|
||||||
} opentherm;
|
} opentherm;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -105,11 +106,12 @@ struct Variables {
|
|||||||
} temperatures;
|
} temperatures;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
byte heatingMinTemp = 0;
|
bool heatingEnabled = false;
|
||||||
byte heatingMaxTemp = 0;
|
byte heatingMinTemp = 20;
|
||||||
|
byte heatingMaxTemp = 90;
|
||||||
byte heatingSetpoint = 0.0f;
|
byte heatingSetpoint = 0.0f;
|
||||||
byte dhwMinTemp = 0;
|
byte dhwMinTemp = 30;
|
||||||
byte dhwMaxTemp = 0;
|
byte dhwMaxTemp = 60;
|
||||||
uint8_t slaveMemberIdCode;
|
uint8_t slaveMemberIdCode;
|
||||||
uint8_t slaveType;
|
uint8_t slaveType;
|
||||||
uint8_t slaveVersion;
|
uint8_t slaveVersion;
|
||||||
|
|||||||
@@ -1,23 +1,28 @@
|
|||||||
#include <WiFiManager.h>
|
#include <WiFiManager.h>
|
||||||
|
#include <WiFiManagerParameters.h>
|
||||||
|
|
||||||
// Wifimanager
|
// Wifimanager
|
||||||
WiFiManager wm;
|
WiFiManager wm;
|
||||||
WiFiManagerParameter* wmHostname;
|
WiFiManagerParameter* wmHostname;
|
||||||
WiFiManagerParameter* wmMqttServer;
|
WiFiManagerParameter* wmMqttServer;
|
||||||
WiFiManagerParameter* wmMqttPort;
|
IntParameter* wmMqttPort;
|
||||||
WiFiManagerParameter* wmMqttUser;
|
WiFiManagerParameter* wmMqttUser;
|
||||||
WiFiManagerParameter* wmMqttPassword;
|
WiFiManagerParameter* wmMqttPassword;
|
||||||
WiFiManagerParameter* wmMqttPrefix;
|
WiFiManagerParameter* wmMqttPrefix;
|
||||||
WiFiManagerParameter* wmMqttPublishInterval;
|
IntParameter* wmMqttPublishInterval;
|
||||||
WiFiManagerParameter* wmOtInPin;
|
IntParameter* wmOtInPin;
|
||||||
WiFiManagerParameter* wmOtOutPin;
|
IntParameter* wmOtOutPin;
|
||||||
WiFiManagerParameter* wmOtMemberIdCode;
|
IntParameter* wmOtMemberIdCode;
|
||||||
WiFiManagerParameter* wmOutdoorSensorPin;
|
CheckboxParameter* wmOtDHWPresent;
|
||||||
WiFiManagerParameter* wmIndoorSensorPin;
|
IntParameter* wmOutdoorSensorPin;
|
||||||
|
IntParameter* wmIndoorSensorPin;
|
||||||
|
|
||||||
class WifiManagerTask: public Task {
|
SeparatorParameter* wmSep1;
|
||||||
|
SeparatorParameter* wmSep2;
|
||||||
|
|
||||||
|
class WifiManagerTask : public Task {
|
||||||
public:
|
public:
|
||||||
WifiManagerTask(bool _enabled = false, unsigned long _interval = 0): Task(_enabled, _interval) {}
|
WifiManagerTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setup() {
|
void setup() {
|
||||||
@@ -30,41 +35,43 @@ protected:
|
|||||||
wmMqttServer = new WiFiManagerParameter("mqtt_server", "MQTT server", settings.mqtt.server, 80);
|
wmMqttServer = new WiFiManagerParameter("mqtt_server", "MQTT server", settings.mqtt.server, 80);
|
||||||
wm.addParameter(wmMqttServer);
|
wm.addParameter(wmMqttServer);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.mqtt.port);
|
wmMqttPort = new IntParameter("mqtt_port", "MQTT port", settings.mqtt.port, 6);
|
||||||
wmMqttPort = new WiFiManagerParameter("mqtt_port", "MQTT port", buffer, 6);
|
|
||||||
wm.addParameter(wmMqttPort);
|
wm.addParameter(wmMqttPort);
|
||||||
|
|
||||||
wmMqttUser = new WiFiManagerParameter("mqtt_user", "MQTT username", settings.mqtt.user, 32);
|
wmMqttUser = new WiFiManagerParameter("mqtt_user", "MQTT username", settings.mqtt.user, 32);
|
||||||
wm.addParameter(wmMqttUser);
|
wm.addParameter(wmMqttUser);
|
||||||
|
|
||||||
wmMqttPassword = new WiFiManagerParameter("mqtt_password", "MQTT password", settings.mqtt.password, 32);
|
wmMqttPassword = new WiFiManagerParameter("mqtt_password", "MQTT password", settings.mqtt.password, 32, "type=\"password\"");
|
||||||
wm.addParameter(wmMqttPassword);
|
wm.addParameter(wmMqttPassword);
|
||||||
|
|
||||||
wmMqttPrefix = new WiFiManagerParameter("mqtt_prefix", "MQTT prefix", settings.mqtt.prefix, 32);
|
wmMqttPrefix = new WiFiManagerParameter("mqtt_prefix", "MQTT prefix", settings.mqtt.prefix, 32);
|
||||||
wm.addParameter(wmMqttPrefix);
|
wm.addParameter(wmMqttPrefix);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.mqtt.interval);
|
wmMqttPublishInterval = new IntParameter("mqtt_publish_interval", "MQTT publish interval", settings.mqtt.interval, 5);
|
||||||
wmMqttPublishInterval = new WiFiManagerParameter("mqtt_publish_interval", "MQTT publish interval", buffer, 5);
|
|
||||||
wm.addParameter(wmMqttPublishInterval);
|
wm.addParameter(wmMqttPublishInterval);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.opentherm.inPin);
|
wmSep1 = new SeparatorParameter();
|
||||||
wmOtInPin = new WiFiManagerParameter("ot_in_pin", "Opentherm pin IN", buffer, 2);
|
wm.addParameter(wmSep1);
|
||||||
|
|
||||||
|
wmOtInPin = new IntParameter("ot_in_pin", "Opentherm pin IN", settings.opentherm.inPin, 2);
|
||||||
wm.addParameter(wmOtInPin);
|
wm.addParameter(wmOtInPin);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.opentherm.outPin);
|
wmOtOutPin = new IntParameter("ot_out_pin", "Opentherm pin OUT", settings.opentherm.outPin, 2);
|
||||||
wmOtOutPin = new WiFiManagerParameter("ot_out_pin", "Opentherm pin OUT", buffer, 2);
|
|
||||||
wm.addParameter(wmOtOutPin);
|
wm.addParameter(wmOtOutPin);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.opentherm.memberIdCode);
|
wmOtMemberIdCode = new IntParameter("ot_member_id_code", "Opentherm member id", settings.opentherm.memberIdCode, 5);
|
||||||
wmOtMemberIdCode = new WiFiManagerParameter("ot_member_id_code", "Opentherm member id", buffer, 5);
|
|
||||||
wm.addParameter(wmOtMemberIdCode);
|
wm.addParameter(wmOtMemberIdCode);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.sensors.outdoor.pin);
|
wmOtDHWPresent = new CheckboxParameter("ot_dhw_present", "Opentherm DHW present", settings.opentherm.dhwPresent);
|
||||||
wmOutdoorSensorPin = new WiFiManagerParameter("outdoor_sensor_pin", "Outdoor sensor pin", buffer, 2);
|
wm.addParameter(wmOtDHWPresent);
|
||||||
|
|
||||||
|
wmSep2 = new SeparatorParameter();
|
||||||
|
wm.addParameter(wmSep2);
|
||||||
|
|
||||||
|
wmOutdoorSensorPin = new IntParameter("outdoor_sensor_pin", "Outdoor sensor pin", settings.sensors.outdoor.pin, 2);
|
||||||
wm.addParameter(wmOutdoorSensorPin);
|
wm.addParameter(wmOutdoorSensorPin);
|
||||||
|
|
||||||
sprintf(buffer, "%d", settings.sensors.indoor.pin);
|
wmIndoorSensorPin = new IntParameter("indoor_sensor_pin", "Indoor sensor pin", settings.sensors.indoor.pin, 2);
|
||||||
wmIndoorSensorPin = new WiFiManagerParameter("indoor_sensor_pin", "Indoor sensor pin", buffer, 2);
|
|
||||||
wm.addParameter(wmIndoorSensorPin);
|
wm.addParameter(wmIndoorSensorPin);
|
||||||
|
|
||||||
//wm.setCleanConnect(true);
|
//wm.setCleanConnect(true);
|
||||||
@@ -110,16 +117,17 @@ protected:
|
|||||||
void static saveParamsCallback() {
|
void static saveParamsCallback() {
|
||||||
strcpy(settings.hostname, wmHostname->getValue());
|
strcpy(settings.hostname, wmHostname->getValue());
|
||||||
strcpy(settings.mqtt.server, wmMqttServer->getValue());
|
strcpy(settings.mqtt.server, wmMqttServer->getValue());
|
||||||
settings.mqtt.port = atoi(wmMqttPort->getValue());
|
settings.mqtt.port = wmMqttPort->getValue();
|
||||||
strcpy(settings.mqtt.user, wmMqttUser->getValue());
|
strcpy(settings.mqtt.user, wmMqttUser->getValue());
|
||||||
strcpy(settings.mqtt.password, wmMqttPassword->getValue());
|
strcpy(settings.mqtt.password, wmMqttPassword->getValue());
|
||||||
strcpy(settings.mqtt.prefix, wmMqttPrefix->getValue());
|
strcpy(settings.mqtt.prefix, wmMqttPrefix->getValue());
|
||||||
settings.mqtt.interval = atoi(wmMqttPublishInterval->getValue());
|
settings.mqtt.interval = wmMqttPublishInterval->getValue();
|
||||||
settings.opentherm.inPin = atoi(wmOtInPin->getValue());
|
settings.opentherm.inPin = wmOtInPin->getValue();
|
||||||
settings.opentherm.outPin = atoi(wmOtOutPin->getValue());
|
settings.opentherm.outPin = wmOtOutPin->getValue();
|
||||||
settings.opentherm.memberIdCode = atoi(wmOtMemberIdCode->getValue());
|
settings.opentherm.memberIdCode = wmOtMemberIdCode->getValue();
|
||||||
settings.sensors.outdoor.pin = atoi(wmOutdoorSensorPin->getValue());
|
settings.opentherm.dhwPresent = wmOtDHWPresent->getCheckboxValue();
|
||||||
settings.sensors.indoor.pin = atoi(wmIndoorSensorPin->getValue());
|
settings.sensors.outdoor.pin = wmOutdoorSensorPin->getValue();
|
||||||
|
settings.sensors.indoor.pin = wmIndoorSensorPin->getValue();
|
||||||
|
|
||||||
INFO_F(
|
INFO_F(
|
||||||
"New settings:\r\n"
|
"New settings:\r\n"
|
||||||
@@ -132,6 +140,7 @@ protected:
|
|||||||
" OT in pin: %d\r\n"
|
" OT in pin: %d\r\n"
|
||||||
" OT out pin: %d\r\n"
|
" OT out pin: %d\r\n"
|
||||||
" OT member id code: %d\r\n"
|
" OT member id code: %d\r\n"
|
||||||
|
" OT DHW present: %d\r\n"
|
||||||
" Outdoor sensor pin: %d\r\n"
|
" Outdoor sensor pin: %d\r\n"
|
||||||
" Indoor sensor pin: %d\r\n",
|
" Indoor sensor pin: %d\r\n",
|
||||||
settings.hostname,
|
settings.hostname,
|
||||||
@@ -144,6 +153,7 @@ protected:
|
|||||||
settings.opentherm.inPin,
|
settings.opentherm.inPin,
|
||||||
settings.opentherm.outPin,
|
settings.opentherm.outPin,
|
||||||
settings.opentherm.memberIdCode,
|
settings.opentherm.memberIdCode,
|
||||||
|
settings.opentherm.dhwPresent,
|
||||||
settings.sensors.outdoor.pin,
|
settings.sensors.outdoor.pin,
|
||||||
settings.sensors.indoor.pin
|
settings.sensors.indoor.pin
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#define OT_GATEWAY_VERSION "1.3.0"
|
#define OT_GATEWAY_VERSION "1.3.2"
|
||||||
#define AP_SSID "OpenTherm Gateway"
|
#define AP_SSID "OpenTherm Gateway"
|
||||||
#define AP_PASSWORD "otgateway123456"
|
#define AP_PASSWORD "otgateway123456"
|
||||||
#define USE_TELNET
|
#define USE_TELNET
|
||||||
@@ -11,8 +11,6 @@
|
|||||||
|
|
||||||
#define EXT_SENSORS_INTERVAL 5000
|
#define EXT_SENSORS_INTERVAL 5000
|
||||||
#define EXT_SENSORS_FILTER_K 0.15
|
#define EXT_SENSORS_FILTER_K 0.15
|
||||||
#define DS_CHECK_CRC true
|
|
||||||
#define DS_CRC_USE_TABLE true
|
|
||||||
|
|
||||||
#define LED_STATUS_PIN 13
|
#define LED_STATUS_PIN 13
|
||||||
#define LED_OT_RX_PIN 15
|
#define LED_OT_RX_PIN 15
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ void setup() {
|
|||||||
if (eeSettingsResult == 0) {
|
if (eeSettingsResult == 0) {
|
||||||
INFO("Settings loaded");
|
INFO("Settings loaded");
|
||||||
|
|
||||||
if ( strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0 ) {
|
if (strcmp(SETTINGS_VALID_VALUE, settings.validationValue) != 0) {
|
||||||
INFO("Settings not valid, reset and restart...");
|
INFO("Settings not valid, reset and restart...");
|
||||||
eeSettings.reset();
|
eeSettings.reset();
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|||||||
Reference in New Issue
Block a user