<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.domoticz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Philchillbill</id>
	<title>Domoticz Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.domoticz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Philchillbill"/>
	<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/Special:Contributions/Philchillbill"/>
	<updated>2026-09-19T00:24:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Domoticz_API/JSON_URL%27s&amp;diff=18719</id>
		<title>Domoticz API/JSON URL&#039;s</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Domoticz_API/JSON_URL%27s&amp;diff=18719"/>
		<updated>2024-11-12T17:25:20Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: /* Specifying a date/time for zone TemporaryOverride */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domoticz allows you to interact with all your switches and sensors using JSON, either interactively through a browser or programmatically from a scripting language. In fact, when you interact with the Domoticz UI through your browser by clicking on buttons and such, under the hood it&#039;s JSON that actually communicates your changes back to the Domoticz engine (Hint: You can watch this behaviour at any time by enabling &#039;&#039;&#039;developer tools&#039;&#039;&#039; in your browser and watching the &#039;&#039;network&#039;&#039; tab&#039;s traffic when you change something through the UI. See the section on &#039;&#039;changing a zwave device parameter&#039;&#039; for an example, with screenshot). This wiki describes how to use this versatile API.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Warning Stable 2023.2 (and newer)==&lt;br /&gt;
For users using API calls from outside Domoticz there has been some changes in API calls.  They now always should be of the form &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=**command**&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=graph&amp;lt;/code&amp;gt; will be &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=graph&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=devices&amp;lt;/code&amp;gt; will be &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getdevices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More info in Forum topic https://www.domoticz.com/forum/viewtopic.php?p=303581#p303581&lt;br /&gt;
&lt;br /&gt;
The following old RType commands will keep working but will give a deprecation warning eg &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[WebServer] Deprecated RType (devices) for API request. Handled via fallback (getdevices), please use correct API Command! (IP nnn.nnn.nnn.nnn)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;/json.htm?type=**old command** -&amp;gt; /json.htm?type=command&amp;amp;param=**new command**&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;getsettings&amp;quot;&lt;br /&gt;
*&amp;quot;users&amp;quot; -&amp;gt; &amp;quot;getusers&amp;quot;;&lt;br /&gt;
*&amp;quot;devices&amp;quot; -&amp;gt; &amp;quot;getdevices&amp;quot;&lt;br /&gt;
*&amp;quot;hardware&amp;quot; -&amp;gt; &amp;quot;gethardware&amp;quot;;&lt;br /&gt;
*&amp;lt;s&amp;gt;&amp;quot;events&amp;quot; -&amp;gt; &amp;quot;events&amp;quot;&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;quot;notifications&amp;quot; -&amp;gt; &amp;quot;getnotifications&amp;quot;&lt;br /&gt;
*&amp;quot;createdevice&amp;quot; -&amp;gt; &amp;quot;createdevice&amp;quot;&lt;br /&gt;
*&amp;quot;scenes&amp;quot; -&amp;gt; &amp;quot;getscenes&amp;quot;;&lt;br /&gt;
*&amp;quot;plans&amp;quot; -&amp;gt; &amp;quot;getplans&amp;quot;&lt;br /&gt;
*&amp;quot;graph&amp;quot; -&amp;gt; &amp;quot;graph&amp;quot;&lt;br /&gt;
*&amp;quot;scenelog&amp;quot; -&amp;gt; &amp;quot;getscenelog&amp;quot;&lt;br /&gt;
*&amp;quot;mobiles&amp;quot; -&amp;gt; &amp;quot;getmobiles&amp;quot;&lt;br /&gt;
*&amp;quot;cameras&amp;quot;-&amp;gt; &amp;quot;getcameras&amp;quot;&lt;br /&gt;
*&amp;quot;cameras_user&amp;quot; -&amp;gt; &amp;quot;getcameras_user&amp;quot;&lt;br /&gt;
*&amp;quot;schedules&amp;quot; -&amp;gt; &amp;quot;getschedules&amp;quot;&lt;br /&gt;
*&amp;quot;timers&amp;quot; -&amp;gt; &amp;quot;gettimers&amp;quot;&lt;br /&gt;
*&amp;quot;scenetimers&amp;quot; -&amp;gt; &amp;quot;getscenetimers&amp;quot;&lt;br /&gt;
*&amp;quot;setpointtimers&amp;quot; -&amp;gt; &amp;quot;getsetpointtimers&amp;quot;&lt;br /&gt;
*&amp;quot;plans&amp;quot; -&amp;gt; &amp;quot;getplans&amp;quot;&lt;br /&gt;
*&amp;quot;floorplans&amp;quot; -&amp;gt; &amp;quot;getfloorplans&amp;quot;&lt;br /&gt;
*&amp;quot;lightlog&amp;quot; -&amp;gt; &amp;quot;getlightlog&amp;quot;&lt;br /&gt;
*&amp;quot;textlog&amp;quot; -&amp;gt; &amp;quot;gettextlog&amp;quot;&lt;br /&gt;
*&amp;quot;setused&amp;quot; -&amp;gt; &amp;quot;setused&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following old RType command has no fallback:&lt;br /&gt;
&lt;br /&gt;
*&amp;quot;/json.htm?type=events&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The updated syntax is &amp;quot;&#039;&#039;/json.htm?type=command&amp;amp;param=events&amp;amp;&#039;&#039;&#039;evparam=&amp;lt;eventsparam&amp;gt;&#039;&#039;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Format=&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;username:password@&amp;gt;domoticz-ip&amp;lt;:port&amp;gt;/json.htm?api-call&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;username:password@&amp;gt; = the username and password to access Domoticz, this is optional, see the [[Security]] page for details setting up login.&lt;br /&gt;
*domoticz-ip = the IP-address or hostname of your Domoticz installation.&lt;br /&gt;
*&amp;lt;:port&amp;gt; = the port number of your Domoticz installation, this is optional.&lt;br /&gt;
&lt;br /&gt;
 eg. http://192.168.1.2:8080/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=$idx&amp;amp;nvalue=0&amp;amp;svalue=79&lt;br /&gt;
