Logic Machine Forum
Smappee inifinity Energy Monitoring to KNX - 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: Smappee inifinity Energy Monitoring to KNX (/showthread.php?tid=3115)



Smappee inifinity Energy Monitoring to KNX - bednarekluc - 20.01.2021

Hello,

I'm looking for a way to integrate the energy monitoring system from Smappee (www.smappee.com) into my KNX home visualization.
The Smappee device sends its data to a MQTT Broker in a JSON format.
I have tried to modify the existing examples from the forum to get the data out of the MQTT broker.
But I get no where.
Is there anybody around here who can help with this or has done this integration.

Topic for subscription : servicelocation/uuid/config

Sample of the data (this sample has 26 live power values in it) :

{"totalPower":4421,"totalReactivePower":-1827,"totalExportEnergy":3067200,"totalImportEnergy":2775754800,"monitorStatus":0,"utcTimeStamp":1611127010000,"measuredFrequency":50012728,"channelPowers":[{"publishIndex":0,"formula":"$5500013892/0$","power":931,"exportEnergy":46800,"importEnergy":616680000,"phaseId":0,"current":51,"apparentPower":1214,"cosPhi":76},{"publishIndex":1,"formula":"$5500013892/1$","power":3113,"exportEnergy":615600,"importEnergy":545688000,"phaseId":1,"current":136,"apparentPower":3214,"cosPhi":96},{"publishIndex":2,"formula":"$5500013892/2$","power":377,"exportEnergy":2354400,"importEnergy":523616400,"phaseId":2,"current":20,"apparentPower":475,"cosPhi":79},{"publishIndex":3,"formula":"$5500013892/3$","power":15,"exportEnergy":0,"importEnergy":182869200,"phaseId":1,"current":2,"apparentPower":43,"cosPhi":33},{"publishIndex":4,"formula":"$5500013906/0$","power":0,"exportEnergy":43200,"importEnergy":23965200,"phaseId":0,"current":1,"apparentPower":14,"cosPhi":0},{"publishIndex":5,"formula":"$5500013906/1$","power":0,"exportEnergy":7200,"importEnergy":23475600,"phaseId":1,"current":1,"apparentPower":14,"cosPhi":0},{"publishIndex":6,"formula":"$5500013906/2$","power":0,"exportEnergy":0,"importEnergy":23691600,"phaseId":2,"current":1,"apparentPower":15,"cosPhi":0},{"publishIndex":7,"formula":"$5500013906/3$","power":91,"exportEnergy":0,"importEnergy":2113200,"phaseId":1,"current":6,"apparentPower":148,"cosPhi":61},{"publishIndex":11,"formula":"$5500024954/3$","power":281,"exportEnergy":0,"importEnergy":61390800,"phaseId":2,"current":14,"apparentPower":333,"cosPhi":84},{"publishIndex":12,"formula":"$5500024970/0$","power":28,"exportEnergy":0,"importEnergy":11750400,"phaseId":0,"current":3,"apparentPower":74,"cosPhi":37},{"publishIndex":13,"formula":"$5500024970/1$","power":2763,"exportEnergy":0,"importEnergy":153662400,"phaseId":1,"current":122,"apparentPower":2874,"cosPhi":96},{"publishIndex":14,"formula":"$5500024970/2$","power":88,"exportEnergy":0,"importEnergy":216208800,"phaseId":2,"current":6,"apparentPower":135,"cosPhi":65},{"publishIndex":15,"formula":"$5500024970/3$","power":80,"exportEnergy":0,"importEnergy":16171200,"phaseId":1,"current":5,"apparentPower":121,"cosPhi":65},{"publishIndex":16,"formula":"$5500024993/0$","power":0,"exportEnergy":0,"importEnergy":25848000,"phaseId":2,"current":0,"apparentPower":6,"cosPhi":5},{"publishIndex":17,"formula":"$5500024993/3$","power":51,"exportEnergy":0,"importEnergy":72860400,"phaseId":0,"current":2,"apparentPower":54,"cosPhi":93},{"publishIndex":18,"formula":"$5500024993/1$","power":530,"exportEnergy":0,"importEnergy":188485200,"phaseId":0,"current":28,"apparentPower":658,"cosPhi":80},{"publishIndex":19,"formula":"$5500024993/2$","power":140,"exportEnergy":0,"importEnergy":45691200,"phaseId":0,"current":9,"apparentPower":225,"cosPhi":62},{"publishIndex":20,"formula":"$5500024996/0$","power":13,"exportEnergy":0,"importEnergy":1807200,"phaseId":1,"current":2,"apparentPower":36,"cosPhi":35},{"publishIndex":21,"formula":"$5500024996/1$","power":74,"exportEnergy":0,"importEnergy":10317600,"phaseId":1,"current":4,"apparentPower":102,"cosPhi":72},{"publishIndex":22,"formula":"$5500024996/2$","power":6,"exportEnergy":0,"importEnergy":12020400,"phaseId":1,"current":2,"apparentPower":42,"cosPhi":13},{"publishIndex":23,"formula":"$5500024996/3$","power":35,"exportEnergy":0,"importEnergy":6868800,"phaseId":1,"current":3,"apparentPower":81,"cosPhi":42},{"publishIndex":24,"formula":"$5500024954/0$","power":11,"exportEnergy":0,"importEnergy":7365600,"phaseId":1,"current":1,"apparentPower":26,"cosPhi":41},{"publishIndex":25,"formula":"$5500024954/1$","power":24,"exportEnergy":0,"importEnergy":2001600,"phaseId":1,"current":2,"apparentPower":40,"cosPhi":60},{"publishIndex":26,"formula":"$5500024954/2$","power":4,"exportEnergy":0,"importEnergy":1206000,"phaseId":1,"current":0,"apparentPower":11,"cosPhi":30}],"voltages":[{"voltage":238,"phaseId":0},{"voltage":236,"phaseId":1},{"voltage":239,"phaseId":2}]}

