Najpierw przygotowujemy funkcje pomocnicze:

-- podstawowa obsługa logu
function log(...)
  print(os.date(), ...)
end

-- funkcja uruchamiająca port modbus
function modbus_reset()
  err = modbus.open(100,"RTU",9600,8,"ODD",1)
end

-- Obsluga bledow modbus
function modbus_error(nr_bledu)
  if nr_bledu == 3000 then
  log("Uplynal czas odpowiedzi.")
  elseif nr_bledu == 3003 then
  log("Brak interfejsu RS485.")
  elseif nr_bledu == 5002 then
  log("Nieprawidlowy adres slave.")
  elseif nr_bledu == 5003 then
  log("Uzyto nieprawidlowej komendy.")
  else
  log("Nieznany blad:" .. nr_bledu)
  end
end

Od tego momentu możemy już uruchomić program, uruchamiamy go raz na 3 sekundy:

  --HoldingRegister-----------
 
  result, values = modbus.hr_read(SE8000_id,1,4) --odczyt 4 rejestrĂłw zaczynajÄ…c od adresu 1 z urzadzenia o id SE8000_id
  if result == 0 then
  ME.BV110 = values[1] --temperature scale
  ME.AV110 = values[2] --jezyk
  ME.AV114 = values[3] --fan mode
  ME.AV112 = values[4] --system mode
  else
  modbus_error(result)
  end
 
  result, values = modbus.hr_read(SE8000_id,23,1)
  if result == 0 then
  ME.AV116 = values[1] --occupancy command
  ME.AV120 = values[1] --network units
  else
  modbus_error(result)
  end
 
  result, values = modbus.hr_read(SE8000_id,81,2)
  if result == 0 then
  ME.AV160 = values[1] --custom button icon
  ME.AV162 = values[2] --custom button behaviour
  else
  modbus_error(result)
  end

  result, values = modbus.hr_read(SE8000_id,4001,2)
  if result == 0 then
  --ME.AV130 = values[1] / 10 -- occ cool setpoint
  ME.AV132 = values[2] / 10 -- occ heat setpoint
  else
  modbus_error(result)
  end
 
  if ME.AV132 ~= ME.AV133 then
  if ME.AV132_Present_Value.time > ME.AV133_Present_Value.time then
  ME.AV133 = ME.AV132
  else
  result = modbus.hr_write(SE8000_id,4002,ME.AV133*10)
  end
  end
 
  result, values = modbus.hr_read(SE8000_id,4009,2)
  if result == 0 then
  ME.AV138 = values[1] / 10 -- sby cool setpoint
  ME.AV140 = values[2] / 10 -- sby heat setpoint
  else
  modbus_error(result)
  end
 
  result, values = modbus.hr_read(SE8000_id,4017,2)
  if result == 0 then
  ME.AV118 = values[1] -- password
  else
  modbus_error(result)
  end
 
  result, values = modbus.hr_read(SE8000_id,8001,1)
  if result == 0 then
  ME.AV151 = values[1] -- PI Heating Demand
  --ME.AV152 = values[2] -- PI Cooling Demand
  else
  modbus_error(result)
  end
 
 
  --IN-----------
 
  result, values = modbus.in_read(SE8000_id,1,3)
  if result == 0 then
  ME.AV150 = values[1] / 10 --temperatura pomieszczenia
  ME.AV155 = values[3] / 10 --nawiew
  else
  modbus_error(result)
  end
 
  result, values = modbus.in_read(SE8000_id,1002,1)
  if result == 0 then
  ME.AV156 = values[1] --jasnosc w pomieszczeniu
  else
  modbus_error(result)
  end

 
end

A dodatkowo raz na 10 minut sczytajmy sobie dodatkowe rejestry:

if every(600) then

  result, values = modbus.in_read(SE8000_id,9001,6)
  if result == 0 then
  ME.AV101 = values[1]
  ME.AV102 = values[2]
  ME.AV103 = values[3]
  ME.AV104 = values[4]
  ME.AV105 = values[5]
  ME.AV106 = values[6]
  else
  modbus_error(result)
  end
 

end

A teraz to co ma się wykonać możliwie szybko:

if ME.BV110 ~= ME.BV111 then
  if ME.BV110_Present_Value.time > ME.BV111_Present_Value.time then
  ME.BV111 = ME.BV110
  else
  result = modbus.hr_write(SE8000_id,1,ME.BV111)
  end
end

--av117 z harmonogramu, av116 status z regulatora
if ME.AV116 ~= ME.AV117 then
  if ME.AV116_Present_Value.time > ME.AV117_Present_Value.time then
  ME.AV117 = ME.AV116
  if ME.AV116 > 1 then
  ME.BV122 = 1 --2 unocc
  ME.BV121 = 0
  ME.BV120 = 0
  elseif ME.AV116 > 0 then
  ME.BV122 = 0
  ME.BV121 = 1 --1 occ
  ME.BV120 = 0
  else
  ME.BV122 = 0
  ME.BV121 = 0
  ME.BV120 = 1 --0 local
  end
  else
  result = modbus.hr_write(SE8000_id,22,ME.AV117)
  end
end

if every(30) then
  --result = modbus.hr_write(SE8000_id,4003,ME.AV135*10) --unocc cool setpoint
  result = modbus.hr_write(SE8000_id,4004,ME.AV137*10) --unocc heat setpoint
end




  if ME.AV160 ~= ME.AV161 then
  if ME.AV160_Present_Value.time > ME.AV161_Present_Value.time then
  ME.AV161 = ME.AV160
  else
  result = modbus.hr_write(SE8000_id,81,ME.AV161)
  end
  end
 
  if ME.AV162 ~= ME.AV163 then
  if ME.AV162_Present_Value.time > ME.AV163_Present_Value.time then
  ME.AV163 = ME.AV162
  else
  result = modbus.hr_write(SE8000_id,82,ME.AV163)
  end
  end