Git Product home page Git Product logo

ebusd-brink-hru's Introduction

ebusd-brink-hru

Collection of Brink HRU configuration files for ebusd

The configuration files were created by parsing the Brink Service Tool decompiled through JetBrains DotPeak. The decompiled source code is not distributed in this repo for it likely being a violation of the license agreement, though decompiling SW with the intention of interfacing to it can be considered legal. This is also a reason why parsing the code through independent python script was used, rather than re-using portions of the decompiled source code in a new C# binary.

For few parameters, other sources than the decompiled Brink Service Tool was used, such as datasheets, random internet forums etc. This is always noted in the source code, or even in the produced files.

Supported devices

Currently, the ebusd-configuration for these heat recovery units is present:

  • Brink CWLF250
  • Brink CWLF350
  • Brink CWLTower300
  • Brink ConstantRPM400
  • Brink DecentralAir70
  • Brink Elan10
  • Brink Elan4
  • Brink Renovent Excellent180
  • Brink Renovent Excellent300
  • Brink Renovent Excellent400
  • Brink Renovent Excellent450
  • Brink Flair200
  • Brink Flair225
  • Brink Flair300
  • Brink Flair325
  • Brink Flair400
  • Brink Flair450
  • Brink Flair600
  • Brink MultiRoomCtrlT01
  • Brink Nather300
  • Brink RenoventElan300
  • Brink Renovent Sky150
  • Brink Renovent Sky200
  • Brink Renovent Sky300
  • Brink ValveT01
  • Viessmann Vitovent200W
  • Viessmann Vitovent300C
  • Viessmann Vitovent300W300
  • Viessmann Vitovent300W400
  • Viessmann Vitovent300WH32SA225
  • Viessmann Vitovent300WH32SA600
  • Viessmann Vitovent300WH32SC400
  • Viessmann Vitovent300WH32SC325

Note, that Brink devices are re-branded as Viessmann, Wolf, VisionAIR, Ubbink and maybe others, os these configuration files are (mostly) applicable for those as well.

repo structure

ebusd-configuration-known-slave-address

If you find your device in this folder, you may consider yourself lucky - there can be used verbatim in ebusd. The files contain parameters for the latest SW version, for the 'Plus' variant of the HRU unit, so not all parameters might be applicable for your device. If you want a .csv file that matches your device perfectly, you need to look into ebusd-configuration-unknown-slave-address

All files are provided with language mutations for English, German, French, Italian, Spanish, Dutch and Polish in the respective subdirectories.

ebusd-configuration-unknown-slave-address

This folder contains all known Brink devices in all known SW versions and basic/plus variants of HW.

All files are provided with language mutations for English, German, French, Italian, Spanish, Dutch and Polish in the respective subdirectories.

The naming format is [device].[first_sw_version].[last_sw_version].[plus].csv (Files for basic devices, or for devices that does not even have a 'plus' variant have no 'plus' suffix)

The use is simple:

  1. Find out your device type and SW version (e.g. from the wall controller) and pick the appropriate file.
  2. Figure out the slave address of your device (can be easily found from ebusd logs - Brink devices respond as manufacturer ENCON to the 0704 id scan message, which might help you to find it)
  3. Rename the file to that address (in hexa, e.g. 3c.csv)
  4. In the file, replace [fill_your_slave_address_here] with slave address of your device, (e.g. '3c')
  5. Now you can use the file in ebusd

ebusd-mqtt

Contains useful adaptation of the mqtt-hassio.cfg file from the ebus repo, that is suitable for controlling Brink HRUs. The original is aimed mostly at water heaters and not ventilation units, so it was extended.

ebusd-scan

This is work-in-progress. The hope is, that we would be able to automate the selection of right file in ebusd through properly scanning various fields in this file, however, after several tries, this looks like way more difficult thing to achieve, than originally thought.

src

Contains the python scripts used to parse the decompiled Brink Service Tool. They are not exactly pretty, but they do the jobs and they contain reasonable number of sanity checks. The scripts are expected to be run from the root repo directory, i.e. python .\src\main.py

BCSServiceTool

This folder is expected to be filled in with the decompiled binary.

The version of tool used and tested with the parsing scripts is 'S1_04_11_0002'

dump

Contains dump of the parsed data in fairly re-usable JSON and CSV formats. if you plan to integrate Brink HRUs in other software than ebusd, this is the place to go.

Future work

  • structure config files better with using !include instructions and conditions
  • find out slave IDs for more Brink HRUs

ebusd-brink-hru's People

Contributors

pvyleta avatar

Stargazers

Christiaan de Ridder avatar  avatar

Watchers

 avatar  avatar

Forkers

rondoval

ebusd-brink-hru's Issues

Deciphering FanMode

Hi!

First of all I would like to thank you for publishing these configuration files, as they helped me a lot getting ebusd configured for my Brink HRU unit.

