moved wiki again
16
README.md
@@ -1,5 +1,4 @@
|
|||||||

|

|
||||||
# EMS-ESP
|
|
||||||
|
|
||||||
[](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
|
[](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
|
||||||
[](https://github.com/proddy/EMS-ESP/commits/master)
|
[](https://github.com/proddy/EMS-ESP/commits/master)
|
||||||
@@ -10,12 +9,14 @@
|
|||||||
[](https://github.com/proddy/EMS-ESP/releases)
|
[](https://github.com/proddy/EMS-ESP/releases)
|
||||||
<br />
|
<br />
|
||||||
[](https://gitter.im/EMS-ESP/community)
|
[](https://gitter.im/EMS-ESP/community)
|
||||||
|
<br>
|
||||||
|
-------------
|
||||||
|
|
||||||
EMS-ESP is a open-source system to communicate with **EMS** (Energy Management System) based boilers, thermostats and other modules from manufacturers like Bosch, Buderus, Nefit, Junkers and Sieger.
|
EMS-ESP is a open-source system to communicate with **EMS** (Energy Management System) based boilers, thermostats and other modules from manufacturers like Bosch, Buderus, Nefit, Junkers and Sieger.
|
||||||
|
|
||||||
The code is written for the Espressif **ESP8266** microcontroller and supports a telnet console for real-time monitoring and configuration and customizable MQTT support for publishing the information to a home automation system such as Home Assistant or Domoticz.
|
The code is written for the Espressif **ESP8266** microcontroller and supports a telnet console for real-time monitoring and configuration and customizable MQTT support for publishing the information to a home automation system such as Home Assistant or Domoticz.
|
||||||
|
|
||||||
#### Please reference the [Wiki](https://proddy.github.io/EMS-ESP) for further details and instructions on how to build and configure the firmware.
|
#### Please reference the [Wiki](https://emsesp.github.io/docs) for further details and instructions on how to build and configure the firmware.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -37,11 +38,14 @@ The code is written for the Espressif **ESP8266** microcontroller and supports a
|
|||||||
|
|
||||||
## Supported EMS devices
|
## Supported EMS devices
|
||||||
|
|
||||||
More than **50** EMS devices are currently supported. See the [complete list](https://proddy.github.io/EMS-ESP/#/Supported-EMS-Devices).
|
More than **50** EMS 1.0 and 2.0 devices are currently supported. See the [complete list](https://proddy.github.io/EMS-ESP/#/Supported-EMS-Devices).
|
||||||
|
|
||||||
## Compatible with bbqkees' EMS Gateway
|
|
||||||
|
|
||||||
The firmware fully supports BBQKees' [EMS Gateway](https://bbqkees-electronics.nl/) board with integrated Wemos D1 ESP8266.
|
---
|
||||||
|
|
||||||
|
## Native compatibility with bbqkees' **EMS Gateway**
|
||||||
|
|
||||||
|
All firmware versions fully support BBQKees' [EMS Gateway](https://bbqkees-electronics.nl/) board with integrated Wemos D1 ESP8266.
|
||||||
|
|
||||||
|  |  |  |
|
|  |  |  |
|
||||||
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
|
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
### Using the PlatformIO IDE
|
|
||||||
|
|
||||||
- Download [Git](https://git-scm.com/download/win) (install using the default settings)
|
|
||||||
- Download and install [Visual Studio Code](https://code.visualstudio.com/docs/?dv=win) (VSC)
|
|
||||||
- Restart the PC (if using Windows) to apply the new PATH settings. It should now detect Git
|
|
||||||
- Install the VSC extension "PlatformIO IDE"
|
|
||||||
- Git clone this repo with "git clone" from the command palette and using the URL https://github.com/proddy/EMS-ESP.git
|
|
||||||
- Install NodeJS from [here](https://nodejs.org/en/download/).
|
|
||||||
- Test if Node is installed correctly by `node --version` (both v10 and v12 are ok)
|
|
||||||
- Install the modules in the `tools/webfilesbuilder` folder with:
|
|
||||||
```
|
|
||||||
cd tools/webfilesbuilder
|
|
||||||
npm ci
|
|
||||||
```
|
|
||||||
- Check you can build the web files by typing `node node_modules/gulp/bin/gulp.js` from the `webfilesbuilder` folder.
|
|
||||||
- Finally use the build targets in PlatformIO's to build & upload.
|
|
||||||
|
|
||||||
If you seeing fatal errors in the npm install and came from an earlier build then you'll may need to refresh the library, like
|
|
||||||
1. Remove the local `node_modules`
|
|
||||||
2. Clean npm cache by `npm cache verify`
|
|
||||||
3. Update the global npm by `sudo npm ci -g npm`
|
|
||||||
4. Reinstall the local `node_modules` by `npm ci`
|
|
||||||
|
|
||||||
### Using Linux CLI
|
|
||||||
|
|
||||||
- Install python:
|
|
||||||
```sh
|
|
||||||
sudo apt install python-pip
|
|
||||||
```
|
|
||||||
- Install PlatformIO (see https://docs.platformio.org/en/latest/installation.html):
|
|
||||||
```sh
|
|
||||||
python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/develop/scripts/get-platformio.py)"
|
|
||||||
```
|
|
||||||
- Edit `~/.profile` and add: `export PATH=$PATH:~/.platformio/penv/bin` to the end, then `exit`, and start a new shell
|
|
||||||
- Update platformio and its libraries
|
|
||||||
```sh
|
|
||||||
platformio platform update
|
|
||||||
platformio lib update
|
|
||||||
```
|
|
||||||
- Grab the EMS-ESP source code:
|
|
||||||
```sh
|
|
||||||
git clone https://github.com/proddy/EMS-ESP.git
|
|
||||||
```
|
|
||||||
(use `git clone --branch=dev https://github.com/proddy/EMS-ESP.git` for dev builds)
|
|
||||||
- Install NodeJS. See instructions [here](https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/).
|
|
||||||
- Install the EMS-ESP's web builder components
|
|
||||||
```sh
|
|
||||||
cd EMS-ESP/tools/webfilesbuilder
|
|
||||||
npm ci
|
|
||||||
cd ../..
|
|
||||||
```
|
|
||||||
- Build the firmware image:
|
|
||||||
```sh
|
|
||||||
pio run
|
|
||||||
```
|
|
||||||
- Upload to firmware image. This uses OTA as default. Change `platformio.ini` if using USB
|
|
||||||
```sh
|
|
||||||
pio run -t upload
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
Here is a prototype board you can build yourself on a breadboard for testing.
|
|
||||||
|
|
||||||
The breadboard layout was done using [DIY Layout Creator](https://github.com/bancika/diy-layout-creator) and sources files are included in this repo.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
The schematic used:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
*Optionally I've also added 2 0.5A/72V polyfuses between the EMS and the two inductors L1 and L2 for extra protection.*
|
|
||||||
|
|
||||||
**Powering The EMS Circuit**
|
|
||||||
|
|
||||||
The EMS circuit will work with both 3.3V and 5V. It's easiest though to power directly from the ESP8266's 3V3 line and run a steady 5V into the microcontroller. Powering the ESP8266 microcontroller can be either:
|
|
||||||
|
|
||||||
- via the USB if your dev board has one
|
|
||||||
- using an external 5V power supply into the 5V vin on the board
|
|
||||||
- powering from the 3.5mm service jack (stereo jack) on the boiler. This will give you 8V so you need a buck converter (like a [Pololu D24C22F5](https://www.pololu.com/product/2858)) to step this down to 5V to provide enough power to the ESP8266 (250mA at least)
|
|
||||||
- powering direct from the EMS line, which is 15V DC and using a buck converter as described above.
|
|
||||||
|
|
||||||
**With Power Circuit**
|
|
||||||
|
|
||||||
 |
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
|
|
||||||
## Hooking up the interface board
|
|
||||||
|
|
||||||
If you have an EMS Gateway board then follow the instructions on [BBQKees' wiki](https://bbqkees-electronics.nl/wiki/).
|
|
||||||
|
|
||||||
Things to check:
|
|
||||||
|
|
||||||
1. Any external Dallas temperature sensors go to D1
|
|
||||||
2. An external LED goes to D5
|
|
||||||
3. Check the EMS bus lines are connected the right way:
|
|
||||||
|
|
||||||
| EMS board | ESP8266 dev board |
|
|
||||||
| ----------|------------------ |
|
|
||||||
| Ground/G/J2| GND/G |
|
|
||||||
| Rx/J2 | D7/GPIO13 * |
|
|
||||||
| Tx/J2 | D8/GPIO15 *|
|
|
||||||
| VC/J2 | 3v3 |
|
|
||||||
|
|
||||||
\* Note the firmware purposely switches the UART0 from the standard GPIOs (Rx 1 and Tx 3) to pins 13 and 15 to prevent Serial traffic (e.g. via a USB connection) interfere with the EMS line. See [the official document](https://arduino-esp8266.readthedocs.io/en/latest/reference.html#serial).
|
|
||||||
|
|
||||||
## Adjusting the config settings
|
|
||||||
|
|
||||||
When the EMS-ESP is running for the first time it's likely to be Access Point mode with a SSID called ems-esp and IP of 192.168.4.1. Use a phone/pc/laptop and connect to AP's SSID. Then either use Telnet (port 23) to IP address 192.168.4.1 or type in this IP address in a web browser.
|
|
||||||
|
|
||||||
When using the web the default password is **admin**.
|
|
||||||
|
|
||||||
The first thing you probably want to do is set the wifi mode to Client and set the SSID and password dor your own network. Then restart the EMS-ESP device. If everything is working the software should detect the devices on the EMS bus and the LED should light up a solid blue. If not, use the Telnet to look any error messages.
|
|
||||||
|
|
||||||
The rest of the settings can be entered either via the Telnet interface (via `set`) or the web interface. The next settings you may want to change are the MQTT, `tx_mode` and `publish_time`.
|
|
||||||
|
|
||||||
## Adding external Temperature sensors
|
|
||||||
|
|
||||||
The code supports auto-detection of Dallas type temperature sensors. The default GPIO pin used on the ESP8266 is D5 but this can be configured in the setting menu (`set dallas_gpio`) or via the web. The Dallas chips DS1822, DS18S20, DS18B20, DS1825 are supported including their parasite varieties and can be daisy-chained on one line. If you're using parasite make sure you set this using 'set dallas_parasite on'.
|
|
||||||
|
|
||||||
The values will be shown in the telnet session (`info`) and if MQTT is enabled sent as a single topic. See [MQTT](https://github.com/proddy/EMS-ESP/wiki/MQTT).
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Any contribution helps make EMS-ESP better.
|
|
||||||
|
|
||||||
This project needs:
|
|
||||||
- guides for integrating into home automation systems like Home Assistant and Domoticz
|
|
||||||
- testing with various types of EMS devices (boilers, thermostats, solar, heap pumps etc) to build up our supported database
|
|
||||||
- Expand this wiki with more details, fixing spelling mistakes and other inaccuracies you may find
|
|
||||||
|
|
||||||
## Editing articles
|
|
||||||
!> Warning: You need a GitHub user account to be able to edit!
|
|
||||||
|
|
||||||
If you spot an error in an article use the *Improve this article* link at the top of the page to correct it. Note you will need a GitHub account. Make the change, click on "Propose file change" and "Create pull request".
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
> [!NOTE]
|
|
||||||
> This page is a collection of findings to figure out how the EMS+ / EMS 2.0 protocol works.
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
```
|
|
||||||
sr = source ID
|
|
||||||
de = destination ID (read commands have the 8th bit set)
|
|
||||||
e+ = EMS flag (>0xF0)
|
|
||||||
of = offset
|
|
||||||
TYPE = Type ID
|
|
||||||
DATA = data block
|
|
||||||
|
|
||||||
if 3rd byte = FF
|
|
||||||
|
|
||||||
sr de FF of TYPE DATA
|
|
||||||
-- -- -- -- ---- ----------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
48 10 FF 0A 01B9 28 (write 1 byte, offset 0A, type 01B9, value 28 = 20.0 deg)
|
|
||||||
48 10 FF 0A 01B9 29 (write 1 byte, offset 0A, type 01B9, value 29 = 20.5 deg)
|
|
||||||
48 10 FF 00 01B9 FF (write 1 byte, type 01B9, value FF)
|
|
||||||
|
|
||||||
48 90 FF 25 0101 (read byte 25 from 0101)
|
|
||||||
|
|
||||||
10 48 FF 25 01A8 (no data. an acknowledgment)
|
|
||||||
|
|
||||||
48 90 FF 1B 0201 A8 (why does a read have a value?)
|
|
||||||
10 48 FF 1B 01A8 (why no data. an acknowledgment?)
|
|
||||||
|
|
||||||
09 B0 FF 00 FF00 01 (type FF00?)
|
|
||||||
|
|
||||||
|
|
||||||
broadcast messages (where de = 00):
|
|
||||||
|
|
||||||
sr 00 FF of TYPE DATA
|
|
||||||
-- -- -- -- ---- ----------------------------------------------------------------------------------
|
|
||||||
10 00 FF 00 01B9 FF
|
|
||||||
10 00 FF 12 01B9 00
|
|
||||||
10 00 FF 08 01A5 01 99
|
|
||||||
10 00 FF 0A 01A5 01
|
|
||||||
10 00 FF 19 01A5 06 04 00 00 00 00 FF 64 37 00 3C 01 FF 01
|
|
||||||
10 00 FF 00 01A5 80 00 01 30 28 00 30 28 01 54 03 03 01 01 54 02 A8 00 00 11 01 03 FF FF 00
|
|
||||||
10 00 FF 00 01A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00
|
|
||||||
30 00 FF 00 0262 01 FB 01 9E 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 2B (SM100)
|
|
||||||
30 00 FF 00 0264 00 00 00 04 00 00 FF 00 00 1E 0C 20 64 00 00 00 00 E9 (SM100)
|
|
||||||
90 00 FF 00 006F 01 01 00 46 00 B9 (FR10)
|
|
||||||
10 00 FF 00 01A5 80 00 01 30 28 00 30 28 01 54 03 03 01 01 54 02 A8 00 00 11 01 03 FF FF 00 (RC310)
|
|
||||||
10 00 FF 00 01A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00 (RC1010)
|
|
||||||
|
|
||||||
30 09 FF 00 0001 (this doesn't look correct)
|
|
||||||
|
|
||||||
if 3rd byte = F9 or F7
|
|
||||||
|
|
||||||
sr de F9 00 no FF TYPE ?? DATA
|
|
||||||
-- -- -- -- -- -- ---- -- ----------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
10 48 F9 00 FF 016C 08 4F 00 00 00 02 00 00 00 02 00 03 00 03 00 03 00 02 (data, type 016C)
|
|
||||||
48 90 F9 00 11 FF 016D 08 (read 17 bytes, type 016D)
|
|
||||||
10 48 F9 00 FF 016D 08 4F 00 00 00 02 00 00 00 02 00 03 00 03 00 03 00 02
|
|
||||||
|
|
||||||
48 90 F9 00 11 FF 019E 00 (read 17 bytes, type 019E)
|
|
||||||
10 48 F9 00 FF 019E 00 4B 00 00 00 01 00 00 00 01 00 1B 00 06 00 1B 00 01
|
|
||||||
10 00 F7 00 FF 01B9 35 19 (broadcast, type 01B9, value 19)
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Based on the original version by @Gert05, @bbqkees created more extensive version based on the Domoticz Python plugins (list at https://www.domoticz.com/wiki/Plugins#Python_Plugins_List). You can find it [here](https://github.com/bbqkees/ems-esp-domoticz-plugin) along with the instructions on how to install.
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
> [!TIP]
|
|
||||||
> Another good source of EMS and EMS+ investigation look at https://github.com/Th3M3/buderus_ems-wiki_
|
|
||||||
|
|
||||||
## A2
|
|
||||||
|
|
||||||
This message is a EMS 1.0 message
|
|
||||||
|
|
||||||
Display code and Cause
|
|
||||||
|
|
||||||
```
|
|
||||||
(00:28:29.966) Thermostat -> all, type 0xA2 telegram: 10 00 A2 00 00 00 00 00 00 (CRC=CA) #data=5
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
| data position (0..n) in decimal | description | format | notes |
|
|
||||||
| - | - | - | - |
|
|
||||||
| 0-2 | Display code | 3 bytes | HEX To Decimal |
|
|
||||||
| 3-4 | Cause Code | 2 bytes | HEX To Decimal |
|
|
||||||
|
|
||||||
## 3E, 48, 52, 5C
|
|
||||||
|
|
||||||
These are EMS1.0 type broadcasted from an RC35 compatible thermostat (typically with a device ID of 0x10) as a Heating Controller Monitor Message. The data block is 16 bytes. We use this telegram to read the current room temperature, the setpoint temperature for up to 4 Heating Controllers 0x3E (HC1), 0x48 (HC2), 0x52 (HC3) and 0x5C (HC4)
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
```
|
|
||||||
< header > < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15> (data block)
|
|
||||||
10 0B 3E 00 00 00 00 7D 00 00 00 00 00 00 00 00 00 11 05 04
|
|
||||||
10 00 48 00 00 00 00 00 E4 00 00 00 00 00 00 00 00 11 05 04
|
|
||||||
10 0B 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00
|
|
||||||
10 0B 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00
|
|
||||||
```
|
|
||||||
in night mode:
|
|
||||||
```
|
|
||||||
10 00 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
10 00 48 00 00 00 10 00 E9 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
```
|
|
||||||
in day mode:
|
|
||||||
```
|
|
||||||
10 0B 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
10 0B 48 00 00 00 10 00 E8 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
```
|
|
||||||
in auto day mode:
|
|
||||||
```
|
|
||||||
10 00 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
10 0B 48 00 04 03 00 00 EB 00 00 00 00 00 00 00 00 11 05 00
|
|
||||||
```
|
|
||||||
|
|
||||||
deciphering each data element from 0 to 15
|
|
||||||
|
|
||||||
| data #n | description | format | notes |
|
|
||||||
| - | - | - | - |
|
|
||||||
| 0 | settings1 | 1 byte as a bit mask | bit 2 is automatic mode, bit 7 is manual mode, bit 5 is holiday mode | doesn't seem to make sense? |
|
|
||||||
| 1 | settings2 | 1 byte as a bit mask | bit 0 if in summer mode, bit 1 if in daytime | needs verifying |
|
|
||||||
| 2 | setpoint room temperature | 1 byte * 2 | |
|
|
||||||
| 3 + 4 | current room temperature | 2 bytes * 10 | has value 0x7D00 if switched off |
|
|
||||||
| 13 | switch state | 1 byte as a bit mask | always 11? |
|
|
||||||
| 14 | calculate setpoint flow temperature | 1 byte | this looks wrong |
|
|
||||||
| 15 | settings3 | 1 byte as a bit mask | we see two values 0 and 4 |
|
|
||||||
|
|
||||||
Questions:
|
|
||||||
|
|
||||||
* how to determine if a heating circuit is not active? Check for data #14 if its 0 ?
|
|
||||||
* when to ignore the setpoint temperature being 0? This depends on the bit masks in data #1 and #2 somehow
|
|
||||||
* data #0 is sometimes 04 (b0100) always with data#1 being 3 (b0011). This means DWH priority is set and daytime mode, according to https://emswiki.thefischer.net/doku.php?id=wiki:ems:telegramme#wwbetriebsart. Is this correct since one of the examples we're in nightmode?
|
|
||||||
|
|
||||||
|
|
||||||
16
docs/FAQ.md
@@ -1,16 +0,0 @@
|
|||||||
### Which ESP microcontrollers are supported?
|
|
||||||
|
|
||||||
The code and circuit have been tested with a few ESP8266 development boards such as the Wemos D1 Mini, Wemos D1 Mini Pro, Nodemcu0.9 and Nodemcu2 dev boards. It will also work on bare ESP8266 chips such as the ESP-12E but do make sure you disabled the LED support and wire the UART correctly as the code doesn't use the normal Rx and Tx pins.
|
|
||||||
|
|
||||||
### Which EMS devices are currently supported?
|
|
||||||
|
|
||||||
[See here](Supported-EMS-Devices.md) for the list.
|
|
||||||
|
|
||||||
### Getting support
|
|
||||||
|
|
||||||
If you can't find the answer here check out:
|
|
||||||
|
|
||||||
* [Issues](https://github.com/proddy/EMS-ESP/issues?utf8=%E2%9C%93&q=is%3Aissue): this is the most active channel at the moment, you might find an answer to your question by searching open or closed issues.
|
|
||||||
* [Wiki pages](https://github.com/proddy/EMS-ESP/wiki): I try and keep this up to date
|
|
||||||
* [Gitter channel](https://gitter.im/EMS-ESP/): get direct contact with some of the key developers behind the project and other users.
|
|
||||||
* [Post a question](https://github.com/proddy/EMS-ESP/issues/new/choose): as a last resort, you can open new *question* issue on GitHub.
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
The files to read MQTT and parse as sensors and thermostat components into HA can be found [here](integrations/homeassistant/ha) along with a LoveLace dashboard which looks like:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
and the alerts on an iOS/Android device using PushBullet, PushOver or any notification service would look like:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Supporting multiple thermostat heating circuits
|
|
||||||
|
|
||||||
Create a component for each, using the HC number appended to the end of the topics. For example
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- platform: mqtt
|
|
||||||
name: Thermostat HC2
|
|
||||||
modes:
|
|
||||||
- "auto"
|
|
||||||
- "heat"
|
|
||||||
- "off"
|
|
||||||
mode_command_topic: "home/ems-esp/thermostat_cmd_mode2"
|
|
||||||
temperature_command_topic: "home/ems-esp/thermostat_cmd_temp2"
|
|
||||||
|
|
||||||
mode_state_topic: "home/ems-esp/thermostat_data"
|
|
||||||
current_temperature_topic: "home/ems-esp/thermostat_data"
|
|
||||||
temperature_state_topic: "home/ems-esp/thermostat_data"
|
|
||||||
|
|
||||||
mode_state_template: "{% if value_json.hc2.mode == 'manual' %} heat {% else %} {{value_json.hc2.mode}} {% endif %}"
|
|
||||||
|
|
||||||
current_temperature_template: "{{ value_json.hc2.currtemp }}"
|
|
||||||
temperature_state_template: "{{ value_json.hc2.seltemp }}"
|
|
||||||
|
|
||||||
temp_step: 0.5
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sending out a heartbeat
|
|
||||||
|
|
||||||
Thanks to @S-Przybylski for these additions.
|
|
||||||
|
|
||||||
`sensors.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
###################################################
|
|
||||||
# EMS-ESP Statistics - heartbeat
|
|
||||||
###################################################
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_wifi'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.rssid }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_load'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.load }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_freemem'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.freemem }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_uptime'
|
|
||||||
unit_of_measurement: 's'
|
|
||||||
value_template: '{{ value_json.uptime }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_version'
|
|
||||||
value_template: '{{ value_json.version }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/heartbeat'
|
|
||||||
name: 'ems_esp_mqtt_disconnects'
|
|
||||||
value_template: '{{ value_json.MQTTdisconnects }}'
|
|
||||||
qos: 1
|
|
||||||
availability_topic: 'home/ems-esp/status'
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
```
|
|
||||||
|
|
||||||
and in `customize.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
sensor.ems_esp_wifi:
|
|
||||||
icon: mdi:wifi
|
|
||||||
friendly_name: 'Wifi strength'
|
|
||||||
|
|
||||||
sensor.ems_esp_load:
|
|
||||||
icon: mdi:chart-line
|
|
||||||
friendly_name: 'System load'
|
|
||||||
|
|
||||||
sensor.ems_esp_freemem:
|
|
||||||
icon: mdi:memory
|
|
||||||
friendly_name: 'Free Memory'
|
|
||||||
|
|
||||||
sensor.ems_esp_uptime:
|
|
||||||
icon: mdi:update
|
|
||||||
friendly_name: 'Uptime'
|
|
||||||
|
|
||||||
sensor.ems_esp_version:
|
|
||||||
icon: mdi:mini-sd
|
|
||||||
friendly_name: 'Firmare Version'
|
|
||||||
|
|
||||||
sensor.ems_esp_mqtt_disconnects:
|
|
||||||
icon: mdi:chart-line
|
|
||||||
friendly_name: 'MQTT disconnects'
|
|
||||||
```
|
|
||||||
|
|
||||||
## Activating one-time hot water charging DHW once (OneTimeWater)
|
|
||||||
|
|
||||||
switch.yaml
|
|
||||||
```yaml
|
|
||||||
one_time_water:
|
|
||||||
friendly_name: OneTimeWater
|
|
||||||
value_template: "{{ is_state('sensor.one_time_water', 'on') }}"
|
|
||||||
turn_on:
|
|
||||||
service: script.turn_on
|
|
||||||
entity_id: script.one_time_water_on
|
|
||||||
turn_off:
|
|
||||||
service: script.turn_on
|
|
||||||
entity_id: script.one_time_water_off
|
|
||||||
```
|
|
||||||
|
|
||||||
scripts.yaml
|
|
||||||
```yaml
|
|
||||||
one_time_water_on:
|
|
||||||
sequence:
|
|
||||||
- service: mqtt.publish
|
|
||||||
data_template:
|
|
||||||
topic: 'home/ems-esp/boiler_cmd_wwonetime'
|
|
||||||
payload: '1'
|
|
||||||
|
|
||||||
one_time_water_off:
|
|
||||||
sequence:
|
|
||||||
- service: mqtt.publish
|
|
||||||
data_template:
|
|
||||||
topic: 'home/ems-esp/boiler_cmd_wwonetime'
|
|
||||||
payload: '0'
|
|
||||||
```
|
|
||||||
|
|
||||||
sensors.yaml
|
|
||||||
```yaml
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'one_time_water'
|
|
||||||
value_template: '{{ value_json.wWOnetime }}'
|
|
||||||
```
|
|
||||||
61
docs/Home.md
@@ -1,61 +0,0 @@
|
|||||||
<img style="margin: 10px 10px; float:right; width:20%" src="_media/boiler.svg" alt="EMS-ESP Logo"></img>
|
|
||||||
|
|
||||||
[](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
|
|
||||||
[](https://github.com/proddy/EMS-ESP/commits/master)
|
|
||||||
[](LICENSE)
|
|
||||||
[](https://travis-ci.com/proddy/EMS-ESP)
|
|
||||||
[](https://app.codacy.com/app/proddy/EMS-ESP?utm_source=github.com&utm_medium=referral&utm_content=proddy/EMS-ESP&utm_campaign=Badge_Grade_Settings)
|
|
||||||
[](https://github.com/proddy/EMS-ESP/releases)
|
|
||||||
|
|
||||||
**EMS-ESP** is a project to build an electronic controller circuit using an Espressif ESP8266 microcontroller to communicate with EMS (Energy Management System) based Boilers and Thermostats from the Bosch range and compatibles such as Buderus, Nefit, Junkers etc.
|
|
||||||
|
|
||||||
Currently [this is the list](Supported-EMS-Devices) of EMS heating devices that have been tested.
|
|
||||||
|
|
||||||
### What's New?
|
|
||||||
|
|
||||||
<!-- tabs:start -->
|
|
||||||
|
|
||||||
#### **Version 1.9.5 beta**
|
|
||||||
**January 6 2020**
|
|
||||||
|
|
||||||
Happy new year everyone! 1.9.5 has been in development for a while now but it's almost ready with a few new features and many bug fixes and improvements such as:
|
|
||||||
|
|
||||||
- Changing heating settings on Junkers thermostats
|
|
||||||
- Supporting multiple thermostat heat controllers
|
|
||||||
- MM10 Mixer support
|
|
||||||
- SM200 Solar module support
|
|
||||||
|
|
||||||
Thanks to everyone for providing feedback.
|
|
||||||
|
|
||||||
Also make sure you check out the full [ChangeLog](https://github.com/proddy/EMS-ESP/blob/dev/CHANGELOG.md).
|
|
||||||
|
|
||||||
Paul.
|
|
||||||
|
|
||||||
#### **Version 2.0**
|
|
||||||
**January 6 2020**
|
|
||||||
|
|
||||||
The next major version is in the works. Here are some of the changes:
|
|
||||||
- A re-write of the Web interface. Websocket authentication was problematic in many browsers. The new version moves to a cleaner React and TypeScript
|
|
||||||
- Tighter security in the Web and Telnet, using SSL/TLS and tokens.
|
|
||||||
- Improved Telnet console with different levels of admin control and multi-client.
|
|
||||||
- Refactoring the code to make it easier to read, using more C++11 features now in the Arduino core libraries
|
|
||||||
|
|
||||||
<!-- tabs:end -->
|
|
||||||
|
|
||||||
### Community Support
|
|
||||||
Go to [Gitter](https://gitter.im/EMS-ESP/community) for quick feedback, questions and troubleshooting.
|
|
||||||
|
|
||||||
### Acknowledgments
|
|
||||||
|
|
||||||
Kudos out to the following people who have open-sourced their work and helped me build this project:
|
|
||||||
|
|
||||||
**susisstrolch** - One of the first working versions of the EMS bridge circuit I found designed for specifically for the ESP8266. I borrowed Juergen's [schematic](https://github.com/susisstrolch/EMS-ESP12) and parts of his code ideas for reading telegrams.
|
|
||||||
|
|
||||||
**bbqkees** - Kees built a small SMD commercial grade circuit board which is available for purchase on his [website](https://bbqkees-electronics.nl/).
|
|
||||||
|
|
||||||
**EMS Wiki** - A comprehensive [reference](https://emswiki.thefischer.net/doku.php?id=wiki:ems:telegramme) (in German) for the EMS bus which is a little outdated, not always 100% accurate and sadly no longer maintained.
|
|
||||||
|
|
||||||
|
|
||||||
## DISCLAIMER
|
|
||||||
|
|
||||||
!> This code and libraries were developed from information gathered on the internet and many hours of reverse engineering the communications between the EMS bus and thermostats. It is **not** based on any official documentation or supported libraries from Buderus/Junkers/Nefit (and associated companies) and therefore there are no guarantees whatsoever regarding the safety of your devices and/or their settings, or the accuracy of the information provided.
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
## The main source files
|
|
||||||
|
|
||||||
`emsuart.cpp` handles the low level UART read and write logic to the bus. You shouldn't need to touch this. All receive commands from the EMS bus are handled asynchronously using a circular buffer via an interrupt. A separate function processes the buffer and extracts the telegrams.
|
|
||||||
|
|
||||||
`ems.cpp` is the logic to read the EMS data packets (telegrams), validates them and process them based on the type.
|
|
||||||
|
|
||||||
`ems-esp.cpp` is the Arduino code for the ESP8266 that kicks it all off. This is where we have specific logic such as the code to monitor and alert on the Shower timer and light up the LEDs.
|
|
||||||
|
|
||||||
`my_config.h` has all the custom settings tailored to your environment. Specific values here are also stored in the ESP's SPIFFs (File system).
|
|
||||||
|
|
||||||
`ems_devices.h` has all the configuration for the known EMS devices currently supported.
|
|
||||||
|
|
||||||
`MyESP.cpp` is my custom library to handle WiFi, MQTT and Telnet. Uses a modified version of [TelnetSpy](https://github.com/yasheena/telnetspy).
|
|
||||||
|
|
||||||
`ds18.*` are the Dallas libraries for any external temperature sensors.
|
|
||||||
|
|
||||||
## How the shower logic works
|
|
||||||
|
|
||||||
Checking whether the shower is running is tricky. We know when the warm water is on and being heated but need to distinguish between the central heating, shower, hot tap and even a bath tap. So this code is a little experimental.
|
|
||||||
|
|
||||||
There is other logic in the code to compensate for water heating up to shower temperature and whether the shower is turned off and back on again quickly within a 10 second window.
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
Packages are streamed to the EMS "bus" from any other compatible connected device via serial TTL transmission using protocol 9600 baud, 8N1 (8 bytes, no parity, 1 stop bit). Each package is terminated with a break signal `<BRK>`, a 11-bit long low signal of zeros.
|
|
||||||
|
|
||||||
A package can be a single byte (see Polling below) or a string of 6 or more bytes making up an actual data telegram. A telegram for the EMS 1.0 is always in the format:
|
|
||||||
|
|
||||||
``[src] [dest] [type] [offset] [data] [crc] <BRK>``
|
|
||||||
|
|
||||||
The first 4 bytes is referenced as the *header* in this document.
|
|
||||||
|
|
||||||
### EMS IDs
|
|
||||||
|
|
||||||
Each device has a unique ID.
|
|
||||||
|
|
||||||
In this example a UBA boiler has an ID of 0x08 (such as a MC10) and also referred to as the Bus Master.
|
|
||||||
|
|
||||||
The circuit acts as a service key and thus uses an ID 0x0B. This ID is reserved for special devices intended for service engineers.
|
|
||||||
|
|
||||||
### EMS Polling
|
|
||||||
|
|
||||||
The bus master (boiler) sends out a poll request every second by sending out a sequential list of all possible IDs as a single byte followed by the break signal. The ID always has its high 8th bit (MSB) set so in the code we're looking for 1 byte messages matching the format `[dest|0x80] <BRK>`.
|
|
||||||
|
|
||||||
Any connected device can respond to a Polling request with an acknowledgement by sending back a single byte with its own ID. In our case we would listen for a `[0x8B] <BRK>` (meaning us) and then send back `[0x0B] <BRK>` to say we're alive and ready.
|
|
||||||
|
|
||||||
Polling is also the trigger to start transmitting any packages queued for sending. It must be done within 200ms or the bus master will time out.
|
|
||||||
|
|
||||||
### EMS Broadcasting
|
|
||||||
|
|
||||||
When a device is broadcasting to everyone there is no specific destination needed. `[dest]` is always 0x00.
|
|
||||||
|
|
||||||
The tables below shows which types are broadcasted regularly by the boiler (in this case ID 0x08) and thermostat (ID 0x17). The **data length** is excluding the 4 byte header and CRC and the **Name** references those in the German [ems wiki](https://emswiki.thefischer.net/doku.php?id=wiki:ems:telegramme).
|
|
||||||
|
|
||||||
| Source (ID) | Type ID | Name | Description | Data length | Frequency |
|
|
||||||
| ------------- | ------- | ------------------- | -------------------------------------- | ----------- | ---------- |
|
|
||||||
| Boiler (0x08) | 0x34 | UBAMonitorWWMessage | warm water temperature | 19 bytes | 10 seconds |
|
|
||||||
| Boiler (0x08) | 0x18 | UBAMonitorFast | boiler temps, power, gas/pump switches | 25 bytes | 10 seconds |
|
|
||||||
| Boiler (0x08) | 0x19 | UBAMonitorSlow | boiler temp and timings | 22 bytes | 60 seconds |
|
|
||||||
| Boiler (0x08) | 0x1C | UBAWartungsmelding | maintenance messages | 27 bytes | 60 seconds |
|
|
||||||
| Boiler (0x08) | 0x2A | n/a | status, specific to boiler type | 21 bytes | 10 seconds |
|
|
||||||
| Boiler (0x08) | 0x07 | n/a | ? | 21 bytes | 30 seconds |
|
|
||||||
|
|
||||||
| Source (ID) | Type ID | Name | Description | Frequency |
|
|
||||||
| ----------------- | ------- | ----------------- | --------------------------------------------------- | ---------- |
|
|
||||||
| Thermostat (0x17) | 0x06 | RCTime | returns time and date on the thermostat | 60 seconds |
|
|
||||||
| Thermostat (0x17) | 0x91 | RC30StatusMessage | returns current and set temperatures | 60 seconds |
|
|
||||||
| Thermostat (0x17) | 0xA3 | RCTempMessage | returns temp values from external (outdoor) sensors | 60 seconds |
|
|
||||||
|
|
||||||
Refer to the code in `ems.cpp` for further explanation on how to parse these message types and also reference the EMS Wiki.
|
|
||||||
|
|
||||||
### EMS Reading and Writing
|
|
||||||
|
|
||||||
Telegrams can only be sent after the Master (boiler) sends a poll to the receiving device. The response can be a read command to request data or a write command to send data. At the end of the transmission a poll response is sent from the client (`<ID> <BRK>`) to say we're all done and free up the bus for other clients.
|
|
||||||
|
|
||||||
When executing a request to read data the `[src]` is our device `(0x0B)` and the `[dest]` must have has it's MSB (8th bit) set. Say we were requesting data from the thermostat we would use `[dest] = 0x97` since RC20 has an ID of 0x17.
|
|
||||||
|
|
||||||
Following a write request, the `[dest]` doesn't have the 8th bit set and after this write request the destination device will send either a single byte 0x01 for success or 0x04 for failure.
|
|
||||||
|
|
||||||
Every telegram sent is echo'd back to Rx, along the same Bus used for all Rx/Tx transmissions.
|
|
||||||
|
|
||||||
### Special EMS Types
|
|
||||||
|
|
||||||
`ems.cpp` defines callback functions that handle all the broadcast types listed above (e.g. 0x34, 0x18, 0x19 etc) plus these extra types:
|
|
||||||
|
|
||||||
| Source (ID) | Type ID | Name | Description |
|
|
||||||
| ------------- | ------- | ----------------------------- | ---------------------------------------- |
|
|
||||||
| Boiler (0x08) | 0x33 | UBAParameterWW | reads selected & desired warm water temp |
|
|
||||||
| Boiler (0x08) | 0x14 | UBATotalUptimeMessage | |
|
|
||||||
| Boiler (0x08) | 0x15 | UBAMaintenanceSettingsMessage | |
|
|
||||||
| Boiler (0x08) | 0x16 | UBAParametersMessage | |
|
|
||||||
|
|
||||||
In `ems.cpp` you can add scheduled calls to specific EMS types in the functions `ems_getThermostatValues()` and `ems_getBoilerValues()`.
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
The various types from newer EMS+ controllers like the MC110 found in GB122/125's.
|
|
||||||
|
|
||||||
Byte 1 is the 1st byte of the data block (which is the 5th byte of the telegram for EMS 1.0 for example).
|
|
||||||
|
|
||||||
Bit 0 is the first byte (so value & 0x01)
|
|
||||||
|
|
||||||
This information was compiled with most if it coming from https://github.com/Th3M3/buderus_ems-wiki. Kudos to @Th3M3 for collecting this.
|
|
||||||
|
|
||||||
## 0xD1: UBAOutdoorTemp
|
|
||||||
|
|
||||||
Sent every minute. The first 2 bytes is a short value * 10
|
|
||||||
|
|
||||||
```
|
|
||||||
1 - 2 = outdoor temp, short value * 10
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0x14: UBABetriebszeit
|
|
||||||
|
|
||||||
```
|
|
||||||
1 - 2 = total operating time in minutes
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0xBF: UBAErrorMessage
|
|
||||||
|
|
||||||
Sent every 10 minutes
|
|
||||||
|
|
||||||
```
|
|
||||||
1 = 0x08
|
|
||||||
2 = Model ID, 0x85 for MC110/GB125, 0xEA for GB122
|
|
||||||
3 = blocking error: always 0x0A (fault class, see service manual)
|
|
||||||
4 = blocking error: 0x00 or 0x10 = interlocking error, 0x11 = blocking error, 0x12 = system error, 0x13 = reset system error
|
|
||||||
5 = ASCII | Fault code 0. character (possibly 0x0a = space)
|
|
||||||
6 = ASCII | Fault code (operation code) 1st character
|
|
||||||
7 = ASCII | Fault code (operation code) 2nd character
|
|
||||||
8 - 9 = additional code (status code)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0xE3: UBA??
|
|
||||||
|
|
||||||
Sent every 10 seconds
|
|
||||||
|
|
||||||
```
|
|
||||||
3 = heat request. is 1 if byte 1/bit 1 is set, otherwise 0
|
|
||||||
6 = bit 1 for warming water yes/no
|
|
||||||
12 - 17 = boiler actual temperature * 10 C
|
|
||||||
14 = Burner capacity-actual in %
|
|
||||||
15 = Always 0x64 (100%)
|
|
||||||
16 = Boiler max. temperature in C
|
|
||||||
19 = %, is 0x64 (100%) if byte 1/bit 1 is set to 1. Otherwise 0.
|
|
||||||
20 = Cool set temperature for DHW preparation in C
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0xE4: UBAMonitorFast
|
|
||||||
|
|
||||||
Sent every 3 seconds
|
|
||||||
|
|
||||||
```
|
|
||||||
3 = operation code 1st character
|
|
||||||
4 = operation code 2nd character
|
|
||||||
5 - 6 = status code, as numerical value
|
|
||||||
7 = boiler set temp/heater temp in C
|
|
||||||
8 - 9 = actual boiler temp * 10
|
|
||||||
10 = 0x64 (= 100%) in heating mode, 0x00 in DHW preparation, as %
|
|
||||||
11 = Burner capacity/power actual as %
|
|
||||||
12 = bit 0 = flame yes/no, bit 1 = day yes/no, bit 2 = WW prep yes/no
|
|
||||||
20 - 21 = flame current * 10 in uA
|
|
||||||
24 - 25 = same as bytes 8-9
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0xE5: UBAMonitorSlow
|
|
||||||
|
|
||||||
Sent every 60 seconds
|
|
||||||
|
|
||||||
```
|
|
||||||
3 =
|
|
||||||
bit 0 = fuel valve 1 open
|
|
||||||
bit 1 = fuel valve 2 open
|
|
||||||
bit 2 = blower on
|
|
||||||
bit 3 = ignition on
|
|
||||||
bit 4 = oil preheater on
|
|
||||||
bit 5 = boiler circuit pump on
|
|
||||||
bit 6 = 3-way valve on WW
|
|
||||||
bit 7 = circulating pump on
|
|
||||||
9 = bit 0 = fire control started
|
|
||||||
11 - 13 = total burner starts
|
|
||||||
14 - 16 = burner operating hours
|
|
||||||
17 - 19 = burner level 2 operating hours
|
|
||||||
20 - 22 = Burner operating hours due to heating demand (excluding DHW preparation)
|
|
||||||
23 - 25 = Burner starting by heat demand (excluding WW-preparation)
|
|
||||||
26 = Heating circuit pump modulation %
|
|
||||||
```
|
|
||||||
|
|
||||||
## Type 0xE9: DHW status
|
|
||||||
|
|
||||||
Sent every 10 seconds
|
|
||||||
|
|
||||||
```
|
|
||||||
1 = DHW setpoint (with setpoint = "off": 0x0A = 10 ° C)
|
|
||||||
2 - 3 = hot water actual value * 10
|
|
||||||
4 - 5 = hot water actual value * 10
|
|
||||||
10 = setpoint thermal disinfection
|
|
||||||
11 = setpoint daily heating temperature
|
|
||||||
13 =
|
|
||||||
bit 0 : DHW preparation activated by automatic program
|
|
||||||
bit 2 : DHW preparation activated by one-time charge
|
|
||||||
bit 3 : DHW preparation activated by thermal disinfection
|
|
||||||
bit 4 : DHW preparation active (always 1 if bit 0, 2 or 3 also 1)
|
|
||||||
14 =
|
|
||||||
bit 0 : Circulation day mode (or by single charge / th. disinfection activated)
|
|
||||||
bit 2 : circulating pump on
|
|
||||||
bit 4 : WW-preparation (when switching to daytime operation sometimes short 0, then again 1)
|
|
||||||
bit 5 : WW preparation
|
|
||||||
15 - 17 = Warmwater preparations
|
|
||||||
18 - 20 = # hours water heating
|
|
||||||
21 = Warming water (0x64 = 100%)
|
|
||||||
24 = Set value of time program (if set = "off": 0x00)
|
|
||||||
26 = same as byte 1, in C
|
|
||||||
```
|
|
||||||
|
|
||||||
## 0x07E4: UBA Status
|
|
||||||
|
|
||||||
Sent every 10 seconds
|
|
||||||
|
|
||||||
```
|
|
||||||
6 = operation code 1st character
|
|
||||||
7 = operation code 2nd character
|
|
||||||
10 = Boiler setpoint temperature during heating operation (0x00 with DHW preparation)
|
|
||||||
11 = 0x64 (= 100%) in heating mode, 0x00 in DHW preparation or when night
|
|
||||||
12 = Boiler setpoint temperature during DHW preparation (0x00 during heating operation or when night)
|
|
||||||
```
|
|
||||||
94
docs/MQTT.md
@@ -1,94 +0,0 @@
|
|||||||
## MQTT configuration options
|
|
||||||
|
|
||||||
#### QOS
|
|
||||||
The QOS (Quality Of Service) is configurable within telnet (`mqtt_qos`) and WebUI. Valid options are At most once (0) At least once (1) and Exactly once (2). The default is 0.
|
|
||||||
|
|
||||||
#### Keep Alive
|
|
||||||
Likewise the Keep Alive (`mqtt_keepalive`) can be set. Keep alive ensures that the connection between the broker and client is still open and that the broker and the client are aware of being connected. This value is the number of seconds before giving up on a response and default set to 60 (1 minute). The lower the number the more WiFi traffic but greater the stability.
|
|
||||||
|
|
||||||
#### Retain
|
|
||||||
`mqtt_retain` sets the MQTT retain flag for all published messages on the broker. It's set to off as default.
|
|
||||||
|
|
||||||
[HiveMQ](https://www.hivemq.com/tags/mqtt-essentials/) has a good explanation of MQTT.
|
|
||||||
|
|
||||||
## MQTT topics
|
|
||||||
|
|
||||||
*all* topics are prefixed with `[base]`/[`host name`]/ where both `base` and `host name` are configurable in the Web UI. The default is `home/ems-esp/`.
|
|
||||||
|
|
||||||
If you want to configure the topic names, these can be changed in the file `src/my_config.h`.
|
|
||||||
|
|
||||||
## Publishing Topics
|
|
||||||
|
|
||||||
All the key information from each of the EMS devices connected (Boilers, Thermostats, Solar Modules etc) are sent periodically on a single MQTT topic. The frequency of these publishes can be adjusted by the `publish_time` parameter which is set to 2 minutes (120 seconds) as default.
|
|
||||||
|
|
||||||
If the data in the payload has not changed since the last publish, it is ignored. Although from version 1.9.4 this can also be configured with the `publish_always` command and WebUI parameter. For example `set publish_always on` will always publish MQTT topics regardless if any of the data parameters have changed.
|
|
||||||
|
|
||||||
The table below shows examples of the topics being published:
|
|
||||||
|
|
||||||
| Topic | Description | Payload Example |
|
|
||||||
| ------------------- | ------------------- | --------------- |
|
|
||||||
| `sensors` | temperature readings from any external Dallas sensors attached to the ESP | `{"temp_1":"20.18","temp_2":"40.81"}` |
|
|
||||||
| `start` | this is the MQTT will and testament messages | `online` or `offline` |
|
|
||||||
| `heartbeat` | if enabled send out key system stats in JSON | `{"version":"1.9.3b3","IP":"10.10.10.198","rssid":68,"load":100,"uptime":4,"freemem":68,"MQTTdisconnects":0}` |
|
|
||||||
| `tapwater_active` | individual message if using a boolean sensor to show if hot tap water is running | `0` or `1` |
|
|
||||||
| `heating_active` | individual message if using a boolean sensor to show if heating is on | `0` or `1` |
|
|
||||||
| `boiler_data` | all the key data from the Boiler device | `{"wWComfort":"Hot","wWSelTemp":54,....` (see the example in the Monitoring MQTT section below) |
|
|
||||||
| `thermostat_data` | data from each of the Thermometer's Heating Circuits. Default HC is 1. The data sent depends on the model. | `{ "hc1":{"seltemp":15,"currtemp":20.6,"mode":"auto"}, "hc2":{"seltemp":8,"currtemp":18.2,"mode":"off"} }` |
|
|
||||||
| `mixing_data` | data from The Mixing Module for each of the Thermometer's Heating Circuits. | `{"hc1":{"flowTemp":55,"pumpMod":"1","valveStatus":"1"}}` |
|
|
||||||
| `shower_data` | the shower timer and alert toggles plus the duration of the last shower taken | `{"timer":"0","alert":"0","duration":"4 minutes 32 seconds"}` |
|
|
||||||
| `sm_data` | all data from the Solar Module (if connected) | JSON with `collectortemp` `bottomtemp` `pumpmodulation` `pump` `energylasthour` `energytoday` `energytotal` `pumpWorkMin` |
|
|
||||||
| `hp_data` | all data from the Heat Pump (if connected) | `{"pumpmodulation":"1", "pumpspeed": 20}` |
|
|
||||||
|
|
||||||
## Receiving Topics
|
|
||||||
|
|
||||||
EMS-ESP subscribes to the following topics used to send commands to the device:
|
|
||||||
|
|
||||||
| Topic | Description | Payload Format | Example |
|
|
||||||
| ------------------- | ------------------- | -------------- | ------- |
|
|
||||||
| `start` | this is the MQTT will and testament messages back from the broker | `online` or `offline` | `offline` |
|
|
||||||
| `restart` | restarts the ESP | | |
|
|
||||||
| `thermostat_cmd_temp<n>` | sets the thermostat current setpoint temperature to the Heating Circuit `n` (1-4). This is specific for the Home Assistant climate component | temperature value as a float | `20.8` |
|
|
||||||
| `thermostat_cmd_mode<n>` | sets the thermostat current mode to the Heating Circuit `n` (1-4). This is specific for the Home Assistant climate component | auto, day, night, off, manual | `auto` |
|
|
||||||
| `thermostat_cmd` | send a generic command to control the thermostat | JSON `{"cmd":<command>,"data":<value>` with `command` being `temp<hc>`, `mode<hc>`, `nightemp<hc>`, `daytemp<hc>` or `holidaytemp<hc>` with hc being empty or the heat controller (1-4) and `value` being a numeric value | `{ "cmd":"temp2", "data": 20 }` |
|
|
||||||
| `shower_data` | for setting the shower timer or alert toggle | JSON as `{"timer|alert":"0|1"}` | `{"timer":"1"}` |
|
|
||||||
| `generic_cmd` | for sending a command to the EMS-ESP, e.g. sending a shot of cold water | `coldshot` | `coldshot` |
|
|
||||||
| `boiler_cmd` | for sending generic command to control the Boiler | JSON `{"cmd":<command>,"data":<value>` with `command` being `comfort` and `data` = `[hot,comfort,intelligent]` or `flowtemp` with `data` being the desired temperature or `boiler_cmd_wwonetime` | `{"cmd":"flowtemp",data:55}` |
|
|
||||||
| `boiler_cmd_wwactivated` | for receiving boiler controls from a HA HVAC component | `"1"` or `"0"` | `"1"` |
|
|
||||||
| `boiler_cmd_wwtemp` | for receiving boiler temperature setting from a HA HVAC component | the temperature value | `60` |
|
|
||||||
|
|
||||||
## Monitoring MQTT
|
|
||||||
|
|
||||||
In Telnet the command `mqttlog` will show you the last messages published as well as which topics are being subscribed to. In the WebUI you also see real-time the last set of published messages in the System Status screen. Below is an example of the telnet command.
|
|
||||||
|
|
||||||
```
|
|
||||||
[telnet session]
|
|
||||||
mqttlog
|
|
||||||
|
|
||||||
MQTT publish log:
|
|
||||||
Topic:start Payload:start
|
|
||||||
Topic:heartbeat Payload:version=1.9.2b6, IP=10.10.10.198, rssid=72%, load=1%, uptime=364secs, freemem=52%
|
|
||||||
Topic:boiler_data Payload:{"wWComfort":"Hot","wWSelTemp":54,"wWDesiredTemp":70,"selFlowTemp":5,"selBurnPow":0,"curBurnPow":0,"pumpMod":0,"wWCircPump":0,"wWCurTmp":36.7,"wWCurFlow":0,"curFlowTemp":43.4,"retTemp":41,"sysPress":1.7,"boilTemp":45.5,"wWActivated":"on","burnGas":"off","flameCurr":0,"heatPmp":"off","fanWork":"off","ignWork":"off","wWCirc":"off","heating_temp":75,"pump_mod_max":90,"pump_mod_min":60,"wWHeat":"on","wWStarts":206017,"wWWorkM":73890,"UBAuptime":3471966,"burnStarts":229866,"burnWorkMin":368989,"heatWorkMin":295099,"ServiceCode":"0H","ServiceCodeNumber":203}
|
|
||||||
Topic:tapwater_active Payload:0
|
|
||||||
Topic:heating_active Payload:0
|
|
||||||
Topic:thermostat_data Payload:{"hc1":{"seltemp":15,"currtemp":20.6,"mode":"auto"}}
|
|
||||||
|
|
||||||
MQTT subscriptions:
|
|
||||||
Topic:home/ems-esp/restart
|
|
||||||
Topic:home/ems-esp/start
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_temp1
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_mode1
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_temp2
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_mode2
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_temp3
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_mode3
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_temp4
|
|
||||||
Topic:home/ems-esp/thermostat_cmd_mode4
|
|
||||||
Topic:home/ems-esp/thermostat_cmd
|
|
||||||
Topic:home/ems-esp/boiler_cmd
|
|
||||||
Topic:home/ems-esp/boiler_cmd_wwactivated
|
|
||||||
Topic:home/ems-esp/boiler_cmd_wwtemp
|
|
||||||
Topic:home/ems-esp/generic_cmd
|
|
||||||
Topic:home/ems-esp/shower_data
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want more precise monitoring of the MQTT traffic I suggest using [MQTT Explorer](http://mqtt-explorer.com/).
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
### How to interpret the tables below
|
|
||||||
|
|
||||||
Take an example telegram:
|
|
||||||
```
|
|
||||||
OO TTTTT
|
|
||||||
10 00 FF 00 01 A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00
|
|
||||||
data block --> 00 01 02 03 04 06 07 08 09 0A...
|
|
||||||
^
|
|
||||||
|
|
|
||||||
start of data (n=0)
|
|
||||||
|
|
||||||
OO = offset, 1 byte
|
|
||||||
TTTTT = type, 2 bytes
|
|
||||||
```
|
|
||||||
|
|
||||||
The data starts at the 7th byte straight after the typeID of `x01A5`. Position 0 is the first byte of the data block.
|
|
||||||
|
|
||||||
### Reading from and Writing to an EMS+ Telegram
|
|
||||||
|
|
||||||
```
|
|
||||||
Reading 2 bytes of data from 0x1A5 its: send 0B 90 FF 00 02 01 A5
|
|
||||||
Meaning:
|
|
||||||
0B - sender
|
|
||||||
90 - receiver (RC300) (Read request)
|
|
||||||
FF - EMS+ extended mode
|
|
||||||
00 - offset
|
|
||||||
02 - data length to query
|
|
||||||
01 A5 - EMS+ Command/Type
|
|
||||||
|
|
||||||
And writing a value of 0x77 to type 0x1B9 its: send 0B 10 FF 08 01 B9 77
|
|
||||||
|
|
||||||
Meaning:
|
|
||||||
0B - sender
|
|
||||||
10 - receiver (RC300) (Write request)
|
|
||||||
FF - EMS+ extended mode
|
|
||||||
08 - offset
|
|
||||||
01 B9 - EMS+ Command/Type
|
|
||||||
77 - the value to write
|
|
||||||
```
|
|
||||||
|
|
||||||
example to retrieve 25 bytes of data from HC1:
|
|
||||||
|
|
||||||
```
|
|
||||||
send 0B 90 FF 00 19 01 A5
|
|
||||||
Thermostat -> me, type 0x01A5, telegram: 10 0B FF 00 01 A5 00 D3 21 22 00 00 22 27 00 EF 01 01 03 00 EF 01 4B 00 00 11 01 04 08 42 00 (CRC=ED) #data=25
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Type 01A5
|
|
||||||
|
|
||||||
0x1A5 is a monitoring telegram from the 1st Heat Controller (HC1). The other HCs use `01A6`, `01A7` and `01A8` respectively and share the same format as below.
|
|
||||||
|
|
||||||
| data position (0..n) in decimal | description | format | notes |
|
|
||||||
| - | - | - | - |
|
|
||||||
| 0 + 1 | current room temperature | 2 bytes, *10 |
|
|
||||||
| 2 | ?? (room night set point temperature) | 1 byte, *2 | **(needs verifying!)** most probably to be processed as bit(s) known values are always in (03, 21 ,23)|
|
|
||||||
| 3 | current target temperature | 1 byte, *2 | current target value |
|
|
||||||
| 4 | target flow temperature | 1 byte | target flow temp |
|
|
||||||
| 6 | current setpoint temperature | 1 byte, *2 | temperature for current mode |
|
|
||||||
| 7 | next setpoint temperature | 1 byte, *2 | note, only when in auto mode |
|
|
||||||
| 8 | remaining time until next temp change | 2 bytes | remaining time in minutes.|
|
|
||||||
| 10 | mode and eco/comfort bits info | 1 byte| bit 1 : 0=manual 1=mode auto, bit 2 : 0=night 1=comfort2 |
|
|
||||||
| 11 | Current temperature mode | 1 byte | eco : 1, comfort1 : 2, comfort2 : 3, comfort3 : 4 |
|
|
||||||
| 12 | Next temperature mode | 1 byte | eco : 1, comfort1 : 2, comfort2 : 3, comfort3 : 4 |
|
|
||||||
| 13 + 14 | remaining time to next setpoint | 2 bytes | time in minutes.|
|
|
||||||
| 15 + 16 | elapsed time in this setpoint | 2 bytes | time in minutes. |
|
|
||||||
|
|
||||||
|
|
||||||
# Type 01B9
|
|
||||||
|
|
||||||
This telegram type is for managing the Heating mode
|
|
||||||
|
|
||||||
```
|
|
||||||
AUTO Mode, setting temporary temp to 21.5(0x2B)
|
|
||||||
(03:43:45.965) Gateway -> Thermostat, type 0x01B9 telegram: 48 10 FF 08 01 B9 2B (CRC=FA)
|
|
||||||
(03:43:46.445) Thermostat -> all, type 0x01B9 telegram: 10 00 FF 08 01 B9 2B (CRC=17)
|
|
||||||
|
|
||||||
SET to Manual mode ( manual temp is 20.5 (0x29) )
|
|
||||||
(03:49:44.575) Gateway -> Thermostat, type 0x01B9 telegram: 48 10 FF 00 01 B9 00 (CRC=91)
|
|
||||||
(03:49:45.825) Thermostat -> all, type 0x01A5 telegram: 10 00 FF 0A 01 A5 02 (CRC=16)
|
|
||||||
(03:49:51.726) Thermostat -> all, type 0x01A5 telegram: 10 00 FF 03 01 A5 29 (CRC=75)
|
|
||||||
<--- RCPLUSStatusMessage(0x1A5) received
|
|
||||||
(03:49:51.918) Thermostat -> all, type 0x01A5 telegram: 10 00 FF 06 01 A5 29 (CRC=5D)
|
|
||||||
<--- RCPLUSStatusMessage(0x1A5) received
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
| data position (0..n) in decimal | description | format | notes |
|
|
||||||
| - | - | - | - |
|
|
||||||
| 0 | operation mode | 1 byte | (Auto=xFF, Manual=x00) |
|
|
||||||
| 1 | comfort3 level | 1 byte, *2 | |
|
|
||||||
| 2 | comfort2 level | 1 byte, *2 | |
|
|
||||||
| 3 | comfort1 level | 1 byte, *2 | |
|
|
||||||
| 4 | eco level | 1 byte, *2 | |
|
|
||||||
| 5 | | | |
|
|
||||||
| 6 | | | |
|
|
||||||
| 7 | | | |
|
|
||||||
| 8 | temporary setpoint temperature | 1 byte, *2 | when changing of templevel (in auto) value is reset and set to FF |
|
|
||||||
| 9 | | | |
|
|
||||||
| 10 | manual setpoint temperature | 1 byte, *2 | |
|
|
||||||
|
|
||||||
# Type 01AF
|
|
||||||
|
|
||||||
Summer - Winter Mode
|
|
||||||
|
|
||||||
change the mode
|
|
||||||
```send 0B 10 FF 00 AF 07 02```
|
|
||||||
|
|
||||||
query the mode
|
|
||||||
```send 0B 90 FF 00 AF 07 01```
|
|
||||||
|
|
||||||
1 Byte value.
|
|
||||||
|
|
||||||
|Byte value | Meaning |
|
|
||||||
| - | - |
|
|
||||||
| 00 | Off |
|
|
||||||
| 01 | Automatic |
|
|
||||||
| 02 | Forced |
|
|
||||||
|
|
||||||
Data log example :
|
|
||||||
```
|
|
||||||
Thermostat -> all, type 0x01AF telegram: 10 00 FF 07 01 AF 00 (Off)
|
|
||||||
Thermostat -> all, type 0x01AF telegram: 10 00 FF 07 01 AF 01 (Automatic)
|
|
||||||
Thermostat -> all, type 0x01AF telegram: 10 00 FF 07 01 AF 02 (Forced)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# EMS-ESP Documentation
|
|
||||||
This is the documentation for EMS-ESP. Thanks to Tasmota for providing examples.
|
|
||||||
|
|
||||||
## Editing Files
|
|
||||||
|
|
||||||
Use normal markdown syntax with some enhancements, see below.
|
|
||||||
|
|
||||||
### Disable click on zoom for an image
|
|
||||||
Images support click on zoom function. If you don't want to use it:
|
|
||||||
```
|
|
||||||

|
|
||||||
```
|
|
||||||
### Image resizing
|
|
||||||
Due to click on zoom you can directly link to a big image but make it render smaller on the page:
|
|
||||||
|
|
||||||
```
|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
<!-- Supports percentage -->
|
|
||||||
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### Rendering Alert Tags
|
|
||||||
|
|
||||||
Blockquotes `>` can now look even fancier:
|
|
||||||
|
|
||||||
?> =`?>`
|
|
||||||
|
|
||||||
!> = `!>`
|
|
||||||
|
|
||||||
> [!TIP]
|
|
||||||
> `> [!TIP]`
|
|
||||||
|
|
||||||
> [!DANGER]
|
|
||||||
> `> [!DANGER]`
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> `> [!NOTE]`
|
|
||||||
|
|
||||||
> [!EXAMPLE]
|
|
||||||
> `> [!EXAMPLE]`
|
|
||||||
|
|
||||||
> [!DANGER|style:flat]
|
|
||||||
> `> [!DANGER|style:flat]`
|
|
||||||
|
|
||||||
### Creating Tabs
|
|
||||||
|
|
||||||
```
|
|
||||||
<!-- tabs:start -->
|
|
||||||
|
|
||||||
#### ** First Tab Title **
|
|
||||||
|
|
||||||
Hello!
|
|
||||||
|
|
||||||
#### ** Second Tab Title **
|
|
||||||
|
|
||||||
Bonjour!
|
|
||||||
|
|
||||||
#### ** Third Tab Title **
|
|
||||||
|
|
||||||
Ciao!
|
|
||||||
|
|
||||||
<!-- tabs:end -->
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
|
|
||||||
## Using Telnet to monitor EMS traffic
|
|
||||||
|
|
||||||
Use the telnet client to inform you of all activity and errors real-time. This is an example of the telnet output:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Type `log v` and Enter and you'll be seeing verbose logging messages. ANSI colors with white text for info messages, green are for broadcast telegrams, yellow are the ones sent to us and red are for unknown data or telegrams which have failed the CRC check.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
To see the current stats and collected values type 'info'. Note it is normal behavior to see a few CrcErrors as this is usually noise on the line.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**Warning: be careful when sending values to the boiler. If in doubt you can always reset the boiler to its original factory settings by following the instructions in the user guide. For example on my Nefit Trendline that is done by holding down the Home and Menu buttons simultaneously for a few seconds, selecting factory settings from the scroll menu followed by pressing the Reset button.**
|
|
||||||
|
|
||||||
### Recommended puTTY settings
|
|
||||||
|
|
||||||
The Telnet code handles continuous motioning of key strokes, which is useful when monitoring a stream of incoming telegrams and issuing commands at the same time. If you're using puTTY then this will be need to be enabled. I suggest the following settings:
|
|
||||||
|
|
||||||
```
|
|
||||||
Terminal->Local line editing->Force off
|
|
||||||
Terminal->Bell->None
|
|
||||||
Window->Columns: 180
|
|
||||||
Window->Rows: 70
|
|
||||||
Window->Lines of scrollback: 5000
|
|
||||||
Window->Appearance->Font quality: Antialiased
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
180
docs/SM100.md
@@ -1,180 +0,0 @@
|
|||||||
|
|
||||||
### General
|
|
||||||
|
|
||||||
The SM100 (and SM200) is a device to enhance Buderus heatings with the ability to earn solar energy using solar collectors and spend these energy into a water reservoir.
|
|
||||||
There are different scenarios available to add these module into a heating.
|
|
||||||
|
|
||||||
Protocol: The SM100 device communicates using the EMS+ protocol. That means it sends and interprets EMS and also EMS+ messages.
|
|
||||||
|
|
||||||
External Link to the german product page of SM100: https://www.buderus.de/de/produkte/catalogue/alle-produkte/7607_solarmodul-logamatic-sm100
|
|
||||||
|
|
||||||
|
|
||||||
The following reverse protocol engineering based on a Buderus GB172 heating combined with a water reservoir in one heating circuit. Other combinations, configurations and protocol types are not covered.
|
|
||||||
|
|
||||||
Also refer to https://github.com/proddy/EMS-ESP/issues/267 for the SM200
|
|
||||||
|
|
||||||
|
|
||||||
### Decoded EMS+ Messages
|
|
||||||
|
|
||||||
How to interpret the tables below. Take an example telegram:
|
|
||||||
```
|
|
||||||
EMS+ telegram type
|
|
||||||
->| |<-
|
|
||||||
30 00 FF 00 02 62 01 FB 01 9E 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 2B
|
|
||||||
data block --> 00 01 02 03 04 06 07 08 09 0A...
|
|
||||||
^
|
|
||||||
|
|
|
||||||
start of data
|
|
||||||
```
|
|
||||||
|
|
||||||
The data starts at the 7th byte straight after the typeID - here `x0262`. Position 0 is the first byte of the data block.
|
|
||||||
|
|
||||||
|
|
||||||
### Telegram overview
|
|
||||||
|
|
||||||
| EMS+ telegram type | description | schedule | number of data bytes in decimal |
|
|
||||||
| - | - | - | - |
|
|
||||||
| x0262 | Temperatures | every minute | 26 (max. 24 in one telegram) |
|
|
||||||
| x0263 | unknown | every minute | 12 |
|
|
||||||
| x0264 | Solar pump modulation | every minute | 17 |
|
|
||||||
| x0266 | unknown | every minute | 04 |
|
|
||||||
| x0268 | unknown | every minute | 02 |
|
|
||||||
| x026A | Solar pump on/off | every minute | 12 |
|
|
||||||
| x028E | Solar energy earnings | every hour | 15 |
|
|
||||||
|
|
||||||
### Telegram details
|
|
||||||
|
|
||||||
|
|
||||||
| Telegram type | data position (0..n) in decimal | description | format |
|
|
||||||
| - | - | - | - |
|
|
||||||
| x0262 | 0+1 | T1 - Temperature of solar collector `[°C]` | 2 bytes |
|
|
||||||
| x0262 | 2+3 | T2 - Temperature of bottom water reservoir 1 `[°C]` | 2 bytes |
|
|
||||||
| x0262 | 16+17 | T5 - Temperature of bottom water reservoir 2 `[°C]` | 2 bytes |
|
|
||||||
| x0264 | 9 | Solar pump modulation `[%]` | 1 byte |
|
|
||||||
| x026A | 10 | PS1 - Solar pump: on=`04` and off=`03` | 1 byte |
|
|
||||||
| x026A | 4 | VS2 - Cylinder select value: cyl#2=`04` and cyl#1=`03` | 1 byte |
|
|
||||||
| x028E | 2+3 | Solar energy earning last hour `/10` `[Wh]` | 2 byte |
|
|
||||||
| x028E | 6+7 | Solar energy earning today `[Wh]` | 2 byte |
|
|
||||||
| x028E | 10+11 | Solar energy earning total `/10` `[kWh]` | 2 byte |
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
Solar pump status and changes:
|
|
||||||
|
|
||||||
1.Status solar pump is currently off: see x026A data byte 0A "03" and x0264 data byte 9 "00"
|
|
||||||
```
|
|
||||||
SM -> all, type 0x026A telegram: 30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 03 03 (CRC=E5), #data=11
|
|
||||||
SM -> all, type 0x0264 telegram: 30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 00 0C 0A 64 00 00 00 00 (CRC=53), #data=16
|
|
||||||
```
|
|
||||||
|
|
||||||
2.Status pump is currently on: see x026A data byte 0A "04" and x0264 data byte 9 "1E"
|
|
||||||
```
|
|
||||||
SM -> all, type 0x026A telegram: 30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 04 03 (CRC=EB), #data=11
|
|
||||||
SM -> all, type 0x0264 telegram: 30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 09 08 64 00 00 00 00 (CRC=CD), #data=16
|
|
||||||
```
|
|
||||||
|
|
||||||
3.Solar pump changes from off --> on: see x0264 data byte 9 set at first to "64" and x026A byte 0A is set to "04"
|
|
||||||
```
|
|
||||||
SM -> all, type 0x0264 telegram: 30 00 FF 09 02 64 64 (CRC=37)
|
|
||||||
SM -> all, type 0x026A telegram: 30 00 FF 0A 02 6A 04 (CRC=53)
|
|
||||||
|
|
||||||
Less then 10 seconds later the pump is throttled to `30%` 0x1E
|
|
||||||
|
|
||||||
SM -> all, type 0x0264 telegram: 30 00 FF 09 02 64 1E (CRC=4D)
|
|
||||||
```
|
|
||||||
|
|
||||||
4.Solar pump changes from on --> off: see x0264 data byte 9 set to "00" and x026a byte 0A is set to "03"
|
|
||||||
```
|
|
||||||
SM -> all, type 0x0264 telegram: 30 00 FF 09 02 64 00 (CRC=53)
|
|
||||||
SM -> all, type 0x026A telegram: 30 00 FF 0A 02 6A 03 (CRC=54)
|
|
||||||
```
|
|
||||||
|
|
||||||
Solar energy earnings:
|
|
||||||
```
|
|
||||||
SM -> all, type 0x028E telegram: 30 00 FF 00 02 8E 00 00 0C F3 00 00 06 02 00 00 76 33 (CRC=8A), #data=11
|
|
||||||
```
|
|
||||||
|
|
||||||
### MQTT message format
|
|
||||||
|
|
||||||
Example of MQTT message:
|
|
||||||
```
|
|
||||||
{"collectortemp":54.8,"bottomtemp":38.8,"pumpmodulation":30,"pump":"on","energylasthour":136.5,"energytoday":447,"energytotal":3029.4}
|
|
||||||
```
|
|
||||||
Please note that not all json elements are available after a restart of the ESP! It takes several minutes (up to 1 h) to collect all necessary values
|
|
||||||
|
|
||||||
### Home Assistant integration
|
|
||||||
|
|
||||||
Example to integrate values into Home Assistant
|
|
||||||
|
|
||||||
##### binary_sensors.yaml:
|
|
||||||
```
|
|
||||||
- platform: mqtt
|
|
||||||
name: 'Solar Pump'
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
value_template: '{{ value_json.pump }}'
|
|
||||||
payload_on: "on"
|
|
||||||
payload_off: "off"
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
##### sensors.yaml:
|
|
||||||
```
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Collector Temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.collectortemp }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Bottom Temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.bottomtemp }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Solar Pump modulation'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.pumpmodulation }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Solar Energy Last Hour'
|
|
||||||
unit_of_measurement: 'Wh'
|
|
||||||
value_template: '{{ value_json.energylasthour }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Solar Energy Today'
|
|
||||||
unit_of_measurement: 'Wh'
|
|
||||||
value_template: '{{ value_json.energytoday }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/sm_data'
|
|
||||||
name: 'Solar Energy Total'
|
|
||||||
unit_of_measurement: 'kWh'
|
|
||||||
value_template: '{{ value_json.energytotal }}'
|
|
||||||
qos: 1
|
|
||||||
payload_available: "online"
|
|
||||||
payload_not_available: "offline"
|
|
||||||
|
|
||||||
```
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
Most Bosch branded boilers that support the Logamatic EMS bus protocols work with this design. This includes Nefit, Buderus, Worcester, Junkers and Sieger (all copyrighted).
|
|
||||||
|
|
||||||
!> Please make sure you read the **Disclaimer** on the home page carefully before sending ambiguous messages to your EMS bus as you could cause serious damage to your equipment.
|
|
||||||
|
|
||||||
EMS devices are being constantly added to the database (see file `ems_devices.h`) on each new release.
|
|
||||||
|
|
||||||
### Thermostats:
|
|
||||||
|
|
||||||
* Buderus RC10, RC20, RC20F, RC30, R35, RC300, RC310, RC3000
|
|
||||||
* Buderus Logamatic TC100 (read-only)
|
|
||||||
* Nefit Moduline 100, 300, 400
|
|
||||||
* Nefit Moduline 1010, 3000 (read-only)
|
|
||||||
* Nefit Moduline Easy (read-only)
|
|
||||||
* Bosch CW100, Easy Control/CT200 (read-only)
|
|
||||||
* Junkers FR10, FR50, FR100, FR110, FW100, FW120
|
|
||||||
* Sieger ES73
|
|
||||||
|
|
||||||
### Boilers:
|
|
||||||
|
|
||||||
* Buderus GBx72, GB162, GB152, GB125, Logamax U122, Logamax Plus GB062/GB122/GB192, Logano
|
|
||||||
* Bosch Condens 2500
|
|
||||||
* Worcester-Bosch Greenstar 550CDi
|
|
||||||
* Worcester Bosch Greenstar 24i
|
|
||||||
* Junkers Cerapur, Junkers Heatronic 3 boilers
|
|
||||||
* Nefit Proline, Trendline, Topline, Enviline, Smartline
|
|
||||||
* Sieger BK13 and BK15 Boiler
|
|
||||||
|
|
||||||
### Solar Modules:
|
|
||||||
|
|
||||||
* Buderus SM10, SM50, SM100 Solar Module
|
|
||||||
* Junkers ISM1 Solar Module
|
|
||||||
|
|
||||||
### Mixing Modules:
|
|
||||||
|
|
||||||
* Buderus MM10, MM50, MM100, MM200 Mixer Module
|
|
||||||
|
|
||||||
### Heat Pump Modules:
|
|
||||||
|
|
||||||
* Buderus HeatPump Module
|
|
||||||
|
|
||||||
### Other devices:
|
|
||||||
|
|
||||||
* Generic Buderus MC10 Module
|
|
||||||
* Buderus WM10 Switch Module
|
|
||||||
* Buderus RFM20 Receiver
|
|
||||||
* Buderus BC10, BC25, BC40 Base Controller
|
|
||||||
* Buderus Web Gateway KM200
|
|
||||||
* Nefit Moduline Easy Connect
|
|
||||||
* Bosch Easy Connect
|
|
||||||
* EMS-OT OpenTherm converter
|
|
||||||
* Junkers Controller
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
(thanks to @moustic999 for explaining this)
|
|
||||||
|
|
||||||
## RC300
|
|
||||||
|
|
||||||
RC300 has 2 modes : Auto and Manual.
|
|
||||||
|
|
||||||
Auto can switch temperature between 2 levels : eco and comfort
|
|
||||||
|
|
||||||
## RC35
|
|
||||||
|
|
||||||
RC35 has 3 modes : Auto, Day and Night.
|
|
||||||
|
|
||||||
Auto can switch temperature between 2 levels : day and night
|
|
||||||
|
|
||||||
Changing the temperature for Day or Night (in these modes) will also change the temperature levels used in Auto mode
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
### Web UI is showing blank pages after logging in
|
|
||||||
|
|
||||||
Due to an issue in how web socket authentication is supported in some browsers, the web interface will currently not work with
|
|
||||||
* Safari
|
|
||||||
* Any browser on an iOS or iPadOS device (so iPhones and iPads)
|
|
||||||
|
|
||||||
and the Dashboard will show an empty page.
|
|
||||||
|
|
||||||
A workaround is to use another browser like Chrome or Firefox until the issue has been resolved in the 3rd party library. See [here](https://github.com/me-no-dev/ESPAsyncWebServer/issues/575) and [here](https://bugs.webkit.org/show_bug.cgi?id=80362) for further details on the bug.
|
|
||||||
|
|
||||||
### Web UI is slow or not responding
|
|
||||||
|
|
||||||
Check that you have compiled the firmware with the correct ESP8266 board. In PlatformIO look for `board =` in the `[env]` section. There are noticeable differences between flash chips on certain branded and clone ESP8266 development boards. Best let PlatformIO figure out which one to use (e.g. dio, dout, qio).
|
|
||||||
|
|
||||||
Also certain ESP8266 boards (like from DO-IT) have been problematic. Check that first before logging an issue.
|
|
||||||
|
|
||||||
### Can't connect via WiFi to the EMS-ESP
|
|
||||||
|
|
||||||
The EMS-ESP is probably in Access Point mode. Look for a wifi SSID 'ems-esp', connect to this and open a browser to 'https://192.168.4.1'. If you have configured a WiFi client your router would have appointed an IP address via DHCP. You should be able to connect via https://ems-esp or https://ems-esp.local.
|
|
||||||
|
|
||||||
If you're still unable to connect to the EMS-ESP, hook it up to the USB and open a serial monitor to the COM port to see what is happening. The serial output will always automatically be switched off when there is a connection to the EMS bus. To force it on at bootup, re-compile the code by adding `-DFORCE_SERIAL` to the `general_flags` in `platformio.ini`. Note make sure you re-compile without this flag when putting the EMS-ESP back into production use.
|
|
||||||
|
|
||||||
### EMS Bus shows as disconnected
|
|
||||||
|
|
||||||
The on-board blue LED will flash if there is no connection with the EMS bus. If the LED is disabled re-enable it using the telnet command `set led` or the web interface. The two possible reasons why the bus shows as disabled or disconnected:
|
|
||||||
|
|
||||||
1) The board is running in Serial mode. This will be shown in the telnet session and you can use `set serial off` to disable it or via the web interface.
|
|
||||||
2) There is no Rx data coming in. The connection to the EMS bus (2-wires or the jack) is faulty or connected to the wrong GPIO pins on the ESP. Rx is D7 and Tx is D8.
|
|
||||||
|
|
||||||
### ESP is unstable and frequently reboots
|
|
||||||
|
|
||||||
Well, that sucks. Sorry!
|
|
||||||
|
|
||||||
Here are some first things to check
|
|
||||||
|
|
||||||
* Check you're using a genuine ESP8266 (like the Wemos D1 or Nodemcuv2). There have been reports of some esp8266 clones (noticeably from DO-IT) which are problematic. See this message from [bbqkees](https://github.com/proddy/EMS-ESP/issues/173#issuecomment-528791079).
|
|
||||||
* Check that the settings can be saved after a set command. Check with typing `set` into the telnet session.
|
|
||||||
* Can you reproduce the problem using the official firmware .bin files from the GitHub Release page?
|
|
||||||
* If you compiled the firmware yourself
|
|
||||||
1) Check if you can you reproduce this using the precompiled firmware from the GitHub Releases page
|
|
||||||
2) Check that your `platformio.ini` file is up-to-date with the example one provided
|
|
||||||
3) Check that your platformio environment up-to-date with the latest libraries
|
|
||||||
* Did it work before, in an earlier version? Report back which one.
|
|
||||||
|
|
||||||
Then try the following to isolate the root cause of the problem:
|
|
||||||
|
|
||||||
* Use `system` to see how many times it has restarted and what the exception cause was. Note, if the EMS-ESP restarts more than 10 times within a 60-second window of booting it is considered unstable and Serial mode will automatically be enabled to help debug the root cause. This will be shown in the system command too.
|
|
||||||
* Don't use the web interface, only the Telnet with logging off (`set log n`). Does it still fail? Then try with logging on and see where it fails. Capture the logs and screenshots.
|
|
||||||
* If compiled with the `debug` target the firmware will capture the stack dump of a crash. Use `crash dump` to output the stack, copy this to a file in scripts/stackdmp.txt (you may need to clean up the formatting) and run the `analyze_stackdmp.py` file to see where in the code the crash occurred.
|
|
||||||
* Perhaps it's the Tx logic, which can be disabled using `set listen_mode on` (or via the web). See next session below for Tx issues.
|
|
||||||
* Perhaps the MQTT is failing, which can be disabled with `set publish_time 0` or `set mqtt_enabled false` (or via the web).
|
|
||||||
* Perhaps the UART low-level code to read the signals from the circuit is causing interference somewhere. Detach the ESP8266 from the circuit (or gateway module) and start it without any of the GPIOs attached to see if it is any more stable.
|
|
||||||
* As a last resort try wiping the ESP8266 and uploading the firmware again. Use `pio run -t erase` or `esptool.py erase_flash`.
|
|
||||||
|
|
||||||
### Tx is just not working
|
|
||||||
|
|
||||||
First make sure 'listen_mode' is not on as this disables writing to the EMS bus (called Tx). Verify this with the `set` command.
|
|
||||||
|
|
||||||
A quick test is to manually send a command with verbose logging enabled, for example, this will request the version information from the boiler on Device ID 0x08:
|
|
||||||
|
|
||||||
```
|
|
||||||
log v
|
|
||||||
send 0B 88 02 00 20
|
|
||||||
```
|
|
||||||
|
|
||||||
Note for Junkers use `send 8B 88 02 00 20`
|
|
||||||
|
|
||||||
Then try a different Tx setting with `set tx_mode`. 1 is the default, 2 works well for EMS+ and 3 is Junkers specific. With some Bosch devices 2 works better.
|
|
||||||
|
|
||||||
If you see errors pop up in the Telnet session like `** Warning, we missed the bus - Rx non-idle!` and have other components using the +5V power line of the ESP8266 (for example external sensors) then disconnect and try again and this may be causing noise on the line.
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
A pre-baked firmware for the common ESP8266 devices are available in the GitHub [releases](https://github.com/proddy/EMS-ESP/releases) which you can upload yourself using the [esptool](https://github.com/espressif/esptool) bootloader.
|
|
||||||
|
|
||||||
### via USB
|
|
||||||
|
|
||||||
- Install ESPTool by running `pip install esptool`. You'll need [Python](https://www.python.org/downloads/) installed.
|
|
||||||
- Download the firmware from `https://github.com/proddy/EMS-ESP/releases/latest`. You can use `wget` for this.
|
|
||||||
- `esptool -p COM5 write_flash 0x00000 *.bin` (use COM* for windows, /dev/tty* for Linux/OSX)
|
|
||||||
|
|
||||||
### via OTA (Over The Air)
|
|
||||||
|
|
||||||
- Download espota. Eg. `wget https://raw.githubusercontent.com/esp8266/Arduino/master/tools/espota.py`
|
|
||||||
- Download the firmware from `https://github.com/proddy/EMS-ESP/releases/latest`. You can use `wget` for this.
|
|
||||||
- `python espota.py -i ems-esp -f *.bin`
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
If you plan to make changes to the web (css/html/js) you can simulate the front-end by installing the npm modules in the `wsemulator` folder:
|
|
||||||
```sh
|
|
||||||
cd tools\wsemulator
|
|
||||||
npm ci
|
|
||||||
```
|
|
||||||
for the first time and then using the `run` script to start it. e.g. `./run` or `./run.sh` just `run` depending on the OS.
|
|
||||||
The password for the web admin user is **neo**.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[remoteMarkdownUrl](https://raw.githubusercontent.com/proddy/EMS-ESP/dev/CHANGELOG.md)
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
function normalizeGithubUrl(url) {
|
|
||||||
if (!url) { return null }
|
|
||||||
|
|
||||||
var isAlias = !/\/\//.test(url) // no protocol in the url, we assume it's an alias
|
|
||||||
url = isAlias
|
|
||||||
? 'https://github.com/' + url + '/edit/master/docs/'
|
|
||||||
: url.replace(/^git\+/, '')
|
|
||||||
|
|
||||||
return url
|
|
||||||
}
|
|
||||||
|
|
||||||
function install(hook, vm) {
|
|
||||||
var editLinkConfig = vm.config.editLink || {}
|
|
||||||
var text = editLinkConfig.text || 'Edit this page'
|
|
||||||
var cssClass = editLinkConfig.cssClass || 'edit-link'
|
|
||||||
var repoUrl = normalizeGithubUrl(editLinkConfig.repo || vm.config.repo)
|
|
||||||
|
|
||||||
if (!repoUrl) { throw Error('$docsify.editLink.repo is required. Fix your config.') }
|
|
||||||
|
|
||||||
hook.afterEach(function (html) {
|
|
||||||
var editLink = '<span style="text-align: right; color:#1FA3EC; font-size:80%">' +
|
|
||||||
'<a href="' + repoUrl + vm.route.file + '" target="_blank" style="text-decoration: none;">' + text + '</a></span>'
|
|
||||||
|
|
||||||
return editLink + html
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$docsify.plugins = [].concat(install, $docsify.plugins)
|
|
||||||
1
docs/_assets/prism-bash.min.js
vendored
@@ -1,17 +0,0 @@
|
|||||||
Prism.languages.console = {
|
|
||||||
'regex': {
|
|
||||||
pattern: /(?<!\s)^\w+/im,
|
|
||||||
lookback: true
|
|
||||||
},
|
|
||||||
'operator': /^\b(?:rule)\d?\b/im,
|
|
||||||
'constant': /\b(?<=on)\s\S{1,}#\S{1,}\b/i,
|
|
||||||
'selector': /(?<!(power\w+))\s(?:on|do|endon|break|if|else|elseif|and|or)\b/i,
|
|
||||||
'boolean': /\b(?:backlog)\b/i,
|
|
||||||
'comment': /[<]\w+[>]/,
|
|
||||||
'deleted': /[;]\s/,
|
|
||||||
'json': {
|
|
||||||
pattern: /[{].*[}]/,
|
|
||||||
alias: 'language-json',
|
|
||||||
inside: Prism.languages.json
|
|
||||||
},
|
|
||||||
};
|
|
||||||
1
docs/_assets/prism-http.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
!function(t){t.languages.http={"request-line":{pattern:/^(?:POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\s(?:https?:\/\/|\/)\S+\sHTTP\/[0-9.]+/m,inside:{property:/^(?:POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,"attr-name":/:\w+/}},"response-status":{pattern:/^HTTP\/1.[01] \d+.*/m,inside:{property:{pattern:/(^HTTP\/1.[01] )\d+.*/i,lookbehind:!0}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var a,e,n,i=t.languages,s={"application/javascript":i.javascript,"application/json":i.json||i.javascript,"application/xml":i.xml,"text/xml":i.xml,"text/html":i.html,"text/css":i.css},p={"application/json":!0,"application/xml":!0};for(var r in s)if(s[r]){a=a||{};var T=p[r]?(void 0,n=(e=r).replace(/^[a-z]+\//,""),"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+n+"(?![+\\w.-]))"):r;a[r]={pattern:RegExp("(content-type:\\s*"+T+"[\\s\\S]*?)(?:\\r?\\n|\\r){2}[\\s\\S]*","i"),lookbehind:!0,inside:{rest:s[r]}}}a&&t.languages.insertBefore("http","header-name",a)}(Prism);
|
|
||||||
1
docs/_assets/prism-json.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
Prism.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};
|
|
||||||
1
docs/_assets/prism-yaml.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},Prism.languages.yml=Prism.languages.yaml;
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
/* PrismJS 1.17.1
|
|
||||||
https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+bash+http+json+shell-session+yaml */
|
|
||||||
/**
|
|
||||||
* prism.js Dark theme for JavaScript, CSS and HTML
|
|
||||||
* Based on the slides of the talk “/Reg(exp){2}lained/”
|
|
||||||
* @author Lea Verou
|
|
||||||
*/
|
|
||||||
|
|
||||||
code[class*="language-"],
|
|
||||||
pre[class*="language-"] {
|
|
||||||
color: #cacaca;
|
|
||||||
background: none;
|
|
||||||
text-shadow: 0 -.1em .2em black;
|
|
||||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
|
||||||
font-size: 1em;
|
|
||||||
text-align: left;
|
|
||||||
white-space: pre;
|
|
||||||
word-spacing: normal;
|
|
||||||
word-break: normal;
|
|
||||||
word-wrap: normal;
|
|
||||||
line-height: 1.5;
|
|
||||||
|
|
||||||
-moz-tab-size: 4;
|
|
||||||
-o-tab-size: 4;
|
|
||||||
tab-size: 4;
|
|
||||||
|
|
||||||
-webkit-hyphens: none;
|
|
||||||
-moz-hyphens: none;
|
|
||||||
-ms-hyphens: none;
|
|
||||||
hyphens: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
code[class*="language-"],
|
|
||||||
pre[class*="language-"] {
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pre[class*="language-"],
|
|
||||||
:not(pre) > code[class*="language-"] {
|
|
||||||
background: hsl(30, 20%, 25%);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Code blocks */
|
|
||||||
pre[class*="language-"] {
|
|
||||||
padding: 1em;
|
|
||||||
margin: .5em 0;
|
|
||||||
overflow: auto;
|
|
||||||
border: .3em solid hsl(30, 20%, 40%);
|
|
||||||
border-radius: .5em;
|
|
||||||
box-shadow: 1px 1px .5em black inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inline code */
|
|
||||||
:not(pre) > code[class*="language-"] {
|
|
||||||
padding: .15em .2em .05em;
|
|
||||||
border-radius: .3em;
|
|
||||||
border: .13em solid hsl(30, 20%, 40%);
|
|
||||||
box-shadow: 1px 1px .3em -.1em black inset;
|
|
||||||
white-space: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.comment,
|
|
||||||
.token.prolog,
|
|
||||||
.token.doctype,
|
|
||||||
.token.cdata {
|
|
||||||
color: hsl(30, 20%, 50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.punctuation {
|
|
||||||
opacity: .7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.namespace {
|
|
||||||
opacity: .7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.property,
|
|
||||||
.token.tag,
|
|
||||||
.token.number,
|
|
||||||
.token.symbol {
|
|
||||||
color: hsl(350, 40%, 70%);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.token.attr-name,
|
|
||||||
.token.string,
|
|
||||||
.token.char,
|
|
||||||
.token.builtin,
|
|
||||||
.token.inserted {
|
|
||||||
color: hsl(75, 70%, 60%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.operator,
|
|
||||||
.token.entity,
|
|
||||||
.token.url,
|
|
||||||
.language-css .token.string,
|
|
||||||
.style .token.string,
|
|
||||||
.token.variable {
|
|
||||||
color: hsl(40, 90%, 60%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.atrule,
|
|
||||||
.token.attr-value,
|
|
||||||
.token.keyword {
|
|
||||||
color: hsl(350, 40%, 70%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.important {
|
|
||||||
color: #e90;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.important,
|
|
||||||
.token.bold {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.token.italic {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.entity {
|
|
||||||
cursor: help;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.deleted {
|
|
||||||
color: rgb(218, 92, 92); /* the ; in backlogs */
|
|
||||||
}
|
|
||||||
.token.regex {
|
|
||||||
color: #e90; /* command */
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.selector {
|
|
||||||
color: hsl(187, 78%, 57%); /* rule operators */
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.constant {
|
|
||||||
color: hsl(61, 64%, 47%); /* rule triggers */
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.boolean {
|
|
||||||
color: hsl(290, 38%, 60%); /* backlog */
|
|
||||||
}
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
:root {
|
|
||||||
--mono-hue : 201;
|
|
||||||
--mono-saturation : 18%;
|
|
||||||
--mono-shade4 : hsl(var(--mono-hue), var(--mono-saturation), 10%);
|
|
||||||
--base-line-height : 1.5;
|
|
||||||
--content-max-width : 70em;
|
|
||||||
--cover-background-blend-mode : darken ;
|
|
||||||
--cover-background-color : var(--base-background-color);
|
|
||||||
--cover-background-mask-opacity : 0.8;
|
|
||||||
--cover-blockquote-color : #1fa3ec;
|
|
||||||
--code-theme-text : #e4e4e4 ;
|
|
||||||
--table-cell-padding : 0.4em 0.75em;
|
|
||||||
--table-head-background : var(--mono-shade4);
|
|
||||||
--table-row-even-background : var(--mono-shade2);
|
|
||||||
--table-row-odd-background : var(--mono-shade3);
|
|
||||||
/* Sidebar
|
|
||||||
============================================================================= */
|
|
||||||
--sidebar-background : var(--mono-shade2);
|
|
||||||
--sidebar-padding : 0 25px;
|
|
||||||
--sidebar-transition-duration : var(--duration-fast);
|
|
||||||
--sidebar-width : 18rem;
|
|
||||||
--sidebar-nav-indent : 0.6em;
|
|
||||||
--sidebar-nav-margin : 0 0 0;
|
|
||||||
--sidebar-nav-link-padding : 0 0;
|
|
||||||
--sidebar-nav-link-before-margin : 0 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp {
|
|
||||||
border: 1px solid var(--mono-shade2);
|
|
||||||
border-left-width: .25rem;
|
|
||||||
border-radius: .25rem;
|
|
||||||
background: var(--mono-shade2);
|
|
||||||
padding: .25rem 1.25rem !important;
|
|
||||||
margin-bottom: 0.25rem !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.medium-zoom-overlay, .medium-zoom-image--open {
|
|
||||||
z-index: 0 !important;
|
|
||||||
}
|
|
||||||
.alert.ems-esp.warning {
|
|
||||||
border-left-color: #f0ad4e !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.warning .title {
|
|
||||||
color: #f0ad4e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.tip {
|
|
||||||
border-left-color: #28a745 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.tip .title {
|
|
||||||
color: #28a745;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.info {
|
|
||||||
border-left-color: #E0FFFF !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.info .title {
|
|
||||||
color: #E0FFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.danger {
|
|
||||||
border-left-color: #dc3545 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.danger .title {
|
|
||||||
color: #dc3545;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.example {
|
|
||||||
border-left-color: #1FA3EC !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert.ems-esp.example .title {
|
|
||||||
color: #1FA3EC;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
##### Device ID
|
|
||||||
|
|
||||||
TBD
|
|
||||||
|
|
||||||
##### Product ID
|
|
||||||
|
|
||||||
TBD
|
|
||||||
|
|
||||||
##### Telegram
|
|
||||||
|
|
||||||
TBD
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 594 B After Width: | Height: | Size: 594 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 856 B |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
@@ -1,8 +0,0 @@
|
|||||||
* Download
|
|
||||||
* [Download Firmware](https://github.com/proddy/EMS-ESP/releases/latest)
|
|
||||||
* [Download Source](https://github.com/proddy/EMS-ESP)
|
|
||||||
* [Download Dev Build](https://github.com/proddy/EMS-ESP/releases/tag/travis-dev-build)
|
|
||||||
* Help
|
|
||||||
* [FAQ](FAQ)
|
|
||||||
* [Troubleshooting](Troubleshooting)
|
|
||||||
* [Community Help](https://gitter.im/EMS-ESP/community)
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
* **Installation**
|
|
||||||
* [Getting Started](getting_started)
|
|
||||||
* [Building the Firmware](Building-firmware)
|
|
||||||
* [Uploading the Firmware](Uploading-firmware)
|
|
||||||
* [Configuring your System](Configure-firmware)
|
|
||||||
* [Monitoring the EMS bus](Running-and-Monitoring)
|
|
||||||
* **Home Automation Integration**
|
|
||||||
* [MQTT](MQTT)
|
|
||||||
* [Home Assistant](Home-Assistant)
|
|
||||||
* [Domoticz](Domoticz)
|
|
||||||
* **EMS Protocol**
|
|
||||||
* [How the EMS Bus works](How-the-EMS-bus-works)
|
|
||||||
* [EMS 1.0 Telegram Types](EMS-Telegram-Types)
|
|
||||||
* [EMS+ / EMS 2.0](Deciphering-EMS-Plus)
|
|
||||||
* [Thermostat modes](Thermostat-Modes-RC35-vs-RC300)
|
|
||||||
* [EMS+ Thermostats](RC3xx-Thermostats)
|
|
||||||
* [SM100/200 Solar Modules](SM100)
|
|
||||||
* [MC110 Contoller](MC110-controller)
|
|
||||||
* **For Developers**
|
|
||||||
* [Building your own Board](Building-your-own-test-circuit)
|
|
||||||
* [Extending the Functionality](How-the-Code-Works)
|
|
||||||
* [Testing the Web Interface](Web-test)
|
|
||||||
* [Feature Wish List](wish-list)
|
|
||||||
* **Getting Help**
|
|
||||||
* [FAQ](FAQ)
|
|
||||||
* [Troubleshooting](Troubleshooting)
|
|
||||||
* [How to Contribute](Contributing)
|
|
||||||
BIN
docs/favicon.ico
|
Before Width: | Height: | Size: 17 KiB |
@@ -1,22 +0,0 @@
|
|||||||
<img style="margin: 10px 10px; float:right; width:10%" src="_media/logo-proddy-fw.jpg" alt="EMS-ESP Logo"></img>
|
|
||||||
|
|
||||||
Welcome to EMS-ESP! A small project to read and write to EMS controller heating devices.
|
|
||||||
<br>
|
|
||||||
|
|
||||||
Follow these steps to get EMS-ESP up and running:
|
|
||||||
|
|
||||||
- [Build](Building-your-own-test-circuit) or buy an EMS interface board. I highly recommend purchasing a EMS Gateway from BBQKees ([bbqkees-electronics.nl](https://bbqkees-electronics.nl))
|
|
||||||
|
|
||||||
- Get an ESP8266 dev board (Wemos D1, Lolin, Nodemcu or equivalent)
|
|
||||||
|
|
||||||
- [Build or download the firmware](Building-firmware)
|
|
||||||
|
|
||||||
- [Upload the firmware](Uploading-firmware)
|
|
||||||
|
|
||||||
- Switch it on
|
|
||||||
|
|
||||||
- [Configure the settings](Configure-firmware)
|
|
||||||
|
|
||||||
- [Monitor what is happening](Running-and-Monitoring)
|
|
||||||
|
|
||||||
|
|
||||||
141
docs/index.html
@@ -1,141 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>EMS-ESP Documentation</title>
|
|
||||||
<link rel="icon" href="favicon.ico">
|
|
||||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
||||||
<meta name="description" content="EMS-ESP">
|
|
||||||
<meta name="keywords" content="EMS-ESP EMS esp8266 flash firmware help installation">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
|
||||||
<meta property="og:title" content="EMS-ESP">
|
|
||||||
<meta property="og:description" content="An EMS interface">
|
|
||||||
<meta property="og:image" content="https://proddy.github.io/EMS-ESP/_media/boiler_64.png">
|
|
||||||
<meta property="og:url" content="https://proddy.github.io/EMS-ESP/#/Home">
|
|
||||||
|
|
||||||
<!-- Theme: Simple Dark -->
|
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple-dark.css">
|
|
||||||
<link rel="stylesheet" href="_assets/theme-custom.css">
|
|
||||||
<!-- PrismJS theme -->
|
|
||||||
<link rel="stylesheet" href="_assets/prism.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app"></div>
|
|
||||||
<script>
|
|
||||||
window.$docsify = {
|
|
||||||
basePath : './',
|
|
||||||
themeColor : '#1FA3EC',
|
|
||||||
name : 'EMS-ESP',
|
|
||||||
nameLink : './#/Home',
|
|
||||||
homepage : 'Home.md',
|
|
||||||
logo : '/_media/EMS-ESP_logo.png',
|
|
||||||
repo : 'https://github.com/proddy/EMS-ESP',
|
|
||||||
onlyCover : true,
|
|
||||||
relativePath: false,
|
|
||||||
coverpage : false,
|
|
||||||
auto2top : true,
|
|
||||||
mergeNavbar: true,
|
|
||||||
notFoundPage: true,
|
|
||||||
maxLevel : 2,
|
|
||||||
loadSidebar: true,
|
|
||||||
autoHeader : true,
|
|
||||||
loadNavbar: true,
|
|
||||||
alias: {
|
|
||||||
'/.*/_navbar.md': '_navbar.md'
|
|
||||||
},
|
|
||||||
subMaxLevel: 3,
|
|
||||||
editLink: {
|
|
||||||
text: 'Improve this article',
|
|
||||||
repo: 'https://github.com/proddy/EMS-ESP/tree/dev/docs/',
|
|
||||||
cssClass: ''
|
|
||||||
},
|
|
||||||
ga: 'UA-140681905-2',
|
|
||||||
formatUpdated: 'Last updated {DD}.{MM}.{YYYY}',
|
|
||||||
tabs: {
|
|
||||||
persist : true, // default
|
|
||||||
sync : true, // default
|
|
||||||
theme : 'classic', // default
|
|
||||||
tabComments: true, // default
|
|
||||||
tabHeadings: true // default
|
|
||||||
},
|
|
||||||
'flexibleAlerts': {
|
|
||||||
style: 'ems-esp',
|
|
||||||
example: {
|
|
||||||
label: "Example",
|
|
||||||
icon: "fas fa-chalkboard-teacher",
|
|
||||||
className: "example"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
search: {
|
|
||||||
maxAge: 86400000,
|
|
||||||
namespace: 'docs-0',
|
|
||||||
depth: 3,
|
|
||||||
paths: [
|
|
||||||
'/',
|
|
||||||
'/Home.md',
|
|
||||||
'/README.md',
|
|
||||||
'/FAQ.md',
|
|
||||||
'/Troubleshooting.md',
|
|
||||||
'/wish-list.md',
|
|
||||||
'/Web-test.md',
|
|
||||||
'/Uploading-firmware.md',
|
|
||||||
'/Thermostat-Modes-RC35-vs-RC300.md',
|
|
||||||
'/Supported-EMS-Devices.md',
|
|
||||||
'/SM100.md',
|
|
||||||
'/Running-and-Monitoring.md',
|
|
||||||
'/RC3xx-Thermostats.md',
|
|
||||||
'/MQTT.md',
|
|
||||||
'/MC110-controller.md',
|
|
||||||
'/How-the-EMS-bus-works.md',
|
|
||||||
'/How-the-Code-Works.md',
|
|
||||||
'/Home-Assistant.md',
|
|
||||||
'/getting_started.md',
|
|
||||||
'/EMS-Telegram-Types.md',
|
|
||||||
'/Domoticz.md',
|
|
||||||
'/Deciphering-EMS-Plus.md',
|
|
||||||
'/Contributing.md',
|
|
||||||
'/Configure-firmware.md',
|
|
||||||
'/Building-your-own-test-circuit.md',
|
|
||||||
'/Building-firmware.md'
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<!-- Latest v2.x.x -->
|
|
||||||
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
|
|
||||||
<!-- docsify-tabs -->
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/docsify-tabs@1"></script>
|
|
||||||
<!-- docsify-example-panels (latest) -->
|
|
||||||
<!-- <script src="https://cdn.jsdelivr.net/npm/docsify-example-panels@1"></script> -->
|
|
||||||
<!-- Prism search plugin -->
|
|
||||||
<script src="//unpkg.com/docsify/lib/plugins/search.js"></script>
|
|
||||||
<!-- <script src="//unpkg.com/lunr/lunr.js"></script>
|
|
||||||
<script src="search.min.js"></script> -->
|
|
||||||
<!-- Flexible alerts -->
|
|
||||||
<script src="//unpkg.com/docsify-plugin-flexible-alerts"></script>
|
|
||||||
<!-- Remote Markdown -->
|
|
||||||
<script src="//unpkg.com/docsify-remote-markdown/dist/docsify-remote-markdown.min.js"></script>
|
|
||||||
<!-- copy code snippet script -->
|
|
||||||
<script src="https://unpkg.com/docsify-copy-code@2"></script>
|
|
||||||
<!-- Edit on Github on every page -->
|
|
||||||
<script src="_assets/edit-link.js"></script>
|
|
||||||
<!-- Beautiful Alerts plugin - Custom blockquote alerts -->
|
|
||||||
<script src="https://unpkg.com/docsify-plugin-flexible-alerts"></script>
|
|
||||||
<!-- Sidebar Collapse -->
|
|
||||||
<script src="//unpkg.com/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js"></script>
|
|
||||||
<!-- Image zoom -->
|
|
||||||
<script src="//unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script>
|
|
||||||
<!-- GA -->
|
|
||||||
<script src="//unpkg.com/docsify/lib/plugins/ga.min.js"></script>
|
|
||||||
<!-- Pagination -->
|
|
||||||
<script src="//unpkg.com/docsify-pagination/dist/docsify-pagination.min.js"></script>
|
|
||||||
|
|
||||||
<!-- Prism additional components -->
|
|
||||||
<script src="_assets/prism-bash.min.js"></script>
|
|
||||||
<script src="_assets/prism-yaml.min.js"></script>
|
|
||||||
<script src="_assets/prism-json.min.js"></script>
|
|
||||||
<script src="_assets/prism-ems-esp.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
- id: ems-esp_offline
|
|
||||||
alias: See if ems-esp goes offline
|
|
||||||
initial_state: true
|
|
||||||
trigger:
|
|
||||||
platform: state
|
|
||||||
entity_id: sensor.ems_esp_status
|
|
||||||
to: offline
|
|
||||||
action:
|
|
||||||
- service: notify.admin_notify
|
|
||||||
data_template:
|
|
||||||
title: EMS-ESP
|
|
||||||
message: 'gone offline'
|
|
||||||
|
|
||||||
- id: emsesp_restart
|
|
||||||
alias: See if ems-esp restarts
|
|
||||||
initial_state: true
|
|
||||||
trigger:
|
|
||||||
platform: mqtt
|
|
||||||
topic: home/ems-esp/start
|
|
||||||
payload: start
|
|
||||||
action:
|
|
||||||
- service: notify.admin_notify
|
|
||||||
data_template:
|
|
||||||
title: ems-esp has booted
|
|
||||||
message: EMS-ESP
|
|
||||||
- service: mqtt.publish
|
|
||||||
data_template:
|
|
||||||
topic: home/ems-esp/start
|
|
||||||
payload: '{{ now().strftime("%H:%M:%S %-d/%b/%Y") }}'
|
|
||||||
|
|
||||||
- id: boiler_shower
|
|
||||||
alias: Alert shower time
|
|
||||||
initial_state: true
|
|
||||||
trigger:
|
|
||||||
platform: state
|
|
||||||
entity_id: sensor.last_shower_duration
|
|
||||||
action:
|
|
||||||
- service: notify.admin_notify
|
|
||||||
data_template:
|
|
||||||
title: Shower finished at {{states.sensor.time.state}}
|
|
||||||
message: "{{ states.sensor.last_shower_duration.state }}"
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
- platform: mqtt
|
|
||||||
name: 'Tap Water'
|
|
||||||
state_topic: 'home/ems-esp/tapwater_active'
|
|
||||||
payload_on: "1"
|
|
||||||
payload_off: "0"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
name: 'Heating'
|
|
||||||
state_topic: 'home/ems-esp/heating_active'
|
|
||||||
payload_on: "1"
|
|
||||||
payload_off: "0"
|
|
||||||
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
- platform: mqtt
|
|
||||||
name: Thermostat
|
|
||||||
modes:
|
|
||||||
- "auto"
|
|
||||||
- "heat"
|
|
||||||
- "off"
|
|
||||||
|
|
||||||
mode_command_topic: "home/ems-esp/thermostat_cmd_mode1"
|
|
||||||
temperature_command_topic: "home/ems-esp/thermostat_cmd_temp1"
|
|
||||||
|
|
||||||
mode_state_topic: "home/ems-esp/thermostat_data"
|
|
||||||
current_temperature_topic: "home/ems-esp/thermostat_data"
|
|
||||||
temperature_state_topic: "home/ems-esp/thermostat_data"
|
|
||||||
|
|
||||||
mode_state_template: "{% if value_json.hc1.mode in ['manual', 'day'] %} heat {% elif value_json.hc1.mode in ['night', 'off'] %} off {% else %} auto {% endif %}"
|
|
||||||
|
|
||||||
current_temperature_template: "{{ value_json.hc1.currtemp }}"
|
|
||||||
temperature_state_template: "{{ value_json.hc1.seltemp }}"
|
|
||||||
|
|
||||||
temp_step: 0.5
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
name: boiler
|
|
||||||
modes:
|
|
||||||
- "auto"
|
|
||||||
- "off"
|
|
||||||
min_temp: 40
|
|
||||||
max_temp: 60
|
|
||||||
temp_step: 1
|
|
||||||
|
|
||||||
current_temperature_topic: "home/ems-esp/boiler_data"
|
|
||||||
temperature_state_topic: "home/ems-esp/boiler_data"
|
|
||||||
mode_state_topic: "home/ems-esp/boiler_data"
|
|
||||||
|
|
||||||
current_temperature_template: "{{ value_json.wWCurTmp }}"
|
|
||||||
temperature_state_template: "{{ value_json.wWSelTemp }}"
|
|
||||||
mode_state_template: "{% if value_json.wWActivated == 'off' %} off {% else %} auto {% endif %}"
|
|
||||||
|
|
||||||
temperature_command_topic: "home/ems-esp/boiler_cmd_wwtemp"
|
|
||||||
mode_command_topic: "home/ems-esp/boiler_cmd_wwactivated"
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
sensor.boiler_boottime:
|
|
||||||
friendly_name: Controller last restart
|
|
||||||
icon: mdi:clock-start
|
|
||||||
|
|
||||||
sensor.showertime_time:
|
|
||||||
friendly_name: 'Last shower at'
|
|
||||||
icon: mdi:timelapse
|
|
||||||
|
|
||||||
sensor.boiler_updated:
|
|
||||||
friendly_name: 'Data last received'
|
|
||||||
icon: mdi:clock-start
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Home Assistant Files
|
|
||||||
|
|
||||||
* <a href="integrations/homeassistant/automation.yaml">automation.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/binary_sensor.yaml">binary_sensor.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/climate.yaml">climate.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/customize.yaml">customize.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/notify.yaml">notify.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/script.yaml">script.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/sensor.yaml">sensor.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/switch.yaml">switch.yaml</a>
|
|
||||||
* <a href="integrations/homeassistant/ui-lovelace.yaml">ui-lovelace.yaml</a>
|
|
||||||
|
|
||||||
Make sure you include these YAML files in your `configuration.yaml` file, e.g.
|
|
||||||
```yaml
|
|
||||||
script: !include script.yaml
|
|
||||||
sensor: !include sensor.yaml
|
|
||||||
switch: !include switch.yaml
|
|
||||||
notify: !include notify.yaml
|
|
||||||
climate: !include climate.yaml
|
|
||||||
automation: !include automation.yaml
|
|
||||||
binary_sensor: !include binary_sensor.yaml
|
|
||||||
```
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
- name: pushover
|
|
||||||
platform: pushover
|
|
||||||
api_key: !secret pushover_api_key
|
|
||||||
user_key: !secret pushover_user_key
|
|
||||||
|
|
||||||
- name: general_notify
|
|
||||||
platform: group
|
|
||||||
services:
|
|
||||||
- service: ios_pauls_iphone
|
|
||||||
- service: pushover
|
|
||||||
|
|
||||||
- name: admin_notify
|
|
||||||
platform: group
|
|
||||||
services:
|
|
||||||
- service: ios_pauls_iphone
|
|
||||||
- service: pushover
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# ems-esp
|
|
||||||
shower_coldshot:
|
|
||||||
sequence:
|
|
||||||
- service: mqtt.publish
|
|
||||||
data_template:
|
|
||||||
topic: 'home/ems-esp/generic_cmd'
|
|
||||||
payload: '{cmd:"coldshot"}'
|
|
||||||
|
|
||||||
@@ -1,146 +0,0 @@
|
|||||||
|
|
||||||
# thermostat HC1
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/thermostat_data'
|
|
||||||
name: 'Current Room Temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: "{{ value_json.hc1.currtemp }}"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/thermostat_data'
|
|
||||||
name: 'Current Set Temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: "{{ value_json.hc1.seltemp }}"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/thermostat_data'
|
|
||||||
name: 'Current Mode'
|
|
||||||
value_template: "{{ value_json.hc1.mode }}"
|
|
||||||
|
|
||||||
# boiler
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Warm Water selected temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.wWSelTemp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Warm Water tapwater flow rate'
|
|
||||||
unit_of_measurement: 'l/min'
|
|
||||||
value_template: '{{ value_json.wWCurFlow }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Warm Water current temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.wWCurTmp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Warm Water activated'
|
|
||||||
value_template: '{{ value_json.wWActivated }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Warm Water 3-way valve'
|
|
||||||
value_template: '{{ value_json.wWHeat }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Current flow temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.curFlowTemp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Return temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.retTemp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Gas'
|
|
||||||
value_template: '{{ value_json.burnGas }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Boiler pump'
|
|
||||||
value_template: '{{ value_json.heatPmp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Fan'
|
|
||||||
value_template: '{{ value_json.fanWork }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Ignition'
|
|
||||||
value_template: '{{ value_json.ignWork }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Circulation pump'
|
|
||||||
value_template: '{{ value_json.wWCirc }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Burner max power'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.selBurnPow }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Burner max power'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.selBurnPow }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Burner current power'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.curBurnPow }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'System Pressure'
|
|
||||||
unit_of_measurement: 'bar'
|
|
||||||
value_template: '{{ value_json.sysPress }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Boiler temperature'
|
|
||||||
unit_of_measurement: '°C'
|
|
||||||
value_template: '{{ value_json.boilTemp }}'
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/boiler_data'
|
|
||||||
name: 'Pump modulation'
|
|
||||||
unit_of_measurement: '%'
|
|
||||||
value_template: '{{ value_json.pumpMod }}'
|
|
||||||
|
|
||||||
# shower time duration
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
name: 'Last shower duration'
|
|
||||||
state_topic: "home/ems-esp/shower_data"
|
|
||||||
value_template: "{{ value_json.duration | is_defined }}"
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
showertime_time:
|
|
||||||
value_template: '{{ as_timestamp(states.sensor.last_shower_duration.last_updated) | int | timestamp_custom("%-I:%M on %a %-d %b") }}'
|
|
||||||
|
|
||||||
boiler_updated:
|
|
||||||
value_template: '{{ as_timestamp(states.sensor.boiler_temperature.last_updated) | timestamp_custom("%H:%M on %d/%b") }}'
|
|
||||||
|
|
||||||
boiler_boottime:
|
|
||||||
value_template: '{{ as_timestamp(states.automation.see_if_boiler_restarts.attributes.last_triggered) | timestamp_custom("%H:%M:%S %d/%m/%y") }}'
|
|
||||||
|
|
||||||
# general
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
state_topic: 'home/ems-esp/status'
|
|
||||||
name: 'ems-esp status'
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# EMS-ESP
|
|
||||||
- platform: mqtt
|
|
||||||
name: "Shower Timer"
|
|
||||||
state_topic: "home/ems-esp/shower_data"
|
|
||||||
value_template: "{{ value_json.timer }}"
|
|
||||||
command_topic: "home/ems-esp/shower_data"
|
|
||||||
payload_on: '{"timer":"1"}'
|
|
||||||
payload_off: '{"timer":"0"}'
|
|
||||||
state_on: "1"
|
|
||||||
state_off: "0"
|
|
||||||
|
|
||||||
- platform: mqtt
|
|
||||||
name: "Long Shower Alert"
|
|
||||||
state_topic: "home/ems-esp/shower_data"
|
|
||||||
value_template: "{{ value_json.alert }}"
|
|
||||||
command_topic: "home/ems-esp/shower_data"
|
|
||||||
payload_on: '{"alert":"1"}'
|
|
||||||
payload_off: '{"alert":"0"}'
|
|
||||||
state_on: "1"
|
|
||||||
state_off: "0"
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
- id: ems-esp_id0
|
|
||||||
title: Heating
|
|
||||||
cards:
|
|
||||||
- id: ems-esp_id1
|
|
||||||
type: glance
|
|
||||||
entities:
|
|
||||||
- entity: binary_sensor.tap_water
|
|
||||||
icon: mdi:fire
|
|
||||||
- entity: binary_sensor.heating
|
|
||||||
icon: mdi:radiator
|
|
||||||
- id: ems-esp_id2
|
|
||||||
type: entities
|
|
||||||
title: Boiler
|
|
||||||
show_header_toggle: false
|
|
||||||
entities:
|
|
||||||
- sensor.boiler_boottime
|
|
||||||
- sensor.boiler_updated
|
|
||||||
- sensor.ems_esp_status
|
|
||||||
- type: divider
|
|
||||||
- sensor.warm_water_selected_temperature
|
|
||||||
- sensor.warm_water_current_temperature
|
|
||||||
- sensor.warm_water_activated
|
|
||||||
- sensor.warm_water_3_way_valve
|
|
||||||
- type: divider
|
|
||||||
- sensor.boiler_temperature
|
|
||||||
- sensor.return_temperature
|
|
||||||
- sensor.current_flow_temperature
|
|
||||||
- sensor.pump_modulation
|
|
||||||
- sensor.ignition
|
|
||||||
- sensor.gas
|
|
||||||
- sensor.fan
|
|
||||||
- sensor.boiler_pump
|
|
||||||
- sensor.system_pressure
|
|
||||||
- sensor.burner_max_power
|
|
||||||
- sensor.burner_current_power
|
|
||||||
|
|
||||||
- id: ems-esp_id3
|
|
||||||
type: vertical-stack
|
|
||||||
cards:
|
|
||||||
- type: entities
|
|
||||||
title: Shower Monitor
|
|
||||||
show_header_toggle: false
|
|
||||||
entities:
|
|
||||||
- switch.shower_timer
|
|
||||||
- switch.long_shower_alert
|
|
||||||
- type: divider
|
|
||||||
- sensor.last_shower_duration
|
|
||||||
- sensor.showertime_time
|
|
||||||
- type: entity-button
|
|
||||||
icon: mdi:shower-head
|
|
||||||
name: send a cold shot of shower water
|
|
||||||
entity: script.shower_coldshot
|
|
||||||
tap_action:
|
|
||||||
action: call-service
|
|
||||||
service: script.turn_on
|
|
||||||
service_data:
|
|
||||||
entity_id: script.shower_coldshot
|
|
||||||
|
|
||||||
- type: history-graph
|
|
||||||
entities:
|
|
||||||
- sensor.ems_esp_wifi
|
|
||||||
- sensor.ems_esp_freemem
|
|
||||||
|
|
||||||
- id: ems-esp_id4
|
|
||||||
type: vertical-stack
|
|
||||||
cards:
|
|
||||||
- type: history-graph
|
|
||||||
entities:
|
|
||||||
- sensor.pc_room_sensor_temperature
|
|
||||||
- sensor.current_room_temperature
|
|
||||||
- sensor.dark_sky_temperature
|
|
||||||
- type: thermostat
|
|
||||||
entity: climate.thermostat
|
|
||||||
- type: thermostat
|
|
||||||
entity: climate.boiler
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
The feature backlog is maintained in the GitHub Projects which you can find [here](https://github.com/proddy/EMS-ESP/projects/1).
|
|
||||||
|
|
||||||
Top of mind, these are the new features when I plan to address:
|
|
||||||
|
|
||||||
- Measure the amount of gas in m3 per day for the hot water vs the central heating, and convert this into cost.
|
|
||||||
- Support changing temperatures on an Nefit Easy. To do this we must send XMPP messages directly to the thermostat. There is already a TCP stack and a Wifi and Telnet server running in the code, so the building blocks are there to extend with another XMPP client. Here are a number of Python based projects that show how to do this:
|
|
||||||
- https://github.com/patvdleer/nefit-client-python
|
|
||||||
- https://github.com/marconfus/ha-nefit
|
|
||||||
- https://github.com/robertklep/nefit-easy-core
|
|
||||||
- Improve detection of Heating Off without checking for selFlowTemp (selected flow temperature)
|
|
||||||
- Split MQTT into smaller chunks. Now the messages can be up to 600 bytes which may cause issues. Preferably make the topic items configurable.
|
|
||||||