Table of Contents

Lighting interfaces

Preliminaries

All communications should be done over HTTP/1.1 so as to allow for keepalive.

Timestamp format

According to ISO 8601, plus microseconds, see examples:

Lamp (device) addressing

Lamps (devices) are addressed using (cabinet id, device id) pairs:

GET /CID/DID/...
PUT /

Where:

All keywords (apart from “all”) can be added in the future. Everything that is not one of the reserved keywords is treated as a cabinet ID or lamp ID, respectively.

Examples

For a single device:

GET /34/44/...

For a range of device IDs:

GET /34/10-13/...

For a set of device IDs:

GET /34/4,6,13/...

Interfaces

Control interface

Change lamp parameters:

PUT /

with the following request data:

{
  "data": [
    { "cid": 34, "did": 1, "params": [ { "k" : "dimming", "v": 50 }, {"k": "state", "v": "on",} ] },
    { "cid": 34, "did": 5, "params": [ {"k": "state", "v": "off"} ]} 
  ]
}

That will set:

Returns confirmation that particular parameters are set with additional timestamp:

{ 
  "timestamp": "2014-03-25T14:03:22.547342Z", 
  "data": [
    { "cid": 34, "did": 10, "params": [ {"k": "state", "v": "on" } ] },
    ...
  ]
}

If the parameter cannot be changed, or if it is nonexistant a null value is returned:

Request:

 {"data":[{"cid":1, "did": 25, "params":[ { "k":"detecdted", "v":"false"}, { "k":"detected", "v":"false"}]}]} 

Reply:

{
  "timestamp":"2014-05-30T21:37:39.088752+0200",
  "data": [
    {
      "cid":1,
      "did":25,
      "params": [ {"k":"detecdted", "v":null},  {"k":"detected", "v":"false"} ]
    }
  ]
}

State interface

Get device state

 GET /CID/DID/state
 

Returns:

{ 
  "timestamp": "2014-03-25T14:03.547Z", 
  "data": [
    { "cid": 34, "did": 10, "params": [ {"k": "state", "v": "on" } ] },
    ...
  ]
}

Get lamp dimming

 GET /CID/DID/dimming
 

Returns:

{ 
  "timestamp": "2014-03-25T14:03.547Z", 
  "data": [
    { "cid": 34, "did": 10, "params": [ {"k": "dimming", "v": 50 } ] },
    ...
  ]
}

Get multiple parameters

 GET /CID/DID/state,dimming
 

Returns:

{ 
  "timestamp": "2014-03-25T14:03.547Z", 
  "data": [
    { "cid": 34, "did": 10, "params": [ {"k": "state", "v": "on" }, {"k": "dimming", "v": 50 } ] },
    ...
  ]
}

Get all parameters

 GET /CID/DID/all
 

Returns:

{ 
  timestamp: "2014-03-25T14:03.547Z", 
  data: [
    { "cid": 34, "did": 10, "params": [ { "k": "state", "v": "on" }, ... ] },
    ...
  ]
}

Subscribe to parameter changes

This is done by specifying the lasttimestamp GET parameter, which contains the last known timestamp of an update:

GET /34/all/state?lasttimestamp=2014-03-25T14:03:18.547989+0100

If something has changed from that timestamp, the response will be issued immediately with the current data.

If nothing has changed, the connection will hang until an update of any queried parameters occurs.

Nonexistant CID, DID or parameters

In case of nonexistant CID, DID or parameters a null is returned as parameter value

Assuming that foo does not exist the following request:

1/9/status,foo

results in:

{
  "timestamp":"2014-09-17T11:31:29.804738+0200",
  "data": [
    {
      "cid":1,
      "did":9,
      "params": [ {"k":"status", "v":0.0},  {"k":"foo", "v":null} ]
    }
  ]
}

Log interface

Subscribe to newly generated logs

GET /log/CID/DID

No response is given initially; connection is kept alive and every time any log entries appear, an object containing a single array object called log data, which in turn contains log entries, is supplied

{
  "logdata": [
     { json obj }
  ]
}

Get logs from a certain date and subscribe to new entries

GET /log/CID/DID?fromtimestamp=XXXXXXX

Response:

{
  "lastknowntimestamp": XXXXXXX
  "logdata": [
     { json obj },
     { json obj },
     ...
     { json obj }
  ]
}

connection is then kept alive and every time any new log entries appear, an object containing a single array object called log data, which in turn contains log entries, is supplied

{
  "logdata": [
     { json obj }
  ]
}

Get logs from a certain period

GET /log/CID/DID?fromtimestamp=XXXXXXX&totimestamp=YYYYYYY