While doing so I noticed that my setup is slightly different from the config files. For example, I had to read the CO2 sensor values separately from another ebus circuit instead of getting them from the HRU itself. (see my comment in #3 (comment)).

I also ran into some issues with the FanMode. For my setup, reading the value seems to work fine, but writing a value seems to have no effect. Both FanMode 40 A1 and FanModeAlternative 40 CB - 01 01 do nothing, even with the Air control panel disconnected.

When the Air control panel is connected, I do see it spamming 40 A1 with FF FF FF 00 00. My guess is that this is related to CO2 demand mode.

When changing the speed using the physical switch or using the Air control panel, I do see a lot of activity on 40 A3. I noticed that you code had a reference to this too at https://github.com/pvyleta/ebusd-brink-hru/blob/main/src/ebus_message.py#L134-L145 . I also had a look at the service tool .NET code but could not find any additional references to this address.

My first suspicion is that it has something to do with CO2 demand mode and it being overridden by a set fan speed.

I am using the following config to monitor the commands:

# Original fan mode fields
#w,,FanMode,FanMode,,,40a1,,,,ULR,0x0=Holiday;0x00010001=Reduced;0x00020002=Normal;0x00030003=High;0xffffff00=Unknown,
#w,,FanModeAlternative,FanModeAlternative,,,40cb,0101,,,UIR,0=Holiday;1=Reduced;2=Normal;3=High,,

# Figure out what these are
w,,FanMode40A1,FanMode40A1,,,40a1,,,,HEX:*
w,,FanMode40CB0101,FanMode40CB0101,,,40cb,0101,,,HEX:*
w,,FanMode40A301,FanMode40A301,,,40a3,01,,,HEX:*
w,,FanMode40A302,FanMode40A302,,,40a3,02,,,HEX:*
w,,FanMode40A303,FanMode40A303,,,40a3,03,,,HEX:*

I was also wondering how it ended up in the python code above and why it was commented out in the end.

I would happily help out deciphering the meaning of these commands, as I can easily trigger them on my system.

Zone Valve (demand ventilation)

Hi Peter,

by any chance, do you have any advise how to proceed in case of demand ventilation (Brink Flair 325 + Zone Valve + Air Control)? I replaced Air Control with eBUS Adapter Shield v5 and I want to read CO2 values (wires goes to Zone Valve, main unit does not recognise it, only Air Control) and control the position of Zone Valve.

Thx in advance,

Martin

Missing parameters

I own a Brink Renovent Excellent 300+ with sw version S1.06.08 0007 and a Brink Air Control wall module, sw version S2.01.09

Questions:
Wich config file should I use?
I tried the Dutch version Excellent300.10608.10706.plus.csv but I'm missing a few parameters in Home Assistant, such as Bypass Hystereses ,Set Bypass Mode, 0-10vSettings, UnbalanceMode amongst others.

For some reasons settings are read-only. If a change Ventilator Mode, it changes back to its previous setting. Same goes for a few other settings.

What am I doing wrong?

ebusd configuration help

Hi Petr,
I'm new and I don't really understand how to configure the ebusd to read\write the parameters of my Renovent Excellent 300.
I bought the v5 shield adapter and connected it in parallel to the same cables that go into the air control. Is this correct as a physical connection?

Brink Excellent 300 SW 108.08.0001
I try whit know slave 3c file and olso with specific version but same result.

The ebusd daemon runs on docker as a container with this compose.

ebusd:
image: john30/ebusd
networks:
default:
ipv4_address: 172.18.0.13
container_name: ebusd
volumes:
- ./ebusd/tmp:/tmp
restart: unless-stopped
ports:
- 8888:8888
# when enabling the HTTP port, add it to the published ports as well:
#- 8080:8080
#devices:
# when using an USB device, make sure to hand it in to the container like this:
#- /dev/ttyUSB0:/dev/ttyUSB0
environment:
# Device options:
# Use DEV as eBUS device ("enh:DEVICE" or "enh:IP:PORT" for enhanced device, "ens:DEVICE" for enhanced high speed
# serial device, "DEVICE" for serial device, or "[udp:]IP:PORT" for network device)
EBUSD_DEVICE: "enh:myip:9999"
# Skip serial eBUS device test
#EBUSD_NODEVICECHECK: ""
# Only read from device, never write to it
#EBUSD_READONLY: ""
# Send an initial escape symbol after connecting device
#EBUSD_INITSEND: ""
# Extra transfer latency in ms
EBUSD_LATENCY: 0
# Message configuration options:
# Read CSV config files from PATH (local folder or HTTPS URL)
EBUSD_CONFIGPATH: "/tmp"
# Pick CSV config files matching initial scan (ADDR="none" or empty for no initial scan message, "full" for full
# scan, or a single hex address to scan, default is broadcast ident message).
#EBUSD_SCANCONFIG: "3c"
# Prefer LANG in multilingual configuration files
#EBUSD_CONFIGLANG: "it"
# Poll for data every SEC seconds (0=disable)
#EBUSD_POLLINTERVAL: 10
# Use CA FILE for checking certificates (uses defaults, "#" for insecure)
#EBUSD_CAFILE: "/path/to/cafile"
# Use CA PATH for checking certificates (uses defaults)
#EBUSD_CAPATH: "/path/to/cafiles"
# eBUS options:
# Use ADDR as own bus address
#EBUSD_ADDRESS: ff
# Actively answer to requests from other masters
#EBUSD_ANSWER: ""
# Stop bus acquisition after MSEC ms
#EBUSD_ACQUIRETIMEOUT: 10
# Retry bus acquisition COUNT times
#EBUSD_ACQUIRERETRIES: 3
# Repeat failed sends COUNT times
#EBUSD_SENDRETRIES: 2
# Expect a slave to answer within MSEC ms
#EBUSD_RECEIVETIMEOUT: 50
# Expect COUNT masters on the bus, 0 for auto detection
#EBUSD_NUMBERMASTERS: 0
# Enable AUTO-SYN symbol generation
#EBUSD_GENERATESYN: ""
# Daemon options:
# Set default access level to LEVEL ("" for everything)
#EBUSD_ACCESSLEVEL: "
"
# Read access control list from FILE
#EBUSD_ACLFILE: "/path/to/aclfile"
# Enable hex command
#EBUSD_ENABLEHEX: ""
# Enable define command
#EBUSD_ENABLEDEFINE: ""
# PID file name (only for daemon)
#EBUSD_PIDFILE: "/var/run/ebusd.pid"
# Listen for command line connections on PORT
#EBUSD_PORT: 8888
# Listen for command line connections on 127.0.0.1 interface only
#EBUSD_LOCALHOST: ""
# Listen for HTTP connections on PORT, 0 to disable
#EBUSD_HTTPPORT: 8080
# Path for HTML files served by HTTP port
#EBUSD_HTMLPATH: "/var/ebusd/html"
# Set automatic update check to MODE (on|off)
#EBUSD_UPDATECHECK: "on"
# Log options:
# Write log to FILE (only for daemon, empty string for using syslog)
#EBUSD_LOGFILE: "/var/log/ebusd.log"
# Only write log for matching AREA(S) below or equal to LEVEL (alternative to EBUSD_LOGAREAS/EBUSD_LOGLEVEL, may
# be used multiple times)
#EBUSD_LOG: "all:notice"
# Only write log for matching AREA(S): main|network|bus|update|other|all
#EBUSD_LOGAREAS: "all"
# Only write log below or equal to LEVEL: error|notice|info|debug
#EBUSD_LOGLEVEL: "notice"
# Raw logging options:
# Log messages or all received/sent bytes on the bus
#EBUSD_LOGRAWDATA: ""
# Write raw log to FILE
#EBUSD_LOGRAWDATAFILE: "/var/log/ebusd.log"
# Make raw log file no larger than SIZE kB
#EBUSD_LOGRAWDATASIZE: 100
# Binary dump options:
# Enable binary dump of received bytes
#EBUSD_DUMP: ""
# Dump received bytes to FILE
#EBUSD_DUMPFILE: "/tmp/ebusd_dump.bin"
# Make dump file no larger than SIZE kB
#EBUSD_DUMPSIZE: 100
# Flush each byte
#EBUSD_DUMPFLUSH: ""
# MQTT options:
# Connect to MQTT broker on HOST
EBUSD_MQTTHOST: "ipmqtthost"
# Connect to MQTT broker on PORT (usually 1883), 0 to disable
EBUSD_MQTTPORT: 1883
# Set client ID for connection to MQTT broker
#EBUSD_MQTTCLIENTID: "ebusd"
# Connect as USER to MQTT broker (no default)
EBUSD_MQTTUSER: "xxx"
# Use PASSWORD when connecting to MQTT broker (no default)
EBUSD_MQTTPASS: "xxx"
# Use MQTT TOPIC (prefix before /%circuit/%name or complete format)
#EBUSD_MQTTTOPIC: "ebusd"
# Use TOPIC for global data (default is "global/" suffix to mqtttopic prefix)
#EBUSD_MQTTGLOBAL: "ebusd/global/"
# Retain all topics instead of only selected global ones
#EBUSD_MQTTRETAIN: ""
# Set the QoS value for all topics (0-2)
#EBUSD_MQTTQOS: 0
# Read MQTT integration settings from FILE (no default)
EBUSD_MQTTINT: "/tmp/mqtt-hassio.cfg"
# Add variable(s) to the read MQTT integration settings
#EBUSD_MQTTVAR: "key=value"
# Publish in JSON format instead of strings, optionally in short (value directly below field key)
#EBUSD_MQTTJSON: ""
# Publish all available attributes
#EBUSD_MQTTVERBOSE: ""
# Log library events
#EBUSD_MQTTLOG: ""
# Use protocol VERSION
#EBUSD_MQTTVERSION: "3.1"
# Ignore invalid parameters during init (e.g. for DNS not resolvable yet)
#EBUSD_MQTTIGNOREINVALID: ""
# Whether to only publish changed messages instead of all received
#EBUSD_MQTTCHANGES: ""
# Use CA file or dir (ending with '/') for MQTT TLS (no default)
#EBUSD_MQTTCA: "/path/to/cafile"
# Use CERTFILE for MQTT TLS client certificate (no default)
#EBUSD_MQTTCERT: "/path/to/certfile"
# Use KEYFILE for MQTT TLS client certificate (no default)
#EBUSD_MQTTKEY: "/path/to/keyfile"
# Use PASSWORD for the encrypted KEYFILE (no default)
#EBUSD_MQTTKEYPASS: "some-passwort"
# Allow insecure TLS connection (e.g. using a self signed certificate)
#EBUSD_MQTTINSECURE: ""
# KNX options:
# URL to open (i.e. "[multicast][@interface]" for KNXnet/IP)
#EBUSD_KNXURL: ""
# Maximum age in seconds for using the last value of read messages (0=disable)
#EBUSD_KNXRAGE: 30
# Maximum age in seconds for using the last value for reads on write messages (0=disable),
#EBUSD_KNXWAGE: 7200
# Read KNX integration settings from FILE
#EBUSD_KNXINT: "/etc/ebusd/knx.cfg"
# Add variable(s) to the read KNX integration settings
#EBUSD_KNXVAR: "address=1.1.1"
# when using the optional mqtt container below, add the dependency here:
depends_on:
- mosquitto
-
In the container log I find this:

2024-05-31 12:23:33.694 [bus notice] device status: transport opened
2024-05-31 12:23:33.695 [main notice] ebusd 23.3.23.3 started with broadcast scan on device: 192.168.2.58:9999, TCP, enhanced
2024-05-31 12:23:33.700 [bus notice] bus started with own address 31/36
2024-05-31 12:23:33.700 [bus notice] signal acquired
2024-05-31 12:23:33.701 [mqtt notice] connection established
2024-05-31 12:23:33.725 [bus notice] device status: reset, supports info
2024-05-31 12:23:33.770 [bus notice] device status: extra info: firmware 1.1[451a].1[451a], jumpers 0x0b
2024-05-31 12:23:33.872 [bus notice] new master 1f, master count 2
2024-05-31 12:23:36.535 [bus notice] new master 37, master count 3
2024-05-31 12:23:36.536 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:23:41.553 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:23:43.700 [main notice] starting initial broadcast scan
2024-05-31 12:23:43.859 [bus error] send to fe: ERR: wrong symbol received, retry
2024-05-31 12:23:43.978 [bus error] send to fe: ERR: SYN received, retry
2024-05-31 12:23:44.167 [bus error] send to fe: ERR: read timeout
2024-05-31 12:23:44.167 [main error] initial scan failed: ERR: read timeout
2024-05-31 12:23:46.525 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:23:48.311 [update notice] received unknown MS cmd: 1f3c40ca0101 / 06000100733000
2024-05-31 12:23:49.897 [bus error] poll Excellent300 CondizioniIngressoDiContatto1 failed: ERR: read timeout
2024-05-31 12:23:51.487 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:23:54.168 [main notice] starting initial broadcast scan
2024-05-31 12:23:54.356 [bus error] send to fe: ERR: SYN received, retry
2024-05-31 12:23:54.505 [bus error] send to fe: ERR: read timeout, retry
2024-05-31 12:23:54.655 [bus error] send to fe: ERR: read timeout
2024-05-31 12:23:54.655 [main error] initial scan failed: ERR: read timeout
2024-05-31 12:23:55.126 [bus error] poll Excellent300 CondizioniIngressoDiContatto2 failed: ERR: read timeout
2024-05-31 12:23:56.970 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:24:01.110 [bus error] poll Excellent300 CronologiaDegliErrori failed: ERR: SYN received
2024-05-31 12:24:01.932 [update notice] received read Excellent300 PosizioneVentilatore QQ=1f: Reduced
2024-05-31 12:24:04.656 [main notice] starting initial broadcast scan
2024-05-31 12:24:04.791 [bus error] send to fe: ERR: read timeout, retry

basically I only receive FanPosition while everything else goes into error.
I try olso disconnect the airControll but same result. Do you have any advice?

New settings don't apply permanently

Hi Petr,
As discussed in a previous "issue", I took out the Air Control and have HomeAssistant take over. I edited filter-name=* in mqtt-hassio.cfg and took out lines from the configfile that don't seem to apply to my Excellent300+. All relevant entities show up in HomeAssistant, but if I change a setting, it only changes for aprox. 2 minutes and then reverts to the default setting. The new setting reaches the Excellent for sure because for 2 minutes the ventilation spins harder.
For some reason the data (new setting) does not retain. This goes for all new settings.

My config:
Brink Excellent 300+ sw S1.06.08 0007
Ebusd 23.3 on Pi3 Bullseye 64b

EBUSD_OPTS="-d /dev/ttyUSB0 --scanconfig=off -c /etc/ebusd/ --mqttvar=filter-direction=r|u|^w --accesslevel=* --mqtthost 192.168.1.14 --mqttport 1883 --mqttint=/etc/ebusd/mqtt-hassio.cfg --mqttuser=mqtt --mqttpass=mqtt --mqttjson -l /var/log/ebusd.log

If I change a seting in HA, it shows (for 2 minutes) in ebusctl finf -w, and then changes back to no data stored.
All entities show no data stored as default by the way.
ebusctl find -r show all enties from the 3c. config file with their current and optional settings.

Why do setting not retain after setting? Can you please have a look? I attached all relevant files.

3c.Excellent300.10608.10706.plus.csv:

This file is for Excellent300 SW version from 1.06.08 to 1.07.06
*r,Excellent300,,,,3c,
*w,Excellent300,,,,3c,

w,,FabrieksinstellingenInstellen,FactoryReset,,,40ff,466163746f72795265736574
w,,ResetMeldingen,ResetNotifications,,,4091,,,,UIR,0x0001=Errors;0x0100=Filter;0x0101=ErrorsAndFilter;0x0000=NoResetRequested,,NoResetRequested is a dummy message doing nothing. It might be useful for integration in MQTT and HA automation.
r,,FoutHistorie,RequestErrorList,,,4090,,,,HEX:18,,,
w,,VentilatorMode,FanMode,,,40a1,,,,ULR,0x0=Afwezig;0x00010001=Minimaal;0x00020002=Normaal;0x00030003=Maximaal,,
#w,,VentilatorModeAlternative,FanModeAlternative,,,40cb,0101,,,UIR,0=Holiday;1=Reduced;2=Normal;3=High,,
#r,,FilterMaximumDebiet,FilterNotificationFlow,,,4050,1c,,,UIR,-1000,m³,,min,,UIR,-1000,m³,,max,,UIR,-1000,m³,,step,,UIR,-1000,m³,,default,,UIR,-1000,m³,
#r,,FiltergebruikDagen,TotalFilterDays,,,4050,22,,,UIR,,Days,,min,,UIR,,Days,,max,,UIR,,Days,,step,,UIR,,Days,,default,,UIR,,Days,
#r,,Filtergebruik,TotalFilterFlow,,,4050,23,,,UIR,-1000,m³,,min,,UIR,-1000,m³,,max,,UIR,-1000,m³,,step,,UIR,-1000,m³,,default,,UIR,-1000,m³,
#r,,Bedieningstijd,TotalOperatingHours,,,4050,24,,,UIR,-5,Hours,,min,,UIR,-5,Hours,,max,,UIR,-5,Hours,,step,,UIR,-5,Hours,,default,,UIR,-5,Hours,
#r,,TotaalDebiet,TotalFlow,,,4050,25,,,UIR,-1000,m³,,min,,UIR,-1000,m³,,max,,UIR,-1000,m³,,step,,UIR,-1000,m³,,default,,UIR,-1000,m³,

r1,,VentilatorMode,FanMode,,,4022,01,,,UIR,0=Afwezig;1=Minimaal;2=Normaal;3=Maximaal,,
r1,,ToevoerDebiet,SettingInletFlow,,,4022,09,,,UIR,,m³/h,
r1,,AfvoerDebiet,SettingExhaustFlow,,,4022,0a,,,UIR,,m³/h,
r1,,HuidigToevoerDebiet,InletFlow,,,4022,0b,,,UIR,,m³/h,
r1,,HuidigAfvoerDebiet,ExhaustFlow,,,4022,0c,,,UIR,,m³/h,
r1,,ToevoerFanSnelheid,InletFanSpeed,,,4022,02,,,UIR,,rpm,
r1,,AfvoerFanSnelheid,ExhaustFanSpeed,,,4022,03,,,UIR,,rpm,
#r,,PerilexPositie,PerilexPosition,,,4022,05,,,UIR,0=Position_0;1=Position_1;2=Position_2;3=Position_3;,,
#r,,SchakelaarPositie,SwitchPosition,,,4022,06,,,UIR,0=Position_0;1=Position_1;2=Position_2;3=Position_3;,,
#r,,Schakelcontact1Positie,Contact1Position,,,4022,1b,,,UIR,0=Off;1=On,,
#r,,Schakelcontact2Positie,Contact2Position,,,4022,1c,,,UIR,0=Off;1=On,,
#r,,DipswitchWaarde,DipswitchValue,,,4022,04,,,UIR,31=Excellent180Basic;30=Excellent180Plus;7=Excellent300Basic;6=Excellent300Plus;5=Excellent400Basic;4=Excellent400Plus;27=Excellent450Basic;26=Excellent450Plus;3=RenoventElan300Basic;2=RenoventElan300Plus;19=Sky150Basic;18=Sky150Plus;9=Sky200Basic;8=Sky200Plus;21=Sky300Basic;20=Sky300Plus,,
#r,,SoftwareVersie,SoftwareVersion,,,4022,00,,,STR:13,,,
r1,,BypassStatus,BypassStatus,,,4022,0e,,,UIR,0=Initialiseren;1=Openen;2=Sluiten;3=Open;4=Gesloten;5=Foutmelding;6=Calibreren;255=Error,,
#r,,BypassStroom,BypassCurrent,,,4022,0d,,,UIR,,,
r1,,VoorverwarmerStatus,PreheaterStatus,,,4022,0f,,,UIR,0=Initialiseren;1=Uit;2=Aan,,
r1,,VoorverwarmVermogen,PreheaterPower,,,4022,10,,,UIR,,%,
#r,,NaverwarmerStatus,PostheaterStatus,,,4022,1d,,,UIR,0=Initialiseren;1=Uit;2=Aan,,
#r,,NaverwarmerVermogen,PostheaterPower,,,4022,1e,,,UIR,,%,
#r,,EWTStatus,EWTStatus,,,4022,1f,,,UIR,0=OpenLow;1=Closed;2=OpenHigh,,
r1,,VorstStatus,FrostStatus,,,4022,16,,,UIR,0=Initializing;1=NoFrost;17=NoFrost;2=DefrostWait;3=Preheater;18=Preheater;255=Error;5=VeluHeater;6=VeluFanCtrl;7=TableFanCtrl;19=TableFanCtrl;8=Sky150Heater;9=FanCtrlFanOff;10=FanCtrlFanRestart;11=FanCtrlCurve1;12=FanCtrlCurve2;13=FanCtrlCurve3;14=FanCtrlCurve4;15=HeaterCoolDown;16=Blocked,,
#r,,VentilatorStatus,FanStatus,,,4022,11,,,UIR,0=Initializing;1=ConstantFlow;2=ConstantPWM;3=Off;4=Error;5=MassBalance;6=Standby;7=ConstantRPM,,
r1,,BinnenTemperatuur,InsideTemperature,,,4022,07,,,SIR,10,°C,
r1,,BuitenTemperatuur,OutsideTemperature,,,4022,08,,,SIR,10,°C,
#r,,OptioneleTemperatuur,OptionTemperature,,,4022,1a,,,SIR,10,°C,
r1,,FilterStatus,FilterStatus,,,4022,18,,,UIR,0=Schoon;1=Vervuild,,
#r,,RelatieveVochtigheid,RelativeHumidity,,,4022,20,,,SIR,10,%,
#r,,VochtigheidBoostStatus,HumidityBoostState,,,4022,21,,,UIR,0=Error;1=NotInitialized;2=SensorNotActive;3=PowerUpDelay;4=NormalRH;5=BoostRising;6=BoostStable;7=BoostDecending;8=BoostRHLowLevelStable,Pa,
r1,,ToevoerDruk,PressureInlet,,,4022,14,,,UIR,10,Pa,
r1,,AfvoerDruk,PressureExhaust,,,4022,15,,,UIR,10,Pa,
#r3,,EbusSyncGenFouten,EbusSyncGenErrorCount,,,4022,64,,,UIR,,,

w,,DebietAfwezig,FlowMode0,,,4080,21,,,SIR,,m³/h,[min:0;max:50;step:50;default:50]
r1,,DebietAfwezig,FlowMode0,,,4050,21,,,SIR,,m³/h,,min,,SIR,,m³/h,[min:0],max,,SIR,,m³/h,[max:50],step,,SIR,,m³/h,[step:50],default,,SIR,,m³/h,[default:50]
w,,DebietMinimaal,FlowMode1,,,4080,01,,,SIR,,m³/h,[min:50;max:300;step:5;default:100]
r1,,DebietMinimaal,FlowMode1,,,4050,01,,,SIR,,m³/h,,min,,SIR,,m³/h,[min:50],max,,SIR,,m³/h,[max:300],step,,SIR,,m³/h,[step:5],default,,SIR,,m³/h,[default:100]
w,,DebietNormaal,FlowMode2,,,4080,02,,,SIR,,m³/h,[min:50;max:300;step:5;default:150]
r1,,DebietNormaal,FlowMode2,,,4050,02,,,SIR,,m³/h,,min,,SIR,,m³/h,[min:50],max,,SIR,,m³/h,[max:300],step,,SIR,,m³/h,[step:5],default,,SIR,,m³/h,[default:150]
w,,DebietMaximaal,FlowMode3,,,4080,03,,,SIR,,m³/h,[min:50;max:300;step:5;default:225]
r1,,DebietMaximaal,FlowMode3,,,4050,03,,,SIR,,m³/h,,min,,SIR,,m³/h,[min:50],max,,SIR,,m³/h,[max:300],step,,SIR,,m³/h,[step:5],default,,SIR,,m³/h,[default:225]
w,,BypassTemperatuur,BypassTemp,,,4080,04,,,SIR,10,°C,[min:150;max:350;step:5;default:240]
r1,,BypassTemperatuur,BypassTemp,,,4050,04,,,SIR,10,°C,,min,,SIR,10,°C,[min:150],max,,SIR,10,°C,[max:350],step,,SIR,10,°C,[step:5],default,,SIR,10,°C,[default:240]
w,,BypassHysterese,BypassTempHyst,,,4080,30,,,SIR,10,°C,[min:0;max:50;step:5;default:20]
r1,,BypassHysterese,BypassTempHyst,,,4050,30,,,SIR,10,°C,,min,,SIR,10,°C,[min:0],max,,SIR,10,°C,[max:50],step,,SIR,10,°C,[step:5],default,,SIR,10,°C,[default:20]
w,,BypassMode,BypassMode,,,4080,1b,,,UIR,0=Auto;1=Gesloten;2=Open,,[min:0;max:2;step:1;default:0]
r1,,BypassMode,BypassMode,,,4050,1b,,,UIR,0=Auto;1=Gesloten;2=Open,,,,,IGN:6,,,,default,,UIR,0=Auto;1=Gesloten;2=Open,,[default:0] - min/max/step fields of enum message omitted
#w,,CVWTW,CVWTWMode,,,4080,07,,,UIR,0=off;1=on,,[min:0;max:1;step:1;default:0]
#r,,CVWTW,CVWTWMode,,,4050,07,,,UIR,0=off;1=on,,,,,IGN:6,,,,default,,UIR,0=off;1=on,,[default:0] - min/max/step fields of enum message omitted
w,,OnbalansToelaatbaar,UnbalanceMode,,,4080,08,,,UIR,0=Niet toegestaan;1=Toegestaan,,[min:0;max:1;step:1;default:1]
r1,,OnbalansToelaatbaar,UnbalanceMode,,,4050,08,,,UIR,0=Niet toegestaan;1=Toegestaan,,,,,IGN:6,,,,default,,UIR,0=Not Permitted;1=Permitted,,[default:1] - min/max/step fields of enum message omitted
w,,VasteOnbalans,UnbalanceFlow,,,4080,09,,,SIR,,m³/h,[min:-100;max:100;step:1;default:0]
r1,,VasteOnbalans,UnbalanceFlow,,,4050,09,,,SIR,,m³/h,,min,,SIR,,m³/h,[min:-100],max,,SIR,,m³/h,[max:100],step,,SIR,,m³/h,[step:1],default,,SIR,,m³/h,[default:0]
#w,,ExtraVerwarmerType,ExtraHeaterType,,,4080,0a,,,UIR,,,[min:0;max:2;step:1;default:0]
#r,,ExtraVerwarmerType,ExtraHeaterType,,,4050,0a,,,UIR,,,,min,,UIR,,,[min:0],max,,UIR,,,[max:2],step,,UIR,,,[step:1],default,,UIR,,,[default:0]
#w,,TemperatuurNaverwarmer,PostheaterTemp,,,4080,0b,,,SIR,10,°C,[min:150;max:300;step:5;default:210]
#r,,TemperatuurNaverwarmer,PostheaterTemp,,,4050,0b,,,SIR,10,°C,,min,,SIR,10,°C,[min:150],max,,SIR,10,°C,[max:300],step,,SIR,10,°C,[step:5],default,,SIR,10,°C,[default:210]
#w,,SelectieIngang1,Input1Mode,,,4080,0c,,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,[min:0;max:4;step:1;default:0]
#r,,SelectieIngang1,Input1Mode,,,4050,0c,,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,,,,IGN:6,,,,default,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,[default:0] - min/max/step fields of enum message omitted
#w,,MinimaleSpanningIngang1,Input1VMin,,,4080,0d,,,SIR,10,V,[min:0;max:100;step:5;default:0]
#r,,MinimaleSpanningIngang1,Input1VMin,,,4050,0d,,,SIR,10,V,,min,,SIR,10,V,[min:0],max,,SIR,10,V,[max:100],step,,SIR,10,V,[step:5],default,,SIR,10,V,[default:0]
#w,,MaximaleSpanningIngang1,Input1VMax,,,4080,0e,,,SIR,10,V,[min:0;max:100;step:5;default:100]
#r,,MaximaleSpanningIngang1,Input1VMax,,,4050,0e,,,SIR,10,V,,min,,SIR,10,V,[min:0],max,,SIR,10,V,[max:100],step,,SIR,10,V,[step:5],default,,SIR,10,V,[default:100]
#w,,VoorwaardenSchakelingang1,CN1Coupling,,,4080,0f,,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,[min:0;max:4;step:1;default:0]
#r,,VoorwaardenSchakelingang1,CN1Coupling,,,4050,0f,,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,,,,IGN:6,,,,default,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,[default:0] - min/max/step fields of enum message omitted
#w,,ToevoerventSchakelingang1,CN1Inlet,,,4080,10,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[min:0;max:7;step:1;default:5]
#r,,ToevoerventSchakelingang1,CN1Inlet,,,4050,10,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,,,,IGN:6,,,,default,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[default:5] - min/max/step fields of enum message omitted
#w,,AfvoerventSchakelingang1,CN1Exhaust,,,4080,11,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[min:0;max:7;step:1;default:5]
#r,,AfvoerventSchakelingang1,CN1Exhaust,,,4050,11,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,,,,IGN:6,,,,default,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[default:5] - min/max/step fields of enum message omitted
#w,,SelectieIngang2,Input2Mode,,,4080,12,,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,[min:0;max:4;step:1;default:1]
#r,,SelectieIngang2,Input2Mode,,,4050,12,,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,,,,IGN:6,,,,default,,UIR,0=Normally Closed;1=0-10V input;2=Normally Open;3=12V Bypass Open/0V Bypass Closed;4=0V Bypass Open/12V Bypass Closed,,[default:1] - min/max/step fields of enum message omitted
#w,,MinimaleSpanningIngang2,Input2VMin,,,4080,13,,,SIR,10,V,[min:0;max:100;step:5;default:0]
#r,,MinimaleSpanningIngang2,Input2VMin,,,4050,13,,,SIR,10,V,,min,,SIR,10,V,[min:0],max,,SIR,10,V,[max:100],step,,SIR,10,V,[step:5],default,,SIR,10,V,[default:0]
#w,,MaximaleSpanningIngang2,Input2VMax,,,4080,14,,,SIR,10,V,[min:0;max:100;step:5;default:100]
#r,,MaximaleSpanningIngang2,Input2VMax,,,4050,14,,,SIR,10,V,,min,,SIR,10,V,[min:0],max,,SIR,10,V,[max:100],step,,SIR,10,V,[step:5],default,,SIR,10,V,[default:100]
#w,,VoorwaardenSchakelingang2,CN2Coupling,,,4080,15,,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,[min:0;max:4;step:1;default:0]
#r,,VoorwaardenSchakelingang2,CN2Coupling,,,4050,15,,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,,,,IGN:6,,,,default,,UIR,0=off;1=on;2=on if bypass open condition satisfied;3=bypass control;4=Bedroom valve,,[default:0] - min/max/step fields of enum message omitted
#w,,ToevoerventSchakelingang2,CN2Inlet,,,4080,16,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[min:0;max:7;step:1;default:5]
#r,,ToevoerventSchakelingang2,CN2Inlet,,,4050,16,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,,,,IGN:6,,,,default,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[default:5] - min/max/step fields of enum message omitted
#w,,AfvoerventSchakelingang2,CN2Exhaust,,,4080,17,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[min:0;max:7;step:1;default:5]
#r,,AfvoerventSchakelingang2,CN2Exhaust,,,4050,17,,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,,,,IGN:6,,,,default,,UIR,0=FanOff;1=Minimal flow 50m³/h;2=FanMode1;3=FanMode2;4=FanMode3;5=ManualSwitch;6=MaximalFlow;7=FanNotActive,,[default:5] - min/max/step fields of enum message omitted
#w,,Aardwarmtewisselaar,EWTMode,,,4080,18,,,UIR,0=off;1=on,,[min:0;max:1;step:1;default:0]
#r,,Aardwarmtewisselaar,EWTMode,,,4050,18,,,UIR,0=off;1=on,,,,,IGN:6,,,,default,,UIR,0=off;1=on,,[default:0] - min/max/step fields of enum message omitted
#w,,MinTempAardwarmtewisselaar,EWTTempMin,,,4080,19,,,SIR,10,°C,[min:0;max:100;step:5;default:50]
#r,,MinTempAardwarmtewisselaar,EWTTempMin,,,4050,19,,,SIR,10,°C,,min,,SIR,10,°C,[min:0],max,,SIR,10,°C,[max:100],step,,SIR,10,°C,[step:5],default,,SIR,10,°C,[default:50]
#w,,MaxTempAardwarmtewisselaar,EWTTempMax,,,4080,1a,,,SIR,10,°C,[min:150;max:400;step:5;default:250]
#r,,MaxTempAardwarmtewisselaar,EWTTempMax,,,4050,1a,,,SIR,10,°C,,min,,SIR,10,°C,[min:150],max,,SIR,10,°C,[max:400],step,,SIR,10,°C,[step:5],default,,SIR,10,°C,[default:250]
#w,,RHSensorAanwezig,RHTSensorPresent,,,4080,32,,,UIR,,,[min:0;max:1;step:1;default:0]
#r,,RHSensorAanwezig,RHTSensorPresent,,,4050,32,,,UIR,,,,min,,UIR,,,[min:0],max,,UIR,,,[max:1],step,,UIR,,,[step:1],default,,UIR,,,[default:0]
#w,,GevoeligheidRHSensor,RHTSensorSensitivity,,,4080,33,,,SIR,,,[min:-2;max:2;step:1;default:0]
#r,,GevoeligheidRHSensor,RHTSensorSensitivity,,,4050,33,,,SIR,,,,min,,SIR,,,[min:-2],max,,SIR,,,[max:2],step,,SIR,,,[step:1],default,,SIR,,,[default:0]
#w,,HelderheidAchtergrondVerlichting,BacklightLevel,,,4080,1d,,,UIR,,%,[min:0;max:100;step:5;default:10]
#r,,HelderheidAchtergrondVerlichting,BacklightLevel,,,4050,1d,,,UIR,,%,,min,,UIR,,%,[min:0],max,,UIR,,%,[max:100],step,,UIR,,%,[step:5],default,,UIR,,%,[default:10]
#w,,DebietCorrectie,FlowCorrection,,,4080,3f,,,UIR,,%,[min:90;max:110;step:1;default:100]
#r1,,DebietCorrectie,FlowCorrection,,,4050,3f,,,UIR,,%,,min,,UIR,,%,[min:90],max,,UIR,,%,[max:110],step,,UIR,,%,[step:1],default,,UIR,,%,[default:100]
#w,,StandaardpositieSchakelaar,SwitchDefaultPos,,,4080,40,,,UIR,0=off;1=on,,[min:0;max:1;step:1;default:1]
#r,,StandaardpositieSchakelaar,SwitchDefaultPos,,,4050,40,,,UIR,0=off;1=on,,,,,IGN:6,,,,default,,UIR,0=off;1=on,,[default:1] - min/max/step fields of enum message omitted

mqtt-hassio.cfg:

# Configuration file for ebusd MQTT integration with Home Assistant (https://www.home-assistant.io/).

# Use this file with ebusd in MQTT JSON mode to have many seen messages automatically appear on HA. This is achieved by
# using the MQTT Discovery feature of Home Assistant (see https://www.home-assistant.io/integrations/mqtt#mqtt-discovery).
# The commandline options to ebusd should contain e.g.:
# --mqttport=1883 --mqttjson --mqttint=/etc/ebusd/mqtt-hassio.cfg


# This file allows flexible construction of MQTT topics and payloads depending on message and field definitions as well
# as global status topics.
# It is a set of named variables (or constants) with the name on the left of an equal sign and the value on the right,
# where only the value is allowed to contain references to other variables.
# A reference to a variable is escaped by a leading "%" character in front of the variable name consisting of only
# alphabetic characters or the underscore. A double percent character "%%" is replaced by a single "%" in the value.
# Curly braces may be used to separate a variable explicitly from the rest, e.g. as "%{version}" instead of "%version".
# Every variable without an underscore in the name is automatically made available as well with an uppercase name and a
# normalized value composed of only alphanumeric characters or underscore (i.e. suitable for being part of a topic).
# When using "?=" instead of only the equal sign in a variable definition, the variable value is set to empty when one
# of the variables referred to is empty or missing.

# The variable replacements are constructed for each message and/or field (depending on whether the topic is field
# specific or not) in the following order:

# 1. predefined constants from ebusd, i.e.
#   %version the ebusd version number.
#   %prefix the invariable prefix part of the "--mqtttopic" configuration option, defaults to "ebusd/".
#   %prefixn the same as %prefix but without trailing slashes or underscores.

# 2. variables referring to constants only (directly or indirectly).

# 3. circuit and message specific variables:
#   %circuit the circuit name.
#   %name the message name.
#   %priority the message poll priority (or 0).
#   %level the message access level (or empty).
#   %messagecomment the message comment.
#   %direction the message direction ("r", "w", "u", or "uw").
#   %topic the message update topic built from the mqtttopic configuration option (only if the topic is not field
#     specific) and/or the %topic variable defined here.

# 4. the direction mapped from variables named "direction_map-%direction" with the actual direction in the suffix.
#     Available as "%direction_map".

# 5. the field type mapped from variables named "type_map-%direction-%type" or "type_map-%type" as fallback with the
#     field type and the optional direction in the suffix. The variable including the direction is evaluated first and
#     if it is missing or the result is empty, the variable excluding the direction is used instead.
#     This is also an implicit field type filter as missing or empty mappings are not published at all.
#     Available as "%type_map".

# 6. other field specific variables for each field (only once for each message if the topic is field specific):
#   %index the numeric field index (excluding ignored fields).
#   %field the field name and key for JSON objects (equals the field index if no name is defined or the names are not
#     unique in the message).
#   %fieldname the field name (and nothing else like in %field, might be empty though!)
#   %type the field type (one of "number", "list", "string", "date", "time", or "datetime").
#   %basetype the base data type ID (e.g. "UCH").
#   %comment the field comment (if any).
#   %unit the field unit (if any).
#   %min, %max, and %step the minimum/maximum possible value and step value for number fields.
#   %topic the field (or message) update topic built from the mqtttopic configuration option and/or the %topic variable
#     defined here.

# 7. optional field type switch in "%type_switch" using the value of the variable named "type_switch-by" and matching it
#     against the value lines of the variable named "type_switch-%type" with the field type in the suffix.
#     The value of such a variable needs to be a constant list of string pairs with one pair per line. Each pair is
#     separated by "=" and the left part is the value set to the "type_switch" variable when the wildcard pattern in the
#     right part matches the value of the "type_switch-by" value. The list is traversed from top to bottom with the
#     first match stopping the evaluation. Optionally, "type_switch-names" can be used to define a list of variable
#     names to be set in addition to the "type_switch" variable, in which case a list of variable names (comma
#     separated) is expected as "type_switch-names" value and the appropriate values to set on the left side of each
#     match list entry.
#     Available as "%type_switch" and optionally by the set of fields as defined in "%type_switch-names".

# 8. optional field type part mapping in "%type_part" for each field type in variables named "type_part-%type" with the
#     field type in the suffix (or the value of the "type_part-by" variable).

# 9. if the %fields_payload variable is used, then it is set to the concatenation of all fields of the message:
#   %field_payload is expected to build a single field payload.
#   %field-separator is the separator placed between consecutive field payloads.
#   %fields_payload is set to the concatenation of all fields of the message, separated by %field-separator.

# 10. %definition-topic, %definition-payload, and %definition-retain to build the message definition topic and payload
#     and determine the retain value.


# Before constructing the variable replacements, the messages and fields can optionally be filtered in order to use
# certain message definitions only. All of these criteria are applied, so they are basically combined by "AND".
# Filters with a "partial match" mention in the documentation allow using a limited glob/regex inspired case insensitive
# matching with the following options:
# - "|" allows defining alternatives, e.g. "a|b" matches "but" as well as "all".
# - "^" matches the beginning of the input, e.g. "^al" matches "al" but not "hal".
# - "$" matches the end of the input, e.g. "al$" matches "hal" but not "all".
# - "*" matches a single arbitrary length wildcard part in the middle, e.g. "^a*l$" matches "all" but not "always".

# include only messages having data sent at least once (only checked for passive or read messages, not for active write)
# when set to 1. If set to >1, then all messages passing the other filter criteria (including active read messages) will
# automatically be set to have a poll priority of at most this value, so these are automatically being polled.
# HA integration: filtering only seen messages to avoid unnecessary "pollution" and auto-poll all matched messages
filter-seen = 5
# include only messages having a priority less than or equal to the specified value.
#filter-priority =
# include only messages having the specified circuit (partial match, alternatives and wildcard supported).
#filter-circuit =
# exclude messages having the specified circuit (partial match, alternatives and wildcard supported).
#filter-non-circuit =
# include only messages having the specified name (partial match, alternatives and wildcard supported).
# HA integration: filter to some useful names for monitoring the heating circuit
filter-name = *
# exclude messages having the specified name (partial match, alternatives and wildcard supported).
#filter-non-name =
# include only messages having the specified level (partial match, alternatives and wildcard supported).
# Note: This is a filter on top of the messages already filtered implicitly for the ebusd "mqtt" user (if any).
# Note: Since the empty string matches all levels, an explicit check for empty string (with "^$") needs to be used for
# including only messages without a level.
filter-level = ^$
# include only messages having the specified direction ("r", "w", "u", or "uw". partial match, alternatives and wildcard supported).
# HA integration: writable messages excluded for now
filter-direction = r|u|^w
# HA integration: for including writable messages, use this line or overwrite with '--mqttvar=filter-direction=r|u|^w'.
#filter-direction = r|u|^w
# include only fields having the specified name (partial match, alternatives and wildcard supported).
#filter-field =
# exclude fields having the specified name (partial match, alternatives and wildcard supported).
# HA integration: exclude the useless sensor ok/cutoff info from temperature sensor.
filter-non-field = ^sensor$


# HA integration: home assistant configuration topics prefix
haprefix = homeassistant
# HA integration: the area of all entities in home assistant
area = Ventilation

# HA integration: circuit specific part used as device entity for message definitions below
circuit_part = {
   "identifiers":"%{PREFIX}_%CIRCUIT",
   "manufacturer":"ebusd.eu",
   "name":"%prefixn %circuit",
   "via_device":"%PREFIXN",
   "sw_version":"%version",
   "suggested_area":"%area"
  }

# the field type mapped from variables named "type_map-%direction-%type" or "type_map-%type" as fallback with the
# field type and the optional direction in the suffix. The variable including the direction is evaluated first and
# if it is missing or the result is empty, the variable excluding the direction is used instead.
# This is also an implicit field type filter as missing or empty mappings are not published at all.
type_map-number = number
type_map-list = string
type_map-time = time
# HA integration: skip string/date/datetime types completely
type_map-string =
type_map-date =
type_map-datetime =

# field type switch designator, see below.
# HA integration: this is used to set several variable values depending on the field type, message name, field name, and unit.
type_switch-by = %name%field,%unit

# field type switch variables names to use in addition to %type_switch in case of multiple keys (separated by comma).
# HA integration: var names for topic/class/state/sub values mapped from field type, message name, field name, and unit.
type_switch-names = type_topic,type_class,type_state,type_sub

# field type switch for each field type and optionally direction (between dash before the field type) available as
# %type_switch (as well as the variable names defined in "type_switch-names" if any).
# The value needs to be a constant list of string pairs with one pair per line. Each pair is separated by "=" and the
# left part is the value set to the type_switch variable (as well as the variable names defined in %type_switch-names)
# when the wildcard string in the right part matched the "type_switch-by" value. The list is traversed from top to
# bottom stopping at the first match. If direction specific definitions exist, these are traversed first. If no line
# matches at all, the variable(s) are set to the empty string.
# HA integration: the mapping list for (potentially) writable number entities by field type, name, message, and unit.
type_switch-w-number =
    number,temperature, = temp|,°C$|,K$
    number,, = integral|,°min$
    number,power_factor, = power*%%
    number,power, = power|,kW$|,W$
    number,voltage, = volt|,V$
    number,current, = current,|,A$
    number,pressure, = bar$
    number,gas, = gas*/min$
    number,volume, = m³$
    number,volume_flow_rate, = m³/h$
    number,humidity, = humid*%%$
    number,, =

# HA integration: the mapping list for numeric sensor entities by field type, name, message, and unit.
type_switch-number =
    sensor,,total_increasing = poweron|count,
    sensor,temperature,measurement = temp|,°C$|,K$
    sensor,power_factor,measurement = power*%%
    sensor,power,measurement = power|,kW$|,W$
    sensor,voltage,measurement = volt|,V$
    sensor,current,measurement = current,|,A$
    sensor,,measurement = integral|,°min$
    sensor,energy,total_increasing = energy|,Wh$
    sensor,yield,total_increasing = total*,Wh$
    sensor,duration,total_increasing = hours|days|,h$|,d$
    sensor,,total_increasing = starts*,$
    sensor,pressure,measurement = bar$|Pa$
    sensor,gas,measurement = gas*/min$|air*,m³$
    sensor,volume,total_increasing = total*,m³$
    sensor,volume,measurement = m³$
    sensor,volume_flow_rate,measurement = m³/h$
    sensor,carbon_dioxide,measurement = CO2*,ppm$
    sensor,humidity,measurement = humid*%%$
    sensor,, =

# HA integration: the mapping list for (potentially) writable binary switch entities by field type, name, message, and unit.
type_switch-w-list =
    switch,, = onoff
    switch,,,yesno = yesno
    select,, =

# HA integration: the mapping list for rather binary sensor entities by field type, name, message, and unit.
type_switch-list =
    binary_sensor,,measurement = onoff
    binary_sensor,,measurement,yesno = yesno
    sensor,,,list =

# HA integration: the mapping list for (potentially) writable string entities containing a time value by field type, name, message, and unit.
type_switch-w-time =
    text,,,time = from,|to,|time2,|timer
    text,,,time3 = time,

type_switch-time =
    sensor,,,time = from,|to,|time2,|timer
    sensor,,,time3 = time,

# HA integration: currently unused mapping lists for non-numeric/non-binary entities.
#type_switch-string =
#    sensor,, =
#type_switch-date =
#    sensor,,measurement =
#type_switch-datetime =
#    sensor, =

# HA integration: optional variable with the entity device class for numbers
type_class_number ?= ,
  "device_class":"%type_class"

# HA integration: optional variable with the entity device class for sensors
type_class_sensor ?= ,
  "device_class":"%type_class"

# HA integration: optional variable with the entity state class
state_class ?= ,
  "state_class":"%type_state"

# HA integration: optional variable with the entity unit
unit_of_measurement ?= ,
  "unit_of_measurement":"%unit"

# HA integration: optional variable with the minimum numeric value
min_number ?= ,
  "min":%min

# HA integration: optional variable with the maximum numeric value
max_number ?= ,
  "max":%max

# HA integration: optional variable with the numeric step value
step_number ?= ,
  "step":%step

# field type part suffix to use instead of the field type itself, see below.
# HA integration: %type_part variable mapped from the mapped %type_topic and optional %type_sub
type_part-by = %type_topic%type_sub

# field type part mappings for each field type (or the "type_part-by" variable value) in the suffix (available as
# %type_part).
# HA integration: %type_part variable for number %type_topic
type_part-number = ,
  "command_topic":"%topic/set"%min_number%max_number%step_number%unit_of_measurement%state_class%type_class_number

# HA integration: %type_part variable for sensor %type_topic
type_part-sensor = %unit_of_measurement%state_class%type_class_sensor

# HA integration: %type_part variable for switch %type_topic
type_part-switch = ,
  "command_topic":"%topic/set",
  "payload_on":"on",
  "payload_off":"off"%state_class

type_part-switchyesno = ,
  "command_topic":"%topic/set",
  "payload_on":"yes",
  "payload_off":"no"%state_class

# HA integration: %type_part variable for binary_sensor %type_topic
type_part-binary_sensor = ,
  "payload_on":"on",
  "payload_off":"off"%state_class

type_part-binary_sensoryesno = ,
  "payload_on":"yes",
  "payload_off":"no"%state_class

# HA integration: %type_part variable for text %type_topic
type_part-texttime = ,
  "command_topic":"%topic/set",
  "pattern": "^[012][0-9]:[0-5][0-9]$"%state_class
type_part-texttime3 = ,
  "command_topic":"%topic/set",
  "pattern": "^[012][0-9]:[0-5][0-9]:[0-5][0-9]$"%state_class

# optional format string for converting a fields value list into %field_values.
# "$value" and "$text" are being replaced by the corresponding part.
field_values-entry = "$text"
# optional separator for concatenating of field value list items.
field_values-separator = ,
# optional prefix for surrounding field value list items.
field_values-prefix = [
# optional suffix for surrounding field value list items.
field_values-suffix = ]

# HA integration: %type_part variable for select %type_topic and sensor with list of known values
type_part-select = ,
  "command_topic":"%topic/set",
  "options":%field_values
type_part-sensorlist = ,
  "device_class":"enum",
  "options":%field_values

# the field specific part (evaluated after the message specific part).
# HA integration: set to the mapped %type_part from above
field_payload = %type_part


# the message definition config topic, payload, and retain setting.
# HA integration: the config topic for HA's MQTT discovery for the ebusd message definition found.
# set to conditionally to avoid incomplete configs.
definition-topic ?= %haprefix/%type_topic/%{TOPIC}_%FIELD/config
# HA integration: this is the config topic payload for HA's MQTT discovery.
definition-payload = {
  "unique_id":"%{TOPIC}_%FIELD",
  "name":"%name %fieldname",
  "device":%circuit_part,
  "value_template":"{{value_json[\"%field\"].value}}",
  "state_topic":"%topic"%field_payload
 }
#definition-retain = 0


# the message value topic (if other than the default). If set here, it will be replaced by the "--mqtttopic"
# configuration option only if that one contains at least one variable. If the the "--mqtttopic" configuration option
# does not contain any variable, it is taken as prefix and can be used here as well.
# HA integration: use the prefix from --mqtttopic and non field specific topic for the actual data
topic = %prefix/%circuit/%name


# HA integration: global part used as device entity for the global config topics
global_device = {
   "identifiers":"%PREFIXN",
   "manufacturer":"ebusd.eu",
   "name":"%prefixn",
   "sw_version":"%version",
   "suggested_area":"%area"
  }

# HA integration: common prefix for global parts
global_prefix = {
  "unique_id":"%TOPIC",
  "device":%global_device,
  "state_topic":"%topic",
  "name":"global %name"

# HA integration: boolean suffix for global parts
global_boolean_suffix = ,
  "payload_on":"true",
  "payload_off":"false"
 }

# the common global config topic, payload, and retain setting (used by running, version, signal, uptime, updatecheck,
# and scan if not otherwise defined explicitly).
# HA integration: the config topic for HA's MQTT discovery for the ebusd global parts.
def_global-topic = %haprefix/sensor/%TOPIC/config
def_global-payload = %global_prefix
 }
