Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Get the DeviceType associated with the Device. The DeviceType specifies the device at a logical level (i.e. Lightdimmable light, Thermostatthermostat, etc).Typically, sub-classes of the Device class will have a member called "DEVICE_TYPE" which identifies the device, and this method will return that member, as well as a categorical level (i.e. lighting, hvac, etc).

Parameters

None.

Returns

Return TypeDescription
DeviceType

A class containing a "type" field to describe the device at a logical level (i.e. dimmable light), as well as a "category" field to describe its group (i.e. lighting).

See the "Zigbee Device Descriptors" section in the Zigbee Specification References document for more details about what these identifiers would look like for zigbee devices.

...

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
// use DeviceType to filter for all the lights on the network
Collection<Device> lights the network
Collection<Device> lights = gw.listDevices( d -> d.getDeviceType().getType().equals("dimmable light") );
...

getConnectedGatewayId()

Usage

Get the unique identifier of the Gateway that this Device is connected to.

The ID returned by this method can be used in any API that requires an identifier returned by Device.getID().

Parameters

None.

Returns

Return TypeDescription
Optional<String>

The unique identifier for the Gateway that this Device is connected to.

The Optional will be empty if there are errors.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gw.listDevicesgetDevice( d -> d.getDeviceTypeid);
String gatewayId = device.getConnectedGatewayId().getTypeget(); 
device.equalsbindDevice("dimmable light") gatewayId, "zoneStatus");
...


Properties API

getProperties()

Usage

Gets all known Properties associated with this device. If there are no known Properties on the Device (for example, because they haven't yet been read via a call to "getProperty", or discovered via a call to "discoverAllProperties", or otherwise reported to the Gateway via a reporting mechanism, etc), then this method will return an empty Collection of Property objects.

...

This is a non-blocking call which returns a CompletableFuture of a Collection of Property objects.

Parameters

None.

Returns

Return TypeDescription
CompletableFuture<Collection<Property>>

A CompletableFuture which contains a Collection of Property objects containing the most recently known value for that Property.

The CompletableFuture will return exceptionally if not all properties could be obtained, or if a retry is required.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));

...

Device device = gateway.getDevice(id);
CompletableFuture<Collection<Property>> properties = device.getProperties();
            
// do some extra (asynchronous) handling on the properties, once they've been discovered.
properties.thenAccept( collection -> {
    // This code will be called from a thread managed by gateway api.
    // We should avoid blocking code in this section.
    for (Property p : collection) {
        System.out.println(p.toString());
    }
});

...

// one could also block on the CompletableFuture until it returns
Collection<Property> c = properties.get(30, TimeUnit.SECONDS); // wait (block) for up to 30 seconds to get the Collection of Property objects back

getCachedProperties()

Usage

Gets all last known (cached) Property objects associated with this device. Cached values are updated on reads, writes, and attribute reports.

...

Returns a Collection of Property objects. The returned collection will be empty if there are no known Properties on the Device because they haven't yet been read or discovered (i.e. no previous calls to getProperty(String) or discoverAllProperties() has been made).

Parameters

None.

Returns

Return TypeDescription
Collection<Property>

A Collection of Property objects containing the last known value for that Property.

Will be empty if no device discovery has taken place (i.e. no previous calls to getProperties() have been made)

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gateway.getDevice(id);
Collection<Property> collection = device.getCachedProperties();

for (Property p : collection) {
    System.out.println(p.toString());
}

getProperty(String propertyName)

Usage

Gets the Property with the associated propertyName.

...

This is a non-blocking call which returns a CompletableFuture of the requested Property.

Parameters

NameTypeDescription
propertyNameStringThe name associated with the Property. For example, for zigbee devices, it could be any attribute name from the Zigbee Attribute Names page.

Returns

Return TypeDescription
CompletableFuture<Property>

The CompletableFuture<Property> represents a request over the network to read/write the Property. Will return exceptionally on any and all errors.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gateway.getDevice(id);
CompletableFuture<Property> futureProperty = device.getProperty(propertyName);

// This is an example of blocking on the future and waiting for a result.
Property property = futureProperty.get(30, TimeUnit.SECONDS);
System.out.println(p.toString());

// One could also provide code that will be called asynchronously once the CompletableFuture has finished
futureProperty.thenAccept( p -> System.out.println(p.toString()) );

getCachedProperty(String propertyName)

Usage

Gets the Property with the associated propertyName.

...

Returns an Optional of the requested Property. The Optional will be empty if the cached Property doesn't exist.

Parameters

NameTypeDescription
propertyNameStringThe name associated with the Property. For example, for zigbee devices, it could be any attribute name from the Zigbee Attribute Names page.

Returns

Return TypeDescription
Optional<Property>

The Optional<Property> represents the Property. Will be empty if the Property doesn't exist or hasn't yet been discovered (i.e. from a previous call to getProperty / getProperties())

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gateway.getDevice(id);
Optional<Property> optional = device.getCachedProperty(propertyName);
if (optional.isPresent()) {
    Property p = optional.get();
    System.out.println(p.toString());
}

getProtocolProperties()

Usage

Gets all known protocol properties from the device on the network (i.e. if it's a zigbee device, it will return the known zigbee attributes on the Device). If there are no known protocol properties on the Device (for example, because they haven't yet been read or discovered), then this method will return an empty Collection of Property objects.

...

This is a non-blocking call which returns a CompletableFuture of a Collection of Property objects.

Parameters

None.

Returns

Return TypeDescription
CompletableFuture<Collection<Property>>

A CompletableFuture which contains a Collection of Property objects containing the most recently known value for that Property.

The CompletableFuture will return exceptionally if not all properties could be obtained, or if a retry is required.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));

...

Device device = gateway.getDevice(id);
CompletableFuture<Collection<Property>> properties = device.getProtocolProperties();
            
// do some extra (asynchronous) handling on the properties, once they've been discovered.
properties.thenAccept( collection -> {
    // This code will be called from a thread managed by gateway api.
    // We should avoid blocking code in this section.
    for (Property p : collection) {
        System.out.println(p.toString());
    }
});

...

// one could also block on the CompletableFuture until it returns
Collection<Property> c = properties.get(30, TimeUnit.SECONDS); // wait (block) for up to 30 seconds to get the Collect of Property objects back

getCachedProtocolProperties()

Usage

Gets all last known (cached) protocol level properties associated with this device. Cached values are updated on writes, reads, and attribute reports.

...

Returns a Collection of Property objects. The returned collection will be empty if no device discovery has taken place (i.e. no previous calls to getProperties() / getProtocolProperties() have been made).

Parameters

None.

Returns

Return TypeDescription
Collection<Property>

A Collection of Property objects containing the last known value for that Property.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gateway.getDevice(id);
Collection<Property> properties = d.getCachedProtocolProperties();
for (Property p : properties) {
    System.out.println(p.toString);
}

discoverAllProperties()

Usage

Gets all Property objects, and their values, that exist on the remote device. Note that this is a potentially long-running call. See below for more information.

...

Note that this is potentially a long-running call, because the remote device may have many properties, or may be a sleepy battery powered device which responds to requests over long intervals in order to preserve battery power. This call is typically not used in production applications, as system integrators typically know in advance which properties they want to interact with, and will simply use the "getProperty" and "updateProperty" methods to interact with them directly, without having to discover all the properties on the device.

Parameters

None.

Returns

Return TypeDescription
CompletableFuture<Collection<Property>>

A CompletableFuture of a Collection of Property objects.

Will compete exceptionally on any errors.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
Device device = gateway.getDevice(id);

CompletableFuture<Collection<Property>> properties = device.discoverAllProperties();

// asynchronously print out the values once discovery is complete.
properties.thenAccept( collection -> {
    for (Property p : collection) {
        System.out.println("Discovered: " + p.toString());
    }
});

updateProperty(Property property)

Usage

Updates the Property associated with this device.

Parameters

NameTypeDescription
propertyPropertyAn object containing the name and value of the Property to update.

Returns