Response:

{
  "lastknowntimestamp": XXXXXXX
  "logdata": [
     { json obj },
     { json obj },
     ...
     { json obj }
  ]
}

connection is then closed.

Logged data

Assumming that there is a GET request: http://192.168.20.1/2/3/state, json obj in the above statements is structured as:

{
  "timestamp": TTTTT,
  "who": "192.168.20.1",
  "type": "request",
  "method": "GET",
  "origin": "192.168.20.2", 
  "target": "192.168.20.1",
  "cid":  2,
  "did": 3, 
  "resource": "state",
  "payload": null
}

where

LIMS interface

LIMS Info interface

Main goal:

GET /info

Response:

[
  {
    "type": "d",
    "class": "dark",
    "idx": 1,
    "attributes": [
		{"key": "detected", "communication": "ro", "type": "atom", "values": [ "true", "false", "unknown" ]},
		{"key": "control", "communication": "rw", "type": "numeric",  "ranges": [ {"from": 0, to: 10, "precision": 0.1 } ] } 
	      ]    
 
    "cid": 1,
    "did": 22,
    "coordinates": { "lat": 45.7811111,  "lon": -108.5038888, "alt": 12.223112 }
  },
  ...
]

where attributes object consists of:

A complete example:

[
  {
    "type":"d",
    "class":"done",
    "idx":1,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":1,
    "coordinates": {"lon":19.972399, "lat":50.066368, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":2,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":2,
    "coordinates": {"lon":19.972399, "lat":50.066353, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":3,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":3,
    "coordinates": {"lon":19.972534, "lat":50.066368, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":4,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":4,
    "coordinates": {"lon":19.972534, "lat":50.066357, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":5,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":5,
    "coordinates": {"lon":19.972408, "lat":50.06628, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":6,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":6,
    "coordinates": {"lon":19.972408, "lat":50.066265, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":7,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":7,
    "coordinates": {"lon":19.972542, "lat":50.066284, "alt":0.0}
  },
  {
    "type":"d",
    "class":"done",
    "idx":8,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":8,
    "coordinates": {"lon":19.972542, "lat":50.066269, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":1,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":9,
    "coordinates": {"lon":19.972359, "lat":50.066387, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":2,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":10,
    "coordinates": {"lon":19.972464, "lat":50.066395, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":3,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":11,
    "coordinates": {"lon":19.972553, "lat":50.066399, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":4,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":12,
    "coordinates": {"lon":19.972368, "lat":50.066322, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":5,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":13,
    "coordinates": {"lon":19.972433, "lat":50.066322, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":6,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":14,
    "coordinates": {"lon":19.972496, "lat":50.066322, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":7,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":15,
    "coordinates": {"lon":19.972559, "lat":50.066326, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":8,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":16,
    "coordinates": {"lon":19.972376, "lat":50.066235, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":9,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":17,
    "coordinates": {"lon":19.972569, "lat":50.066238, "alt":0.0}
  },
  {
    "type":"l",
    "class":"light",
    "idx":10,
    "attributes": [
      {
	"key":"status",
	"communication":"rw",
	"type":"numeric",
	"values": [],
	"ranges": [ {"from":0.0, "to":100.0, "precision":10.0} ]
      }
    ],
    "cid":1,
    "did":18,
    "coordinates": {"lon":19.972492, "lat":50.066177, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":11,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":19,
    "coordinates": {"lon":19.972399, "lat":50.066391, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":12,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":20,
    "coordinates": {"lon":19.972528, "lat":50.066395, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":13,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":21,
    "coordinates": {"lon":19.972401, "lat":50.066322, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":14,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":22,
    "coordinates": {"lon":19.972536, "lat":50.066326, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":15,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":23,
    "coordinates": {"lon":19.972406, "lat":50.066235, "alt":0.0}
  },
  {
    "type":"d",
    "class":"present",
    "idx":16,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":24,
    "coordinates": {"lon":19.972544, "lat":50.066238, "alt":0.0}
  },
  {
    "type":"d",
    "class":"dark",
    "idx":21,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["true", "false" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":25,
    "coordinates": {"lon":19.972429, "lat":50.066425, "alt":0.0}
  },
  {
    "type":"d",
    "class":"hour",
    "idx":22,
    "attributes": [
      {
	"key":"detected",
	"communication":"ro",
	"type":"atom",
	"values": ["night", "day" ],
	"ranges": []
      }
    ],
    "cid":1,
    "did":26,
    "coordinates": {"lon":19.972481, "lat":50.066425, "alt":0.0}
  }
]