&lt;br /&gt;
Hint: You can have a look at the database for the nValue/sValue, or the .cpp code.&amp;lt;br&amp;gt;&lt;br /&gt;
==Making output more readable==&lt;br /&gt;
By default, most browser will display the JSON-output in a unordered mess, but some (like FireFox) will recognize it is JSON and show it in a readable manner. To make it more readable you could use a browser plugin that formats the JSON to a more human-readable layout. &amp;lt;br&amp;gt;&lt;br /&gt;
For Google Chrome you could use [https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc JSONView (Chrome web store)]. For other browsers a similar extension will probably exist. Look in the extensions/add-on store of your browser.&lt;br /&gt;
&lt;br /&gt;
There are online sites which helps to do the same like https://jsonformatter.org. This site helps to format, tree view and validate JSON.&lt;br /&gt;
&lt;br /&gt;
==Authorization==&lt;br /&gt;
When using some method other than a browser to connect to Domoticz it may be necessary to do Authorization differently.&lt;br /&gt;
Authorization over HTTP is done by setting the &amp;quot;Authorization&amp;quot; HTTP request header when sending the request to Domoticz. The value of this header is a base64 encoded string of the username and password. When connecting to Domoticz using a browser and the URL method above the browser sets the appropriate header. When creating your own app or script this is not always done for you.&lt;br /&gt;
&lt;br /&gt;
*First the username and password are combined into one string &amp;quot;username:password&amp;quot;&lt;br /&gt;
*This string is encoded using the RFC2045-MIME version of base64&lt;br /&gt;
*The authorization method and a space i.e. &amp;quot;Basic &amp;quot; is then put before the encoded string.&lt;br /&gt;
&lt;br /&gt;
This results in a header in the following format:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How the header is send differs per programming language. Check the documentation of the language of your choice on how to set http request headers.&lt;br /&gt;
&lt;br /&gt;
==Users==&lt;br /&gt;
When you use an user and password in this api, the user must have &amp;quot;user&amp;quot; or &amp;quot;admin&amp;quot; rights. See also page [[User Management]]&amp;lt;br&amp;gt;&lt;br /&gt;
The user also must have the right to access the device (see &#039;Set Devices&#039; in Edit Users page).&lt;br /&gt;
&lt;br /&gt;
==Base64 encode==&lt;br /&gt;
To encode a string using base64 you could use&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: [https://codebeautify.org/base64-encode codebeautify.org/base64-encode]&lt;br /&gt;
&lt;br /&gt;
==Response==&lt;br /&gt;
All responses include a status which is either &#039;&#039;&#039;OK&#039;&#039;&#039; on success or &#039;&#039;&#039;ERR&#039;&#039;&#039; on failure&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=General usage=&lt;br /&gt;
&lt;br /&gt;
Please note that many characters are not permitted in URL strings, including spaces, brackets, etc. Depending on which options below you are using, it may be necessary to &#039;&#039;&#039;URL encode&#039;&#039;&#039; the string first. This is also called URI-encoding, escaping or percent-encoding. See [https://www.url-encode-decode.com URL encode/decode]. &lt;br /&gt;
&lt;br /&gt;
As an example, the string:&lt;br /&gt;
&lt;br /&gt;
  This is a test ! (Really)&lt;br /&gt;
&lt;br /&gt;
when properly encoded, looks like this&lt;br /&gt;
&lt;br /&gt;
  This%20is%20a%20test%20%21%20%28Really%29&lt;br /&gt;
&lt;br /&gt;
It&#039;s also allowable to use a &#039;+&#039; instead of &#039;%20&#039; to encode spaces (this is normally reserved for HTML forms processing but Domoticz accepts both).&lt;br /&gt;
&lt;br /&gt;
==A note on IDXes==&lt;br /&gt;
There are different categories of IDX values, such as for devices, for scenes, for timers, for hardware devices, etc. Make sure that you are using the correct IDX value when trying the commands below. Device IDXes can be found by looking at the &#039;&#039;Setup --&amp;gt; Devices&#039;&#039; tab in the UI. Similarly, &#039;&#039;Setup --&amp;gt; Hardware&#039;&#039; will list the hardware category IDXes. See the section(s) on &#039;&#039;scenes&#039;&#039; and &#039;&#039;timers/schedules&#039;&#039; below to see how to retrieve their particular IDXes or timerIDs using JSON.&lt;br /&gt;
&lt;br /&gt;
==Retrieve status of Domoticz instance==&lt;br /&gt;
&lt;br /&gt;
You can get the status of a Domoticz instance with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getversion&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;DomoticzUpdateURL&amp;quot;: &amp;quot;http://www.domoticz.com/download.php?channel=beta&amp;amp;type=release&amp;amp;system=linux&amp;amp;machine=armv7l&amp;quot;,&lt;br /&gt;
&amp;quot;HaveUpdate&amp;quot;: false,&lt;br /&gt;
&amp;quot;Revision&amp;quot;: 9540,&lt;br /&gt;
&amp;quot;SystemName&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
&amp;quot;UseUpdate&amp;quot;: true,&lt;br /&gt;
&amp;quot;build_time&amp;quot;: &amp;quot;2018-05-29 14:27:24&amp;quot;,&lt;br /&gt;
&amp;quot;dzvents_version&amp;quot;: &amp;quot;2.4.6&amp;quot;,&lt;br /&gt;
&amp;quot;hash&amp;quot;: &amp;quot;30295913&amp;quot;,&lt;br /&gt;
&amp;quot;python_version&amp;quot;: &amp;quot;3.5.3 (default, Jan 19 2017, 14:11:04) \n[GCC 6.3.0 20170124]&amp;quot;,&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;GetVersion&amp;quot;,&lt;br /&gt;
&amp;quot;version&amp;quot;: &amp;quot;3.9530&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;From Stable 2023.2&#039;&#039;&#039; (7-jun-2023)  when a request is done without any authorisation, only the following is returned:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
 	&amp;quot;status&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
 	&amp;quot;title&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;GetVersion&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
When requested by a (non-admin) User, it gives (&#039;&#039;which is the current default response for users&#039;&#039;):&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
 	&amp;quot;HaveUpdate&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: false,&lt;br /&gt;
 	&amp;quot;UseUpdate&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: false,&lt;br /&gt;
 	&amp;quot;build_time&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;2023-06-04 16:08:09&amp;quot;,&lt;br /&gt;
 	&amp;quot;dzvents_version&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;3.1.8&amp;quot;,&lt;br /&gt;
 	&amp;quot;hash&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;98a7d1eef-modified&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;	&amp;quot;python_version&amp;quot; : &amp;quot;3.8.10 (default, Nov 14 2022, 12:59:47) \n[GCC 9.4.0]&amp;quot;,&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 	&amp;quot;status&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
 	&amp;quot;title&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;GetVersion&amp;quot;,&lt;br /&gt;
 	&amp;quot;version&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;2023.1 (build 15331)&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
And for admins&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
 	&amp;quot;DomoticzUpdateURL&amp;quot; : &amp;quot;&amp;lt;nowiki&amp;gt;https://www.domoticz.com/download.php?channel=stable&amp;amp;type=release&amp;amp;system=linux&amp;amp;machine=x86_64&amp;lt;/nowiki&amp;gt;&amp;quot;,&lt;br /&gt;
 	&amp;quot;HaveUpdate&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: false,&lt;br /&gt;
 	&amp;quot;Revision&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 15091,&lt;br /&gt;
 	&amp;quot;SystemName&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
 	&amp;quot;UseUpdate&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: true,&lt;br /&gt;
 	&amp;quot;build_time&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;2023-06-04 16:08:09&amp;quot;,&lt;br /&gt;
 	&amp;quot;dzvents_version&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;3.1.8&amp;quot;,&lt;br /&gt;
 	&amp;quot;hash&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;98a7d1eef-modified&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;	&amp;quot;python_version&amp;quot; : &amp;quot;3.8.10 (default, Nov 14 2022, 12:59:47) \n[GCC 9.4.0]&amp;quot;,&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 	&amp;quot;status&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
 	&amp;quot;title&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;GetVersion&amp;quot;,&lt;br /&gt;
 	&amp;quot;version&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;2023.1 (build 15331)&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Get list of all defined users in the system==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getusers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
		&amp;quot;Enabled&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
		&amp;quot;Password&amp;quot;: &amp;quot;abcdef1234567890abcdef1234567889&amp;quot;,&lt;br /&gt;
		&amp;quot;RemoteSharing&amp;quot;: 1,&lt;br /&gt;
		&amp;quot;Rights&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;TabsEnabled&amp;quot;: 127,&lt;br /&gt;
		&amp;quot;Username&amp;quot;: &amp;quot;waaren&amp;quot;,&lt;br /&gt;
		&amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
		&amp;quot;Enabled&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
		&amp;quot;Password&amp;quot;: &amp;quot;abcdef1234567890abcdef1234567889&amp;quot;,&lt;br /&gt;
		&amp;quot;RemoteSharing&amp;quot;: 0,&lt;br /&gt;
		&amp;quot;Rights&amp;quot;: 2,&lt;br /&gt;
		&amp;quot;TabsEnabled&amp;quot;: 0,&lt;br /&gt;
		&amp;quot;Username&amp;quot;: &amp;quot;IFTTTx&amp;quot;,&lt;br /&gt;
		&amp;quot;idx&amp;quot;: &amp;quot;3&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Users&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get settings==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getsettings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return the settings defined in &amp;quot;Setup&amp;quot; under a JSON form.&lt;br /&gt;
For ex.&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;AcceptNewHardware&amp;quot; : 0,&lt;br /&gt;
   &amp;quot;ActiveTimerPlan&amp;quot; : 0,&lt;br /&gt;
   &amp;quot;ClickatellEnabled&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;ClickatellFrom&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
   &amp;quot;ClickatellPassword&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Retrieve Domoticz logfile information==&lt;br /&gt;
&lt;br /&gt;
You can get the last couple (fixed at max. 100)  of logmessages with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getlog&amp;amp;lastlogtime=LASTLOGTIME&amp;amp;loglevel=LOGLEVEL&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
  LOGLEVEL 1 = normal&lt;br /&gt;
           2 = status&lt;br /&gt;
           4 = error&lt;br /&gt;
   268435455 = all&lt;br /&gt;
&lt;br /&gt;
  LASTLOGTIME  starting with logmessages in LASTLOGTIME seconds since last epoch ( 0 = all available)   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;LastLogTime&amp;quot;: &amp;quot;1615579727&amp;quot;,&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;level&amp;quot;: 4,&lt;br /&gt;
			&amp;quot;message&amp;quot;: &amp;quot;2021-03-12 17:11:47.613  Error: BuienRadar: Problem Connecting to Buienradar! (Check your Internet Connection!)&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;level&amp;quot;: 4,&lt;br /&gt;
			&amp;quot;message&amp;quot;: &amp;quot;2021-03-12 18:30:05.598  Error: dzVents: Error: (3.1.6) openUV: /opt/domoticz/scripts/dzVents/scripts/openUV.lua:63: attempt to index a nil value (field &#039;result&#039;)&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;level&amp;quot;: 4,&lt;br /&gt;
			&amp;quot;message&amp;quot;: &amp;quot;2021-03-12 21:08:47.542  Error: (Evohome) status request failed with message: Timeout was reached&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;GetLog&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add a log message to the Domoticz log==&lt;br /&gt;
&lt;br /&gt;
You can add a log message to the system with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=addlogmessage&amp;amp;message=MESSAGE&amp;amp;level=LEVEL&lt;br /&gt;
&lt;br /&gt;
*MESSAGE = a string you want to log. Make sure to URL-encode any unsafe non-alphanumeric characters. See [https://www.url-encode-decode.com URL encode/decode]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;LEVEL&amp;quot;   1 = normal // default&lt;br /&gt;
          2 = status&lt;br /&gt;
          4 = error&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;AddLogMessage&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Retrieve status of specific device==&lt;br /&gt;
&lt;br /&gt;
You can get the status of a device with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getdevices&amp;amp;rid=IDX&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*or IDX = 10,20,30 (for querying a range devices, in this case devices with IDX 10, 20 and 30)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;ActTime&amp;quot;: 1613058183,&lt;br /&gt;
	&amp;quot;AstrTwilightEnd&amp;quot;: &amp;quot;19:39&amp;quot;,&lt;br /&gt;
	&amp;quot;AstrTwilightStart&amp;quot;: &amp;quot;06:06&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightEnd&amp;quot;: &amp;quot;18:20&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightStart&amp;quot;: &amp;quot;07:24&amp;quot;,&lt;br /&gt;
	&amp;quot;DayLength&amp;quot;: &amp;quot;09:46&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightEnd&amp;quot;: &amp;quot;19:00&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightStart&amp;quot;: &amp;quot;06:45&amp;quot;,&lt;br /&gt;
	&amp;quot;ServerTime&amp;quot;: &amp;quot;2021-02-11 16:43:03&amp;quot;,&lt;br /&gt;
	&amp;quot;SunAtSouth&amp;quot;: &amp;quot;12:52&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunrise&amp;quot;: &amp;quot;08:00&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunset&amp;quot;: &amp;quot;17:45&amp;quot;,&lt;br /&gt;
	&amp;quot;app_version&amp;quot;: &amp;quot;2020.2 (build 12936)&amp;quot;,&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;AddjMulti&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;AddjMulti2&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;AddjValue&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;AddjValue2&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;BatteryLevel&amp;quot;: 255,&lt;br /&gt;
			&amp;quot;CustomImage&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Data&amp;quot;: &amp;quot;On&amp;quot;,&lt;br /&gt;
			&amp;quot;Description&amp;quot;: &amp;quot;Plain text&amp;quot;,&lt;br /&gt;
			&amp;quot;DimmerType&amp;quot;: &amp;quot;none&amp;quot;,&lt;br /&gt;
			&amp;quot;Favorite&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;HardwareDisabled&amp;quot;: false,&lt;br /&gt;
			&amp;quot;HardwareID&amp;quot;: 3,&lt;br /&gt;
			&amp;quot;HardwareName&amp;quot;: &amp;quot;virtual&amp;quot;,&lt;br /&gt;
			&amp;quot;HardwareType&amp;quot;: &amp;quot;Dummy (Does nothing, use for virtual switches only)&amp;quot;,&lt;br /&gt;
			&amp;quot;HardwareTypeVal&amp;quot;: 15,&lt;br /&gt;
			&amp;quot;HaveDimmer&amp;quot;: true,&lt;br /&gt;
			&amp;quot;HaveGroupCmd&amp;quot;: true,&lt;br /&gt;
			&amp;quot;HaveTimeout&amp;quot;: false,&lt;br /&gt;
			&amp;quot;ID&amp;quot;: &amp;quot;00014052&amp;quot;,&lt;br /&gt;
			&amp;quot;Image&amp;quot;: &amp;quot;Light&amp;quot;,&lt;br /&gt;
			&amp;quot;IsSubDevice&amp;quot;: false,&lt;br /&gt;
			&amp;quot;LastUpdate&amp;quot;: &amp;quot;2021-02-10 22:47:03&amp;quot;,&lt;br /&gt;
			&amp;quot;Level&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;LevelInt&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;MaxDimLevel&amp;quot;: 100,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;mySwitch&amp;quot;,&lt;br /&gt;
			&amp;quot;Notifications&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;PlanID&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;PlanIDs&amp;quot;: [&lt;br /&gt;
				0&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;Protected&amp;quot;: false,&lt;br /&gt;
			&amp;quot;ShowNotifications&amp;quot;: true,&lt;br /&gt;
			&amp;quot;SignalLevel&amp;quot;: &amp;quot;-&amp;quot;,&lt;br /&gt;
			&amp;quot;Status&amp;quot;: &amp;quot;On&amp;quot;,&lt;br /&gt;
			&amp;quot;StrParam1&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;StrParam2&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;SubType&amp;quot;: &amp;quot;Switch&amp;quot;,&lt;br /&gt;
			&amp;quot;SwitchType&amp;quot;: &amp;quot;On/Off&amp;quot;,&lt;br /&gt;
			&amp;quot;SwitchTypeVal&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Timers&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;Light/Switch&amp;quot;,&lt;br /&gt;
			&amp;quot;TypeImg&amp;quot;: &amp;quot;lightbulb&amp;quot;,&lt;br /&gt;
			&amp;quot;Unit&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;Used&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;UsedByCamera&amp;quot;: false,&lt;br /&gt;
			&amp;quot;User&amp;quot;: &amp;quot;Admin (IP: 192.168.192.41)&amp;quot;,&lt;br /&gt;
			&amp;quot;XOffset&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;YOffset&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Devices&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The array result[0] contains a hash/dict with name/value pairs of settings that are relevant to the device in question, in this example a thermostat.&lt;br /&gt;
*Please note that it will be something like json.result[1] in classic Lua and dzVents script because in Lua an array starts with 1.&lt;br /&gt;
&lt;br /&gt;
==Retrieve name / idx of all devices==&lt;br /&gt;
&lt;br /&gt;
If you are not sure of the IDX and want to do a quick lookup of name/value pairs to match a device name to its IDX, use&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=devices_list&lt;br /&gt;
&lt;br /&gt;
which will result in something like (fragment)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot; : &amp;quot;Corner Light&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot; : &amp;quot;156&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot; : &amp;quot;Table Light&amp;quot;,&lt;br /&gt;
			&amp;quot;value&amp;quot; : &amp;quot;198&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get status of all devices of a certain type==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getdevices&amp;amp;filter=all&amp;amp;used=true&amp;amp;order=Name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return information about all used devices. If you want to retrieve information for a specific devicetype, you can use the following filters with &amp;amp;filter=:&lt;br /&gt;
&lt;br /&gt;
 light &lt;br /&gt;
 weather&lt;br /&gt;
 temp&lt;br /&gt;
 utility&lt;br /&gt;
 wind&lt;br /&gt;
 rain&lt;br /&gt;
 uv&lt;br /&gt;
 baro&lt;br /&gt;
 zwavealarms&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;ActTime&amp;quot;: 1615581479,&lt;br /&gt;
	&amp;quot;AstrTwilightEnd&amp;quot;: &amp;quot;20:34&amp;quot;,&lt;br /&gt;
	&amp;quot;AstrTwilightStart&amp;quot;: &amp;quot;05:09&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightEnd&amp;quot;: &amp;quot;19:15&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightStart&amp;quot;: &amp;quot;06:29&amp;quot;,&lt;br /&gt;
	&amp;quot;DayLength&amp;quot;: &amp;quot;11:39&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightEnd&amp;quot;: &amp;quot;19:54&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightStart&amp;quot;: &amp;quot;05:50&amp;quot;,&lt;br /&gt;
	&amp;quot;ServerTime&amp;quot;: &amp;quot;2021-03-12 21:37:59&amp;quot;,&lt;br /&gt;
	&amp;quot;SunAtSouth&amp;quot;: &amp;quot;12:52&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunrise&amp;quot;: &amp;quot;07:02&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunset&amp;quot;: &amp;quot;18:41&amp;quot;,&lt;br /&gt;
	&amp;quot;app_version&amp;quot;: &amp;quot;2020.2 (build 13065)&amp;quot;,&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			 &amp;quot;List of all devices&amp;quot;: 1&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Devices&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get status of all devices, including hidden ones==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getdevices&amp;amp;used=true&amp;amp;displayhidden=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Device names starting with a &#039;$&#039; sign are invisible in both the &#039;&#039;Dashboard&#039;&#039; and &#039;&#039;Switches&#039;&#039; tabs in the Domoticz UI. If you want these devices included in the json output then &#039;&#039;displayhidden&#039;&#039; must be specified.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;ActTime&amp;quot;: 1615641865,&lt;br /&gt;
	&amp;quot;AstrTwilightEnd&amp;quot;: &amp;quot;20:36&amp;quot;,&lt;br /&gt;
	&amp;quot;AstrTwilightStart&amp;quot;: &amp;quot;05:07&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightEnd&amp;quot;: &amp;quot;19:16&amp;quot;,&lt;br /&gt;
	&amp;quot;CivTwilightStart&amp;quot;: &amp;quot;06:26&amp;quot;,&lt;br /&gt;
	&amp;quot;DayLength&amp;quot;: &amp;quot;11:43&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightEnd&amp;quot;: &amp;quot;19:56&amp;quot;,&lt;br /&gt;
	&amp;quot;NautTwilightStart&amp;quot;: &amp;quot;05:47&amp;quot;,&lt;br /&gt;
	&amp;quot;ServerTime&amp;quot;: &amp;quot;2021-03-13 14:24:25&amp;quot;,&lt;br /&gt;
	&amp;quot;SunAtSouth&amp;quot;: &amp;quot;12:51&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunrise&amp;quot;: &amp;quot;07:00&amp;quot;,&lt;br /&gt;
	&amp;quot;Sunset&amp;quot;: &amp;quot;18:43&amp;quot;,&lt;br /&gt;
	&amp;quot;app_version&amp;quot;: &amp;quot;2020.2 (build 13065)&amp;quot;,&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;AddjMulti&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;AddjMulti2&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;AddjValue&amp;quot;: 0,&lt;br /&gt;
			...&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;$Harmony_Mediacenter&amp;quot;,&lt;br /&gt;
			&amp;quot;Notifications&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;PlanID&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			...&lt;br /&gt;
			&amp;quot;YOffset&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;2176&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Devices&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get status of all Favorite devices==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getdevices&amp;amp;used=true&amp;amp;filter=all&amp;amp;favorite=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will return only devices that are tagged as Favorite.&lt;br /&gt;
&lt;br /&gt;
==Get server time==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getServerTime&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;ServerTime&amp;quot;: &amp;quot;2021-01-13 23:10:13&amp;quot;,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;getServerTime&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get sunrise and sunset times==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getSunRiseSet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;ServerTime&amp;quot; : &amp;quot;Sep 30 2013 17:15:21&amp;quot;,&lt;br /&gt;
   &amp;quot;Sunrise&amp;quot; : &amp;quot;07:38:00&amp;quot;,&lt;br /&gt;
   &amp;quot;Sunset&amp;quot; : &amp;quot;19:16:00&amp;quot;,&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;getSunRiseSet&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Use Notification Subsystem==&lt;br /&gt;
&lt;br /&gt;
You can post a notification to all enabled notification systems with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=sendnotification&amp;amp;subject=SUBJECT&amp;amp;body=THEBODY&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;SendNotification&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also post a notification to one or more notification systems with:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=sendnotification&amp;amp;subject=SUBJECT&amp;amp;body=THEBODY&amp;amp;subsystem=SUBSYSTEM1;SUBSYSTEM2;...&amp;amp;extradata=EXTRADATA1;EXTRADATA2;....&lt;br /&gt;
&lt;br /&gt;
*SUBJECT = a string you want to use as subject&lt;br /&gt;
*THEBODY= a string you want to use as body&lt;br /&gt;
*SUBSYSTEM= the notification system(s) you want to use (lowercase)&lt;br /&gt;
*EXTRADATA=Some subsystems can have extra data like for example FCM can have the specigic devices to be notified eg extradata=midx_7&lt;br /&gt;
&lt;br /&gt;
Subsystems:&lt;br /&gt;
 fcm&lt;br /&gt;
 http&lt;br /&gt;
 kodi&lt;br /&gt;
 lms&lt;br /&gt;
 nma&lt;br /&gt;
 prowl&lt;br /&gt;
 pushalot&lt;br /&gt;
 pushbullet&lt;br /&gt;
 pushover&lt;br /&gt;
 pushsafer&lt;br /&gt;
&lt;br /&gt;
==Backup and database related==&lt;br /&gt;
&lt;br /&gt;
send a VACUUM request to domoticz database; sqlite.org:  &amp;quot;The VACUUM command rebuilds the database file, repacking it into a minimal amount of disk space &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Please note that this command does require free space on the used temporary file system up to twice the current databases size.&lt;br /&gt;
&lt;br /&gt;
See [[https://sqlite.org/tempfiles.html sqlite.org] ] goto &#039;&#039;&#039; 5.Temporary File Storage Locations &#039;&#039;&#039;  &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;json.htm?type=command&amp;amp;param=vacuumdatabase&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;: &amp;quot;VacuumDatabase&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;/backupdatabase.php&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this call will create a database backup in the download directory of your workstation.&lt;br /&gt;
&lt;br /&gt;
==Event system==&lt;br /&gt;
&lt;br /&gt;
Get overview of (internal) events &lt;br /&gt;
&lt;br /&gt;
From Stable 2023.2: &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=events&amp;amp;evparam=list&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deprecated format (no fallback possible!) &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;/json.htm?type=events&amp;amp;param=list&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;interpreters&amp;quot;: &amp;quot;Blockly:Lua:dzVents:Python&amp;quot;,&lt;br /&gt;
		&amp;quot;result&amp;quot;: [&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;eventstatus&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
				&amp;quot;id&amp;quot;: &amp;quot;77&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;: &amp;quot;Lua  pinger&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;eventstatus&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
				&amp;quot;id&amp;quot;: &amp;quot;106&amp;quot;,&lt;br /&gt;
				&amp;quot;name&amp;quot;: &amp;quot;Lua curl&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
	....&lt;br /&gt;
			}&lt;br /&gt;
		],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;ListEvents&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Deprecated format (no fallback possible!) &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;/json.htm?type=events&amp;amp;param=updatestatus&amp;amp;eventid=77&amp;amp;eventstatus=1&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From Stable 2023.2: &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=events&amp;amp;evparam=updatestatus&amp;amp;eventid=77&amp;amp;eventstatus=1&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;: &amp;quot;Events&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Accept new sensors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;/json.htm?type=command&amp;amp;param=allownewhardware&amp;amp;timeout=MINUTES&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
		&amp;quot;title&amp;quot;: &amp;quot;AllowNewHardware&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get list of custom icons==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;/json.htm?type=command&amp;amp;param=getcustomiconset&amp;lt;/source&amp;gt;&lt;br /&gt;
Add 100 to the Idx value to use it in the [[Domoticz API/JSON URL&#039;s#change Icon Not available for all device types|set Custom icon command]].&lt;br /&gt;
So listed Idx: 2 is iconNumber 102 for the command.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;result&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;Description&amp;quot;: &amp;quot;OpenAQ&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile16&amp;quot;: &amp;quot;images/xfr_openaq2.png&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile48Off&amp;quot;: &amp;quot;images/xfr_openaq248_Off.png&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile48On&amp;quot;: &amp;quot;images/xfr_openaq248_On.png&amp;quot;,&lt;br /&gt;
      &amp;quot;Title&amp;quot;: &amp;quot;OpenAQ&amp;quot;,&lt;br /&gt;
      &amp;quot;idx&amp;quot;: 1&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;Description&amp;quot;: &amp;quot;Omnik Logo&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile16&amp;quot;: &amp;quot;images/Omnik.png&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile48Off&amp;quot;: &amp;quot;images/Omnik48_Off.png&amp;quot;,&lt;br /&gt;
      &amp;quot;IconFile48On&amp;quot;: &amp;quot;images/Omnik48_On.png&amp;quot;,&lt;br /&gt;
      &amp;quot;Title&amp;quot;: &amp;quot;Omnik&amp;quot;,&lt;br /&gt;
      &amp;quot;idx&amp;quot;: 2&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;GetCustomIconSet&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Lights and switches=&lt;br /&gt;
&lt;br /&gt;
==Get details of all lights/switches==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getlightswitches&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getdevices&amp;amp;filter=light&amp;amp;used=true&amp;amp;order=Name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;IsDimmer&amp;quot; : false,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Bedroom lights&amp;quot;,&lt;br /&gt;
         &amp;quot;SubType&amp;quot; : &amp;quot;Energenie&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Lighting 1&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;43&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;IsDimmer&amp;quot; : false,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Hall&amp;quot;,&lt;br /&gt;
         &amp;quot;SubType&amp;quot; : &amp;quot;Energenie&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Lighting 1&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;30&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;IsDimmer&amp;quot; : true,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Lounge Light Front&amp;quot;,&lt;br /&gt;
         &amp;quot;SubType&amp;quot; : &amp;quot;RGBW&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Lighting Limitless/Applamp&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;32&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;IsDimmer&amp;quot; : true,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Lounge Lights All&amp;quot;,&lt;br /&gt;
         &amp;quot;SubType&amp;quot; : &amp;quot;RGBW&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Lighting Limitless/Applamp&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;66&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;IsDimmer&amp;quot; : true,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Lounge light back&amp;quot;,&lt;br /&gt;
         &amp;quot;SubType&amp;quot; : &amp;quot;RGBW&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Lighting Limitless/Applamp&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;33&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;GetLightSwitches&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Turn a light/switch on/off==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=&amp;lt;On|Off|Toggle|Stop&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
When error:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;message&amp;quot; : &amp;quot;Error sending switch command, check device/hardware (idx=nnn) !&amp;quot;,&lt;br /&gt;
	&amp;quot;status&amp;quot; : &amp;quot;ERROR&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
==Open-Close-Stop Blinds== &lt;br /&gt;
&lt;br /&gt;
Open-Close Blinds&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=&amp;lt;Open|Close|Stop&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=Set%20Level&amp;amp;level=&amp;lt;0..100&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==General notes==&lt;br /&gt;
&lt;br /&gt;
Commands are case sensitive!&lt;br /&gt;
&lt;br /&gt;
Beware that if the switch has the &#039;protected&#039; attribute set then you need add key `passcode` (with the right passcode)&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=Off&amp;amp;passcode=YOUR_SWITCH_PASSWORD_AS_SET_IN_SETTINGS&lt;br /&gt;
&lt;br /&gt;
or the status will be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{  &lt;br /&gt;
   &amp;quot;message&amp;quot; : &amp;quot;WRONG CODE&amp;quot;,&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;ERROR&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that when you use &#039;&#039;&#039;&amp;amp;switchcmd&#039;&#039;&#039;, the http:// or script:// on/off actions of the corresponding switch are executed. If you just want to update the status of the switch in Domoticz &#039;&#039;without&#039;&#039; running these actions, use the &#039;&#039;&#039;&amp;amp;param=udevice&#039;&#039;&#039; option instead (see update-section below).&lt;br /&gt;
&lt;br /&gt;
==Switching RFY Blinds sun/wind detector on/off==&lt;br /&gt;
&lt;br /&gt;
On some type of blinds it is possible to enable/disable the sun/wind detector.&lt;br /&gt;
&lt;br /&gt;
Enable (where the number behind idx is the idx number of the screen in domoticz):&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=7&amp;amp;switchcmd=EnableSunWind&lt;br /&gt;
Disable:&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=7&amp;amp;switchcmd=DisableSunWind&lt;br /&gt;
&lt;br /&gt;
==Set a dimmable light/selector to a certain level==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=Set%20Level&amp;amp;level=6&lt;br /&gt;
&lt;br /&gt;
*dimmable: &lt;br /&gt;
**Some lights have 100 dim levels (like zwave and others), other hardware (kaku/lightwaverf) have other ranges like 16/32&lt;br /&gt;
**Level should be the dim level (not percentage), like 0-16 or 0-100 depending on the hardware used&lt;br /&gt;
**When the light is off, it will be turned on&lt;br /&gt;
*Blinds: enter percentage, level will be 0-100&lt;br /&gt;
*Selector switch: enter the level number (eg 10, 20 or 30) that can be found in the edit section of a switch.&lt;br /&gt;
*To update in Domoticz only without running it&#039;s device actions use &amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=[0,1,2]&amp;amp;svalue=LEVELNR&amp;lt;/code&amp;gt; Statuses for Blinds Percentage when using &amp;amp;param=udevice:&lt;br /&gt;
&lt;br /&gt;
       Closed: nValue = 1 and sValue = 100&lt;br /&gt;
       partially opened: nValue = 2 and sValue = 1-99&lt;br /&gt;
       Open: nValue = 0 and sValue = 0 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set a light to a certain color or color temperature==&lt;br /&gt;
&lt;br /&gt;
Color can be specified as either hue + brightness, RGB + optional brightness or a Domoticz JSON color object&lt;br /&gt;
&lt;br /&gt;
;Specify hue and brightness&lt;br /&gt;
:Hue in degrees, 0..360&lt;br /&gt;
:Brightness 0..100&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setcolbrightnessvalue&amp;amp;idx=99&amp;amp;hue=274&amp;amp;brightness=40&amp;amp;iswhite=false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SetColBrightnessValue&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Note: There is no saturation parameter, specify RGB format Domoticz JSON color format for full color control&lt;br /&gt;
&lt;br /&gt;
;Specify RGB and brightness (optional)&lt;br /&gt;
:RGB as hexadecimal number, RRGGBB without prefix (no 0x or #)&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setcolbrightnessvalue&amp;amp;idx=99&amp;amp;hex=RRGGBB&amp;amp;brightness=100&amp;amp;iswhite=false&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SetColBrightnessValue&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Note: The actual brightness of the light is a combination of RGB value and brightness. Brightness parameter may be omitted.&lt;br /&gt;
:A site like [http://www.colorhexa.com/ff8c00 colorhexa] can be used to help pick hex values according to desired colours.&lt;br /&gt;
&lt;br /&gt;
;Specify Domoticz JSON color object and brightness&lt;br /&gt;
:Example: Specify color mode with a dim blue color&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setcolbrightnessvalue&amp;amp;idx=130&amp;amp;color={&amp;quot;m&amp;quot;:3,&amp;quot;t&amp;quot;:0,&amp;quot;r&amp;quot;:0,&amp;quot;g&amp;quot;:0,&amp;quot;b&amp;quot;:50,&amp;quot;cw&amp;quot;:0,&amp;quot;ww&amp;quot;:0}&amp;amp;brightness=100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SetColBrightnessValue&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Domoticz color format:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Domoticz color format is used as:&lt;br /&gt;
&lt;br /&gt;
*input parameter to:&lt;br /&gt;
*:- setcolbrightnessvalue&lt;br /&gt;
*:- updatetimer&lt;br /&gt;
*:- addtimer&lt;br /&gt;
*:- addscenedevice&lt;br /&gt;
*:- updatescenedevice&lt;br /&gt;
*In response from:&lt;br /&gt;
*:- devices&lt;br /&gt;
*:- getscenedevices&lt;br /&gt;
*:- timers&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;color={&amp;quot;m&amp;quot;:3,&amp;quot;t&amp;quot;:0,&amp;quot;r&amp;quot;:0,&amp;quot;g&amp;quot;:0,&amp;quot;b&amp;quot;:50,&amp;quot;cw&amp;quot;:0,&amp;quot;ww&amp;quot;:0}&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                                         ColorMode {&lt;br /&gt;
                                                         	ColorModeNone = 0,   // Illegal&lt;br /&gt;
                                                         	ColorModeWhite = 1,  // White. Valid fields: none&lt;br /&gt;
                                                         	ColorModeTemp = 2,   // White with color temperature. Valid fields: t&lt;br /&gt;
                                                         	ColorModeRGB = 3,    // Color. Valid fields: r, g, b.&lt;br /&gt;
                                                         	ColorModeCustom = 4, // Custom (color + white). Valid fields: r, g, b, cw, ww, depending on device capabilities&lt;br /&gt;
                                                         	ColorModeLast = ColorModeCustom,&lt;br /&gt;
                                                         };&lt;br /&gt;
                                                         &lt;br /&gt;
                                                         Color {&lt;br /&gt;
                                                         	ColorMode m;&lt;br /&gt;
                                                         	uint8_t t;     // Range:0..255, Color temperature (warm / cold ratio, 0 is coldest, 255 is warmest)&lt;br /&gt;
                                                         	uint8_t r;     // Range:0..255, Red level&lt;br /&gt;
                                                         	uint8_t g;     // Range:0..255, Green level&lt;br /&gt;
                                                         	uint8_t b;     // Range:0..255, Blue level&lt;br /&gt;
                                                         	uint8_t cw;    // Range:0..255, Cold white level&lt;br /&gt;
                                                         	uint8_t ww;    // Range:0..255, Warm white level (also used as level for monochrome white)&lt;br /&gt;
                                                         }&lt;br /&gt;
                                                         &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
This API call is called internally by dzVents when using the following device object methods:&lt;br /&gt;
&lt;br /&gt;
*[https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting#RGBW.28W.29_.2F_Lighting_Limitless.2FApplamp setColor(r, g, b, br, cw, ww, m, t)]&lt;br /&gt;
*[https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting#RGBW.28W.29_.2F_Lighting_Limitless.2FApplamp setColorBrightness()]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please ensure local access is enabled for 127.0.0.1 or 127.0.0.* &lt;br /&gt;
[https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting#Using_dzVents_with_Domoticz (described here)].&lt;br /&gt;
for these to work correctly. &amp;lt;br&amp;gt;&lt;br /&gt;
The parameters r, g, b, cw, ww, m and t map to the same values in the aforementioned color object. &amp;lt;br&amp;gt;&lt;br /&gt;
The parameter br maps to brightness [0..100]. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set an RGB_CW_WW or CW_WW light to a certain color temperature==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setkelvinlevel&amp;amp;idx=99&amp;amp;kelvin=1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Set Kelvin Level&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
 Range of kelvin parameter: 0..100, 0 is coldest, 100 is warmest&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
This API call is called internally by dzVents when using the following device object method:&lt;br /&gt;
&lt;br /&gt;
*[https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting#RGBW.28W.29_.2F_Lighting_Limitless.2FApplamp setKelvin(Kelvin)]&lt;br /&gt;
&lt;br /&gt;
Please ensure local access is enabled for 127.0.0.1 or 127.0.0.* &lt;br /&gt;
[https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting#Using_dzVents_with_Domoticz (described here)].&lt;br /&gt;
for this to work correctly. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Toggle a switch state between on/off==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=99&amp;amp;switchcmd=Toggle&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cameras=&lt;br /&gt;
==Get cameras==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getcameras&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Address&amp;quot;: &amp;quot;192.168.192.111&amp;quot;,&lt;br /&gt;
			&amp;quot;Enabled&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
			&amp;quot;ImageURL&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;Inside&amp;quot;,&lt;br /&gt;
			&amp;quot;Password&amp;quot;: &amp;quot;Secret&amp;quot;,&lt;br /&gt;
			&amp;quot;Port&amp;quot;: 19767,&lt;br /&gt;
			&amp;quot;Protocol&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Username&amp;quot;: &amp;quot;anyUser&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Address&amp;quot;: &amp;quot;192.168.192.112&amp;quot;,&lt;br /&gt;
			&amp;quot;Enabled&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
			&amp;quot;ImageURL&amp;quot;: &amp;quot;image.jpg&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;Outside&amp;quot;,&lt;br /&gt;
			&amp;quot;Password&amp;quot;: &amp;quot;verySecret&amp;quot;,&lt;br /&gt;
			&amp;quot;Port&amp;quot;: 19765,&lt;br /&gt;
			&amp;quot;Protocol&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Username&amp;quot;: &amp;quot;anotherUser&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Cameras&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add camera==&lt;br /&gt;
&lt;br /&gt;
imageurl must be base64 encoded&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/json.htm?type=command&amp;amp;param=addcamera&amp;amp;address=192.168.192.111&amp;amp;port=19765&amp;amp;name=insideCamera&amp;amp;enabled=true&amp;amp;imageurl=aW1hZ2UuanBn&amp;amp;protocol=0&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;AddCamera&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Update camera==&lt;br /&gt;
&lt;br /&gt;
imageurl must be base64 encoded&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/json.htm?type=command&amp;amp;param=updatecamera&amp;amp;address=192.168.192.111&amp;amp;port=19767&amp;amp;name=test&amp;amp;enabled=true&amp;amp;idx=1&amp;amp;imageurl=aW1hZ2UuanBn&amp;amp;protocol=0&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;UpdateCamera&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Send snapshot from camera==&lt;br /&gt;
&lt;br /&gt;
imageurl must be base64 encoded&lt;br /&gt;
&lt;br /&gt;
&amp;amp;user&amp;amp;password optional&lt;br /&gt;
&lt;br /&gt;
Sends email with a camera snapshots if email is configured in Menu Setup - Settings and set for attachments. &lt;br /&gt;
&lt;br /&gt;
camidx: Send 1 or multiple camerIDs in ; separated.&lt;br /&gt;
&lt;br /&gt;
Subject: Subject of email&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/json.htm?type=command&amp;amp;param=emailcamerasnapshot&amp;amp;camidx=1;3&amp;amp;subject=Movement+at+Frontdoor&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Email Camera Snapshot&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Scenes / Groups=&lt;br /&gt;
==Get current state of all scenes &amp;amp; groups==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getscenes&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;Favorite&amp;quot; : 1,&lt;br /&gt;
         &amp;quot;HardwareID&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;LastUpdate&amp;quot; : &amp;quot;2013-09-29 19:11:01&amp;quot;,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;My Scene&amp;quot;,&lt;br /&gt;
         &amp;quot;Status&amp;quot; : &amp;quot;Off&amp;quot;,&lt;br /&gt;
         &amp;quot;Timers&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Scene&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;9&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;Favorite&amp;quot; : 1,&lt;br /&gt;
         &amp;quot;HardwareID&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;LastUpdate&amp;quot; : &amp;quot;2013-09-30 11:49:13&amp;quot;,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;My Group&amp;quot;,&lt;br /&gt;
         &amp;quot;Status&amp;quot; : &amp;quot;Off&amp;quot;,&lt;br /&gt;
         &amp;quot;Timers&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Group&amp;quot;,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;3&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;Scenes&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Turn a scene / group on or off==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchscene&amp;amp;idx=&amp;amp;switchcmd=&amp;lt;On|Off|Toggle&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*idx = id of your scene/group.&lt;br /&gt;
*switchcmd = &amp;quot;On&amp;quot;, &amp;quot;Off&amp;quot; or &amp;quot;Toggle&amp;quot; (case sensitive!)&lt;br /&gt;
*Scenes can only be turned &#039;&#039;&#039;On&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SwitchScene&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add a scene (0)==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=addscene&amp;amp;name=&#039;&#039;scenename&#039;&#039;&amp;amp;scenetype=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add a group (1)==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=addscene&amp;amp;name=&#039;&#039;scenename&#039;&#039;&amp;amp;scenetype=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a scene or group==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=deletescene&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List devices in a scene==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getscenedevices&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;amp;isscene=true&lt;br /&gt;
&lt;br /&gt;
==Add device to a scene==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=addscenedevice&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;amp;isscene=true&amp;amp;devidx=&#039;&#039;deviceindex&#039;&#039;&amp;amp;command=1&amp;amp;level=&#039;&#039;number&#039;&#039;&amp;amp;hue=&#039;&#039;number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Delete device from a scene==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletescenedevice&amp;amp;idx=&#039;&#039;number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==List activation devices of a scene==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getsceneactivations&amp;amp;idx=&#039;&#039;number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;result&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;code&amp;quot;: 0,&lt;br /&gt;
           &amp;quot;codestr&amp;quot;: &amp;quot;-&amp;quot;,&lt;br /&gt;
           &amp;quot;idx&amp;quot;: 249,&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Activator device&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
            &amp;quot;code&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;codestr&amp;quot;: &amp;quot;-&amp;quot;,&lt;br /&gt;
            &amp;quot;idx&amp;quot;: 1048,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Another Activator device&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;GetSceneActivations&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add activation devices for a scene==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=addscenecode&amp;amp;sceneidx=&amp;lt;scene ID&amp;gt;&amp;amp;idx=&amp;lt;device ID&amp;gt;&amp;amp;cmnd=&amp;lt;command&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;AddSceneCode&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add OnAction and OffAction to a scene or group==&lt;br /&gt;
This command can be issue only after a scene or group was created, so first create the scene/group, than update the scene/group specifying the On Action and/or Off Action&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=updatescene&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;amp;scenetype=&#039;&#039;scenetype&#039;&#039;&amp;amp;onaction=&#039;&#039;base64onaction&#039;&#039;&amp;amp;offaction=&#039;&#039;base64offaction&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;number&#039;&#039; is the idx of the scene/group, &#039;&#039;scenetype&#039;&#039; is 0 for scenes of 1 for groups, &#039;&#039;base64onactions&#039;&#039; is the On Action coded with base64 and &#039;&#039;base64offaction&#039;&#039; is the Off Action coded with base64. It&#039;s possible to find base64 converters online, like https://www.base64encode.org/&lt;br /&gt;
&lt;br /&gt;
Please note that you have to include your current description if any&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;UpdateScene&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List timers of a scene==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getscenetimers&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
         &amp;quot;Cmd&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;Date&amp;quot; : &amp;quot;07-02-2016&amp;quot;,&lt;br /&gt;
         &amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
         &amp;quot;Hue&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
         &amp;quot;Randomness&amp;quot; : true,&lt;br /&gt;
         &amp;quot;Time&amp;quot; : &amp;quot;00:01&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : 5,&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;16&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SceneTimers&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add timer to a scene==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=addscenetimer&amp;amp;idx=&#039;&#039;number&#039;&#039;&amp;amp;active=&amp;amp;timertype=&amp;amp;date=&amp;amp;hour=&amp;amp;min=&amp;amp;randomness=&amp;amp;command=&amp;amp;level=&amp;amp;days=&lt;br /&gt;
&lt;br /&gt;
*idx        = index of your scene/group.&lt;br /&gt;
*active     = true/false&lt;br /&gt;
*timertype  = 0 = Before Sunrise, 1 = After Sunrise, 2 = On Time, 3 = Before Sunset, 4 = After Sunset, 5 = Fixed Date/Time&lt;br /&gt;
*date       = MM-DD-YYYY&lt;br /&gt;
*hour       = hour&lt;br /&gt;
*min        = minute&lt;br /&gt;
*randomness = true/false&lt;br /&gt;
*command    = On/Off&lt;br /&gt;
*level      = 0..100 (%)&lt;br /&gt;
*days       = 0x80 = Everyday, 0x100 = Weekdays, 0x200 = Weekends, 0x01 = Mon, 0x02 = Tue, 0x04 = Wed, 0x08 = Thu, 0x10 = Fri, 0x20 = Sat, 0x40 = Sun&lt;br /&gt;
&lt;br /&gt;
==Enable/disable/delete specific scene schedule(timer)==&lt;br /&gt;
[[Domoticz_API/JSON_URL&#039;s#Enable specific schedule(timer) for Scenes/Groups|Enable specific schedule(timer) for Scenes/Groups]]&lt;br /&gt;
&lt;br /&gt;
[[Domoticz_API/JSON_URL&#039;s#Disable specific schedule(timer) for Scenes/Groups|Disable specific schedule(timer) for Scenes/Groups]]&lt;br /&gt;
&lt;br /&gt;
[[Domoticz_API/JSON_URL&#039;s#Delete specific schedule(timer) for Scenes/Groups|Delete specific schedule(timer) for Scenes/Groups]]&lt;br /&gt;
&lt;br /&gt;
=Setpoint/Thermostat control=&lt;br /&gt;
&lt;br /&gt;
==Set Setpoint==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setsetpoint&amp;amp;idx=&amp;amp;setpoint=&lt;br /&gt;
&lt;br /&gt;
*idx = id of the setpoint&lt;br /&gt;
*setpoint = value (for temperature in Celsius (like 20.5))&lt;br /&gt;
&lt;br /&gt;
=Server control=&lt;br /&gt;
&lt;br /&gt;
==Shutdown system==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=system_shutdown&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SystemShutdown&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reboot system==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=system_reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SystemReboot&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Create,  delete, rename, action and disable commands=&lt;br /&gt;
&lt;br /&gt;
==Create virtual hardware==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=addhardware&amp;amp;htype=15&amp;amp;port=1&amp;amp;name=Sensors1&amp;amp;enabled=true&lt;br /&gt;
&lt;br /&gt;
afterwards to get the id, either you have your last created id from an index you maintain or sort the hardware page for last ID:&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=gethardware&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create a virtual sensor==&lt;br /&gt;
&lt;br /&gt;
Basic action (see below for values)&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=createvirtualsensor&amp;amp;idx=HWIDX&amp;amp;sensorname=SENSORNAME&amp;amp;sensortype=SENSORTYPE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: It is normally easier to use the CreateDevice JSON (see next section)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Temp+Humidity example&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;createvirtualsensor&amp;amp;idx=HWIDX&amp;amp;sensorname=TempHum&amp;amp;sensortype=82&lt;br /&gt;
Electricity example&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=c&amp;lt;/code&amp;gt;reatevirtualsensor&amp;amp;idx=HWIDX&amp;amp;sensorname=Energy&amp;amp;sensortype=90&lt;br /&gt;
&lt;br /&gt;
and then get the device id from the list:&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=get&amp;lt;/code&amp;gt;devices&amp;amp;filter=all&amp;amp;used=true&amp;amp;order=Name&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
&lt;br /&gt;
*HWIDX = id of your (Dummy) hardware (not the device!). This number can be found in the hardware tab in the column &amp;quot;IDX&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note: If a non existing hardware IDX is used the created device is greyed out in the user interface!&lt;br /&gt;
&lt;br /&gt;
*SENSORNAME = sensor name&lt;br /&gt;
*SENSORTYPE = See list below (this is an incomplete list. For more devices see page [[Developing a Python plugin]])&lt;br /&gt;
&lt;br /&gt;
 1 Pressure (Bar) 0.0 	      	     nvalue=BAR (TBC)        &lt;br /&gt;
 2 Percentage     0.0 	      	     nvalue=PCT (TBC)	        &lt;br /&gt;
 80 TEMP          0.0     	     svalue=TEMP&lt;br /&gt;
 81 HUM           1		     nvalue=HUM svalue=1 to 3&lt;br /&gt;
 82 TEMP_HUM      0.0;50;1 	     svalue=TEMP;HUM;HUM_STATUS&lt;br /&gt;
 84 TEMP_HUM_BARO 0.0;50;1;1010;1    svalue=TEMP;HUM;HUM_STATUS;BARO;BARO_FCST&lt;br /&gt;
 85 RAIN          0;0		     svalue=RAIN;Rain in mm/h&lt;br /&gt;
 86 WIND          0;N;0;0;0;0  	     svalue=WIN_SPD;WIND_DIR;?;?;?;?&lt;br /&gt;
 87 UV            0;0		     svalue= (TBC)&lt;br /&gt;
 113 RFXMeter     0		     Can have several values, another order has to be sent to set the sub type:	   &lt;br /&gt;
  type 5	Time:   svalue=COUNTER&lt;br /&gt;
  type 4	Energy generated:   svalue=POWER;ENERGY&lt;br /&gt;
  type 3	Counter:   svalue=COUNTER&lt;br /&gt;
  type 2	Water:	   svalue=VOLUME&lt;br /&gt;
  type 1	Gas:   svalue=VOLUME&lt;br /&gt;
  type 0	Energy: svalue=POWER;ENERGY&lt;br /&gt;
 90 ENERGY        0;0.0		     svalue=POWER;ENERGY&lt;br /&gt;
 249 TypeAirQuality    0	     nvalue=PPM&lt;br /&gt;
&lt;br /&gt;
For the RFXMeter another request is needed to set the utility (switchtype). URL is:&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;idx=DEVICE_IDX&amp;amp;name=SENSORNAME&amp;amp;switchtype=SUBTYPE_VALUE&amp;amp;used=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where DEVICE_IDX is the device idx, SENSORNAME is device name, and the SUBTYPE_VALUE is one of:&lt;br /&gt;
 0 for Energy&lt;br /&gt;
 1 for Gas&lt;br /&gt;
 2 for Water&lt;br /&gt;
 3 for Custom Counter&lt;br /&gt;
 4 for Energy Generated&lt;br /&gt;
 5 for Time&lt;br /&gt;
&lt;br /&gt;
==Create a device==&lt;br /&gt;
An overview of all available devices can be found in wiki page [[Developing_a_Python_plugin#Available_Device_Types]]&lt;br /&gt;
&lt;br /&gt;
Basic Action:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=createdevice&amp;amp;idx=HWIDX&amp;amp;name=SENSORNAME&amp;amp;sensormappedtype=MAPPEDTYPE&amp;quot;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*HWIDX = id of your (Dummy) hardware. This number can be found in the hardware tab in the column &amp;quot;IDX&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note: If a non existing hardware IDX is used the created device is greyed out in the user interface!&lt;br /&gt;
&lt;br /&gt;
*SENSORNAME = sensor name&lt;br /&gt;
*DEVICETYPE = type of device, see overview [[Developing_a_Python_plugin#Available_Device_Types]]&lt;br /&gt;
&lt;br /&gt;
Source: https://github.com/domoticz/domoticz/blob/development/hardware/hardwaretypes.h or https://github.com/domoticz/domoticz/blob/development/main/RFXtrx.h&lt;br /&gt;
&lt;br /&gt;
*DEVICESUBTYPE = subtype of device, see overview [[Developing_a_Python_plugin#Available_Device_Types]]&lt;br /&gt;
&lt;br /&gt;
Source: https://github.com/domoticz/domoticz/blob/development/hardware/hardwaretypes.h or https://github.com/domoticz/domoticz/blob/development/main/RFXtrx.h&lt;br /&gt;
&lt;br /&gt;
Example Result&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;idx&amp;quot; : &amp;quot;142&amp;quot;,&lt;br /&gt;
	&amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;CreateSensor&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Examples:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Temp (Type: pTypeTEMP, subType: sTypeTEMP5)&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;createdevice&amp;amp;idx=HWIDX&amp;amp;sensorname=Temp5&amp;amp;devicetype=50&amp;amp;devicesubtype=5&lt;br /&gt;
Voltage (Type: pTypeGeneral, subType: sTypeVoltage)&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;createdevice&amp;amp;idx=HWIDX&amp;amp;sensorname=Voltage0&amp;amp;devicetype=243&amp;amp;devicesubtype=8&lt;br /&gt;
Electric (Instant+Counter)&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;createdevice&amp;amp;idx=HWIDX&amp;amp;sensorname=ElecInstCount&amp;amp;devicetype=243&amp;amp;devicesubtype=29&lt;br /&gt;
Counter Incremental&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;createdevice&amp;amp;idx=HWIDX&amp;amp;sensorname=Counter%20Increment2&amp;amp;devicetype=243&amp;amp;devicesubtype=28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For the Counter Incremental, Counter and managed Counter and Switches another request is needed to set the type(switchtype). URL is:&lt;br /&gt;
 /json.htm?type=&amp;lt;code&amp;gt;command&amp;amp;param=&amp;lt;/code&amp;gt;setused&amp;amp;idx=DEVICE_IDX&amp;amp;name=SENSORNAME&amp;amp;switchtype=SUBTYPE_VALUE&amp;amp;used=true&lt;br /&gt;
where for counters DEVICE_IDX is the device idx, SENSORNAME is device name, and the SUBTYPE_VALUE is one of:&lt;br /&gt;
 0 for Energy&lt;br /&gt;
 1 for Gas&lt;br /&gt;
 2 for Water&lt;br /&gt;
 3 for Custom Counter&lt;br /&gt;
 4 for Energy Generated&lt;br /&gt;
 5 for Time&lt;br /&gt;
&lt;br /&gt;
For switches&lt;br /&gt;
 SubType Name 	&lt;br /&gt;
 0  	On/Off 	&lt;br /&gt;
 1  	Doorbell 	&lt;br /&gt;
 2  	Contact 	&lt;br /&gt;
 3  	Blinds 	&lt;br /&gt;
 4  	X10 Siren 	&lt;br /&gt;
 5  	Smoke Detector 	&lt;br /&gt;
 6  	Blinds Inverted 	&lt;br /&gt;
 7  	Dimmer 	&lt;br /&gt;
 8  	Motion Sensor&lt;br /&gt;
 9  	Push On Button 	&lt;br /&gt;
 10 	Push Off Button 	&lt;br /&gt;
 11 	Door Contact &lt;br /&gt;
 12 	Dusk Sensor 	&lt;br /&gt;
 13 	Blinds Percentage &lt;br /&gt;
 14 	Venetian Blinds US 	&lt;br /&gt;
 15 	Venetian Blinds EU 	&lt;br /&gt;
 16 	Blinds Percentage Inverted 	&lt;br /&gt;
 17 	Media Player 	&lt;br /&gt;
 18 	Selector 	&lt;br /&gt;
 19 	Door Lock 	&lt;br /&gt;
 20 	Door Lock Inverted&lt;br /&gt;
 21 	Blinds Percentage with Stop&lt;br /&gt;
 22 	Blinds Percentage with Stop Inverted&lt;br /&gt;
&lt;br /&gt;
==Rename hardware==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=updatehardware&amp;amp;htype=&amp;lt;type&amp;gt;&amp;amp;name=&amp;lt;new name&amp;gt;&amp;amp;enabled=&amp;lt;true or false&amp;gt;&amp;amp;idx=&amp;lt;hardware idx&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To get the required data from the hardware first do&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=gethardware&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rename device / sensor==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;idx=&amp;lt;device ID&amp;gt;&amp;amp;name=&amp;lt;new name&amp;gt;&amp;amp;used=true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enable hardware==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=updatehardware&amp;amp;htype=&amp;lt;type&amp;gt;&amp;amp;name=&amp;lt;name&amp;gt;&amp;amp;enabled=true&amp;amp;port=&amp;lt;port name&amp;gt;&amp;amp;idx=&amp;lt;hardware idx&amp;gt;&amp;amp;loglevel=&amp;lt;log level&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;note&#039;&#039;&#039; Use the complete set of parms that you find when entering the enable command on the GUI because if not completely entered it will destroy your hardware table. Test first on a test system !!&lt;br /&gt;
&lt;br /&gt;
==Disable hardware==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=updatehardware&amp;amp;htype=&amp;lt;type&amp;gt;&amp;amp;name=&amp;lt;name&amp;gt;&amp;amp;enabled=false&amp;amp;idx=&amp;lt;hardware idx&amp;gt;&lt;br /&gt;
To get the required data from the hardware first do&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=gethardware&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;note&#039;&#039;&#039; Use the complete set of parms that you find when entering the disable command on the GUI because if not completely entered it will remove data from the parms. Test on a test system first !!&lt;br /&gt;
&lt;br /&gt;
==Delete hardware==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletehardware&amp;amp;idx=&amp;lt;hardware idx&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;DeleteHardware&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a device or sensor==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;used=false&amp;amp;idx=&amp;lt;device idx&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SetUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enable/Disable a device or sensor==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setdevused&amp;amp;idx=&amp;lt;device idx&amp;gt;&amp;amp;used=&amp;lt;true/false&amp;gt;&amp;amp;name=&amp;lt;device name&amp;gt;&lt;br /&gt;
(device name is a optional parameter)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SetDeviceUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enable a disabled device or sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?idx=&amp;lt;device idx&amp;gt;&amp;amp;name=&amp;lt;new name&amp;gt;&amp;amp;type=setused&amp;amp;used=true&lt;br /&gt;
or &lt;br /&gt;
 /json.htm?idx=&amp;lt;device idx&amp;gt;&amp;amp;type=setused&amp;amp;used=true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;SetUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add an On action and/or an Off action to a device or sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=setused&amp;amp;used=true&amp;amp;idx=IDX&amp;amp;strparam1=base64Encoded(ON ACTION STRING)&amp;amp;strparam2=base64Encoded(OFF ACTION STRING)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SetUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Transfer device==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=transferdevice&amp;amp;idx=IDX_1&amp;amp;newidx=IDX_2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transfer sensor log of device with oldest lastUpdate value to device with most recent lastUpdate value. So not necessarily from IDX_1 to IDX_2 or the other way around.&lt;br /&gt;
Source device is removed after transfer of logs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;TransferDevice&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Update devices/sensors=&lt;br /&gt;
Note that when you use this &amp;amp;param=udevice option with the additional option &amp;amp;parsetrigger=false, the device is updated &#039;&#039;without&#039;&#039; running the associated on/off- and script actions. &lt;br /&gt;
&lt;br /&gt;
Expert usage. Directly set device parameters via JSON.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be careful when firing values to domoticz.db as there is a chance to crash the database if parameters are wrong or missing.&lt;br /&gt;
First go to the devices tab and notice the device index (idx) of the device you want to change&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Generic update API&#039;s==&lt;br /&gt;
&lt;br /&gt;
Note make sure stringparms must be urlenecoded (eg. &amp;lt;space&amp;gt; %20, &amp;lt;Double quote&amp;gt; %27 etc..&lt;br /&gt;
&lt;br /&gt;
===update a sensor device=== &lt;br /&gt;
Note: for switches/lights/dimmers see Lights and Switches section. &lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;nvalue=&amp;lt;numeric value&amp;gt;&amp;amp;svalue=&amp;lt;string value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===change Icon &amp;lt;sup&amp;gt;Not available for all device types&amp;lt;/sup&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;used=true&amp;amp;name=&amp;lt;devicename&amp;gt;&amp;amp;description=&amp;lt;description&amp;gt;&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;switchtype=&amp;lt;switchType&amp;gt;&amp;amp;customimage=&amp;lt;iconNumber&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use the [[Domoticz API/JSON URL&#039;s#Get list of custom icons|getcustomiconset command]] to get a list of all custom icons. Add 100 the given Idx value to set the iconnumber. So listed Idx:2 is iconNumber 102&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;SetUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===change name=== &lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=renamedevice&amp;amp;name=&amp;lt;new devicename&amp;gt;&amp;amp;idx=&amp;lt;idx&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;RenameDevice&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===protection On / Off===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;used=true&amp;amp;protected=&amp;lt;true/falseidx=&amp;lt;idx&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;SetUsed&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===update in domoticz only=== &lt;br /&gt;
&lt;br /&gt;
does not parse the actual command to the hardware (like MQTT)&lt;br /&gt;
&lt;br /&gt;
with parsetrigger=false --&amp;gt;&amp;gt; No event is triggered either  &lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;nvalue=&amp;lt;numeric value&amp;gt;&amp;amp;svalue=&amp;lt;string value&amp;gt;&amp;amp;parsetrigger=&amp;lt;false/true&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*TEMP = Temperature&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Humidity==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=HUM&amp;amp;svalue=HUM_STAT&lt;br /&gt;
&lt;br /&gt;
The above sets the parameters for a Humidity device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*HUM = Humidity: 45%&amp;lt;br&amp;gt;&lt;br /&gt;
*HUM_STAT = Humidity_status&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Humidity_status can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*0=Normal&amp;lt;br&amp;gt;&lt;br /&gt;
*1=Comfortable&amp;lt;br&amp;gt;&lt;br /&gt;
*2=Dry&amp;lt;br&amp;gt;&lt;br /&gt;
*3=Wet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Barometer==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=BAR;BAR_FOR&lt;br /&gt;
&lt;br /&gt;
The above sets the parameters for a Barometer device from hardware type &#039;General&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*BAR = Barometric pressure&amp;lt;br&amp;gt;&lt;br /&gt;
*BAR_FOR = Barometer forecast&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Barometer forecast can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
0 = Stable &amp;lt;br&amp;gt;&lt;br /&gt;
1 = Sunny&amp;lt;br&amp;gt;&lt;br /&gt;
2 = Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
3 = Unstable&amp;lt;br&amp;gt;&lt;br /&gt;
4 = Thunderstorm&amp;lt;br&amp;gt;&lt;br /&gt;
5 = Unknown&amp;lt;br&amp;gt;&lt;br /&gt;
6 = Cloudy/Rain&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast of other device types can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
0 = Heavy Snow&amp;lt;br&amp;gt;&lt;br /&gt;
1 = Snow&amp;lt;br&amp;gt;&lt;br /&gt;
2 = Heavy Rain&amp;lt;br&amp;gt;&lt;br /&gt;
3 = Rain&amp;lt;br&amp;gt;&lt;br /&gt;
4 = Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
5 = Some Clouds&amp;lt;br&amp;gt;&lt;br /&gt;
6 = Sunny&amp;lt;br&amp;gt;&lt;br /&gt;
7 = Unknown&amp;lt;br&amp;gt;&lt;br /&gt;
8 = Unstable&amp;lt;br&amp;gt;&lt;br /&gt;
9 = Stable&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature/humidity==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;HUM;HUM_STAT&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*TEMP = Temperature&amp;lt;br&amp;gt;&lt;br /&gt;
*HUM = Humidity (0-100 %)&amp;lt;br&amp;gt;&lt;br /&gt;
*HUM_STAT = Humidity status&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
HUM_STAT can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*0=Normal&amp;lt;br&amp;gt;&lt;br /&gt;
*1=Comfortable&amp;lt;br&amp;gt;&lt;br /&gt;
*2=Dry&amp;lt;br&amp;gt;&lt;br /&gt;
*3=Wet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature/humidity/barometer==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;HUM;HUM_STAT;BAR;BAR_FOR&lt;br /&gt;
&lt;br /&gt;
The above sets the parameters for a Temp+Humidity+Barometer device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*TEMP = Temperature&amp;lt;br&amp;gt;&lt;br /&gt;
*HUM = Humidity&amp;lt;br&amp;gt;&lt;br /&gt;
*HUM_STAT = Humidity status&amp;lt;br&amp;gt;&lt;br /&gt;
*BAR = Barometric pressure&amp;lt;br&amp;gt;&lt;br /&gt;
*BAR_FOR = Barometer forecast&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
HUM_STAT can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*0=Normal&amp;lt;br&amp;gt;&lt;br /&gt;
*1=Comfortable&amp;lt;br&amp;gt;&lt;br /&gt;
*2=Dry&amp;lt;br&amp;gt;&lt;br /&gt;
*3=Wet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Barometer forecast of device type &amp;quot;General&amp;quot; (Virtual) can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0 = No Info &amp;lt;br&amp;gt;&lt;br /&gt;
1 = Sunny&amp;lt;br&amp;gt;&lt;br /&gt;
2 = Partly Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
3 = Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
4 = Rain&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature/barometer==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;BAR;BAR_FOR;ALTITUDE&lt;br /&gt;
&lt;br /&gt;
The above sets the parameters for a Temp+Humidity+Barometer device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*TEMP = Temperature&amp;lt;br&amp;gt;&lt;br /&gt;
*BAR = Barometric pressure&amp;lt;br&amp;gt;&lt;br /&gt;
*BAR_FOR = Barometer forecast&amp;lt;br&amp;gt;&lt;br /&gt;
*ALTITUDE= Optional. Not used at the moment, can be 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Barometer forecast can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
0 = Stable &amp;lt;br&amp;gt;&lt;br /&gt;
1 = Sunny&amp;lt;br&amp;gt;&lt;br /&gt;
2 = Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
3 = Unstable&amp;lt;br&amp;gt;&lt;br /&gt;
4 = Thunderstorm&amp;lt;br&amp;gt;&lt;br /&gt;
5 = Unknown&amp;lt;br&amp;gt;&lt;br /&gt;
6 = Cloudy/Rain&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast of other device types can be one of:&amp;lt;br&amp;gt;&lt;br /&gt;
0 = Heavy Snow&amp;lt;br&amp;gt;&lt;br /&gt;
1 = Snow&amp;lt;br&amp;gt;&lt;br /&gt;
2 = Heavy Rain&amp;lt;br&amp;gt;&lt;br /&gt;
3 = Rain&amp;lt;br&amp;gt;&lt;br /&gt;
4 = Cloudy&amp;lt;br&amp;gt;&lt;br /&gt;
5 = Some Clouds&amp;lt;br&amp;gt;&lt;br /&gt;
6 = Sunny&amp;lt;br&amp;gt;&lt;br /&gt;
7 = Unknown&amp;lt;br&amp;gt;&lt;br /&gt;
8 = Unstable&amp;lt;br&amp;gt;&lt;br /&gt;
9 = Stable&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Update Device&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rain==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=RAINRATE;RAINCOUNTER&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*RAINRATE = amount of rain in last hour in [mm x 100]&lt;br /&gt;
*RAINCOUNTER = continues counter of fallen Rain in [mm]&lt;br /&gt;
&lt;br /&gt;
==Soil Moisture==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=MOISTURE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*MOISTURE = moisture content in cb 0-200 where:&lt;br /&gt;
&lt;br /&gt;
00 - 09 = saturated,&lt;br /&gt;
10 - 19 = adequately wet,&lt;br /&gt;
20 - 59 = irrigation advice,&lt;br /&gt;
60 - 99 = irrigation,&lt;br /&gt;
100-200 = Dangerously dry,&lt;br /&gt;
&lt;br /&gt;
==Wind==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=WB;WD;WS;WG;22;24&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*WB = Wind bearing (0-359)&amp;lt;br&amp;gt;&lt;br /&gt;
*WD = Wind direction (S, SW, NNW, etc.)&amp;lt;br&amp;gt;&lt;br /&gt;
*WS = 10 * Wind speed [m/s]&amp;lt;br&amp;gt;&lt;br /&gt;
*WG = 10 * Gust [m/s]&amp;lt;br&amp;gt;&lt;br /&gt;
*22 = Temperature&amp;lt;br&amp;gt;&lt;br /&gt;
*24 = Temperature Windchill&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UV==&lt;br /&gt;
&lt;br /&gt;
  /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=UV;TEMP&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*UV = Float (example: 2.1) with current UV reading.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*TEMP = temperature (only for UV subtype TFA (3), else specify 0)&lt;br /&gt;
&lt;br /&gt;
Don&#039;t loose the &amp;quot;;0&amp;quot; at the end - without it database may corrupt.&lt;br /&gt;
&lt;br /&gt;
If no temp is in use, specify 0 as temperature&lt;br /&gt;
&lt;br /&gt;
==Counter==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;svalue=COUNTER&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (this number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*COUNTER = Integer of the overall total counter (Energy, Volume, Custom).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When there is a counter created, there is a possibility to change the units by clicking on &amp;quot;Change&amp;quot; at the utility tab.&lt;br /&gt;
&lt;br /&gt;
*Energy (reports kWh), give COUNTER value in Wh, integer&amp;lt;br&amp;gt;&lt;br /&gt;
*Energy Generated (reports kWh). give COUNTER value in Wh, integer&amp;lt;br&amp;gt;&lt;br /&gt;
*Gas (reports m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;) , give COUNTER value in liter (1000 liter = 1 m³), integer&amp;lt;br&amp;gt;&lt;br /&gt;
*Water (reports m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;), give COUNTER value in liter (1000 liter = 1 m³), integer&amp;lt;br&amp;gt;&lt;br /&gt;
*Counter (no unit)&amp;lt;br&amp;gt;&lt;br /&gt;
*Time (min?), seems to be obsolete, use Counter instead and use the time units as desired (eg Sec, min, hrs)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The counter will be treated with the divider which is defined in the parameters in the application settings (menu setup-settings, tab counters). For example if the counter is set to &amp;quot;Water&amp;quot; and the value is passed as liters, the divider must set to 1000 (as the unit is m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;).&lt;br /&gt;
The device displays 2 values:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The status is the overall total volume (or counter).&amp;lt;br&amp;gt;&lt;br /&gt;
*The volume (or counter) of the day (in the top right corner).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The today&#039;s volume (or counter) is calculated from the total volume (or counter).&lt;br /&gt;
&lt;br /&gt;
==Counter Incremental==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=INCREMENT&lt;br /&gt;
&lt;br /&gt;
INCREMENT = Integer of the increment of the counter. For Counters the standard counter dividers apply (menu setup - settings - tab counters)&lt;br /&gt;
&lt;br /&gt;
will increment the counter value by 1. To reset an incremental counter, set the svalue to a &#039;&#039;negative&#039;&#039; integer equal to the current total of the counter.&lt;br /&gt;
&lt;br /&gt;
==Electricity (instant and counter)==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=POWER;ENERGY&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*POWER = current power (W)&lt;br /&gt;
*ENERGY = Integer, total cumulative energy in Watt-hours (Wh) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Energy Read type (use edit button to change): Default: From Device. If the device is not able to send the ENERGY counter values you choose &amp;quot;Energy read&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Computed&amp;quot;. This will ignore ENERGY counter values and Domoticz will calculate the Energy (kWh) internally based on the (previous/current) POWER (Watt) values. By design this is less accurate then using the ENERGY counter when using them &amp;quot;from Device&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Domoticz will calculate the today values based on the delta&#039;s in the total cumulative energy of today.&lt;br /&gt;
&lt;br /&gt;
For Counters the standard counter dividers apply (menu setup - settings - tab counters)&lt;br /&gt;
&lt;br /&gt;
Note: This device will show in Domoticz as type &amp;quot;General, kWh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Managed counter==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=COUNTER;USAGE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*COUNTER = Integer, total cumulative counter energy (Wh, can be set to -1 if unknown or unused, in that case it won&#039;t show on dashboard or in logs)&lt;br /&gt;
*USAGE = energy usage in Watt-hours (Wh).&lt;br /&gt;
&lt;br /&gt;
Managed counter will not transfer automatically every day data from device status to history log, it&#039;s up to an external script or plugin to insert data in history log database (useful to show non realtime consumption of energy provider that put energy information &amp;quot;in the cloud&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
For Counters the standard counter dividers apply (menu setup - settings - tab counters)&lt;br /&gt;
&lt;br /&gt;
To insert data in history log:&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=COUNTER;USAGE;DATE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*COUNTER = total cumulative counter energy (Wh, can be set to -1 if unknown or unused, in that case it won&#039;t show on dashboard or in logs)&lt;br /&gt;
*USAGE = energy usage in Watt-hours (Wh)&lt;br /&gt;
*DATE = date with %Y-%m-%d format (for instance 2019-09-24) to put data in last week/month/year history log, or &amp;quot;%Y-%m-%d %H:%M:%S&amp;quot; format (for instance 2019-10-03 14:00:00) to put data in last days history log&lt;br /&gt;
&lt;br /&gt;
==Electricity Current/Ampere 3 Phase==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=Ampere_1;=Ampere_2;=Ampere_3;&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*Ampere_1 = Ampere value Phase 1&lt;br /&gt;
*Ampere_2 = Ampere value Phase 2&lt;br /&gt;
*Ampere_3 = Ampere value Phase 3&lt;br /&gt;
&lt;br /&gt;
==Electricity P1 smart meter==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*USAGE1= integer, total cumulative energy usage meter tariff 1 in Wh.&lt;br /&gt;
*USAGE2= integer, total cumulative energy usage meter tariff 2 in Wh.&lt;br /&gt;
*RETURN1= integer, total cumulative energy return meter tariff 1 in Wh.&lt;br /&gt;
*RETURN2= integer, total cumulative energy return meter tariff 2 in Wh.&lt;br /&gt;
*CONS= actual usage power (Watt)&lt;br /&gt;
*PROD= actual return power (Watt)&lt;br /&gt;
&lt;br /&gt;
USAGE and RETURN are total cumulative counters (they should only count up).&amp;lt;br&amp;gt;&lt;br /&gt;
For USAGE and RETURN supply the data in total Wh with no decimal point.&amp;lt;br&amp;gt;&lt;br /&gt;
(So if your meter displays f.i. USAGE1= 523,66 KWh you need to send 523660)&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz will calculate the today values based on the delta&#039;s in the total cumulative energy of today.&lt;br /&gt;
&lt;br /&gt;
For Counters the standard counter dividers apply (menu setup - settings - tab counters)&lt;br /&gt;
&lt;br /&gt;
==Air quality==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=PPM&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*PPM = CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;-concentration&lt;br /&gt;
&lt;br /&gt;
Calculated status from PPM value:&lt;br /&gt;
&lt;br /&gt;
airquality &amp;lt; 700 status text: &amp;quot;Excellent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
airquality &amp;lt; 900 status text: &amp;quot;Good&amp;quot;&lt;br /&gt;
&lt;br /&gt;
airquality &amp;lt; 1100 status text:&amp;quot;Fair&amp;quot;&lt;br /&gt;
&lt;br /&gt;
airquality &amp;lt; 1600 status text: &amp;quot;Mediocre&amp;quot;&lt;br /&gt;
&lt;br /&gt;
airquality &amp;gt;= 1600 status text: &amp;quot;Bad&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Pressure==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=BAR&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*BAR = Pressure in Bar&lt;br /&gt;
&lt;br /&gt;
Create sensor under Hardware &amp;gt; Dummy &amp;gt; Create virtual sensor&lt;br /&gt;
&lt;br /&gt;
==Percentage==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=PERCENTAGE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (this number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*PERCENTAGE = Percentage&lt;br /&gt;
&lt;br /&gt;
==Visibility==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=VISIBILITY&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (this number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*VISIBILITY = in KM&lt;br /&gt;
&lt;br /&gt;
==Gas==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=USAGE&lt;br /&gt;
&lt;br /&gt;
*USAGE= Integer, Gas usage in liter (1000 liter = 1 m³)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if your gas meter shows f.i. 145,332 m³ you should send 145332.&amp;lt;br&amp;gt;&lt;br /&gt;
The USAGE is the total usage in liters from start, not f.i. the daily usage.&lt;br /&gt;
For Counters the divider is used from menu setup - settings, tab Counters&lt;br /&gt;
&lt;br /&gt;
==Lux==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;svalue=VALUE&lt;br /&gt;
&lt;br /&gt;
*IDX = device ID of Lux device&lt;br /&gt;
*VALUE = value of luminosity in Lux (INTEGER/FLOAT)&lt;br /&gt;
&lt;br /&gt;
==Voltage==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=VOLTAGE&lt;br /&gt;
&lt;br /&gt;
*IDX = device ID of Voltage device&lt;br /&gt;
*VALUE = value of voltage sensor in Volts&lt;br /&gt;
&lt;br /&gt;
Create sensor under Hardware &amp;gt; Dummy &amp;gt; Create virtual sensor&lt;br /&gt;
&lt;br /&gt;
==Text sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEXT&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*TEXT = Text you want to display&lt;br /&gt;
&lt;br /&gt;
==Alert sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=LEVEL&amp;amp;svalue=TEXT&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*Level = (0=gray, 1=green, 2=yellow, 3=orange, 4=red)&lt;br /&gt;
*TEXT = Text you want to display&lt;br /&gt;
&lt;br /&gt;
==Distance sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=DISTANCE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*DISTANCE = distance in cm or inches, can be in decimals. For example 12.6&lt;br /&gt;
&lt;br /&gt;
==Selector Switch==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=IDX&amp;amp;switchcmd=Set%20Level&amp;amp;level=LEVEL&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*LEVEL = level of your selector (This number can be found in the edit selectors page, in the column &amp;quot;Level&amp;quot;, 0 = Off)&lt;br /&gt;
&lt;br /&gt;
==Custom Sensor==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=VALUE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*VALUE = Value (like 12.345)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Opentherm Gateway Custom command==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=sendopenthermcommand&amp;amp;idx=IDX&amp;amp;cmnd=COMMAND&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your hardware Opentherm device (This number can be found in the ID column in menu Setup-Hardware)&lt;br /&gt;
*COMMAND = The actual custom OTGW command like TC=20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Note on counters==&lt;br /&gt;
Usually, counters are updated daily to feed week/month/year history log views. Starting version 4.11774, if you want to disable that behavior to control everything from an external script or a plugin (already the case for managed counter), you can set the &amp;quot;DisableLogAutoUpdate&amp;quot; device option to &amp;quot;true&amp;quot;, for instance in a Python plugin:&lt;br /&gt;
 Domoticz.Device(Name=&amp;quot;MyCounter&amp;quot;, Unit=1, Type=0xfa, Subtype=0x01, Options={&amp;quot;DisableLogAutoUpdate&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;true&amp;quot;).Create()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Starting version 4.11774, you can too directly insert data in in history log. Set the &amp;quot;AddDBLogEntry&amp;quot; device option to &amp;quot;true&amp;quot;, for instance in a Python plugin:&lt;br /&gt;
 Domoticz.Device(Name=&amp;quot;MyCounter&amp;quot;, Unit=1, Type=0xfa, Subtype=0x01, Options={&amp;quot;AddDBLogEntry&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;true&amp;quot;).Create()&lt;br /&gt;
With a json the parameter AddDBLogEntry:true should first base64 encoded&lt;br /&gt;
 /json.htm?type=setused&amp;amp;idx=DEVICE_IDX&amp;amp;name=SENSORNAME&amp;amp;switchtype=SUBTYPE_VALUE&amp;amp;used=true&amp;amp;options=CODE&lt;br /&gt;
To set AddDBLogEntry:true, you must call: &lt;br /&gt;
 /json.htm?type=setused&amp;amp;idx=DEVICE_IDX&amp;amp;name=SENSORNAME&amp;amp;switchtype=SUBTYPE_VALUE&amp;amp;used=true&amp;amp;options=QWRkREJMb2dFbnRyeTp0cnVl&lt;br /&gt;
&lt;br /&gt;
AddDBLogEntry can be combined with other entries in the options field if separated by a semicolon for example&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;to set: &lt;br /&gt;
 ValueQuantity:2;AddDBLogEntry:true&lt;br /&gt;
&lt;br /&gt;
You call:&lt;br /&gt;
 /json.htm?type=setused&amp;amp;idx=DEVICE_IDX&amp;amp;name=SENSORNAME&amp;amp;switchtype=SUBTYPE_VALUE&amp;amp;used=true&amp;amp;options=VmFsdWVRdWFudGl0eToyO0FkZERCTG9nRW50cnk6dHJ1ZQ==&lt;br /&gt;
Also please note if the device is edited using the domoticz device screen then this AddDBLogEntry disappears and needs to be added again.&lt;br /&gt;
&lt;br /&gt;
Then, depending on counters, you can insert values in history log. For most counters:&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=COUNTER;USAGE;DATE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*COUNTER = total cumulative counter energy (Wh)&lt;br /&gt;
*USAGE = energy usage in Watt-hours (Wh)&lt;br /&gt;
*DATE = date with %Y-%m-%d format (for instance 2019-09-24) to put data in last week/month/year history log, or &amp;quot;%Y-%m-%d %H:%M:%S&amp;quot; format (for instance 2019-10-03 14:00:00) to put data in last days history log&lt;br /&gt;
&lt;br /&gt;
Note: COUNTER and USAGE should be positive. Any negative value will result in 0 instead&lt;br /&gt;
&lt;br /&gt;
For multi meters (P1 Smart Meter, CM113, Electrisave and CM180i):&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD;DATE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*USAGE1= energy usage meter tariff 1, This is an incrementing counter&lt;br /&gt;
*USAGE2= energy usage meter tariff 2, This is an incrementing counter&lt;br /&gt;
*RETURN1= energy return meter tariff 1, This is an incrementing counter&lt;br /&gt;
*RETURN2= energy return meter tariff 2, This is an incrementing counter&lt;br /&gt;
*CONS= actual usage power (Watt)&lt;br /&gt;
*PROD= actual return power (Watt)&lt;br /&gt;
*DATE = date with %Y-%m-%d format (for instance 2019-09-24) to put data in last week/month/year history log, or &amp;quot;%Y-%m-%d %H:%M:%S&amp;quot; format (for instance 2019-10-03 14:00:00) to put data in last days history log&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD;COUNTER1;COUNTER2;COUNTER3;COUNTER4;DATE&lt;br /&gt;
as previously, plus absolute counter values&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Additional parameters (signal level &amp;amp; battery level)==&lt;br /&gt;
There are two additional and optional parameters for the above commands, to specify the &#039;&#039;&#039;signal level&#039;&#039;&#039; (default 12) and the &#039;&#039;&#039;battery level&#039;&#039;&#039; (default 255)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  /json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;nvalue=&amp;lt;numeric value&amp;gt;&amp;amp;svalue=&amp;lt;string value&amp;gt;&amp;amp;rssi=&amp;lt;numeric value&amp;gt;&amp;amp;battery=&amp;lt;numeric value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
battery level 255 = no battery device, else 0-100&amp;lt;br&amp;gt;&lt;br /&gt;
example: &#039;&#039;&#039;&amp;amp;rssi=10&amp;amp;battery=89&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Security=&lt;br /&gt;
&lt;br /&gt;
==Get Password==&lt;br /&gt;
to be able to set the security status, the (encoded) password is required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getsettings&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;AcceptNewHardware&amp;quot;: 0,&lt;br /&gt;
&amp;quot;ActiveTimerPlan&amp;quot;: 2,&lt;br /&gt;
&amp;quot;AllowWidgetOrdering&amp;quot;: 1,&lt;br /&gt;
&amp;quot;AuthenticationMethod&amp;quot;: 1,&lt;br /&gt;
&amp;quot;BatterLowLevel&amp;quot;: 0,&lt;br /&gt;
&amp;quot;CM113DisplayType&amp;quot;: 0,&lt;br /&gt;
.....&lt;br /&gt;
&amp;quot;SecPassword&amp;quot;: &amp;quot;bfa2bea3x&amp;quot;,&lt;br /&gt;
....&lt;br /&gt;
&amp;quot;WindUnit&amp;quot;: 4,&lt;br /&gt;
&amp;quot;cloudenabled&amp;quot;: true,&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;settings&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
get the value from key &amp;quot;SecPassword&amp;quot; ;for the purpose of this wiki we assume the value read is &amp;quot;bfa2bea3x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Get security state==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getsecstatus&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;secondelay&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;secstatus&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;GetSecStatus&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt; &lt;br /&gt;
where secstatus is&lt;br /&gt;
 0 = Disarmed&lt;br /&gt;
 1 = Arm Home&lt;br /&gt;
 2 = Arm Away&lt;br /&gt;
 3 = Unknown&lt;br /&gt;
 &lt;br /&gt;
==Set security state==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=setsecstatus&amp;amp;secstatus=&amp;lt;status&amp;gt;&amp;amp;seccode=bfa2bea3x&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot;: &amp;quot;SetSecStatus&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Smoke Detection=&lt;br /&gt;
==Activate==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;lt;IDX&amp;gt;&amp;amp;switchcmd=On&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot;: &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Deactivate==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;lt;IDX&amp;gt;&amp;amp;switchcmd=Off&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot;: &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
==Reset==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=resetsecuritystatus&amp;amp;idx=&amp;lt;IDX&amp;gt;&amp;amp;switchcmd=Off&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot;: &amp;quot;ResetSecurityStatus&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=resetsecuritystatus&amp;amp;idx=3456&amp;amp;switchcmd=Normal&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SwitchLight&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=User variables=&lt;br /&gt;
&lt;br /&gt;
==Add a new variable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*USERVARIABLENAME with the name of the variable&lt;br /&gt;
*USERVARIABLETYPE is a digit (0,1,2,3,4) or a string (Integer, Float, String, Date, Time)&lt;br /&gt;
&lt;br /&gt;
 0 = Integer, e.g. -1, 1, 0, 2, 10 &lt;br /&gt;
 1 = Float, e.g. -1.1, 1.2, 3.1&lt;br /&gt;
 2 = String&lt;br /&gt;
 3 = Date in format DD/MM/YYYY&lt;br /&gt;
 4 = Time in 24 hr format HH:MM&lt;br /&gt;
&lt;br /&gt;
*USERVARIABLEVALUE with the value&lt;br /&gt;
&lt;br /&gt;
All formats are checked by the api, when the variable does not match the required format it is not stored.&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=adduservariable&amp;amp;vname=USERVARIABLENAME&amp;amp;vtype=USERVARIABLETYPE&amp;amp;vvalue=USERVARIABLEVALUE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;AddUserVariable&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Update an existing variable==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember to change:&lt;br /&gt;
&lt;br /&gt;
*USERVARIABLENAME with the name of your variable&lt;br /&gt;
*USERVARIABLETYPE according to the table from [[Domoticz_API/JSON_URL&#039;s#Add_a_new_variable|&amp;quot;Add a new variable&amp;quot;]]&lt;br /&gt;
*USERVARIABLEVALUE with the new value&lt;br /&gt;
&lt;br /&gt;
Note: events will only be triggered when the variabletype and variablename are not changed by the update command.&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=updateuservariable&amp;amp;vname=USERVARIABLENAME&amp;amp;vtype=USERVARIABLETYPE&amp;amp;vvalue=USERVARIABLEVALUE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;UpdateUserVariable&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List all variables==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getuservariables&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;LastUpdate&amp;quot;: &amp;quot;2020-01-13 09:04:17&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;setup-test&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;Value&amp;quot;: &amp;quot;Hi&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;LastUpdate&amp;quot;: &amp;quot;2020-02-17 16:48:03&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;presence-test&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;Value&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
....&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;LastUpdate&amp;quot;: &amp;quot;2021-03-02 21:10:54&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;UV_Night&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;Value&amp;quot;: &amp;quot;21:11&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;44&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;GetUserVariables&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List one variable== &lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getuservariable&amp;amp;idx=IDX&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your variable (This number can be found using the &amp;quot;List all variables&amp;quot; call above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;LastUpdate&amp;quot;: &amp;quot;2021-03-02 21:10:54&amp;quot;,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;UV_Night&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;Value&amp;quot;: &amp;quot;21:11&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;44&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;GetUserVariable&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a variable==&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your variable (This number can be found using the &amp;quot;List all variables&amp;quot; call above)&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deleteuservariable&amp;amp;idx=IDX&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;DeleteUserVariable&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=trigger dzVents script using customEvent &amp;lt;sup&amp;gt;dzVents 3.0.0&amp;lt;/sup&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=customevent&amp;amp;event=MyEvent&amp;amp;data=MyData&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Custom Event&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Room Plans=&lt;br /&gt;
&lt;br /&gt;
==List all rooms==&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getplans&amp;amp;order=name&amp;amp;used=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Devices&amp;quot;: 6,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;Google Calendars&amp;quot;,&lt;br /&gt;
			&amp;quot;Order&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Devices&amp;quot;: 2,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;Private&amp;quot;,&lt;br /&gt;
			&amp;quot;Order&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;3&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Devices&amp;quot;: 1,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;EVOHome&amp;quot;,&lt;br /&gt;
			&amp;quot;Order&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;4&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Devices&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Name&amp;quot;: &amp;quot;testPlan&amp;quot;,&lt;br /&gt;
			&amp;quot;Order&amp;quot;: &amp;quot;5&amp;quot;,&lt;br /&gt;
			&amp;quot;idx&amp;quot;: &amp;quot;5&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Plans&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List all devices in a room==&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your room&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getplandevices&amp;amp;idx=IDX&lt;br /&gt;
Show idx, name of the device like:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;result&amp;quot;: [&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;DevSceneRowID&amp;quot;: &amp;quot;492&amp;quot;,&lt;br /&gt;
&amp;quot;Name&amp;quot;: &amp;quot;device name&amp;quot;,&lt;br /&gt;
&amp;quot;devidx&amp;quot;: &amp;quot;492&amp;quot;,&lt;br /&gt;
&amp;quot;idx&amp;quot;: &amp;quot;9&amp;quot;,&lt;br /&gt;
&amp;quot;order&amp;quot;: &amp;quot;9&amp;quot;,&lt;br /&gt;
&amp;quot;type&amp;quot;: 0&lt;br /&gt;
}&lt;br /&gt;
],&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;GetPlanDevices&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=devices&amp;amp;plan=IDX&lt;br /&gt;
show details of the devices like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;ActTime&amp;quot;: 1569909986,&lt;br /&gt;
&amp;quot;AstrTwilightEnd&amp;quot;: &amp;quot;21:14&amp;quot;,&lt;br /&gt;
&amp;quot;AstrTwilightStart&amp;quot;: &amp;quot;05:50&amp;quot;,&lt;br /&gt;
&amp;quot;CivTwilightEnd&amp;quot;: &amp;quot;19:54&amp;quot;,&lt;br /&gt;
&amp;quot;CivTwilightStart&amp;quot;: &amp;quot;07:09&amp;quot;,&lt;br /&gt;
&amp;quot;DayLength&amp;quot;: &amp;quot;11:39&amp;quot;,&lt;br /&gt;
&amp;quot;NautTwilightEnd&amp;quot;: &amp;quot;20:34&amp;quot;,&lt;br /&gt;
&amp;quot;NautTwilightStart&amp;quot;: &amp;quot;06:30&amp;quot;,&lt;br /&gt;
&amp;quot;ServerTime&amp;quot;: &amp;quot;2019-10-01 08:06:26&amp;quot;,&lt;br /&gt;
&amp;quot;SunAtSouth&amp;quot;: &amp;quot;13:32&amp;quot;,&lt;br /&gt;
&amp;quot;Sunrise&amp;quot;: &amp;quot;07:42&amp;quot;,&lt;br /&gt;
&amp;quot;Sunset&amp;quot;: &amp;quot;19:21&amp;quot;,&lt;br /&gt;
&amp;quot;app_version&amp;quot;: &amp;quot;4.11337&amp;quot;,&lt;br /&gt;
&amp;quot;result&amp;quot;: [&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;AddjMulti&amp;quot;: 1,&lt;br /&gt;
&amp;quot;AddjMulti2&amp;quot;: 1,&lt;br /&gt;
&amp;quot;AddjValue&amp;quot;: 0,&lt;br /&gt;
&amp;quot;AddjValue2&amp;quot;: 0,&lt;br /&gt;
&amp;quot;BatteryLevel&amp;quot;: 255,&lt;br /&gt;
&amp;quot;CustomImage&amp;quot;: 0,&lt;br /&gt;
&amp;quot;Data&amp;quot;: &amp;quot;19.5 C, (13.5 C), PermanentOverride&amp;quot;,&lt;br /&gt;
&amp;quot;Description&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;Favorite&amp;quot;: 1,&lt;br /&gt;
&amp;quot;HardwareID&amp;quot;: 30,&lt;br /&gt;
&amp;quot;HardwareName&amp;quot;: &amp;quot;Evohome&amp;quot;,&lt;br /&gt;
&amp;quot;HardwareType&amp;quot;: &amp;quot;Evohome via Web API&amp;quot;,&lt;br /&gt;
&amp;quot;HardwareTypeVal&amp;quot;: 75,&lt;br /&gt;
&amp;quot;HaveTimeout&amp;quot;: false,&lt;br /&gt;
&amp;quot;ID&amp;quot;: &amp;quot;1168736&amp;quot;,&lt;br /&gt;
&amp;quot;LastUpdate&amp;quot;: &amp;quot;2019-10-01 08:05:35&amp;quot;,&lt;br /&gt;
&amp;quot;Name&amp;quot;: &amp;quot;Device name&amp;quot;,&lt;br /&gt;
&amp;quot;Notifications&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
&amp;quot;PlanID&amp;quot;: &amp;quot;4&amp;quot;,&lt;br /&gt;
&amp;quot;PlanIDs&amp;quot;: [&lt;br /&gt;
4&lt;br /&gt;
],&lt;br /&gt;
&amp;quot;Protected&amp;quot;: false,&lt;br /&gt;
&amp;quot;SetPoint&amp;quot;: 13.5,&lt;br /&gt;
&amp;quot;ShowNotifications&amp;quot;: true,&lt;br /&gt;
&amp;quot;SignalLevel&amp;quot;: 10,&lt;br /&gt;
&amp;quot;Status&amp;quot;: &amp;quot;PermanentOverride&amp;quot;,&lt;br /&gt;
&amp;quot;SubType&amp;quot;: &amp;quot;Zone&amp;quot;,&lt;br /&gt;
&amp;quot;Temp&amp;quot;: 19.5,&lt;br /&gt;
&amp;quot;Timers&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
&amp;quot;Type&amp;quot;: &amp;quot;Heating&amp;quot;,&lt;br /&gt;
&amp;quot;TypeImg&amp;quot;: &amp;quot;override_mini&amp;quot;,&lt;br /&gt;
&amp;quot;Unit&amp;quot;: 7,&lt;br /&gt;
&amp;quot;Used&amp;quot;: 1,&lt;br /&gt;
&amp;quot;XOffset&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
&amp;quot;YOffset&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
&amp;quot;idx&amp;quot;: &amp;quot;492&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
],&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;Devices&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Timer Plans=&lt;br /&gt;
&lt;br /&gt;
==List all Timerplans==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=gettimerplans&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;result&amp;quot;: [&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Active&amp;quot;: false,&lt;br /&gt;
&amp;quot;Name&amp;quot;: &amp;quot;Default&amp;quot;,&lt;br /&gt;
&amp;quot;idx&amp;quot;: 0&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Active&amp;quot;: true,&lt;br /&gt;
&amp;quot;Name&amp;quot;: &amp;quot;Holiday&amp;quot;,&lt;br /&gt;
&amp;quot;idx&amp;quot;: 1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;Active&amp;quot;: false,&lt;br /&gt;
&amp;quot;Name&amp;quot;: &amp;quot;Day off (including weekend)&amp;quot;,&lt;br /&gt;
&amp;quot;idx&amp;quot;: 2&lt;br /&gt;
}&lt;br /&gt;
],&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;GetTimerPlans&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add Timerplan==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=addtimerplan&amp;amp;name=newTimerplan&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;AddTimerPlan&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Change Timerplan name==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=updatetimerplan&amp;amp;idx=3&amp;amp;name=newname&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;UpdateTimerPlan&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Duplicate Timerplan==&lt;br /&gt;
&lt;br /&gt;
This will copy all existing timers from timerplan with idx 3 to a new plan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=duplicatetimerplan&amp;amp;idx=3&amp;amp;name=duplicatename&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;DuplicateTimerPlan&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make Timerplan active==&lt;br /&gt;
&lt;br /&gt;
This will make the timerplan with idx 2 the active one&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setactivetimerplan&amp;amp;ActiveTimerPlan=2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;SetActiveTimerPlan&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=History=&lt;br /&gt;
&lt;br /&gt;
==Switch devices==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getlightlog&amp;amp;idx=IDX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Delete===&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=clearlightlog&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text devices==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=gettextlog&amp;amp;idx=IDX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Delete===&lt;br /&gt;
/json.htm?type=command&amp;amp;param=clearlightlog&amp;amp;idx=&amp;lt;idx&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature==&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=graph&amp;amp;sensor=temp&amp;amp;idx=IDX&amp;amp;range=[day|month|year]&amp;amp;actyear=YYYY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Custom sensor==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Totals by period&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=graph&amp;amp;sensor=Percentage&amp;amp;idx=IDX&amp;amp;range=day&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{{&lt;br /&gt;
	&amp;quot;result&amp;quot; : &lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-02-04 16:40&amp;quot;,&lt;br /&gt;
			&amp;quot;v&amp;quot; : &amp;quot;308.6&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-02-04 16:45&amp;quot;,&lt;br /&gt;
			&amp;quot;v&amp;quot; : &amp;quot;308.6&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Graph Percentage day&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=graph&amp;amp;sensor=Percentage&amp;amp;idx=IDX&amp;amp;range=[day|month|year|year&amp;amp;actyear=YYYY]&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot; : &lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-01-18&amp;quot;,&lt;br /&gt;
			&amp;quot;v_avg&amp;quot; : &amp;quot;308.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_max&amp;quot; : &amp;quot;309.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_min&amp;quot; : &amp;quot;307.6&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-01-19&amp;quot;,&lt;br /&gt;
			&amp;quot;v_avg&amp;quot; : &amp;quot;308.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_max&amp;quot; : &amp;quot;310.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_min&amp;quot; : &amp;quot;306.6&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-01-21&amp;quot;,&lt;br /&gt;
			&amp;quot;v_avg&amp;quot; : &amp;quot;308.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_max&amp;quot; : &amp;quot;310.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_min&amp;quot; : &amp;quot;306.6&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;d&amp;quot; : &amp;quot;2021-02-18&amp;quot;,&lt;br /&gt;
			&amp;quot;v_avg&amp;quot; : &amp;quot;308.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_max&amp;quot; : &amp;quot;310.6&amp;quot;,&lt;br /&gt;
			&amp;quot;v_min&amp;quot; : &amp;quot;306.6&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Graph Percentage &amp;lt;...&amp;gt;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Energy, Gas, Water==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instantaneous consumption&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=graph&amp;amp;sensor=counter&amp;amp;idx=IDX&amp;amp;range=day&amp;amp;method=1&lt;br /&gt;
&lt;br /&gt;
Totals by period&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=graph&amp;amp;sensor=counter&amp;amp;idx=IDX&amp;amp;range=[day|month|year|year&amp;amp;actyear=YYYY|YYYY-MM-DDTYYYY-MM-DD]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Only for counters it is possible to  specify a date range for long history data (not for short log data):&lt;br /&gt;
 &amp;amp;range=YYYY-MM-DDTYYYY-MM-DD&lt;br /&gt;
Notice the &amp;quot;T&amp;quot; between the dates in range.&lt;br /&gt;
&lt;br /&gt;
==Deleting History log entries== &lt;br /&gt;
&lt;br /&gt;
===delete a single data point or day===&lt;br /&gt;
 &lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletedatapoint&amp;amp;idx=IDX&amp;amp;date=DATE&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*DATE = date in %Y-%m-%d format (for instance 2021-02-26) will delete history data of that particular day (one entry from long term history and max 120 entries from short term history log)&lt;br /&gt;
*DATE = date in &amp;quot;%Y-%m-%d%20%H:%M:%S&amp;quot; format (for instance 2019-10-03%2014:00:00) will delete history data of that particular time (one entry from short term history log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;deletedatapoint&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===delete a date range of data points=== &lt;br /&gt;
 &lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletedaterange&amp;amp;idx=IDX&amp;amp;fromdate=FROMDATE&amp;amp;todate=TODATE  &amp;lt;sup&amp;gt; V2020.2 build &amp;gt;= 13027 &amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*IDX = id of your device (This number can be found in the devices tab in the column &amp;quot;IDX&amp;quot;)&lt;br /&gt;
*FROMDATE = date in %Y-%m-%d or date in &amp;quot;%Y-%m-%d%20%H:%M:%S&amp;quot;format (for instance 2021-02-26 / 2019-10-03%2014:00:00) will delete history data (from short and long history tables) starting with that day / time&lt;br /&gt;
*TODATE = date in %Y-%m-%d or date in &amp;quot;%Y-%m-%d%20%H:%M:%S&amp;quot;format (for instance 2021-02-26 / 2019-10-03%2014:00:00) will delete history data (from short and long history tables) ending with that day / time&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
&amp;quot;title&amp;quot;: &amp;quot;deletedaterange&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Device Timer Schedules=&lt;br /&gt;
==Get all schedules (timers)==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getschedules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
         &amp;quot;Date&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
         &amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
         &amp;quot;DevName&amp;quot; : &amp;quot;Porch Light&amp;quot;,&lt;br /&gt;
         &amp;quot;DeviceRowID&amp;quot; : 52,&lt;br /&gt;
         &amp;quot;Hue&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;IsThermostat&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
         &amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
         &amp;quot;MDay&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;Month&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;Occurence&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;Randomness&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
         &amp;quot;ScheduleDate&amp;quot; : &amp;quot;2016-04-01 20:33:00&amp;quot;,&lt;br /&gt;
         &amp;quot;Time&amp;quot; : &amp;quot;00:20&amp;quot;,&lt;br /&gt;
         &amp;quot;TimerCmd&amp;quot; : 0,&lt;br /&gt;
         &amp;quot;TimerID&amp;quot; : 9,&lt;br /&gt;
         &amp;quot;TimerType&amp;quot; : 4,&lt;br /&gt;
         &amp;quot;TimerTypeStr&amp;quot; : &amp;quot;After Sunset&amp;quot;,&lt;br /&gt;
         &amp;quot;Type&amp;quot; : &amp;quot;Device&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for all Devices==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getschedules&amp;amp;filter=device&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Active&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
			&amp;quot;Color&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;Date&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;Days&amp;quot;: 128,&lt;br /&gt;
			&amp;quot;DevName&amp;quot;: &amp;quot;coffeeSwitch&amp;quot;,&lt;br /&gt;
			&amp;quot;DeviceRowID&amp;quot;: 1014,&lt;br /&gt;
			&amp;quot;IsThermostat&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;Level&amp;quot;: 100,&lt;br /&gt;
			&amp;quot;MDay&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Month&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Occurence&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;Randomness&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;ScheduleDate&amp;quot;: &amp;quot;2021-03-11 06:01:00&amp;quot;,&lt;br /&gt;
			&amp;quot;Time&amp;quot;: &amp;quot;06:01&amp;quot;,&lt;br /&gt;
			&amp;quot;TimerCmd&amp;quot;: 0,&lt;br /&gt;
			&amp;quot;TimerID&amp;quot;: 62,&lt;br /&gt;
			&amp;quot;TimerType&amp;quot;: 2,&lt;br /&gt;
			&amp;quot;TimerTypeStr&amp;quot;: &amp;quot;On Time&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;Device&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Active&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
			&amp;quot;Color&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;Date&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
			&amp;quot;TimerType&amp;quot;: 2,&lt;br /&gt;
			&amp;quot;TimerTypeStr&amp;quot;: &amp;quot;On Time&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot;: &amp;quot;Device&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot;: &amp;quot;Schedules&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for one Device==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=gettimers&amp;amp;idx=timerID&lt;br /&gt;
&lt;br /&gt;
===Type returns===&lt;br /&gt;
&lt;br /&gt;
*0: Before Sunrise&lt;br /&gt;
*1: After Sunrise&lt;br /&gt;
*2: On Time&lt;br /&gt;
*3: Before Sunset&lt;br /&gt;
*4: After Sunset&lt;br /&gt;
*5: Fixed Date/Time&lt;br /&gt;
*6: Odd Day Numbers&lt;br /&gt;
*7: Even Day Numbers&lt;br /&gt;
*8: Odd Week Numbers&lt;br /&gt;
*9: Even Week Numbers&lt;br /&gt;
*10: Monthly&lt;br /&gt;
*11: Monthly (Weekday)&lt;br /&gt;
*12: Yearly&lt;br /&gt;
*13: Yearly (Weekday)&lt;br /&gt;
*14: Before Sun at South&lt;br /&gt;
*15: After Sun at South&lt;br /&gt;
*16: Before Civil Twilight Start&lt;br /&gt;
*17: After Civil Twilight Start&lt;br /&gt;
*18: Before Civil Twilight End&lt;br /&gt;
*19: After Civil Twilight End&lt;br /&gt;
*20: Before Nautical Twilight Start&lt;br /&gt;
*21: After Nautical Twilight Start&lt;br /&gt;
*22: Before Nautical Twilight End&lt;br /&gt;
*23: After Nautical Twilight End&lt;br /&gt;
*24: Before Astronomical Twilight Start&lt;br /&gt;
*25: After Astronomical Twilight Start&lt;br /&gt;
*26: Before Astronomical Twilight End&lt;br /&gt;
*27: After Astronomical Twilight End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
	&amp;quot;result&amp;quot; : &lt;br /&gt;
	[&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
			&amp;quot;Cmd&amp;quot; : 0,&lt;br /&gt;
			&amp;quot;Color&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;Date&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
			&amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
			&amp;quot;MDay&amp;quot; : 0,&lt;br /&gt;
			&amp;quot;Month&amp;quot; : 0,&lt;br /&gt;
			&amp;quot;Occurence&amp;quot; : 0,&lt;br /&gt;
			&amp;quot;Randomness&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;Time&amp;quot; : &amp;quot;08:30&amp;quot;,&lt;br /&gt;
			&amp;quot;Type&amp;quot; : 23,&lt;br /&gt;
			&amp;quot;idx&amp;quot; : &amp;quot;45&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
	&amp;quot;title&amp;quot; : &amp;quot;Timers&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for all Scenes==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getschedules&amp;amp;filter=scene&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;result&amp;quot; : &lt;br /&gt;
    [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
            &amp;quot;Color&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Date&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
            &amp;quot;DevName&amp;quot; : &amp;quot;Lights&amp;quot;,&lt;br /&gt;
            &amp;quot;DeviceRowID&amp;quot; : 6,&lt;br /&gt;
            &amp;quot;IsThermostat&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
            &amp;quot;MDay&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Month&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Occurence&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Randomness&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;ScheduleDate&amp;quot; : &amp;quot;2021-03-12 07:01:00&amp;quot;,&lt;br /&gt;
            &amp;quot;Time&amp;quot; : &amp;quot;00:03&amp;quot;,&lt;br /&gt;
            &amp;quot;TimerCmd&amp;quot; : 1,&lt;br /&gt;
            &amp;quot;TimerID&amp;quot; : 4,&lt;br /&gt;
            &amp;quot;TimerType&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;TimerTypeStr&amp;quot; : &amp;quot;Before Sunrise&amp;quot;,&lt;br /&gt;
            &amp;quot;Type&amp;quot; : &amp;quot;Scene&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
            &amp;quot;Color&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Date&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
            &amp;quot;DevName&amp;quot; : &amp;quot;Garden lights&amp;quot;,&lt;br /&gt;
            &amp;quot;DeviceRowID&amp;quot; : 6,&lt;br /&gt;
            &amp;quot;IsThermostat&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
            &amp;quot;MDay&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Month&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Occurence&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Randomness&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;ScheduleDate&amp;quot; : &amp;quot;2021-03-12 09:00:00&amp;quot;,&lt;br /&gt;
            &amp;quot;Time&amp;quot; : &amp;quot;09:00&amp;quot;,&lt;br /&gt;
            &amp;quot;TimerCmd&amp;quot; : 1,&lt;br /&gt;
            &amp;quot;TimerID&amp;quot; : 6,&lt;br /&gt;
            &amp;quot;TimerType&amp;quot; : 2,&lt;br /&gt;
            &amp;quot;TimerTypeStr&amp;quot; : &amp;quot;On Time&amp;quot;,&lt;br /&gt;
            &amp;quot;Type&amp;quot; : &amp;quot;Scene&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Active&amp;quot; : &amp;quot;true&amp;quot;,&lt;br /&gt;
            &amp;quot;Color&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Date&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;Days&amp;quot; : 128,&lt;br /&gt;
            &amp;quot;DevName&amp;quot; : &amp;quot;Frontdoor&amp;quot;,&lt;br /&gt;
            &amp;quot;DeviceRowID&amp;quot; : 5,&lt;br /&gt;
            &amp;quot;IsThermostat&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;Level&amp;quot; : 100,&lt;br /&gt;
            &amp;quot;MDay&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Month&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Occurence&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;Randomness&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
            &amp;quot;ScheduleDate&amp;quot; : &amp;quot;2021-03-12 01:30:00&amp;quot;,&lt;br /&gt;
            &amp;quot;Time&amp;quot; : &amp;quot;01:30&amp;quot;,&lt;br /&gt;
            &amp;quot;TimerCmd&amp;quot; : 0,&lt;br /&gt;
            &amp;quot;TimerID&amp;quot; : 2,&lt;br /&gt;
            &amp;quot;TimerType&amp;quot; : 2,&lt;br /&gt;
            &amp;quot;TimerTypeStr&amp;quot; : &amp;quot;On Time&amp;quot;,&lt;br /&gt;
            &amp;quot;Type&amp;quot; : &amp;quot;Scene&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot; : &amp;quot;Schedules&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for one Scene==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getscenetimers&amp;amp;idx=sceneID&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
     &amp;quot;result&amp;quot;: [{&lt;br /&gt;
             &amp;quot;Active&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
             &amp;quot;Cmd&amp;quot;: 0,&lt;br /&gt;
             &amp;quot;Date&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
             &amp;quot;Days&amp;quot;: 128,&lt;br /&gt;
             &amp;quot;Level&amp;quot;: 100,&lt;br /&gt;
             &amp;quot;MDay&amp;quot;: 0,&lt;br /&gt;
             &amp;quot;Month&amp;quot;: 0,&lt;br /&gt;
             &amp;quot;Occurence&amp;quot;: 0,&lt;br /&gt;
             &amp;quot;Randomness&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
             &amp;quot;Time&amp;quot;: &amp;quot;01:30&amp;quot;,&lt;br /&gt;
             &amp;quot;Type&amp;quot;: 2,&lt;br /&gt;
             &amp;quot;idx&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
         }&lt;br /&gt;
     ],&lt;br /&gt;
     &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;SceneTimers&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for all Thermostats==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getschedules&amp;amp;filter=thermostat&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Schedules&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get all schedules(timers) for one Thermostat==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=getsetpointtimers&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;SetpointTimers&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enable specific schedule(timer) for Devices==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=enabletimer&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;EnableTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Disable specific schedule(timer) for Devices==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=disabletimer&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DisableTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a specific schedule(timer) for Devices==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletetimer&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DeleteTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Enable specific schedule(timer) for Thermostats==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=enablesetpointtimer&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;EnableSetpointTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Disable specific schedule(timer) for Thermostats==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=disablesetpointtimer&amp;amp;idx=timerID&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DisableSetpointTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a specific schedule(timer) for Thermostats==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletesetpointtimer&amp;amp;idx=timerID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DeleteSetpointTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Update parameters for a specific schedule(timer) for Devices==&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=updatetimer&amp;amp;idx=timerID&amp;amp;active=true&amp;amp;timertype=3&amp;amp;hour=0&amp;amp;min=20&amp;amp;randomness=true&amp;amp;command=0&amp;amp;days=12345&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*idx        = timerID&lt;br /&gt;
*active     = true/false&lt;br /&gt;
*timertype - see Get all schedules(timers) for one Device for timerTypeDefinition&lt;br /&gt;
*hour       = hour&lt;br /&gt;
*min        = minute&lt;br /&gt;
*randomness = true/false&lt;br /&gt;
*command    = On=0 / Off=1 (inverted logic)&lt;br /&gt;
*days       = 1=Mon, 2=Tue, 3=Wed, 4=Thurs, 5=Fri, 6=Sat, 7=Sun&lt;br /&gt;
&lt;br /&gt;
==Create a new schedule(timer) for an existing device==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=addtimer&amp;amp;idx=DeviceRowID&amp;amp;active=true&amp;amp;timertype=2&amp;amp;hour=0&amp;amp;min=20&amp;amp;randomness=false&amp;amp;command=0&amp;amp;days=1234567&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;AddTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*idx        = DeviceRowID = index of your device (other commands use a timerID as idx but here we use DeviceRowID).&lt;br /&gt;
*active     = true/false&lt;br /&gt;
*timertype - see Get all schedules(timers) for one Device for timerTypeDefinition&lt;br /&gt;
*hour       = hour&lt;br /&gt;
*min        = minute&lt;br /&gt;
*randomness = true/false&lt;br /&gt;
*command    = On=0 / Off=1 (inverted logic)&lt;br /&gt;
*days       = 1=Mon, 2=Tue, 3=Wed, 4=Thurs, 5=Fri, 6=Sat, 7=Sun&lt;br /&gt;
&lt;br /&gt;
==Clear all schedules(timers) for a particular device==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=cleartimers&amp;amp;idx=DeviceRowID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;ClearTimer&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*idx        = DeviceRowID = index of your device (other commands use a timerID as idx but here we use DeviceRowID).&lt;br /&gt;
&lt;br /&gt;
==Enable specific schedule(timer) for Scenes/Groups==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=enablescenetimer&amp;amp;idx=sceneID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;EnableSceneTimer&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Disable specific schedule(timer) for Scenes/Groups==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=disablescenetimer&amp;amp;idx=sceneID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DisableSceneTimer&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete a specific schedule(timer) for Scenes/Groups==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?type=command&amp;amp;param=deletescenetimer&amp;amp;idx=sceneID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DeleteSceneTimer&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Notifications=&lt;br /&gt;
&lt;br /&gt;
==Get all notification types==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getnotifications&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;notifiers&amp;quot;: [{&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;browser&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;browser&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;clickatell&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;clickatell&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;email&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;fcm&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;fcm&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;http&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;kodi&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;kodi&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;lms&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;lms&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;prowl&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;prowl&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushalot&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushalot&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushbullet&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushbullet&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushover&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushover&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushsafer&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushsafer&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;telegram&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;telegram&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Notifications&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get device notifications==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?idx=&amp;lt;deviceIDX&amp;gt;&amp;amp;param=getnotificationtypes&amp;amp;type=command&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;result&amp;quot;: &lt;br /&gt;
    [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;ptag&amp;quot;: &amp;quot;S&amp;quot;,&lt;br /&gt;
         &amp;quot;text&amp;quot;: &amp;quot;Switch On&amp;quot;,&lt;br /&gt;
         &amp;quot;val&amp;quot;: 7&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;GetNotificationTypes&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=getnotifications&amp;amp;idx=&amp;lt;deviceIDX&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;notifiers&amp;quot;: [{&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;browser&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;browser&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;clickatell&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;clickatell&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;email&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;email&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;fcm&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;fcm&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;http&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;http&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;kodi&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;kodi&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;lms&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;lms&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;prowl&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;prowl&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushalot&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushalot&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushbullet&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushbullet&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushover&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushover&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;pushsafer&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;pushsafer&amp;quot;&lt;br /&gt;
        }, {&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;telegram&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;telegram&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;result&amp;quot;: [{&lt;br /&gt;
            &amp;quot;ActiveSystems&amp;quot;: &amp;quot;clickatell;email;fcm;http;kodi;lms;prowl;pushalot;pushbullet;pushover;pushsafer;telegram&amp;quot;,&lt;br /&gt;
            &amp;quot;CustomMessage&amp;quot;: &amp;quot;test&amp;quot;,&lt;br /&gt;
            &amp;quot;Params&amp;quot;: &amp;quot;S&amp;quot;,&lt;br /&gt;
            &amp;quot;Priority&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;SendAlways&amp;quot;: false,&lt;br /&gt;
            &amp;quot;idx&amp;quot;: 3&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;Notifications&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add device notification==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?idx=&amp;lt;deviceIDX&amp;gt;&amp;amp;param=addnotification&amp;amp;tmsg=test&amp;amp;tpriority=0&amp;amp;tsendalways=true&amp;amp;tsystems=fcm;http&amp;amp;ttype=7&amp;amp;tvalue=0&amp;amp;twhen=0&amp;amp;type=command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;AddNotification&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Update device notifications==&lt;br /&gt;
&lt;br /&gt;
 /json.htm?devidx=&amp;lt;DeviceID&amp;gt;&amp;amp;idx=&amp;lt;notificationID&amp;gt;&amp;amp;param=updatenotification&amp;amp;tmsg=&amp;lt;msgText&amp;gt;&amp;amp;tpriority=&amp;lt;pri&amp;gt;&amp;amp;tsendalways=&amp;lt;true/false&amp;gt;&amp;amp;tsystems=&amp;lt;list of notification subsystems&amp;gt;&amp;amp;ttype=&amp;lt;notificationType&amp;gt;&amp;amp;tvalue=0&amp;amp;twhen=0&amp;amp;type=command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;UpdateNotification&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete device notification==&lt;br /&gt;
&lt;br /&gt;
 json.htm?idx=&amp;lt;notificationID&amp;gt;&amp;amp;param=deletenotification&amp;amp;type=command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;DeleteNotification&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Delete all device notifications==&lt;br /&gt;
 &lt;br /&gt;
 /json.htm?idx=&amp;lt;deviceID&amp;gt;&amp;amp;param=clearnotifications&amp;amp;type=command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;title&amp;quot;: &amp;quot;ClearNotification&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LMS and Kodi (Media Players)=&lt;br /&gt;
While both Logitech Media Server and Kodi can be controlled by JSON RPC commands sent directly to the URL of the LMS server or Kodi instance, it can be useful to use Domoticz as a tunnel/proxy to send a number of widely-used commands because you may have an external port already open for Domoticz and because Domoticz also supports HTTPS. &lt;br /&gt;
&lt;br /&gt;
==LMS==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;/json.htm?type=command&amp;amp;param=lmsmediacommand&amp;amp;idx=nnn&amp;amp;action=ACTION&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where ACTION can be: Left, Right, Up, Down, Favorites, Browse, NowPlaying, Shuffle, Repeat, Play, Pause, Stop, Rewind, Forward, Mute, VolumeUp, VolumeDown, PowerOn and PowerOff.&lt;br /&gt;
&lt;br /&gt;
==Kodi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;/json.htm?type=command&amp;amp;param=kodimediacommand&amp;amp;idx=nnn&amp;amp;action=ACTION&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where ACTION can be: PlayPause, Stop, FastForward, BigStepForward, Rewind, BigStepBack, ShowSubtitles, FullScreen, VolumeUp, VolumeDown, ChannelUp, ChannelDown, Channels&lt;br /&gt;
Home, Back, ContextMenu, Info, Select, Down, Right, Up, Left&lt;br /&gt;
&lt;br /&gt;
=Evohome=&lt;br /&gt;
&lt;br /&gt;
These commands work regardless of which of the 3 implementation-modes for Evohome you have chosen for your system (WebAPI, USB device, Scripting). Some of them will also work for e.g. the Honeywell Round WiFi thermostat.&lt;br /&gt;
&lt;br /&gt;
==Updating the evohome controller mode==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=switchmodal&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;status=&amp;lt;status&amp;gt;&amp;amp;action=&amp;lt;action&amp;gt;&amp;amp;ooc=&amp;lt;ooc&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;idx&amp;gt;&#039;&#039;&#039; id number of the evohome controller device in Domoticz&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;status&amp;gt;&#039;&#039;&#039; Auto, AutoWithReset, AutoWithEco, Away, DayOff, Custom, HeatingOff&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;action&amp;gt;&#039;&#039;&#039; (1 = run on action script, 0 = disable)&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;ooc&amp;gt;&#039;&#039;&#039; (1 = only trigger the event &amp;amp; log on change, 0 = always trigger &amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
===Specify an until date===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=switchmodal&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;status=&amp;lt;status&amp;gt;&amp;amp;action=&amp;lt;action&amp;gt;&amp;amp;ooc=&amp;lt;ooc&amp;gt;&amp;amp;until=&amp;lt;until&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*as above&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;until&amp;gt;&#039;&#039;&#039; ISO date time to run until. Format example &#039;&#039;2018-09-15T15:53:00&#039;&#039; or &#039;&#039;2018-09-15T15:53:00+01:00&#039;&#039; with timezone.&lt;br /&gt;
&lt;br /&gt;
Note: most controller modes do not support the &#039;&#039;time&#039;&#039; part of the ISO data and will only act upon the &#039;&#039;date&#039;&#039; portion - this will require at least the next day to be reflected in the date number to successfully trigger an update.&lt;br /&gt;
&lt;br /&gt;
==Updating a zone setpoint==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setsetpoint&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;setpoint=&amp;lt;setpoint&amp;gt;&amp;amp;mode=&amp;lt;mode&amp;gt;&amp;amp;used=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;idx&amp;gt;&#039;&#039;&#039; id number of the relevant evohome zone device in Domoticz&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;setpoint&amp;gt;&#039;&#039;&#039; set point in degrees (will be ignored for Auto)&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; Auto, TemporaryOverride, PermanentOverride, FollowSchedule&lt;br /&gt;
*&#039;&#039;&#039;used&#039;&#039;&#039; must be true&lt;br /&gt;
&lt;br /&gt;
===Specifying a date/time for zone TemporaryOverride===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setsetpoint&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;setpoint=&amp;lt;setpoint&amp;gt;&amp;amp;mode=TemporaryOverride&amp;amp;until=&amp;lt;until&amp;gt;&amp;amp;used=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*as above&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;until&amp;gt;&#039;&#039;&#039; ISO date time for the set point override. Format example &#039;&#039;2018-09-15T15:53:00&#039;&#039; or &#039;&#039;2018-09-15T15:53:00+01:00&#039;&#039; with timezone.&lt;br /&gt;
&lt;br /&gt;
In this case, any combination of a date portion and a time portion that are in the future will meet with success.&lt;br /&gt;
&lt;br /&gt;
==Turning HotWater ON/OFF==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=setused&amp;amp;idx=&amp;lt;idx&amp;gt;&amp;amp;setpoint=&amp;lt;setpoint&amp;gt;&amp;amp;state=&amp;lt;state&amp;gt;&amp;amp;mode=&amp;lt;mode&amp;gt;&amp;amp;used=true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;idx&amp;gt;&#039;&#039;&#039; id number of the evohome DHW temp device in Domoticz&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;setpoint&amp;gt;&#039;&#039;&#039; set point in degrees (will be ignored)&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;state&amp;gt;&#039;&#039;&#039; On, Off&lt;br /&gt;
*&#039;&#039;&#039;&amp;lt;mode&amp;gt;&#039;&#039;&#039; Auto, TemporaryOverride, PermanentOverride, FollowSchedule&lt;br /&gt;
*&#039;&#039;&#039;used&#039;&#039;&#039; must be true&lt;br /&gt;
&lt;br /&gt;
=Configuring zwave devices=&lt;br /&gt;
&amp;lt;b&amp;gt;Below mentioned commands are for the to be deprecated OpenZwave integration. Switch to [[Zwave-JS-UI]] as soon as possible!! &amp;lt;/b&amp;gt;&lt;br /&gt;
==Listing zwave node parameters==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  json.htm?type=command&amp;amp;param=getopenzwavenodes&amp;amp;idx=ControllerIDX&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*ControllerIDX    = the idx of your OpenZWave USB controller device, as listed under the &#039;Setup --&amp;gt; Hardware&#039; tab.&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;NodesQueried&amp;quot; : true,&lt;br /&gt;
   &amp;quot;ownNodeId&amp;quot; : 1,&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;Description&amp;quot; : &amp;quot;Neo CoolCam Door/Window Detector&amp;quot;,&lt;br /&gt;
         &amp;quot;HaveUserCodes&amp;quot; : false,&lt;br /&gt;
         &amp;quot;HomeID&amp;quot; : 3554707869,&lt;br /&gt;
         &amp;quot;IsPlus&amp;quot; : true,&lt;br /&gt;
         &amp;quot;LastUpdate&amp;quot; : &amp;quot;2018-08-04 20:09:02&amp;quot;,&lt;br /&gt;
         &amp;quot;Manufacturer_id&amp;quot; : &amp;quot;0x0258&amp;quot;,&lt;br /&gt;
         &amp;quot;Manufacturer_name&amp;quot; : &amp;quot;Neo CoolCam&amp;quot;,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Garage DOor&amp;quot;,&lt;br /&gt;
         &amp;quot;NodeID&amp;quot; : 40,&lt;br /&gt;
         &amp;quot;PollEnabled&amp;quot; : &amp;quot;false&amp;quot;,&lt;br /&gt;
         &amp;quot;Product_id&amp;quot; : &amp;quot;0x1082&amp;quot;,&lt;br /&gt;
         &amp;quot;Product_name&amp;quot; : &amp;quot;Door/Window Detector&amp;quot;,&lt;br /&gt;
         &amp;quot;Product_type&amp;quot; : &amp;quot;0x0003&amp;quot;,&lt;br /&gt;
         &amp;quot;State&amp;quot; : &amp;quot;Sleeping&amp;quot;,&lt;br /&gt;
         &amp;quot;Version&amp;quot; : 4,&lt;br /&gt;
         &amp;quot;config&amp;quot; : [&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;LastUpdate&amp;quot; : &amp;quot;2018-08-01 09:06:45&amp;quot;,&lt;br /&gt;
               &amp;quot;help&amp;quot; : &amp;quot;This configuration parameter that can be used to adjust the amount of delay before the OFF command is transmitted. This parameter can be configured with the value of 0 through 65535, where 0 means send OFF command immediately and 65535 means 65535 seconds of delay.&amp;quot;,&lt;br /&gt;
               &amp;quot;index&amp;quot; : 1,&lt;br /&gt;
               &amp;quot;label&amp;quot; : &amp;quot;Configuring the OFF Delay&amp;quot;,&lt;br /&gt;
               &amp;quot;type&amp;quot; : &amp;quot;short&amp;quot;,&lt;br /&gt;
               &amp;quot;units&amp;quot; : &amp;quot;second&amp;quot;,&lt;br /&gt;
               &amp;quot;value&amp;quot; : &amp;quot;0&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;LastUpdate&amp;quot; : &amp;quot;2018-08-01 09:06:45&amp;quot;,&lt;br /&gt;
               &amp;quot;help&amp;quot; : &amp;quot;Basic Set Command will be sent where contains a value when the door/window is opened or closed, the receiver will take it for consideration; for instance, if a lamp module is received the Basic Set Command of which value is decisive as to how bright of dim level of lamp module shall be.&amp;quot;,&lt;br /&gt;
               &amp;quot;index&amp;quot; : 2,&lt;br /&gt;
               &amp;quot;label&amp;quot; : &amp;quot;Basic Set Level&amp;quot;,&lt;br /&gt;
               &amp;quot;type&amp;quot; : &amp;quot;byte&amp;quot;,&lt;br /&gt;
               &amp;quot;units&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;value&amp;quot; : &amp;quot;255&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
               &amp;quot;LastUpdate&amp;quot; : &amp;quot;2018-08-03 07:55:52&amp;quot;,&lt;br /&gt;
               &amp;quot;help&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
               &amp;quot;index&amp;quot; : 2000,&lt;br /&gt;
               &amp;quot;label&amp;quot; : &amp;quot;Wake-up Interval&amp;quot;,&lt;br /&gt;
               &amp;quot;type&amp;quot; : &amp;quot;int&amp;quot;,&lt;br /&gt;
               &amp;quot;units&amp;quot; : &amp;quot;Seconds&amp;quot;,&lt;br /&gt;
               &amp;quot;value&amp;quot; : &amp;quot;43200&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
         ],&lt;br /&gt;
         &amp;quot;idx&amp;quot; : &amp;quot;11&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
     {&lt;br /&gt;
         &amp;quot;Description&amp;quot; : &amp;quot;FIBARO System FGWPE/F Wall Plug&amp;quot;,&lt;br /&gt;
         &amp;quot;HaveUserCodes&amp;quot; : false,&lt;br /&gt;
         &amp;quot;HomeID&amp;quot; : 3554707869,&lt;br /&gt;
         &amp;quot;IsPlus&amp;quot; : false,&lt;br /&gt;
         &amp;quot;LastUpdate&amp;quot; : &amp;quot;2018-08-05 12:12:24&amp;quot;,&lt;br /&gt;
         &amp;quot;Manufacturer_id&amp;quot; : &amp;quot;0x010f&amp;quot;,&lt;br /&gt;
         &amp;quot;Manufacturer_name&amp;quot; : &amp;quot;FIBARO System&amp;quot;,&lt;br /&gt;
         &amp;quot;Name&amp;quot; : &amp;quot;Studio&amp;quot;,&lt;br /&gt;
         &amp;quot;NodeID&amp;quot; : 5,&lt;br /&gt;
         .&lt;br /&gt;
         .&lt;br /&gt;
         .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the &#039;&#039;node_idx&#039;&#039; towards the end of each device&#039;s entry (the &amp;quot;idx&amp;quot;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;quot;11&amp;quot; in the example above for the Neo CoolCam Door/Window Detector). You don&#039;t see this node_idx in the regular devices tab for Domoticz, but it is the idx you&#039;ll need when changing a parameter through JSON (next section).&lt;br /&gt;
&lt;br /&gt;
==Getting the battery levels==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=zwavegetbatterylevels&amp;amp;idx=controlleridx&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*controlleridx    = the idx of your OpenZWave USB controller device, as listed under the &#039;Setup --&amp;gt; Hardware&#039; tab.&lt;br /&gt;
&lt;br /&gt;
Example output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;result&amp;quot; : [&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;battery&amp;quot; : 255,&lt;br /&gt;
         &amp;quot;nodeID&amp;quot; : 17,&lt;br /&gt;
         &amp;quot;nodeName&amp;quot; : &amp;quot;Designlamp bij TV&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;battery&amp;quot; : 255,&lt;br /&gt;
         &amp;quot;nodeID&amp;quot; : 19,&lt;br /&gt;
         &amp;quot;nodeName&amp;quot; : &amp;quot;Lichtknopje voorkamer&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;battery&amp;quot; : 100,&lt;br /&gt;
         &amp;quot;nodeID&amp;quot; : 33,&lt;br /&gt;
         &amp;quot;nodeName&amp;quot; : &amp;quot;Rookmelder&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;status&amp;quot; : &amp;quot;OK&amp;quot;,&lt;br /&gt;
   &amp;quot;title&amp;quot; : &amp;quot;GetBatteryLevels&amp;quot;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: a Battery level of 255 indicates either a non battery powered device, or a battery powered device which has not yet send a battery measurement to OpenZWave yet.&lt;br /&gt;
&lt;br /&gt;
==Changing a zwave device parameter==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=applyzwavenodeconfig&amp;amp;idx=node_idx&amp;amp;valuelist=plist&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*node_idx =    the value found by searching through the output of &#039;&#039;openzwavenodes&#039;&#039; for the node in question (see above)&lt;br /&gt;
*plist    =    the (partially) URI encoded and BASE64 encoded parameter list&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;plist&#039;&#039; entries start with an unencoded decimal item number preceded by and followed by an underscore (e.g. _7_), followed by the correctly-encoded string. You can check out the encodings at the following links: [https://www.base64decode.org base64decode] and at [https://www.urlencoder.org urlencode]. In Base64, &#039;Enable&#039; is written as &#039;RW5hYmxl&#039;, so it looks odd but it&#039;s easy once you grasp it.&lt;br /&gt;
&lt;br /&gt;
For example, if you are configuring a NEO Coolcam Siren through JSON,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=applyzwavenodeconfig&amp;amp;idx=10&amp;amp;valuelist=7_QWxhcm0gbXVzaWM%3D&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would change parameter 7 (Configure Default Siren On Mode) to &#039;Alarm music&#039;, while&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=applyzwavenodeconfig&amp;amp;idx=10&amp;amp;valuelist=7_RG9vciBiZWxsIG11c2lj%3D&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would change it to &#039;Door bell music&#039; (because &#039;RG9vciBiZWxsIG11c2lj&#039; is the result of Base64 encoding &#039;Door bell music&#039;). Note: Any &#039;%3D&#039; and such in the &#039;&#039;plist&#039;&#039; are the result of URI encoding an &#039;=&#039; or other non-alphanumeric character.&lt;br /&gt;
&lt;br /&gt;
The easiest way to learn about this is to change a zwave device parameter manually using your browser while you have &#039;&#039;&#039;developer tools&#039;&#039;&#039; enabled (hit &#039;ctrl-shift-i&#039; in Chrome). Look under the &#039;&#039;network&#039;&#039; tab at the JSON sent back by the browser to Domoticz when you click on &#039;Apply Configuration for This Device&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;  /json.htm?type=command&amp;amp;param=applyzwavenodeconfig&amp;amp;idx=10&amp;amp;valuelist=3_MjU1_1_SGlnaA%3D%3D_&lt;br /&gt;
2_MSBtaW51dGU%3D_4_TG93_5_MTA%3D_6_MQ%3D%3D_7_QWxhcm0gbXVzaWM%3D_8_RW5hYmxl_9_RGlzYWJsZQ%3D%3D_&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The browser will actually send the full parameter list to Domoticz, including the unchanged values of any parameters you didn&#039;t alter. If you modify one of them, however, you&#039;ll see that edit reflected in the Base64-encoded JSON string.&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshotjsondebug.png]]&lt;br /&gt;
&lt;br /&gt;
=Language-specific JSON examples=&lt;br /&gt;
The following tiny code snippets demonstrate the syntax for using JSON with Domoticz from some popular programming languages.&lt;br /&gt;
&lt;br /&gt;
==Bash==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
curl -s &#039;http://192.168.178.12:8080/json.htm?type=devices&amp;amp;rid=104&#039; | jq .result[0].Temp | sed &#039;s/\&amp;quot;//g&#039; | awk &#039;{ print $1 }&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 $json_string = file_get_contents(&amp;quot;http://192.168.178.12:8080/json.htm?type=devices&amp;amp;rid=110&amp;quot;);&lt;br /&gt;
 $parsed_json = json_decode($json_string, true);&lt;br /&gt;
 $test_link = &amp;quot;/home/pi/output.txt&amp;quot;;&lt;br /&gt;
 $test_data = fopen ($test_link, &amp;quot;w+&amp;quot;);&lt;br /&gt;
 fwrite ($test_data, print_R($parsed_json, TRUE));&lt;br /&gt;
 fclose ($test_data);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Python==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
import urllib&lt;br /&gt;
import urllib2&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
url = &#039;http://192.168.178.12:8080/json.htm?type=command&amp;amp;param=udevice&amp;amp;nvalue=0&amp;amp;idx=&#039;+idx+&#039;&amp;amp;svalue=&#039;+sval&lt;br /&gt;
try:&lt;br /&gt;
  request = urllib2.Request(url)&lt;br /&gt;
  response = urllib2.urlopen(request)&lt;br /&gt;
  except urllib2.HTTPError, e:&lt;br /&gt;
    print e.code; time.sleep(60)&lt;br /&gt;
  except urllib2.URLError, e:&lt;br /&gt;
    print e.args; time.sleep(60)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Perl==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use LWP::UserAgent;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
&lt;br /&gt;
$url{domo}=&amp;gt;&#039;http://192.168.178.12:8080&#039;;&lt;br /&gt;
$idx=301;&lt;br /&gt;
&lt;br /&gt;
$ua=LWP::UserAgent-&amp;gt;new; $ua-&amp;gt;timeout(5);&lt;br /&gt;
$retrieve=$ua-&amp;gt;get($url{domo}.&#039;/json.htm?type=devices&amp;amp;rid=&#039;.$idx);&lt;br /&gt;
$res=$retrieve-&amp;gt;decoded_content;&lt;br /&gt;
if ($retrieve-&amp;gt;is_success) { $jres = JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($res)  } else { warn $retrieve-&amp;gt;status_line };&lt;br /&gt;
$state=$$jres{result}[0]-&amp;gt;{Status}; # &#039;On&#039;, &#039;Off&#039;, &#039;Open&#039;, &#039;Closed&#039;, etc&lt;br /&gt;
print &amp;quot;The switch state for idx $idx is currently &#039;$state&#039;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Logitech_Media_Server&amp;diff=12493</id>
		<title>Logitech Media Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Logitech_Media_Server&amp;diff=12493"/>
		<updated>2019-07-11T07:07:15Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: /* Setup process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for Logitech Media Server&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
Logitech Media Server (formerly SlimServer, SqueezeCenter and Squeezebox Server) is a streaming audio server supported by Logitech (formerly Slim Devices), developed in particular to support their Squeezebox range of digital audio receivers. Logitech EOL&#039;d the product line in 2012 but the open-source LMS software is still actively developed in a so-called community effort. &lt;br /&gt;
The latest version can be downloaded here - http://downloads.slimdevices.com/nightly. Synology provides updates to a fairly recent community build from time to time on their beta channel.&lt;br /&gt;
&lt;br /&gt;
==Logitech Media Server in Domoticz==&lt;br /&gt;
&lt;br /&gt;
===Logitech Media Server Settings===&lt;br /&gt;
Your Logitech Media Server must be configured to allow Domoticz to control the attached players. Default port for Web Server connections is 9000 or 9002.&lt;br /&gt;
&lt;br /&gt;
[[File:LMS Server.png]]&lt;br /&gt;
&lt;br /&gt;
===Adding Hardware===&lt;br /&gt;
Add the Logitech Media Server via the Hardware page under Settings. Fill in the IP of your Logitech Media Server and the port you specified.&lt;br /&gt;
&lt;br /&gt;
[[File:LMS Hardware.png]]&lt;br /&gt;
&lt;br /&gt;
====Domoticz Settings====&lt;br /&gt;
Click &#039;Setup&#039; to see the detected/connected players. &lt;br /&gt;
* Poll interval controls how often Domoticz will attempt to reconnect to the Logitech Media Server to poll the player&#039;s status.&lt;br /&gt;
* Ping timeout controls how long Domoticz will try to contact the Logitech Media Server.&lt;br /&gt;
&lt;br /&gt;
[[File:LMS Settings.png]]&lt;br /&gt;
&lt;br /&gt;
====Detected Players====&lt;br /&gt;
If you entered the correct IP &amp;amp; port of your Logitech Media Server, your players will be detected and displayed under Devices.&lt;br /&gt;
It displays names and MAC-addresses.&lt;br /&gt;
&lt;br /&gt;
====Supported Models====&lt;br /&gt;
The supported models are:&lt;br /&gt;
* Squeezebox 1&lt;br /&gt;
* Squeezebox 2&lt;br /&gt;
* Squeezebox 3&lt;br /&gt;
* Squeezebox Receiver&lt;br /&gt;
* Squeezebox Boom&lt;br /&gt;
* Squeezebox Controller&lt;br /&gt;
* SqueezePlay&lt;br /&gt;
* Squeezebox Radio&lt;br /&gt;
* Squeezebox Touch&lt;br /&gt;
* iPeng iOS App (iPhone &amp;amp; iPad)&lt;br /&gt;
* Max2Play SqueezePlug&lt;br /&gt;
* [https://www.picoreplayer.org/ PiCoreplayer] based on Squeezelite software&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
If your player model is not supported, it will be reported in the logfile. The logfile also reports detected players when starting the Logitech Media Server hardware.&lt;br /&gt;
&lt;br /&gt;
===Events and Notifications===&lt;br /&gt;
Domoticz device events work for Logitech Media Players using both Blockly and LUA.  &lt;br /&gt;
&lt;br /&gt;
Events and notifications are triggered for:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|On&lt;br /&gt;
|-&lt;br /&gt;
|Off/Disconnected&lt;br /&gt;
|-&lt;br /&gt;
|Play&lt;br /&gt;
|-&lt;br /&gt;
|Pause&lt;br /&gt;
|-&lt;br /&gt;
|Stop&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following actions can be performed by using &#039;Set&#039; on a Logitech Media Player.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|On or Group On&lt;br /&gt;
|Will turn the device on.&lt;br /&gt;
|-&lt;br /&gt;
|Off or Group Off&lt;br /&gt;
|Will turn the device off.&lt;br /&gt;
|-&lt;br /&gt;
|Play&lt;br /&gt;
|Will send a Play command.&lt;br /&gt;
|-&lt;br /&gt;
|Pause&lt;br /&gt;
|Will toggle between Play and Pause.&lt;br /&gt;
|-&lt;br /&gt;
|Stop&lt;br /&gt;
|Will send a Stop command.&lt;br /&gt;
|-&lt;br /&gt;
|Set Volume &amp;lt;0-100&amp;gt;&lt;br /&gt;
|Will set the volume of the player-output.&lt;br /&gt;
|-&lt;br /&gt;
|Play Playlist &amp;lt;name&amp;gt;&lt;br /&gt;
|Will play the playlist with name &amp;lt;name&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|Play Favorites&lt;br /&gt;
|Will play the favorites.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;commandArray[&#039;SqueezeBox&#039;]=&#039;On&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;commandArray[&#039;SqueezeBox&#039;]=&#039;Play&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;commandArray[&#039;SqueezeBox&#039;]=&#039;Set Volume 30&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;commandArray[&#039;SqueezeBox&#039;]=&#039;Play Playlist WakeUpList1&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;commandArray[&#039;SqueezeBox&#039;]=&#039;Play Favorites&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==On Screen Notifications==&lt;br /&gt;
Domoticz can display notification messages on the screens of certain Logitech Media Players. This is configured via the Notifications tab on the Settings page as shown here:&lt;br /&gt;
&lt;br /&gt;
[[File:LMS Notifications.png]]&lt;br /&gt;
&lt;br /&gt;
Fill in the MAC-address (separated by a semicolon) and the duration that the message will be displayed on the screen (in seconds)&lt;br /&gt;
The MAC-address of your player(s) can be found in the Hardware-settings of your Logitech Media Server hardware.&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
* (Song-)Titles with special characters will show wrong symbols in the logfile.&lt;br /&gt;
&lt;br /&gt;
==Work in Progress==&lt;br /&gt;
* Add support for Timers (schedule your player to play playlists)&lt;br /&gt;
&lt;br /&gt;
==Audio Alerts via Squeezebox Players==&lt;br /&gt;
&lt;br /&gt;
The Squeezebox radio and boom players can be used to play audio alerts from Domoticz via the following perl scripts. The concept will work with any type of player (including software players) but the radio and boom are well-suited as they have their own amplifier and can therefore act autonomously. &lt;br /&gt;
&lt;br /&gt;
Two different approaches are shown. The first one uses a script that&#039;s &#039;&#039;multi-threaded&#039;&#039; and will play alerts on multiple players around your home at more or less the same time (but not truly synced). This has the advantage of not interfering with any syncgroups you may habitually use. The second approach assembles/disassembles a temporary &#039;&#039;syncgroup&#039;&#039; from the players in question, meaning no echo around the house if you deploy alerts to a lot of players at the same time. You can try both approaches and see which one works best for you. One thing worth knowing about syncgroups is that they often start out with a small time-difference between players which is then quickly corrected by LMS (it speeds up a lagging player to catch up). If this happens when playing an audio alert then part of the speech will be skipped over as the sync progresses. YMMV but if it happens a lot in your situation then it&#039;s best to use the multi-threaded version.&lt;br /&gt;
&lt;br /&gt;
=== How it works ===&lt;br /&gt;
The basic idea (with both approaches) is to first retrieve and save several current parameters from each player: power state (on/off), play-mode (play/pause/stop), repeat-mode (none/song/playlist), current-playlist (if any), current time-position within currently-playing song (if any), plus the current volume setting. Next we play the desired alert audio clips - first a &#039;pre-chime&#039; to get our attention, then the actual alert message MP3 audio file (you can pre-generate a series of these using e.g. text-to-speech software). In doing this we power-on each player if it was off, pause the current song if the player was active, set repeat to &#039;none&#039; so we don&#039;t play an infinite loop of alerts, and set the desired volume-level. When we see the alert has come to an end, we return everything back the way it was prior to the alert. In the case of the second approach which builds temporary syncgroups, the group is also disassembled.&lt;br /&gt;
&lt;br /&gt;
The heavy-lifting is done by a perl subroutine called &#039;&#039;&amp;amp;squeezeAlert&#039;&#039; which is contained in a perl script &#039;&#039;squeezealert.pl&#039;&#039;. In use, we will call this from a tiny bash script &#039;&#039;sqalert.sh&#039;&#039; which takes care of running the perl job as a background process so we return immediately to Domoticz and there&#039;s no waiting. This bash pre-script also allows us to use &#039;&#039;ssh&#039;&#039; to execute the perl on a remote machine if we need to (see below). &lt;br /&gt;
&lt;br /&gt;
In the on-action / off-action fields of a Domoticz switch, you can now use a construct along the lines of&lt;br /&gt;
&lt;br /&gt;
 script://sqalert.sh kitchen Ring06.wav downloadReady.mp3 60&lt;br /&gt;
 script://sqalert.sh livingroom none garageDoorClosed.mp3 50&lt;br /&gt;
 script://sqalert.sh &amp;quot;kitchen, livingroom&amp;quot; Ring06.wav garageDoorOpen.mp3 55&lt;br /&gt;
 script://sqalert.sh &amp;quot;livingroom, office, studio&amp;quot; Ring06.wav washingmachineFinished.mp3 70&lt;br /&gt;
&lt;br /&gt;
See the comments in the code for an exact description of the 4 parameters (&#039;&#039;players, prechime, ttsfile, volume&#039;&#039;). If it doesn&#039;t work for you, try specifying the full path to the bash file with a triple-slash&lt;br /&gt;
&lt;br /&gt;
 script:///home/pi/domoticz/scripts/sqalert.sh livingroom none garageDoorClosed.mp3 50&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tip:&#039;&#039; You can copy some of the audio clip files in a Windows &#039;&#039;/media&#039;&#039; folder over to your &#039;&#039;alerts&#039;&#039; directory as pre-alert chimes (the RingXX.wav ones are nice for this purpose). The spoken messages alerting for things like &#039;Motion detected in Hallway&#039; or &#039;Garage door has been left open longer than 10 minutes&#039; can be saved to mp3 files using an online service like Amazon Polly.&lt;br /&gt;
&lt;br /&gt;
=== Setup Considerations ===&lt;br /&gt;
&lt;br /&gt;
With all the perl scripts in this LMS wiki, some modules from &#039;&#039;CPAN&#039;&#039; (Comprehensive Perl Archive Network) need to be installed. This is no problem on Linux and on Windows, but is a major problem on Synology NAS devices which have a rather stripped-down Linux under the hood with no build environment. There is a simple workaround for this using remote scripting, but let&#039;s first get something clear about where/what needs to be installed. When any one of the perl scripts here are active, 3 different pieces of software are ultimately involved:&lt;br /&gt;
&lt;br /&gt;
 1. LMS server software&lt;br /&gt;
 2. Domoticz&lt;br /&gt;
 3. Our perl script(s)&lt;br /&gt;
&lt;br /&gt;
These 3 can all run on the same computer but they can also be run on 3 &#039;&#039;different&#039;&#039; computers with no problems whatsoever. Synology users can run both LMS and Domoticz e.g. on their Synology, but run the perl script(s) on a separate perl-friendly machine such as a spare RPi. This is possible because we can get a Domoticz on/off action to run a script on a remote machine by using &#039;&#039;ssh&#039;&#039; (explained below) with &#039;&#039;Public-Key Authentication&#039;&#039;. You also only need &#039;&#039;&#039;one&#039;&#039;&#039; instance of Domoticz running, so if you are using a separate machine for the perl-scripts then it does &#039;&#039;not&#039;&#039; need to have a slave Domoticz instance installed on it. Please keep this in mind when deciding on what machine(s) to run these packages. Also note that the &#039;&#039;ssh&#039;&#039; remote-scripting option is only needed when the perl-script is remote to the Domoticz machine - it doesn&#039;t matter if LMS is remote or not.&lt;br /&gt;
&lt;br /&gt;
=== Setup process ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The temporary now-playing playlist saved for restoring after the alert is played will be stored in your regular LMS &#039;&#039;playlists&#039;&#039; folder as defined in your LMS configuration. You &#039;&#039;&#039;must&#039;&#039;&#039; define a playlists folder (even if you use Spotify) or else resuming the current song after the alert plays will go wrong and Spotty will just stop after the alert. In the LMS web interface, go to &#039;&#039;settings --&amp;gt; basic settings --&amp;gt; playlists folder&#039;&#039;. Also, please ensure that the folder has read/write permissions set correctly (on Linux, chmod 666).&lt;br /&gt;
&lt;br /&gt;
For the local audio files, it&#039;s best to create a subfolder in your LMS &#039;&#039;music&#039;&#039; folder called &#039;&#039;alerts&#039;&#039; and to put all your pre-chimes and alert-TTS files in there.&lt;br /&gt;
&lt;br /&gt;
First make sure perl is installed (it very likely is on a linux-based OS) and then install the modules from CPAN that we need (&#039;&#039;note&#039;&#039;: Parallel::Loops is not needed for the syncgroup version):&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo cpan install Parallel::Loops&lt;br /&gt;
 sudo cpan install JSON::RPC::Client&lt;br /&gt;
 sudo cpan install JSON::XS&lt;br /&gt;
&lt;br /&gt;
Create a bash script called &#039;&#039;sqalert.sh&#039;&#039; with the following content. Substitute the &#039;&#039;.../domoticz/scripts&#039;&#039; for the path to the directory that Domoticz accesses by default when you use the &#039;&#039;on/off actions&#039;&#039; for a switch (on a pi that would nominally be &#039;&#039;/home/pi/domoticz/scripts&#039;&#039;, on Synology &#039;&#039;/volume1/homes/USERNAME/domoticz/scripts&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
/usr/bin/perl .../domoticz/scripts/squeezealert.pl $1 $2 $3 $4 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put it in that &#039;&#039;.../domoticz/scripts&#039;&#039; directory on whichever machine in your setup runs Domoticz and of course do a &#039;&#039;chmod +x&#039;&#039; afterwards.&lt;br /&gt;
&lt;br /&gt;
If you are using the remote script option (i.e. Domoticz and perl-script on separate machines), use this version of &#039;&#039;sqalert.sh&#039;&#039; instead (&#039;&#039;note&#039;&#039;: it is still installed in the .../domoticz/scripts directory on the &#039;&#039;local&#039;&#039; machine running Domoticz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy /usr/bin/perl /path/to/remote/scriptdir/squeezealert.pl $1 $2 $3 $4 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 192.168.xxx.yyy is the IP address of the remote machine that the perl script will actually run on, the &#039;&#039;-p&#039;&#039; specifies the port to use for ssh on the remote machine (usually 22), &#039;&#039;privatekey&#039;&#039; is the keyfile in the local ~/.ssh directory (on the Domoticz machine) allowing ssh login to the remote machine without specifying a password, and &#039;&#039;/path/to/remote/scriptdir&#039;&#039; is the arbitrary path to the directory your perl scripts are stored in on that remote machine.&lt;br /&gt;
&lt;br /&gt;
If you plan on using the remote-scripting option and you haven&#039;t already set up &#039;&#039;ssh&#039;&#039; for non-interactive login on the target/remote machine, use the command &#039;&#039;ssh-keygen -t rsa&#039;&#039; to generate the two files with public/private keys and put the &#039;&#039;public&#039;&#039; key in the ~/.ssh directory on the target/remote machine and the &#039;&#039;private&#039;&#039; key in ~/.ssh on the local machine where Domoticz is running. You will also have to do  a &#039;&#039;chmod 700&#039;&#039; on the ~/.ssh directory itself and &#039;&#039;chmod 600&#039;&#039; on the key files themselves or it won&#039;t work.&lt;br /&gt;
&lt;br /&gt;
Next, create a perl script called &#039;&#039;squeezealert.pl&#039;&#039; in the directory/machine pointed to by the path you just used in the bash script, with the following content (and do a &#039;&#039;chmod +x&#039;&#039; afterwards). &#039;&#039;Note:&#039;&#039; You will need to edit the parameters for player-mac&#039;s, the URL of your LMS instance, plus the full linux pathname to your alerts directory after creating this script (all parameters are case-sensitive too).&lt;br /&gt;
&lt;br /&gt;
====First variant of squeezealert.pl, not using syncgroups but using threading====&lt;br /&gt;
&lt;br /&gt;
This script implements semi-synchronised alerts on multiple players through multi-threading using the &#039;&#039;Parallel::Loops&#039;&#039; module. You can use either this one or the next script below (&#039;&#039;second variant&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
# Plays a text-to-speech (TTS) alert on a Squeezebox, temporarily interrupting any music that&#039;s playing and then restoring&lt;br /&gt;
# An optional pre-chime doodle is played to first get our attention&lt;br /&gt;
&lt;br /&gt;
# Author:  philchillbill, 2017-2018&lt;br /&gt;
&lt;br /&gt;
use JSON::RPC::Client;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
use Parallel::Loops;&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
# We call this perl script from the command line, passing 4 parameters to it:&lt;br /&gt;
&lt;br /&gt;
# 1. &#039;players&#039; is a string consisting of a comma-separated list of player names (no spaces!) in quotes. &lt;br /&gt;
#     e.g. &amp;quot;kitchen&amp;quot; or &amp;quot;kitchen, livingroom, bedroom&amp;quot; but NOT &amp;quot;kitchen, living room, bedroom&amp;quot;&lt;br /&gt;
# 2. &#039;prechime&#039; is the filename of the jingle to be played just prior to the spoken alert to grab our attention. e.g. &#039;Ring06.wav&#039;. &lt;br /&gt;
#    If no pre-chime is desired, use &#039;none&#039;. The folder &#039;C:\Windows\media&#039; has nice examples (files RingXX.wav).&lt;br /&gt;
# 3. &#039;ttsfile&#039; is the filename of the spoken alert message. e.g. &#039;garageDoorOpen.mp3&#039;&lt;br /&gt;
# 4. &#039;avol&#039; is the volume that the alert is to be played at and should be 0-100. In practice, values of 40-80 are realistic.&lt;br /&gt;
&lt;br /&gt;
# Edit the following parameters to suit your setup:&lt;br /&gt;
&lt;br /&gt;
# The mac addresses for all the squeezebox players that will use alerting&lt;br /&gt;
%uuids = (&lt;br /&gt;
 kitchen =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 livingroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 office =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The full path to the directory where all the TTS mp3/wav files are stored. Please use the name &#039;alerts&#039; somewhere in it.&lt;br /&gt;
%dir = (&lt;br /&gt;
 alerts	=&amp;gt; &#039;file:///volume1/music/alerts&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The URL for the LMS server instance, usually on port 9000 or 9002&lt;br /&gt;
%url = (&lt;br /&gt;
 lms =&amp;gt; &#039;http://192.168.1.3:9002/jsonrpc.js&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub squeezeAlert {&lt;br /&gt;
 ($player, $prechime, $afile, $avol)=@_;&lt;br /&gt;
 $client=new JSON::RPC::Client; $playerid=$uuids{$player};&lt;br /&gt;
 # Get the player&#039;s present state so it can be restored later, but not if last-playing was an alert (path is checked)&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;path&#039;, &#039;?&#039;] ] });&lt;br /&gt;
 if (!$res) { return }; # player must be disconnected/offline so return&lt;br /&gt;
 if ($res-&amp;gt;is_success) {&lt;br /&gt;
  $jres=$res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $path=$$jdata{result}{_path} || &#039;empty&#039;;&lt;br /&gt;
  $restore=($path!~m/alerts|^empty$/) || 0;&lt;br /&gt;
  if ($restore) {&lt;br /&gt;
   $res = ( $client-&amp;gt;call( $url{lms}, { method  =&amp;gt; &#039;slim.request&#039;, params  =&amp;gt; [ $playerid, [&#039;status&#039;, &#039;-&#039;, &#039;1&#039;, &#039;tags&#039; ] ] }) ) || 0;&lt;br /&gt;
   $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); &lt;br /&gt;
   $repeat=$$jdata{result}{&#039;playlist repeat&#039;};&lt;br /&gt;
   $power=$$jdata{result}{power};&lt;br /&gt;
   $mode=$$jdata{result}{mode}; $noplay=($mode!~m/play/) || 0;&lt;br /&gt;
   $mvol=$$jdata{result}{&#039;mixer volume&#039;};&lt;br /&gt;
   $time=$$jdata{result}{time};&lt;br /&gt;
   if ($mode eq &#039;play&#039;) { $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;pause&#039;] ] }); }&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;save&#039;, &amp;quot;nowplaying$player&amp;quot;, &#039;silent:1&#039;] ] });&lt;br /&gt;
 }}&lt;br /&gt;
 # now we have the present state of the player, get ready to play the alert:&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, &#039;1&#039;] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $avol ] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, &#039;0&#039;] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;clear&#039;] ] });&lt;br /&gt;
 # build the temporary alert playlist&lt;br /&gt;
 if ($prechime eq &#039;none&#039;) { @play=($afile) } else { @play=($prechime, $afile) };&lt;br /&gt;
 foreach $file (@play) {&lt;br /&gt;
  $filetoplay=&amp;quot;$dir{alerts}/$file&amp;quot;;&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;add&#039;, &amp;quot;$filetoplay&amp;quot;] ] });&lt;br /&gt;
 }&lt;br /&gt;
 # now play the alert-playlist&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;play&#039;] ] });&lt;br /&gt;
 # and wait for it to stop&lt;br /&gt;
 do {&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mode&#039;, &#039;?&#039;] ] });&lt;br /&gt;
  $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $mode=$$jdata{result}{_mode};&lt;br /&gt;
  sleep 1;&lt;br /&gt;
 } until ($mode eq &#039;stop&#039;);&lt;br /&gt;
 # ok, we are done playing so either restore the music playlist we interrupted, or power off if nothing was playing&lt;br /&gt;
 if ($restore) {&lt;br /&gt;
  # Restore player to previous state&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $mvol ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, $repeat ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;resume&#039;, &amp;quot;nowplaying$player&amp;quot;, &amp;quot;noplay:$noplay&amp;quot; ] ] }); ;&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;time&#039;, $time ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, $power] ] });&lt;br /&gt;
 }&lt;br /&gt;
 else { # no restore, just clear and power-off&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;clear&#039;] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, &#039;0&#039;] ] });&lt;br /&gt;
 }&lt;br /&gt;
 return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
($players, $prechime, $ttsfile, $avol)=@ARGV;&lt;br /&gt;
@players=split(/,\s?/, $players);&lt;br /&gt;
&lt;br /&gt;
$maxProcs = 6;&lt;br /&gt;
$pl = Parallel::Loops-&amp;gt;new($maxProcs);&lt;br /&gt;
$pl-&amp;gt;foreach (\@players, sub { &amp;amp;squeezeAlert( $_, $prechime, $ttsfile, $avol ) });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Second variant of squeezealert.pl, using temporary syncgroups====&lt;br /&gt;
&lt;br /&gt;
This script assembles/disassembles temporary syncgroups when alerts are played on multiple players (note: you should use &#039;&#039;either&#039;&#039; this script &#039;&#039;or&#039;&#039; the &#039;&#039;first variant&#039;&#039; above, but not both!):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
# Plays a text-to-speech (TTS) alert on a Squeezebox, temporarily interrupting any music that&#039;s playing and then restoring&lt;br /&gt;
# An optional pre-chime doodle is played to first get our attention&lt;br /&gt;
&lt;br /&gt;
# THIS VERSION ASSEMBLES/DISASSEMBLES TEMPORARY SYNCGROUPS FOR THE DURATION OF THE ALERT&lt;br /&gt;
&lt;br /&gt;
# Author:  philchillbill, 2017-2018&lt;br /&gt;
&lt;br /&gt;
use JSON::RPC::Client;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
# We call this perl script from the command line, passing 4 parameters to it:&lt;br /&gt;
&lt;br /&gt;
# 1. &#039;players&#039; is a string consisting of a comma-separated list of player names (no spaces!) in quotes. &lt;br /&gt;
#     e.g. &amp;quot;kitchen&amp;quot; or &amp;quot;kitchen, livingroom, bedroom&amp;quot; but NOT &amp;quot;kitchen, living room, bedroom&amp;quot;&lt;br /&gt;
# 2. &#039;prechime&#039; is the filename of the jingle to be played just prior to the spoken alert to grab our attention. e.g. &#039;Ring06.wav&#039;. &lt;br /&gt;
#    If no pre-chime is desired, use &#039;none&#039;. The folder &#039;C:\Windows\media&#039; has nice examples RingXX.wav.&lt;br /&gt;
# 3. &#039;ttsfile&#039; is the filename of the spoken alert message. e.g. &#039;garageDoorOpen.mp3&#039;&lt;br /&gt;
# 4. &#039;avol&#039; is the volume the alert is to be played at and should be 0-100. In practice, values of 40-80 are realistic.&lt;br /&gt;
&lt;br /&gt;
# Edit the following parameters to suit your setup:&lt;br /&gt;
&lt;br /&gt;
# The mac addresses for all the squeezebox players that will use alerting&lt;br /&gt;
%uuids = (&lt;br /&gt;
 kitchen =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 livingroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 office =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The full path to the directory where all the TTS mp3/wav files are stored. Please use the name &#039;alerts&#039; somewhere in it.&lt;br /&gt;
%dir = (&lt;br /&gt;
 alerts	=&amp;gt; &#039;file:///volume1/music/alerts&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The URL for the LMS server instance, usually on port 9000 or 9002&lt;br /&gt;
%url = (&lt;br /&gt;
 lms =&amp;gt; &#039;http://192.168.1.3:9002/jsonrpc.js&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub squeezeAlert {&lt;br /&gt;
 ($sbgroup, $prechime, $afile, $avol)=@_; @players=@{$sbgroup};&lt;br /&gt;
 $client=new JSON::RPC::Client; &lt;br /&gt;
 # Get each player&#039;s present state so it can be restored later, but not if last-playing was an alert (path is checked)&lt;br /&gt;
 foreach $sb (@players) {&lt;br /&gt;
  $playerid=$uuids{$sb};&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;path&#039;, &#039;?&#039;] ] });&lt;br /&gt;
  if (!$res) { if (scalar(@players)==1) { return } else { next } }; # player must be disconnected/offline so skip&lt;br /&gt;
  if ($res-&amp;gt;is_success) {&lt;br /&gt;
   push(@alive, $sb); # add sb to the array of connected players&lt;br /&gt;
   $jres=$res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $path=$$jdata{result}{_path} || &#039;empty&#039;;&lt;br /&gt;
   $restore{$sb}=($path!~m/alerts|^empty$/) || 0;&lt;br /&gt;
   if ($restore{$sb}) {&lt;br /&gt;
    $res = ( $client-&amp;gt;call( $url{lms}, { method  =&amp;gt; &#039;slim.request&#039;, params  =&amp;gt; [ $playerid, [&#039;status&#039;, &#039;-&#039;, &#039;1&#039;, &#039;tags&#039; ] ] }) ) || 0;&lt;br /&gt;
    $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); &lt;br /&gt;
    $repeat{$sb}=$$jdata{result}{&#039;playlist repeat&#039;};&lt;br /&gt;
    $power{$sb}=$$jdata{result}{power};&lt;br /&gt;
    $mode{$sb}=$$jdata{result}{mode}; $noplay{$sb}=($mode{$sb}!~m/play/) || 0;&lt;br /&gt;
    $mvol{$sb}=$$jdata{result}{&#039;mixer volume&#039;};&lt;br /&gt;
    $time{$sb}=$$jdata{result}{time};&lt;br /&gt;
    if ($mode{$sb} eq &#039;play&#039;) { $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;pause&#039;] ] }); }&lt;br /&gt;
    $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;save&#039;, &amp;quot;nowplaying$sb&amp;quot;, &#039;silent:1&#039;] ] });&lt;br /&gt;
  }}&lt;br /&gt;
  # now we have the present state of the player, get ready to play the alert:&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, &#039;1&#039;] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $avol ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, &#039;0&#039;] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;clear&#039;] ] });&lt;br /&gt;
 }&lt;br /&gt;
 # replace the players-list by the list of verified connected players&lt;br /&gt;
 @players=@alive;&lt;br /&gt;
 # build the sync group, if more than one player specified&lt;br /&gt;
 $master=shift @players;&lt;br /&gt;
 foreach $sb (@players) {&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;sync&#039;, $uuids{$sb} ] ] });   &lt;br /&gt;
 }&lt;br /&gt;
 # build the temporary alert playlist&lt;br /&gt;
 if ($prechime eq &#039;none&#039;) { @play=($afile) } else { @play=($prechime, $afile) };&lt;br /&gt;
 foreach $file (@play) {&lt;br /&gt;
  $filetoplay=&amp;quot;$dir{alerts}/$file&amp;quot;;&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;playlist&#039;, &#039;add&#039;, &amp;quot;$filetoplay&amp;quot;] ] });&lt;br /&gt;
 }&lt;br /&gt;
 # now play the alert-playlist&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;play&#039;] ] });&lt;br /&gt;
 # and wait for it to stop&lt;br /&gt;
 do {&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;mode&#039;, &#039;?&#039;] ] });&lt;br /&gt;
  $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $mode=$$jdata{result}{_mode};&lt;br /&gt;
  sleep 1;&lt;br /&gt;
 } until ($mode eq &#039;stop&#039;);&lt;br /&gt;
 # ok, we are done playing so either restore the music playlist we interrupted, or power off if nothing was playing&lt;br /&gt;
 foreach $sb ($master, @players) {&lt;br /&gt;
  $playerid=$uuids{$sb}; $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;sync&#039;, &#039;-&#039; ] ] });   &lt;br /&gt;
  if ($restore{$sb}) {&lt;br /&gt;
   # Restore player to previous state&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $mvol{$sb} ] ] });&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, $repeat{$sb} ] ] });&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;resume&#039;, &amp;quot;nowplaying$sb&amp;quot;, &amp;quot;noplay:$noplay{$sb}&amp;quot; ] ] }); ;&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;time&#039;, $time{$sb} ] ] });&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, $power{$sb}] ] });&lt;br /&gt;
  }&lt;br /&gt;
  else { # no restore, just clear and power-off&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;clear&#039;] ] });&lt;br /&gt;
   $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, &#039;0&#039;] ] });&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
($players, $prechime, $ttsfile, $avol)=@ARGV;&lt;br /&gt;
@players=split(/,\s?/, $players);&lt;br /&gt;
&amp;amp;squeezeAlert( \@players, $prechime, $ttsfile, $avol );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
To test either script first (outside Domoticz), you should &#039;&#039;cd&#039;&#039; to the directory where you placed the bash script and issue the following command (assuming you have a player called &#039;&#039;livingroom&#039;&#039;, plus files called &#039;&#039;Ring06.wav&#039;&#039; and &#039;&#039;garageDoorOpen.mp3&#039;&#039; in your alerts folder - change as appropriate to your setup):&lt;br /&gt;
&lt;br /&gt;
 ./sqalert.sh livingroom Ring06.wav garageDoorOpen.mp3 60&lt;br /&gt;
&lt;br /&gt;
If that works OK and you hear the pre-chime and message, you should then be good to go to use the script within Domoticz. If you have issues getting the remote (&#039;&#039;ssh&#039;&#039;) scripting working, you can first verify that the remote-login keys are working by typing&lt;br /&gt;
&lt;br /&gt;
 ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy&lt;br /&gt;
&lt;br /&gt;
from the command line on the &#039;&#039;local&#039;&#039; machine. If it works then you will just silently receive a terminal-prompt from the remote machine (you might have to accept the remote machine as trusted the first time this is done - just go ahead and do it). If it doesn&#039;t work then check the permissions (not higher than 600 on the keyfiles!) and check that the keyfiles are in the home directory for the correct user (are you going to run Domoticz as root, pi, another user... ?). At a minimum, you should already be able to login via ssh to the remote machine using a username and password - if that&#039;s not working then this certainly won&#039;t work (e.g. check port 22 open, check that the &#039;&#039;ssh&#039;&#039; service is started).&lt;br /&gt;
&lt;br /&gt;
==Using Ambient Light Sensor in SB-Radio and SB-Touch ==&lt;br /&gt;
&lt;br /&gt;
Both the SB Radio and SB Touch have an internal sensor to detect the ambient light level and dim the display when the room is darker or to brighten it when it&#039;s light. It&#039;s possible to install a background-running script on the player that will regularly update Domoticz with this measured light level (don&#039;t worry - it still operates when the player is in standby). This only works meaningfully for a player located in a normally-dark room such as a bathroom with no windows. It can then be used to check if the bathroom is occupied because the light will usually be on when somebody is in there. Use this info e.g. to change the colour of a Hue lamp downstairs so you know when the toilet is occupied upstairs, to start a ventilator if the light in the bathroom is on for a while, or even to autoplay music on the player when somebody turns on the light in the room.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
First of all, you should enable &#039;&#039;ssh&#039;&#039; login on the SB in question. On the player&#039;s own UI, go to:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;Settings --&amp;gt; Advanced --&amp;gt; Remote Login&#039;&#039; and make sure &#039;&#039;Enable SSH&#039;&#039; is ticked/selected.&lt;br /&gt;
&lt;br /&gt;
Now use a program such as &#039;&#039;putty&#039;&#039; or &#039;&#039;smarTTY&#039;&#039; to ssh into the player, using username &#039;&#039;root&#039;&#039; and default password &#039;&#039;1234&#039;&#039;. This will log you into the &#039;&#039;/root&#039;&#039; home directory on the SB. IF you have problems with ssh, try &#039;&#039;ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c 3des-cbc root@192.168.XXX.XXX&#039;&#039; instead. Use smarTTY or a program like Cyberduck to upload the following shell script to that /root directory. Call this file &#039;&#039;domosb.sh&#039;&#039; and make sure you have Unix file-endings in it (LF) if you copy/paste from here. When it&#039;s copied to the SB, don&#039;t forget to &#039;&#039;chmod +x&#039;&#039; to make it executable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # script to read the ambient light sensor on a Squeezebox Radio or Touch and send the data to Domoticz&lt;br /&gt;
 # it returns a value of 100000 in near darkness and a value of typically ~100-500 when illuminated&lt;br /&gt;
 &lt;br /&gt;
 # Author: philchillbill, 2017. Inspired by https://github.com/luebbers/bathroomd&lt;br /&gt;
 # Improved: Robert Lagus 2018 with logic checker for near darkness values&lt;br /&gt;
 &lt;br /&gt;
 DOMO=&amp;quot;192.168.XXX.XXX:8080&amp;quot; 	# IP and port of your Domoticz instance&lt;br /&gt;
 PLAYER=&amp;quot;Smart%20Radio&amp;quot; 	# Name of the player to appear in the Domoticz log (URI encoded)&lt;br /&gt;
 LEVEL=XX			# idx of the Domoticz &#039;lux&#039; device to update with the ambient light level&lt;br /&gt;
 SWITCH=XX			# idx of the on/off switch used to indicate presence&lt;br /&gt;
 &lt;br /&gt;
 # for the SB Radio use this as the path to the SENSOR data&lt;br /&gt;
 SENSOR=&amp;quot;/sys/class/i2c-adapter/i2c-1/1-0010/ambient&amp;quot;&lt;br /&gt;
 # Note: for the SB Touch use the following instead &lt;br /&gt;
 # SENSOR=&amp;quot;/sys/class/i2c-adapter/i2c-0/0-0039/lux&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # say Hello World to the Domoticz Log after waiting a bit for network to be up&lt;br /&gt;
 sleep 20&lt;br /&gt;
 wget -O /dev/null -q &amp;quot;http://&amp;quot;$DOMO&amp;quot;/json.htm?type=command&amp;amp;param=addlogmessage&amp;amp;message=SB%20&amp;quot;$PLAYER&amp;quot;%20commenced%20ambient%20light%20monitoring.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # read out the sensor every 2 seconds in an infinite loop&lt;br /&gt;
 # we only update Domoticz when a meaningful change in Lux occurs (but at least once every 30 minutes to keep the sensor active)&lt;br /&gt;
 PREV=0; LOOPS=0; SET=0&lt;br /&gt;
 while /bin/true; do&lt;br /&gt;
  LOOPS=$(( $LOOPS + 1 )); if [ &amp;quot;$LOOPS&amp;quot; -gt 1000000 ]; then LOOPS=0; fi&lt;br /&gt;
  VAL=`cat $SENSOR | tr -d &amp;quot;\n&amp;quot;`&lt;br /&gt;
  if [ &amp;quot;$VAL&amp;quot; -gt 90000 ]; then&lt;br /&gt;
    VAL=0&lt;br /&gt;
  fi&lt;br /&gt;
  DELTA=$(($VAL - $PREV))&lt;br /&gt;
  if [ &amp;quot;$DELTA&amp;quot; -ge 0 ]; then&lt;br /&gt;
   STEP=$DELTA&lt;br /&gt;
  else				&lt;br /&gt;
   STEP=$((0 - $DELTA))	# step is the absolute-value of the delta in lux&lt;br /&gt;
  fi &lt;br /&gt;
  # this updates the sensor-level value shown in the Domoticz &#039;Lux&#039; meter&lt;br /&gt;
  if [ &amp;quot;$STEP&amp;quot; -gt 20 ] || [ $(($LOOPS % 900)) -eq 0 ]; then&lt;br /&gt;
   wget -O /dev/null -q &amp;quot;http://&amp;quot;$DOMO&amp;quot;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=&amp;quot;$LEVEL&amp;quot;&amp;amp;svalue=&amp;quot;$VAL&amp;quot;&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  # this sets the on/off switch in Domoticz, with a little hysteresis to prevent the switch &#039;chattering&#039;&lt;br /&gt;
  if [ &amp;quot;$VAL&amp;quot; -lt 400 ] &amp;amp;&amp;amp; [ &amp;quot;$SET&amp;quot; -eq 0 ]; then&lt;br /&gt;
   wget -O /dev/null -q &amp;quot;http://&amp;quot;$DOMO&amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot;$SWITCH&amp;quot;&amp;amp;switchcmd=On&amp;quot;&lt;br /&gt;
   SET=1&lt;br /&gt;
  else&lt;br /&gt;
   if [ &amp;quot;$VAL&amp;quot; -gt 500 ] &amp;amp;&amp;amp; [ &amp;quot;$SET&amp;quot; -eq 1 ]; then&lt;br /&gt;
    wget -O /dev/null -q &amp;quot;http://&amp;quot;$DOMO&amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot;$SWITCH&amp;quot;&amp;amp;switchcmd=Off&amp;quot;&lt;br /&gt;
    SET=0&lt;br /&gt;
   fi&lt;br /&gt;
  fi&lt;br /&gt;
  PREV=$VAL&lt;br /&gt;
  sleep 2&lt;br /&gt;
#  echo $VAL &amp;quot;=VAL&amp;quot; &lt;br /&gt;
#  echo $STEP &amp;quot;=STEP&amp;quot;&lt;br /&gt;
#  echo $DELTA &amp;quot;=DELTA&amp;quot;&lt;br /&gt;
#  echo $PREV &amp;quot;=PREV&amp;quot;&lt;br /&gt;
#  echo $LOOPS &amp;quot;=LOOPS&amp;quot;&lt;br /&gt;
#  echo &amp;quot; &amp;quot;&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;i2c&#039;&#039; sensor in the SB-Radio produces a value of 100,000 in (almost) darkness and a value of ~100 - ~500 when the lights in the room are on. This script makes sure that Domoticz only gets updated if there is a meaningful change in light level (&amp;gt;20) to mask tiny fluctuations and keep network traffic down. It sends something at least every 30 minutes just to make sure Domoticz doesn&#039;t mark it as an offline sensor if it hears nothing for too long.&lt;br /&gt;
&lt;br /&gt;
===Testing===&lt;br /&gt;
After transferring the script into the /root folder on the SB you can play around with it first interactively (command: &#039;&#039;./domosb.sh&#039;&#039;) to make sure you got it all set up right and also that the thresholds work for you. I created a &#039;&#039;Lux&#039;&#039; sensor-type in Domoticz (via &#039;&#039;Setup--&amp;gt;Hardware--&amp;gt;Dummy--&amp;gt;Create Virtual Sensors&#039;&#039;) to display the raw sensor data (in the example above it had an idx of LEVEL) and also an on/off switch (with idx of SWITCH) to act as a toggled occupancy-sensor. When you are satisfied that the script works OK you can get it to autostart upon booting of the SB by adding a line to the very end of the &#039;&#039;/etc/init.d/rcS&#039;&#039; file (vi was the only editor on my SB - there was no nano editor).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Add the following to the very end of the file &#039;/etc/init.d/rcS&#039;:&lt;br /&gt;
&lt;br /&gt;
 # Start Domoticz Script&lt;br /&gt;
 echo &amp;quot;Starting Domoticz script&amp;quot;&lt;br /&gt;
 /root/domosb.sh &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget that &#039;&#039;&amp;amp;&#039;&#039; at the end or it won&#039;t run in the background. The load of running this script makes the SB user interface a tiny bit laggy but does not affect audio playback. You can type &#039;&#039;reboot&#039;&#039; to restart the player and get the script auto-running. Of course the data produced by this script is not really a lux value (due to the inversion and high non-linearity) but for our purposes here that&#039;s irrelevant.&lt;br /&gt;
&lt;br /&gt;
==Transfer Playlist Among Players==&lt;br /&gt;
&lt;br /&gt;
As you move around a house with multiple Squeezebox players, it can be useful to transfer the parameters of the currently-playing player (in a room you are about to leave, for example) to a player in a room you are about to go to. For example, you were listening to music on the SB-Touch in the livingroom and now you&#039;re going to take a shower so you want to transfer to the SB-Radio in the bathroom. The following script achieves that by saving the state of the &#039;&#039;source&#039;&#039; player and restoring those parameters to the &#039;&#039;target&#039;&#039; player before powering off the source. If the source player was not playing anything at that time then nothing happens because there&#039;s nothing to transfer. The volume-level and repeat-mode of the source are also transferred to the target. This script can be used e.g. with Alexa/HA-Bridge or it can be linked to a Domoticz switch-event such as an occupancy-sensor.&lt;br /&gt;
&lt;br /&gt;
In the on-action / off-action fields of a Domoticz switch, you can use a construct along the lines of&lt;br /&gt;
&lt;br /&gt;
 script://sqxfer.sh livingroom bathroom&lt;br /&gt;
 script://sqxfer.sh kitchen livingroom&lt;br /&gt;
&lt;br /&gt;
If it doesn&#039;t work for you, try specifying the full path to the bash file with a triple-slash&lt;br /&gt;
&lt;br /&gt;
 script:///home/pi/domoticz/scripts/sqxfer.sh livingroom bathroom&lt;br /&gt;
&lt;br /&gt;
=== Setup Considerations ===&lt;br /&gt;
&lt;br /&gt;
With all the perl scripts in this LMS wiki, some modules from &#039;&#039;CPAN&#039;&#039; (Comprehensive Perl Archive Network) need to be installed. This is no problem on Linux and on Windows, but is a major problem on Synology NAS devices which have a rather stripped-down Linux under the hood with no build environment. There is a simple workaround for this using remote scripting, but let&#039;s first get something clear about where/what needs to be installed. When any one of the perl scripts here are active, 3 different pieces of software are ultimately involved:&lt;br /&gt;
&lt;br /&gt;
 1. LMS server software&lt;br /&gt;
 2. Domoticz&lt;br /&gt;
 3. Our perl script(s)&lt;br /&gt;
&lt;br /&gt;
These 3 can all run on the same computer but they can also be run on 3 &#039;&#039;different&#039;&#039; computers with no problems whatsoever. Synology users can run both LMS and Domoticz e.g. on their Synology, but run the perl script(s) on a separate perl-friendly machine such as a spare RPi. This is possible because we can get a Domoticz on/off action to run a script on a remote machine by using &#039;&#039;ssh&#039;&#039; (explained below) with &#039;&#039;Public-Key Authentication&#039;&#039;. You also only need &#039;&#039;&#039;one&#039;&#039;&#039; instance of Domoticz running, so if you are using a separate machine for the perl-scripts then it does &#039;&#039;not&#039;&#039; need to have a slave Domoticz instance installed on it. Please keep this in mind when deciding on what machine(s) to run these packages. Also note that the &#039;&#039;ssh&#039;&#039; remote-scripting option is only needed when the perl-script is remote to the Domoticz machine - it doesn&#039;t matter if LMS is remote or not.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
First make sure perl is installed (it very likely is on a linux-based OS) and then install the 2 modules from CPAN that we need:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo cpan install JSON::RPC::Client&lt;br /&gt;
 sudo cpan install JSON::XS&lt;br /&gt;
&lt;br /&gt;
Create a bash script called &#039;&#039;sqxfer.sh&#039;&#039; with the following content. Substitute the &#039;&#039;.../domoticz/scripts&#039;&#039; for the path to the directory that Domoticz accesses by default when you use the &#039;&#039;on/off actions&#039;&#039; for a switch (on a pi that would nominally be &#039;&#039;/home/pi/domoticz/scripts&#039;&#039;, on Synology &#039;&#039;/volume1/homes/USERNAME/domoticz/scripts&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
/usr/bin/perl .../domoticz/scripts/sqxfer.pl $1 $2 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put it in that &#039;&#039;.../domoticz/scripts&#039;&#039; directory on whichever machine in your setup runs Domoticz and of course do a &#039;&#039;chmod +x&#039;&#039; afterwards.&lt;br /&gt;
&lt;br /&gt;
If you are using the remote script option (i.e. Domoticz and perl-script on separate machines), use this version of &#039;&#039;sqxfer.sh&#039;&#039; instead (&#039;&#039;note&#039;&#039;: it is still installed in the .../domoticz/scripts directory on the &#039;&#039;local&#039;&#039; machine running Domoticz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy /usr/bin/perl /path/to/remote/scriptdir/sqxfer.pl $1 $2 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 192.168.xxx.yyy is the IP address of the remote machine that the perl script will actually run on, the &#039;&#039;-p&#039;&#039; specifies the port to use for ssh on the remote machine (usually 22), &#039;&#039;privatekey&#039;&#039; is the keyfile in the local ~/.ssh directory (on the Domoticz machine) allowing ssh login to the remote machine without specifying a password, and &#039;&#039;/path/to/remote/scriptdir&#039;&#039; is the arbitrary path to the directory your perl scripts are stored in on that remote machine.&lt;br /&gt;
&lt;br /&gt;
If you plan on using the remote-scripting option and you haven&#039;t already set up &#039;&#039;ssh&#039;&#039; for non-interactive login on the target/remote machine, use the command &#039;&#039;ssh-keygen -t rsa&#039;&#039; to generate the two files with public/private keys and put the &#039;&#039;public&#039;&#039; key in the ~/.ssh directory on the target/remote machine and the &#039;&#039;private&#039;&#039; key in ~/.ssh on the local machine where Domoticz is running. You will also have to do  a &#039;&#039;chmod 700&#039;&#039; on the ~/.ssh directory itself and &#039;&#039;chmod 600&#039;&#039; on the key files themselves or it won&#039;t work.&lt;br /&gt;
&lt;br /&gt;
Next, create a perl script called &#039;&#039;sqxfer.pl&#039;&#039; in the directory/machine pointed to by the path you just used in the bash script, with the following content (and do a &#039;&#039;chmod +x&#039;&#039; afterwards). If you are using the remote-script option, the file is placed in the /path/to/remote/scriptdir directory on the remote machine. &#039;&#039;&#039;Note:&#039;&#039;&#039; You will need to edit the parameters for player-mac&#039;s and the URL of your LMS instance after creating this script (all parameters are case-sensitive too):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use JSON::RPC::Client;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
 &lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# Transfers a playlist from one squeezebox player (&#039;source&#039;) to another (&#039;target&#039;) while maintaining current song and time-position within that song.&lt;br /&gt;
# The volume level and repeat-mode from the source player are also transferred to the target.&lt;br /&gt;
&lt;br /&gt;
# Author: philchillbill, 2018&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
# Edit the following parameters to suit your setup:&lt;br /&gt;
&lt;br /&gt;
# The mac addresses for all the squeezebox players in your setup&lt;br /&gt;
%uuids = (&lt;br /&gt;
 kitchen =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 livingroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 bathroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The URL for the LMS server instance, usually on port 9000 or 9002&lt;br /&gt;
%url = (&lt;br /&gt;
 lms =&amp;gt; &#039;http://192.168.1.3:9002/jsonrpc.js&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
($source, $target)=@ARGV;&lt;br /&gt;
&lt;br /&gt;
$client=new JSON::RPC::Client;&lt;br /&gt;
$playerid=$uuids{$source};&lt;br /&gt;
&lt;br /&gt;
# First make sure that an alert isn&#039;t by chance playing at the moment of transfer (pity to transfer that)&lt;br /&gt;
do {&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;path&#039;, &#039;?&#039;] ] });&lt;br /&gt;
 if (!$res) { print &amp;quot;Source player inactive, exiting.\n&amp;quot; ; exit };&lt;br /&gt;
 $jres=$res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $path=$$jdata{result}{_path} || &#039;empty&#039;;&lt;br /&gt;
 $cnt++; $forced=($cnt==30) || 0;&lt;br /&gt;
} until ( ($path!~m/alerts/) || ($forced) );&lt;br /&gt;
&lt;br /&gt;
# Get the source player&#039;s present state so it can be transferred, then power it off&lt;br /&gt;
$res = ( $client-&amp;gt;call( $url{lms}, { method  =&amp;gt; &#039;slim.request&#039;, params  =&amp;gt; [ $playerid, [&#039;status&#039;, &#039;-&#039;, &#039;1&#039;, &#039;tags&#039; ] ] }) ) || 0;&lt;br /&gt;
if (!$res) { print &amp;quot;Source player inactive, exiting.\n&amp;quot; ; exit };&lt;br /&gt;
$jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres);&lt;br /&gt;
$power=$$jdata{result}{power}; if ($power==0) { print &amp;quot;Source player inactive, exiting.\n&amp;quot; ; exit };&lt;br /&gt;
$curvol=$$jdata{result}{&#039;mixer volume&#039;};&lt;br /&gt;
$repeat=$$jdata{result}{&#039;playlist repeat&#039;};&lt;br /&gt;
$time=$$jdata{result}{time};&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;save&#039;, &amp;quot;transfer&amp;quot;, &#039;silent:1&#039;] ] });&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, 0 ] ] });&lt;br /&gt;
&lt;br /&gt;
# now setup the target player and get it playing&lt;br /&gt;
$playerid=$uuids{$target};&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;power&#039;, &#039;1&#039;] ] });&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $curvol ] ] });&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, $repeat] ] });&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;resume&#039;, &amp;quot;transfer&amp;quot;, &amp;quot;wipePlaylist:1&amp;quot; ] ] });&lt;br /&gt;
$res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;time&#039;, $time ] ] });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the temporary playlist generated from the source for restoring on the target is automatically deleted upon transfer due to the &#039;&#039;wipePlaylist:1&#039;&#039; in the code.&lt;br /&gt;
&lt;br /&gt;
===Testing===&lt;br /&gt;
To test the script first outside Domoticz, &#039;&#039;cd&#039;&#039; to the directory where you placed the bash script and issue the following command (assuming you have players called &#039;&#039;kitchen&#039;&#039; and &#039;&#039;livingroom&#039;&#039; - change as appropriate to your setup). Make sure something is also actually playing on the &#039;&#039;source&#039;&#039; player or the script will just quietly exit.&lt;br /&gt;
&lt;br /&gt;
 ./sqxfer.sh kitchen livingroom&lt;br /&gt;
&lt;br /&gt;
The song playing on &#039;&#039;kitchen&#039;&#039; should transfer to &#039;&#039;livingroom&#039;&#039; at exactly the same moment in the same song and then power off &#039;&#039;kitchen&#039;&#039; for you. Note that the script will wait for an alert (see section 6 above) to finish playing if one accidentally commences just as you requested the transfer. If you have issues getting the remote (&#039;&#039;ssh&#039;&#039;) scripting working, you can first verify that the remote-login keys are working by typing&lt;br /&gt;
&lt;br /&gt;
 ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy&lt;br /&gt;
&lt;br /&gt;
from the command line on the &#039;&#039;local&#039;&#039; machine. If it works then you will just silently receive a terminal-prompt from the remote machine (you might have to accept the remote machine as trusted the first time this is done - just go ahead and do it). If it doesn&#039;t work then check the permissions (not higher than 600 on the keyfiles!) and check that the keyfiles are in the home directory for the correct user (are you going to run Domoticz as root, pi, another user... ?). At a minimum, you should already be able to login via ssh to the remote machine using a username and password - if that&#039;s not working then this certainly won&#039;t work (e.g. check port 22 open, check that the &#039;&#039;ssh&#039;&#039; service is started).&lt;br /&gt;
&lt;br /&gt;
==Sync/Unsync a Group of Players from Domoticz==&lt;br /&gt;
&lt;br /&gt;
A cool feature of Squeezeboxes is their ability to play multi-room synchronised music, whereby a group of players all plays the same song at the exact same timestamp. The web UI for LMS allows assembling and disassembling groups, as does e.g. the iPeng app. However, the concept really flies when you can assemble and disassemble sync-groups at the flick of a switch. &lt;br /&gt;
This script can be used e.g. with Alexa/HA-Bridge or it can be linked to a bunch of Domoticz switches that setup different groups for you for different purposes. We need to first provide a &#039;&#039;sync&#039;&#039; or &#039;&#039;unsync&#039;&#039; parameter, next define a player as &#039;&#039;master&#039;&#039;, and finally list the other players in the group that will become &#039;&#039;slaves&#039;&#039;. If only one slave is involved, no quotes are needed around the slave-name. If multiple slaves are desired then place names in quotes and separate with commas (see example). When done, anything that happens on the master is mirrored on the slaves.&lt;br /&gt;
&lt;br /&gt;
In the on-action / off-action fields of a Domoticz switch, you can use a construct along the lines of&lt;br /&gt;
&lt;br /&gt;
 script://sqsync.sh sync livingroom &amp;quot;kitchen, studio, office&amp;quot;&lt;br /&gt;
 script://sqsync.sh sync livingroom bedroom&lt;br /&gt;
 script://sqsync.sh unsync kitchen &amp;quot;livingroom, bedroom&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If it doesn&#039;t work for you, try specifying the full path to the bash file with a triple-slash&lt;br /&gt;
&lt;br /&gt;
 script:///home/pi/domoticz/scripts/sqsync.sh sync livingroom bedroom&lt;br /&gt;
&lt;br /&gt;
=== Setup Considerations ===&lt;br /&gt;
&lt;br /&gt;
With all the perl scripts in this LMS wiki, some modules from &#039;&#039;CPAN&#039;&#039; (Comprehensive Perl Archive Network) need to be installed. This is no problem on Linux and on Windows, but is a major problem on Synology NAS devices which have a rather stripped-down Linux under the hood with no build environment. There is a simple workaround for this using remote scripting, but let&#039;s first get something clear about where/what needs to be installed. When any one of the perl scripts here are active, 3 different pieces of software are ultimately involved:&lt;br /&gt;
&lt;br /&gt;
 1. LMS server software&lt;br /&gt;
 2. Domoticz&lt;br /&gt;
 3. Our perl script(s)&lt;br /&gt;
&lt;br /&gt;
These 3 can all run on the same computer but they can also be run on 3 &#039;&#039;different&#039;&#039; computers with no problems whatsoever. Synology users can run both LMS and Domoticz e.g. on their Synology, but run the perl script(s) on a separate perl-friendly machine such as a spare RPi. This is possible because we can get a Domoticz on/off action to run a script on a remote machine by using &#039;&#039;ssh&#039;&#039; (explained below) with &#039;&#039;Public-Key Authentication&#039;&#039;. You also only need &#039;&#039;&#039;one&#039;&#039;&#039; instance of Domoticz running, so if you are using a separate machine for the perl-scripts then it does &#039;&#039;not&#039;&#039; need to have a slave Domoticz instance installed on it. Please keep this in mind when deciding on what machine(s) to run these packages. Also note that the &#039;&#039;ssh&#039;&#039; remote-scripting option is only needed when the perl-script is remote to the Domoticz machine - it doesn&#039;t matter if LMS is remote or not.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
First make sure perl is installed (it very likely is on a linux-based OS) and then install the 2 modules from CPAN that we need:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo cpan install JSON::RPC::Client&lt;br /&gt;
 sudo cpan install JSON::XS&lt;br /&gt;
&lt;br /&gt;
Create a bash script called &#039;&#039;sqsync.sh&#039;&#039; with the following content. Substitute the &#039;&#039;.../domoticz/scripts&#039;&#039; for the path to the directory that Domoticz accesses by default when you use the &#039;&#039;on/off actions&#039;&#039; for a switch (on a pi that would nominally be &#039;&#039;/home/pi/domoticz/scripts&#039;&#039;, on Synology &#039;&#039;/volume1/homes/USERNAME/domoticz/scripts&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
/usr/bin/perl .../domoticz/scripts/sqsync.pl $1 $2 $3 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put it in that &#039;&#039;.../domoticz/scripts&#039;&#039; directory on whichever machine in your setup runs Domoticz and of course do a &#039;&#039;chmod +x&#039;&#039; afterwards.&lt;br /&gt;
&lt;br /&gt;
If you are using the remote script option (i.e. Domoticz and perl-script on separate machines), use this version of &#039;&#039;sqsync.sh&#039;&#039; instead (&#039;&#039;note&#039;&#039;: it is still installed in the .../domoticz/scripts directory on the &#039;&#039;local&#039;&#039; machine running Domoticz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy /usr/bin/perl /path/to/remote/scriptdir/sqsync.pl $1 $2 $3 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 192.168.xxx.yyy is the IP address of the remote machine that the perl script will actually run on, the &#039;&#039;-p&#039;&#039; specifies the port to use for ssh on the remote machine (usually 22), &#039;&#039;privatekey&#039;&#039; is the keyfile in the local ~/.ssh directory (on the Domoticz machine) allowing ssh login to the remote machine without specifying a password, and &#039;&#039;/path/to/remote/scriptdir&#039;&#039; is the arbitrary path to the directory your perl scripts are stored in on that remote machine.&lt;br /&gt;
&lt;br /&gt;
If you plan on using the remote-scripting option and you haven&#039;t already set up &#039;&#039;ssh&#039;&#039; for non-interactive login on the target/remote machine, use the command &#039;&#039;ssh-keygen -t rsa&#039;&#039; to generate the two files with public/private keys and put the &#039;&#039;public&#039;&#039; key in the ~/.ssh directory on the target/remote machine and the &#039;&#039;private&#039;&#039; key in ~/.ssh on the local machine where Domoticz is running. You will also have to do  a &#039;&#039;chmod 700&#039;&#039; on the ~/.ssh directory itself and &#039;&#039;chmod 600&#039;&#039; on the key files themselves or it won&#039;t work.&lt;br /&gt;
&lt;br /&gt;
Next, create a perl script called &#039;&#039;sqsync.pl&#039;&#039; in the directory/machine pointed to by the path you just used in the bash script, with the following content (and do a &#039;&#039;chmod +x&#039;&#039; afterwards). If you are using the remote-script option, the file is placed in the /path/to/remote/scriptdir directory on the remote machine. &#039;&#039;&#039;Note:&#039;&#039;&#039; You will need to edit the parameters for player-mac&#039;s and the URL of your LMS instance after creating this script (all parameters are case-sensitive too):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use JSON::RPC::Client;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
# Syncs or unsyncs a group of Squeezebox players in one operation&lt;br /&gt;
# The first parameter should be either &#039;sync&#039; or &#039;unsync&#039;.&lt;br /&gt;
# Next parameter is the master player name&lt;br /&gt;
# Finally, a comma-separated list of slave players to join/leave the sync-group, in quotes&lt;br /&gt;
&lt;br /&gt;
# Author: philchillbill, 2018&lt;br /&gt;
&lt;br /&gt;
# Edit the following parameters to suit your setup:&lt;br /&gt;
&lt;br /&gt;
# The mac addresses of all the squeezebox players in your setup&lt;br /&gt;
%uuids = (&lt;br /&gt;
 kitchen =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 livingroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 bathroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The URL for the LMS server instance, usually on port 9000 or 9002&lt;br /&gt;
%url = (&lt;br /&gt;
 lms =&amp;gt; &#039;http://192.168.1.3:9002/jsonrpc.js&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
($action, $master, $slaves)=@ARGV;&lt;br /&gt;
@slaves=split(/,\s?/, $slaves);&lt;br /&gt;
&lt;br /&gt;
$client=new JSON::RPC::Client;&lt;br /&gt;
&lt;br /&gt;
if (lc $action eq &#039;sync&#039;) { &lt;br /&gt;
 $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;power&#039;, &#039;1&#039; ] ] });&lt;br /&gt;
 foreach $player (@slaves) {&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$player}, [&#039;power&#039;, &#039;1&#039; ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;sync&#039;, $uuids{$player} ] ] });   &lt;br /&gt;
 }&lt;br /&gt;
 $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$master}, [&#039;play&#039;] ] });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (lc $action eq &#039;unsync&#039;) { &lt;br /&gt;
 &lt;br /&gt;
 foreach $player ($master, @slaves) {&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$player}, [&#039;pause&#039;] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$player}, [&#039;sync&#039;, &#039;-&#039; ] ] });&lt;br /&gt;
  $res = $client-&amp;gt;call($url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $uuids{$player}, [&#039;power&#039;, &#039;0&#039; ] ] });&lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing===&lt;br /&gt;
To test the script first outside Domoticz, &#039;&#039;cd&#039;&#039; to the directory where you placed the bash script and issue the following command (assuming you have players called &#039;&#039;livingroom&#039;&#039; and &#039;&#039;kitchen&#039;&#039; - change as appropriate to your setup).&lt;br /&gt;
&lt;br /&gt;
 ./sqsync.sh sync livingroom kitchen&lt;br /&gt;
&lt;br /&gt;
Both the &#039;&#039;livingroom&#039;&#039; and &#039;&#039;kitchen&#039;&#039; players should now start playing in sync, with whatever was playing before on the master (here, &#039;&#039;livingroom&#039;&#039;) also playing on the slave: &#039;&#039;kitchen&#039;&#039;. It does not matter if livingroom was already playing or not as it will just start playing if it wasn&#039;t. Next, try&lt;br /&gt;
&lt;br /&gt;
 ./sqsync.sh unsync livingroom kitchen&lt;br /&gt;
&lt;br /&gt;
and both players will pause, unsync and finally power-off. If you have issues getting the remote (&#039;&#039;ssh&#039;&#039;) scripting working, you can first verify that the remote-login keys are working by typing&lt;br /&gt;
&lt;br /&gt;
 ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy&lt;br /&gt;
&lt;br /&gt;
from the command line on the &#039;&#039;local&#039;&#039; machine. If it works then you will just silently receive a terminal-prompt from the remote machine (you might have to accept the remote machine as trusted the first time this is done - just go ahead and do it). If it doesn&#039;t work then check the permissions (not higher than 600 on the keyfiles!) and check that the keyfiles are in the home directory for the correct user (are you going to run Domoticz as root, pi, another user... ?). At a minimum, you should already be able to login via ssh to the remote machine using a username and password - if that&#039;s not working then this certainly won&#039;t work (e.g. check port 22 open, check that the &#039;&#039;ssh&#039;&#039; service is started).&lt;br /&gt;
&lt;br /&gt;
==Spoken &#039;&#039;Now-Playing&#039;&#039; using Amazon Polly TTS==&lt;br /&gt;
&lt;br /&gt;
The following perl script allows your Squeezebox players to literally tell you what song is currently playing using a female English-language voice. It queries all active players in your system for their currently-playing &#039;&#039;artist&#039;&#039; and &#039;&#039;title&#039;&#039; information and sends this off to the &#039;&#039;Amazon Polly&#039;&#039; TTS (Text-to-Speech) cloud service to generate mp3 files containing each player&#039;s artist/title information in spoken form. Just as with the &#039;&#039;audio-alerts&#039;&#039; script above, the current song is temporarily paused, the TTS information mp3 is played audibly on each active player, and the player(s) then resume playing as they were before the query, with the temporary mp3 being deleted when finished. Kicking it off can be linked e.g. to a Domoticz switch event or to HA-Bridge so that you can ask Alexa to tell you what&#039;s currently playing (although Alexa won&#039;t answer - her sister Polly will answer through your Squeezebox rather than through the Echo). The following example video demonstrates the principle via a command &#039;Tell Me&#039; through Alexa to HA-Bridge to a Domoticz switch:&lt;br /&gt;
&lt;br /&gt;
 [https://youtu.be/NxqP8lu8LnA Youtube Video showing sqnowplaying.pl in action]&lt;br /&gt;
&lt;br /&gt;
Amazon reserves the utterance &#039;&#039;Now Playing&#039;&#039; for music played via Alexa herself so that&#039;s why I chose &#039;Tell Me&#039; as the utterance, but you can use whatever you like that&#039;s not reserved. After you have re-created all this in your own setup, in the on-action / off-action fields of a Domoticz switch, you can use&lt;br /&gt;
&lt;br /&gt;
 script://sqnowplaying.sh&lt;br /&gt;
&lt;br /&gt;
If it doesn&#039;t work for you, try specifying the full path to the bash file with a triple-slash, e.g.&lt;br /&gt;
&lt;br /&gt;
 script:///home/pi/domoticz/scripts/sqnowplaying.sh&lt;br /&gt;
&lt;br /&gt;
=== Setup Considerations ===&lt;br /&gt;
&lt;br /&gt;
With all the perl scripts in this LMS wiki, some modules from &#039;&#039;CPAN&#039;&#039; (Comprehensive Perl Archive Network) need to be installed. This is no problem on Linux and on Windows, but is a major problem on Synology NAS devices which have a rather stripped-down Linux under the hood with no build environment. There is a simple workaround for this using remote scripting, but let&#039;s first get something clear about where/what needs to be installed. When any one of the perl scripts here are active, 3 different pieces of software are ultimately involved:&lt;br /&gt;
&lt;br /&gt;
 1. LMS server software&lt;br /&gt;
 2. Domoticz&lt;br /&gt;
 3. Our perl script(s)&lt;br /&gt;
&lt;br /&gt;
These 3 can all run on the same computer but they can also be run on 3 &#039;&#039;different&#039;&#039; computers with no problems whatsoever. Synology users can run both LMS and Domoticz e.g. on their Synology, but run the perl script(s) on a separate perl-friendly machine such as a spare RPi. This is possible because we can get a Domoticz on/off action to run a script on a remote machine by using &#039;&#039;ssh&#039;&#039; (explained below) with &#039;&#039;Public-Key Authentication&#039;&#039;. You also only need &#039;&#039;&#039;one&#039;&#039;&#039; instance of Domoticz running, so if you are using a separate machine for the perl-scripts then it does &#039;&#039;not&#039;&#039; need to have a slave Domoticz instance installed on it. Please keep this in mind when deciding on what machine(s) to run these packages. Also note that the &#039;&#039;ssh&#039;&#039; remote-scripting option is only needed when the perl-script is remote to the Domoticz machine - it doesn&#039;t matter if LMS is remote or not.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
&lt;br /&gt;
First of all, you will need a (free) account with the AWS Amazon Polly service because you need to provide login details for the perl script (&#039;&#039;AWS_ACCESS_KEY&#039;&#039; and &#039;&#039;AWS_SECRET_KEY&#039;&#039;). The following &#039;&#039;Getting Started&#039;&#039; article will guide you through that process:&lt;br /&gt;
&lt;br /&gt;
 [https://docs.aws.amazon.com/polly/latest/dg/getting-started.html Getting started with AWS Polly]&lt;br /&gt;
&lt;br /&gt;
Next, make sure perl is installed (it very likely is on a linux-based OS) and then install the 4 modules from CPAN that we need:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo cpan install Parallel::Loops&lt;br /&gt;
 sudo cpan install JSON::RPC::Client&lt;br /&gt;
 sudo cpan install JSON::XS&lt;br /&gt;
&lt;br /&gt;
Because our heavy-lifter &#039;&#039;Paws::Polly&#039;&#039; has a lot of dependencies, it&#039;s best to install it via &#039;&#039;cpanminus&#039;&#039; which you should install first if you don&#039;t have it already:&lt;br /&gt;
&lt;br /&gt;
 curl -L http://cpanmin.us | perl - --sudo App::cpanminus&lt;br /&gt;
 sudo cpanm install Paws::Polly&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Warning:&#039;&#039; Installing Paws:Polly will take a &#039;&#039;long&#039;&#039; time (139 dependencies) so be patient and let it finish its course.&lt;br /&gt;
&lt;br /&gt;
Now create a bash script called &#039;&#039;sqnowplaying.sh&#039;&#039; with the following content. Substitute the &#039;&#039;.../domoticz/scripts&#039;&#039; for the path to the directory that Domoticz accesses by default when you use the &#039;&#039;on/off actions&#039;&#039; for a switch (on a pi that would nominally be &#039;&#039;/home/pi/domoticz/scripts&#039;&#039;, on Synology &#039;&#039;/volume1/homes/USERNAME/domoticz/scripts&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
/usr/bin/perl .../domoticz/scripts/sqnowplaying.pl &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put it in that &#039;&#039;.../domoticz/scripts&#039;&#039; directory on whichever machine in your setup runs Domoticz and of course do a &#039;&#039;chmod +x&#039;&#039; afterwards.&lt;br /&gt;
&lt;br /&gt;
If you are using the remote script option (i.e. Domoticz and perl-script on separate machines), use this version of &#039;&#039;sqnowplaying.sh&#039;&#039; instead (&#039;&#039;note&#039;&#039;: it is still installed in the .../domoticz/scripts directory on the &#039;&#039;local&#039;&#039; machine running Domoticz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy /usr/bin/perl /path/to/remote/scriptdir/sqnowplaying.pl &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where 192.168.xxx.yyy is the IP address of the remote machine that the perl script will actually run on, the &#039;&#039;-p&#039;&#039; specifies the port to use for ssh on the remote machine (usually 22), &#039;&#039;privatekey&#039;&#039; is the keyfile in the local ~/.ssh directory (on the Domoticz machine) allowing ssh login to the remote machine without specifying a password, and &#039;&#039;/path/to/remote/scriptdir&#039;&#039; is the arbitrary path to the directory your perl scripts are stored in on that remote machine.&lt;br /&gt;
&lt;br /&gt;
If you plan on using the remote-scripting option and you haven&#039;t already set up &#039;&#039;ssh&#039;&#039; for non-interactive login on the target/remote machine, use the command &#039;&#039;ssh-keygen -t rsa&#039;&#039; to generate the two files with public/private keys and put the &#039;&#039;public&#039;&#039; key in the ~/.ssh directory on the target/remote machine and the &#039;&#039;private&#039;&#039; key in ~/.ssh on the local machine where Domoticz is running. You will also have to do  a &#039;&#039;chmod 700&#039;&#039; on the ~/.ssh directory itself and &#039;&#039;chmod 600&#039;&#039; on the key files themselves or it won&#039;t work.&lt;br /&gt;
&lt;br /&gt;
Next, create a perl script called &#039;&#039;sqnowplaying.pl&#039;&#039; in the directory/machine pointed to by the path you just used in the bash script, with the following content (and do a &#039;&#039;chmod +x&#039;&#039; afterwards). If you are using the remote-script option, the file is placed in the /path/to/remote/scriptdir directory on the remote machine. &#039;&#039;&#039;Note:&#039;&#039;&#039; You will need to provide your AWS login credentials, edit the parameters for your player-mac&#039;s, provide the URL of your LMS instance, plus define the path to your LMS &#039;&#039;playlists&#039;&#039; directory after creating this script (all parameters are case-sensitive too):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use Parallel::Loops;&lt;br /&gt;
use JSON::RPC::Client;&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
use Paws;&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# Uses Amazon Polly TTS to read out the nowplaying song Title and Artist on an active Squeezebox&lt;br /&gt;
# Author: philchillbill, 2018&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------------------------------&lt;br /&gt;
# Edit the following parameters to suit your setup:&lt;br /&gt;
&lt;br /&gt;
$ENV{AWS_ACCESS_KEY} = &#039;AJKTYRE764JOKL0LSH74&#039;;&lt;br /&gt;
$ENV{AWS_SECRET_KEY} = &#039;v8tRFJzPkkj876TgYPnua90eWrEaioqnmMd88AZw&#039;;&lt;br /&gt;
&lt;br /&gt;
# The mac addresses of all the squeezebox players in your setup&lt;br /&gt;
%uuids = (&lt;br /&gt;
 livingroom =&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 kitchen=&amp;gt; &#039;00:04:20:aa:bb:cc&#039;,&lt;br /&gt;
 office	=&amp;gt; &#039;00:04:20:aa:bb:cc&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The URL for the LMS server instance, usually on port 9000 or 9002&lt;br /&gt;
%url = (&lt;br /&gt;
 lms =&amp;gt; &#039;http://192.168.1.3:9002/jsonrpc.js&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# The full path to your LMS playlists directory&lt;br /&gt;
%dir = (&lt;br /&gt;
 playlists =&amp;gt; &#039;file:///volume1/music/playlists&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# ----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub tts {&lt;br /&gt;
 ($voice, $filename, $text)=@_;&lt;br /&gt;
 my $polly = Paws-&amp;gt;service(&#039;Polly&#039;, region =&amp;gt; &#039;eu-west-1&#039;); &lt;br /&gt;
 my $res = $polly-&amp;gt;SynthesizeSpeech( VoiceId =&amp;gt;  $voice, Text =&amp;gt; $text, OutputFormat =&amp;gt; &#039;mp3&#039; );&lt;br /&gt;
 open(MP3, &#039;&amp;gt;&#039;, &amp;quot;$filename.mp3&amp;quot;); binmode(MP3); print MP3 $res-&amp;gt;AudioStream; close(MP3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nowplayingTTS {&lt;br /&gt;
 $player=shift; $playerid=$uuids{$player};&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;artist&#039;, &#039;?&#039;] ] });&lt;br /&gt;
 $response=$res-&amp;gt;jsontext; $jdata=decode_json $response; $artist=$$jdata{result}{_artist};&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;title&#039;, &#039;?&#039;] ] });&lt;br /&gt;
 $response=$res-&amp;gt;jsontext; $jdata=decode_json $response; $title=$$jdata{result}{_title};&lt;br /&gt;
 if ($title=~m/\(/) { $title=~s/\(/, (/ };&lt;br /&gt;
 &amp;amp;tts(&#039;Amy&#039;, &amp;quot;$dir{playlists}/tts_$player&amp;quot;, &amp;quot;This song is, &#039;$title&#039;, by &#039;$artist&#039;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 $res = ( $client-&amp;gt;call( $url{lms}, { method  =&amp;gt; &#039;slim.request&#039;, params  =&amp;gt; [ $playerid, [&#039;status&#039;, &#039;-&#039;, &#039;1&#039;, &#039;tags&#039; ] ] }) ) || 0;&lt;br /&gt;
 $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); &lt;br /&gt;
 $repeat=$$jdata{result}{&#039;playlist repeat&#039;};&lt;br /&gt;
 $mvol=$$jdata{result}{&#039;mixer volume&#039;};&lt;br /&gt;
 $time=$$jdata{result}{time};&lt;br /&gt;
 if ($mode eq &#039;play&#039;) { $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;pause&#039;] ] }); }&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;save&#039;, &amp;quot;nowplaying$player&amp;quot;, &#039;silent:1&#039;] ] });&lt;br /&gt;
 &lt;br /&gt;
 $avol=$mvol+25; if ($avol&amp;gt;80) { $avol=80 };&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $avol ] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, &#039;0&#039;] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;play&#039;, &amp;quot;$dir{playlists}/tts_$player.mp3&amp;quot;] ] });&lt;br /&gt;
 &lt;br /&gt;
 do {&lt;br /&gt;
  $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mode&#039;, &#039;?&#039;] ] });&lt;br /&gt;
  $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres); $mode=$$jdata{result}{_mode};&lt;br /&gt;
  sleep 1;&lt;br /&gt;
 } until ($mode eq &#039;stop&#039;);&lt;br /&gt;
 &lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;mixer&#039;, &#039;volume&#039;, $mvol ] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;repeat&#039;, &#039;2&#039; ] ] });&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;playlist&#039;, &#039;resume&#039;, &amp;quot;nowplaying$player&amp;quot; ] ] }); ;&lt;br /&gt;
 $res = $client-&amp;gt;call( $url{lms}, { method =&amp;gt; &#039;slim.request&#039;, params =&amp;gt; [ $playerid, [&#039;time&#039;, $time ] ] });&lt;br /&gt;
 &lt;br /&gt;
 unlink(&amp;quot;$dir{playlists}/tts_$player.mp3&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$client = new JSON::RPC::Client;&lt;br /&gt;
&lt;br /&gt;
# find out which of our players are currently active, if any&lt;br /&gt;
foreach $sb (keys %uuids) {&lt;br /&gt;
 $playerid=$uuids{$sb};&lt;br /&gt;
 $res = ( $client-&amp;gt;call( $url{lms}, { method  =&amp;gt; &#039;slim.request&#039;, params  =&amp;gt; [ $playerid, [&#039;status&#039;, &#039;-&#039;, &#039;1&#039;, &#039;tags&#039; ] ] }) ) || 0;&lt;br /&gt;
 if (!$res) { next }; # offline&lt;br /&gt;
 $jres = $res-&amp;gt;jsontext; $jdata=JSON::XS-&amp;gt;new-&amp;gt;allow_nonref-&amp;gt;decode($jres);&lt;br /&gt;
 $power=$$jdata{result}{power}; $mode=$$jdata{result}{mode}; &lt;br /&gt;
 if ( ($power==0) || ($mode ne &#039;play&#039;) ) { next } else { $active{$sb}=1 };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# play the created TTS file(s) on any active player(s), or else silently exit&lt;br /&gt;
$maxProcs = 6;&lt;br /&gt;
$pl = Parallel::Loops-&amp;gt;new($maxProcs);&lt;br /&gt;
@tgt=(keys %active);&lt;br /&gt;
 &lt;br /&gt;
$pl-&amp;gt;foreach (\@tgt, sub { &lt;br /&gt;
 &amp;amp;nowplayingTTS($_);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing===&lt;br /&gt;
To test the script first outside Domoticz, &#039;&#039;cd&#039;&#039; to the directory where you placed the bash script and issue the following command. Make sure something is also actually playing on one or more of your players or the script will just quietly exit.&lt;br /&gt;
&lt;br /&gt;
 ./sqnowplaying.sh&lt;br /&gt;
&lt;br /&gt;
After a slight delay (due to going up and back to the cloud for Polly), all active players (active meaning &#039;powered on&#039; and in &#039;play&#039; mode) should have their current song temporarily paused, the name of the song and the artist should be called out through the relevant player at a slightly-higher volume than the music was at, and then the song(s) that were playing should finally continue where they were at before the pause.&lt;br /&gt;
&lt;br /&gt;
If you have issues getting the remote (&#039;&#039;ssh&#039;&#039;) scripting working, you can first verify that the remote-login keys are working by typing&lt;br /&gt;
&lt;br /&gt;
 ssh -p 22 -i ~/.ssh/privatekey 192.168.xxx.yyy&lt;br /&gt;
&lt;br /&gt;
from the command line on the &#039;&#039;local&#039;&#039; machine. If it works then you will just silently receive a terminal-prompt from the remote machine (you might have to accept the remote machine as trusted the first time this is done - just go ahead and do it). If it doesn&#039;t work then check the permissions (not higher than 600 on the keyfiles!) and check that the keyfiles are in the home directory for the correct user (are you going to run Domoticz as root, pi, another user... ?). At a minimum, you should already be able to login via ssh to the remote machine using a username and password - if that&#039;s not working then this certainly won&#039;t work (e.g. check port 22 open, check that the &#039;&#039;ssh&#039;&#039; service is started).&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
The HTML documentation for all possible JSON RPC interactions with LMS is included in every LMS install so you already have it. Browse in the UI of your LMS instance to &#039;&#039;Help&#039;&#039; down in the bottom left corner, then click on &#039;&#039;Technical Information&#039;&#039;, then on &#039;&#039;The Logitech Media Server Command Line Interface&#039;&#039;. The perl scripts above were built entirely on the basis of the information there. There is also plenty of information on how to interact with LMS using JSON from e.g. a web-browser or a UserAgent online. See [http://tutoriels.domotique-store.fr/content/54/95/fr/api-logitech-squeezebox-server-_-player-http.html tutoriels.domotique], for example.&lt;br /&gt;
&lt;br /&gt;
If you want to read more on the subject of &#039;&#039;Public-Key Authentication&#039;&#039; and the use of &#039;&#039;ssh-keygen&#039;&#039;, consult [https://www.ssh.com/ssh/keygen/ ssh-keygen] or for details on editing the &#039;&#039;sshd_config&#039;&#039; file, see [https://www.digitalocean.com/community/tutorials/how-to-use-ssh-to-connect-to-a-remote-server-in-ubuntu digitalocean]&lt;br /&gt;
&lt;br /&gt;
As mentioned in the section &#039;&#039;Setup Considerations&#039;&#039; above, a big issue with trying to use the above perl scripts natively on Synology is the lack of CPAN support for installing/building the JSON::RPC::Client and JSON::XS modules (Synology uses a rather stripped Linux variant). A simple workaround (detailed above) is for LMS (and your music) to be on your Synology (with Domoticz too) and to have only the perl scripts running on a different Linux machine in the network. However, if you really want to run things on your Synology natively because you don&#039;t want the overhead/cost of an additional machine, the JSON RPC calls can be made from &#039;&#039;bash&#039;&#039; using &#039;&#039;curl&#039;&#039; without having to install anything special, although the scripts will of course need total modification. Here&#039;s an example of what the calls look like in bash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
JSONRPC=&amp;quot;http://192.168.1.3:9002/jsonrpc.js&amp;quot;&lt;br /&gt;
UUID=&amp;quot;00:04:20:1a:4d:5e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -i -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &#039;{&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;slim.request&amp;quot;,&amp;quot;params&amp;quot;:[ &amp;quot;&#039;$UUID&#039;&amp;quot;, [&amp;quot;power&amp;quot;, &amp;quot;1&amp;quot;] ]}&#039; $JSONRPC&lt;br /&gt;
curl -i -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &#039;{&amp;quot;id&amp;quot;:1,&amp;quot;method&amp;quot;:&amp;quot;slim.request&amp;quot;,&amp;quot;params&amp;quot;:[ &amp;quot;&#039;$UUID&#039;&amp;quot;, [&amp;quot;playlist&amp;quot;, &amp;quot;resume&amp;quot;, &amp;quot;Trance_Daylist&amp;quot;] ]}&#039; $JSONRPC&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Media]]&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Kodi&amp;diff=11650</id>
		<title>Kodi</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Kodi&amp;diff=11650"/>
		<updated>2019-01-13T08:37:55Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: /* Kodi Settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for Kodi Media Player.&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
Kodi™ (formerly known as XBMC™) is an award-winning free and open source (GPL) software media center for playing videos, music, pictures, games, and more. Kodi runs on Linux, OS X, Windows, iOS, and Android, featuring a 10-foot user interface for use with televisions and remote controls. It allows users to play and view most videos, music, podcasts, and other digital media files from local and network storage media and the internet.&lt;br /&gt;
&lt;br /&gt;
For more details go to the Kodi site here - http://kodi.tv/about/&lt;br /&gt;
&lt;br /&gt;
==On Screen Notifications==&lt;br /&gt;
Domoticz can display notification messages on screens linked to Kodi Media Players. Notifications will work even if Kodi has not been added as a hardware type and no Kodi devices have been defined.&lt;br /&gt;
&lt;br /&gt;
Your Kodi media Player must be configured to allow control by remote programs. To see where to do this using the default Confluence skin see: [http://kodi.wiki/view/Settings/Services#Remote_control Allow Remote Control].&lt;br /&gt;
&lt;br /&gt;
This is configured via the Notifications tab on the Settings page as shown here:&lt;br /&gt;
&lt;br /&gt;
[[File:2015-09-19 Kodi.jpg|Settings]]&lt;br /&gt;
&lt;br /&gt;
The default setting should work for almost everyone on a home network.  224.0.0.1 is a multicast address so the message will be sent to the whole local network.  Port 9777 is a special port on Kodi Media Players to listen for these broadcasts so always try these settings first.  If the messages don&#039;t appear, bump the number of &#039;hops&#039; to any number less than 20.&lt;br /&gt;
&lt;br /&gt;
For Kodis that still don&#039;t get messages, or are not on your local network, semicolon delimited IP addresses can be specified.&lt;br /&gt;
&lt;br /&gt;
If you want to send notifications to Kodi outside of the formal Domoticz stream you can do something along the lines of this in bash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;GUI.ShowNotification&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;title&amp;quot;:&amp;quot;Domoticz&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;Hall PIR detected motion !&amp;quot;},&amp;quot;id&amp;quot;:1}&#039; http://192.168.178.5:80/jsonrpc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or from perl using&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use LWP::UserAgent;&lt;br /&gt;
use Net::Ping;&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
$kodi_url = &#039;192.168.178.5&#039;;&lt;br /&gt;
$ua=LWP::UserAgent-&amp;gt;new; $ua-&amp;gt;timeout(5);&lt;br /&gt;
&lt;br /&gt;
$p = Net::Ping-&amp;gt;new();&lt;br /&gt;
$alive = ($p-&amp;gt;ping($kodi_url, 2));&lt;br /&gt;
&lt;br /&gt;
if ($alive) { &lt;br /&gt;
 $title=&#039;Garage Door&#039;;&lt;br /&gt;
 $message=&#039;Open for &amp;gt; 10 mins !&#039;;&lt;br /&gt;
 $res=$ua-&amp;gt;get(&amp;quot;http://$kodi_url/jsonrpc?request={\&amp;quot;jsonrpc\&amp;quot;:\&amp;quot;2.0\&amp;quot;,\&amp;quot;id\&amp;quot;:1,\&amp;quot;method\&amp;quot;:\&amp;quot;GUI.ShowNotification\&amp;quot;,\&amp;quot;params\&amp;quot;:{\&amp;quot;title\&amp;quot;:\&amp;quot;$title\&amp;quot;,\&amp;quot;message\&amp;quot;:\&amp;quot;$message\&amp;quot;}}&amp;quot;);&lt;br /&gt;
 unless ($res-&amp;gt;is_success) { warn $res-&amp;gt;status_line };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kodi in Domoticz==&lt;br /&gt;
&lt;br /&gt;
===Kodi Settings===&lt;br /&gt;
Your Kodi media Player must be configured to allow control by remote programs to work with Domoticz. To see where to do this using the default Confluence skin see: [http://kodi.wiki/view/Settings/Services#Remote_control Allow Remote Control].&lt;br /&gt;
&lt;br /&gt;
By default Kodi exposes an asynchronous interface on port 9090 in addition to the web server it runs on 80 or 8080. If required, it can be changed by updating the underlying XML configuration, details are here [http://kodi.wiki/view/Advancedsettings.xml#.3Cjsonrpc.3E Override Default Port] but this should not be required.&lt;br /&gt;
&lt;br /&gt;
Do not change any of these [http://kodi.wiki/view/Settings/Services#Webserver web server settings] in an attempt to make this plugin work. It does not use the Kodi Webserver so it will make no difference.&lt;br /&gt;
&lt;br /&gt;
===Adding Hardware===&lt;br /&gt;
Add the Kodi Media Player via the Hardware page under Settings:&lt;br /&gt;
&lt;br /&gt;
[[File:KodiHardware.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Domoticz Settings====&lt;br /&gt;
&lt;br /&gt;
Click &#039;Setup&#039; and the add individual devices. &lt;br /&gt;
* Poll interval controls how often Domoticz will attempt to reconnect to a Kodi that it has lost contact with.&lt;br /&gt;
* Ping timeout controls how many missed pings (sent once per Poll Interval) can be missed before a Kodi is consider &#039;Off&#039;. For backwards compatibility, if the number specified is greater than 1000 it will be divided by 1000. Recommended value is 2 or 3.&lt;br /&gt;
The port specified needs to match the port confingured on the Kodi itself, see below for detail&lt;br /&gt;
&lt;br /&gt;
[[File:KodiDetail.jpg]]&lt;br /&gt;
&lt;br /&gt;
Unless you have explicitly made port changes to your Kodi as described below, just use the default 9090 port number.  Once you have saved your changes check the log and you should see something similar to this:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-09-25 09:44:44.962 Kodi: (Lounge) Connected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that this message will be shown if Domoticz attaches to any valid port!  To check it is functioning correctly, play some media as you normally would and you should see somthing similar to this if you play then stop some music:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-09-25 10:01:11.699 Kodi: (Lounge) Event: &#039;Audio - Coldplay (A Rush Of Blood To The Head), The Scientist (2002)&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-09-25 10:01:18.483 Kodi: (Lounge) Event: &#039;On&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
if you see the connection message but no activity you have connected to the wrong port.&lt;br /&gt;
&lt;br /&gt;
If you want to use custom Kodi icons there is a set here: [https://www.domoticz.com/forum/download/file.php?id=4243 Custom Icons].  Just upload them via the Custom Icon page under settings then Edit the devices from the &#039;Switches&#039; tab select the icons from the list.&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
If you are having issues, go back to the device set up page (under Hardware) and make the port number negative for your kodi, this will turn on debug mode for the device. e.g if using the default port 9090, make the port -9090 and your log will be spammed with messages.&lt;br /&gt;
&lt;br /&gt;
Connection to the correct port will show results similar to:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:02.429 Kodi: (Lounge) Connected to &#039;192.168.37.127:-9090&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:02.430 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;System.GetProperties&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;properties&amp;quot;:[&amp;quot;canhibernate&amp;quot;,&amp;quot;cansuspend&amp;quot;,&amp;quot;canshutdown&amp;quot;]},&amp;quot;id&amp;quot;:7}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%; font-weight:bold;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:02.565 Kodi: (Lounge) Parsing data: &#039;{&amp;quot;id&amp;quot;:7,&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;result&amp;quot;:{&amp;quot;canhibernate&amp;quot;:false,&amp;quot;canshutdown&amp;quot;:false,&amp;quot;cansuspend&amp;quot;:false}}&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:02.567 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;Player.GetActivePlayers&amp;quot;,&amp;quot;id&amp;quot;:5}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%; font-weight:bold;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:02.570 Kodi: (Lounge) Parsing data: &#039;{&amp;quot;id&amp;quot;:5,&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;result&amp;quot;:[]}&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:03.459 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;JSONRPC.Ping&amp;quot;,&amp;quot;id&amp;quot;:1}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%; font-weight:bold;&amp;quot;&lt;br /&gt;
|2015-10-03 13:03:03.463 Kodi: (Lounge) Parsing data: &#039;{&amp;quot;id&amp;quot;:1,&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;result&amp;quot;:&amp;quot;pong&amp;quot;}&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Connecting to an incorrect (but active) port will show:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:10.882 Kodi: (Lounge) Connected to &#039;192.168.0.246:-8080&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:10.883 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;System.GetProperties&amp;quot;,&amp;quot;params&amp;quot;:{&amp;quot;properties&amp;quot;:[&amp;quot;canhibernate&amp;quot;,&amp;quot;cansuspend&amp;quot;,&amp;quot;canshutdown&amp;quot;]},&amp;quot;id&amp;quot;:7}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:11.919 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;JSONRPC.Ping&amp;quot;,&amp;quot;id&amp;quot;:1}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:22.420 Kodi: (Lounge) Sending data: &#039;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;JSONRPC.Ping&amp;quot;,&amp;quot;id&amp;quot;:1}&#039;&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:32.920 Kodi: (Lounge) Missed 1 pings, assumed off.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:32.956 Kodi: (Lounge) Event: &#039;Off&#039;.&lt;br /&gt;
|- style=&amp;quot;font-style: italic; font-size:80%;&amp;quot;&lt;br /&gt;
|2015-10-03 13:07:32.985 Kodi: (Lounge) Disonnected.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Always post this log output into forum requests for assistance.&lt;br /&gt;
&lt;br /&gt;
===Events and Notifications===&lt;br /&gt;
Domoticz device events work for Kodi using both Blockly and lua.  &lt;br /&gt;
&lt;br /&gt;
Events and notifications are triggered for:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|On&lt;br /&gt;
|When the device is turned on (network connection established) or returns to an idle state.&lt;br /&gt;
|-&lt;br /&gt;
|Off&lt;br /&gt;
|When the device is turned off or network connectivity is lost.&lt;br /&gt;
|-&lt;br /&gt;
|Video&lt;br /&gt;
|When the device starts streaming Live TV, TV Shows or Movies.&lt;br /&gt;
|-&lt;br /&gt;
|Audio&lt;br /&gt;
|When the device starts streaming Music.&lt;br /&gt;
|-&lt;br /&gt;
|Photo&lt;br /&gt;
|When the device starts showing an image.&lt;br /&gt;
|-&lt;br /&gt;
|Pause&lt;br /&gt;
|When the device is streaming media and is paused.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following actions can be performed by using &#039;Set&#039; on a Kodi.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Off or Group Off&lt;br /&gt;
|Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
|-&lt;br /&gt;
|Stop&lt;br /&gt;
|Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
|-&lt;br /&gt;
|Play&lt;br /&gt;
|Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
|-&lt;br /&gt;
|Pause&lt;br /&gt;
|Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
|-&lt;br /&gt;
|Set Volume &#039;&#039;&amp;lt;0-100&amp;gt;&#039;&#039;&lt;br /&gt;
|Will set the volume of the player-output.&lt;br /&gt;
|-&lt;br /&gt;
|Play Playlist &#039;&#039;&amp;lt;name&amp;gt;&#039;&#039; &#039;&#039;&amp;lt;position&amp;gt;&#039;&#039;&lt;br /&gt;
|Will play a music or video [http://kodi.wiki/view/Smart_playlists Smart Playlist] with name &#039;&#039;&amp;lt;name&amp;gt;&#039;&#039; optionally starting at position &#039;&#039;&amp;lt;position&amp;gt;&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
|-&lt;br /&gt;
|Play Favorites &#039;&#039;&amp;lt;position&amp;gt;&#039;&#039;&lt;br /&gt;
|Will play an item from the Kodi&#039;s Favorites list optionally starting at position &#039;&#039;&amp;lt;position&amp;gt;&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
|-&lt;br /&gt;
|Execute &#039;&#039;&amp;lt;addonid&amp;gt;&#039;&#039;&lt;br /&gt;
|Will send an Execute Addon command sending no parameters. Addon IDs are embedded in the addon configuration and are not to be confused with the Addon Name. For example: http://forums.homeseer.com/showthread.php?p=1213403&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lua example:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Off&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Off AFTER 30&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Pause&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Set Volume 30&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Play Playlist Indierock&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Play Playlist ActionMovies 15&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Play Favorites&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Play Favorites 3&#039;&lt;br /&gt;
commandArray[&#039;Lounge&#039;]=&#039;Execute script.securitycam&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
&lt;br /&gt;
Kodi has support for [http://kodi.wiki/view/JSON-RPC_API JSON] &lt;br /&gt;
&lt;br /&gt;
This can be used in many fun things, for example my television can not do audio passthrough but my receiver can. So detecting that using a [[CEC]] script, or an alive ping on both devices (red. reference here) and [http://forum.kodi.tv/showthread.php?tid=192491 setting the  audio passthrough in Kodi]. Makes that switching inputs from my receiver to my TV also enables audio (instead of silence)!&lt;br /&gt;
&lt;br /&gt;
== Philips HUE  (No Longer Maintained) ==&lt;br /&gt;
&lt;br /&gt;
Kodi has [[Philips_Hue_Lights | Philips HUE]] support&lt;br /&gt;
&lt;br /&gt;
The latest version can be downloaded at this location [https://github.com/michaelrcarroll/script.kodi.hue.ambilight], remember to exclude that lamp from your scences (like group all off).&lt;br /&gt;
&lt;br /&gt;
== CEC == &lt;br /&gt;
[[:Category:CEC | CEC]] can be used to switch your input, set your volume or even get your TV out of standby.&lt;br /&gt;
Kodi has a build in support for CEC with more infomation in [[:Category:CEC | CEC]] and the [http://kodi.wiki/view/CEC Kodi Wiki]&lt;br /&gt;
&lt;br /&gt;
==OpenElec/LibreElec==&lt;br /&gt;
Remote control is disabled by default (for security reasons) so Domoticz won&#039;t be able to connect until it is enabled in Control Settings on the Kodi : &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Kodi_remote_control_setting.PNG]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
On OpenElec or LibreElec, you &#039;&#039;&#039;MAY&#039;&#039;&#039; need to add a few lines to your advanced settings xml file...try it first and only do this if it does not work&amp;lt;br&amp;gt;&lt;br /&gt;
If you dont know how to do that, check this out : http://kodi.wiki/view/advancedsettings.xml&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Once you have your head around that, you need to add these lines : &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;jsonrpc&amp;gt;&lt;br /&gt;
&amp;lt;tcpport&amp;gt;9090&amp;lt;/tcpport&amp;gt;&lt;br /&gt;
&amp;lt;/jsonrpc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Media]]&lt;br /&gt;
[[Category:CEC]]&lt;br /&gt;
[[Category:Scripting‏‎]]&lt;br /&gt;
[[Category:JSON]]&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Sonoff_-_failsafe_switching&amp;diff=11584</id>
		<title>Sonoff - failsafe switching</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Sonoff_-_failsafe_switching&amp;diff=11584"/>
		<updated>2018-11-27T17:59:15Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Failsafe switching of Sonoff relay devices==&lt;br /&gt;
&lt;br /&gt;
If you have flashed a Sonoff relay device with ESPeasy, you can have Domoticz turn the device on/off from a dummy switch using a http:// call to the relevant URL in the action field. For example, for a device at octet 27&lt;br /&gt;
 http://192.168.1.27/control?cmd=gpio,12,1 &lt;br /&gt;
turns the relay on, while ?cmd=gpio,12,0 turns it off again. In the real world, you will regularly encounter missed packets with this approach (it&#039;s as if the Sonoffs aren&#039;t always listening). When this happens, Domoticz and the Sonoff are out of sync - you think/hope you&#039;ve switched something on or off but in fact there was no response from the Sonoff and Domoticz is none the wiser.&lt;br /&gt;
&lt;br /&gt;
One way around this is to use script:// instead of http:// in the dummy-switch action field and have an external script send the http:// command to the Sonoff, poll the Sonoff to ensure that the relay has actually switched, and resend the http:// if needed (repeatedly) in case a discrepancy is found. To check the current state of a Sonoff, we can use &lt;br /&gt;
 http://192.168.1.27/json?view=sensorupdate&amp;amp;tasknr=1 &lt;br /&gt;
and we will then see something along the lines of:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;TaskValues&amp;quot;: [&lt;br /&gt;
 {&amp;quot;ValueNumber&amp;quot;:1,&lt;br /&gt;
 &amp;quot;Name&amp;quot;:&amp;quot;state&amp;quot;,&lt;br /&gt;
 &amp;quot;NrDecimals&amp;quot;:0,&lt;br /&gt;
 &amp;quot;Value&amp;quot;:1&lt;br /&gt;
 }],&lt;br /&gt;
 &amp;quot;TTL&amp;quot;:60000,&lt;br /&gt;
 &amp;quot;TaskEnabled&amp;quot;:&amp;quot;true&amp;quot;,&lt;br /&gt;
 &amp;quot;TaskNumber&amp;quot;:1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
with the Mega version of ESPeasy, or with e.g. version 120 we get simpler JSON:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;TaskName&amp;quot;: &amp;quot;relay&amp;quot;,&lt;br /&gt;
 &amp;quot;state&amp;quot;: 0.00&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Our script can check for either format automatically. The &#039;&#039;TaskName&#039;&#039; of &#039;relay&#039; has a &#039;&#039;state&#039;&#039; of 0.00, indicating the relay is currently off - the state is 1.00 if it&#039;s on. Our script uses this approach to verify that the Sonoff received a command and will keep resending until the state changes as required. With our script installed, in the on-action / off-action fields of a Domoticz switch, you can use a construct along the lines of&lt;br /&gt;
&lt;br /&gt;
 script://sonoffs.sh 27 12 0&lt;br /&gt;
 script://sonoffs.sh 148 12 1&lt;br /&gt;
&lt;br /&gt;
where the 27 or 148 (say) are the least-significant octet of the IP address of the Sonoff, the 12 is the gpio number to switch, and 0 or 1 is the required state.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
&lt;br /&gt;
Our script is written in perl but when using it with Domoticz we will call it from a pre-processor script written in bash. The reason for this is that the perl script has a deliberate (short) sleep-delay built-in before it retries a failed command. As Domoticz waits for scripts to finish before continuing its own execution, this delay would hold up Domoticz and we don&#039;t want that. The bash wrapper-script kicks off execution of the perl script and passes along our command-line parameters, but suppresses output from the perl and - most importantly - makes it run as a separate process (thanks to the final &#039;&amp;amp;&#039;) so that control immediately returns to Domoticz. Perfect.&lt;br /&gt;
&lt;br /&gt;
Create a bash script called &#039;&#039;sonoffs.sh&#039;&#039; with the following content, and put it in your &#039;&#039;/home/pi/domoticz/scripts&#039;&#039; directory (and of course, do a &#039;&#039;chmod +x&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
/usr/bin/perl /home/pi/domoticz/scripts/sonoffs.pl $1 $2 $3 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure perl is installed (it very likely is on a linux-based OS) and then install the modules from CPAN that we need:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo cpan install JSON::XS&lt;br /&gt;
 sudo cpan install LWP::UserAgent&lt;br /&gt;
 sudo cpan install URI::Escape&lt;br /&gt;
&lt;br /&gt;
Now create a perl script called &#039;&#039;sonoffs.pl&#039;&#039; with the following content, and put it in your &#039;&#039;/home/pi/domoticz/scripts&#039;&#039; directory (and of course, do a &#039;&#039;chmod +x&#039;&#039;). You will need to edit the $domoticz and $baseUrl variables to match your particular setup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
use JSON::XS;&lt;br /&gt;
use LWP::UserAgent;&lt;br /&gt;
use URI::Escape;&lt;br /&gt;
&lt;br /&gt;
no warnings &#039;uninitialized&#039;;&lt;br /&gt;
&lt;br /&gt;
# Switches a Sonoff device on/off on behalf of Domoticz and then checks that it actually switched accordingly (in case of packet-loss)&lt;br /&gt;
# Autor: philchillbill, 2018&lt;br /&gt;
&lt;br /&gt;
($octet, $gpio, $value)=@ARGV;&lt;br /&gt;
$tries=0;&lt;br /&gt;
&lt;br /&gt;
$domoticz=&#039;http://192.168.1.12:8080&#039;; # full URL of your Domoticz instance&lt;br /&gt;
$baseUrl=&#039;http://192.168.1.&#039;; # The most significant 3 octets of your local area IP addresses for the Sonoffs&lt;br /&gt;
&lt;br /&gt;
sub postDomoticzLog {&lt;br /&gt;
 my $msg=shift;&lt;br /&gt;
 $message=uri_escape($msg);&lt;br /&gt;
 $msg_url=$domoticz.&#039;/json.htm?type=command&amp;amp;param=addlogmessage&amp;amp;message=&#039;.$message;&lt;br /&gt;
 $ua=LWP::UserAgent-&amp;gt;new; $ua-&amp;gt;timeout(5); $res=$ua-&amp;gt;put($msg_url);&lt;br /&gt;
 unless ($res-&amp;gt;is_success) { warn &amp;quot;oops... &amp;quot;, $res-&amp;gt;status_line };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$ua=LWP::UserAgent-&amp;gt;new; $ua-&amp;gt;timeout(1); $ua-&amp;gt;env_proxy;&lt;br /&gt;
&lt;br /&gt;
# first check we are not clashing with another process handling the same Sonoff device&lt;br /&gt;
while ( -e &amp;quot;/tmp/.busy.$octet&amp;quot; ) {&lt;br /&gt;
 $secs++; sleep 1; $waited=1;&lt;br /&gt;
 if ($secs==30) {&lt;br /&gt;
  unlink (&amp;quot;/tmp/.busy.$octet&amp;quot;) or die $!;&lt;br /&gt;
  &amp;amp;postDomoticzLog(&amp;quot;Early exit of lockfile-wait loop with Sonoff &#039;$octet&#039;&amp;quot;);&lt;br /&gt;
  last;&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
if ($waited) { print &amp;quot;Waited for other process...\n&amp;quot;; sleep 5 };&lt;br /&gt;
 &lt;br /&gt;
# now place our own lockfile to hold off other processes&lt;br /&gt;
open(TMP, &#039;&amp;gt;&#039;, &amp;quot;/tmp/.busy.$octet&amp;quot;) or die $!;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
do {&lt;br /&gt;
 # First send the command to the Sonoff&lt;br /&gt;
 $url=$baseUrl.$octet.&amp;quot;/control?cmd=gpio,&amp;quot;.$gpio.&amp;quot;,&amp;quot;.$value; # e.g. http://192.168.178.27/control?cmd=gpio,12,0&lt;br /&gt;
 $c=0;&lt;br /&gt;
 do { $c++;&lt;br /&gt;
  $response=$ua-&amp;gt;get($url); &lt;br /&gt;
 } until ( ($response-&amp;gt;is_success) || ($c==5) );&lt;br /&gt;
&lt;br /&gt;
 # Now check if it reacted, using the /json endpoint&lt;br /&gt;
 $url=$baseUrl.$octet.&amp;quot;/json?view=sensorupdate&amp;amp;tasknr=1&amp;quot;; &lt;br /&gt;
 $d=0;&lt;br /&gt;
 do {&lt;br /&gt;
  sleep 1; $d++;&lt;br /&gt;
  $response=$ua-&amp;gt;get($url); &lt;br /&gt;
 } until ( ($response-&amp;gt;is_success) || ($d==10) );&lt;br /&gt;
&lt;br /&gt;
 if ($response-&amp;gt;is_success) {&lt;br /&gt;
  $tasks=$response-&amp;gt;decoded_content; $data=decode_json $tasks;&lt;br /&gt;
  if (exists $$data{state}) { $state=$$data{state} } else { $state=$$data{TaskValues}[0]{Value} }; # Both espeasy R120 / Mega JSON formats&lt;br /&gt;
 }&lt;br /&gt;
 else { &amp;amp;postDomoticzLog(&amp;quot;No response from Sonoff &#039;$octet&#039;&amp;quot;); exit 0 }; &lt;br /&gt;
&lt;br /&gt;
 $ok=( ($value eq &#039;0&#039;) &amp;amp;&amp;amp; ($state==0) ) || ( ($value eq &#039;1&#039;) &amp;amp;&amp;amp; ($state==1) ); $tries++;&lt;br /&gt;
 &lt;br /&gt;
} until ( ($ok) || ($tries==5) );&lt;br /&gt;
&lt;br /&gt;
if ( -e &amp;quot;/tmp/.busy.$octet&amp;quot; ) { unlink (&amp;quot;/tmp/.busy.$octet&amp;quot;) or die $!};&lt;br /&gt;
&lt;br /&gt;
if (!$ok) { &amp;amp;postDomoticzLog(&amp;quot;Error setting Sonoff &#039;$octet&#039; to state &#039;$value&#039;&amp;quot;) };&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;c: $c, d: $d, tries: $tries\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
exit 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That&#039;s it. You can debug things if necessary by running the perl script directly from the linux command line: e.g. &#039;&#039;./sonoffs.pl 27 12 1&#039;&#039; and seeing if any error messages are thrown. Also, if the bash script won&#039;t run from Domoticz, try specifying the full path to the bash file with a triple-slash: &lt;br /&gt;
 script:///home/pi/domoticz/scripts/sonoffs.sh 27 12 0&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=File:Screenshotjsondebug.png&amp;diff=11343</id>
		<title>File:Screenshotjsondebug.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=File:Screenshotjsondebug.png&amp;diff=11343"/>
		<updated>2018-08-05T11:26:27Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: Screenshot of JSON debugging in Domoticz using the developer tools of the browser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of JSON debugging in Domoticz using the developer tools of the browser&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Trigger_perl&amp;diff=9380</id>
		<title>Trigger perl</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Trigger_perl&amp;diff=9380"/>
		<updated>2017-07-24T18:55:33Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: /* Purpose */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Purpose=&lt;br /&gt;
This script will trigger a perl script every 1 minute as an alternative to running a cronjob. Make sure your perl script starts with a correct shebang line such as #!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
=Dependencies - hardware / software / operating system=&lt;br /&gt;
This script will work on all type of hardware / software / operating system.&lt;br /&gt;
&lt;br /&gt;
It could be used to trigger any perl script such as:&lt;br /&gt;
* [[Domoticz_Pings_any_IP_in_LAN,_and_switching_a_device,_using_Perl | ping_by_ip.pl ]]&lt;br /&gt;
* Any other perl script&lt;br /&gt;
&lt;br /&gt;
=Domoticz Setup - switches, variables, version=&lt;br /&gt;
* Replace ping_by_ip.pl by the name of your perl script&lt;br /&gt;
* Make sure ping_by_ip.pl is located in : /usr/bin/ping_by_ip.pl&lt;br /&gt;
* Make sure ping_by_ip.pl is executable : sudo chmod +x ping_by_ip.pl&lt;br /&gt;
&lt;br /&gt;
=Installation instructions=&lt;br /&gt;
Copy this script to your &#039;&#039;&#039;domoticz\scripts\lua\&#039;&#039;&#039; folder.&lt;br /&gt;
&lt;br /&gt;
=Script with comments=&lt;br /&gt;
 -- Script name : script_time_ping.lua&lt;br /&gt;
 -- This script will trigger a perl script every 1 minute&lt;br /&gt;
 -- Replace ping_by_ip.pl by the name of your perl script&lt;br /&gt;
 -- Make sure ping_by_ip.pl is located in : /usr/bin/ping_by_ip.pl&lt;br /&gt;
 -- Make sure ping_by_ip.pl is executable : sudo chmod +x ping_by_ip.pl&lt;br /&gt;
  &lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 &lt;br /&gt;
 ping_success=os.execute(&#039;ping_by_ip.pl&#039;)&lt;br /&gt;
  &lt;br /&gt;
 if ping_success then&lt;br /&gt;
 print(&amp;quot;ping success&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
 print(&amp;quot;ping fail&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
  &lt;br /&gt;
 return commandArray&lt;br /&gt;
&lt;br /&gt;
=Example of use (if relevant) i.e. output files / screen displays=&lt;br /&gt;
N/A&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Perl]]&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Doorbel_a_virtual_Switch&amp;diff=9378</id>
		<title>Doorbel a virtual Switch</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Doorbel_a_virtual_Switch&amp;diff=9378"/>
		<updated>2017-07-24T18:45:40Z</updated>

		<summary type="html">&lt;p&gt;Philchillbill: /* Your doorbell as switch in Domoticz. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Your doorbell as switch in Domoticz.=&lt;br /&gt;
&lt;br /&gt;
First you need to connect your 12 AV relays in parallel with your doorbell.&lt;br /&gt;
&lt;br /&gt;
When your doorbell button is pressed, the contact of your relays will connect GPIO18 to ground.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now install the software&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install python-dev python-pip&lt;br /&gt;
sudo install --upgrade distribute&lt;br /&gt;
sudo install ipython&lt;br /&gt;
sudo install --upgrade RPi.GPIO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the python script I made&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Doorbell py with read contact uitlezen, &lt;br /&gt;
# GPIO 18 to Ground when button is pushed &lt;br /&gt;
# Release 0.1/&lt;br /&gt;
# Author J. Jeurissen&lt;br /&gt;
# Copyright (c) 2015  J. Jeurissen &lt;br /&gt;
# Python 3&lt;br /&gt;
&lt;br /&gt;
import urllib&lt;br /&gt;
import urllib.request&lt;br /&gt;
import json&lt;br /&gt;
import RPi.GPIO as GPIO&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
# Settings for the domoticz server&lt;br /&gt;
domoticzserver=&amp;quot;ipadres:8080&amp;quot;&lt;br /&gt;
domoticzusername = &amp;quot;&amp;quot;&lt;br /&gt;
domoticzpassword = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
domoticzurl = &#039;http://&#039;+domoticzserver+&#039;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=170&amp;amp;switchcmd=On&#039;&lt;br /&gt;
&lt;br /&gt;
GPIO.setmode(GPIO.BCM)&lt;br /&gt;
&lt;br /&gt;
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	input_state = GPIO.input(18)&lt;br /&gt;
	if input_state == False:&lt;br /&gt;
		print(&#039;Button Pressed&#039;)&lt;br /&gt;
		time.sleep(5.0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add in crontab the following line&lt;br /&gt;
so your python script is always running&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@reboot python3 /path/doorbel.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:ToBeFormatted]]&lt;/div&gt;</summary>
		<author><name>Philchillbill</name></author>
	</entry>
</feed>