MQTT client app

MQTT client - LM application #

MQTT payload to object value #

MQTT payload is decoded using JSON. Writing to object is done using the following rules for the decoded value:

  • JSON null - no write is performed
  • Invalid JSON (Lua nil) - the original payload string is written
  • Valid JSON - the decoded JSON value is written

Object value to MQTT payload #

Object value is converted to MQTT payload using the following rules:

  • boolean is converted to '1' or '0'
  • table is encoded using JSON
  • number is converted to a string via tostring
  • string is sent as is

Scripts - In (From MQTT) #

Script provides two global variables:

  • topic (string) - topic name
  • payload (string) - payload data

Script must end with a return statement unless the mapped object is not set.


Scripts - Out (To MQTT) #

Script provides one global variable:

  • value (boolean, number, string or table depending on the data type) - object value

Script must end with a return statement.

The returned script value is converted to MQTT payload using the same rules as for topics without scripts except for invalid types (including nil). Invalid values are not published.


Examples #

String ↔ boolean conversion #

Conversion is built into the app, the following example simply illustrates the basic script structure.

MQTT device uses 'on' or 'off' (string) for status and control.

In (From MQTT) script - converts payload string to boolean #
if payload == 'on' then
  return true
elseif payload == 'off' then
  return false
end
Out (To MQTT) script - converts boolean to payload string #
if value then
  return 'on'
else
  return 'off'
end

JSON payload (single value) #

MQTT payload is the following JSON:

{
  "id": "0",
  "battery": {
    "V": 2.99,
    "percent": 98
  }
}
In (From MQTT) script - gets the battery percent from the JSON object #
local data = json.pdecode(payload)
if type(data) == 'table' then
  return data.battery.percent
end

JSON payload (multiple values) #

MQTT payload is the following JSON:

{
  "temperature": 24.5,
  "humidity": 45
}
In (From MQTT) script - multiple values to objects #

No object is mapped to the MQTT topic. Script handles writing multiple values to objects.

local data = json.pdecode(payload)
if type(data) == 'table' then
  grp.checkwrite('1/1/1', data.temperature)
  grp.checkwrite('1/1/2', data.humidity)
end
Out (To MQTT) script - objects to multiple values #

Two topic mappings are required if both objects must trigger publishing to MQTT.

return json.encode({
  temperature = grp.getvalue('1/1/1'),
  humidity = grp.getvalue('1/1/2'),
})