Logic Machine Forum
mqtt with logic machine - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: mqtt with logic machine (/showthread.php?tid=5400)

Pages: 1 2


mqtt with logic machine - abby - 01.05.2024

how to subscribe to mqtt data using logic machine


RE: mqtt with logic machine - admin - 01.05.2024

https://kb.logicmachine.net/integration/mqtt-client/


RE: mqtt with logic machine - abby - 23.05.2024

Hello sir i want to publish these data 

mosquitto_pub -h mqtt.intingy.com -u entelechy_gateway -p 1883 -P "wr6NOng8HzFC2KpB5cPoxXXgCSYBHXbGgRG9b3R39ok"  -t "entelechy/" -m "mqtt_connection_test"

bit in lm when I publish  it in the log it shows empty and nothing shows in it .


RE: mqtt with logic machine - admin - 23.05.2024

Use the first example from our knowledge base. Change variables in the first 6 lines as needed.


RE: mqtt with logic machine - abby - 24.05.2024

thank you sir it got connected but the data from the another side is not coming I am having an error


RE: mqtt with logic machine - admin - 24.05.2024

"not authorized" error means wrong username and/or password.

This works for me:
Code:
broker = 'mqtt.intingy.com'
port = 1883
username = 'entelechy_gateway'
password = 'wr6NOng8HzFC2KpB5cPoxXXgCSYBHXbGgRG9b3R39ok'
topic = 'entelechy/'
payload = 'mqtt_connection_test'

mqtt = require('mosquitto')
client = mqtt.new()

client.ON_CONNECT = function(status, rc, msg)
  if status then
    log('mqtt connected')
    client:publish(topic, tostring(payload))
  else
    log('mqtt connect failed ' .. tostring(msg))
    client:disconnect()
  end
end

client.ON_PUBLISH = function()
  log('publish ok')
  client:disconnect()
end

client:login_set(username, password)
status, rc, msg = client:connect(broker, port)

if status then
  client:loop_forever()
else
  log('connect failed: ' .. tostring(msg))
end



RE: mqtt with logic machine - abby - 24.05.2024

thankyou sir it is working .now I want to receive data what should I do to receive data .


RE: mqtt with logic machine - admin - 24.05.2024

Second example here (Object value exchange via MQTT): https://kb.logicmachine.net/integration/mqtt-client/


RE: mqtt with logic machine - abby - 24.05.2024

I have tried this code but it is showing some error


RE: mqtt with logic machine - admin - 24.05.2024

Check this: https://forum.logicmachine.net/showthread.php?tid=1759&pid=33643#pid33643


RE: mqtt with logic machine - abby - 27.05.2024

I have tried this code but it showing some error 