#def_global-retain = 0

# individual global running, version, signal, uptime, updatecheck, and scan config topic, payload, and retain setting.
def_global_running-topic = %haprefix/binary_sensor/%TOPIC/config
def_global_running-payload = %global_prefix,
  "device_class":"running"%global_boolean_suffix
def_global_version-topic =
def_global_uptime-payload = %global_prefix,
  "device_class":"duration",
  "state_class":"total_increasing",
  "unit_of_measurement":"s"
 }
def_global_signal-topic = %haprefix/binary_sensor/%TOPIC/config
def_global_signal-payload = %global_prefix,
  "device_class":"connectivity"%global_boolean_suffix

def_global_updatecheck-topic = %haprefix/update/%TOPIC/config
def_global_updatecheck-payload = %global_prefix,
  "value_template":"{%% set my_new = value_json|truncate(255)|regex_replace(find=',.*| available|revision v|version v|OK',replace='') %%}{%% if my_new == '' %%}{%% set my_new = '%version' %%}{%% endif %%}{{ {'installed_version':'%version','latest_version':my_new,'entity_picture':'https://ebusd.eu/logo-32x32.png','release_url':'https://github.com/john30/ebusd/releases/latest'} | tojson }}"
 }


# optional secondary update check for the enhanced eBUS device (consuming the same topic though!)
def_global_updatecheck_device-topic = %haprefix/update/%{TOPIC}_device/config
def_global_updatecheck_device-payload =  {
  "unique_id":"%{TOPIC}_device",
  "device":{
    "identifiers":"%{PREFIXN}_device",
    "manufacturer":"ebusd.eu",
    "name":"%prefixn eBUS device",
    "via_device":"%PREFIXN",
    "suggested_area":"%area"
  },
  "state_topic":"%topic",
  "name":"%name",
  "value_template":"{%% set my_new = value_json|truncate(255)|regex_replace(find='^[^,]*|, device firmware |,.*| available',replace='') %%}{%% set my_cur = 'old' %%}{%% if my_new == '' %%}{%% set my_new = 'current' %%}{%% set my_cur = 'current' %%}{%% endif %%}{{ {'installed_version':my_cur,'latest_version':my_new,'entity_picture':'https://adapter.ebusd.eu/favicon.ico','release_url':'https://adapter.ebusd.eu/firmware/ChangeLog'} | tojson }}"
 }

# the topic and payload to listen to in order to republish all config messages.
# HA integration: force republish of all configs when HA goes down and comes up again.
config_restart-topic = %haprefix/status
config_restart-payload = online

and finally mqtt-integration.cfg:

# Configuration file for ebusd MQTT integration.

# This file allows flexible construction of MQTT topics and payloads depending on message and field definitions as well
# as global status topics.
# It is a set of named variables (or constants) with the name on the left of an equal sign and the value on the right,
# where only the value is allowed to contain references to other variables.
# A reference to a variable is escaped by a leading "%" character in front of the variable name consisting of only
# alphabetic characters or the underscore. A double percent character "%%" is replaced by a single "%" in the value.
# Curly braces may be used to separate a variable explicitly from the rest, e.g. as "%{version}" instead of "%version".
# Every variable without an underscore in the name is automatically made available as well with an uppercase name and a
# normalized value composed of only alphanumeric characters or underscore (i.e. suitable for being part of a topic).
# When using "?=" instead of only the equal sign in a variable definition, the variable value is set to empty when one
# of the variables referred to is empty or missing.

# The variable replacements are constructed for each message and/or field (depending on whether the topic is field
# specific or not) in the following order:

# 1. predefined constants from ebusd, i.e.
#   %version the ebusd version number.
#   %prefix the invariable prefix part of the "--mqtttopic" configuration option, defaults to "ebusd/".
#   %prefixn the same as %prefix but without trailing slashes or underscores.

