-
Notifications
You must be signed in to change notification settings - Fork 9
/
mqtt-hassio.cfg
341 lines (291 loc) · 17.1 KB
/
mqtt-hassio.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# 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/docs/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 and %max the minimum/maximum possible 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 = 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 = scan
# 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 = status|temp|yield|count|energy|power|runtime|hours|starts|mode|curve|^load$|^party$
# 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
# 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 = Heating
# 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
# HA integration: skip string/date/time types completely
type_map-string = string
type_map-date = string
type_map-time = string
type_map-datetime = string
# field type switch designator, see below.
# HA integration: this is used to set several variable values depending on the field type, name, message, and field 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 values mapped from field type, name, message, and unit.
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.
# 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$
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,humidity, = humid*%%$
number,, = offset
number,, = cost
number,, = slope
# number,, = status
# HA integration: the mapping list for numeric sensor entities by field type, name, message, and unit.
type_switch-number =
sensor,temperature,measurement = temp|,°C$
sensor,power_factor,measurement = power*%%
sensor,power,measurement = power|,kW$|,W$
sensor,voltage,measurement = volt|,V$
sensor,current,measurement = current,|,A$
sensor,energy,total_increasing = energy|,Wh$
sensor,yield,total_increasing = total*,Wh$
sensor,,total_increasing = hours|,h$
sensor,,total_increasing = starts*,$
sensor,pressure,measurement = bar$
sensor,gas,measurement = gas*/min$
sensor,humidity,measurement = humid*%%$
sensor,,measurement, = pct$
sensor,, =
# HA integration: the mapping list for (potentially) writable binary switch entities by field type, name, message, and unit.
type_switch-w-list =
switch,status, = onoff
switch,, = yesno
# HA integration: the mapping list for rather binary sensor entities by field type, name, message, and unit.
type_switch-list =
binary_sensor,status,measurement = onoff
sensor,, =
binary_sensor,,measurement = yesno
# HA integration: currently unused mapping lists for non-numeric/non-binary entities.
#type_switch-string =
# sensor,, =
#type_switch-date =
# sensor,,measurement =
#type_switch-time =
# 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"
# 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
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).
# HA integration: %type_part variable for number %type_topic
type_part-number = ,
"command_topic":"%topic/set",
"min":%min,
"max":%max%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
# HA integration: %type_part variable for binary_sensor %type_topic
type_part-binary_sensor = ,
"payload_on":"on",
"payload_off":"off"%state_class
# 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":"%prefixn %circuit %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":"%prefixn %name"
# HA integration: boolean suffix for global parts
global_boolean_suffix = ,
"state_class":"measurement",
"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,
"state_class":"measurement"
}
#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,
"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
# 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