Logic Machine Forum
gsm signal - 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: gsm signal (/showthread.php?tid=5369)



gsm signal - Frank68 - 18.04.2024

HI

I followed the instructions I found in the forum on how to evaluate the modem signal, I modified the user and sms (resident) scripts as recommended, now how can I read the global variable quality to be able to represent it in visual display?
is it stored in storage?

A thousand thanks


RE: gsm signal - admin - 18.04.2024

Add grp.update like in this script (line #119): https://forum.logicmachine.net/showthread.php?tid=4896&pid=31874#pid31874


RE: gsm signal - Frank68 - 18.04.2024

(18.04.2024, 09:33)admin Wrote: Add grp.update like in this script (line #119): https://forum.logicmachine.net/showthread.php?tid=4896&pid=31874#pid31874

This is my script code

I have try to log the varibale quality but log nothing ???

Code:
-- init
if not numbers then
  require('user.sms')
  require('json')
  require('socket')

  -- allowed numbers, SMS from other numbers will be ignored
  numbers = { '3332958126' }

  -- port number depends on modem model
  comport = 'ttyUSB2'
  doreset = false -- set to true if USB reset is required before starting any communication

  -- if SIM PIN is enabled, uncomment the line below and replace 0000 with SIM PIN
  -- pincode = '0000'

  -- command parser
  parser = function(cmd, sender)
    local find, pos, name, mode, offset, value, dvalue, obj, message

    cmd = cmd:trim()
    mode = cmd:sub(1, 1):upper()

    -- invalid request
    if mode ~= 'W' and mode ~= 'R' then
      return
    end

    cmd = cmd:sub(3):trim()

    -- parse object name/address
    find = cmd:sub(1, 1) == '"' and '"' or ' '
    offset = find == '"' and 1 or 0

    -- pad with space when in read mode
    if mode == 'R' and find == ' ' then
      cmd = cmd .. ' '
    end

    -- find object name
    pos = cmd:find(find, 1 + offset, true)

    -- name end not found, stop
    if not pos then
      return
    end

    -- get name part
    name = cmd:sub(1 + offset, pos - offset):trim()

    if mode == 'W' then
      value = cmd:sub(pos + offset):trim()

      if #value > 0 then
        -- try decoding value
        dvalue = json.pdecode(value)
        if dvalue ~= nil then
          value = dvalue
        end

        -- send to bus
        grp.write(name, value)
      end
    -- read request
    else
      obj = grp.find(name)

      -- object not known
      if not obj then
        return
      end

      -- send read request and wait for an update
      obj:read()
      os.sleep(1)

      -- read new value
      value = grp.getvalue(name)

      -- got no value
      if value == nil then
        return
      end

      -- add object name if specified
      if obj.name then
        name = string.format('%s (%s)', obj.name, obj.address)
      end

      message = string.format('Value of %s is %s', name, json.encode(value))
      modem:sendsms('+' .. sender, message)
    end
  end

  -- incoming sms handler
    readcsq = function()
    local res, err, reply = modem:send('AT+CSQ')
    local rssi

    if reply then
      rssi = reply:match('%+CSQ:%s+(%d+),(%d+)')
    end

    rssi = tonumber(rssi) or 0

    if 2 <= rssi and rssi <= 9 then
      quality = 'marginal'
    elseif 10 <= rssi and rssi <= 14 then
      quality = 'ok'
    elseif 15 <= rssi and rssi <= 19 then
      quality = 'good'
    elseif 20 <= rssi and rssi <= 30 then
      quality = 'excellent'
    else
      quality = 'unknown'
    end
    grp.write('32/0/0', quality)  -- Modem signal level write to group
  end

  csqtime = os.time()
  handler = function(sms)
    --alert('incoming sms: [%s] %s', tostring(sms.sender), tostring(sms.data))
    -- sms from known number, call parser
    if table.contains(numbers, sms.sender) then
      --parser(sms.data, sms.sender)
    end
  end
 
  now = os.time()
    delta = math.abs(now - csqtime)

    if delta >= 15 then
      csqtime = now
      readcsq()
    end
 

  -- check local udp server for messages to send
  udphandler = function(server)
    -- check for local sms to send
    local msg = server:receive()
    -- got no message
    if not msg then
      return
    end

    -- split into number and message
    local sep = msg:find(' ')
    if not sep then
      return
    end

    --alert('sending sms: ' .. msg)
    modem:sendsms(msg:sub(1, sep - 1), msg:sub(sep + 1))
  end
end

-- handle data from modem
if modem then
  if modem:run() then
    udphandler(server)
  else
    --alert('SMS handler lost connection')
    modem:reinit()
  end
-- modem init
else
  --alert('SMS handler init')
  -- open serial port
  modem = AT:init('/dev/' .. comport, doreset)

  -- init ok
  if modem then
    -- set sms handler
    modem:setsmshandler(handler)

    -- send pin if set
    if pincode then
      modem:send('AT+CPIN=' .. pincode)
      modem:read()
    end

    -- set to pdu mode
    modem:send('AT+CMGF=0')
    -- enable sms notifications
    modem:send('AT+CNMI=1,1,0,0,0')
    -- fixup encoding
    modem:send('AT+CSCS="GSM"')
    -- delete all saved messages
    modem:send('AT+CMGD=1,4')

    -- local udp server for sending sms
    server = socket.udp()
    server:setsockname('127.0.0.1', 12535)
    server:settimeout(0.1)

    --alert('SMS handler started')
  -- init failed
  else
    --alert('SMS USB init failed')
  end
end



RE: gsm signal - admin - 18.04.2024

Try this:
Code:
-- init
if not numbers then
  require('user.sms')
  require('json')
  require('socket')

  -- allowed numbers, SMS from other numbers will be ignored
  numbers = { '3332958126' }

  -- port number depends on modem model
  comport = 'ttyUSB2'
  doreset = false -- set to true if USB reset is required before starting any communication

  -- if SIM PIN is enabled, uncomment the line below and replace 0000 with SIM PIN
  -- pincode = '0000'

  -- command parser
  parser = function(cmd, sender)
    local find, pos, name, mode, offset, value, dvalue, obj, message

    cmd = cmd:trim()
    mode = cmd:sub(1, 1):upper()

    -- invalid request
    if mode ~= 'W' and mode ~= 'R' then
      return
    end

    cmd = cmd:sub(3):trim()

    -- parse object name/address
    find = cmd:sub(1, 1) == '"' and '"' or ' '
    offset = find == '"' and 1 or 0

    -- pad with space when in read mode
    if mode == 'R' and find == ' ' then
      cmd = cmd .. ' '
    end

    -- find object name
    pos = cmd:find(find, 1 + offset, true)

    -- name end not found, stop
    if not pos then
      return
    end

    -- get name part
    name = cmd:sub(1 + offset, pos - offset):trim()

    if mode == 'W' then
      value = cmd:sub(pos + offset):trim()

      if #value > 0 then
        -- try decoding value
        dvalue = json.pdecode(value)
        if dvalue ~= nil then
          value = dvalue
        end

        -- send to bus
        grp.write(name, value)
      end
    -- read request
    else
      obj = grp.find(name)

      -- object not known
      if not obj then
        return
      end

      -- send read request and wait for an update
      obj:read()
      os.sleep(1)

      -- read new value
      value = grp.getvalue(name)

      -- got no value
      if value == nil then
        return
      end

      -- add object name if specified
      if obj.name then
        name = string.format('%s (%s)', obj.name, obj.address)
      end

      message = string.format('Value of %s is %s', name, json.encode(value))
      modem:sendsms('+' .. sender, message)
    end
  end

  -- incoming sms handler
    readcsq = function()
    local res, err, reply = modem:send('AT+CSQ')
    local rssi

    if reply then
      rssi = reply:match('%+CSQ:%s+(%d+),(%d+)')
    end

    rssi = tonumber(rssi) or 0

    if 2 <= rssi and rssi <= 9 then
      quality = 'marginal'
    elseif 10 <= rssi and rssi <= 14 then
      quality = 'ok'
    elseif 15 <= rssi and rssi <= 19 then
      quality = 'good'
    elseif 20 <= rssi and rssi <= 30 then
      quality = 'excellent'
    else
      quality = 'unknown'
    end
    grp.write('32/0/0', quality)  -- Modem signal level write to group
  end

  csqtime = os.time()

  handler = function(sms)
    --alert('incoming sms: [%s] %s', tostring(sms.sender), tostring(sms.data))
    -- sms from known number, call parser
    if table.contains(numbers, sms.sender) then
      --parser(sms.data, sms.sender)
    end
  end

  -- check local udp server for messages to send
  udphandler = function(server)
    -- check for local sms to send
    local msg = server:receive()
    -- got no message
    if not msg then
      return
    end

    -- split into number and message
    local sep = msg:find(' ')
    if not sep then
      return
    end

    --alert('sending sms: ' .. msg)
    modem:sendsms(msg:sub(1, sep - 1), msg:sub(sep + 1))
  end
end

-- handle data from modem
if modem then
  if modem:run() then
    udphandler(server)

    now = os.time()
    delta = math.abs(now - csqtime)

    if delta >= 15 then
      csqtime = now
      readcsq()
    end
  else
    --alert('SMS handler lost connection')
    modem:reinit()
  end
-- modem init
else
  --alert('SMS handler init')
  -- open serial port
  modem = AT:init('/dev/' .. comport, doreset)

  -- init ok
  if modem then
    -- set sms handler
    modem:setsmshandler(handler)

    -- send pin if set
    if pincode then
      modem:send('AT+CPIN=' .. pincode)
      modem:read()
    end

    -- set to pdu mode
    modem:send('AT+CMGF=0')
    -- enable sms notifications
    modem:send('AT+CNMI=1,1,0,0,0')
    -- fixup encoding
    modem:send('AT+CSCS="GSM"')
    -- delete all saved messages
    modem:send('AT+CMGD=1,4')

    -- local udp server for sending sms
    server = socket.udp()
    server:setsockname('127.0.0.1', 12535)
    server:settimeout(0.1)

    --alert('SMS handler started')
  -- init failed
  else
    --alert('SMS USB init failed')
  end
end



RE: gsm signal - Frank68 - 18.04.2024

nothing return nil from rssi
but not possible message sms work fine


RE: gsm signal - admin - 18.04.2024

Log the raw reply (around line 97):
Code:
local res, err, reply = modem:send('AT+CSQ')
log(res, err, reply)



RE: gsm signal - Frank68 - 18.04.2024

(18.04.2024, 11:11)admin Wrote: Log the raw reply (around line 97):
Code:
local res, err, reply = modem:send('AT+CSQ')
log(res, err, reply)

Yes found problem in this line

as always thank you very much