# 2. variables referring to constants only (directly or indirectly).

# 3. circuit and message specific variables:
#   %circuit the circuit name.
#   %name the message name.
#   %priority the message poll priority (or 0).
#   %level the message access level (or empty).
#   %messagecomment the message comment.
#   %direction the message direction ("r", "w", "u", or "uw").
#   %topic the message update topic built from the mqtttopic configuration option (only if the topic is not field
#     specific) and/or the %topic variable defined here.

# 4. the direction mapped from variables named "direction_map-%direction" with the actual direction in the suffix.
#     Available as "%direction_map".

# 5. the field type mapped from variables named "type_map-%direction-%type" or "type_map-%type" as fallback with the
#     field type and the optional direction in the suffix. The variable including the direction is evaluated first and
#     if it is missing or the result is empty, the variable excluding the direction is used instead.
#     This is also an implicit field type filter as missing or empty mappings are not published at all.
#     Available as "%type_map".

# 6. other field specific variables for each field (only once for each message if the topic is field specific):
#   %index the numeric field index (excluding ignored fields).
#   %field the field name and key for JSON objects (equals the field index if no name is defined or the names are not
#     unique in the message).
#   %fieldname the field name (and nothing else like in %field, might be empty though!)
#   %type the field type (one of "number", "list", "string", "date", "time", or "datetime").
#   %basetype the base data type ID (e.g. "UCH").
#   %comment the field comment (if any).
#   %unit the field unit (if any).
#   %min, %max, and %step the minimum/maximum possible value and step value for number fields.
#   %topic the field (or message) update topic built from the mqtttopic configuration option and/or the %topic variable
#     defined here.

# 7. optional field type switch in "%type_switch" using the value of the variable named "type_switch-by" and matching it
#     against the value lines of the variable named "type_switch-%type" with the field type in the suffix.
#     The value of such a variable needs to be a constant list of string pairs with one pair per line. Each pair is
#     separated by "=" and the left part is the value set to the "type_switch" variable when the wildcard pattern in the
#     right part matches the value of the "type_switch-by" value. The list is traversed from top to bottom with the
#     first match stopping the evaluation. Optionally, "type_switch-names" can be used to define a list of variable
#     names to be set in addition to the "type_switch" variable, in which case a list of variable names (comma
#     separated) is expected as "type_switch-names" value and the appropriate values to set on the left side of each
#     match list entry.
#     Available as "%type_switch" and optionally by the set of fields as defined in "%type_switch-names".

# 8. optional field type part mapping in "%type_part" for each field type in variables named "type_part-%type" with the
#     field type in the suffix (or the value of the "type_part-by" variable).

# 9. if the %fields_payload variable is used, then it is set to the concatenation of all fields of the message:
#   %field_payload is expected to build a single field payload.
#   %field-separator is the separator placed between consecutive field payloads.
#   %fields_payload is set to the concatenation of all fields of the message, separated by %field-separator.

# 10. %definition-topic, %definition-payload, and %definition-retain to build the message definition topic and payload
#     and determine the retain value.


