Http Api command to Zennio Getface IP
#1
Hi,
 
On a project I’m working on, we have a kNX switch that shall open a lock, in the main door of a house. The video intercom device is a Zennio Getface IP. I want to use the LM5 lite that I already have, to be used as a gateway. To my knowledge the Zennio Getface Ip has Http Api license installed.

Is it possible to do? And if so can someone help me?
LM5 ip:                                 192.168.1.103
Zennio Getface ip:           192.168.1.101   
 
See link below for manual to Zennio Getface IP:
http://zennio.com/video-intercom/getface...basic-unit

Best Regard.
Even Sundgot.
Reply
#2
Do you have documentation on HTTP API? Sending requests via HTTP is simple, but without documentation there's nothing we can help with.
Reply
#3
(15.05.2018, 08:39)admin Wrote: Do you have documentation on HTTP API? Sending requests via HTTP is simple, but without documentation there's nothing we can help with.


Hi,

 
I can`t find anything on Zennio Gatface Ip documentation, but on 2N who is the manufacture i found this:


https://wiki.2n.cz/hip/hapi/latest/en

BR Even
Reply
#4
Attach this code to an event script (boolean object). It will contol switch 1 depending on object value. Make sure that Switch API is enabled without encryption and authentication. log(...) call at the end should be removed if script is working correctly.

Code:
require('socket.http')

switch = 1

value = event.getvalue()
if value then
  action = 'on'
else
  action = 'off'
end

url = 'http://192.168.1.101/api/switch/ctrl?switch=' .. switch .. '&action=' .. action
res, err = socket.http.request(url)

log(res, err)
Reply
#5
(16.05.2018, 12:38)admin Wrote: Attach this code to an event script (boolean object). It will contol switch 1 depending on object value. Make sure that Switch API is enabled without encryption and authentication. log(...) call at the end should be removed if script is working correctly.

Code:
require('socket.http')

switch = 1

value = event.getvalue()
if value then
 action = 'on'
else
 action = 'off'
end

url = 'http://192.168.1.101/api/switch/ctrl?switch=' .. switch .. '&action=' .. action
res, err = socket.http.request(url)

log(res, err)

Hi

Works perfectly, thanks! Smile

Now to my next question, how to read a input from Zennio Getface IP ? 
is there an easy way?

Br Even.
Reply
#6
State has to be polled so you need a resident script. Adjust sleep time as needed, but do not use 0 as it will consume all CPU.
Uncomment and modify grp calls depending on how many inputs are used.
Code:
require('json')
require('socket.http')

res, err = socket.http.request('http://192.168.1.101/api/io/status')
if res then
  data = json.pdecode(res)

  if type(data) == 'table' then
    ports = data.result.ports
    log(ports)
    -- grp.checkwrite('1/1/1', ports[ 1 ].state)
    -- grp.checkwrite('1/1/1', ports[ 2 ].state)
  else
    alert('failed to decode data')
  end
else
  alert('http request failed ' .. tostring(err))
end

-- release unused resources
collectgarbage('collect')
Reply
#7
(18.05.2018, 08:07)admin Wrote: State has to be polled so you need a resident script. Adjust sleep time as needed, but do not use 0 as it will consume all CPU.
Uncomment and modify grp calls depending on how many inputs are used.
Code:
require('json')
require('socket.http')

res, err = socket.http.request('http://192.168.1.101/api/io/status')
if res then
 data = json.pdecode(res)

 if type(data) == 'table' then
   ports = data.result.ports
   log(ports)
   -- grp.checkwrite('1/1/1', ports[ 1 ].state)
   -- grp.checkwrite('1/1/1', ports[ 2 ].state)
 else
   alert('failed to decode data')
 end
else
 alert('http request failed ' .. tostring(err))
end

-- release unused resources
collectgarbage('collect')

Hi Admin,

Thank you! 

It kinda works, but not 100%.

When triggering input1 nothing happens.
When triggering ext1.input1 port 2 goes to ON.
When triggering ext1.input2 nothing happens

Im not shure if it`s the Getface that is the problem or what? do you have an idea?

From current errors:

Test Script Getface 18.05.2018 10:21:51
Resident script:9: attempt to index field 'result' (a nil value)
stack traceback:


From Log:

Test Script Getface 18.05.2018 11:02:05
* table:
[1]
 * table:
  [state]
   * number: 0
  [port]
   * string: led_secured
[2]
 * table:
  [state]
   * number: 0
  [port]
   * string: relay1
[3]
 * table:
  [state]
   * number: 0
  [port]
   * string: output1
[4]
 * table:
  [state]
   * number: 0
  [port]
   * string: input1
[5]
 * table:
  [state]
   * number: 0
  [port]
   * string: ext1.relay1
[6]
 * table:
  [state]
   * number: 0
  [port]
   * string: ext1.relay2
[7]
 * table:
  [state]
   * number: 0
  [port]
   * string: ext1.input1
[8]
 * table:
  [state]
   * number: 0
  [port]
   * string: ext1.input2


BR Even.
Reply
#8
You access the same URL (http://192.168.1.101/api/io/status) in your browser and check whether input states change or not.
Error checking can be improved like this:
Code:
if type(data) == 'table' and type(data.result) == 'table' and type(data.result.ports) == 'table' then
    ports = data.result.ports
Reply
#9
(18.05.2018, 09:32)admin Wrote: You access the same URL (http://192.168.1.101/api/io/status) in your browser and check whether input states change or not.
Error checking can be improved like this:
Code:
 if type(data) == 'table' and type(data.result) == 'table' and type(data.result.ports) == 'table' then
   ports = data.result.ports

Hi,

When using the url, i see that all innputs work like they should. 
I think the problem is the port number, it doesn`t seem to match the input correctly.

Do you have an idea?

BR Even.

(18.05.2018, 10:40)Evens Wrote:
(18.05.2018, 09:32)admin Wrote: You access the same URL (http://192.168.1.101/api/io/status) in your browser and check whether input states change or not.
Error checking can be improved like this:
Code:
 if type(data) == 'table' and type(data.result) == 'table' and type(data.result.ports) == 'table' then
   ports = data.result.ports

Hi,

When using the url, i see that all innputs work like they should. 
I think the problem is the port number, it doesn`t seem to match the input correctly.

Do you have an idea?

BR Even.

Correction, i missunderstood. 

It works, perfectly! Smile

Thanks!

BR Even.
Reply
#10
It might be that array input order is not defined. Try this instead:
Code:
ports = {}

for _, p in ipairs(data.result.ports) do
  ports[ p.port ] = p.state
end

grp.checkwrite('1/1/1', ports['ext1.input1'])
grp.checkwrite('1/1/2', ports['ext1.input2'])
Reply
#11
(18.05.2018, 10:46)admin Wrote: It might be that array input order is not defined. Try this instead:
Code:
ports = {}

for _, p in ipairs(data.result.ports) do
 ports[ p.port ] = p.state
end

grp.checkwrite('1/1/1', ports['ext1.input1'])
grp.checkwrite('1/1/2', ports['ext1.input2'])

it did work, i just didn`t change the port number.

it was on 1 and 2 and i didn`t change it. so when changing to 4 and 7 it worked perfectly.
the reason why it worked on 2 is becouse relay 1 is linked to ext.input 1 in the getface. 

[1] led_secured
[2] relay1
[3] output1
[4] input1
[5] ext1.relay1
[6] ext1.relay2
[7] ext1.input1
[8] ext1.input2

Thanks, for all the help! Smile

BR Even.
Reply


Forum Jump: