moved wiki again

This commit is contained in:
Paul
2020-01-11 15:09:33 +01:00
parent 7b561f0540
commit a38e21ac89
65 changed files with 10 additions and 2302 deletions

View File

@@ -1,5 +1,4 @@
![logo](docs/_media/logo-proddy-fw.jpg)
# EMS-ESP
![logo](docs/_media/logo/EMS-ESP_logo_dark.png)
[![version](https://img.shields.io/github/release/proddy/EMS-ESP.svg?label=Latest%20Release)](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
[![release-date](https://img.shields.io/github/release-date/proddy/EMS-ESP.svg?label=Released)](https://github.com/proddy/EMS-ESP/commits/master)
@@ -10,12 +9,14 @@
[![downloads](https://img.shields.io/github/downloads/proddy/EMS-ESP/total.svg)](https://github.com/proddy/EMS-ESP/releases)
<br />
[![gitter](https://img.shields.io/gitter/room/EMS-ESP/EMS-ESP.svg)](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.
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
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.
| ![on boiler](docs/_media/ems%20gateway/on-boiler.jpg) | ![kit](docs/_media/ems%20gateway/ems-kit-2.jpg) | ![basic circuit](docs/_media/ems%20gateway/ems-board-white.jpg) |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |

View File

@@ -1 +0,0 @@

View File

@@ -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
```

View File

@@ -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.
![Breadboard Circuit](_media/schematics/breadboard.png ':size=500')
The schematic used:
![Schematic](_media/schematics/circuit.png ':size=500')
*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**
![Power circuit](_media/schematics/Schematic_EMS-ESP.png ':size=600') |

View File

@@ -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).

View File

@@ -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".

View File

@@ -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)
```

View File

@@ -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.

View File

@@ -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?

View File

@@ -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.

View File

@@ -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:
![Home Assistant panel](_media/home%20assistant/ha.png ':size=500')
and the alerts on an iOS/Android device using PushBullet, PushOver or any notification service would look like:
![Home Assistant iPhone notify](_media/home%20assistant/ha_notify.jpg ':size=300')
## 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 }}'
```

View File

@@ -1,61 +0,0 @@
<img style="margin: 10px 10px; float:right; width:20%" src="_media/boiler.svg" alt="EMS-ESP Logo"></img>
[![version](https://img.shields.io/github/release/proddy/EMS-ESP.svg?label=Latest%20Release)](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
[![release-date](https://img.shields.io/github/release-date/proddy/EMS-ESP.svg?label=Released)](https://github.com/proddy/EMS-ESP/commits/master)
[![license](https://img.shields.io/github/license/proddy/EMS-ESP.svg)](LICENSE)
[![travis](https://travis-ci.com/proddy/EMS-ESP.svg?branch=master)](https://travis-ci.com/proddy/EMS-ESP)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/b8880625bdf841d4adb2829732030887)](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)
[![downloads](https://img.shields.io/github/downloads/proddy/EMS-ESP/total.svg)](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.

View File

@@ -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.

View File

@@ -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()`.

View File

@@ -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)
```

View File

@@ -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/).

View File

@@ -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)
```

View File

@@ -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.png ":no-zoom")
```
### Image resizing
Due to click on zoom you can directly link to a big image but make it render smaller on the page:
```
![logo](https://docsify.js.org/_media/icon.svg ':size=50x100')
![logo](https://docsify.js.org/_media/icon.svg ':size=100')
<!-- Supports percentage -->
![logo](https://docsify.js.org/_media/icon.svg ':size=10%')
```
### 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 -->
```

View File

@@ -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:
![Telnet](_media/telnet/telnet_menu.jpg)
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.
![Telnet](_media/telnet/telnet_verbose.PNG)
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.
![Telnet](_media/telnet/telnet_stats.PNG)
**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
```

View File

@@ -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"
```

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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`

View File

@@ -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**.

View File

@@ -1 +0,0 @@
[remoteMarkdownUrl](https://raw.githubusercontent.com/proddy/EMS-ESP/dev/CHANGELOG.md)

View File

@@ -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)

File diff suppressed because one or more lines are too long

View File

@@ -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
},
};

View File

@@ -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);

View File

@@ -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"}};

View File

@@ -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;

View File

@@ -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 */
}

File diff suppressed because one or more lines are too long

View File

@@ -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;
}

View File

@@ -1,12 +0,0 @@
##### Device ID
TBD
##### Product ID
TBD
##### Telegram
TBD

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 594 B

After

Width:  |  Height:  |  Size: 594 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 856 B

After

Width:  |  Height:  |  Size: 856 B

View File

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -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)

View File

@@ -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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -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)

View File

@@ -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>

View File

@@ -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 }}"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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
```

View File

@@ -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

View File

@@ -1,8 +0,0 @@
# ems-esp
shower_coldshot:
sequence:
- service: mqtt.publish
data_template:
topic: 'home/ems-esp/generic_cmd'
payload: '{cmd:"coldshot"}'

View File

@@ -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'

View File

@@ -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"

View File

@@ -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

View File

@@ -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.