<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.hubitat.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dman2306</id>
	<title>Hubitat Documentation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.hubitat.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dman2306"/>
	<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Special:Contributions/Dman2306"/>
	<updated>2026-05-01T00:51:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=EventStream_Interface&amp;diff=5320</id>
		<title>EventStream Interface</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=EventStream_Interface&amp;diff=5320"/>
		<updated>2021-11-15T02:11:34Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: /* connect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Overview=&lt;br /&gt;
Hubitat allows for opening and maintaining a connection to an event stream endpoint from the hub.  All code needs to be contained in a driver, there is no option to open an event stream connection from an app.  Hubitat provides methods to connect and disconnect to the endpoint, in addition it is required to create a method in the driver that accepts incoming messages (parse) and another method that will be called with any status updates for the endpoint (eventStreamStatus).&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==Hubitat Provided Methods==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void connect(String url)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void connect(String url, [options (name/value pairs)])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: url - The url to connect to.&lt;br /&gt;
:: options - Optional parameters to configure the web socket connection. Possible values: &lt;br /&gt;
:::''pingInterval'' - The number of seconds to send a ping message.  Defaults to 0 (disabled).&lt;br /&gt;
:::''headers'' - A Map of key/value pairs to send as header values when connecting to the web socket server.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.2.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''rawData'' (since 2.2.2) - possible values: true, false. Prevents parsing of the data read from the stream and returns the raw data to the caller. Defaults to false.&lt;br /&gt;
:::''readTimeout'' (since 2.2.9) - The number of seconds before a read times out. Defaults to 60.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void close()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // Close connection&lt;br /&gt;
 interfaces.eventStream.close()&lt;br /&gt;
&lt;br /&gt;
==User defined methods==&lt;br /&gt;
&lt;br /&gt;
: '''&amp;lt;code&amp;gt;parse(String message)&amp;lt;/code&amp;gt;'''  - This method is called with any incoming messages from the event stream server. This is a standard method for drivers.&lt;br /&gt;
&lt;br /&gt;
: '''&amp;lt;code&amp;gt;eventStreamStatus(String message)&amp;lt;/code&amp;gt;''' - This method is called with any status messages from the event stream client connection (disconnections, errors during connect, etc)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=5323</id>
		<title>Common Methods Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=5323"/>
		<updated>2021-11-15T00:34:09Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: /* asynchttpGet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Top}}&lt;br /&gt;
&lt;br /&gt;
These methods can be used in both Apps and Drivers&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;celsiusToFahrenheit&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts a given Celsius temperature to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;BigDecimal celsiusToFahrenheit(BigDecimal val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: A temperature in Celsius.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: The specified temperature in Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;fahrenheitToCelsius&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts a given Fahrenheit temperature to Celsius&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;BigDecimal fahrenheitToCelsius(BigDecimal val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: A temperature in Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: The specified temperature in Celsius.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLocation&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Location getLocation()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getSunriseAndSunset&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the sunset and sunrise values for the current day. (Common method since 2.1.0)&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset(Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: options - Map with optional offset for sunrise or sunset, possible values are sunriseOffset and sunsetOffset and can either be a number of minutes or a String of the format Hours:Minutes&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map with with key values 'sunrise' and 'sunset' of type Date&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // get today's sunrise and sunset&lt;br /&gt;
 def riseAndSet = getSunriseAndSunset()&lt;br /&gt;
 log.debug riseAndSet.sunrise&lt;br /&gt;
 log.debug riseAndSet.sunset&lt;br /&gt;
 &lt;br /&gt;
 // get sunrise time offset by 1 minute early, and get sunset offset by 1 hour, 5 minutes later&lt;br /&gt;
 def offsetRiseAndSet = getSunriseAndSunset(sunriseOffset: -1, sunsetOffset: &amp;quot;1:05&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTemperatureScale&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get the current temperature scale set for the hub.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getTemperatureScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: String - &amp;quot;F&amp;quot; or &amp;quot;C&amp;quot; based on the setting in the hub.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;now&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: long now()&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeToday&amp;lt;/code&amp;gt;===&lt;br /&gt;
: Get a Date object with today's date and the time specified&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date timeToday(String timeString, TimeZone timeZone = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: timeString - The time to use, can be either &amp;quot;HH:mm&amp;quot; or and ISO8601 date/time string&lt;br /&gt;
:: timeZone - (Optional) The timezone to use for the new Date.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Date - A Date object with today's date and the time that was passed as timeString&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeOfDayIsBetween&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Check if a date is between two dates.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;boolean timeOfDayIsBetween(Date start, Date stop, Date value[, TimeZone timeZone])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
&lt;br /&gt;
:: start - The date to start comparison against.&lt;br /&gt;
:: stop - The date to stop comparison against.&lt;br /&gt;
:: value - The date to compare&lt;br /&gt;
:: timezone - (Optional) The timezone to use for the comparison&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: boolean - true if the value date is between the start and stop dates, otherwise returns false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unschedule&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Remove any scheduled tasks.  If method is called without paramters, all schedules will be removed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule(handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: handlerMethod - Only remove schedules for this handlerMethod&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request and return control to the calling code.  Any response from the call will be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void asynchttpGet(callbackMethod, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
:: params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPost(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPatch&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPatch(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http PATCH call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request.  Any response from the call will be passed to the closure.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(String uri, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPostJson&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Similar to httpPost except that the contentType parameter is set to &amp;quot;application/json&amp;quot;&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, String stringBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, Map mapBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::stringBody - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::mapBody - The body of the request as a Map.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it as JSON.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.8) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPut&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPatch (Since 2.1.7)&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
:::''followRedirects'' (since 2.2.9) - possible values: true, false. Determines whether or not redirects will be automatically followed. Defaults to true.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runIn&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void runIn(Long delayInSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::delayInSeconds - How long to wait in seconds until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
::handlerMethod - The name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a scheduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    runIn(50, 'myMethod', [data: [&amp;quot;myKey&amp;quot;:&amp;quot;myValue&amp;quot;]])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runInMillis&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void runInMillis(Long delayInMilliSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: delayInMilliseconds - How long to wait until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
:: handlerMethod - the name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a schduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    private processQueue(Map queue) {&lt;br /&gt;
      if (isQueueEmpty(queue)) {&lt;br /&gt;
          sendEvent name: 'lifxdiscovery', value: 'complete'&lt;br /&gt;
          return&lt;br /&gt;
      }&lt;br /&gt;
      def data = getNext(queue)&lt;br /&gt;
      sendPacket data.ipAddress, data.packet&lt;br /&gt;
      runInMillis(queue.delay, 'processQueue', [data: queue])&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    runInMillis(50, 'processQueue', [data: queue])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;pauseExecution&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; void pauseExecution(Long millisecs)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: millisecs - The amount of time in milliseconds to pause.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts text to speech.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map textToSpeech(String stringToBeSynthesized, String voice = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::stringToBeSynthesized - The text to be converted to audio. The text may contain supported [https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html SSML tags].&lt;br /&gt;
::voice - The name of a voice supported by Amazon Polly, you can find a list of voices [https://docs.aws.amazon.com/polly/latest/dg/voicelist.html here]. If not specified the default system setting is used.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with two entries, &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; which contains a URI to the MP3 file and &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt; is the length of the MP3 in seconds.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTTSVoices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a list of the supported text-to-speech voices.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map getTTSVoices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with three entries &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; which is the name of a voice that can be specified to &amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gender&amp;lt;/code&amp;gt; which contains either Male or Female, and &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; which contains the language of this voice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;toDateTime&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date toDateTime(String dateTimeString)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::dateTimeString - A date/time string in ISO8601 format. (&amp;quot;yyyy-MM-dd&amp;quot;, &amp;quot;yyyyMMdd'T'HHmmssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ss.SSSX&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;schedule&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void schedule(String expression, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::expression - a [http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html 7] parameter [http://www.quartz-scheduler.org/ quartz] cron string where the expression is: &amp;quot;Seconds&amp;quot; &amp;quot;Minutes&amp;quot; &amp;quot;Hours&amp;quot; &amp;quot;Day Of Month&amp;quot; &amp;quot;Month&amp;quot; &amp;quot;Day Of Week&amp;quot; &amp;quot;Year&amp;quot;&lt;br /&gt;
::handlerMethod - method to run at given schedule&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
&lt;br /&gt;
:;Example&lt;br /&gt;
    // run 'mymethod' every tenth minute.&lt;br /&gt;
    schedule('0 */10 * ? * *', mymethod)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Signature:'''&lt;br /&gt;
 void httpPutJson(String uri, String body, Closure closure)&lt;br /&gt;
 void httpPutJson(String uri, Map body, Closure closure)&lt;br /&gt;
 void httpPutJson(Map params, Closure closure)&lt;br /&gt;
 void httpDelete(Map params, Closure closure)&lt;br /&gt;
 String getMACFromIP(String ipAddr)&lt;br /&gt;
 String convertTemperatureIfNeeded(BigDecimal value, String scale, Integer precision)&lt;br /&gt;
 Object parseJson(String stringToParse)&lt;br /&gt;
 Object parseJsonFromBase64(String stringToParse)&lt;br /&gt;
 GPathResult parseXML(String stringToParse)&lt;br /&gt;
 Map parseLanMessage(String stringToParse)&lt;br /&gt;
 void runEvery1Minute(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery5Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery10Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery15Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery30Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery1Hour(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery3Hours(String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(String dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void schedule(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void asynchttpPut(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpDelete(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpHead(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 String encrypt(String value)&lt;br /&gt;
 String decrypt(String value)&lt;br /&gt;
 void sendLocationEvent(Map properties)&lt;br /&gt;
 Date timeTodayAfter(String startTimeString, String timeString, TimeZone timeZone = null) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(Number minutes) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(String hoursAndMinutesString) (Common method since 2.1.0)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=NetworkUtils_Object&amp;diff=5139</id>
		<title>NetworkUtils Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=NetworkUtils_Object&amp;diff=5139"/>
		<updated>2021-05-27T01:52:34Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Created page with &amp;quot;==Description== The package name of this class is hubitat.helper.  So to use in an App or Driver you would reference it with hubitat.helper.NetworkUtils.  == &amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description==&lt;br /&gt;
The package name of this class is hubitat.helper.  So to use in an App or Driver you would reference it with hubitat.helper.NetworkUtils.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;ping&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Performs an ICMP ping and returns the results.&lt;br /&gt;
&lt;br /&gt;
'''Signature'''&lt;br /&gt;
 PingData ping(String IPAddress)&lt;br /&gt;
 PingData ping(String IPAddress, Integer count)&lt;br /&gt;
&lt;br /&gt;
'''Parameters'''&lt;br /&gt;
&lt;br /&gt;
 IPAddress - The IP Address to ping&lt;br /&gt;
 count - The number of ping requests to send (defaults to 3, maximum is 5).&lt;br /&gt;
&lt;br /&gt;
'''Returns'''&lt;br /&gt;
&lt;br /&gt;
 PingData - An object containing the following properties:&lt;br /&gt;
Double rttAvg - Average Round Trip Time&lt;br /&gt;
Double rttMin - Minimum Round Trip Time&lt;br /&gt;
Double rttMax - Maximum Round Trip Time&lt;br /&gt;
Integer packetsTransmitted - Ping requests sent&lt;br /&gt;
Integer packetsReceived - Responses received&lt;br /&gt;
Integer packetLoss - Responses lost&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=5138</id>
		<title>Developer Documentation</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=5138"/>
		<updated>2021-05-27T01:46:01Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: /* Method Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Top}}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;App Structure&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[App_Definition|&amp;lt;big&amp;gt;Definition&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[App_Preferences|&amp;lt;big&amp;gt;Preferences&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[App_Code|&amp;lt;big&amp;gt;Code&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[App_OAuth|&amp;lt;big&amp;gt;OAuth Process&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;Driver Structure&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[Device_Definition|&amp;lt;big&amp;gt;Definition&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Device_Preferences|&amp;lt;big&amp;gt;Preferences&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Device_Code|&amp;lt;big&amp;gt;Code&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;Method Documentation&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[App_Object|&amp;lt;big&amp;gt;App&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Driver_Object|&amp;lt;big&amp;gt;Driver&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Common_Methods_Object|&amp;lt;big&amp;gt;Common Methods&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Attribute_Object|&amp;lt;big&amp;gt;Attribute&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Capability_Object|&amp;lt;big&amp;gt;Capability&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Command_Object|&amp;lt;big&amp;gt;Command&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Device_Object|&amp;lt;big&amp;gt;Device&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Event_Object|&amp;lt;big&amp;gt;Event&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Hub_Object|&amp;lt;big&amp;gt;Hub&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[HubAction_Object|&amp;lt;big&amp;gt;HubAction&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[HubMultiAction_Object|&amp;lt;big&amp;gt;HubMultiAction&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Protocol_Object|&amp;lt;big&amp;gt;Protocol&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[InstalledApp_Object|&amp;lt;big&amp;gt;InstalledApp&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Location_Object|&amp;lt;big&amp;gt;Location&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Mode_Object|&amp;lt;big&amp;gt;Mode&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[State_Object|&amp;lt;big&amp;gt;State&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Zwave_Object|&amp;lt;big&amp;gt;Zwave&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Zigbee_Object|&amp;lt;big&amp;gt;Zigbee&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[HexUtils_Object|&amp;lt;big&amp;gt;HexUtils&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[ColorUtils_Object|&amp;lt;big&amp;gt;ColorUtils&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[NetworkUtils_Object|&amp;lt;big&amp;gt;NetworkUtils&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;App Interfaces&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[Hubitat® Safety Monitor Interface|&amp;lt;big&amp;gt;Hubitat&amp;lt;sup&amp;gt;®&amp;lt;/sup&amp;gt; Safety Monitor Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;Driver Interfaces&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[EventStream_Interface|&amp;lt;big&amp;gt;EventStream Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Telnet_Interface|&amp;lt;big&amp;gt;Telnet Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Websocket_Interface|&amp;lt;big&amp;gt;Websocket Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[Raw_Socket_Interface|&amp;lt;big&amp;gt;Raw Socket Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
:[[MQTT_Interface|&amp;lt;big&amp;gt;MQTT Interface&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;ZWave Classes&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[ZWave_Classes|&amp;lt;big&amp;gt;ZWave Classes&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;big&amp;gt;Capabilities&amp;lt;/big&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
:[[Driver_Capability_List|&amp;lt;big&amp;gt;Driver&amp;lt;/big&amp;gt; &amp;lt;big&amp;gt;Capability List&amp;lt;/big&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Doc Card Document List.png|frameless|alt=Go to the full document list|link=Hubitat_Elevation_Documentation]]&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_OAuth&amp;diff=3046</id>
		<title>App OAuth</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_OAuth&amp;diff=3046"/>
		<updated>2020-06-07T21:23:20Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Created page with &amp;quot;== OAuth Workflow ==  When communicating with a 3rd Party REST API, it may be necessary to provide OAuth authentication. OAuth is an industry standard way of allowing two appl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OAuth Workflow ==&lt;br /&gt;
&lt;br /&gt;
When communicating with a 3rd Party REST API, it may be necessary to provide OAuth authentication. OAuth is an industry standard way of allowing two applications to talk to each other without having to share your username and password. In this case it means the 3rd party API has your credentials, but Hubitat Elevation will not.&lt;br /&gt;
&lt;br /&gt;
The first step to supporting OAuth in your app is to enable it following the directions listed at https://docs.hubitat.com/index.php?title=How_to_Install_Custom_Apps&lt;br /&gt;
&lt;br /&gt;
You will then need to create an access token done using &amp;lt;code&amp;gt;createAccessToken()&amp;lt;/code&amp;gt;. Calling this method will automatically store the access token in `state.accessToken`.&lt;br /&gt;
&lt;br /&gt;
You will next need to redirect the user to the API's OAuth endpoint. The URL should be provided by the vendor. Traditionally you will need to specify the following query string parameters:&lt;br /&gt;
&lt;br /&gt;
* response_type=code&lt;br /&gt;
* client_id=valueProvidedByVendorAPI&lt;br /&gt;
* scope=scopesAvailableInVendorAPI&lt;br /&gt;
* redirect_uri=https://cloud.hubitat.com/oauth/stateredirect&lt;br /&gt;
* state=urlPathToRedirectToAfterOAuth&lt;br /&gt;
&lt;br /&gt;
The value of state should be set to a webservice endpoint in your App (defined using &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt;). The value will look like:&lt;br /&gt;
&amp;lt;code&amp;gt;${getHubUID()}/apps/${app.id}/yourWebserviceNameHere?access_token=${state.accessToken}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the user authorizes your App through the vendor's website, they will be redirected to your URL so that you can continue the OAuth process. &lt;br /&gt;
&lt;br /&gt;
At this point you will need to request the OAuth token. This is done, usually, via a POST method to an API endpoint provided by the vendor. Traditionally you will pass the following in the body or query string depending on the vendor:&lt;br /&gt;
&lt;br /&gt;
* grant_type=authorization_code&lt;br /&gt;
* code=authCodePassedInQueryStringToWebserviceMethod&lt;br /&gt;
* client_id=valueProvidedByVendorAPI&lt;br /&gt;
* redirect_uri=https://cloud.hubitat.com/oauth/stateredirect&lt;br /&gt;
&lt;br /&gt;
Consult the vendor's API documentation for the exact parameters.&lt;br /&gt;
&lt;br /&gt;
At this point you will receive a result that includes both the token and your refresh token. Consult the vendor's documentation for information on how frequently you must refresh the token and how to supply the token to each REST API call.&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=3045</id>
		<title>Developer Documentation</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=3045"/>
		<updated>2020-06-07T21:21:47Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: /* App Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==App Structure==&lt;br /&gt;
:[[App_Definition|Definition]]&lt;br /&gt;
:[[App_Preferences|Preferences]]&lt;br /&gt;
:[[App_Code|Code]]&lt;br /&gt;
:[[App_OAuth|OAuth Process]]&lt;br /&gt;
&lt;br /&gt;
==Driver Structure==&lt;br /&gt;
:[[Device_Definition|Definition]]&lt;br /&gt;
:[[Device_Preferences|Preferences]]&lt;br /&gt;
:[[Device_Code|Code]]&lt;br /&gt;
&lt;br /&gt;
==Method Documentation==&lt;br /&gt;
&lt;br /&gt;
:[[App_Object|App]]&lt;br /&gt;
:[[Driver_Object|Driver]]&lt;br /&gt;
:[[Common_Methods_Object|Common Methods]]&lt;br /&gt;
:[[Attribute_Object|Attribute]]&lt;br /&gt;
:[[Capability_Object|Capability]]&lt;br /&gt;
:[[Command_Object|Command]]&lt;br /&gt;
:[[Device_Object|Device]]&lt;br /&gt;
:[[Event_Object|Event]]&lt;br /&gt;
:[[Hub_Object|Hub]]&lt;br /&gt;
:[[HubAction_Object|HubAction]]&lt;br /&gt;
:[[HubMultiAction_Object|HubMultiAction]]&lt;br /&gt;
:[[Protocol_Object|Protocol]]&lt;br /&gt;
:[[InstalledApp_Object|InstalledApp]]&lt;br /&gt;
:[[Location_Object|Location]]&lt;br /&gt;
:[[Mode_Object|Mode]]&lt;br /&gt;
:[[State_Object|State]]&lt;br /&gt;
:[[Zwave_Object|Zwave]]&lt;br /&gt;
:[[Zigbee_Object|Zigbee]]&lt;br /&gt;
:[[HexUtils_Object|HexUtils]]&lt;br /&gt;
:[[ColorUtils_Object|ColorUtils]]&lt;br /&gt;
&lt;br /&gt;
==Driver Interfaces==&lt;br /&gt;
&lt;br /&gt;
:[[EventStream_Interface|EventStream Interface]]&lt;br /&gt;
:[[Telnet_Interface|Telnet Interface]]&lt;br /&gt;
:[[Websocket_Interface|Websocket Interface]]&lt;br /&gt;
:[[Raw_Socket_Interface|Raw Socket Interface]]&lt;br /&gt;
:[[MQTT_Interface|MQTT Interface]]&lt;br /&gt;
&lt;br /&gt;
==ZWave Classes==&lt;br /&gt;
:[[ZWave_Classes|ZWave Classes]]&lt;br /&gt;
&lt;br /&gt;
==Capabilities==&lt;br /&gt;
&lt;br /&gt;
:[[Driver_Capability_List|Capability List]]&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Location_Object&amp;diff=2971</id>
		<title>Location Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Location_Object&amp;diff=2971"/>
		<updated>2020-05-15T19:03:26Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: /* getTimeFormat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Location object is composed of methods that allow you to interact with the settings and values of a location.  This object is available to Apps and Drivers via the &amp;quot;getLocation()&amp;quot; method or simply using the property &amp;quot;location&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Properties==&lt;br /&gt;
===&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;===&lt;br /&gt;
A unique id for the location, as a Long.&lt;br /&gt;
===&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;===&lt;br /&gt;
The name of the location as a String.&lt;br /&gt;
===&amp;lt;code&amp;gt;temperatureScale&amp;lt;/code&amp;gt;===&lt;br /&gt;
The temperature scale of the location as a String (C or F).&lt;br /&gt;
===&amp;lt;code&amp;gt;timeZone&amp;lt;/code&amp;gt;===&lt;br /&gt;
The time zone of the location as a TimeZone object.&lt;br /&gt;
===&amp;lt;code&amp;gt;zipCode&amp;lt;/code&amp;gt;===&lt;br /&gt;
The zip code of the location as a String.&lt;br /&gt;
===&amp;lt;code&amp;gt;latitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
The latitude of the location as a BigDecimal.&lt;br /&gt;
===&amp;lt;code&amp;gt;longitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
The longitude of the location as a BigDecimal.&lt;br /&gt;
===&amp;lt;code&amp;gt;sunrise&amp;lt;/code&amp;gt;===&lt;br /&gt;
The sunrise of the location as a Date.&lt;br /&gt;
===&amp;lt;code&amp;gt;sunset&amp;lt;/code&amp;gt;===&lt;br /&gt;
The sunset of the location as a Date.&lt;br /&gt;
===&amp;lt;code&amp;gt;hsmStatus&amp;lt;/code&amp;gt;===&lt;br /&gt;
The current status of the Hubitat Safety Monitor. This is a String of one of the following values: armedAway, armingAway, armedHome, armingHome, armedNight, armingNight, disarmed, allDisarmed&lt;br /&gt;
===&amp;lt;code&amp;gt;hubs&amp;lt;/code&amp;gt;===&lt;br /&gt;
A list of hubs for this location as a List&amp;lt;Hub&amp;gt;.  In Hubitat there is only one Hub in the list.&lt;br /&gt;
===&amp;lt;code&amp;gt;hub&amp;lt;/code&amp;gt;===&lt;br /&gt;
The Hub for this location.&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;getFormattedLatitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;getFormattedLongitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;getTimeFormat&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieves whether or not the hub is set to 12 or 24 hour time. &lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;int getTimeFormat()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: 12 if the time is set to 12 hour (am/pm), 24 if it is set to 24 hour.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getModes&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get a list of modes for the location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Mode&amp;gt; getModes()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getMode&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get the current mode of the location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getMode()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setMode&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;currentMode&amp;lt;/code&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Code&amp;diff=2955</id>
		<title>Device Code</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Code&amp;diff=2955"/>
		<updated>2020-04-16T18:54:21Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Initial work on describing the code inside a device driver.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The bulk of the work a driver does is done inside it's general code section. This is where you write methods and members using the Groovy programming language to define how you driver functions. Drivers can be very different depending on what they do. A driver that communicates with a ZWave device is going to look very different than one that is a virtual device with nothing physical in the real world or one that communicates over Telnet to a LAN device. This article gives you a general overview of device driver code but they will vary greatly depending on what the device driver is intended to do.&lt;br /&gt;
&lt;br /&gt;
==Built-In Callback Methods==&lt;br /&gt;
Device drivers can contain a few built-in callback methods that are triggered but the Hubitat environment in response to certain actions. &lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;installed&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the device is first created and can be used to initialize any device specific configuration and setup.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void installed()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;uninstalled&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the device is removed to allow for any necessary cleanup.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void uninstalled()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updated&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the preferences of a device are updated.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void updated()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;parse&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called in response to a message received by the device driver. Depending on the driver this could be from any number of sources. This could be a Z-Wave message, Zigbee message, telnet message, websocket message, etc. Depending on the type of message received you will likely need to parse the &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; string into something more useful. The following list of methods are useful for decoding the description:&lt;br /&gt;
&lt;br /&gt;
:* MQTT - &amp;lt;code&amp;gt;interfaces.mqtt.parseMessage&amp;lt;/code&amp;gt;&lt;br /&gt;
:* RAW_LAN - &amp;lt;code&amp;gt;parseLanMessage&amp;lt;/code&amp;gt;&lt;br /&gt;
:* Zigbee - &amp;lt;code&amp;gt;zigbee.parse&amp;lt;/code&amp;gt;&lt;br /&gt;
:* Z-Wave - &amp;lt;code&amp;gt;zwave.parse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Event parse(String description)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Defined Methods==&lt;br /&gt;
User defined methods are where your driver does &amp;quot;everything else.&amp;quot; It is where you implement commands, define callbacks for scheduled events, create callbacks for event subscriptions, etc. Essentially you can do just about anything in a user defined method that you can do in a normal Groovy method.&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2936</id>
		<title>InstalledApp Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2936"/>
		<updated>2020-04-08T16:47:25Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added getid documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===&amp;lt;code&amp;gt;getId&amp;lt;/code&amp;gt;===&lt;br /&gt;
: Returns the internal ID that represents the installed app in Hubitat.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Long getId()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The internal ID of the current app.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getInstallationState&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a value indicating whether the app is currently installed or, if you are in the initial setup, that it is not.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getInstallationState()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::&amp;lt;code&amp;gt;COMPLETE&amp;lt;/code&amp;gt; if the app is installed, otherwise &amp;lt;code&amp;gt;INCOMPLETE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Get the current label of the installed app.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The current label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Example&lt;br /&gt;
 def appLabel = app.getLabel()&lt;br /&gt;
 log.debug &amp;quot;app label is ${appLabel}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;updateLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Update the label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::void updateLabel(String label)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - new label for installed app&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updateSetting&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Updates the value of a setting (preference) to the specified value. If the setting does not exist, this method will create it.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Long value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Boolean value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, String value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Date value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, List value)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::name - The name of the setting to update&lt;br /&gt;
::value - The value to store in the setting&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional Methods to Document&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getName()&lt;br /&gt;
 List&amp;lt;EventSubscriptionWrapper&amp;gt; getSubscriptions()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Definition&amp;diff=2925</id>
		<title>Device Definition</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Definition&amp;diff=2925"/>
		<updated>2020-04-07T02:23:35Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Fixed a typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The driver definition provides the Hubitat Elevation hub with information about a Driver you wish to install. The format is slightly different from an App as the definition must appear inside of a &amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; block. Additionally it allows you to define the capabilities, commands, and attributes associated with the driver.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
 metadata {&lt;br /&gt;
     definition(&lt;br /&gt;
         ...&lt;br /&gt;
     ) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Entries==&lt;br /&gt;
:: author - The author of this driver&lt;br /&gt;
:: description - A text description of the app that is displayed in the popup when the '''Add User App'' button is clicked&lt;br /&gt;
:: importUrl - The URL where the Groovy code for this app can be found&lt;br /&gt;
:: name - The name of the app&lt;br /&gt;
:: namespace - The namespace within which the Groovy class for the application will be stored&lt;br /&gt;
&lt;br /&gt;
==Capabilities==&lt;br /&gt;
A device driver can provide one or more capabilities. Capabilities are defined by the Hubitat environment. When you specify that a driver supports a specific capability, you must also implement any commands it requires. The list of supported capabilities can be found on the [[Driver_Capability_List|Driver Capability List]]&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;capability &amp;quot;Capability Name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fingerprints==&lt;br /&gt;
Fingerprints provide a way for you to tell Hubitat how to identify a Zigbee or ZWave device based on certain properties and characteristics of the device.&lt;br /&gt;
&lt;br /&gt;
===Zigbee===&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
::&amp;lt;code&amp;gt;fingerprint profileId: &amp;quot;profileId&amp;quot;, inClusters: &amp;quot;clusters&amp;quot;, outClusters: &amp;quot;clusters&amp;quot;, manufacturer: &amp;quot;manufacturerId&amp;quot;, model: &amp;quot;modelId&amp;quot;, deviceJoinName: &amp;quot;name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zwave===&lt;br /&gt;
====Syntax====&lt;br /&gt;
::&amp;lt;code&amp;gt;fingerprint deviceId: &amp;quot;id&amp;quot;, inClusters: &amp;quot;clusters&amp;quot;, outClusters: &amp;quot;clusters&amp;quot;, mfr: &amp;quot;manufacturerId&amp;quot;, prod: &amp;quot;productTypeId&amp;quot;, deviceJoinName: &amp;quot;name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Commands==&lt;br /&gt;
Sometimes you will work with a device that has a command that does not exist in one of the existing capabilities. Hubitat gives you the ability to define custom commands to support these scenarios. Commands can also have parameters allowing you to define how data is passed to the command.&lt;br /&gt;
&lt;br /&gt;
===Parameters===&lt;br /&gt;
:: parameters - a list of the parameters to pass to the command. Each parameter is, itself, a map that defines details about the parameter. See below for information on defining parameters.&lt;br /&gt;
&lt;br /&gt;
====Defining Parameters====&lt;br /&gt;
:: The simplest way of defining parameters is to just specify a list of types. The parameters can be of type &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;json_object&amp;lt;/code&amp;gt;. When specified as a list of types, no validation is performed.&lt;br /&gt;
&lt;br /&gt;
:: An example of this simple format is:&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;myCommand&amp;quot;, [&amp;quot;string&amp;quot;, &amp;quot;number&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: An expanded format also exists that allows you to provide more details about the parameter such as its name, whether or not it is required, and in the case of an enum, the available values. In this mode each parameter is specified as a map with the following entries:&lt;br /&gt;
&lt;br /&gt;
:: name - The name of the parameter. If the name ends with an asterisk (*) the parameter is considered required.&lt;br /&gt;
:: type - The type of the parameter which can be any of &amp;lt;code&amp;gt;STRING&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUMBER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ENUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;JSON_OBJECT&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;COLOR_MAP&amp;lt;/code&amp;gt;. Note that a driver can only have a single command that accepts a &amp;lt;code&amp;gt;COLOR_MAP&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: description - The description of the parameter that is shown in the tooltip when you hover over the parameter.&lt;br /&gt;
:: constraints - A list of the valid options for an &amp;lt;code&amp;gt;ENUM&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;commandName&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;commandName&amp;quot;, parameters&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attributes==&lt;br /&gt;
Sometimes you will work with a device that has an attribute that does not exist in one of the existing capabilities. Hubitat gives you the ability to define custom attributes to support these scenarios.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;attribute &amp;quot;AttributeName&amp;quot;, &amp;quot;type&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;attribute &amp;quot;EnumAttribute&amp;quot;, &amp;quot;enum&amp;quot;, values&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Parameters===&lt;br /&gt;
:: type - The type of the attribute. This can be &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: values - If the type is enum, you must also provide a Groovy list of values that the enum accepts.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
 definition(&lt;br /&gt;
     name: &amp;quot;My First Driver&amp;quot;,&lt;br /&gt;
     namespace: &amp;quot;myfirstdriver&amp;quot;,&lt;br /&gt;
     author: &amp;quot;John Smith&amp;quot;&lt;br /&gt;
 ) {&lt;br /&gt;
     capability &amp;quot;Actuator&amp;quot;&lt;br /&gt;
     capability &amp;quot;Switch&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     command &amp;quot;myCommand&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     attribute &amp;quot;myAttribute&amp;quot;, &amp;quot;string&amp;quot;&lt;br /&gt;
     attribute &amp;quot;enumAttribute&amp;quot;, &amp;quot;enum&amp;quot;, [&amp;quot;value 1&amp;quot;, &amp;quot;value 2&amp;quot;]&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2917</id>
		<title>InstalledApp Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2917"/>
		<updated>2020-04-05T18:22:23Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: fixed an example that was formatted incorrectly and documented most of the updateSetting overloads.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===&amp;lt;code&amp;gt;getInstallationState&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a value indicating whether the app is currently installed or, if you are in the initial setup, that it is not.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getInstallationState()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::&amp;lt;code&amp;gt;COMPLETE&amp;lt;/code&amp;gt; if the app is installed, otherwise &amp;lt;code&amp;gt;INCOMPLETE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Get the current label of the installed app.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The current label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Example&lt;br /&gt;
 def appLabel = app.getLabel()&lt;br /&gt;
 log.debug &amp;quot;app label is ${appLabel}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;updateLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Update the label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::void updateLabel(String label)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - new label for installed app&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updateSetting&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Updates the value of a setting (preference) to the specified value. If the setting does not exist, this method will create it.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Long value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Boolean value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, String value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Date value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, List value)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::name - The name of the setting to update&lt;br /&gt;
::value - The value to store in the setting&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional Methods to Document&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getId()&lt;br /&gt;
 Long getName()&lt;br /&gt;
 List&amp;lt;EventSubscriptionWrapper&amp;gt; getSubscriptions()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Preferences&amp;diff=2918</id>
		<title>Device Preferences</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Preferences&amp;diff=2918"/>
		<updated>2020-04-05T18:17:20Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Provides information on defining preferences for a driver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The driver preferences provides the Hubitat Elevation hub with user settings for the driver. Preferences for a driver are more simplistic than the preferences for an app as they all appear on a single page. Preferences are also different from an app in that they are defined within the metadata block.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
 metadata {&lt;br /&gt;
     preferences {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Entries==&lt;br /&gt;
Each entry within the preferences section is an &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; which is a single setting for the device.&lt;br /&gt;
&lt;br /&gt;
===Input===&lt;br /&gt;
Each input must have a &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. Depending on the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; additional settings may also be required.&lt;br /&gt;
&lt;br /&gt;
====Input Settings====&lt;br /&gt;
:: name - Uniquely identifies this setting&lt;br /&gt;
:: type - The data type of the setting which may be one of &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: title - The text to be shown in the driver UI&lt;br /&gt;
:: description - The long text description of the setting&lt;br /&gt;
:: required - [true/false] - Specifies whether or not this setting requires a value&lt;br /&gt;
:: defaultValue - The default value of the setting if none is specified&lt;br /&gt;
:: options - Only available when the type is &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;. Allows you to specify the values that appear in the dropdown.&lt;br /&gt;
:: multiple - Only available when the type is &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;. Specifies that multiple values can be selected from the dropdown.&lt;br /&gt;
:: range - Only available when the type is &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;. A string in the format &amp;lt;code&amp;gt;low..high&amp;lt;/code&amp;gt; that specifies the range of valid numeric values.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
 preferences {&lt;br /&gt;
     input name: &amp;quot;settingName&amp;quot;, type: &amp;quot;text&amp;quot;, title: &amp;quot;My Setting&amp;quot;, description: &amp;quot;Enter Setting Text&amp;quot;, required: true&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Definition&amp;diff=2924</id>
		<title>Device Definition</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Definition&amp;diff=2924"/>
		<updated>2020-04-05T17:47:27Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Fingerprinting needs some work, I can't find any good info in the community forum that defines how fingerprinting works&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The driver definition provides the Hubitat Elevation hub with information about a Driver you wish to install. The format is slightly different from an App as the definition must appear inside of a &amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; block. Additionally it allows you to define the capabilities, commands, and attributes associated with the driver.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
 metadata {&lt;br /&gt;
     definition(&lt;br /&gt;
         ...&lt;br /&gt;
     ) {&lt;br /&gt;
         ...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Entries==&lt;br /&gt;
:: author - The author of this driver&lt;br /&gt;
:: description - A text description of the app that is displayed in the popup when the '''Add User App'' button is clicked&lt;br /&gt;
:: importUrl - The URL where the Groovy code for this app can be found&lt;br /&gt;
:: name - The name of the app&lt;br /&gt;
:: namespace - The namespace within which the Groovy class for the application will be stored&lt;br /&gt;
&lt;br /&gt;
==Capabilities==&lt;br /&gt;
A device driver can provide one or more capabilities. Capabilities are defined by the Hubitat environment. When you specify that a driver supports a specific capability, you must also implement any commands it requires. The list of supported capabilities can be found on the [[Driver_Capability_List|Driver Capability List]]&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;capability &amp;quot;Capability Name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fingerprints==&lt;br /&gt;
Fingerprints provide a way for you to tell Hubitat how to identify a Zigbee or ZWave device based on certain properties and characteristics of the device.&lt;br /&gt;
&lt;br /&gt;
===Zigbee===&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
::&amp;lt;code&amp;gt;fingerprint profileId: &amp;quot;profileId&amp;quot;, inClusters: &amp;quot;clusters&amp;quot;, outClusters: &amp;quot;clusters&amp;quot;, manufacturer: &amp;quot;manufacturerId&amp;quot;, model: &amp;quot;modelId&amp;quot;, deviceJoinName: &amp;quot;name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zwave===&lt;br /&gt;
====Syntax====&lt;br /&gt;
::&amp;lt;code&amp;gt;fingerprint deviceId: &amp;quot;id&amp;quot;, inClusters: &amp;quot;clusters&amp;quot;, outClusters: &amp;quot;clusters&amp;quot;, mfr: &amp;quot;manufacturerId&amp;quot;, prod: &amp;quot;productTypeId&amp;quot;, deviceJoinName: &amp;quot;name&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==Commands==&lt;br /&gt;
Sometimes you will work with a device that has a command that does not exist in one of the existing capabilities. Hubitat gives you the ability to define custom commands to support these scenarios. Commands can also have parameters allowing you to define how data is passed to the command.&lt;br /&gt;
&lt;br /&gt;
===Parameters===&lt;br /&gt;
:: parameters - a list of the parameters to pass to the command. Each parameter is, itself, a map that defines details about the parameter. See below for information on defining parameters.&lt;br /&gt;
&lt;br /&gt;
====Defining Parameters====&lt;br /&gt;
:: The simplest way of defining parameters is to just specify a list of types. The parameters can be of type &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;json_object&amp;lt;/code&amp;gt;. When specified as a list of types, no validation is performed.&lt;br /&gt;
&lt;br /&gt;
:: An example of this simple format is:&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;myCommand&amp;quot;, [&amp;quot;string&amp;quot;, &amp;quot;number&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: An expanded format also exists that allows you to provide more details about the parameter such as its name, whether or not it is required, and in the case of an enum, the available values. In this mode each parameter is specified as a map with the following entries:&lt;br /&gt;
&lt;br /&gt;
:: name - The name of the parameter. If the name ends with an asterisk (*) the parameter is considered required.&lt;br /&gt;
:: type - The type of the parameter which can be any of &amp;lt;code&amp;gt;STRING&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NUMBER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ENUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;JSON_OBJECT&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;COLOR_MAP&amp;lt;/code&amp;gt;. Note that a driver can only have a single command that accepts a &amp;lt;code&amp;gt;COLOR_MAP&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: description - The description of the parameter that is shown in the tooltip when you hover over the parameter.&lt;br /&gt;
:: constraints - A list of the valid options for an &amp;lt;code&amp;gt;ENUM&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;commandName&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;command &amp;quot;commandName&amp;quot;, parameters&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attributes==&lt;br /&gt;
Sometimes you will work with a device that has an attribute that does not exist in one of the existing capabilities. Hubitat gives you the ability to define custom attributes to support these scenarios.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
:: &amp;lt;code&amp;gt;attribute &amp;quot;AttributeName&amp;quot;, &amp;quot;type&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;attribute &amp;quot;EnumAttribute&amp;quot;, &amp;quot;enum&amp;quot;, values&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Parameters===&lt;br /&gt;
:: type - The type of the attribute. This can be &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: values - If the type is enum, you must also provide a Groovy list of values that the enum accepts.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
 definition(&lt;br /&gt;
     name: &amp;quot;My First Driver&amp;quot;,&lt;br /&gt;
     namespace: &amp;quot;myfirstdriver&amp;quot;,&lt;br /&gt;
     author: &amp;quot;John Smith&amp;quot;&lt;br /&gt;
 ) {&lt;br /&gt;
     capability &amp;quot;Actuator&amp;quot;&lt;br /&gt;
     capability &amp;quot;Switch&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     command &amp;quot;myCommand&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     attribute &amp;quot;myAttribute&amp;quot;, &amp;quot;string&amp;quot;&lt;br /&gt;
     attribute &amp;quot;enumAttribute&amp;quot;, &amp;quot;enum&amp;quot;, [&amp;quot;value 1, &amp;quot;value 2&amp;quot;]&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=HubAction_Object&amp;diff=2919</id>
		<title>HubAction Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=HubAction_Object&amp;diff=2919"/>
		<updated>2020-04-05T16:03:10Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added an SSDP discovery example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===&amp;lt;code&amp;gt;Constructor&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Create a HubAction object.  While protocol is optional, it is recommended that it be provided.  If it is not specified the system will default to the LAN protocol.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(String request)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(String request, Protocol protocol, String dni)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(String request, Protocol protocol, String dni, Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(String request, Protocol protocol)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(String request, Protocol protocol, Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(Map params)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(Map params, String dni)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;HubAction(Map params, String dni, Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: request - The command to send as a String, this can be a ZigBee, Z-Wave or Lan message to send.&lt;br /&gt;
:: protocol - The protocol to use when sending the message.  See the Protocol documentation for more info.&lt;br /&gt;
:: dni - The device network Id to use when sending the message. &lt;br /&gt;
:: options - Optional settings when sending the command. See examples for usage. Possible values:&lt;br /&gt;
:::''callback'' - A method name to pass the response from the HubAction back to. If not specified the response will be handed to the parse method of a Device or will be discarded if this HubAction was called from an App.&lt;br /&gt;
:::''destinationAddress'' - The destination address to use when sending LAN messages. In the format ip:port, if no port is specified it defaults to 80.&lt;br /&gt;
:::''destinationPort'' - The port number to use when sending UPNP discovery messages. Defaults to 1900.&lt;br /&gt;
:::''type'' - The type of message to send if its not a standard HTTP request.&lt;br /&gt;
::::''HubAction.LAN_TYPE_UDPCLIENT'' - Send message as a UDP package.&lt;br /&gt;
::::''HubAction.LAN_TYPE_RAW'' - Send message as a raw TCP message.&lt;br /&gt;
:::''secureCode'' - Used as part of a wake on lan request.&lt;br /&gt;
:::''encoding''&lt;br /&gt;
:::''ignoreResponse'' - (true/false) Used as part of UDP messages, instructs the system to ignore any response from the device to this message.&lt;br /&gt;
:::''parseWarning'' - (true/false) Used as part of UDP messages, instructs the system to send any error message back to the parse method or callback method of the device. (Since 2.2.0)&lt;br /&gt;
:::''timeout'' - Used as part of UPD or TCP messages. Sets the timeout for response from the device, defaults to 10 seconds, acceptable range is 1 to 300.&lt;br /&gt;
:: params - a list of parameters for sending a Lan message. Possible values:&lt;br /&gt;
:::''method'' - The http method to use, ie GET, POST, etc.&lt;br /&gt;
:::''path'' - The path to access on the http endpoint.&lt;br /&gt;
:::''query'' - Any query parameters to use when calling the path.&lt;br /&gt;
:::''body'' - The request body to send.&lt;br /&gt;
:::''headers'' - Additional headers to use in the http request.&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 //Create and send a Z-Wave message&lt;br /&gt;
 def hubAction = new hubitat.device.HubAction(new hubitat.zwave.commands.basicv1.BasicGet().format(), hubitat.device.Protocol.ZWAVE)&lt;br /&gt;
 sendHubCommand(hubAction)&lt;br /&gt;
 &lt;br /&gt;
 // Protocol.LAN examples&lt;br /&gt;
 &lt;br /&gt;
 // Send UDP Message&lt;br /&gt;
 new HubAction(&amp;quot;My UDP Message&amp;quot;, Protocol.LAN, [type: HubAction.Type.LAN_TYPE_UDPCLIENT])&lt;br /&gt;
 &lt;br /&gt;
 // Send Binary UDP Message &lt;br /&gt;
 new HubAction(&amp;quot;48756269746174&amp;quot;, Protocol.LAN, [type: HubAction.Type.LAN_TYPE_UDPCLIENT, encoding: HubAction.Encoding.HEX_STRING])&lt;br /&gt;
 &lt;br /&gt;
 // Send Wake On Lan to mac address 00:11:22:33:44:55&lt;br /&gt;
 new HubAction(&amp;quot;wake on lan 00:11:22:33:44:55&amp;quot;, Protocol.LAN)&lt;br /&gt;
 &lt;br /&gt;
 // Send Wake On Lan to mac address 00:11:22:33:44:55 with secure code&lt;br /&gt;
 new HubAction(&amp;quot;wake on lan 00:11:22:33:44:55&amp;quot;, Protocol.LAN, [secureCode: &amp;quot;112233&amp;quot;])&lt;br /&gt;
 &lt;br /&gt;
 // Send a UPnP SSDP discovery message&lt;br /&gt;
 new HubAction(&amp;quot;lan discovery urn&amp;lt;span&amp;gt;:&amp;lt;/span&amp;gt;schemas-somecompany-com:device:deviceName:1&amp;quot;, Protocol.LAN)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getAction&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Can be used to get the request value of the HubAction.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getAction()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getCallbackMethod&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getCallbackMethod()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getURI&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;URI getURI()&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Object&amp;diff=2920</id>
		<title>Device Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Object&amp;diff=2920"/>
		<updated>2020-04-05T15:51:59Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added documentation for most of the updateSetting overloads&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Device object (Technically DeviceWrapper, ChildDeviceWrapper and ParentDeviceWrapper) is composed of methods that allow you to interact with the settings and values of a device.  This object is available to Apps that have been given access via a device selection input, as child devices of Apps and other devices and a driver also has access to this via the device object.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;events&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve a list of events for the device. By default the maximum number of events returned in the list is 10 which can be overridden by the max option.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; events()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; events(Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::options - Optional values for getting the list of events.  Possible values:&lt;br /&gt;
:::''max'' - The maximum number of events to retrieve.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List of Event objects for the device&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;eventsSince&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve a list of events since a date/time.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; eventsSince(Date startDate)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; eventsSince(Date startDate, Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: startDate - The date/time to list events since.&lt;br /&gt;
::options - Optional values for getting the list of events.  Possible values:&lt;br /&gt;
:::''max'' - The maximum number of events to retrieve.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::A list of Events (defaults to 10 events unless otherwise specified in options)&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // Get events since 8:00 am today&lt;br /&gt;
 def events = eventsSince(timeToday(&amp;quot;08:00&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
 // Get a maximum of 5 events&lt;br /&gt;
 def events = eventsSince(timeToday(&amp;quot;08:00&amp;quot;), [max:5])&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getName&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve the name of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getName()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::String - The name of the device&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setName&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Update the name of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void setName(String name)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::name - the new name for the device.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::none&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve the label of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::String - The label of the device&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setLabel&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Update the label of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void setLabel(String label)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - the new label for the device.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::none&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasAttribute&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified attribute. This works for both built-in and custom attributes.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;Boolean hasAttribute(String attribute)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::attribute- The attribute to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the attribute exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasCapability&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified capability.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;Boolean hasCapability(String capability)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::capability - The capability to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the capability exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasCommand&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified command. This works for both built-in and custom commands.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt; Boolean hasCommand(String command)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::command - The command to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the command exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updateSetting&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Updates the value of a setting (preference) to the specified value. If the setting does not exist, this method will create it.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Long value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Boolean value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, String value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, Date value)&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;void updateSetting(String name, List value)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::name - The name of the setting to update&lt;br /&gt;
::value - The value to store in the setting&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt;==&lt;br /&gt;
 List&amp;lt;Event&amp;gt; eventsBetween(Date startDate, Date endDate)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; eventsBetween(Date startDate, Date endDate, Map options = null)&lt;br /&gt;
 List&amp;lt;State&amp;gt; statesSince(String attributeName, Date startDate)&lt;br /&gt;
 List&amp;lt;State&amp;gt; statesSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getIdAsLong()&lt;br /&gt;
 String getId()&lt;br /&gt;
 String getEndpointId()&lt;br /&gt;
 String getZigbeeId()&lt;br /&gt;
 Hub getHub()&lt;br /&gt;
 Map getData()&lt;br /&gt;
 void updateDataValue(String name, String value)&lt;br /&gt;
 String getDataValue(String name)&lt;br /&gt;
 String getDeviceDataByName(String name)&lt;br /&gt;
 String getStatus()&lt;br /&gt;
 String getDisplayName()&lt;br /&gt;
 void setDisplayName(String displayName)&lt;br /&gt;
 String getDeviceNetworkId()&lt;br /&gt;
 void setDeviceNetworkId(String dni)&lt;br /&gt;
 Object currentValue(String attributeName)&lt;br /&gt;
 Object currentValue(String attributeName, boolean skipCache)&lt;br /&gt;
 State currentState(String attributeName)&lt;br /&gt;
 State currentState(String attributeName, boolean skipCache)&lt;br /&gt;
 Object latestValue(String attributeName)&lt;br /&gt;
 Object latestValue(String attributeName, boolean skipCache)&lt;br /&gt;
 State latestState(String attributeName)&lt;br /&gt;
 State latestState(String attributeName, boolean skipCache)&lt;br /&gt;
 List&amp;lt;State&amp;gt; getCurrentStates()&lt;br /&gt;
 List&amp;lt;Command&amp;gt; getSupportedCommands()&lt;br /&gt;
 List&amp;lt;Attribute&amp;gt; getSupportedAttributes()&lt;br /&gt;
 List&amp;lt;Capability&amp;gt; getCapabilities()&lt;br /&gt;
 Date getLastActivity()&lt;br /&gt;
 Long getParentDeviceId()&lt;br /&gt;
 Long getParentAppId()&lt;br /&gt;
 Boolean getIsComponent()&lt;br /&gt;
 boolean isDisabled()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Location_Object&amp;diff=2921</id>
		<title>Location Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Location_Object&amp;diff=2921"/>
		<updated>2020-04-05T14:25:48Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added missing hsmStatus property&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Location object is composed of methods that allow you to interact with the settings and values of a location.  This object is available to Apps and Drivers via the &amp;quot;getLocation()&amp;quot; method or simply using the property &amp;quot;location&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Properties==&lt;br /&gt;
===&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;===&lt;br /&gt;
A unique id for the location, as a Long.&lt;br /&gt;
===&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;===&lt;br /&gt;
The name of the location as a String.&lt;br /&gt;
===&amp;lt;code&amp;gt;temperatureScale&amp;lt;/code&amp;gt;===&lt;br /&gt;
The temperature scale of the location as a String (C or F).&lt;br /&gt;
===&amp;lt;code&amp;gt;timeZone&amp;lt;/code&amp;gt;===&lt;br /&gt;
The time zone of the location as a TimeZone object.&lt;br /&gt;
===&amp;lt;code&amp;gt;zipCode&amp;lt;/code&amp;gt;===&lt;br /&gt;
The zip code of the location as a String.&lt;br /&gt;
===&amp;lt;code&amp;gt;latitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
The latitude of the location as a BigDecimal.&lt;br /&gt;
===&amp;lt;code&amp;gt;longitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
The longitude of the location as a BigDecimal.&lt;br /&gt;
===&amp;lt;code&amp;gt;sunrise&amp;lt;/code&amp;gt;===&lt;br /&gt;
The sunrise of the location as a Date.&lt;br /&gt;
===&amp;lt;code&amp;gt;sunset&amp;lt;/code&amp;gt;===&lt;br /&gt;
The sunset of the location as a Date.&lt;br /&gt;
===&amp;lt;code&amp;gt;hsmStatus&amp;lt;/code&amp;gt;===&lt;br /&gt;
The current status of the Hubitat Safety Monitor. This is a String of one of the following values: armedAway, armingAway, armedHome, armingHome, armedNight, armingNight, disarmed, allDisarmed&lt;br /&gt;
===&amp;lt;code&amp;gt;hubs&amp;lt;/code&amp;gt;===&lt;br /&gt;
A list of hubs for this location as a List&amp;lt;Hub&amp;gt;.  In Hubitat there is only one Hub in the list.&lt;br /&gt;
===&amp;lt;code&amp;gt;hub&amp;lt;/code&amp;gt;===&lt;br /&gt;
The Hub for this location.&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;getFormattedLatitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;getFormattedLongitude&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;getTimeFormat&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;getModes&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get a list of modes for the location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Mode&amp;gt; getModes()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getMode&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get the current mode of the location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getMode()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setMode&amp;lt;/code&amp;gt;===&lt;br /&gt;
===&amp;lt;code&amp;gt;currentMode&amp;lt;/code&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_Definition&amp;diff=2922</id>
		<title>App Definition</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_Definition&amp;diff=2922"/>
		<updated>2020-04-05T00:43:52Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Overview of the definition section of an app&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The app definition provides the Hubitat Elevation hub with information about an App you wish to install.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
 definition(&lt;br /&gt;
     ...&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
==Entries==&lt;br /&gt;
:: author - The author of this app&lt;br /&gt;
:: category - A category description of this app&lt;br /&gt;
:: description - A text description of the app that is displayed in the popup when the '''Add User App'' button is clicked&lt;br /&gt;
:: documentationLink - A link to the documentation for this app&lt;br /&gt;
:: iconUrl - Not currently used, should be set to an empty string&lt;br /&gt;
:: iconX2Url - Not currently used, should be set to an empty string&lt;br /&gt;
:: iconX3Url - Not currently used, should be set to an empty string&lt;br /&gt;
:: importUrl - The URL where the Groovy code for this app can be found&lt;br /&gt;
:: name - The name of the app&lt;br /&gt;
:: namespace - The namespace within which the Groovy class for the application will be stored&lt;br /&gt;
:: oauth - [true/false] - defines whether this app makes use of OAuth&lt;br /&gt;
:: parent - If this is a child app, specifies the parent app in the format &amp;lt;code&amp;gt;namespace&amp;lt;/code&amp;gt;:&amp;lt;code&amp;gt;app name&amp;lt;/code&amp;gt;&lt;br /&gt;
:: singleInstance - [true/false] - If set to true, on a single instance of this app can be installed. The default is false&lt;br /&gt;
:: videoLink - A link to a video recording associated with this app&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
 definition(&lt;br /&gt;
     name: &amp;quot;My First App&amp;quot;,&lt;br /&gt;
     namespace: &amp;quot;myfirstapp&amp;quot;,&lt;br /&gt;
     author: &amp;quot;John Smith&amp;quot;,&lt;br /&gt;
     description: &amp;quot;This is the first Hubitat app I've created&amp;quot;,&lt;br /&gt;
     category: &amp;quot;General&amp;quot;,&lt;br /&gt;
     iconUrl: &amp;quot;&amp;quot;,&lt;br /&gt;
     iconX2Url: &amp;quot;&amp;quot;,&lt;br /&gt;
     iconX3Url: &amp;quot;&amp;quot;&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=2923</id>
		<title>Developer Documentation</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Developer_Documentation&amp;diff=2923"/>
		<updated>2020-04-05T00:33:47Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added links for sections of an app and driver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==App Structure==&lt;br /&gt;
:[[App_Definition|Definition]]&lt;br /&gt;
:[[App_Preferences|Preferences]]&lt;br /&gt;
:[[App_Code|Code]]&lt;br /&gt;
&lt;br /&gt;
==Driver Structure==&lt;br /&gt;
:[[Device_Definition|Definition]]&lt;br /&gt;
:[[Device_Preferences|Preferences]]&lt;br /&gt;
:[[Device_Code|Code]]&lt;br /&gt;
&lt;br /&gt;
==Method Documentation==&lt;br /&gt;
&lt;br /&gt;
:[[App_Object|App]]&lt;br /&gt;
:[[Driver_Object|Driver]]&lt;br /&gt;
:[[Common_Methods_Object|Common Methods]]&lt;br /&gt;
:[[Attribute_Object|Attribute]]&lt;br /&gt;
:[[Capability_Object|Capability]]&lt;br /&gt;
:[[Command_Object|Command]]&lt;br /&gt;
:[[Device_Object|Device]]&lt;br /&gt;
:[[Event_Object|Event]]&lt;br /&gt;
:[[Hub_Object|Hub]]&lt;br /&gt;
:[[HubAction_Object|HubAction]]&lt;br /&gt;
:[[HubMultiAction_Object|HubMultiAction]]&lt;br /&gt;
:[[Protocol_Object|Protocol]]&lt;br /&gt;
:[[InstalledApp_Object|InstalledApp]]&lt;br /&gt;
:[[Location_Object|Location]]&lt;br /&gt;
:[[Mode_Object|Mode]]&lt;br /&gt;
:[[State_Object|State]]&lt;br /&gt;
:[[Zwave_Object|Zwave]]&lt;br /&gt;
:[[Zigbee_Object|Zigbee]]&lt;br /&gt;
:[[HexUtils_Object|HexUtils]]&lt;br /&gt;
:[[ColorUtils_Object|ColorUtils]]&lt;br /&gt;
&lt;br /&gt;
==Driver Interfaces==&lt;br /&gt;
&lt;br /&gt;
:[[EventStream_Interface|EventStream Interface]]&lt;br /&gt;
:[[Telnet_Interface|Telnet Interface]]&lt;br /&gt;
:[[Websocket_Interface|Websocket Interface]]&lt;br /&gt;
:[[Raw_Socket_Interface|Raw Socket Interface]]&lt;br /&gt;
:[[MQTT_Interface|MQTT Interface]]&lt;br /&gt;
&lt;br /&gt;
==ZWave Classes==&lt;br /&gt;
:[[ZWave_Classes|ZWave Classes]]&lt;br /&gt;
&lt;br /&gt;
==Capabilities==&lt;br /&gt;
&lt;br /&gt;
:[[Driver_Capability_List|Capability List]]&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2915</id>
		<title>App Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2915"/>
		<updated>2020-04-02T15:41:08Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added a few more api url methods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Provided Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;createAccessToken&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates an OAuth access token that can be used as part of the OAuth functionality of a properly configured app. The function will return the token, but will also automatically set the state variable &amp;lt;code&amp;gt;state.accessToken&amp;lt;/code&amp;gt; to the return value. This value can then be passed to any API Endpoint (for example those defined in the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; section of an app) using a query string parameter called &amp;lt;code&amp;gt;access_token&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String createAccessToken()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The OAuth access token.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat cloud API.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The base URL of the Hubitat cloud API, generally https&amp;lt;span&amp;gt;://&amp;lt;/span&amp;gt;cloud.hubitat.com/api&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getFullApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the full URL of the Hubitat cloud API for a specific App.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getFullApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The URL of the Hubitat cloud API for the app, generally https&amp;lt;span&amp;gt;://&amp;lt;/span&amp;gt;cloud.hubitat.com/api/&amp;lt;code&amp;gt;hubid&amp;lt;/code&amp;gt;/apps/&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLocalApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat local API.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLocalApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The base URL of the Hubitat local API, generally https&amp;lt;span&amp;gt;://&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;hubip&amp;lt;/code&amp;gt;/apps/api&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getFullLocalApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat local API for a specific App.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getFullLocalApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::he URL of the Hubitat local API for the app, generally generally https&amp;lt;span&amp;gt;://&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;hubip&amp;lt;/code&amp;gt;/apps/api/&amp;lt;code&amp;gt;appid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getHubUID&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieves a unique identifier that represents your hub.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getHubUID()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: A UUID that uniquely identifies your hub.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;subscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Subscribe to events sent from a device, app or location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(InstalledAppWrapper app, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapper device, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapperList devices, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::app - Installed App to subscribe to.&lt;br /&gt;
::location - Location to subscribe to.&lt;br /&gt;
::device - Device to subscribe to.&lt;br /&gt;
::handlerMethod - The method to run when an event is received.&lt;br /&gt;
::attributeName - The name of the attribute to subscribe to.&lt;br /&gt;
::options - Optional values to configure the subscribe.  Possible values:&lt;br /&gt;
:::''filterEvents'' - Used for device subscriptions. Set to false to receive all events, defaults to true and events that do not have a changed value will not be processed.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unsubscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Unsubscribe from events sent from a device or all event subscriptions.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName)&amp;lt;/code&amp;gt; (Since 2.0.7)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(InstalledAppWrapper installedApp)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::device - The device to unsubscribe from.&lt;br /&gt;
::deviceList - A list of devices to unsubscribe from.&lt;br /&gt;
::attributeName - which attribute you want to unsubscribe from.&lt;br /&gt;
::handlerMethod - The name of a method which was subscribed to a device event.&lt;br /&gt;
::location - The location to unsubscribe from.&lt;br /&gt;
::installedApp - The installed app to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;addChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates a new child device and returns that device from the method call.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Map properties)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId, Map properties)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::namespace - The namespace of the child driver to add as a child device (optional, if not specified it will default the the namespace of the parent)&lt;br /&gt;
::typeName - The name of the child driver to add as a child device&lt;br /&gt;
::deviceNetworkId - unique identifier for this device&lt;br /&gt;
::hubId - present for backwards compatibility, pass 1.&lt;br /&gt;
::properties - optional parameters for this child device. Possible values listed below&lt;br /&gt;
&lt;br /&gt;
:;Properties&lt;br /&gt;
::boolean isComponent - true or false, if true, device will still show up in device list but will not be able to be deleted or edited in the UI. If false, device can be modified/deleted on the UI.&lt;br /&gt;
::String name - name of child device, if not specified, driver name is used.&lt;br /&gt;
::String label - label of child device, if not specified it is left blank.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a list of all child devices for this device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getAllChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List&amp;lt;ChildDeviceWrapper&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a specific child device with the device network id specified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper getChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;deleteChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Deletes a specific child device with the device network id sepcified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void deleteChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
==User Defined Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;installed&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is first installed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void installed()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updated&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the preferences of an installed app are updated.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void updated()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;uninstalled&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is uninstalled.  This method can be used to do any cleanup that is necessary.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void uninstalled()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 Map getState()&lt;br /&gt;
 String apiServerUrl(String url)&lt;br /&gt;
 String localApiServerUrl(String url)&lt;br /&gt;
 String fullLocalApiServerUrl(String url)&lt;br /&gt;
 void setLocationMode(String mode)&lt;br /&gt;
 void pause(Long millisecs)&lt;br /&gt;
 InstalledAppWrapper getParent()&lt;br /&gt;
 InstalledAppWrapper addChildApp(String namespace, String name, String label, Map properties = null)&lt;br /&gt;
 void deleteChildApp(Long childAppId)&lt;br /&gt;
 DeviceWrapper getSubscribedDeviceById(Long deviceId)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void sendEvent(DeviceWrapper device, Map properties)&lt;br /&gt;
 void sendEvent(String dni, Map properties)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; getLocationEventsSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void subscribe(Object thing, String attributeName, handlerMethod, Map options = null)&lt;br /&gt;
 void subscribe(location, handlerMethod)&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getAllChildApps()&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getChildApps()&lt;br /&gt;
 InstalledAppWrapper getChildAppById(Long childAppId)&lt;br /&gt;
 InstalledAppWrapper getChildAppByLabel(String childAppLabel)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2914</id>
		<title>InstalledApp Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2914"/>
		<updated>2020-04-02T15:18:07Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===&amp;lt;code&amp;gt;getInstallationState&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a value indicating whether the app is currently installed or, if you are in the initial setup, that it is not.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getInstallationState()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::&amp;lt;code&amp;gt;COMPLETE&amp;lt;/code&amp;gt; if the app is installed, otherwise &amp;lt;code&amp;gt;INCOMPLETE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Get the current label of the installed app.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The current label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Example&lt;br /&gt;
::&amp;lt;code&amp;gt; def appLabel = app.getLabel()&lt;br /&gt;
log.debug &amp;quot;app label is ${appLabel}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;updateLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Update the label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::void updateLabel(String label)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - new label for installed app&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional Methods to Document&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void updateSetting(String name, Long value)&lt;br /&gt;
 void updateSetting(String name, Boolean value)&lt;br /&gt;
 void updateSetting(String name, String value)&lt;br /&gt;
 void updateSetting(String name, Double value)&lt;br /&gt;
 void updateSetting(String name, Date value)&lt;br /&gt;
 void updateSetting(String name, List value)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getId()&lt;br /&gt;
 Long getName()&lt;br /&gt;
 List&amp;lt;EventSubscriptionWrapper&amp;gt; getSubscriptions()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Device_Object&amp;diff=2913</id>
		<title>Device Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Device_Object&amp;diff=2913"/>
		<updated>2020-04-02T14:55:25Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added hasAttribute, hasCapability, and hasCommand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Device object (Technically DeviceWrapper, ChildDeviceWrapper and ParentDeviceWrapper) is composed of methods that allow you to interact with the settings and values of a device.  This object is available to Apps that have been given access via a device selection input, as child devices of Apps and other devices and a driver also has access to this via the device object.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;events&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve a list of events for the device. By default the maximum number of events returned in the list is 10 which can be overridden by the max option.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; events()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; events(Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::options - Optional values for getting the list of events.  Possible values:&lt;br /&gt;
:::''max'' - The maximum number of events to retrieve.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List of Event objects for the device&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;eventsSince&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve a list of events since a date/time.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; eventsSince(Date startDate)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;Event&amp;gt; eventsSince(Date startDate, Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: startDate - The date/time to list events since.&lt;br /&gt;
::options - Optional values for getting the list of events.  Possible values:&lt;br /&gt;
:::''max'' - The maximum number of events to retrieve.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::A list of Events (defaults to 10 events unless otherwise specified in options)&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // Get events since 8:00 am today&lt;br /&gt;
 def events = eventsSince(timeToday(&amp;quot;08:00&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
 // Get a maximum of 5 events&lt;br /&gt;
 def events = eventsSince(timeToday(&amp;quot;08:00&amp;quot;), [max:5])&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getName&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve the name of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getName()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::String - The name of the device&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setName&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Update the name of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void setName(String name)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::name - the new name for the device.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::none&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieve the label of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::String - The label of the device&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;setLabel&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Update the label of the device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void setLabel(String label)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - the new label for the device.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::none&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasAttribute&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified attribute. This works for both built-in and custom attributes.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;Boolean hasAttribute(String attribute)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::attribute- The attribute to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the attribute exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasCapability&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified capability.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;Boolean hasCapability(String capability)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::capability - The capability to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the capability exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;hasCommand&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Determines if the device has the specified command. This works for both built-in and custom commands.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt; Boolean hasCommand(String command)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::command - The command to check for.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::True if the command exists, false otherwise.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt;==&lt;br /&gt;
 List&amp;lt;Event&amp;gt; eventsBetween(Date startDate, Date endDate)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; eventsBetween(Date startDate, Date endDate, Map options = null)&lt;br /&gt;
 List&amp;lt;State&amp;gt; statesSince(String attributeName, Date startDate)&lt;br /&gt;
 List&amp;lt;State&amp;gt; statesSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void updateSetting(String name, Long value)&lt;br /&gt;
 void updateSetting(String name, Boolean value)&lt;br /&gt;
 void updateSetting(String name, String value)&lt;br /&gt;
 void updateSetting(String name, Double value)&lt;br /&gt;
 void updateSetting(String name, Date value)&lt;br /&gt;
 void updateSetting(String name, List value)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getIdAsLong()&lt;br /&gt;
 String getId()&lt;br /&gt;
 String getEndpointId()&lt;br /&gt;
 String getZigbeeId()&lt;br /&gt;
 Hub getHub()&lt;br /&gt;
 Map getData()&lt;br /&gt;
 void updateDataValue(String name, String value)&lt;br /&gt;
 String getDataValue(String name)&lt;br /&gt;
 String getDeviceDataByName(String name)&lt;br /&gt;
 String getStatus()&lt;br /&gt;
 String getDisplayName()&lt;br /&gt;
 void setDisplayName(String displayName)&lt;br /&gt;
 String getDeviceNetworkId()&lt;br /&gt;
 void setDeviceNetworkId(String dni)&lt;br /&gt;
 Object currentValue(String attributeName)&lt;br /&gt;
 Object currentValue(String attributeName, boolean skipCache)&lt;br /&gt;
 State currentState(String attributeName)&lt;br /&gt;
 State currentState(String attributeName, boolean skipCache)&lt;br /&gt;
 Object latestValue(String attributeName)&lt;br /&gt;
 Object latestValue(String attributeName, boolean skipCache)&lt;br /&gt;
 State latestState(String attributeName)&lt;br /&gt;
 State latestState(String attributeName, boolean skipCache)&lt;br /&gt;
 List&amp;lt;State&amp;gt; getCurrentStates()&lt;br /&gt;
 List&amp;lt;Command&amp;gt; getSupportedCommands()&lt;br /&gt;
 List&amp;lt;Attribute&amp;gt; getSupportedAttributes()&lt;br /&gt;
 List&amp;lt;Capability&amp;gt; getCapabilities()&lt;br /&gt;
 Date getLastActivity()&lt;br /&gt;
 Long getParentDeviceId()&lt;br /&gt;
 Long getParentAppId()&lt;br /&gt;
 Boolean getIsComponent()&lt;br /&gt;
 boolean isDisabled()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=2912</id>
		<title>Common Methods Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=2912"/>
		<updated>2020-04-02T14:41:55Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added temperature conversion methods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These methods can be used in both Apps and Drivers&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;celsiusToFahrenheit&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts a given Celsius temperature to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;BigDecimal celsiusToFahrenheit(BigDecimal val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: A temperature in Celsius.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: The specified temperature in Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;fahrenheitToCelsius&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts a given Fahrenheit temperature to Celsius&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;BigDecimal fahrenheitToCelsius(BigDecimal val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: A temperature in Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: The specified temperature in Celsius.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLocation&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Location getLocation()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getSunriseAndSunset&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the sunset and sunrise values for the current day. (Common method since 2.1.0)&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset(Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: options - Map with optional offset for sunrise or sunset, possible values are sunriseOffset and sunsetOffset and can either be a number of minutes or a String of the format Hours:Minutes&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map with with key values 'sunrise' and 'sunset' of type Date&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // get today's sunrise and sunset&lt;br /&gt;
 def riseAndSet = getSunriseAndSunset()&lt;br /&gt;
 log.debug riseAndSet.sunrise&lt;br /&gt;
 log.debug riseAndSet.sunset&lt;br /&gt;
 &lt;br /&gt;
 // get sunrise time offset by 1 minute early, and get sunset offset by 1 hour, 5 minutes later&lt;br /&gt;
 def offsetRiseAndSet = getSunriseAndSunset(sunriseOffset: -1, sunsetOffset: &amp;quot;1:05&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTemperatureScale&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get the current temperature scale set for the hub.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getTemperatureScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: String - &amp;quot;F&amp;quot; or &amp;quot;C&amp;quot; based on the setting in the hub.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;now&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: long now()&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeToday&amp;lt;/code&amp;gt;===&lt;br /&gt;
: Get a Date object with today's date and the time specified&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date timeToday(String timeString, TimeZone timeZone = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: timeString - The time to use, can be either &amp;quot;HH:mm&amp;quot; or and ISO8601 date/time string&lt;br /&gt;
:: timeZone - (Optional) The timezone to use for the new Date.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Date - A Date object with today's date and the time that was passed as timeString&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeOfDayIsBetween&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Check if a date is between two dates.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;boolean timeOfDayIsBetween(Date start, Date stop, Date value[, TimeZone timeZone])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
&lt;br /&gt;
:: start - The date to start comparison against.&lt;br /&gt;
:: stop - The date to stop comparison against.&lt;br /&gt;
:: value - The date to compare&lt;br /&gt;
:: timezone - (Optional) The timezone to use for the comparison&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: boolean - true if the value date is between the start and stop dates, otherwise returns false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unschedule&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Remove any scheduled tasks.  If method is called without paramters, all schedules will be removed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule(handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: handlerMethod - Only remove schedules for this handlerMethod&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request and return control to the calling code.  Any response from the call will be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void asynchttpGet(callbackMethod, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
:: params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPost(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPatch&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPatch(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http PATCH call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request.  Any response from the call will be passed to the closure.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(String uri, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPostJson&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Similar to httpPost except that the contentType parameter is set to &amp;quot;application/json&amp;quot;&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, String stringBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, Map mapBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::stringBody - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::mapBody - The body of the request as a Map.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it as JSON.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.8) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPut&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPatch (Since 2.1.7)&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runIn&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void runIn(Long delayInSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::delayInSeconds - How long to wait in seconds until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
::handlerMethod - The name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a scheduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    runIn(50, 'myMethod', [data: [&amp;quot;myKey&amp;quot;:&amp;quot;myValue&amp;quot;]])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runInMillis&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void runInMillis(Long delayInMilliSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: delayInMilliseconds - How long to wait until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
:: handlerMethod - the name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a schduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    private processQueue(Map queue) {&lt;br /&gt;
      if (isQueueEmpty(queue)) {&lt;br /&gt;
          sendEvent name: 'lifxdiscovery', value: 'complete'&lt;br /&gt;
          return&lt;br /&gt;
      }&lt;br /&gt;
      def data = getNext(queue)&lt;br /&gt;
      sendPacket data.ipAddress, data.packet&lt;br /&gt;
      runInMillis(queue.delay, 'processQueue', [data: queue])&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    runInMillis(50, 'processQueue', [data: queue])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;pauseExecution&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; void pauseExecution(Long millisecs)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: millisecs - The amount of time in milliseconds to pause.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts text to speech.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map textToSpeech(String stringToBeSynthesized, String voice = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::stringToBeSynthesized - The text to be converted to audio. The text may contain supported [https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html SSML tags].&lt;br /&gt;
::voice - The name of a voice supported by Amazon Polly, you can find a list of voices [https://docs.aws.amazon.com/polly/latest/dg/voicelist.html here]. If not specified the default system setting is used.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with two entries, &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; which contains a URI to the MP3 file and &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt; is the length of the MP3 in seconds.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTTSVoices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a list of the supported text-to-speech voices.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map getTTSVoices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with three entries &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; which is the name of a voice that can be specified to &amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gender&amp;lt;/code&amp;gt; which contains either Male or Female, and &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; which contains the language of this voice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;toDateTime&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date toDateTime(String dateTimeString)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::dateTimeString - A date/time string in ISO8601 format. (&amp;quot;yyyy-MM-dd&amp;quot;, &amp;quot;yyyyMMdd'T'HHmmssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ss.SSSX&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Signature:'''&lt;br /&gt;
 void httpPutJson(String uri, String body, Closure closure)&lt;br /&gt;
 void httpPutJson(String uri, Map body, Closure closure)&lt;br /&gt;
 void httpPutJson(Map params, Closure closure)&lt;br /&gt;
 void httpDelete(Map params, Closure closure)&lt;br /&gt;
 String getMACFromIP(String ipAddr)&lt;br /&gt;
 String convertTemperatureIfNeeded(BigDecimal value, String scale, Integer precision)&lt;br /&gt;
 Object parseJson(String stringToParse)&lt;br /&gt;
 GPathResult parseXML(String stringToParse)&lt;br /&gt;
 Map parseLanMessage(String stringToParse)&lt;br /&gt;
 void runEvery1Minute(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery5Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery10Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery15Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery30Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery1Hour(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery3Hours(String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(String dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void schedule(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void schedule(String expression, String handlerMethod, Map options = null)&lt;br /&gt;
 void asynchttpPut(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpDelete(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpHead(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 String encrypt(String value)&lt;br /&gt;
 String decrypt(String value)&lt;br /&gt;
 void sendLocationEvent(Map properties)&lt;br /&gt;
 Date timeTodayAfter(String startTimeString, String timeString, TimeZone timeZone = null) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(Number minutes) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(String hoursAndMinutesString) (Common method since 2.1.0)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2902</id>
		<title>App Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2902"/>
		<updated>2020-04-01T17:42:50Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added getHubUID, removed  getApiServerUrl and createAccessToken from the to-be-documented list since they now are&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Provided Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;createAccessToken&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates an OAuth access token that can be used as part of the OAuth functionality of a properly configured app. The function will return the token, but will also automatically set the state variable &amp;lt;code&amp;gt;state.accessToken&amp;lt;/code&amp;gt; to the return value. This value can then be passed to any API Endpoint (for example those defined in the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; section of an app) using a query string parameter called &amp;lt;code&amp;gt;access_token&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String createAccessToken()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The OAuth access token.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat cloud API.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The base URL of the Hubitat cloud API, generally https://cloud.hubitat.com/api&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getHubUID&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Retrieves a unique identifier that represents your hub.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getHubUID()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: A UUID that uniquely identifies your hub.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;subscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Subscribe to events sent from a device, app or location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(InstalledAppWrapper app, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapper device, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapperList devices, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::app - Installed App to subscribe to.&lt;br /&gt;
::location - Location to subscribe to.&lt;br /&gt;
::device - Device to subscribe to.&lt;br /&gt;
::handlerMethod - The method to run when an event is received.&lt;br /&gt;
::attributeName - The name of the attribute to subscribe to.&lt;br /&gt;
::options - Optional values to configure the subscribe.  Possible values:&lt;br /&gt;
:::''filterEvents'' - Used for device subscriptions. Set to false to receive all events, defaults to true and events that do not have a changed value will not be processed.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unsubscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Unsubscribe from events sent from a device or all event subscriptions.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName)&amp;lt;/code&amp;gt; (Since 2.0.7)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(InstalledAppWrapper installedApp)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::device - The device to unsubscribe from.&lt;br /&gt;
::deviceList - A list of devices to unsubscribe from.&lt;br /&gt;
::attributeName - which attribute you want to unsubscribe from.&lt;br /&gt;
::handlerMethod - The name of a method which was subscribed to a device event.&lt;br /&gt;
::location - The location to unsubscribe from.&lt;br /&gt;
::installedApp - The installed app to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;addChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates a new child device and returns that device from the method call.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Map properties)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId, Map properties)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::namespace - The namespace of the child driver to add as a child device (optional, if not specified it will default the the namespace of the parent)&lt;br /&gt;
::typeName - The name of the child driver to add as a child device&lt;br /&gt;
::deviceNetworkId - unique identifier for this device&lt;br /&gt;
::hubId - present for backwards compatibility, pass 1.&lt;br /&gt;
::properties - optional parameters for this child device. Possible values listed below&lt;br /&gt;
&lt;br /&gt;
:;Properties&lt;br /&gt;
::boolean isComponent - true or false, if true, device will still show up in device list but will not be able to be deleted or edited in the UI. If false, device can be modified/deleted on the UI.&lt;br /&gt;
::String name - name of child device, if not specified, driver name is used.&lt;br /&gt;
::String label - label of child device, if not specified it is left blank.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a list of all child devices for this device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getAllChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List&amp;lt;ChildDeviceWrapper&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a specific child device with the device network id specified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper getChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;deleteChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Deletes a specific child device with the device network id sepcified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void deleteChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
==User Defined Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;installed&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is first installed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void installed()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updated&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the preferences of an installed app are updated.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void updated()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;uninstalled&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is uninstalled.  This method can be used to do any cleanup that is necessary.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void uninstalled()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 Map getState()&lt;br /&gt;
 String getApiServerUrl()&lt;br /&gt;
 String getFullApiServerUrl()&lt;br /&gt;
 String apiServerUrl(String url)&lt;br /&gt;
 String getLocalApiServerUrl()&lt;br /&gt;
 String getFullLocalApiServerUrl()&lt;br /&gt;
 String localApiServerUrl(String url)&lt;br /&gt;
 String fullLocalApiServerUrl(String url)&lt;br /&gt;
 void setLocationMode(String mode)&lt;br /&gt;
 void pause(Long millisecs)&lt;br /&gt;
 InstalledAppWrapper getParent()&lt;br /&gt;
 InstalledAppWrapper addChildApp(String namespace, String name, String label, Map properties = null)&lt;br /&gt;
 void deleteChildApp(Long childAppId)&lt;br /&gt;
 DeviceWrapper getSubscribedDeviceById(Long deviceId)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void sendEvent(DeviceWrapper device, Map properties)&lt;br /&gt;
 void sendEvent(String dni, Map properties)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; getLocationEventsSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void subscribe(Object thing, String attributeName, handlerMethod, Map options = null)&lt;br /&gt;
 void subscribe(location, handlerMethod)&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getAllChildApps()&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getChildApps()&lt;br /&gt;
 InstalledAppWrapper getChildAppById(Long childAppId)&lt;br /&gt;
 InstalledAppWrapper getChildAppByLabel(String childAppLabel)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=2898</id>
		<title>Common Methods Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=Common_Methods_Object&amp;diff=2898"/>
		<updated>2020-03-31T14:44:19Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added TTS methods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These methods can be used in both Apps and Drivers&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getLocation&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Location getLocation()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getSunriseAndSunset&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the sunset and sunrise values for the current day. (Common method since 2.1.0)&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;Map getSunriseAndSunset(Map options)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: options - Map with optional offset for sunrise or sunset, possible values are sunriseOffset and sunsetOffset and can either be a number of minutes or a String of the format Hours:Minutes&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map with with key values 'sunrise' and 'sunset' of type Date&lt;br /&gt;
&lt;br /&gt;
:;Examples&lt;br /&gt;
&lt;br /&gt;
 // get today's sunrise and sunset&lt;br /&gt;
 def riseAndSet = getSunriseAndSunset()&lt;br /&gt;
 log.debug riseAndSet.sunrise&lt;br /&gt;
 log.debug riseAndSet.sunset&lt;br /&gt;
 &lt;br /&gt;
 // get sunrise time offset by 1 minute early, and get sunset offset by 1 hour, 5 minutes later&lt;br /&gt;
 def offsetRiseAndSet = getSunriseAndSunset(sunriseOffset: -1, sunsetOffset: &amp;quot;1:05&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTemperatureScale&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Get the current temperature scale set for the hub.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getTemperatureScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: none&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: String - &amp;quot;F&amp;quot; or &amp;quot;C&amp;quot; based on the setting in the hub.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;now&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: long now()&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeToday&amp;lt;/code&amp;gt;===&lt;br /&gt;
: Get a Date object with today's date and the time specified&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date timeToday(String timeString, TimeZone timeZone = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: timeString - The time to use, can be either &amp;quot;HH:mm&amp;quot; or and ISO8601 date/time string&lt;br /&gt;
:: timeZone - (Optional) The timezone to use for the new Date.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Date - A Date object with today's date and the time that was passed as timeString&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;timeOfDayIsBetween&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Check if a date is between two dates.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;boolean timeOfDayIsBetween(Date start, Date stop, Date value[, TimeZone timeZone])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
&lt;br /&gt;
:: start - The date to start comparison against.&lt;br /&gt;
:: stop - The date to stop comparison against.&lt;br /&gt;
:: value - The date to compare&lt;br /&gt;
:: timezone - (Optional) The timezone to use for the comparison&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: boolean - true if the value date is between the start and stop dates, otherwise returns false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unschedule&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Remove any scheduled tasks.  If method is called without paramters, all schedules will be removed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unschedule(handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: handlerMethod - Only remove schedules for this handlerMethod&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request and return control to the calling code.  Any response from the call will be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void asynchttpGet(callbackMethod, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
:: params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPost(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;asynchttpPatch&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void asynchttpPatch(String callbackMethod = null, Map params, Map data = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::callbackMethod - The name of a callback method to send the response to.  Can be null if the response can be ignored.&lt;br /&gt;
::params - the parameters to use to build the http PATCH call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::data - optional data to be passed to the callback method.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpGet&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Send an http GET request.  Any response from the call will be passed to the closure.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(String uri, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpGet(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::params - the parameters to use to build the http GET call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPost&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPost(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPostJson&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Similar to httpPost except that the contentType parameter is set to &amp;quot;application/json&amp;quot;&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, String stringBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(String uri, Map mapBody, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPostJson(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::stringBody - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::mapBody - The body of the request as a Map.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it as JSON.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.8) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPut&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPut(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' (since 2.0.9) - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' (since 2.1.1) - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;httpPatch (Since 2.1.7)&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(String uri, String body, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void httpPatch(Map params, Closure closure)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::uri - The full uri to send the request to.&lt;br /&gt;
::body - The body of the request as a String.  Any encoding should be done before passing to the system.&lt;br /&gt;
::params - the parameters to use to build the http call. Possible values:&lt;br /&gt;
:::''uri'' - The uri to send the request to&lt;br /&gt;
:::''queryString'' - The raw, already-escaped query string.&lt;br /&gt;
:::''query'' - Add these parameters to the existing query string. If any of the parameters already exist in the query, these values will not replace them.  Multiple values for the same query parameter may be added by putting them in a list.&lt;br /&gt;
:::''headers'' - Request headers&lt;br /&gt;
:::''path'' - The path component of this request.  The value may be absolute or relative to the current path.&lt;br /&gt;
:::''contentType'' - The content-type used for any data in the request body, as well as the &amp;lt;code&amp;gt;Accept&amp;lt;/code&amp;gt; content-type that will be used for parsing the response.&lt;br /&gt;
:::''requestContentType'' - Assign a different content-type for the request than is expected for the response.&lt;br /&gt;
:::''body'' - The request body.  If this is a Map or Array, the system will take care of encoding it based on the requestContentType.&lt;br /&gt;
:::''timeout'' - timeout in seconds for the request, max timeout is 300&lt;br /&gt;
:::''textParser'' - possible values: true, false.  If set to true, the response will be parsed as plain text, if false the system will attempt to determine the content type and parse the response into an object.  Defaults to false.&lt;br /&gt;
:::''ignoreSSLIssues'' (since 2.1.8) - possible values: true, false. Ignores certificate issues for SSL connections. Cert does not have to be from a trusted authority and the hostname does not need to be verified. This is primarily for dev situations that make use of localhost, build, and test servers. Defaults to false.&lt;br /&gt;
::closure - code to handle a successful HTTP response. an object of type HttpResponseDecorator is passed to this code.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runIn&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
::&amp;lt;code&amp;gt;void runIn(Long delayInSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::delayInSeconds - How long to wait in seconds until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
::handlerMethod - The name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a scheduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    runIn(50, 'myMethod', [data: [&amp;quot;myKey&amp;quot;:&amp;quot;myValue&amp;quot;]])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;runInMillis&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void runInMillis(Long delayInMilliSeconds, String handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: delayInMilliseconds - How long to wait until the handler should be called, don't expect that it will be called in exactly that time.&lt;br /&gt;
:: handlerMethod - the name of a handler method in your driver or app. The method name should not contain parentheses.&lt;br /&gt;
::options - Optional values to control the scheduling of this method&lt;br /&gt;
:::''overwrite'' - defaults to true which cancels the previous scheduled running of the handler method and schedules new, if set to false this will create a duplicate schedule.&lt;br /&gt;
:::''data'' - optional data to be passed to the handler method.&lt;br /&gt;
:::''misfire'' - If set to &amp;quot;ignore&amp;quot; then the scheduler will simply try to fire it as soon as it can. NOTE: if a schduler uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the scheduler attempts to catch back up to where it would have been.&lt;br /&gt;
&lt;br /&gt;
:;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    private processQueue(Map queue) {&lt;br /&gt;
      if (isQueueEmpty(queue)) {&lt;br /&gt;
          sendEvent name: 'lifxdiscovery', value: 'complete'&lt;br /&gt;
          return&lt;br /&gt;
      }&lt;br /&gt;
      def data = getNext(queue)&lt;br /&gt;
      sendPacket data.ipAddress, data.packet&lt;br /&gt;
      runInMillis(queue.delay, 'processQueue', [data: queue])&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    runInMillis(50, 'processQueue', [data: queue])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;pauseExecution&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; void pauseExecution(Long millisecs)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
:: millisecs - The amount of time in milliseconds to pause.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Converts text to speech.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map textToSpeech(String stringToBeSynthesized, String voice = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::stringToBeSynthesized - The text to be converted to audio. The text may contain supported [https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html SSML tags].&lt;br /&gt;
::voice - The name of a voice supported by Amazon Polly, you can find a list of voices [https://docs.aws.amazon.com/polly/latest/dg/voicelist.html here]. If not specified the default system setting is used.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with two entries, &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; which contains a URI to the MP3 file and &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt; is the length of the MP3 in seconds.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getTTSVoices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a list of the supported text-to-speech voices.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt; Map getTTSVoices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
:: Map - Returns a Map with three entries &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; which is the name of a voice that can be specified to &amp;lt;code&amp;gt;textToSpeech&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gender&amp;lt;/code&amp;gt; which contains either Male or Female, and &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; which contains the language of this voice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;toDateTime&amp;lt;/code&amp;gt;===&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;Date toDateTime(String dateTimeString)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::dateTimeString - A date/time string in ISO8601 format. (&amp;quot;yyyy-MM-dd&amp;quot;, &amp;quot;yyyyMMdd'T'HHmmssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ssX&amp;quot;, &amp;quot;yyyy-MM-dd'T'HH:mm:ss.SSSX&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''Signature:'''&lt;br /&gt;
 BigDecimal celsiusToFahrenheit(BigDecimal val)&lt;br /&gt;
 BigDecimal fahrenheitToCelsius(BigDecimal val)&lt;br /&gt;
 void httpPutJson(String uri, String body, Closure closure)&lt;br /&gt;
 void httpPutJson(String uri, Map body, Closure closure)&lt;br /&gt;
 void httpPutJson(Map params, Closure closure)&lt;br /&gt;
 void httpDelete(Map params, Closure closure)&lt;br /&gt;
 String getMACFromIP(String ipAddr)&lt;br /&gt;
 String convertTemperatureIfNeeded(BigDecimal value, String scale, Integer precision)&lt;br /&gt;
 Object parseJson(String stringToParse)&lt;br /&gt;
 GPathResult parseXML(String stringToParse)&lt;br /&gt;
 Map parseLanMessage(String stringToParse)&lt;br /&gt;
 void runEvery1Minute(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery5Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery10Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery15Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery30Minutes(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery1Hour(String handlerMethod, Map options = null)&lt;br /&gt;
 void runEvery3Hours(String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void runOnce(String dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void schedule(Date dateTime, String handlerMethod, Map options = null)&lt;br /&gt;
 void schedule(String expression, String handlerMethod, Map options = null)&lt;br /&gt;
 void asynchttpPut(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpDelete(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 void asynchttpHead(String callbackMethod = null, Map params, Map data = null)&lt;br /&gt;
 String encrypt(String value)&lt;br /&gt;
 String decrypt(String value)&lt;br /&gt;
 void sendLocationEvent(Map properties)&lt;br /&gt;
 Date timeTodayAfter(String startTimeString, String timeString, TimeZone timeZone = null) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(Number minutes) (Common method since 2.1.0)&lt;br /&gt;
 Long timeOffset(String hoursAndMinutesString) (Common method since 2.1.0)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2899</id>
		<title>InstalledApp Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=InstalledApp_Object&amp;diff=2899"/>
		<updated>2020-03-30T18:35:40Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added getInstallationState and standardized formatting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===&amp;lt;code&amp;gt;getInstallationState&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns a value indicating whether the app is currently installed or, if you are in the initial setup, that it is not.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getInstallationState()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::&amp;lt;code&amp;gt;COMPLETE&amp;lt;/code&amp;gt; if the app is installed, otherwise &amp;lt;code&amp;gt;INCOMPLETE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;getLabel&amp;lt;/code&amp;gt; ==&lt;br /&gt;
:Get the current label of the installed app.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getLabel()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The current label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Example&lt;br /&gt;
::&amp;lt;code&amp;gt; def appLabel = app.getLabel()&lt;br /&gt;
log.debug &amp;quot;app label is ${appLabel}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;updateLabel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
:Update the label of the installed app&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
::void updateLabel(String label)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::label - new label for installed app&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional Methods to Document&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 void updateSetting(String name, Map options)&lt;br /&gt;
 void updateSetting(String name, Long value)&lt;br /&gt;
 void updateSetting(String name, Boolean value)&lt;br /&gt;
 void updateSetting(String name, String value)&lt;br /&gt;
 void updateSetting(String name, Double value)&lt;br /&gt;
 void updateSetting(String name, Date value)&lt;br /&gt;
 void updateSetting(String name, List value)&lt;br /&gt;
 void removeSetting(String name)&lt;br /&gt;
 void clearSetting(String name)&lt;br /&gt;
 Long getId()&lt;br /&gt;
 Long getName()&lt;br /&gt;
 List&amp;lt;EventSubscriptionWrapper&amp;gt; getSubscriptions()&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2900</id>
		<title>App Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2900"/>
		<updated>2020-03-30T18:19:20Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added createAccessToken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Provided Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;createAccessToken&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates an OAuth access token that can be used as part of the OAuth functionality of a properly configured app. The function will return the token, but will also automatically set the state variable &amp;lt;code&amp;gt;state.accessToken&amp;lt;/code&amp;gt; to the return value. This value can then be passed to any API Endpoint (for example those defined in the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; section of an app) using a query string parameter called &amp;lt;code&amp;gt;access_token&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String createAccessToken()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The OAuth access token.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat cloud API.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The base URL of the Hubitat cloud API, generally https://cloud.hubitat.com/api&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;subscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Subscribe to events sent from a device, app or location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(InstalledAppWrapper app, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapper device, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(DeviceWrapperList devices, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Location location, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::app - Installed App to subscribe to.&lt;br /&gt;
::location - Location to subscribe to.&lt;br /&gt;
::device - Device to subscribe to.&lt;br /&gt;
::handlerMethod - The method to run when an event is received.&lt;br /&gt;
::attributeName - The name of the attribute to subscribe to.&lt;br /&gt;
::options - Optional values to configure the subscribe.  Possible values:&lt;br /&gt;
:::''filterEvents'' - Used for device subscriptions. Set to false to receive all events, defaults to true and events that do not have a changed value will not be processed.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unsubscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Unsubscribe from events sent from a device or all event subscriptions.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName)&amp;lt;/code&amp;gt; (Since 2.0.7)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(InstalledAppWrapper installedApp)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::device - The device to unsubscribe from.&lt;br /&gt;
::deviceList - A list of devices to unsubscribe from.&lt;br /&gt;
::attributeName - which attribute you want to unsubscribe from.&lt;br /&gt;
::handlerMethod - The name of a method which was subscribed to a device event.&lt;br /&gt;
::location - The location to unsubscribe from.&lt;br /&gt;
::installedApp - The installed app to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;addChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates a new child device and returns that device from the method call.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Map properties)&amp;lt;/code&amp;gt; (since 2.1.9)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Long hubId, Map properties)&amp;lt;/code&amp;gt; (deprecated)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::namespace - The namespace of the child driver to add as a child device (optional, if not specified it will default the the namespace of the parent)&lt;br /&gt;
::typeName - The name of the child driver to add as a child device&lt;br /&gt;
::deviceNetworkId - unique identifier for this device&lt;br /&gt;
::hubId - present for backwards compatibility, pass 1.&lt;br /&gt;
::properties - optional parameters for this child device. Possible values listed below&lt;br /&gt;
&lt;br /&gt;
:;Properties&lt;br /&gt;
::boolean isComponent - true or false, if true, device will still show up in device list but will not be able to be deleted or edited in the UI. If false, device can be modified/deleted on the UI.&lt;br /&gt;
::String name - name of child device, if not specified, driver name is used.&lt;br /&gt;
::String label - label of child device, if not specified it is left blank.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a list of all child devices for this device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getAllChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List&amp;lt;ChildDeviceWrapper&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a specific child device with the device network id specified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper getChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;deleteChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Deletes a specific child device with the device network id sepcified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void deleteChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
==User Defined Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;installed&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is first installed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void installed()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updated&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the preferences of an installed app are updated.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void updated()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;uninstalled&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is uninstalled.  This method can be used to do any cleanup that is necessary.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void uninstalled()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 Map getState()&lt;br /&gt;
 String getHubUID()&lt;br /&gt;
 String getApiServerUrl()&lt;br /&gt;
 String getFullApiServerUrl()&lt;br /&gt;
 String apiServerUrl(String url)&lt;br /&gt;
 String getLocalApiServerUrl()&lt;br /&gt;
 String getFullLocalApiServerUrl()&lt;br /&gt;
 String localApiServerUrl(String url)&lt;br /&gt;
 String fullLocalApiServerUrl(String url)&lt;br /&gt;
 void setLocationMode(String mode)&lt;br /&gt;
 String createAccessToken()&lt;br /&gt;
 void pause(Long millisecs)&lt;br /&gt;
 InstalledAppWrapper getParent()&lt;br /&gt;
 InstalledAppWrapper addChildApp(String namespace, String name, String label, Map properties = null)&lt;br /&gt;
 void deleteChildApp(Long childAppId)&lt;br /&gt;
 DeviceWrapper getSubscribedDeviceById(Long deviceId)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void sendEvent(DeviceWrapper device, Map properties)&lt;br /&gt;
 void sendEvent(String dni, Map properties)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; getLocationEventsSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void subscribe(Object thing, String attributeName, handlerMethod, Map options = null)&lt;br /&gt;
 void subscribe(location, handlerMethod)&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getAllChildApps()&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getChildApps()&lt;br /&gt;
 InstalledAppWrapper getChildAppById(Long childAppId)&lt;br /&gt;
 InstalledAppWrapper getChildAppByLabel(String childAppLabel)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
	<entry>
		<id>https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2424</id>
		<title>App Object</title>
		<link rel="alternate" type="text/html" href="https://docs.hubitat.com/index.php?title=App_Object&amp;diff=2424"/>
		<updated>2019-11-24T18:28:05Z</updated>

		<summary type="html">&lt;p&gt;Dman2306: Added documentation for getApiServerUrl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Provided Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;getApiServerUrl&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Returns the base URL of the Hubitat cloud API.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;String getApiServerUrl()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::The base URL of the Hubitat cloud API, generally https://cloud.hubitat.com/api&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;subscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Subscribe to events sent from a device, app or location.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Object thing, handlerMethod)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void subscribe(Object thing, String attributeName, handlerMethod, Map options = null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::thing - The device, installed app or location to subscribe to.&lt;br /&gt;
::handlerMethod - The method to run when an event is received.&lt;br /&gt;
::attributeName - The name of the attribute to subscribe to.&lt;br /&gt;
::options - Optional values to configure the subscribe.  Possible values:&lt;br /&gt;
:::''filterEvents'' - Used for device subscriptions. Set to false to receive all events, defaults to true and events that do not have a changed value will not be processed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;unsubscribe&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Unsubscribe from events sent from a device or all event subscriptions.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList)&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName)&amp;lt;/code&amp;gt; (Since 2.0.7)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(DeviceWrapper device, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(List&amp;lt;DeviceWrapper&amp;gt; deviceList, String attributeName, String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.0)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(InstalledAppWrapper installedApp)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(Location location, String attributeName)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
:: &amp;lt;code&amp;gt;void unsubscribe(String handlerMethod)&amp;lt;/code&amp;gt; (Since 2.1.2)&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::device - The device to unsubscribe from.&lt;br /&gt;
::deviceList - A list of devices to unsubscribe from.&lt;br /&gt;
::attributeName - which attribute you want to unsubscribe from.&lt;br /&gt;
::handlerMethod - The name of a method which was subscribed to a device event.&lt;br /&gt;
::location - The location to unsubscribe from.&lt;br /&gt;
::installedApp - The installed app to unsubscribe from.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;addChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Creates a new child device and returns that device from the method call.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper addChildDevice(String namespace, String typeName, String deviceNetworkId, Map properties = [:])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::namespace - The namespace of the child driver to add as a child device (optional, if not specified it will default the the namespace of the parent)&lt;br /&gt;
::typeName - The name of the child driver to add as a child device&lt;br /&gt;
::deviceNetworkId - unique identifier for this device&lt;br /&gt;
::properties - optional parameters for this child device. Possible values listed below&lt;br /&gt;
&lt;br /&gt;
:;Properties&lt;br /&gt;
::boolean isComponent - true or false, if true, device will still show up in device list but will not be able to be deleted or edited in the UI. If false, device can be modified/deleted on the UI.&lt;br /&gt;
::String name - name of child device, if not specified, driver name is used.&lt;br /&gt;
::String label - label of child device, if not specified it is left blank.&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevices&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a list of all child devices for this device.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;List&amp;lt;ChildDeviceWrapper&amp;gt; getAllChildDevices()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::List&amp;lt;ChildDeviceWrapper&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;getChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Gets a specific child device with the device network id specified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;ChildDeviceWrapper getChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::ChildDeviceWrapper&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;deleteChildDevice&amp;lt;/code&amp;gt;===&lt;br /&gt;
:Deletes a specific child device with the device network id sepcified.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void deleteChildDevice(String deviceNetworkId)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;Parameters&lt;br /&gt;
::deviceNetworkId - The unique identifier for the device&lt;br /&gt;
&lt;br /&gt;
:;Returns&lt;br /&gt;
::None&lt;br /&gt;
&lt;br /&gt;
==User Defined Methods==&lt;br /&gt;
===&amp;lt;code&amp;gt;installed&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is first installed.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void installed()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;updated&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the preferences of an installed app are updated.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void updated()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;uninstalled&amp;lt;/code&amp;gt;===&lt;br /&gt;
:This method is called when the app is uninstalled.  This method can be used to do any cleanup that is necessary.&lt;br /&gt;
&lt;br /&gt;
:;Signature&lt;br /&gt;
:: &amp;lt;code&amp;gt;void uninstalled()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;Additional to be documented&amp;lt;/code&amp;gt; ==&lt;br /&gt;
 Map getState()&lt;br /&gt;
 String getHubUID()&lt;br /&gt;
 String getApiServerUrl()&lt;br /&gt;
 String getFullApiServerUrl()&lt;br /&gt;
 String apiServerUrl(String url)&lt;br /&gt;
 String getLocalApiServerUrl()&lt;br /&gt;
 String getFullLocalApiServerUrl()&lt;br /&gt;
 String localApiServerUrl(String url)&lt;br /&gt;
 String fullLocalApiServerUrl(String url)&lt;br /&gt;
 void setLocationMode(String mode)&lt;br /&gt;
 String createAccessToken()&lt;br /&gt;
 void pause(Long millisecs)&lt;br /&gt;
 InstalledAppWrapper getParent()&lt;br /&gt;
 InstalledAppWrapper addChildApp(String namespace, String name, String label, Map properties = null)&lt;br /&gt;
 void deleteChildApp(Long childAppId)&lt;br /&gt;
 DeviceWrapper getSubscribedDeviceById(Long deviceId)&lt;br /&gt;
 void sendEvent(Map properties)&lt;br /&gt;
 void sendEvent(DeviceWrapper device, Map properties)&lt;br /&gt;
 void sendEvent(String dni, Map properties)&lt;br /&gt;
 List&amp;lt;Event&amp;gt; getLocationEventsSince(String attributeName, Date startDate, Map options = null)&lt;br /&gt;
 void subscribe(Object thing, String attributeName, handlerMethod, Map options = null)&lt;br /&gt;
 void subscribe(Object thing, handlerMethod)&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getAllChildApps()&lt;br /&gt;
 List&amp;lt;InstalledApp&amp;gt; getChildApps()&lt;br /&gt;
 InstalledAppWrapper getChildAppById(Long childAppId)&lt;br /&gt;
 InstalledAppWrapper getChildAppByLabel(String childAppLabel)&lt;/div&gt;</summary>
		<author><name>Dman2306</name></author>
		
	</entry>
</feed>