# Before constructing the variable replacements, the messages and fields can optionally be filtered in order to use
# certain message definitions only. All of these criteria are applied, so they are basically combined by "AND".
# Filters with a "partial match" mention in the documentation allow using a limited glob/regex inspired case insensitive
# matching with the following options:
# - "|" allows defining alternatives, e.g. "a|b" matches "but" as well as "all".
# - "^" matches the beginning of the input, e.g. "^al" matches "al" but not "hal".
# - "$" matches the end of the input, e.g. "al$" matches "hal" but not "all".
# - "*" matches a single arbitrary length wildcard part in the middle, e.g. "^a*l$" matches "all" but not "always".

# include only messages having data sent at least once (only checked for passive or read messages, not for active write)
# when set to 1. If set to >1, then all messages passing the other filter criteria (including active read messages) will
# automatically be set to have a poll priority of at most this value, so these are automatically being polled.
filter-seen = 1
# include only messages having a priority less than or equal to the specified value.
#filter-priority =
# include only messages having the specified circuit (partial match, alternatives and wildcard supported).
#filter-circuit =
# exclude messages having the specified circuit (partial match, alternatives and wildcard supported).
#filter-non-circuit =
# include only messages having the specified name (partial match, alternatives and wildcard supported).
#filter-name =
# exclude messages having the specified name (partial match, alternatives and wildcard supported).
#filter-non-name =
# include only messages having the specified level (partial match, alternatives and wildcard supported).
# Note: This is a filter on top of the messages already filtered implicitly for the ebusd "mqtt" user (if any).
# Note: Since the empty string matches all levels, an explicit check for empty string (with "^$") needs to be used for
# including only messages without a level.
filter-level = ^$
# include only messages having the specified direction ("r", "w", "u", or "uw". partial match, alternatives and wildcard supported).
filter-direction = r|u
# include only fields having the specified name (partial match, alternatives and wildcard supported).
#filter-field =
# exclude fields having the specified name (partial match, alternatives and wildcard supported).
filter-non-field = ^sensor$


