User Tools

Site Tools


Integration into other systems

WebHMI allows you to interact with other systems by running HTTP requests. For this, WebHMI has a library Lua-cURLv3. Using it you can easily send data to third-party systems and also request the necessary data from these systems.

This function is available since version 2.6.4520.

POST example

An example of a program executing an HTTPS request to send data as a file at URL

function main (userId)
  INFO("Doing CURL");
  c = cURL.easy_init()
  postdata = {
      name = {
  INFO("CURL done");

Note that for SSL certificates correctly function, you need to have an exact local time. If there is a significant deviation of the local clock, https requests may not work. We recommend using time synchronization via NTP server.

GET example

Example of requesting a number in the GET request at URL and writing it to the register with id=4356:

function main (userId)
  c = cURL.easy_init()
  local res = "";
        writefunction = function(str)
            res = res .. str;
  WriteReg(4356, res);

Implementing other requests like PUT

To implement other requests, you can use special field in the cURL for the custom methods.

Here is the example of PUT request to WebHMI itself from its Lua.

function main (userId)
  local new_value = "new string"
  write_reg_with_API(1, new_value)
function write_reg_with_API(reg_id, val_)
  c = cURL.easy_init()
  c:setopt_url("" .. reg_id)    -- local host addr indicated
  c:setopt{[cURL.OPT_CUSTOMREQUEST] = "PUT"}
  c:setopt{[cURL.OPT_POSTFIELDS]    = '{"value":"' .. val_ .. '"}'}   -- insert value here
      'Content-type: application/json',
      'Accept: application/json',
      'X-WH-APIKEY: 976FA578CF3B11ADA06564464B1F01823AF81C3D'         -- check APIKEY
  c:perform({writefunction = function(res) str = res end })           -- you can print str for debug purposes 

Example - connecting to a remote module via its web server

Most currently produced remote i/o modules have configuration and status web-page for diagnostic and setup. When you have a module which is not supported by the WebHMI and the usage of the custom protocol feature is complicated, there is another option of accessing the module through its embedded web-server with HTTP requests right from WebHMI.

For a example we have the UC20-FBC-xxx (any bus Modubs, Ethernet/IP, DeviceNet etc) remote I/O module from Weidmuller. The module has web server for diagnostinc and setup:

On this page you press F12 to get necesssary information for the POST request:

Then, use this information for POST request in Lua script on the WebHMI:

The function returns json object which you can then analize and check necessary fileds to read:

Notes on cURL usage

In the fw of 4.0 version, the following issue was reported: When there are multiple cURL requests from the WebHMI to the unavailable resource, a system crash may happen. The timeout settings won't affect the sysem behaviour. Use this feature with care when you need cyclical calls of multiple cURLs in your scripts:

  • use one script which detect availablity of the resource and locks following execution for a while
  • use external watchdog circuit to reset WebHMI if you use it to control mission - critical system.

If the curl stability is the issue in your project, you can implement HTTP requests using custom protocol. See the example

HTTP / HTTPS requests

Please note that HTTPS requests are only possible in WebHMI Pro version and virtualization images.

Troubleshooting CURL requests from WebHMI

When troubleshooting your requests, you can turn on verbose information in your script. Please refer to the example below:

function main (userId)
    local res = ""    
    local c = cURL.easy_init()
    c : setopt{ url = '',
              timeout = 30, 
              httpheader = {'Accept: application/json',
                            'Content-Type: gzip, deflate, br',
                            -- 'Host: <calculated when request is sent>',
     -- sw on verbose info 
     c : setopt{[cURL.OPT_VERBOSE] = 1}  
     c : setopt{[cURL.OPT_DEBUGFUNCTION] = function(...) 
                for i, v in pairs(arg) do DEBUG(i .. ' ' .. v) end 
                return 0
         end }  
     c : perform{writefunction = function(str)
                res = res .. str
        c : close()
        if (res == '') or (res == '%[%]')then 
            ERROR('No data in response!') 
            INFO('\n' .. res) 
integration_with_other_systems.txt ยท Last modified: 2024/04/04 10:18 by emozolyak

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki