Samples REST - vpjuslin/openhab GitHub Wiki

Examples for accessing REST API

Introduction

Please see below sample code for accessing openhab's REST API.

jquery

Accessing REST API via jquery (tested with jquery 2.0 and Chrome v26.0

Read state of an item:

function getState()
{
	var request = $.ajax
	({
		type       : "GET",
		url        : "http://192.168.100.21:8080/rest/items/MyLight/state"
	});

	request.done( function(data) 
	{ 
		console.log( "Success: Status=" + data );
	});

	request.fail( function(jqXHR, textStatus ) 
	{ 
		console.log( "Failure: " + textStatus );
	});
}

Set state of an item:

function setState( txtNewState )
{
	var request = $.ajax
	({
		type       : "PUT",
		url        : "http://192.168.100.21:8080/rest/items/MyLight/state",
		data       : txtNewState, 
		headers    : { "Content-Type": "text/plain" }
	});

	request.done( function(data) 
	{ 
		console.log( "Success" );
	});

	request.fail( function(jqXHR, textStatus ) 
	{ 
		console.log( "Failure: " + textStatus );
	});
}

Send command to an item:

function sendCommand( txtCommand )
{
	var request = $.ajax
	({
		type       : "POST",
		url        : "http://192.168.100.21:8080/rest/items/MyLight",
		data       : txtCommand,
		headers    : { 'Content-Type': 'text/plain' }
	});

	request.done( function(data) 
	{ 
		console.log( "Success: Status=" + data );
	});

	request.fail( function(jqXHR, textStatus ) 
	{ 
		console.log( "Failure: " + textStatus );
	});
}

cURL

Accessing REST API via cURL. cURL is useful on shell scripts (Win/Linux/OS X) or e.g. on Automator (OS X).

Get state:

curl http://192.168.100.21:8080/rest/items/MyLight/state

Set state:

curl --header "Content-Type: text/plain" --request PUT --data "OFF" http://192.168.100.21:8080/rest/items/MyLight/state

Send command:

curl --header "Content-Type: text/plain" --request POST --data "ON" http://192.168.100.21:8080/rest/items/MyLight

PHP

Simple PHP function to set a switch state using the REST interface.

Set state:

function doPostRequest($item, $data) {
  $url = "http://192.168.1.121:8080/rest/items/" . $item;

  $options = array(
    'http' => array(
        'header'  => "Content-type: text/plain\r\n",
        'method'  => 'POST',
        'content' => $data  //http_build_query($data),
    ),
  );

  $context  = stream_context_create($options);
  $result = file_get_contents($url, false, $context);

  return $result;
}

Example function use:

doPostRequest("doorbellSwitch", "ON");

If the post was successful the function will return the state you set, EG above returns "ON"

Python

Python code snippets for the OpenHAB REST API

def polling_header(self):
    """ Header for OpenHAB REST request - polling """
    self.auth = base64.encodestring('%s:%s'
                       %(self.username, self.password)
                       ).replace('\n', '')
    return {
        "Authorization" : "Basic %s" % self.cmd.auth,
        "X-Atmosphere-Transport" : "long-polling",
        "X-Atmosphere-tracking-id" : self.atmos_id,
        "X-Atmosphere-Framework" : "1.0",
        "Accept" : "application/json"}

def basic_header(self):
    """ Header for OpenHAB REST request - standard """
    self.auth = base64.encodestring('%s:%s'
                       %(self.username, self.password)
                       ).replace('\n', '')
    return {
            "Authorization" : "Basic %s" %self.auth,
            "Content-type": "text/plain"}

def post_command(self, key, value):
    """ Post a command to OpenHAB - key is item, value is command """
    url = 'http://%s:%s/rest/items/%s'%(self.openhab_host,
                                self.openhab_port, key)
    req = requests.post(url, data=value,
                            headers=self.basic_header())
    if req.status_code != requests.codes.ok:
        req.raise_for_status()
        
def put_status(self, key, value):
    """ Put a status update to OpenHAB  key is item, value is state """
    url = 'http://%s:%s/rest/items/%s/state'%(self.openhab_host,
                                self.openhab_port, key)
    req = requests.put(url, data=value, headers=self.basic_header())
    if req.status_code != requests.codes.ok:
        req.raise_for_status()     

def request_item(self, name):
    """ Request updates for any item in group NAME from OpenHAB.
     Long-polling will not respond until item updates.
    """
    # When an item in Group NAME changes we will get all items in group ROS
    # and need to determine which has changed
    url = 'http://%s:%s/rest/items/%s'%(self.openhab_host,
                                    self.openhab_port, name)
    payload = {'type': 'json'}
    try:
        req = requests.get(url, params=payload,
                            headers=self.polling_header())
        if req.status_code != requests.codes.ok:
            req.raise_for_status()
        # Try to parse JSON response
        # At top level, there is type, name, state, link and members array
        members = req.json()["members"]
        for member in members:
            # Each member has a type, name, state and link
            name = member["name"]
            state = member["state"]
            do_publish = True
            # Pub unless we had key before and it hasn't changed
            if name in self.prev_state_dict:
                if self.prev_state_dict[name] == state:
                    do_publish = False
            self.prev_state_dict[name] = state
            if do_publish:
                self.publish(name, state)