# the field type mapped from variables named "type_map-%direction-%type" or "type_map-%type" as fallback with the
# field type and the optional direction in the suffix. The variable including the direction is evaluated first and
# if it is missing or the result is empty, the variable excluding the direction is used instead.
# This is also an implicit field type filter as missing or empty mappings are not published at all.
type_map-number = number
type_map-list = string
type_map-string = string
type_map-date = string
type_map-time = string
type_map-datetime = string


# field type switch designator, see below.
#type_switch-by = %name%field,%unit

# field type switch variables names to use in addition to %type_switch in case of multiple keys (separated by comma).
#type_switch-names = type_topic,type_class,type_state

# field type switch for each field type and optionally direction (between dash before the field type) available as
# %type_switch (as well as the variable names defined in "type_switch-names" if any).
# The value needs to be a constant list of string pairs with one pair per line. Each pair is separated by "=" and the
# left part is the value set to the type_switch variable (as well as the variable names defined in %type_switch-names)
# when the wildcard string in the right part matched the "type_switch-by" value. The list is traversed from top to
# bottom stopping at the first match. If direction specific definitions exist, these are traversed first. If no line
# matches at all, the variable(s) are set to the empty string.
#type_switch-w-number =


# field type part suffix to use instead of the field type itself, see below.
#type_part-by = %type_topic

# field type part mappings for each field type (or the "type_part-by" variable value) in the suffix (available as
# %type_part).
#type_part-number = ,


# optional format string for converting a fields value list into %field_values.
# "$value" and "$text" are being replaced by the corresponding part.
#field_values-entry = $text
# optional separator for concatenating of field value list items.
#field_values-separator = ,
# optional prefix for surrounding field value list items.
#field_values-prefix =
# optional suffix for surrounding field value list items.
#field_values-suffix =


# the field specific part (evaluated after the message specific part).
#field_payload = %type_part


# the message definition config topic, payload, and retain setting.
definition-topic = %prefixn/config/%CIRCUIT/%NAME/%FIELD
definition-payload = {
  "name":"%prefixn %circuit %name %field",
  "topic":"%topic"
 }
#definition-retain = 0


# the message value topic (if other than the default). If set here, it will be replaced by the "--mqtttopic"
# configuration option only if that one contains at least one variable. If the the "--mqtttopic" configuration option
# does not contain any variable, it is taken as prefix and can be used here as well.
#topic=%prefix/%circuit/%name


# the common global config topic, payload, and retain setting (used by running, version, signal, uptime, updatecheck,
# and scan if not otherwise defined explicitly).
def_global-topic = %prefixn/config/global/%FIELD
def_global-payload = {
  "name":"%prefixn global %field",
  "topic":"%topic"
 }
#def_global-retain = 0

# individual global running, version, signal, uptime, updatecheck, and scan config topic, payload, and retain setting.
# a secondary update check for the eBUS device (consuming the same updatecheck topic) can be set up, which will only be
# used if an enhanced eBUS device supporting extra info is present (does not make use of the common global defaults).
#def_global_running-...
#def_global_version-...
#def_global_signal-...
#def_global_uptime-...
#def_global_updatecheck-...
#def_global_updatecheck_device-...
#def_global_scan-...


# the topic and payload to listen to in order to republish all config messages.
#config_restart-topic =
#config_restart-payload =

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.