# 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 = , # 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. #def_global_running-... #def_global_version-... #def_global_signal-... #def_global_uptime-... #def_global_updatecheck-... #def_global_scan-... # the topic and payload to listen to in order to republish all config messages. #config_restart-topic = #config_restart-payload =