Return TypeDescription
Device.PropertyCommandData

Represents a request to read or write a Property.

Contains a CompletableFuture<Property> and a cached Property.

The CompletableFuture<Property> represents a request over the network to read/write the Property. Will be null if Property doesn't exist, and will return exceptionally on any other errors.

The cached Property contains the last known value, or empty if none/doesn't exist.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
// turn a light device on
final Device d = gw.getDevice(id);
Property property = new Property("OnOff, "boolean", "true");
d.updateProperty(property).getFuture().whenComplete( (result, throwable) -> {
    if (throwable != null) {
        System.out.println("error: " + throwable.getMessage());
    } else if (result != null) {
        System.out.println("result: " + result.getValue());    
    }
});

...

bindDevice(String destinationDeviceId, String propertyToBind)

Usage

Creates a binding between this device (the source) and a destination device, on the specified Property.

...

Note that if the Properties of a Device haven't yet been discovered, the bind will fail. It is assumed that the properties of a Device have been discovered (using a call like getProperties for example) before being able to bind to a specific Property.

Parameters

NameTypeDescription
destinationDeviceIdStringThe ID of the destination device that we want to bind to.
propertyToBindStringThe name of the Property to bind on. For example, OnOff.

Returns

Return TypeDescription
Optional<CommandData>

An optional CommandData object, which contains a CompletableFuture<String> of the future result, as well as a cached version of the result since the last call.

The result can contain error codes or messages. Usually, it will return a simple "success" if successful.

...

InvalidInputException if the supplied parameters are incorrect, refer to objects that don't exist or properties that can't be bound or don't exist because a discovery has not taken place yet.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
final
Device sourceDevice = gw.getDevice(sourceId);
String destinationDeviceId = sourceDevice.getConnectedGatewayId().get();
sourceDevice.bindDevice(destinationIddestinationDeviceId, property)
			.get()
	        .getCommandResult()
	        .whenComplete((result, error) -> {
	            if (error != null) {
	                System.out.println("error calling bind: " + error.getMessage());
	            } else {
	            	System.out.println("bind device result: " + result);
	            }
			});

unbindDevice(String destinationDeviceId, String propertyToBind)

Usage

Removes the binding between this device (the source) and the destination device.

Parameters

NameTypeDescription
destinationDeviceIdStringThe ID of the destination device that we want to bind to.
propertyToBindStringThe name of the Property to bind on. For example, OnOff.

Returns

Return TypeDescription
Optional<CommandData>

An optional CommandData object, which contains a CompletableFuture<String> of the future result, as well as a cached version of the result since the last call.

The result can contain error codes or messages. Usually, it will return a simple "success" if successful.

...

InvalidInputException if the supplied parameters are incorrect, refer to objects that don't exist or properties that can't be bound or don't exist because a discovery has not taken place yet.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
final Device sourceDevice = gw.getDevice(sourceId);
String destinationDeviceId = sourceDevice.getConnectedGatewayId().get();
sourceDevice.unbindDevice(destinationIddestinationDeviceId, property)
			.get()
	        .getCommandResult()
	        .whenComplete((result, error) -> {
	            if (error != null) {
	                System.out.println("error calling unbind: " + error.getMessage());
	            } else {
	            	System.out.println("unbind device result: " + result);
	            }
			});

configureReporting(String propertyToBind, List<Parameter> parameters)

Usage

Configures reporting a specified Property on this device. Reports are generally sent to the destination device that has a binding (see bind() method) on the same Property being configured using the configureReporting() method.

Note: for reporting to work for zigbee devices, you must creating a binding between the remote Device and the GatewayClient (by using the bind() API first).

Parameters

NameTypeDescription
propertyToBindStringThe name of the Property to bind on. For example, onOff.
parametersList<Parameter>

A list of Parameter objects representing various configuration options.

See below for a list of configuration parameters that are currently supported.

...

NameValueDescription
ConfigureReportingParameter.DIRECTION0x00The receiver of the command should send reports to each destination, as resolved by the bindings for the cluster hosting the properties to be reported.
ConfigureReportingParameter.MIN_REPORTING_INTERVAL0x0000 - 0xFFFFThe minimum interval, in seconds, between issuing reports of the specified property.
ConfigureReportingParameter.MAX_REPORTING_INTERVAL0x0000 - 0xFFFFThe maximum interval, in seconds, between issuing reports of the specified property.
ConfigureReportingParameter.REPORTABLE_CHANGEOptionalThe minimum change to the property that will result in a report being issued. This field is of variable length. For attributes with 'analog' data type (things that can be represented by integers, floats, etc.) the field has the same data type as the attribute. Discrete data types (such as boolean, arrays, strings, etc) can omit this field.

Returns

Return TypeDescription
Optional<CommandData>

An optional CommandData object, which contains a CompletableFuture<String> of the future result, as well as a cached version of the result since the last call.

The result can contain error codes or messages. Usually, it will return a simple "success" if successful.

...

InvalidInputException if the supplied parameters are incorrect, or refer to properties or configuration parameters that don't exist or are malformed, etc.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
final Device device = gw.getDevice(id);
List<Parameter> onOffParams = new ArrayList<>();
onOffParams.add(new Parameter(ConfigureReportingParameter.DIRECTION, "0x00"));
onOffParams.add(new Parameter(ConfigureReportingParameter.MIN_REPORTING_INTERVAL, "0x0000"));
onOffParams.add(new Parameter(ConfigureReportingParameter.MAX_REPORTING_INTERVAL, "0x012C")); // 5 minutes
try {
    CompletableFuture<String> futureResult = device.configureReporting("onOff", onOffParams).get().getCommandResult();
    String result = futureResult.get(30, TimeUnit.SECONDS);
    System.out.println("result: " + result);
} catch (Exception e) {
    throw new CompletionException(e);
}

enableDefaultReporting(String propertyToBind, List<Parameter> parameters)

Usage

Configures the Device to report to the GatewayClient whenever there are changes to its properties.

Depending on the Device type (i.e. LightDevice, ThermostatDevice), this method will configure different attributes for reporting. Calling this method on the DefaultDevice will have no effect.

Parameters

None.

Returns

Return TypeDescription
CompletableFuture<String>

A CompletableFuture<String> that will contain the result of the call.

The result can contain error codes or messages. Usually, it will return a simple "success" if successful.

...

IllegalStateException if the function is called before the Device Properties have been discovered (i.e. through getProperties()).

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
final Device device = gw.getDevice(idStr);
try {
    final String result = device.enableDefaultReporting().get(30, TimeUnit.SECONDS);
    System.out.println("Status for command: " + result);
} catch (IllegalStateException | InterruptedException | ExecutionException | TimeoutException e) {
    System.out.println(e.getMessage());
}

...

addPropertyUpdateHandler(BiConsumer<Device, Property> handler)

Usage

Adds a Property update listener that is triggered when any Property on a Device changes.

Will reject duplicates handler instances.

Parameters

NameTypeDescription
handlerBiConsumer<Device, Property>

An instance or lambda that implements the BiConsumer<Device, Property> interface.

Returns

Return TypeDescription
booleanReturns true if the handler was added to the list; false otherwise.

Examples

Code Block
languagejava
public class SamplePropertyHandler implements BiConsumer<Device, Property> {
    @Override
    public void accept(Device device, Property property) {
        // This method gets called whenever a Property on a device changes.
        // By default, client callbacks are called from a single thread managed by gateway api.
        // Therefore, avoid writing blocking code in this method, or other client callbacks
        // (such as DeviceEventHandlers, or ProtocolHandlers) may be blocked.
        System.out.println("Property update triggered for device: " + device.getID());
        System.out.println(p.toString());
}

...

GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
Device device = gateway.getDevice(id);

// example of supplying a class that implements the BiConsumer<Device, Property> interface
device.addPropertyUpdateHandler(new SamplePropertyHandler());

// example of a supplying a lambda
d.addPropertyUpdateListener(p -> {
	System.out.println("lambda property update triggered for device: " + d.getID());
    System.out.println(p.toString());
});

removePropertyUpdateHandler(BiConsumer<Device, Property> handler)

Usage

Removes a previously added handler.

Parameters

NameTypeDescription
handlerBiConsumer<Device, Property>An instance that implements the BiConsumer<Device, Property> interface.

Returns

Return TypeDescription
booleanReturns true if the handler was removed; false otherwise.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...

SamplePropertyUpdateHandler handler = new SamplePropertyUpdateHandler();
gateway.getDevice(id).addPropertyUpdateHandler(handler);
...
// do stuff
...
gateway.getDevice(id).removePropertyUpdateHandler(handler);

removeAllPropertyUpdateHandlers()

Usage

Removes all handlers that have been previously registered.

Parameters

None.

Returns

Return TypeDescription
booleanReturns true if any handlers were removed; false otherwise.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
gw.getDevice(id).removeAllPropertyUpdateHandlers();

addProtocolHandler(BiConsumer<Device, String> handler)

Usage

Adds a Protocol Handler that is triggered when any protocol level message from the Device is being passed through to the application.

Will reject duplicate handler instances.

Parameters

NameTypeDescription
handlerBiConsumer<Device, String>

An instance or lambda that implements the BiConsumer<Device, String> interface.

Returns

Return TypeDescription
booleanReturns true if the handler was added to the list; false otherwise.

Examples

Code Block
languagejava
public class SampleProtocolHandler implements BiConsumer<Device, String> {
    @Override
    public void accept(Device device, String json) {
        // This method will be called whenever an underlying protocol message is being passed through.
        // By default, client callbacks are called from a single thread managed by GAPI.
        // Therefore, avoid writing blocking code in this method, or other client callbacks
        // (such as DeviceEventHandlers, or PropertyUpdateHandlers) may be blocked.

        // See the ProtocolPassthrough documentation for the format of the json message,
        // or inspect the ZigBeeMessageTypeAdapter class for possible key names.
        try {
            final JsonObject jsonObject = jsonParser.parse(json).getAsJsonObject();
            final JsonObject message = jsonObject.get(ZigBeeMessageTypeAdapter.MESSAGE_KEY).getAsJsonObject();
            
            System.out.println("protocol passthru msg: " + message.toString());

        } catch (Exception ex) {
            System.out.println("Exception handling protocol msg: " + json + ", Exception: " + ex.toString());
        }
    }
}

...

GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
Device device = gateway.getDevice(id);

// example of supplying a class that implements the BiConsumer<Device, String> interface
device.addProtocolHandler(new SampleProtocolHandler());

// example of a supplying a lambda
d.addPropertyUpdateListener( (d,json) -> {
	System.out.println("lambda property update triggered for device: " + d.getID());
    System.out.println("json: " + json);
});

removeProtocolHandler(BiConsumer<Device, String> handler)

Usage

Removes a previously added handler.

Parameters

NameTypeDescription
handlerBiConsumer<Device, String>An instance that implements the BiConsumer<Device, String> interface.

Returns

Return TypeDescription
booleanReturns true if the handler was removed; false otherwise.

Examples

Code Block
languagejava
GatewayClient gateway = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...

SamplePropertyUpdateHandler handler = new SampleProtocolHandler();
gateway.getDevice(id).addProtocolHandler(handler);
...
// do stuff
...
gateway.getDevice(id).removeProtocolHandler(handler);

removeAllProtocolHandlers()

Usage

Removes all handlers that have been previously registered.

Parameters

None.

Returns

Return TypeDescription
booleanReturns true if any handlers were removed; false otherwise.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
gw.getDevice(id).removeAllProtocolHandlers();

Network API

leaveNetwork()

Usage

Request the device to leave the network.

Parameters

None.

Returns

None.

Examples

Code Block
languagejava
GatewayClient gw = new GatewayClient(new ConnectionInfo(ConnectionType.ZIGBEE_UART, "/dev/ttyUSB0"));
...
final Device d = gw.getDevice(id);                
d.leaveNetwork();

...