Best regards,

Luc


RE: Smappee inifinity Energy Monitoring to KNX - admin - 20.01.2021

Have you managed to check if that data is being published to the broker? You can use this application to connect to the broker: http://mqtt-explorer.com/
From the docs it looks like the correct topic for data is servicelocation/<UUID>/realtime where <UUID> must be replaced with the unique ID. Or you can simply subscribe to servicelocation/+/realtime to receive data from all devices.


RE: Smappee inifinity Energy Monitoring to KNX - bednarekluc - 20.01.2021

(20.01.2021, 07:40)admin Wrote: Have you managed to check if that data is being published to the broker? You can use this application to connect to the broker: http://mqtt-explorer.com/
From the docs it looks like the correct topic for data is servicelocation/<UUID>/realtime where <UUID> must be replaced with the unique ID. Or you can simply subscribe to servicelocation/+/realtime to receive data from all devices.

Yes, I got the sample data from the broker with the app MQTTOOL.

The problem is that I don’t have a clue how to get the Jason data into the logicmachine from the broker.


RE: Smappee inifinity Energy Monitoring to KNX - admin - 20.01.2021

Resident script (sleep time = 0), log(msg) will output the received real-time data decoded from JSON.
Code:
if not broker then
  require('json')
  require('socket')

  broker, port = '127.0.0.1', 1883
  mclient = require('mosquitto').new()

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

    if res then
      mclient:subscribe('servicelocation/+/realtime')
    else
      mclient:disconnect()
    end
  end

  mclient.ON_MESSAGE = function(mid, topic, payload)
    local msg = json.pdecode(payload)
    if type(msg) == 'table' then
      log(msg)
    end
  end

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

  mclient.ON_ERROR = function(...)
    log('callback error', ...)
  end

  function mconnect()
    local fd

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

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

  mconnect()

  -- 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, timerstat, mclientstat = socket.selectfds(10, timerfd, mclientfdset)
-- mqtt not connected
else
  res, timerstat = socket.selectfds(10, timerfd)
end

if res then
  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 timerstat then
    -- clear armed timer
    timer:read()

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



RE: Smappee inifinity Energy Monitoring to KNX - bednarekluc - 20.01.2021

(20.01.2021, 09:19)admin Wrote: Resident script (sleep time = 0), log(msg) will output the received real-time data decoded from JSON.
Code:
if not broker then
  require('json')
  require('socket')

  broker, port = '127.0.0.1', 1883
  mclient = require('mosquitto').new()

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

    if res then
      mclient:subscribe('servicelocation/+/realtime')
    else
      mclient:disconnect()
    end
  end

  mclient.ON_MESSAGE = function(mid, topic, payload)
    local msg = json.pdecode(payload)
    if type(msg) == 'table' then
      log(msg)
    end
  end

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

  mclient.ON_ERROR = function(...)
    log('callback error', ...)
  end

  function mconnect()
    local fd

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

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

  mconnect()

  -- 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, timerstat, mclientstat = socket.selectfds(10, timerfd, mclientfdset)
-- mqtt not connected
else
  res, timerstat = socket.selectfds(10, timerfd)
end

if res then
  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 timerstat then
    -- clear armed timer
    timer:read()

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

Thanks this works perfect.


RE: Smappee inifinity Energy Monitoring to KNX - Amelie - 06.06.2023