Code:
if not broker then
  broker = '192.168.29.48'

  function multiply(mult)
    return function(value)
      local num = tonumber(value)
      if num then
        return num * mult
      else
        return value
      end
    end
  end

  -- topic to object map
  mqtt_to_object = {
    ['in/topic1'] = '32/1/1',
    ['in/topic2'] = '32/1/2',
  }

  -- optional topic value conversion function
  mqtt_to_object_conv = {
    ['in/topic1'] = multiply(100),
    ['in/topic2'] = multiply(0.01),
  }

  -- object to topic map
  object_to_mqtt = {
    ['1/1/1'] = 'out/topic1',
    ['1/1/2'] = 'out/topic2',
  }

  datatypes = {}

  grp.sender = 'mq'
  require('socket')

  for addr, _ in pairs(object_to_mqtt) do
    local obj = grp.find(addr)
    if obj then
      datatypes[ addr ] = obj.datatype
    end
  end

  mclient = require('mosquitto').new()

  mclient.ON_CONNECT = function(res, ...)
    log('mqtt connect status', res, ...)

    if res then
      for topic, _ in pairs(mqtt_to_object) do
        mclient:subscribe(topic)
      end
    else
      mclient:disconnect()
    end
  end

  mclient.ON_MESSAGE = function(mid, topic, payload)
    local addr = mqtt_to_object[ topic ]
    if addr then
      local fn = mqtt_to_object_conv[ topic ]

      if fn then
        payload = fn(payload)
      end

      grp.write(addr, payload)
    end
  end

  mclient.ON_DISCONNECT = function(...)
    log('mqtt disconnect', ...)
    mclientfd = nil
  end

  function mconnect()
    local fd

    mclient:connect(broker)
    fd = mclient:socket()

    -- fd ref is valid
    if fd then
      mclientfd = fd
    end
  end

  mconnect()

  function publishvalue(event)
    -- message from us or client is not connected
    if event.sender == 'mq' or not mclientfd then
      return
    end

    local addr = event.dst
    local dpt = datatypes[ addr ]
    local topic = object_to_mqtt[ addr ]

    -- unknown object
    if not dpt or not topic then
      return
    end

    local value = busdatatype.decode(event.datahex, dpt)
    if value ~= nil then
      if type(value) == 'boolean' then
        value = value and 1 or 0
      end

      mclient:publish(topic, tostring(value))
    end
  end

  lbclient = require('localbus').new(1)
  lbclient:sethandler('groupwrite', publishvalue)

  lbclientfd = socket.fdmaskset(lbclient:getfd(), 'r')

  -- run timer every 5 seconds
  timer = require('timerfd').new(5)
  timerfd = socket.fdmaskset(timer:getfd(), 'r')
end

-- mqtt connected
if mclientfd then
  mclientfdset = socket.fdmaskset(mclientfd, mclient:want_write() and 'rw' or 'r')
  res, lbclientstat, timerstat, mclientstat =
      socket.selectfds(10, lbclientfd, timerfd, mclientfdset)
-- mqtt not connected
else
  res, lbclientstat, timerstat =
    socket.selectfds(10, lbclientfd, timerfd)
end

if mclientfd and mclientstat then
  if socket.fdmaskread(mclientstat) then
    mclient:loop_read()
  end

  if socket.fdmaskwrite(mclientstat) then
    mclient:loop_write()
  end
end

if lbclientstat then
  lbclient:step()
end

if timerstat then
  -- clear armed timer
  timer:read()

  if mclientfd then
    mclient:loop_misc()
  else
    mconnect()
  end
end



RE: mqtt with logic machine - admin - 27.05.2024

After mclient = require('mosquitto').new() (line 45) add this:
Code:
mclient:login_set('USERNAME', 'PASSWORD')

Replace USERNAME/PASSWORD with real username and password.


RE: mqtt with logic machine - abby - 27.05.2024

still showing the same error

Code:
if not broker then
  broker = '192.168.29.48'

  function multiply(mult)
    return function(value)
      local num = tonumber(value)
      if num then
        return num * mult
      else
        return value
      end
    end
  end

  -- topic to object map
  mqtt_to_object = {
    ['in/topic1'] = '32/1/1',
    ['in/topic2'] = '32/1/2',
  }

  -- optional topic value conversion function
  mqtt_to_object_conv = {
    ['in/topic1'] = multiply(100),
    ['in/topic2'] = multiply(0.01),
  }

  -- object to topic map
  object_to_mqtt = {
    ['1/1/1'] = 'out/topic1',
    ['1/1/2'] = 'out/topic2',
  }

  datatypes = {}

  grp.sender = 'mq'
  require('socket')

  for addr, _ in pairs(object_to_mqtt) do
    local obj = grp.find(addr)
    if obj then
      datatypes[ addr ] = obj.datatype
    end
  end

  mclient = require('mosquitto').new()
 
  mclient:login_set('entelechy_gateway', 'wr6NOng8HzFC2KpB5cPoxXXgCSYBHXbGgRG9b3R39ok')

  mclient.ON_CONNECT = function(res, ...)
    log('mqtt connect status', res, ...)

    if res then
      for topic, _ in pairs(mqtt_to_object) do
        mclient:subscribe(topic)
      end
    else
      mclient:disconnect()
    end
  end

  mclient.ON_MESSAGE = function(mid, topic, payload)
    local addr = mqtt_to_object[ topic ]
    if addr then
      local fn = mqtt_to_object_conv[ topic ]

      if fn then
        payload = fn(payload)
      end

      grp.write(addr, payload)
    end
  end

  mclient.ON_DISCONNECT = function(...)
    log('mqtt disconnect', ...)
    mclientfd = nil
  end

  function mconnect()
    local fd

    mclient:connect(broker)
    fd = mclient:socket()

    -- fd ref is valid
    if fd then
      mclientfd = fd
    end
  end

  mconnect()

  function publishvalue(event)
    -- message from us or client is not connected
    if event.sender == 'mq' or not mclientfd then
      return
    end

    local addr = event.dst
    local dpt = datatypes[ addr ]
    local topic = object_to_mqtt[ addr ]

    -- unknown object
    if not dpt or not topic then
      return
    end

    local value = busdatatype.decode(event.datahex, dpt)
    if value ~= nil then
      if type(value) == 'boolean' then
        value = value and 1 or 0
      end

      mclient:publish(topic, tostring(value))
    end
  end

  lbclient = require('localbus').new(1)
  lbclient:sethandler('groupwrite', publishvalue)

  lbclientfd = socket.fdmaskset(lbclient:getfd(), 'r')

  -- run timer every 5 seconds
  timer = require('timerfd').new(5)
  timerfd = socket.fdmaskset(timer:getfd(), 'r')