I'm also trying to import the data from the Smappee to the logic machine. I have use the script above, and I think it is working. The output I get is:


Quote:LogicMachine Uitloggen StartpaginaTaal:

Versie: 20211215






CPU/IO: 0.00 0.05 0.07, Geheugen: 16% Schijf: 40%, KNX/TP: OK

* table:
["totalPower"]
  * number: 300
["totalExportEnergy"]
  * number: 500922000
["channelPowers"]
  * table:
  [1]
    * table:
    ["publishIndex"]
      * number: 0
    ["power"]
      * number: -1159
    ["formula"]
      * string: $5500047832/0$
    ["exportEnergy"]
      * number: 237502800
    ["current"]
      * number: 53
    ["apparentPower"]
      * number: 1267
    ["phaseId"]
      * number: 0
    ["cosPhi"]
      * number: -91
    ["importEnergy"]
      * number: 77511600
  [2]
    * table:
    ["publishIndex"]
      * number: 1
    ["power"]
      * number: 2730
    ["formula"]
      * string: $5500047832/1$
    ["exportEnergy"]
      * number: 6998400
    ["current"]
      * number: 227
    ["apparentPower"]
      * number: 5218
    ["phaseId"]
      * number: 1
    ["cosPhi"]
      * number: 52
    ["importEnergy"]
      * number: 590248800
  [3]
    * table:
    ["publishIndex"]
      * number: 2
    ["power"]
      * number: -1414
    ["formula"]
      * string: $5500047832/2$
    ["exportEnergy"]
      * number: 221806800
    ["current"]
      * number: 86
    ["apparentPower"]
      * number: 2097
    ["phaseId"]
      * number: 2
    ["cosPhi"]
      * number: -67
    ["importEnergy"]
      * number: 44172000
  [4]
    * table:
    ["publishIndex"]
      * number: 3
    ["power"]
      * number: 144
    ["formula"]
      * string: $5500047832/3$
    ["exportEnergy"]
      * number: 0
    ["current"]
      * number: 8
    ["apparentPower"]
      * number: 187
    ["phaseId"]
      * number: 1
    ["cosPhi"]
      * number: 76
    ["importEnergy"]
      * number: 72900000
  [5]
    * table:
    ["publishIndex"]
      * number: 4
    ["power"]
      * number: -1169
    ["formula"]
      * string: $5520006145/0$
    ["exportEnergy"]
      * number: 22492800
    ["current"]
      * number: 53
    ["apparentPower"]
      * number: 1282
    ["phaseId"]
      * number: 0
    ["cosPhi"]
      * number: -91
    ["importEnergy"]
      * number: 2746800
  [6]
    * table:
    ["publishIndex"]
      * number: 5
    ["power"]
      * number: 2726
    ["formula"]
      * string: $5520006145/1$
    ["exportEnergy"]
      * number: 6116400
    ["current"]
      * number: 228
    ["apparentPower"]
      * number: 5245
    ["phaseId"]
      * number: 1
    ["cosPhi"]
      * number: 51
    ["importEnergy"]
      * number: 18313200
  [7]
    * table:
    ["publishIndex"]
      * number: 6
    ["power"]
      * number: -1415
    ["formula"]
      * string: $5520006145/2$
    ["exportEnergy"]
      * number: 6004800
    ["current"]
      * number: 83
    ["apparentPower"]
      * number: 2035
    ["phaseId"]
      * number: 2
    ["cosPhi"]
      * number: -69
    ["importEnergy"]
      * number: 1047600
["totalReactivePower"]
  * number: -12977
["monitorStatus"]
  * number: 0
["utcTimeStamp"]
  * number: 1686054839000
["measuredFrequency"]
  * number: 49994600
["voltages"]
  * table:
  [1]
    * table:
    ["voltage"]
      * number: 240
    ["phaseId"]
      * number: 0
  [2]
    * table:
    ["voltage"]
      * number: 230
    ["phaseId"]
      * number: 1
  [3]
    * table:
    ["voltage"]
      * number: 245
    ["phaseId"]
      * number: 2
["totalImportEnergy"]
  * number: 806940000

But, how I nog put a value into an address, so I can use it?


RE: Smappee inifinity Energy Monitoring to KNX - admin - 06.06.2023

Put this instead of log(msg). Adjust group addresses and data fields as needed.
Code:
grp.checkupdate('32/1/0', msg.totalPower)
grp.checkupdate('32/1/1', msg.totalImportEnergy)

grp.checkupdate('32/1/2', msg.voltages[1].voltage)
grp.checkupdate('32/1/3', msg.voltages[2].voltage)
grp.checkupdate('32/1/4', msg.voltages[3].voltage)