end

-- mqtt connected
if mclientfd then
  mclientfdset = socket.fdmaskset(mclientfd, mclient:want_write() and 'rw' or 'r')
  res, lbclientstat, timerstat, mclientstat =
      socket.selectfds(10, lbclientfd, timerfd, mclientfdset)
-- mqtt not connected
else
  res, lbclientstat, timerstat =
    socket.selectfds(10, lbclientfd, timerfd)
end

if mclientfd and mclientstat then
  if socket.fdmaskread(mclientstat) then
    mclient:loop_read()
  end

  if socket.fdmaskwrite(mclientstat) then
    mclient:loop_write()
  end
end

if lbclientstat then
  lbclient:step()
end

if timerstat then
  -- clear armed timer
  timer:read()

  if mclientfd then
    mclient:loop_misc()
  else
    mconnect()
  end
end



RE: mqtt with logic machine - admin - 27.05.2024

Shouldn't broker address be 'mqtt.intingy.com'?


RE: mqtt with logic machine - abby - 27.05.2024

yes I have change it error are gone now And were will the data will be show I have to show the data into graph format could you please help me with that


RE: mqtt with logic machine - admin - 27.05.2024

Map MQTT topic to a group address (mqtt_to_object table in the script). Then create a trend log attached to this group address.


RE: mqtt with logic machine - abby - 27.05.2024

sir i have tried it but it is showing error 

local mqtt_to_object = {
    ["mqtt.intingy.com"] = "32/1/1", 
    ["test1"] = "32/1/2", 
   
}

local function create_trend_log("32/1/1")

    print("TEMP", '32/1/1')
end

for mqtt_topic, group_address in pairs(mqtt_to_object) do
    create_trend_log('32/1/1')
end


RE: mqtt with logic machine - admin - 27.05.2024

Check LM manual page 48 on how to create Trend logs: https://openrb.com/wp-content/uploads/2022/05/LM-manual_3.2022.pdf

Contact the seller where you've got LM from for some basic training. Without this it will be very hard to achieve any meaningful results.


RE: mqtt with logic machine - abby - 27.05.2024

sir sorry for the unusual question but I know how to make trend logs


RE: mqtt with logic machine - admin - 28.05.2024

You only need to modify this table:
Code:
mqtt_to_object = {
  ['in/topic1'] = '32/1/1',
  ['in/topic2'] = '32/1/2',
}

In this example data published to topic named in/topic1 is sent to group address 32/1/1
So you need to adjust the topic name and group address as needed. Then in LM UI create a trend log that is attached to the same group address.
Depending on the trend log settings it might take up to several hours for the chart to start displaying values.