<?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=Walter+vl</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=Walter+vl"/>
	<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/Special:Contributions/Walter_vl"/>
	<updated>2026-09-18T18:42:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DynamicDashboard&amp;diff=19255</id>
		<title>DynamicDashboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DynamicDashboard&amp;diff=19255"/>
		<updated>2026-08-11T18:32:54Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;dashboard-dynamic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Dashboard Dynamic =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This page is maintained in the [https://github.com/domoticz/domoticz/tree/development/docs Domoticz GitHub repository]. Please do not edit it directly on the Wiki.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Revision:&#039;&#039;&#039; 2026-05-11&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Minimum build:&#039;&#039;&#039; 17950&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;enabling-dashboard-dynamic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Enabling Dashboard Dynamic ==&lt;br /&gt;
&lt;br /&gt;
Dashboard Dynamic is opt-in per user. To enable it, go to &#039;&#039;&#039;My Profile&#039;&#039;&#039; (top-right menu) and check &#039;&#039;&#039;Use Dynamic Dashboard&#039;&#039;&#039;, then save. The &#039;&#039;&#039;Dashboard&#039;&#039;&#039; menu item will now open the dynamic dashboard instead of the classic one.&lt;br /&gt;
&lt;br /&gt;
Administrators can also enable or disable it for any user via &#039;&#039;&#039;Setup → Users&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Dashboard Dynamic is a fully modular, drag-and-drop dashboard system for Domoticz. It replaces the fixed-layout classic dashboard with a flexible, personalized workspace where users can freely compose, resize, and arrange widgets to their liking.&lt;br /&gt;
&lt;br /&gt;
Key characteristics:&lt;br /&gt;
&lt;br /&gt;
* Per-user persistent layouts stored in the Domoticz database&lt;br /&gt;
* Multiple named dashboards per user&lt;br /&gt;
* Real-time device updates via the existing WebSocket (livesocket)&lt;br /&gt;
* Fully theme-aware using CSS custom properties (&amp;lt;code&amp;gt;--dz-*&amp;lt;/code&amp;gt; variables)&lt;br /&gt;
* Responsive across screen sizes&lt;br /&gt;
[[File:Dynamic dashboard.png]]&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-started&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Navigate to the &#039;&#039;&#039;Dashboard&#039;&#039;&#039; menu item. On first visit, a starter layout is created automatically containing a Clock, Sun Info, and Activity Log widget.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;toolbar-compact-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Toolbar (Compact Mode) ===&lt;br /&gt;
&lt;br /&gt;
In view mode, a small floating pill bar appears in the top-right corner of the page. It contains:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Dashboard name&#039;&#039;&#039; — click to open the switcher dropdown if multiple dashboards exist&lt;br /&gt;
* &#039;&#039;&#039;Pencil icon&#039;&#039;&#039; — enter Edit Mode&lt;br /&gt;
* &#039;&#039;&#039;Play icon&#039;&#039;&#039; — start/stop Kiosk mode (visible when 2+ dashboards exist)&lt;br /&gt;
&lt;br /&gt;
The bar fades to 50% opacity when not hovered to stay out of the way.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;edit-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Edit Mode ===&lt;br /&gt;
&lt;br /&gt;
Press the pencil button or &#039;&#039;&#039;Ctrl+E&#039;&#039;&#039; to enter Edit Mode. The full toolbar appears at the top:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Button&lt;br /&gt;
! Action&lt;br /&gt;
|-&lt;br /&gt;
| ⓘ (info icon)&lt;br /&gt;
| Opens the Dynamic Dashboard wiki page&lt;br /&gt;
|-&lt;br /&gt;
| Dashboard title&lt;br /&gt;
| Click to rename inline&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Dashboards&#039;&#039;&#039;&lt;br /&gt;
| Switch between dashboards, create a new one, or open Dashboard Settings&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Edit&#039;&#039;&#039;&lt;br /&gt;
| Access layout actions (Set as Default, Export/Import, Duplicate, Delete, Clear)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Done Editing&#039;&#039;&#039;&lt;br /&gt;
| Save changes and exit edit mode&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Add Widget&#039;&#039;&#039;&lt;br /&gt;
| Open the widget library panel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Save&#039;&#039;&#039;&lt;br /&gt;
| Manually save current layout&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Cancel&#039;&#039;&#039;&lt;br /&gt;
| Discard unsaved changes (button turns red when there are unsaved changes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dashboards dropdown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Item&lt;br /&gt;
! Action&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(dashboard name)&#039;&#039;&lt;br /&gt;
| Switch to that dashboard (prompts to discard unsaved changes if needed)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;New Dashboard&#039;&#039;&#039;&lt;br /&gt;
| Creates a new dashboard with an auto-generated name; rename it via the title field&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Dashboard Settings…&#039;&#039;&#039;&lt;br /&gt;
| Open kiosk and standby settings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Edit dropdown:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Item&lt;br /&gt;
! Action&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Export / Import&#039;&#039;&#039;&lt;br /&gt;
| Open the export/import dialog&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Reset to Favorites&#039;&#039;&#039;&lt;br /&gt;
| Populate the dashboard from your favorite devices&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Set as Default&#039;&#039;&#039;&lt;br /&gt;
| Mark this dashboard as the default (shown with a checkmark when active)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Duplicate&#039;&#039;&#039;&lt;br /&gt;
| Clone the current dashboard&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Delete&#039;&#039;&#039;&lt;br /&gt;
| Delete the current dashboard&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Clear All Widgets&#039;&#039;&#039;&lt;br /&gt;
| Remove all widgets from the current dashboard&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keyboard shortcuts:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Ctrl+E&amp;lt;/code&amp;gt; — toggle edit mode&lt;br /&gt;
* &amp;lt;code&amp;gt;Ctrl+S&amp;lt;/code&amp;gt; — save layout&lt;br /&gt;
* &amp;lt;code&amp;gt;Ctrl+L&amp;lt;/code&amp;gt; — toggle widget library panel&lt;br /&gt;
* &amp;lt;code&amp;gt;Escape&amp;lt;/code&amp;gt; — close widget library (if open), otherwise exit edit mode; also stops Kiosk mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;widget-library&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Widget Library ===&lt;br /&gt;
&lt;br /&gt;
Click &#039;&#039;&#039;Add Widget&#039;&#039;&#039; to open the slide-in library panel on the right. Widgets are grouped by category. Use the search box to filter. Click a widget’s &#039;&#039;&#039;+&#039;&#039;&#039; button to add it to the grid.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;widget-actions-edit-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Widget Actions (Edit Mode) ===&lt;br /&gt;
&lt;br /&gt;
Each widget shows a header bar in edit mode with:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Drag handle&#039;&#039;&#039; — drag the title bar to reposition&lt;br /&gt;
* &#039;&#039;&#039;Configure&#039;&#039;&#039; (gear icon) — open widget settings&lt;br /&gt;
* &#039;&#039;&#039;Duplicate&#039;&#039;&#039; (copy icon) — clone the widget; the clone starts dragging immediately&lt;br /&gt;
* &#039;&#039;&#039;Remove&#039;&#039;&#039; (× icon) — delete the widget&lt;br /&gt;
&lt;br /&gt;
Resize any widget by dragging the bottom-right corner handle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; All interactive elements inside widget content (buttons, links, inputs) are non-clickable in Edit Mode — only the header chrome buttons (configure, duplicate, remove) remain active. This prevents accidental device control while rearranging the layout.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;managing-dashboards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Managing Dashboards ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;multiple-dashboards&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Multiple Dashboards ===&lt;br /&gt;
&lt;br /&gt;
Dashboard management is done directly from the Edit Mode toolbar:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action&lt;br /&gt;
! How&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
| Dashboards → New Dashboard (auto-names; rename inline)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Rename&#039;&#039;&#039;&lt;br /&gt;
| Click the dashboard title in the toolbar&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Switch&#039;&#039;&#039;&lt;br /&gt;
| Dashboards dropdown → pick a name&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Set as Default&#039;&#039;&#039;&lt;br /&gt;
| Edit → Set as Default&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Duplicate&#039;&#039;&#039;&lt;br /&gt;
| Edit → Duplicate&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Delete&#039;&#039;&#039;&lt;br /&gt;
| Edit → Delete&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Copy deep-link&#039;&#039;&#039;&lt;br /&gt;
| Edit Mode → click the chain icon (&amp;lt;code&amp;gt;🔗&amp;lt;/code&amp;gt;) next to the dashboard title&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dashboard Settings&#039;&#039;&#039; (Edit → Dashboard Settings… or Dashboards → Dashboard Settings…) contains only the Kiosk and Screen Standby configuration — no layout management.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;deep-linking-to-a-specific-dashboard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Deep-linking to a specific dashboard ===&lt;br /&gt;
&lt;br /&gt;
You can open any dashboard directly via the URL, bypassing the normal “last viewed / default” lookup:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! URL&lt;br /&gt;
! Opens&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#/Dashboard&amp;lt;/code&amp;gt;&lt;br /&gt;
| Last viewed (localStorage) → default → first dashboard (existing behaviour)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#/Dashboard?id=&amp;amp;lt;uuid&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| The dashboard with the matching UUID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#/Dashboard?name=&amp;amp;lt;name&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| The dashboard whose name matches (case-insensitive) — e.g. &amp;lt;code&amp;gt;#/Dashboard?name=Smart%20Meter%20(P1)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting the UUID:&#039;&#039;&#039; in Edit Mode, click the chain icon (&amp;lt;code&amp;gt;🔗&amp;lt;/code&amp;gt;) immediately to the right of the dashboard title in the toolbar. The full deep-link URL is copied to the clipboard with a toast confirmation. Paste it into a browser bookmark, a wall-tablet shortcut, a chat message, etc.&lt;br /&gt;
&lt;br /&gt;
Switching dashboards through the dropdown does &#039;&#039;&#039;not&#039;&#039;&#039; update the URL — the deep-link only takes effect on page load.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kiosk-auto-swipe-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Kiosk / Auto-Swipe Mode ===&lt;br /&gt;
&lt;br /&gt;
Automatically cycles through a set of dashboards at a fixed interval — useful for wall tablets and kiosk displays.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controls:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Play/Stop button&#039;&#039;&#039; in the topbar (visible when 2+ dashboards exist)&lt;br /&gt;
* &#039;&#039;&#039;Escape&#039;&#039;&#039; key stops kiosk mode&lt;br /&gt;
* A thin progress bar at the bottom of the screen shows time remaining until the next switch&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Settings&#039;&#039;&#039; (in Dashboard Settings → Kiosk section):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Enable on load&lt;br /&gt;
| off&lt;br /&gt;
| Automatically start kiosk when page loads&lt;br /&gt;
|-&lt;br /&gt;
| Interval (seconds)&lt;br /&gt;
| 30&lt;br /&gt;
| Time to display each dashboard (5–3600)&lt;br /&gt;
|-&lt;br /&gt;
| Loop&lt;br /&gt;
| on&lt;br /&gt;
| Return to first dashboard after the last&lt;br /&gt;
|-&lt;br /&gt;
| Dashboards to cycle&lt;br /&gt;
| all&lt;br /&gt;
| Check specific dashboards to include; leave all unchecked to cycle all&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Settings are saved in browser &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;dd_kiosk&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;screen-standby-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Screen Standby Mode ===&lt;br /&gt;
&lt;br /&gt;
Dims or blanks the screen after a period of inactivity — prevents burn-in on wall-mounted displays. Any mouse movement, touch, keystroke, or click wakes the screen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Settings&#039;&#039;&#039; (in Dashboard Settings → Screen Standby section):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Enable standby&lt;br /&gt;
| off&lt;br /&gt;
| Enable inactivity dimming&lt;br /&gt;
|-&lt;br /&gt;
| Inactivity timeout&lt;br /&gt;
| 5 min&lt;br /&gt;
| Minutes before screen dims (1–60)&lt;br /&gt;
|-&lt;br /&gt;
| Full blackout&lt;br /&gt;
| off&lt;br /&gt;
| Completely black screen instead of dimmed&lt;br /&gt;
|-&lt;br /&gt;
| Opacity when dimmed&lt;br /&gt;
| 5%&lt;br /&gt;
| Screen brightness when dimmed (0–30%)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Settings are saved in browser &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;dd_standby&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;per-device-dashboard-selection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Per-Device Dashboard Selection ===&lt;br /&gt;
&lt;br /&gt;
Each browser/device independently remembers which dashboard it last viewed. When you switch dashboards on a phone, tablet, or desktop, that selection is saved in the browser’s &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; — so the next time that specific device opens Domoticz, it returns to the same dashboard automatically. This means a wall tablet can always open to a “Living Room” dashboard while your phone opens to a different one, without any server-side configuration.&lt;br /&gt;
&lt;br /&gt;
The active dashboard selection is stored per-origin in &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; key &amp;lt;code&amp;gt;dd_active_dashboard&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;export-import&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Export / Import ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Export / Import&#039;&#039;&#039; button opens a modal dialog with two tabs:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export tab:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Clipboard&#039;&#039; — generates JSON and lets you copy it to the clipboard for sharing (e.g. in forum posts)&lt;br /&gt;
* &#039;&#039;Download&#039;&#039; — downloads the dashboard as a &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt; file&lt;br /&gt;
* Choose to export the &#039;&#039;&#039;current dashboard&#039;&#039;&#039; or &#039;&#039;&#039;all dashboards&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The exported JSON includes the Domoticz build revision (&amp;lt;code&amp;gt;domoticzRevision&amp;lt;/code&amp;gt;) so recipients know the minimum version needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Import tab:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Clipboard&#039;&#039; — paste JSON directly from the clipboard&lt;br /&gt;
* &#039;&#039;File&#039;&#039; — select a &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt; file from disk&lt;br /&gt;
* Choose to import as a &#039;&#039;&#039;new dashboard&#039;&#039;&#039; or &#039;&#039;&#039;replace current&#039;&#039;&#039;&lt;br /&gt;
* If the imported dashboard was created on a newer Domoticz build, a warning is shown (but import still proceeds)&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar-indicators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bar Indicators ==&lt;br /&gt;
&lt;br /&gt;
Classic tab device widgets (Utility, Weather, Temperature) support optional color-coded bar indicators — a thin progress bar rendered below each device’s last-update timestamp. Bars provide an at-a-glance value status using configurable color ranges (e.g. green for normal values, red for high).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configuring-a-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Configuring a Bar ===&lt;br /&gt;
&lt;br /&gt;
# Open a device’s &#039;&#039;&#039;Edit&#039;&#039;&#039; dialog (Admin permission required) on the Utility, Weather, or Temperature tab.&lt;br /&gt;
# Click the &#039;&#039;&#039;bar chart icon&#039;&#039;&#039; (![bar icon]) in the top-right corner of the dialog form.&lt;br /&gt;
# In the &#039;&#039;&#039;Bar Ranges&#039;&#039;&#039; popup, define one or more ranges:&lt;br /&gt;
#* &#039;&#039;&#039;From / To&#039;&#039;&#039; — numeric bounds for this range segment&lt;br /&gt;
#* &#039;&#039;&#039;Color&#039;&#039;&#039; — the fill color for this segment (color picker)&lt;br /&gt;
#* Click &#039;&#039;&#039;+&#039;&#039;&#039; to add; drag or use the trash icon to remove&lt;br /&gt;
# Click &#039;&#039;&#039;Save&#039;&#039;&#039; in the popup, then &#039;&#039;&#039;Update&#039;&#039;&#039; in the Edit dialog to persist.&lt;br /&gt;
&lt;br /&gt;
Ranges are stored in the device’s &amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt; database field as a keyed JSON object, so each sensor type on a multi-sensor device (e.g. Temp+Hum+Baro) stores its bar configuration independently. Editing the bar from the Temperature tab configures the temperature bar; editing from the Weather tab configures the barometer bar — they do not overwrite each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;supported-device-types&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Supported Device Types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility tab&#039;&#039;&#039; — all numeric sensor types: Electric usage, kWh energy, Percentage, Gas/Counter, Custom Sensor, Lux, Voltage, Current, Setpoint, Air Quality, Pressure, Distance, Weight, Sound Level, Waterflow, Fan, Leaf Wetness, Soil Moisture, A/D, Power, Energy, Current/Energy, Radiator 1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weather tab&#039;&#039;&#039; — all six device types: Barometer (value: pressure in hPa), Rain (value: mm), Wind (value: speed), UV (value: UVI), Visibility (value: distance), Radiation (value: from Data field).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Temperature tab&#039;&#039;&#039; — temperature sensors (value: °C/°F), humidity sensors (value: %), Temp+Humidity, Temp+Humidity+Baro, Wind+Temp/Chill.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar-display&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bar Display ===&lt;br /&gt;
&lt;br /&gt;
Configured bars appear: - On the respective tab (Utility / Weather / Temperature) - On the classic dashboard for favorited devices (both desktop and mobile views)&lt;br /&gt;
&lt;br /&gt;
The bar fills proportionally across the defined ranges and renders a linear gradient through the configured colors.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;widgets&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Widgets ==&lt;br /&gt;
&lt;br /&gt;
Widgets are grouped into the following categories: &#039;&#039;&#039;Info&#039;&#039;&#039;, &#039;&#039;&#039;Charts &amp;amp;amp; Data&#039;&#039;&#039;, &#039;&#039;&#039;Energy&#039;&#039;&#039;, &#039;&#039;&#039;Devices&#039;&#039;&#039;, &#039;&#039;&#039;Controls&#039;&#039;&#039;, &#039;&#039;&#039;Weather&#039;&#039;&#039;, &#039;&#039;&#039;Information&#039;&#039;&#039;, &#039;&#039;&#039;System&#039;&#039;&#039;, &#039;&#039;&#039;Custom Content&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;clock&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Clock ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Displays the current local time and date. Updates every second.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show seconds&lt;br /&gt;
| on&lt;br /&gt;
| Include seconds in the time display&lt;br /&gt;
|-&lt;br /&gt;
| 24-hour format&lt;br /&gt;
| on&lt;br /&gt;
| Use 24h clock; off for 12h with AM/PM&lt;br /&gt;
|-&lt;br /&gt;
| Show date&lt;br /&gt;
| on&lt;br /&gt;
| Show the date line below the time&lt;br /&gt;
|-&lt;br /&gt;
| Timezone&lt;br /&gt;
| local&lt;br /&gt;
| Timezone for the displayed time; search by city or region name&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sun-info&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Sun Info ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Weather&lt;br /&gt;
&lt;br /&gt;
Shows today’s sunrise and sunset times, derived from the configured location in Domoticz settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Barometer ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Weather&lt;br /&gt;
&lt;br /&gt;
Displays barometric pressure and weather forecast string from a barometer device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Barometer device&lt;br /&gt;
| Any Temp+Baro or Temp+Hum+Baro device&lt;br /&gt;
|-&lt;br /&gt;
| Custom Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: updates on WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; for the configured device.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;weather&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Weather ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Weather&lt;br /&gt;
&lt;br /&gt;
Displays current weather conditions with an animated weather scene background (sun, clouds, rain, snow, moon/stars at night).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Temperature device&lt;br /&gt;
| Any Temp / Temp+Hum / Temp+Hum+Baro device&lt;br /&gt;
|-&lt;br /&gt;
| Wind device&lt;br /&gt;
| A Wind type device&lt;br /&gt;
|-&lt;br /&gt;
| Barometer device&lt;br /&gt;
| A Temp+Baro or Temp+Hum+Baro device&lt;br /&gt;
|-&lt;br /&gt;
| Display style&lt;br /&gt;
| &#039;&#039;&#039;Style 1&#039;&#039;&#039; (default) or &#039;&#039;&#039;Style 2&#039;&#039;&#039; (see below)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Style 1:&#039;&#039;&#039; Data-dense view with the animated weather scene as a background. Shows temperature, wind speed/direction, barometer, humidity, and forecast string as individual rows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Style 2:&#039;&#039;&#039; Full-height immersive scene card. The animated scene fills the widget (sun rays / moon + stars / clouds / rain / snow), with large temperature and forecast string centered over it. Includes dew point, humidity, and barometer. Night mode activates automatically between sunset and sunrise.&lt;br /&gt;
&lt;br /&gt;
Live: updates instantly from WebSocket device updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;stat-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Stat Counter ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Displays a single large KPI number from any device. Clicking the value navigates to the device log.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| —&lt;br /&gt;
| Any used device&lt;br /&gt;
|-&lt;br /&gt;
| Label&lt;br /&gt;
| —&lt;br /&gt;
| Optional custom label (defaults to device name)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: updates instantly from WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; events.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-graph&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Temperature Graph ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Highcharts chart showing temperature history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Temperature / Temp+Hum type device&lt;br /&gt;
|-&lt;br /&gt;
| Chart type&lt;br /&gt;
| See table below&lt;br /&gt;
|-&lt;br /&gt;
| Custom title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chart types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Last 24h&lt;br /&gt;
| Hourly temperature spline&lt;br /&gt;
|-&lt;br /&gt;
| Last 7 days&lt;br /&gt;
| Daily temperature spline&lt;br /&gt;
|-&lt;br /&gt;
| Last month&lt;br /&gt;
| Daily temperature spline&lt;br /&gt;
|-&lt;br /&gt;
| Last year&lt;br /&gt;
| Monthly temperature spline&lt;br /&gt;
|-&lt;br /&gt;
| Dew Point&lt;br /&gt;
| Temperature + dew point dual-line&lt;br /&gt;
|-&lt;br /&gt;
| Temp vs Humidity&lt;br /&gt;
| Temperature and humidity with dual y-axis&lt;br /&gt;
|-&lt;br /&gt;
| Comfort Zone&lt;br /&gt;
| Temperature/humidity scatter plot with comfort zone bands&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-energy-chart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Counter / Energy Chart ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Column or area chart for counter and energy devices (kWh, Gas, Water, P1, generic counter). Automatically detects the device type and display unit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Counter / kWh / Gas / Water / P1 Meter device&lt;br /&gt;
|-&lt;br /&gt;
| Chart type&lt;br /&gt;
| See table below&lt;br /&gt;
|-&lt;br /&gt;
| Custom title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Bar color&lt;br /&gt;
| Color for single-series counter charts (gas, water, non-P1 kWh). Defaults to cyan &amp;lt;code&amp;gt;#03befc&amp;lt;/code&amp;gt;, matching the P1 “Usage” series. Ignored for P1 dual-series charts (which use fixed usage/return colors)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chart types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Short Log&lt;br /&gt;
| High-resolution bars covering the last 2–3 days. For P1 meters: area chart in Watts. For all other types (water, gas, kWh): column bars in the device’s native unit. Chart title shows the actual day span (e.g. “Last 3 Days”)&lt;br /&gt;
|-&lt;br /&gt;
| Today (hourly)&lt;br /&gt;
| Hourly bars over the rolling last 24 hours, matching the Domoticz log page’s “Today” view&lt;br /&gt;
|-&lt;br /&gt;
| Last week&lt;br /&gt;
| Daily bars&lt;br /&gt;
|-&lt;br /&gt;
| Last month&lt;br /&gt;
| Daily bars&lt;br /&gt;
|-&lt;br /&gt;
| Last year&lt;br /&gt;
| Monthly bars&lt;br /&gt;
|-&lt;br /&gt;
| Compare years&lt;br /&gt;
| Multiple years overlaid as grouped bars per month&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
P1 Smart Meters with return capability display import and export as two separate series.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zooming:&#039;&#039;&#039; Drag horizontally on any chart to zoom in on a time range. A &#039;&#039;Reset zoom&#039;&#039; button appears to return to the full view.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind-chart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wind Chart ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Wind data charts for a Wind type device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Wind type device&lt;br /&gt;
|-&lt;br /&gt;
| Chart type&lt;br /&gt;
| See table below&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chart types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Last 24h&lt;br /&gt;
| Speed + gust line chart. Tooltips show Beaufort scale notation (Calm, Light Breeze, Strong Breeze, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Wind Direction&lt;br /&gt;
| Wind rose (polar chart) showing frequency per direction sector&lt;br /&gt;
|-&lt;br /&gt;
| Speed Frequency&lt;br /&gt;
| Histogram of wind speed occurrences&lt;br /&gt;
|-&lt;br /&gt;
| Last Month&lt;br /&gt;
| Daily average speed bars&lt;br /&gt;
|-&lt;br /&gt;
| Last Year&lt;br /&gt;
| Monthly average speed bars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-chart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Rain Chart ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Rain data charts for a Rain type device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Rain type device&lt;br /&gt;
|-&lt;br /&gt;
| Chart type&lt;br /&gt;
| See table below&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Chart types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Last 24h&lt;br /&gt;
| Rain rate (mm/h) line + cumulative total area, dual y-axis&lt;br /&gt;
|-&lt;br /&gt;
| Last week&lt;br /&gt;
| Daily total bars&lt;br /&gt;
|-&lt;br /&gt;
| Last month&lt;br /&gt;
| Daily total bars&lt;br /&gt;
|-&lt;br /&gt;
| Last year&lt;br /&gt;
| Monthly total bars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gauge&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Gauge ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Circular arc gauge showing the current value of any numeric device against a configurable min/max range with colour-coded thresholds.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| —&lt;br /&gt;
| Any numeric device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| device name&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Min&lt;br /&gt;
| 0&lt;br /&gt;
| Minimum scale value&lt;br /&gt;
|-&lt;br /&gt;
| Max&lt;br /&gt;
| 100&lt;br /&gt;
| Maximum scale value&lt;br /&gt;
|-&lt;br /&gt;
| Unit&lt;br /&gt;
| %&lt;br /&gt;
| Display unit&lt;br /&gt;
|-&lt;br /&gt;
| Warn threshold&lt;br /&gt;
| 50&lt;br /&gt;
| Value where colour shifts from first to second zone&lt;br /&gt;
|-&lt;br /&gt;
| Critical threshold&lt;br /&gt;
| 80&lt;br /&gt;
| Value where colour shifts from second to third zone&lt;br /&gt;
|-&lt;br /&gt;
| Threshold mode&lt;br /&gt;
| low-is-good&lt;br /&gt;
| &#039;&#039;&#039;low-is-good&#039;&#039;&#039; (e.g. CPU load): green → yellow → red as value rises. &#039;&#039;&#039;high-is-good&#039;&#039;&#039; (e.g. battery %): red → yellow → green as value rises&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The gauge is rendered as a pure SVG arc — no Highcharts required. The fill animates smoothly on value changes. Clicking the value or unit text navigates to the device log.&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 30 seconds and on WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; for the configured device.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-chart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom Chart ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Charts &amp;amp;amp; Data&lt;br /&gt;
&lt;br /&gt;
Free-form Highcharts chart where you can combine up to 10 sensors (temperature, counter, humidity, rain, wind, etc.) on a single chart with a shared time range.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Time range&lt;br /&gt;
| Last 24h&lt;br /&gt;
| Last 24h / Last 7 days / Last month / Last year&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| —&lt;br /&gt;
| Optional chart title&lt;br /&gt;
|-&lt;br /&gt;
| Show legend&lt;br /&gt;
| on&lt;br /&gt;
| Toggle chart legend&lt;br /&gt;
|-&lt;br /&gt;
| Device 1–10&lt;br /&gt;
| —&lt;br /&gt;
| Up to 10 device pickers; each added device becomes one series&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The sensor type and y-axis unit are detected automatically from the device type. Series with matching units share a y-axis; incompatible units get separate axes.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== kWh Summary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Compact stat card showing current power (W) and today’s energy total (kWh). Clicking the current power (W) value navigates to the device log.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Energy / Counter type device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override (defaults to device name)&lt;br /&gt;
|-&lt;br /&gt;
| Color&lt;br /&gt;
| Token color: import (orange) / export (green) / solar (yellow) / gas (red)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 30 seconds and on WebSocket device updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Gas Summary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Compact stat card showing today’s gas usage and cumulative total.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Gas type device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 60 seconds and on WebSocket device updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;water-summary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Water Summary ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Compact stat card showing today’s water usage, year-to-date total, and optionally today’s cost.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Water meter device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override (defaults to device name)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Displays today’s usage (in Liters or m³ depending on device configuration), the year-to-date total derived from the annual graph, and the day’s water cost if the price is configured (price = 1000 is treated as “not configured” and hidden).&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 60 seconds and on WebSocket device updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-electricity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== P1 Electricity ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Dedicated widget for Dutch P1 smart meters showing current import/export power and today’s totals.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| P1 Electricity Meter device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show price&lt;br /&gt;
| Show today’s cost (if reported by meter)&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Displays an up-arrow (exporting) or down-arrow (importing) with current watts, coloured green for export and orange for import. Sub-line shows today’s totals for both directions.&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 30 seconds and on WebSocket device updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;battery-status&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Battery Status ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Battery energy storage widget showing today’s imported/exported kWh, net, and live SOC / watts / voltage. Clicking any value navigates to the corresponding device log.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Auto mode&lt;br /&gt;
| Read device IDs from the Energy Dashboard settings&lt;br /&gt;
|-&lt;br /&gt;
| Battery energy in&lt;br /&gt;
| Manual: import kWh device&lt;br /&gt;
|-&lt;br /&gt;
| Battery energy out&lt;br /&gt;
| Manual: export kWh device&lt;br /&gt;
|-&lt;br /&gt;
| Battery SOC&lt;br /&gt;
| Manual: state-of-charge % sensor&lt;br /&gt;
|-&lt;br /&gt;
| Battery watts&lt;br /&gt;
| Manual: current power device&lt;br /&gt;
|-&lt;br /&gt;
| Battery voltage&lt;br /&gt;
| Manual: voltage sensor&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| Show the widget panel background (default: on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When &#039;&#039;&#039;Auto mode&#039;&#039;&#039; is on, device IDs are read automatically from &amp;lt;code&amp;gt;getenergydashboarddevices&amp;lt;/code&amp;gt; — zero extra configuration if the Energy Dashboard is already set up.&lt;br /&gt;
&lt;br /&gt;
Live: refreshes every 60 seconds.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;energy-dashboard&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Energy Dashboard ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Full energy overview widget — combines all cards (Weather, Grid, Solar, Gas, Battery) and the self-sufficiency balance bar in one resizable widget. Lifted directly from &amp;lt;code&amp;gt;forecast.html&amp;lt;/code&amp;gt;. Clicking any value on a card navigates to the corresponding device log.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show weather card&lt;br /&gt;
| on&lt;br /&gt;
| Weather conditions&lt;br /&gt;
|-&lt;br /&gt;
| Show solar card&lt;br /&gt;
| on&lt;br /&gt;
| Solar power and yield&lt;br /&gt;
|-&lt;br /&gt;
| Show gas card&lt;br /&gt;
| on&lt;br /&gt;
| Gas usage&lt;br /&gt;
|-&lt;br /&gt;
| Show battery card&lt;br /&gt;
| on&lt;br /&gt;
| Battery status&lt;br /&gt;
|-&lt;br /&gt;
| Show balance bar&lt;br /&gt;
| on&lt;br /&gt;
| Self-sufficiency stats&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 60s&lt;br /&gt;
| Seconds between data refresh&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Device IDs are read automatically from the Energy Dashboard settings (&amp;lt;code&amp;gt;getenergydashboarddevices&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;self-sufficiency&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Self-Sufficiency ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Energy&lt;br /&gt;
&lt;br /&gt;
Compact bar showing energy self-sufficiency percentage and today’s balance stats (house consumption, solar yield, battery net). Device IDs are read automatically from the Energy Dashboard settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show gauge bar&lt;br /&gt;
| on&lt;br /&gt;
| Green→red percentage bar&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 60s&lt;br /&gt;
| Seconds between data refresh&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Self-sufficiency formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;batNet           = batCharge - batDischarge&lt;br /&gt;
houseConsumption = p1Import + solar - p1Export - batNet&lt;br /&gt;
selfSufficiency  = (solar + batDischarge) / houseConsumption × 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
Result is clamped to 0–100%. Battery discharge counts as local generation — energy stored earlier from solar and discharged later correctly reduces grid dependence.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Text Sensor ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Devices&lt;br /&gt;
&lt;br /&gt;
Displays the text value (&amp;lt;code&amp;gt;Data&amp;lt;/code&amp;gt; field) of a Domoticz Text sensor device.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| —&lt;br /&gt;
| Text sensor device&lt;br /&gt;
|-&lt;br /&gt;
| Show title&lt;br /&gt;
| on&lt;br /&gt;
| Show device name as header&lt;br /&gt;
|-&lt;br /&gt;
| Font size&lt;br /&gt;
| 14px&lt;br /&gt;
| Text size in pixels&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 60s&lt;br /&gt;
| Seconds between refresh&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Content preserves whitespace and line breaks. Live: re-fetches immediately on WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; for the configured device.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Devices&lt;br /&gt;
&lt;br /&gt;
Embeds any single Domoticz device using its native widget (the same widget used in the classic dashboard).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| Any device&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The background is transparent in view mode. Live: instant WebSocket updates.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / Group ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Devices&lt;br /&gt;
&lt;br /&gt;
Embeds a Domoticz scene or group with its native widget.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Scene or Group&lt;br /&gt;
| Any defined scene or group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: WebSocket &amp;lt;code&amp;gt;scene_update&amp;lt;/code&amp;gt; events.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;favorites&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Favorites ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Devices&lt;br /&gt;
&lt;br /&gt;
Shows all favorite devices grouped by category, reproducing the classic dashboard tabs in a single widget.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Category filter&lt;br /&gt;
| All / Switches &amp;amp;amp; Lights / Temperature / Weather / Utility&lt;br /&gt;
|-&lt;br /&gt;
| Limit to room/plan&lt;br /&gt;
| Optional plan ID&lt;br /&gt;
|-&lt;br /&gt;
| Show category tabs&lt;br /&gt;
| Toggle tab bar&lt;br /&gt;
|-&lt;br /&gt;
| Custom Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scene_update&amp;lt;/code&amp;gt; + 60s polling fallback.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;room-plan&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Room / Plan ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Devices&lt;br /&gt;
&lt;br /&gt;
Shows all devices belonging to a specific Domoticz plan (room), including scenes and groups. Supports two display modes selectable in settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grid mode (default):&#039;&#039;&#039; Each device is rendered using its native widget tile — the same tiles used in the classic dashboard.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;List mode:&#039;&#039;&#039; Displays all devices as a compact vertical list. Interactive device types are fully controllable:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Behaviour&lt;br /&gt;
|-&lt;br /&gt;
| Switch / Scene&lt;br /&gt;
| Toggle button; icon tinted accent when device is On. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Dimmer&lt;br /&gt;
| Label + slider icon + power toggle. Slider icon opens inline dim slider; power icon toggles On/Off. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Selector switch&lt;br /&gt;
| Shows current level; click opens inline level picker. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Blind&lt;br /&gt;
| Up / Close buttons, plus Stop if the device supports it. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Group&lt;br /&gt;
| On and Off buttons as a compact pair. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Security Panel&lt;br /&gt;
| Disarm / Arm Home / Arm Away buttons. Clicking the icon navigates to the device log&lt;br /&gt;
|-&lt;br /&gt;
| Sensor / Utility&lt;br /&gt;
| Read-only row: icon, device name, current value and unit. Clicking the icon navigates to the device log. P1 smart meters show two lines: usage + actual power on the first line, return energy on the second&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Room / Plan&lt;br /&gt;
| Select the Domoticz plan to display&lt;br /&gt;
|-&lt;br /&gt;
| List layout&lt;br /&gt;
| Toggle between grid (default) and list mode&lt;br /&gt;
|-&lt;br /&gt;
| Custom Title&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scene_update&amp;lt;/code&amp;gt; + 60s polling fallback.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;setpoint&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Setpoint ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Controls&lt;br /&gt;
&lt;br /&gt;
Display and control a Domoticz setpoint device with +/− step buttons and a click-to-edit popup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| —&lt;br /&gt;
| Setpoint type device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| device name&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Step, min, max, and unit are read automatically from the device. Clicking the value opens a number input popup (pre-filled with current value) for direct entry. Commands use &amp;lt;code&amp;gt;setdevice&amp;amp;amp;idx=X&amp;amp;amp;setpoint=Y&amp;lt;/code&amp;gt;. Live: WebSocket device updates re-fetch the current value.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Thermostat ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Controls&lt;br /&gt;
&lt;br /&gt;
Combined widget showing current temperature from a sensor alongside setpoint controls. Ideal for room thermostats.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Temperature sensor&lt;br /&gt;
| —&lt;br /&gt;
| Temp / Temp+Hum sensor&lt;br /&gt;
|-&lt;br /&gt;
| Setpoint device&lt;br /&gt;
| —&lt;br /&gt;
| Setpoint device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| —&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Step, min, max, and unit are read automatically from the setpoint device. Displays the current temperature large and prominent, with +/− setpoint controls below. Both devices are fetched in a single API call.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Thermostat6 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Controls&lt;br /&gt;
&lt;br /&gt;
Widget for the Thermostat6 device type. Displays all available measured values (Temp, Humidity + status, Barometer) and setpoint controls. Only rows for values present on the device are shown.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Device&lt;br /&gt;
| —&lt;br /&gt;
| Thermostat6 device&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| device name&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Step, min, and max are read automatically from the device.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;weather-forecast&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Weather Forecast ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Weather&lt;br /&gt;
&lt;br /&gt;
Multi-day weather forecast using the [https://open-meteo.com Open-Meteo API] (free, no API key required). Location is read automatically from Domoticz settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Days&lt;br /&gt;
| 7&lt;br /&gt;
| Forecast days to display (1–14)&lt;br /&gt;
|-&lt;br /&gt;
| Show wind&lt;br /&gt;
| on&lt;br /&gt;
| Wind speed row&lt;br /&gt;
|-&lt;br /&gt;
| Show precipitation&lt;br /&gt;
| on&lt;br /&gt;
| Precipitation row&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Weather Forecast&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Displays a horizontal grid of day columns, each with a weather icon (mapped from WMO weather codes), temperature range, precipitation (mm), and wind speed (km/h).&lt;br /&gt;
&lt;br /&gt;
Data is cached for 30 minutes to avoid excessive API calls.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rss-feed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== RSS Feed ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Information&lt;br /&gt;
&lt;br /&gt;
Displays items from any RSS or Atom feed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Feed URL&lt;br /&gt;
| —&lt;br /&gt;
| Full URL of the RSS/Atom feed&lt;br /&gt;
|-&lt;br /&gt;
| Max items&lt;br /&gt;
| 5&lt;br /&gt;
| Items to display (1–20)&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 300s&lt;br /&gt;
| Seconds between fetches&lt;br /&gt;
|-&lt;br /&gt;
| Show images&lt;br /&gt;
| on&lt;br /&gt;
| Show thumbnail images&lt;br /&gt;
|-&lt;br /&gt;
| Show date&lt;br /&gt;
| on&lt;br /&gt;
| Show relative timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Open in new tab&lt;br /&gt;
| on&lt;br /&gt;
| Links open in a new browser tab&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| feed title&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Fetches feeds via the [https://api.rss2json.com rss2json.com] proxy (free tier, no API key needed) which solves CORS limitations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Single item mode&#039;&#039;&#039; (&amp;lt;code&amp;gt;Max items: 1&amp;lt;/code&amp;gt;): Shows the latest item with a large image, headline, and excerpt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-item mode&#039;&#039;&#039;: Shows a scrollable list with thumbnails, truncated titles, and relative timestamps (“2h ago”, “3d ago”). Each item has a link icon to open the original article.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;google-calendar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Google Calendar ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Information&lt;br /&gt;
&lt;br /&gt;
Displays upcoming events from a Google Calendar or any ICS-compatible calendar, grouped as Today / Tomorrow / upcoming days.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Calendar URL&lt;br /&gt;
| —&lt;br /&gt;
| Public ICS URL or Google Calendar API endpoint&lt;br /&gt;
|-&lt;br /&gt;
| Max events&lt;br /&gt;
| 7&lt;br /&gt;
| Maximum upcoming events to show&lt;br /&gt;
|-&lt;br /&gt;
| Show time&lt;br /&gt;
| on&lt;br /&gt;
| Show event start time&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 900s&lt;br /&gt;
| Seconds between fetches (minimum 60)&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Calendar&lt;br /&gt;
| Optional override&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting a Google Calendar ICS URL:&#039;&#039;&#039; In Google Calendar → Settings → click the calendar → &#039;&#039;Integrate calendar&#039;&#039; → copy the &#039;&#039;&#039;Secret address in iCal format&#039;&#039;&#039; (ends in &amp;lt;code&amp;gt;.ics&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the Google Calendar JSON API:&#039;&#039;&#039; Requires a public calendar and a Google API key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events&lt;br /&gt;
  ?key={apiKey}&amp;amp;amp;orderBy=startTime&amp;amp;amp;singleEvents=true&amp;amp;amp;timeMin={now}&amp;lt;/pre&amp;gt;&lt;br /&gt;
The widget auto-detects &amp;lt;code&amp;gt;.ics&amp;lt;/code&amp;gt; vs JSON API URLs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CORS handling:&#039;&#039;&#039; The widget fetches calendar data using a fallback chain:&lt;br /&gt;
&lt;br /&gt;
# Direct request (works for CORS-friendly URLs)&lt;br /&gt;
# Domoticz server-side proxy (&amp;lt;code&amp;gt;json.htm?type=command&amp;amp;amp;param=fetchurl&amp;amp;amp;url=&amp;amp;lt;encoded&amp;amp;gt;&amp;lt;/code&amp;gt;) — avoids CORS entirely for any URL reachable from the Domoticz server&lt;br /&gt;
# Public CORS proxies (corsproxy.io / codetabs) as last resort&lt;br /&gt;
&lt;br /&gt;
A helpful error message is shown if all methods fail.&lt;br /&gt;
&lt;br /&gt;
Past events today are shown in muted color. All-day events display without a time.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-log&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System Log ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Displays recent Domoticz system log entries with filter toggles.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Max entries&lt;br /&gt;
| 50&lt;br /&gt;
| Log lines to display&lt;br /&gt;
|-&lt;br /&gt;
| Show Normal&lt;br /&gt;
| on&lt;br /&gt;
| Show Normal (white) entries&lt;br /&gt;
|-&lt;br /&gt;
| Show Status&lt;br /&gt;
| on&lt;br /&gt;
| Show Status (blue) entries&lt;br /&gt;
|-&lt;br /&gt;
| Show Error&lt;br /&gt;
| on&lt;br /&gt;
| Show Error (red) entries&lt;br /&gt;
|-&lt;br /&gt;
| Auto-refresh&lt;br /&gt;
| 10s&lt;br /&gt;
| Seconds between refresh (0 = off)&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| System Log&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Toggle buttons in the widget header show the count per level (e.g. &amp;lt;code&amp;gt;N 42&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;S 8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E 2&amp;lt;/code&amp;gt;) and can be clicked to show/hide each level. The Error button is coloured red when errors are present. A refresh button is also available.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;moon-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Moon Phase ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Information&lt;br /&gt;
&lt;br /&gt;
Shows the current moon phase with a large emoji graphic, phase name, illumination percentage, and next full/new moon date. Calculated entirely in JavaScript — no external API required.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show phase name&lt;br /&gt;
| on&lt;br /&gt;
| Display phase label (e.g. “Waxing Gibbous”)&lt;br /&gt;
|-&lt;br /&gt;
| Show next event&lt;br /&gt;
| on&lt;br /&gt;
| Next full moon or new moon date&lt;br /&gt;
|-&lt;br /&gt;
| Show illumination&lt;br /&gt;
| on&lt;br /&gt;
| Illumination percentage&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Moon&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Phase names: New Moon 🌑, Waxing Crescent 🌒, First Quarter 🌓, Waxing Gibbous 🌔, Full Moon 🌕, Waning Gibbous 🌖, Last Quarter 🌗, Waning Crescent 🌘.&lt;br /&gt;
&lt;br /&gt;
Updates daily.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quick-actions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Quick Actions ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
One-click buttons to trigger scenes and control switch devices, displayed in a grid or list layout.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Supported device types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type&lt;br /&gt;
! Behaviour&lt;br /&gt;
|-&lt;br /&gt;
| Switch&lt;br /&gt;
| Toggle button; icon tinted when device is On&lt;br /&gt;
|-&lt;br /&gt;
| Push On / Push Off&lt;br /&gt;
| Dedicated On or Off button; no toggle, no state indicator&lt;br /&gt;
|-&lt;br /&gt;
| Dimmer&lt;br /&gt;
| Label + slider icon + power toggle. Click the slider icon to open an inline horizontal dim slider; drag to set level. Click the power button to toggle On/Off. Icon tinted when device is On&lt;br /&gt;
|-&lt;br /&gt;
| Selector switch&lt;br /&gt;
| Shows current level text; click opens an inline level picker&lt;br /&gt;
|-&lt;br /&gt;
| Blind&lt;br /&gt;
| Up / Close buttons, plus optional Stop button (shown automatically when the device supports it)&lt;br /&gt;
|-&lt;br /&gt;
| Group&lt;br /&gt;
| On and Off buttons shown as a compact pair&lt;br /&gt;
|-&lt;br /&gt;
| Scene&lt;br /&gt;
| One-click activate button&lt;br /&gt;
|-&lt;br /&gt;
| Security Panel&lt;br /&gt;
| Navigates to the Domoticz security panel page. Current arm status shown on the right; icon tinted when armed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| List layout&lt;br /&gt;
| off&lt;br /&gt;
| Display actions as a vertical list (label left, icon/status right) instead of a grid&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action list editor:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use the action list to add, reorder, and remove actions. Drag the grip handle (⠿) to reorder. Click the pencil icon to rename; click the trash icon to delete.&lt;br /&gt;
&lt;br /&gt;
To add an action:&lt;br /&gt;
&lt;br /&gt;
# Select &#039;&#039;&#039;Device&#039;&#039;&#039; or &#039;&#039;&#039;Scene&#039;&#039;&#039; from the type dropdown&lt;br /&gt;
# Pick the device or scene from the searchable picker (only switch-type devices are shown)&lt;br /&gt;
# For &#039;&#039;&#039;selector switches&#039;&#039;&#039;: the level is &#039;&#039;not&#039;&#039; chosen here — it is selected at click-time in the widget&lt;br /&gt;
# Optionally enter a custom label (auto-filled from device/scene name if blank)&lt;br /&gt;
# Click &#039;&#039;&#039;+&#039;&#039;&#039; to add&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In the widget:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Click a switch button to toggle it; the icon turns accent-coloured when the device is On&lt;br /&gt;
* Click a dimmer’s slider icon to reveal the inline horizontal slider; drag to set dim level; click anywhere outside to dismiss without sending a command&lt;br /&gt;
* Click a selector button to open the inline level picker; the current level is shown beneath the label; the active level is highlighted&lt;br /&gt;
* Blind Up/Stop/Close buttons are shown as a compact group with the label on the left&lt;br /&gt;
* Group On/Off buttons are shown as a compact pair with the label on the left&lt;br /&gt;
* Click a Security Panel button to open the security panel page; the current arm status is shown to the right of the label&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quick-stat&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Quick Stat ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Compact status panel showing current values for any mix of devices — temperature, switches, kWh meters, humidity, and more. Useful as a at-a-glance status overview.&lt;br /&gt;
&lt;br /&gt;
Each row shows an icon, device name (or custom label), current value, and unit. Switch/light states are highlighted in accent colour when On. Clicking the icon navigates to the device log.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Display modes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Grid mode (default):&#039;&#039;&#039; Devices shown as small cards in a responsive grid (auto-fill, min 110px)&lt;br /&gt;
* &#039;&#039;&#039;List mode:&#039;&#039;&#039; Devices shown as full-width rows — icon left, name, value + unit right&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| List layout&lt;br /&gt;
| off&lt;br /&gt;
| Display as vertical list instead of a grid&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|-&lt;br /&gt;
| Devices&lt;br /&gt;
| —&lt;br /&gt;
| Add any mix of devices using the device list editor. Drag the grip handle to reorder; pencil to rename; trash to remove&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: updates instantly from WebSocket &amp;lt;code&amp;gt;device_update&amp;lt;/code&amp;gt; events for all configured devices.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text-note&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Text Note ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Displays custom text with configurable appearance. Useful for section headers, labels, or status messages. The content is rendered as sanitized HTML (DOMPurify with a strict allow-list), so a safe subset of inline markup — &amp;lt;code&amp;gt;&amp;amp;lt;b&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;i&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;a&amp;amp;gt;&amp;lt;/code&amp;gt;, basic tables, headings, lists, and scoped &amp;lt;code&amp;gt;&amp;amp;lt;style&amp;amp;gt;&amp;lt;/code&amp;gt; blocks — works for icons, color highlights, and small layouts. Scripts, iframes, and event handlers are stripped. An optional divider line can be shown alongside the text, making it easy to create visual section separators.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Content&lt;br /&gt;
| —&lt;br /&gt;
| The text or sanitized HTML to display&lt;br /&gt;
|-&lt;br /&gt;
| Font&lt;br /&gt;
| Default (theme)&lt;br /&gt;
| Default (theme), Arial, Verdana, Tahoma, Trebuchet MS, Helvetica Neue, Georgia, Times New Roman, Palatino, Courier New, Lucida Console, Impact, System UI&lt;br /&gt;
|-&lt;br /&gt;
| Size&lt;br /&gt;
| 14 px&lt;br /&gt;
| Font size in pixels (8–72)&lt;br /&gt;
|-&lt;br /&gt;
| Horizontal align&lt;br /&gt;
| Center&lt;br /&gt;
| Left / Center / Right&lt;br /&gt;
|-&lt;br /&gt;
| Vertical align&lt;br /&gt;
| Middle&lt;br /&gt;
| Top / Middle / Bottom — independent of horizontal alignment; the divider follows the chosen side&lt;br /&gt;
|-&lt;br /&gt;
| Style&lt;br /&gt;
| Normal&lt;br /&gt;
| Normal / Bold / Italic / Bold + Italic / Underline&lt;br /&gt;
|-&lt;br /&gt;
| Text color&lt;br /&gt;
| rgba(255,255,255,1)&lt;br /&gt;
| Color + opacity picker&lt;br /&gt;
|-&lt;br /&gt;
| Background color&lt;br /&gt;
| rgba(0,0,0,0)&lt;br /&gt;
| Color + opacity picker (default: transparent)&lt;br /&gt;
|-&lt;br /&gt;
| Show divider line&lt;br /&gt;
| off&lt;br /&gt;
| Show a horizontal line alongside the text&lt;br /&gt;
|-&lt;br /&gt;
| Divider color&lt;br /&gt;
| Accent color&lt;br /&gt;
| Color + opacity picker; leave empty to use the theme accent color&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;html-widget&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== HTML Widget ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Renders arbitrary HTML inside a sandboxed &amp;lt;code&amp;gt;&amp;amp;lt;iframe&amp;amp;gt;&amp;lt;/code&amp;gt;. Full documents (&amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;…&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/code&amp;gt;) and plain snippets are both supported.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Widget Title&lt;br /&gt;
| —&lt;br /&gt;
| Optional label overlaid at the top of the widget&lt;br /&gt;
|-&lt;br /&gt;
| HTML Content&lt;br /&gt;
| —&lt;br /&gt;
| Full HTML document or a snippet&lt;br /&gt;
|-&lt;br /&gt;
| Allow backend API access&lt;br /&gt;
| off&lt;br /&gt;
| Adds &amp;lt;code&amp;gt;allow-same-origin&amp;lt;/code&amp;gt; to the sandbox, enabling scripts to call &amp;lt;code&amp;gt;json.htm&amp;lt;/code&amp;gt; and other Domoticz API endpoints&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security:&#039;&#039;&#039; By default the iframe runs with &amp;lt;code&amp;gt;sandbox=&amp;amp;quot;allow-scripts&amp;amp;quot;&amp;lt;/code&amp;gt; — scripts execute in isolation and cannot access cookies, localStorage, or the parent page. Enabling &#039;&#039;&#039;Allow backend API access&#039;&#039;&#039; lifts the origin restriction so scripts can make authenticated requests to the Domoticz backend. Only enable this for HTML you wrote yourself.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;camera-feed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Camera Feed ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Controls&lt;br /&gt;
&lt;br /&gt;
Shows a live snapshot image from a Domoticz-configured camera.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Camera&lt;br /&gt;
| —&lt;br /&gt;
| Pick from configured cameras&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 5s&lt;br /&gt;
| Seconds between snapshot refreshes&lt;br /&gt;
|-&lt;br /&gt;
| Show camera name&lt;br /&gt;
| on&lt;br /&gt;
| Display the camera name in the widget header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;remote-image&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Remote Image ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Displays a remote image from a URL, with optional auto-refresh.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Image URL&lt;br /&gt;
| —&lt;br /&gt;
| Full URL to the image&lt;br /&gt;
|-&lt;br /&gt;
| Caption&lt;br /&gt;
| —&lt;br /&gt;
| Optional label shown over the image&lt;br /&gt;
|-&lt;br /&gt;
| Fit&lt;br /&gt;
| Contain&lt;br /&gt;
| Contain (full image visible) / Cover (fill area, crop) / Stretch to fill&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 0&lt;br /&gt;
| Seconds between reloads; 0 = no auto-refresh&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;website-embed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Website Embed ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Custom Content&lt;br /&gt;
&lt;br /&gt;
Embeds any external website or web app in an iframe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| URL&lt;br /&gt;
| —&lt;br /&gt;
| The page to embed (https:// recommended)&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| —&lt;br /&gt;
| Optional widget header label&lt;br /&gt;
|-&lt;br /&gt;
| Allow scripts&lt;br /&gt;
| off&lt;br /&gt;
| Enable JavaScript in the embedded page (trusted sources only)&lt;br /&gt;
|-&lt;br /&gt;
| Auto-reload&lt;br /&gt;
| 0&lt;br /&gt;
| Seconds between iframe reloads; 0 = off&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: Many external sites block iframe embedding via &amp;lt;code&amp;gt;X-Frame-Options&amp;lt;/code&amp;gt;. Works best with local network pages.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;battery-monitor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Battery Monitor ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Shows all Domoticz devices whose battery level is at or below a configurable threshold — a maintenance overview so you know which sensors need fresh batteries.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Threshold&lt;br /&gt;
| 25%&lt;br /&gt;
| Show devices at or below this battery level&lt;br /&gt;
|-&lt;br /&gt;
| Show all&lt;br /&gt;
| off&lt;br /&gt;
| When on, shows every device with a battery (above threshold shown in muted style)&lt;br /&gt;
|-&lt;br /&gt;
| Sort by&lt;br /&gt;
| level&lt;br /&gt;
| Sort by battery level ascending, or by device name&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 300s&lt;br /&gt;
| Seconds between refresh (5 minutes)&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| Battery Monitor&lt;br /&gt;
| Optional override&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Battery level colours: ≤10% red, ≤25% orange, ≤50% yellow, &amp;amp;gt;50% green. When nothing is below the threshold, a green “All batteries OK” message is shown. Devices without a battery (level = 255 in Domoticz) are always excluded.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timeout-monitor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timeout Monitor ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Shows all Domoticz devices that have not reported within their expected timeout interval — a quick way to spot sensors that have gone silent or lost power.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| &#039;&#039;(empty)&#039;&#039;&lt;br /&gt;
| Optional title override&lt;br /&gt;
|-&lt;br /&gt;
| Sort by&lt;br /&gt;
| Last update&lt;br /&gt;
| Sort by last update time (oldest first) or device name (A–Z)&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 300s&lt;br /&gt;
| Seconds between refresh&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When no devices are timed out, nothing is shown in the list. The device list shows each device name and how long ago it last reported (e.g. “3h ago”).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-top-consumers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== kWh Top Consumers ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Lists kWh-metered devices ranked by today’s energy consumption, highest first. Useful for spotting which appliances are using the most energy on any given day.&lt;br /&gt;
&lt;br /&gt;
Each row shows the device name, current power draw (W), and today’s total (kWh). The list updates instantly via WebSocket when any tracked device reports — including devices currently off-screen due to the row limit, which may move up the ranking in real time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Excluded automatically:&#039;&#039;&#039; - Devices from P1 Smart Meter hardware (L1/L2/L3 phase sensors, both serial and LAN variants) - Devices configured as type &#039;&#039;&#039;Return / Energy Generated&#039;&#039;&#039; (e.g. solar export meters) - Devices that have timed out&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Title&lt;br /&gt;
| &#039;&#039;(empty)&#039;&#039;&lt;br /&gt;
| Optional title override&lt;br /&gt;
|-&lt;br /&gt;
| Max devices to show&lt;br /&gt;
| 20&lt;br /&gt;
| Maximum number of rows displayed&lt;br /&gt;
|-&lt;br /&gt;
| Exclude device IDX&lt;br /&gt;
| &#039;&#039;(empty)&#039;&#039;&lt;br /&gt;
| Semicolon-separated list of device IDX values to hide (e.g. &amp;lt;code&amp;gt;42;107&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Refresh interval&lt;br /&gt;
| 300s&lt;br /&gt;
| Seconds between full refresh from the backend&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;activity-log&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Shows the most recently updated devices, ordered by last update time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Max items&lt;br /&gt;
| 5–50 items (default 15)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Live: reloads on every WebSocket device update and polls every 15 seconds.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-status&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System Status ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; System&lt;br /&gt;
&lt;br /&gt;
Shows Domoticz version, build number, and hardware count.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Show panel background&lt;br /&gt;
| on&lt;br /&gt;
| Show the widget panel background&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;live-update-reference&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Live Update Reference ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Widget&lt;br /&gt;
! Update method&lt;br /&gt;
|-&lt;br /&gt;
| Clock&lt;br /&gt;
| 1-second interval&lt;br /&gt;
|-&lt;br /&gt;
| Device / Scene&lt;br /&gt;
| Instant — WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Stat Counter&lt;br /&gt;
| Instant — WebSocket (no HTTP)&lt;br /&gt;
|-&lt;br /&gt;
| Weather&lt;br /&gt;
| Instant — WebSocket per sensor&lt;br /&gt;
|-&lt;br /&gt;
| Barometer&lt;br /&gt;
| Instant — WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Activity Log&lt;br /&gt;
| Instant — WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Favorites / Room&lt;br /&gt;
| Instant — WebSocket + 60s fallback&lt;br /&gt;
|-&lt;br /&gt;
| Temperature Graph&lt;br /&gt;
| 60s debounced reload on device update&lt;br /&gt;
|-&lt;br /&gt;
| Counter/Energy Chart&lt;br /&gt;
| 60s debounced reload on device update&lt;br /&gt;
|-&lt;br /&gt;
| Wind / Rain Chart&lt;br /&gt;
| 60s debounced reload&lt;br /&gt;
|-&lt;br /&gt;
| kWh Summary&lt;br /&gt;
| 30s interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| P1 Electricity&lt;br /&gt;
| 30s interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Gas Summary&lt;br /&gt;
| 60s interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Water Summary&lt;br /&gt;
| 60s interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Battery Status&lt;br /&gt;
| 60s interval&lt;br /&gt;
|-&lt;br /&gt;
| Energy Dashboard&lt;br /&gt;
| 60s interval&lt;br /&gt;
|-&lt;br /&gt;
| Self-Sufficiency&lt;br /&gt;
| Configurable interval (default 60s)&lt;br /&gt;
|-&lt;br /&gt;
| Text Sensor&lt;br /&gt;
| Configurable interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Setpoint / Thermostat&lt;br /&gt;
| 30s interval + WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Thermostat6&lt;br /&gt;
| 30s interval + WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| System Log&lt;br /&gt;
| Configurable interval (default 10s)&lt;br /&gt;
|-&lt;br /&gt;
| Weather Forecast&lt;br /&gt;
| 30-minute interval (cached)&lt;br /&gt;
|-&lt;br /&gt;
| RSS Feed&lt;br /&gt;
| Configurable interval (default 5 min)&lt;br /&gt;
|-&lt;br /&gt;
| Google Calendar&lt;br /&gt;
| Configurable interval (default 15 min)&lt;br /&gt;
|-&lt;br /&gt;
| Moon Phase&lt;br /&gt;
| Daily&lt;br /&gt;
|-&lt;br /&gt;
| Gauge&lt;br /&gt;
| 30s interval + instant WebSocket&lt;br /&gt;
|-&lt;br /&gt;
| Battery Monitor&lt;br /&gt;
| Configurable interval (default 5 min)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout Monitor&lt;br /&gt;
| Configurable interval (default 5 min)&lt;br /&gt;
|-&lt;br /&gt;
| kWh Top Consumers&lt;br /&gt;
| Configurable interval (default 5 min) + instant WebSocket per tracked device&lt;br /&gt;
|-&lt;br /&gt;
| Custom Chart&lt;br /&gt;
| 60s debounced reload on config/range change&lt;br /&gt;
|-&lt;br /&gt;
| Quick Stat&lt;br /&gt;
| Instant — WebSocket per device&lt;br /&gt;
|-&lt;br /&gt;
| Sun Info / Text Note / HTML / Image&lt;br /&gt;
| Static&lt;br /&gt;
|-&lt;br /&gt;
| Website Embed&lt;br /&gt;
| Configurable auto-reload interval (default off)&lt;br /&gt;
|-&lt;br /&gt;
| Camera Feed&lt;br /&gt;
| Configurable interval (default 5s)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
-----&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=File:Dynamic_dashboard.png&amp;diff=19254</id>
		<title>File:Dynamic dashboard.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=File:Dynamic_dashboard.png&amp;diff=19254"/>
		<updated>2026-08-11T18:32:07Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dynamic dashboard&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19253</id>
		<title>DzVents: next generation Lua scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19253"/>
		<updated>2026-08-09T12:38:32Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Thermostat 6 3.1.11 */ Layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: This document is maintained on [https://github.com/domoticz/domoticz/blob/development/dzVents/documentation/README.md github], and the wiki version is automatically generated. Edits should be performed on github, or they may be suggested on the wiki article’s [https://wiki.domoticz.com/Talk:DzVents:_next_generation_Lua_scripting Discussion page]. Editing can be done by any editor but if you are looking for a specialized markDown editor; [https://stackedit.io/app# stackedit.io] would be a good choice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;about-dzvents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About dzVents =&lt;br /&gt;
&lt;br /&gt;
dzVents /diː ziː vɛnts/, short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts. And … &#039;&#039;&#039;it is 100% Lua&#039;&#039;&#039;! So if you already have a bunch of event scripts for Domoticz, upgrading should be fairly easy.&lt;br /&gt;
&lt;br /&gt;
Let’s start with an example. Say you have a switch that when activated, it should activate another switch but only if the room temperature is above a certain level. And when done, it should send a notification. This is how it looks in dzVents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;Room switch&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, roomSwitch)&lt;br /&gt;
        if (roomSwitch.active and domoticz.devices(&#039;Living room&#039;).temperature &amp;gt; 18) then&lt;br /&gt;
        domoticz.devices(&#039;Another switch&#039;).switchOn()&lt;br /&gt;
        domoticz.notify(&#039;This rocks!&#039;,&lt;br /&gt;
                        &#039;Turns out that it is getting warm here&#039;,&lt;br /&gt;
                        domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you have a timer script that should be executed every 10 minutes, but only on weekdays, and have it do something with some user variables and only during daytime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
            --activate my scene&lt;br /&gt;
            domoticz.scenes(&#039;Evening lights&#039;).switchOn()&lt;br /&gt;
            if (domoticz.devices(&#039;My PIR&#039;).lastUpdate.minutesAgo &amp;gt; 5) then&lt;br /&gt;
                domoticz.devices(&#039;Bathroom lights&#039;).switchOff()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you want to detect a humidity rise within the past 5 minutes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;every 5 minutes&#039;}&lt;br /&gt;
    },&lt;br /&gt;
    data =&lt;br /&gt;
    {&lt;br /&gt;
        previousHumidity = { initial = 100 }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        local bathroomSensor = domoticz.devices(&#039;BathroomSensor&#039;)&lt;br /&gt;
        if (bathroomSensor.humidity - domoticz.data.previousHumidity) &amp;gt;= 5 then&lt;br /&gt;
            -- there was a significant rise&lt;br /&gt;
            domoticz.devices(&#039;Ventilator&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
        -- store current value for next cycle&lt;br /&gt;
        domoticz.data.previousHumidity = bathroomSensor.humidity&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just to give you an idea! Everything in your Domoticz system is now logically available in the domoticz object structure. With this domoticz object, you can get to all the information in your system and manipulate your devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;using-dzvents-with-domoticz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Using dzVents with Domoticz =&lt;br /&gt;
&lt;br /&gt;
In Domoticz go to &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other&#039;&#039;&#039; and in the section EventSystem make sure the check-box ‘dzVents disabled’ is not checked. Also make sure that in the Security section in the settings &#039;&#039;&#039;(Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Local Networks (no username/password)&#039;&#039;&#039; you allow 127.0.0.1 (and / or ::1 when using IPv6 ) to not need a password. dzVents does use this port to get the location settings and to send certain commands to Domoticz. Finally make sure you have set your current location in &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Location&#039;&#039;&#039;, otherwise there is no way to determine nighttime/daytime state.&lt;br /&gt;
&lt;br /&gt;
There are two ways of creating dzVents event scripts in Domoticz:&lt;br /&gt;
&lt;br /&gt;
# By creating scripts in your domoticz instance on your domoticz server: &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Make sure that each script has the extension &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; and follows the guidelines as described below.&lt;br /&gt;
# By creating scripts inside Domoticz using the internal Domoticz event editor: Go to &#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Events&#039;&#039;&#039;. Press the + button and choose dzVents. You must then choose a template. They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: scripts that you write on the file-system and inside Domoticz using the internal web-editor all share the same name-space. That means that if you have two scripts with the same name, only the one of the file-system will be used. The log will tell you when this happens.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: Scripts created in the internal editor are stored in the domoticz database and are all written to &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/generated_scripts&amp;lt;/code&amp;gt; on every domoticz restart and every “EventSystem: reset all events…”. Scripts in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt; are not stored in the database and should be backed-up separately. &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quickstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
If you made sure that dzVents system is active, we can do a quick test if everything works:&lt;br /&gt;
&lt;br /&gt;
* Pick a switch in your Domoticz system. Write down the exact name of the switch. If you don’t have a switch then you can create a Dummy switch and use that one.&lt;br /&gt;
* Create a new file in the &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/&amp;lt;/code&amp;gt; folder (or using the web-editor in Domoticz, switch to dzVents mode first.). Call the file &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt;. &#039;&#039;Note: when you create a script in the web-editor you do &#039;&#039;&#039;not&#039;&#039;&#039; add the .lua extension!&#039;&#039; Also, valid script names follow the same rules as [https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words filesystem names].&lt;br /&gt;
* Open &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt; in an editor and fill it with this code and change &amp;lt;code&amp;gt;&amp;amp;lt;exact name of the switch&amp;amp;gt;&amp;lt;/code&amp;gt; with the .. you guessed it… exact name of the switch device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&lt;br /&gt;
            &#039;&amp;lt;exact name of the switch&amp;gt;&#039;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (switch.state == &#039;On&#039;) then&lt;br /&gt;
                domoticz.log(&#039;Hey! I am on!&#039;)&lt;br /&gt;
            else&lt;br /&gt;
                domoticz.log(&#039;Hey! I am off!&#039;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Save the script&lt;br /&gt;
* Open the Domoticz log in the browser&lt;br /&gt;
* In Domoticz GUI perhaps in another browser tab) press the switch.&lt;br /&gt;
* You can watch the log in Domoticz and it should show you that indeed it triggered your script and you should see the log messages.&lt;br /&gt;
&lt;br /&gt;
See the examples folder &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples&amp;lt;/code&amp;gt; for more examples. This folder includes templates you can use to get started as well. And, if you use the GUI web editor to write your script, you will find boilerplate examples in the drop-down below the script type setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;writing-scripts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Writing scripts =&lt;br /&gt;
&lt;br /&gt;
In order for your scripts to work with dzVents, they have to be turned into a Lua module with a specific structure. Basically you make sure it returns a Lua table (object) with predefined keys like &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt;. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;My switch&#039; }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, switch)&lt;br /&gt;
        -- your script logic goes here, something like this:&lt;br /&gt;
        if (switch.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.log(&#039;I am on!&#039;, domoticz.LOG_INFO)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Simply said, the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-part defines the trigger and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part is what should be done if the trigger matches with the current Domoticz event. So all your logic is inside the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sections-in-the-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sections in the script ==&lt;br /&gt;
&lt;br /&gt;
Each dzVents event script has this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    active = true, -- optional&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        -- at least one of these:&lt;br /&gt;
        customEvents = { ... },&lt;br /&gt;
        devices = { ... },&lt;br /&gt;
        groups = { ... },&lt;br /&gt;
        httpResponses = { ... },&lt;br /&gt;
        scenes = { ... },&lt;br /&gt;
        security = { ... },&lt;br /&gt;
        shellCommandResponses = { ... },&lt;br /&gt;
        system = { ... },&lt;br /&gt;
        timer = { ... },&lt;br /&gt;
        variables = { ... },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    data = { ... }, -- optional&lt;br /&gt;
    logging = { ... }, -- optional&lt;br /&gt;
    execute = function(domoticz, item, triggerInfo)&lt;br /&gt;
    -- your code here&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;active-truefalse-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== active = true/false (optional) ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;active = false&amp;lt;/code&amp;gt;, then the script is not activated: &#039;&#039;dzVents will ignore the script completely&#039;&#039;. If you don’t have &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; specified, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is assumed (default value). If you write scripts with Domoticz’ internal script editor then you don’t need this part as the editor has its own way of enabling and disabling scripts.&lt;br /&gt;
&lt;br /&gt;
So, &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; can either be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;true&#039;&#039;&#039;: (default) the script file will be processed.&lt;br /&gt;
* &#039;&#039;&#039;false&#039;&#039;&#039;: the script file is ignored.&lt;br /&gt;
* &#039;&#039;&#039;function(domoticz) … end&#039;&#039;&#039;: A function returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The function will receive the domoticz object with all the information about your domoticz instance: &amp;lt;code&amp;gt;active = function(domoticz) .... end&amp;lt;/code&amp;gt;. For example you could check for a Domoticz variable or switch and prevent the script from being executed. &#039;&#039;&#039;However, be aware that for &#039;&#039;every script&#039;&#039; in your scripts folder, this active function will be called, every cycle!! Therefore, it is better to put all your logic in the execute function instead of in the active function.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== on = { … } ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section tells dzVents &#039;&#039;when&#039;&#039; the execute function has to be executed. It holds all the events/&#039;&#039;&#039;triggers&#039;&#039;&#039; that are monitored by dzVents. If any of the events or triggers match with the current event coming from Domoticz, then the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part of the script is executed by dzVents. The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section has many kinds of subsections that &#039;&#039;can all be used simultaneously&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;customevents-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== customEvents = { … } &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more custom event triggers. This eventTrigger can be activate by a json/api call, a MQTT message (when domoticz is setup to listen to such messages on the hardware tab) or by the dzVents internal command domoticz.emitEvent - The name of the custom-event - The name of the custom-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|See time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;- curl: curl -d &amp;amp;quot;{ &#039;a&#039;:10, &#039;b&#039;:20, &#039;some&#039;:&#039;text&#039;, &#039;sub&#039; : { &#039;x&#039;:10, &#039;y&#039;:20 } }&amp;amp;quot; &amp;amp;quot;http://&amp;amp;lt;domoticzIP:domoticz port&amp;amp;gt;/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;myCustomEvent&amp;amp;gt;&amp;amp;quot;&lt;br /&gt;
- JSON: **&amp;amp;lt; domoticzIP : domoticz port &amp;amp;gt;**/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;MyEvent&amp;amp;gt;&amp;amp;amp;data=myData&lt;br /&gt;
- MQTT simple: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;, &amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;myData&amp;amp;quot;}&lt;br /&gt;
- MQTT complex: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;,&amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;{\&amp;amp;quot;idx\&amp;amp;quot;:29,\&amp;amp;quot;test\&amp;amp;quot;:\&amp;amp;quot;ok\&amp;amp;quot;}&amp;amp;quot; }&lt;br /&gt;
- emitEvent: domoticz.emitEvent(&#039;myCustomEvent&#039; [,])&lt;br /&gt;
    `domoticz.emitEvent(&#039;myEvent&#039;) -- no data`&lt;br /&gt;
    `domoticz.emitEvent(&#039;another event&#039;, &#039;some data&#039;)`&lt;br /&gt;
    `domoticz.emitEvent(&#039;hugeEvent&#039;, { a = 10, b = 20, some = &#039;text&#039;, sub = { x = 10, y = 20 } })`&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;attributes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== Attributes =====&lt;br /&gt;
&lt;br /&gt;
The customEvent object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw customEvent data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid json string. The data is then automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid xml string. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the customEvent data is a valid json string, the response data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;customEvent&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; The string that triggered this customEvent instance. This is useful if you have a script that can be triggered by multiple different customEvent strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the response data is a valid xml string, the customEvent data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== devices = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of device-names or indexes. If a device in your system was updated (e.g. a switch was triggered or a new temperature was received) and it is listed in this section then the execute function is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the device state or value has changed. Each device can be:&lt;br /&gt;
&lt;br /&gt;
* The name of your device between string quotes. &#039;&#039;&#039;You can use the asterisk (*) wild-card here e.g. &amp;lt;code&amp;gt;PIR_*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*_PIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;. E.g.: &amp;lt;code&amp;gt;devices = { &#039;myDevice&#039;, &#039;anotherDevice&#039;, 123, &#039;pir*&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* The index (idx) of your device (as the name may change, the index will usually stay the same, the index can be found in the devices section in Domoticz). &#039;&#039;&#039;Note that idx is a number;&#039;&#039;&#039;&lt;br /&gt;
* The name or idx of your device followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;myDevice&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if &amp;lt;code&amp;gt;myDevice&amp;lt;/code&amp;gt; was changed, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;groups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== groups = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more group-names or indexes. The same rules as devices apply.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpresponses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== httpResponses = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more http callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shellcommandresponses-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== shellCommandResponses = { …} &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scriptcommand callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scenes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== scenes = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scene-names or indexes. The same rules as devices apply. So if your scene is listed in this table then the executed function will be triggered, e.g.: &amp;lt;code&amp;gt;on = { scenes = { &#039;myScene&#039;, &#039;anotherScene&#039; } },&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== security = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more of these security states:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDAWAY&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDHOME&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_DISARMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the security state in Domoticz changes and it matches with any of the states listed here, the script will be executed. See &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples/templates/security.lua&amp;lt;/code&amp;gt; for an example see [[#Security_Panel|Security Panel]] for information about how to create a security panel device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== system = { …} &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more system triggers.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manualBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dailyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hourlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monthlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resetAllDeviceStatus&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt; &amp;lt;code&amp;gt;resetAllEvents&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* The name of the system-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
** &#039;&#039;&#039;start&#039;&#039;&#039; - fired when Domoticz has started.&lt;br /&gt;
** &#039;&#039;&#039;stop&#039;&#039;&#039; - fired when Domoticz is shutting down. As you probably can imagine you have only a limited amount of time - also depending on the load on your system - to have Domoticz do stuff when your script has been completed. Some commands will probably not be executed. Just give it a try.&lt;br /&gt;
** &#039;&#039;&#039;Backups&#039;&#039;&#039; - the trigger item (2nd parameter of the execute function) is a table that holds information about the newly created backup (location, duration in seconds and type). You could use this information to copy the file to some other location or for another purpose.&lt;br /&gt;
*** &#039;&#039;&#039;dailyBackupFinished&#039;&#039;&#039; - automatic backup when set in domoticz&lt;br /&gt;
*** &#039;&#039;&#039;hourlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;monthlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;manualBackupFinished&#039;&#039;&#039; - fired when you start a backup using the Domoticz GUI or via &#039;&#039;&#039;&amp;amp;lt; domoticz IP:domoticz port &amp;amp;gt;&#039;&#039;&#039;/backupdatabase.php&lt;br /&gt;
*** &#039;&#039;&#039;resetAllDeviceStatus&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when the name, description or used / unused state of a device, variable or scene is updated.&lt;br /&gt;
*** &#039;&#039;&#039;resetAllEvents&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when a dzVents script in the internal editor changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== timer = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one ore more time ‘rules’ like &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;at 17:*&amp;lt;/code&amp;gt;. See [[#timer_trigger_rules|&#039;&#039;timer&#039;&#039; trigger rules]]. If any or the rules matches with the current time/date then your execute function is called. E.g.: &amp;lt;code&amp;gt;on = { timer = { &#039;between 30 minutes before sunset and 30 minutes after sunrise&#039; } }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== variables = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more user variable-names as defined in Domoticz ( &#039;&#039;Setup &amp;amp;gt; More options &amp;amp;gt; User variables&#039;&#039;). If any of the variables listed here is updated, ( &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed ).the script is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: Script will only execute when this variable is updated directly by dzVents or by a JSON. If updated with a standard Lua script (using commandArray) or in combination with a time option like afterAAA no event will be triggered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;execute-functiondomoticz-item-triggerinfo-end&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== execute = function(&#039;&#039;&#039;domoticz, item, triggerInfo&#039;&#039;&#039;) … end ===&lt;br /&gt;
&lt;br /&gt;
When all the above conditions are met (active == true and the on section has at least one matching rule), then this &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function is called. This is the heart of your script. The function has three parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 1. (&#039;&#039;&#039;domoticz&#039;&#039;&#039;, item, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
The [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]]. This object gives you access to almost everything in your Domoticz system, including all methods to manipulate them—like modifying switches or sending notifications. More about the [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 2. (domoticz, &#039;&#039;&#039;item&#039;&#039;&#039;, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
Depending on what actually triggered the script, &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is either a:&lt;br /&gt;
&lt;br /&gt;
* [[#Custom_event_API|customEvent]] &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Device_object_API|device]],&lt;br /&gt;
* [[#Variable_object_API_.28user_variables.29|variable]],&lt;br /&gt;
* [[#Scene|scene]],&lt;br /&gt;
* [[#Group|group]],&lt;br /&gt;
* [[#timer_=_%7B_..._%7D|timer]],&lt;br /&gt;
* [[#System_event_API|system]], &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Security_Panel|security]] or&lt;br /&gt;
* [[#Asynchronous_HTTP_requests|httpResponse]]&lt;br /&gt;
* [[#Asynchronous_shell_command_executio|shellCommandResponse]] &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since you can define multiple on-triggers in your script, it is not always clear what the type is of this second parameter. In your code you need to know this in order to properly respond to the different events. To help you inspect the object you can use these attributes like &amp;lt;code&amp;gt;if (item.isDevice) then ... end&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;isCustomEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a customEvent object.&lt;br /&gt;
* &#039;&#039;&#039;isDevice&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Device object.&lt;br /&gt;
* &#039;&#039;&#039;isGroup&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Group object.&lt;br /&gt;
* &#039;&#039;&#039;isHTTPResponse&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is an HTTPResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isShellCommandResponse&#039;&#039;&#039;: . &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a shellcommandResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isScene&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Scene object.&lt;br /&gt;
* &#039;&#039;&#039;isSecurity&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Security object.&lt;br /&gt;
* &#039;&#039;&#039;isSystemEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a system object.&lt;br /&gt;
* &#039;&#039;&#039;isTimer&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Timer object.&lt;br /&gt;
* &#039;&#039;&#039;isVariable&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Variable object.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;: . &#039;&#039;string&#039;&#039;. the timer rule, the security state, the customEvent or the http response callback string that actually triggered your script. E.g. if you have multiple timer rules can inspect &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; which exact timer rule was fired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3. (domoticz, item, &#039;&#039;&#039;triggerInfo&#039;&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: as of version 2.4.0, &amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; has become more or less obsolete and is left in here for backward compatibility. All information is now available on the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; parameter (second parameter of the execute function, see point 2 above).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; holds information about what triggered the script. The object has two attributes:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;type&#039;&#039;&#039;: the type of the the event that triggered the execute function, either: - domoticz.EVENT_TYPE_CUSTOM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_DEVICE, - domoticz.EVENT_TYPE_GROUP - domoticz.EVENT_TYPE_HTTPRESPONSE - domoticz.EVENT_TYPE_SCENE, - domoticz.EVENT_TYPE_SECURITY, - domoticz.EVENT_TYPE_SYSTEM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_TIMER, - domoticz.EVENT_TYPE_VARIABLE)&lt;br /&gt;
# &#039;&#039;&#039;trigger&#039;&#039;&#039;: the timer rule that triggered the script if the script was called due to a timer event, or the security state that triggered the security trigger rule. See [[#timer_trigger_rules|below]] for the possible timer trigger rules.&lt;br /&gt;
# &#039;&#039;&#039;scriptName&#039;&#039;&#039;: the name of the current script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tip-rename-the-parameters-to-better-fit-your-needs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tip: rename the parameters to better fit your needs ====&lt;br /&gt;
&lt;br /&gt;
The names of the execute parameters are actually something you can change to your convenience. For instance, if you only have one trigger for a specific switch device, you can rename &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; it to &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Or if you think &amp;lt;code&amp;gt;domoticz&amp;lt;/code&amp;gt; is too long you can rename it to &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dz&amp;lt;/code&amp;gt; (might save you a lot of typing and may make your code more readable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = &#039;mySwitch&#039;&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(dz, mySwitch)&lt;br /&gt;
        dz.log(mySwitch.state, dz.LOG_INFO)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== data = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional data section allows you to define local variables that will hold their values &#039;&#039;between&#039;&#039; script runs. These variables can get a value in your execute function and the next time the script is executed these variables will have their previous state restored. For more information see the section [[#Persistent_data|Persistent data]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logging-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== logging = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional logging section allows you to override the global logging setting of dzVents as set in &#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem &amp;amp;gt; dzVents Log Level&#039;&#039;. This can be handy when you only want this script to have extensive debug logging while the rest of your script executes silently. You have these options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: This is the minimum log level you want for this script. This can be domoticz.LOG_INFO, domoticz.LOG_STATUS, domoticz.LOG_ERROR or domoticz.LOG_DEBUG&lt;br /&gt;
* &#039;&#039;&#039;marker&#039;&#039;&#039;: A string that is prefixed before each log message. That way you can easily create a filter in the Domoticz log to see just these messages. &#039;&#039;&#039;marker&#039;&#039;&#039; defaults to scriptname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;*LOG_DEBUG will also cause Execution Info to be displayed (start/finished)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;logging = {&lt;br /&gt;
    level = domoticz.LOG_DEBUG,&lt;br /&gt;
    marker = &amp;quot;Hey you&amp;quot;&lt;br /&gt;
    },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;some-trigger-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Some trigger examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to trigger a script not on the minute but 30 seconds later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every minute&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        customEvents =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;delayed&#039;,&lt;br /&gt;
        },&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.emitEvent(&#039;delayed&#039;, domoticz.time.rawTime ).afterSec(30)&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.notify(&#039;Delayed&#039;, &#039;Event was emitted at &#039; .. item.data, domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have two devices—a smoke detector ‘myDetector’ and a room temperature sensor ‘roomTemp’, and you want to send a notification when either the detector detects smoke or the temperature is too high:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = {&lt;br /&gt;
            &#039;myDetector&#039;,&lt;br /&gt;
            &#039;roomTemp&#039;&lt;br /&gt;
    }&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        if ((device.name == &#039;myDetector&#039; and device.active) or&lt;br /&gt;
            (device.name == &#039;roomTemp&#039; and device.temperature &amp;gt;= 45)) then&lt;br /&gt;
            domoticz.notify(&#039;Fire&#039;, &#039;The room is on fire&#039;, domoticz.PRIORITY_EMERGENCY)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / group changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a scene ‘myScene’ and a group ‘myGroup’, and you want to turn on the group as soon as myScene is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        scenes = { &#039;myScene&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, scene)&lt;br /&gt;
        if (scene.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.groups(&#039;myGroup&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you want to send an email when a group is activated at night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        groups = { [&#039;myGroup&#039;] = {&#039;at nighttime&#039;} }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, group)&lt;br /&gt;
        if (group.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.email(&#039;Hey&#039;, &#039;The group is on&#039;, &#039;someone@the.world.org&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timer events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to check the soil humidity every 30 minutes during the day and every hour during the night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every 30 minutes at daytime&#039;,&lt;br /&gt;
            &#039;every 60 minutes at nighttime&#039;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, timer)&lt;br /&gt;
        domoticz.log(&#039;The rule that triggered the event was: &#039; .. timer.trigger&#039;)&lt;br /&gt;
        if (domoticz.devices(&#039;soil&#039;).moisture &amp;gt; 100) then&lt;br /&gt;
            domoticz.devices(&#039;irrigation&#039;).switchOn().forMin(60)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a script that updates a variable ‘myAmountOfMoney’, and if that variable reaches a certain level you want to be notified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        variables = { &#039;myAmountOfMoney&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, variable)&lt;br /&gt;
        -- variable is the variable that&#039;s triggered&lt;br /&gt;
        if (variable.value &amp;gt; 1000000) then&lt;br /&gt;
            domoticz.notify(&#039;Rich&#039;, &#039;You can stop working now&#039;, domoticz.PRIORITY_HIGH)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Security changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a group holding all the lights in your house, and you want to switch it off as soon as the alarm is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        security = { domoticz.SECURITY_ARMEDAWAY }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, security)&lt;br /&gt;
        domoticz.groups(&#039;All lights&#039;).switchOff()&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-request-and-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous HTTP Request and handling ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some external web service that will tell you what the current energy consumption is and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        httpResponses = { &#039;energyRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
            url = &#039;http://url/to/service&#039;,&lt;br /&gt;
            method = &#039;GET&#039;,&lt;br /&gt;
            callback = &#039;energyRetrieved&#039;&lt;br /&gt;
            })&lt;br /&gt;
        elseif (item.isHTTPResponse) then&lt;br /&gt;
            if (item.ok) then -- statusCode == 2xx&lt;br /&gt;
                local current = item.json.consumption&lt;br /&gt;
                domoticz.devices(&#039;myCurrentUsage&#039;).updateEnergy(current)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous shell command execution &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some local shellcommand to measure the speed of your internet connection and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        shellCommandResponses = { &#039;internetspeedRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;speedtest-cli --json&#039;,      -- just an example&lt;br /&gt;
            callback = &#039;internetspeedRetrieved&#039;,   -- see shellCommandResponses above.&lt;br /&gt;
            timeout = 20,                          -- max execution time in seconds&lt;br /&gt;
        })&lt;br /&gt;
        elseif (item.isShellCommandResponse) then&lt;br /&gt;
            if (item.statusCode==0) then&lt;br /&gt;
                domoticz.devices(&#039;myCurrentdownloadspeed&#039;).updateCustomSensor(item.json.download)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_shell_command_execution|asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System changes ===&lt;br /&gt;
&lt;br /&gt;
Do some initial work when domoticz starts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        system =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;start&#039;,&lt;br /&gt;
            &#039;backupDoneDaily&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, system)&lt;br /&gt;
        domoticz.log(&#039;Domoticz sends &#039; .. system.type, domoticz.LOG_INFO)&lt;br /&gt;
&lt;br /&gt;
        if system.type == &#039;start&#039; then&lt;br /&gt;
            domoticz.device(&#039;initial device&#039;).switchOff().silent&lt;br /&gt;
            domoticz.variables(&#039;special startVar&#039;).set(&#039;domoticz started at &#039; .. domoticz.time.rawDateTime )&lt;br /&gt;
        elseif system.type == &#039;backupDoneDaily&#039; then&lt;br /&gt;
            domoticz.notify(&#039;Domoticz backup&#039;, &#039;Ended. Backupfile &#039; .. system.data.location , domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;combined-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Combined rules ===&lt;br /&gt;
&lt;br /&gt;
Let’s say you have a script that checks the status of a lamp and is triggered by motion detector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
            timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
            devices = { &#039;myDetector&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- the timer was triggered&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOff()&lt;br /&gt;
        elseif (item.isDevice and item.active) then&lt;br /&gt;
            -- it must be the detector&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;at-startup-trigger&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== At startup trigger ===&lt;br /&gt;
&lt;br /&gt;
You can add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section to have your script execute once when Domoticz starts, in addition to any other triggers. This is useful when combined with interval-based rules to avoid waiting for the first interval to pass:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        at_startup = true,&lt;br /&gt;
        timer = { &#039;every hour&#039; },&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        -- Runs immediately when Domoticz starts, then every hour&lt;br /&gt;
        domoticz.devices(&#039;myThermostat&#039;).setPoint(21)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; trigger fires on the first timer tick after Domoticz starts (within 2 minutes of startup). It can be combined with any other trigger types (timer, devices, httpResponses, etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is different from &amp;lt;code&amp;gt;system = { &#039;start&#039; }&amp;lt;/code&amp;gt; which is a system event trigger. &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; is simpler - just add the flag and your existing script will also run at startup without needing to check &amp;lt;code&amp;gt;item.isSystemEvent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-trigger-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &#039;&#039;timer&#039;&#039; trigger rules ==&lt;br /&gt;
&lt;br /&gt;
There are several options for time triggers. It is important to know that Domoticz timer events only trigger once every minute, so one minute is the smallest interval for your timer scripts. However, dzVents gives you many options to have full control over when and how often your timer scripts are called (all times are in 24hr format and all dates in dd/mm): Keywords recognized are “at, between, every, except, in, on, or” ( except supported from version &amp;lt;sup&amp;gt;3.0.16&amp;lt;/sup&amp;gt;, or supported from version &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
At every place you read &amp;lt;astroMoment&amp;gt; you can use one of: sunset, sunrise, solarnoon, midnight &#039;&#039;, sunatsouth &#039;&#039;, civiltwilightstart, civiltwilightend, astronomicaltwilightstart &#039;&#039;, astronomicaltwilightend &#039;&#039;, nauticaltwilightstart * or nauticaltwilightend *.&lt;br /&gt;
&lt;br /&gt;
Full daynames are allowed in dzVents &amp;amp;gt;= 3.1.7&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every minute&#039;,             -- causes the script to be called every minute&lt;br /&gt;
            &#039;every other minute&#039;,       -- minutes: xx:00, xx:02, xx:04, ..., xx:58&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; minutes&#039;,       -- starting from xx:00 triggers every xx minutes&lt;br /&gt;
                                        -- (0 &amp;gt; xx &amp;lt; 60)&lt;br /&gt;
            &#039;every hour&#039;,               -- 00:00, 01:00, ..., 23:00 (24x per 24hrs)&lt;br /&gt;
            &#039;every other hour&#039;,         -- 00:00, 02:00, ..., 22:00 (12x per 24hrs)&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; hours&#039;,         -- starting from 00:00, triggers every xx&lt;br /&gt;
                                        -- hours (0 &amp;gt; xx &amp;lt; 24)&lt;br /&gt;
            &#039;at 13:45&#039;,                 -- specific time&lt;br /&gt;
            &#039;at *:45&#039;,                  -- every 45th minute in the hour&lt;br /&gt;
            &#039;at 15:*&#039;,                  -- every minute between 15:00 and 16:00&lt;br /&gt;
            &#039;at 12:45-21:15&#039;,           -- between 12:45 and 21:15. You cannot use &#039;*&#039;!&lt;br /&gt;
            &#039;at 19:30-08:20&#039;,           -- between 19:30 and 8:20 (next day)&lt;br /&gt;
            &#039;at 13:45 on mon,tue&#039;,      -- at 13:45 only on Mondays and Tuesdays (english)&lt;br /&gt;
            &#039;on mon,tue&#039;,               -- on Mondays and Tuesdays&lt;br /&gt;
            &#039;every hour on Saturday&#039;,   -- you guessed it correctly&lt;br /&gt;
            &#039;at sunset&#039;,                -- uses sunset/sunrise/solarnoon info from Domoticz&lt;br /&gt;
            &#039;at sunrise&#039;,&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt;&#039;,         -- dzVents &amp;gt;= 3.0.16 Uses the times received from Domoticz&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt; on sat,sun&#039;,&lt;br /&gt;
            &#039;xx minutes before &amp;lt;astroMoment&amp;gt;&#039;,  --&lt;br /&gt;
            &#039;xx minutes after &amp;lt;astroMoment&amp;gt;&#039;,   -- Please note that these relative times will cross dates&lt;br /&gt;
            &#039;between aa and bb&#039;         -- aa/bb can be a time stamp like 15:44 (if aa &amp;gt; bb will cross dates)&lt;br /&gt;
                                        -- aa/bb can be sunrise/sunset/solarnoon (&#039;between sunset and sunrise&#039; and &#039;between solarnoon and sunrise&#039; will cross dates)&lt;br /&gt;
                                        -- aa/bb can be &#039;xx minutes before/after &amp;lt;astroMoment&amp;gt;&#039;&lt;br /&gt;
            &#039;at &amp;lt;astroRange&amp;gt;&#039;,          -- between &amp;lt;astroMoment&amp;gt;start and &amp;lt;astroMoment&amp;gt;end&lt;br /&gt;
            &#039;at nighttime&#039;,             -- between sunset and sunrise&lt;br /&gt;
            &#039;at daytime&#039;,               -- between sunrise and sunset&lt;br /&gt;
            &#039;at daytime on mon,tue&#039;,    -- between sunrise and sunset only on Mondays and Tuesdays&lt;br /&gt;
            &#039;in week 1-7,44&#039;            -- in week 1-7 or 44&lt;br /&gt;
            &#039;in week 20-25,33-47&#039;       -- between week 20 and 25 or week 33 and 47&lt;br /&gt;
            &#039;in week -12, 33-&#039;          -- week &amp;lt;= 12 or week &amp;gt;= 33&lt;br /&gt;
            &#039;every odd week&#039;,&lt;br /&gt;
            &#039;every even week&#039;,          -- odd or even numbered weeks&lt;br /&gt;
            &#039;on 23/11&#039;,                 -- on 23rd of November (dd/mm)&lt;br /&gt;
            &#039;on 23/11-25/12&#039;,           -- between 23/11 and 25/12&lt;br /&gt;
            &#039;on 2/3-8/3,7/8,6/10-14/10&#039;,-- between march 2 and 8, on august 7 and between October 6 and 14.&lt;br /&gt;
            &#039;on */2,15/*&#039;,              -- every day in February or&lt;br /&gt;
                                        -- every 15th day of the month&lt;br /&gt;
            &#039;on -3/4,4/7-&#039;,             -- before 3/4 or after 4/7&lt;br /&gt;
&lt;br /&gt;
            &#039;at 12:45-21:15 except at 18:00-18:30&#039;, -- between 12:45 and 21:15 but not between 18:00 and 18:30 ( except supported from 3.0.16 onwards )&lt;br /&gt;
            &#039;at daytime except on sun&#039;,             -- between sunrise and sunset but not on Sundays&lt;br /&gt;
            &#039;at daytime or at 23:12&#039;,               -- between sunrise and sunset and also at 23:12&lt;br /&gt;
&lt;br /&gt;
            -- or if you want to go really wild and combine them:&lt;br /&gt;
                &#039;at nighttime at 21:32-05:44 every 5 minutes on sat, sun except at 04:00&#039;, -- except supported from 3.0.16 onwards&lt;br /&gt;
                &#039;every 10 minutes between 20 minutes before sunset and 30 minutes after sunrise on mon,fri,tue on 20/5-18/8&#039;&lt;br /&gt;
&lt;br /&gt;
            -- or just do it yourself:&lt;br /&gt;
                function(domoticz)&lt;br /&gt;
                -- you can use domoticz.time to get the current time&lt;br /&gt;
                -- note that this function is called every minute!&lt;br /&gt;
                -- custom code that either returns true or false&lt;br /&gt;
                ...&lt;br /&gt;
            end&lt;br /&gt;
        },&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The timer events are triggered every minute. If such a trigger occurs, dzVents will scan all timer-based events and will evaluate the timer rules. So, if you have a rule &amp;lt;code&amp;gt;on mon&amp;lt;/code&amp;gt; then the script will be executed &#039;&#039;every minute&#039;&#039; but only on Monday.&lt;br /&gt;
&lt;br /&gt;
Be mindful of the logic if using multiple types of timer triggers. It may not make sense to combine a trigger for a specific or instantaneous time with a trigger for a span or sequence of times (like ‘at sunset’ with ‘every 6 minutes’) in the same construct. Similarly, &amp;lt;code&amp;gt;&#039;between aa and bb&#039;&amp;lt;/code&amp;gt; only makes sense with instantaneous times for &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One important note: if Domoticz, for whatever reason, skips a timer event then you may miss the trigger! Therefore, you should build in some fail-safe checks or some redundancy if you have critical time-based stuff to control. There is nothing dzVents can do about it&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you want your timer script to also run at Domoticz startup (instead of waiting for the first timer match), add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section. See [[#at-startup-trigger|At startup trigger]].&lt;br /&gt;
&lt;br /&gt;
Another important issue: the way it is implemented right now, the &amp;lt;code&amp;gt;every xx minutes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every xx hours&amp;lt;/code&amp;gt; is a bit limited. The interval resets at every *:00 (for minutes) or 00:* for hours. You need an interval that is an integer divider of 60 (or 24 for the hours). So you can do every 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 and 30 minutes only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-domoticz-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= The domoticz object =&lt;br /&gt;
&lt;br /&gt;
The domoticz object passed as the first parameter to the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function contains everything you need to interact with your domotica system. It provides all information made available by the domoticz event system about your custom- and system events, devices, scenes, groups, hardware modules and variables and has methods needed to inspect and manipulate them. Getting this information is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;domoticz.time.isDayTime&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).temperature&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).lastUpdate.minutesAgo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The domoticz object consists of a logically arranges structure. It harbors all methods to manipulate Domoticz. dzVents will take care to notify Domoticz with all your intended changes and actions. Earlier you had to fill a commandArray with obscure commands. That’s no longer the case.&lt;br /&gt;
&lt;br /&gt;
Some more examples: &amp;lt;code&amp;gt;domoticz.devices(123).switchOn().forMin(5).afterSec(10)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My dummy sensor&#039;).updateBarometer(1034, domoticz.BARO_THUNDERSTORM)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One tip before you get started: &#039;&#039;&#039;Make sure that all your devices have unique names. dzVents will give you warnings in the logs if device names are not unique.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-object-api-application-programming-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Domoticz object API (Application Programming Interface) ==&lt;br /&gt;
&lt;br /&gt;
The domoticz object holds all information about your Domoticz system. It has global attributes and methods to query and manipulate your system. It also has a collection of &#039;&#039;&#039;devices&#039;&#039;&#039;, &#039;&#039;&#039;variables&#039;&#039;&#039; (user variables in Domoticz), &#039;&#039;&#039;scenes&#039;&#039;&#039;, &#039;&#039;&#039;groups&#039;&#039;&#039;, &#039;&#039;&#039;hardware&#039;&#039;&#039;. Each of these collections has four iterator functions: &amp;lt;code&amp;gt;find(), forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; to make searching for devices easier. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Domoticz attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a device by idx or name: &amp;lt;code&amp;gt;domoticz.devices(123)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My switch&#039;)&amp;lt;/code&amp;gt;. For the device API see [[#Device_object_API|Device object API]]. To iterate over all devices do: &amp;lt;code&amp;gt;domoticz.devices().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.devices()) do .. end&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;dump([osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all domoticz.settings attributes to the Domoticz log. This ignores the log level setting.&lt;br /&gt;
* &#039;&#039;&#039;email(subject, message, mailTo [, delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send email. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;emitEvent(name,[extra data ])&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a customEvent. If you just pass a name then Domoticz will execute the script(s) that subscribed to the named customEvent after your script has finished. You can optionally pass extra information as a string or table. A table will be automatically converted into a json string and converted back to a table in the subscribed script(s). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;executeShellCommand(command/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a command. If you just pass a command then Domoticz will execute the command after your script has finished but you will not get notified. If you pass options table with a callback then you have the possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_shell_command_execution|asynchronous shell commands]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &#039;&#039;&#039;Note Make sure that when you use this function on a Windows system and use one or more of the special chars &amp;amp;amp;&amp;amp;lt;&amp;amp;gt;()@^| outside double quotes, you will have to escape these with a ^ char &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;groups(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a group by name or idx. Each group has the same interface as a device. To iterate over all groups do: &amp;lt;code&amp;gt;domoticz.groups().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.groups()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Group|Groups]].&lt;br /&gt;
* &#039;&#039;&#039;hardwareInfo(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.6&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning hardwareInfo of a hardware module by name or idx. The return of the function is a table with attributes name, type, typeValue, deviceNames (table with names of all active devices defined on this hardware) and deviceIds (table with idx of all active devices defined on this hardware)&lt;br /&gt;
* &#039;&#039;&#039;hardware(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning a hardware module by name or idx. Each hardware has an interface comparable to group. To iterate over all hardware do: &amp;lt;code&amp;gt;domoticz.hardware().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.hardware()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Hardware|Hardware]].&lt;br /&gt;
* &#039;&#039;&#039;helpers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Collection of shared helper functions available to all your dzVents scripts. See [[#Shared_helper_functions|Shared helper functions]].&lt;br /&gt;
* &#039;&#039;&#039;log(message, [level])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a log entry in the Domoticz log but respects the log minimum level settings. You can provide the loglevel: &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_STATUS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_ERROR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_DEBUG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.LOG_FORCE&amp;lt;/code&amp;gt;. In Domoticz settings you can set the default log level for dzVents.&lt;br /&gt;
* &#039;&#039;&#039;moduleLabel&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; Module (script) name without extension.&lt;br /&gt;
* &#039;&#039;&#039;notify(subject, message [,priority][,sound][,extra][,subsystem][,delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send a notification (like Prowl). Priority can be like &amp;lt;code&amp;gt;domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt; is notification subsystem specific. For NSS_FIREBASE you can use this field to specify the target mobile (‘midx_1’, midx_2, etc..) or specify &amp;lt;code&amp;gt;device.id&amp;lt;/code&amp;gt; so the receiver knows which device triggered the notification. For sound see [[#Constants|list of dzVents Constants]] for the SOUND constants below. &amp;lt;code&amp;gt;subsystem&amp;lt;/code&amp;gt; defaults to all subsystems but can be one subsystem or a table containing one or more notification subsystems. See [[#Constants|list of dzVents Constants]] for &amp;lt;code&amp;gt;domoticz.NSS_subsystem&amp;lt;/code&amp;gt; types. Delay is delay in seconds&lt;br /&gt;
* &#039;&#039;&#039;openURL(url/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ a URL. If you just pass a url then Domoticz will execute the url after your script has finished but you will not get notified. If you pass a table with options then you have to possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_HTTP_requests|asynchronous http requests]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;scenes(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a scene by name or id. Each scene has the same interface as a device. See [[#Device_object_API|Device object API]]. To iterate over all scenes do: &amp;lt;code&amp;gt;domoticz.scenes().forEach(..)&amp;lt;/code&amp;gt;. See [[#looping-through-the-collections-iterators|Looping through the collections: iterators]]. (#Looping_through_the_collections:_iterators). Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.scenes()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Scene|Scenes]].&lt;br /&gt;
* &#039;&#039;&#039;security&#039;&#039;&#039;: Holds the state of the security system e.g. &amp;lt;code&amp;gt;Armed Home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Armed Away&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;sendCommand(command, value[, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: Generic (low-level)command method (adds it to the commandArray) to the list of commands that are being sent back to domoticz. Optional parm delay is delay in seconds &#039;&#039;There is likely no need to use this directly. Use any of the device methods instead (see below).&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;settings&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;domoticzVersion&#039;&#039;&#039;: domoticz version string.&lt;br /&gt;
** &#039;&#039;&#039;dzVentsVersion&#039;&#039;&#039;: dzVents version string.&lt;br /&gt;
** &#039;&#039;&#039;location&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;latitude&#039;&#039;&#039;: domoticz settings locations latitude.&lt;br /&gt;
*** &#039;&#039;&#039;longitude&#039;&#039;&#039;: domoticz settings locations longitude.&lt;br /&gt;
*** &#039;&#039;&#039;name&#039;&#039;&#039;: domoticz settings location Name.&lt;br /&gt;
** &#039;&#039;&#039;secureServer&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; true when domoticz can be accessed via https.&lt;br /&gt;
** &#039;&#039;&#039;serverPort&#039;&#039;&#039;: webserver listening port used by dzVents to access domoticz API.&lt;br /&gt;
** &#039;&#039;&#039;url&#039;&#039;&#039;: internal url to access the API service.&lt;br /&gt;
** &#039;&#039;&#039;webRoot&#039;&#039;&#039;: &amp;lt;code&amp;gt;webroot&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
** &#039;&#039;&#039;wwwBind&#039;&#039;&#039;: &amp;lt;code&amp;gt;wwwbind&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.4&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
* &#039;&#039;&#039;sms(message [, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends an sms if it is configured in Domoticz. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;snapshot(cameraID(s) or camera Name(s)&amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt;,subject)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends email with a camera snapshots if email is configured and set for attachments in Domoticz. Send 1 or multiple camerIDs -names in ; separated string or array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    dz.snapshot()                  -- defaults to id = 1, subject domoticz&lt;br /&gt;
    dz.snapshot(1,&#039;dz&#039;)            -- subject dz&lt;br /&gt;
    dz.snapshot(&#039;1;2;3&#039;)           -- ; separated string&lt;br /&gt;
    dz.snapshot({1,4,7})           -- table&lt;br /&gt;
    dz.snapshot(&#039;test;test2&#039;)      -- ; separated string&lt;br /&gt;
    dz.snapshot({&#039;test&#039;, &#039;test2&#039;}) -- table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTimerPlan(idx)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch the active timer plan to the plan with the given database ID. &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; must be a positive integer matching an existing timer plan ID (as shown in &#039;&#039;&#039;Settings → Timer Plans&#039;&#039;&#039;). Invalid or non-existent plan IDs are silently ignored. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;startTime&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;. Returns the startup time of the Domoticz service.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;systemUptime&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds the system is up.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Current system time. Additional to Time object attributes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if the device was updated today&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will rise.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will set.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will start.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will end.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerHTTPResponse([httpResponse], [delay], [message])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a callback by sending a logmessage. httpResponse defaults to scriptname, delay defaults to 0 (immediate), message defaults to httpResponse. Left in for backward compatibility only. You can use emitEvent / customEvents now.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerIFTTT(makerName [,sValue1, sValue2, sValue3])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ an IFTTT maker event. makerName is required, 0-3 sValue’s are optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;utils&#039;&#039;&#039;: . A subset of handy utilities: Note that these functions must be preceded by domoticz.utils. If you use more then a few declare something like local _u = domoticz.utils at the beginning of your script and use _u.functionName in the remainder. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    _u = domoticz.utils&lt;br /&gt;
    print(_u.rightPad(&#039;test&#039;,10) .. &#039;|||&#039;) -- =&amp;gt; test       |||&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;_.lodashFunctions&#039;&#039;&#039;: This is an entire collection with very handy Luafunctions. Read more about [[#lodash_for_Lua|lodash]]. E.g.: &amp;lt;code&amp;gt;{.lua}   domoticz.utils._.size({&#039;abc&#039;, &#039;def&#039;}))` Returns 2.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;cameraExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid camera &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or cameraID and return ID when entered with valid cameraName or false when not a camera, cameraID or cameraName of an existing camera&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid device &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or deviceID and returns ID when entered with valid deviceName or false when not a device, deviceID or deviceName of an existing (and active) device. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local dz = domoticz&lt;br /&gt;
local _u = dz.utils&lt;br /&gt;
if _u.deviceExists(&#039;myDevice&#039;) then&lt;br /&gt;
    dz.devices(&#039;myDevice&#039;).switchOn()&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device myDevice does not exist!&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local myName = _u.deviceExists(123)&lt;br /&gt;
if myName then&lt;br /&gt;
    dz.log(&#039;Device 123 is &#039; .. myName, dz.LOG_INFO)&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device 123 does not exist&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpTable(table,[levelIndicator],[osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;))&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: print table structure and contents to log&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fileExists(path)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file (with full path) exists.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Decode a base64 string&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromJSON(json, fallback, deSerialize &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Turns a json string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromJSON(&#039;{ &amp;amp;quot;a&amp;amp;quot;: 1 }&#039;)&amp;lt;/code&amp;gt;. Followed by: &amp;lt;code&amp;gt;print( t.a )&amp;lt;/code&amp;gt; will print 1. Optional 2nd param fallback will be returned if json is nil or invalid. Optional 3rd param deSerialize (boolean) determines if the JSON should be deserialized before converting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromXML(xml, fallback )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Turns a xml string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromXML(&#039;&amp;amp;lt;testtag&amp;amp;gt;What a nice feature!&amp;amp;lt;/testtag&amp;amp;gt;&#039;) Followed by:&amp;lt;/code&amp;gt;print( t.texttag)` will print What a nice feature! Optional 2nd param fallback will be returned if xml is nil or invalid.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fuzzyLookup([string|array of strings], parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.14&amp;lt;/sup&amp;gt;. Search fuzzy matching string in parm. If parm is string it returns a number (lower is better match). If parm is array of strings it returns the best matching string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;groupExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid group &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or groupID and return ID when entered with valid groupName or false when not a group, groupID or groupName of an existing group&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; returns name when entered with valid hardwareID or ID when entered with valid hardwareName or false when not a hardwareID or hardwareName of an existing (and active )hardware module&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inTable(table, searchString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;&amp;amp;quot;key&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as a key, &amp;lt;code&amp;gt;&amp;amp;quot;value&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as value and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isJSON(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘application/json’ or string is enclosed in {} and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isXML(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘text/xml’ or ‘application/xml’ or string is enclosed in &amp;amp;lt;&amp;amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leftPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;centerPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Center string by preceding and succeeding with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;numDecimals(number [, integer [, decimals ]])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Format number to float representation. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        domoticz.utils.numDecimals(12.23, 4, 4) -- =&amp;gt; 12.2300,&lt;br /&gt;
        domoticz.utils.numDecimals (12.23,1,1) -- =&amp;gt; 12.2,&lt;br /&gt;
        domoticz.utils.leadingZeros(domoticz.utils.numDecimals (12.23,4,4),9) -- =&amp;gt; 0012.2300&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osCommand(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt; Execute an OS command and return result and returncode. Note: For long running scripts &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; should be used, See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osExecute(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Execute an OS command (no return). Note: For long running scripts &amp;lt;code&amp;gt;executeShellCommand()&amp;lt;/code&amp;gt; should be used. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rightPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Succeed string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;round(number, [decimalPlaces])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Helper function to round numbers. Default decimalPlaces is 0.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sceneExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with valid scene &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or sceneID and return ID when entered with valid sceneName or false when not a scene, sceneID or sceneName of an existing scene&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setLogMarker([marker])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: set logMarker to ‘marker’. Defaults to scriptname. Can be used to change logMarker based on flow in script&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;splitLine(string , splitOnWord ) &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line. Return is a table with line-segments.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringSplit(string [,separator ] [,convertNumber ][,convertNil ]&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line in separate words. Default separator is space. Return is a table with separated words. Default convertNumber is false when set to true it will convert strings to number where possible. Word is ignored when nil, unless convertNil is set; in that case word will be set to the convertNil value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringToSeconds(str)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Returns number of seconds between now and str. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.utils.stringToSeconds(&#039;09:00&#039;)                 -- number of seconds between now and 09:00 hr.&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on fri&#039;)       -- number of seconds between now and Friday at 08:53:30&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on sat, sun&#039;)  -- number of seconds between now and Saturday or Sunday at 08:53:30 ;whatever comes first&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: ) Encode a string to base64&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toCelsius(f, relative)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts temperature from Fahrenheit to Celsius along the temperature scale or when relative == true it uses the fact that 1F = 0.56C. So &amp;lt;code&amp;gt;toCelsius(5, true)&amp;lt;/code&amp;gt; returns 5F*(1/1.8) = 2.78C.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toJSON(luaTable)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a json string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toXML(luaTable, [header])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a xml string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlDecode(s)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple deCoder to convert a string with escaped chars (%20, %3A and the likes) to human readable format.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlEncode(s, [strSub])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple url encoder for string so you can use them in &amp;lt;code&amp;gt;openURL()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;strSub&amp;lt;/code&amp;gt; is optional and defaults to + but you can also pass %20 if you like/need.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variableExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid variable &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or variableID and return ID when entered with valid variableName or false when not a variable, variableID or variableName of an existing variable&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leadingZeros(number, length)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede number with given zeros to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variables(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a variable by it’s name or idx. See [Variable object API] (#Variable_object_API_.28user_variables.29) for the attributes. To iterate over all variables do: &amp;lt;code&amp;gt;domoticz.variables().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. &#039;&#039;&#039;Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.variables()) do .. end&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-collections-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Looping through the collections: iterators ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these collections (tables): devices, scenes, groups, variables, changedDevices and changedVariables. You cannot use the &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; functions. Therefore dzVents has four iterator methods:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Returns the item in the collection for which &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; returns true. When no item is found &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; returns nil.&lt;br /&gt;
# &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Executes function once per array element. The function receives the item in the collection (device or variable). If the function returns &#039;&#039;false&#039;&#039;, the loop is aborted.&lt;br /&gt;
# &#039;&#039;&#039;filter(function / table)&#039;&#039;&#039;: returns items in the collection for which the function returns true. You can also provide a table with names and/or ids.&lt;br /&gt;
# &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the collection and do some calculation with it. You call it with the function and the initial value. Each iteration the function is called with the accumulator and the item in the collection. The function does something with the accumulator and returns a new value for it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Examples: ====&lt;br /&gt;
&lt;br /&gt;
find():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myDevice = domoticz.devices().find(function(device)&lt;br /&gt;
        return device.name == &#039;myDevice&#039;&lt;br /&gt;
    end)&lt;br /&gt;
    domoticz.log(&#039;Id: &#039; .. myDevice.id)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
forEach():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().forEach(function(device)&lt;br /&gt;
        if (device.batteryLevel &amp;lt; 20) then&lt;br /&gt;
        -- do something&lt;br /&gt;
        end&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
filter():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local deadDevices = domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end)&lt;br /&gt;
    deadDevices.forEach(function(zombie)&lt;br /&gt;
        -- do something&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local livingLights = {&lt;br /&gt;
        &#039;window&#039;,&lt;br /&gt;
        &#039;couch&#039;,&lt;br /&gt;
        33, -- kitchen light id&lt;br /&gt;
    }&lt;br /&gt;
    local lights = domoticz.devices().filter(livingLights)&lt;br /&gt;
    lights.forEach(function(light)&lt;br /&gt;
        -- do something&lt;br /&gt;
        light.switchOn()&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can chain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end).forEach(function(zombie)&lt;br /&gt;
        -- do something with the zombie&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Using a reducer to count all devices that are switched on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local count = domoticz.devices().reduce(function(acc, device)&lt;br /&gt;
        if (device.state == &#039;On&#039;) then&lt;br /&gt;
            acc = acc + 1 -- increase the accumulator&lt;br /&gt;
        end&lt;br /&gt;
        return acc -- always return the accumulator&lt;br /&gt;
    end, 0) -- 0 is the initial value for the accumulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;constants&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these constants available for use in your code e.g. &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT: you have to prefix these constants with the name of your domoticz object. Example: &amp;lt;code&amp;gt;domoticz.ALERTLEVEL_RED&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_ORANGE, ALERTLEVEL_RED, ALERTLEVEL_YELLOW&#039;&#039;&#039;: for updating text sensors.&lt;br /&gt;
* &#039;&#039;&#039;BASETYPE_CUSTOM_EVENT &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;,BASETYPE_DEVICE, BASETYPE_SCENE, BASETYPE_GROUP, BASETYPE_HARDWARE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;BASETYPE_VARIABLE, BASETYPE_SECURITY, BASETYPE_TIMER, BASETYPE_HTTP_RESPONSE, BASETYPE_SYSTEM&#039;&#039;&#039;&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;: indicators for the various object types that are passed as the second parameter to the execute function. E.g. you can check if an object is a device object: &amp;lt;code&amp;gt;Lua  if (item.baseType == domoticz.BASETYPE_DEVICE) then ... end&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;BARO_CLOUDY, BARO_CLOUDY_RAIN, BARO_STABLE, BARO_SUNNY, BARO_THUNDERSTORM, BARO_NOINFO, BARO_UNSTABLE, BARO_COMPUTE&#039;&#039;&#039; : for updating barometric values.&lt;br /&gt;
* &#039;&#039;&#039;EVENT_TYPE_DEVICE, EVENT_TYPE_VARIABLE, EVENT_TYPE_CUSTOM&#039;&#039;&#039;, &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_SECURITY, EVENT_TYPE_HTTPRESPONSE, EVENT_TYPE_SYSTEM,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_TIMER&#039;&#039;&#039;: triggerInfo types passed to the execute function in your scripts.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_TEMPORARY_OVERRIDE, EVOHOME_MODE_PERMANENT_OVERRIDE, EVOHOME_MODE_FOLLOW_SCHEDULE&#039;&#039;&#039;: mode for EvoHome system.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_AUTOWITHRESET, EVOHOME_MODE_AUTOWITHECO, EVOHOME_MODE_AWAY, EVOHOME_MODE_DAYOFF, EVOHOME_MODE_CUSTOM, EVOHOME_MODE_HEATINGOFF&#039;&#039;&#039; : mode for EvoHome controller&lt;br /&gt;
* &#039;&#039;&#039;HUM_COMFORTABLE, HUM_DRY, HUM_NORMAL, HUM_WET, HUM_COMPUTE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;: constant for humidity status.&lt;br /&gt;
* &#039;&#039;&#039;INTEGER, FLOAT, STRING, DATE, TIME&#039;&#039;&#039;: variable types.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;**LOG_INFO, LOG_STATUS, LOG_ERROR, LOG_DEBUG, LOG_FORCE: for logging messages. LOG_FORCE will always be displayed.&lt;br /&gt;
* &#039;&#039;&#039;NSS_CLICKATELL&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_FIREBASE, NSS_FIREBASE_CLOUD_MESSAGING, NSS_GOOGLE_DEVICES,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; &amp;lt;sup&amp;gt;Only with installed casting plugin&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER, NSS_TELEGRAM, NSS_GOOGLE_CLOUD_MESSAGING&#039;&#039;&#039; &amp;lt;sup&amp;gt;deprecated by Google and replaced by firebase&amp;lt;/sup&amp;gt;: for notification subsystem&lt;br /&gt;
* &#039;&#039;&#039;PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&#039;&#039;&#039;: for notification priority.&lt;br /&gt;
* &#039;&#039;&#039;SECURITY_ARMEDAWAY, SECURITY_ARMEDHOME, SECURITY_DISARMED&#039;&#039;&#039;: for security state.&lt;br /&gt;
* &#039;&#039;&#039;STATE_IDLE, STATE_COOLING, STATE_HEATING&#039;&#039;&#039;: for thermostat operating state.&lt;br /&gt;
* &#039;&#039;&#039;SOUND_ALIEN , SOUND_BIKE, SOUND_BUGLE, SOUND_CASH_REGISTER, SOUND_CLASSICAL, SOUND_CLIMB , SOUND_COSMIC, SOUND_DEFAULT, SOUND_ECHO, SOUND_FALLING, SOUND_GAMELAN, SOUND_INCOMING, SOUND_INTERMISSION, SOUND_MAGIC, SOUND_MECHANICAL, SOUND_NONE, SOUND_PERSISTENT, SOUND_PIANOBAR , SOUND_SIREN, SOUND_SPACEALARM, SOUND_TUGBOAT, SOUND_UPDOWN&#039;&#039;&#039;: for notification sounds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Custom event API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a customEvent in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;notification&#039;&#039; object. The object.type = customEvent (isCustomEvent: true) and object.data contains the passed data to this script. object.trigger is the name of the customEvent that triggered the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-object-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device object API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by switching a device in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;device&#039;&#039; object. Also, each device in Domoticz can be found in the &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; collection (see above). The device object has a set of fixed attributes like &#039;&#039;name&#039;&#039; and &#039;&#039;idx&#039;&#039;. Many devices, however, have different attributes and methods depending on their (hardware)type, subtype and other device specific identifiers. It is possible that you will get an error if you call a method on a device that doesn’t support it, so please check the device properties for your specific hardware to see which are supported (can also be done in your script code!).&lt;br /&gt;
&lt;br /&gt;
dzVents recognizes most of the different device types in Domoticz and creates the proper attributes and methods. It is possible that your device type has attributes that are not recognized; if that’s the case, please create a ticket in the Domoticz [https://github.com/domoticz/domoticz/issues issue tracker on GitHub], and an adapter for that device will be added.&lt;br /&gt;
&lt;br /&gt;
If for some reason you miss a specific attribute or data for a device, then likely the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute will have that information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-all-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device attributes and methods for all devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Same as bState.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;baseType&#039;&#039;&#039; &#039;&#039;String&#039;&#039;. ‘camera’, ‘device’, ‘group’, ‘scene’, ‘hardware’, ‘uservariable’ or ‘security’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;batteryLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-100.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;bState&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Better to use active.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True if the device was updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: This does not necessarily means the device state or value changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;customImage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. When customImage is used for the device-icon this will be the icon-number. It will be 0 if the icon was not changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;description&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Description of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceId&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Another identifier of devices in Domoticz. dzVents uses the id(x) attribute. See device list in Domoticz’ settings table.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceSubType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dump()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all attributes except functions and complete time overview to the Domoticz log. This ignores the log level setting. Use fullDump to include everything.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpSelection([{‘attributes’} ‘functions’ ‘tables’])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.5&amp;lt;/sup&amp;gt; Dump attributes, function-names or table-names to the Domoticz log. This ignores the log level setting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fullDump()&#039;&#039;&#039; &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt; Dump all attributes including functions and the complete time overview to the Domoticz log. This ignores the log level setting. Most of the time dump() shows everything what is needed to debug.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareId&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;icon&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the icon in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the device. You can find the index in the device list (idx column) in Domoticz settings. It’s not truly an index but is unique enough for dzVents to be treated as an id.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;idx&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as id: index of the device&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inActive&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; true if active is false and vice versa. If active is nil inActive is also nil&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Time when the device was updated. **Note: The lastUpdate for devices that triggered the script at hand is in fact the previousUpdate time. The real lastUpdate time for these “script triggering” devices is the current time.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;nValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Numerical representation of the state.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protected&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True when device / scene / group is protected. False otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options] !! **Note: domoticz protects against GUI and API access only. switchOn / switchOff type Blockly / Lua / dzVents commands are not influenced (because they are executed as admin user)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rawData&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;: All values are &#039;&#039;String&#039;&#039; types and hold the raw data received from Domoticz.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current devicename to new devicename Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setDescription(description)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic method to update the description for all devices, groups and scenes. E.g.: device.setDescription(device.description .. ‘/nChanged by’.. item.trigger .. ‘at’ .. domoticz.time.raw). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setIcon(iconNumber)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. method to update the icon for devices. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setState(newState)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method for switch-like devices. E.g.: device.setState(‘On’). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;resumeTimerPlan()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Finds the most recent timer that should have fired today (before now) for this device, scene, or group and executes it immediately. Useful for restoring the correct state after a Domoticz restart or power cut. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. ```lua – Replay last timer for a device domoticz.devices(‘My Light’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a scene domoticz.scenes(‘Evening Scene’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a group domoticz.groups(‘All Lights’).resumeTimerPlan() ```&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setValues(nValue,[ sValue1, sValue2, …])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic alternative method to update device nValue, sValues. Uses domoticz JSON API to force subsequent pushes like influxdb and MQTT. nValue required but when set to nil it defaults to current nValue. sValue parms are optional and can be many. &amp;lt;sup&amp;gt;3.0.8&amp;lt;/sup&amp;gt; If one of sValue parms is ‘parsetrigger’, subsequent eventscripts will be triggered.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For switches, holds the state like ‘On’ or ‘Off’. For dimmers that are on, it is also ‘On’ but there is a level attribute holding the dimming level. &#039;&#039;&#039;For selector switches&#039;&#039;&#039; (Dummy switch) the state holds the &#039;&#039;name&#039;&#039; of the currently selected level. The corresponding numeric level of this state can be found in the &#039;&#039;&#039;rawData&#039;&#039;&#039; attribute: &amp;lt;code&amp;gt;device.rawData[1]&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;signalLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-12&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI(Switches tab). E.g. ‘On/Off’, ‘Door Contact’, ‘Motion Sensor’ or ‘Blinds’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sValue&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the sValue (string Value) of a device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;timedOut&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true when the device couldn’t be reached.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;unit&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Device unit. See device list in Domoticz’ settings for the unit.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;update(&amp;amp;lt; params &amp;amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method. Accepts any number of parameters that will be sent back to Domoticz. There is no need to pass the device.id here. It will be passed for you. Example to update a temperature: &amp;lt;code&amp;gt;device.update(0,12)&amp;lt;/code&amp;gt;. This will eventually result in a commandArray entry &amp;lt;code&amp;gt;[&#039;UpdateDevice&#039;]=&#039;&amp;amp;lt;idx&amp;amp;gt;|0|12&#039;&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;updateQuiet(nValue, sValue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Uses the JSON/API to send nValue and/or sValue to domoticz (at least one should be supplied). Will update the device status in the GUI and trigger events but will not execute the action on the device. Only useful when the status in the GUI is not in line with the actual status. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-specific-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device attributes and methods for specific devices ===&lt;br /&gt;
&lt;br /&gt;
Note that if you do not find your specific device type here you can always inspect what is in the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute. Please let us know that it is missing so we can write an adapter for it (or you can write your own and submit it). Calling &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; will dump all attributes and values for myDevice to the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;air-quality&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Air quality ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;co2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. PPM&lt;br /&gt;
* &#039;&#039;&#039;quality&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Air quality string.&lt;br /&gt;
* &#039;&#039;&#039;updateAirQuality(ppm)&#039;&#039;&#039;: Pass the CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; concentration. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alert-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Alert sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Color of the alert. See domoticz color constants for possible values.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateAlertSensor(level, text)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-1-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 1-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Current in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-3-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 3-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current1&#039;&#039;&#039;, &#039;&#039;&#039;current2&#039;&#039;&#039;, &#039;&#039;&#039;current3&#039;&#039;&#039; : &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current1, current2, current3)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Currents in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. Barometric pressure.&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateBarometer(pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update barometric pressure. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-managed-counter-counter-incremental&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Counter, managed Counter, counter incremental ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Today’s counter value.&lt;br /&gt;
* &#039;&#039;&#039;updateCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &#039;&#039;&#039;Overwrite current value for managed and standard counters; increment for incremental counters !!&#039;&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateHistory( date, sValues )&#039;&#039;&#039;: &#039;&#039;Strings&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt; &#039;&#039;function&#039;&#039; Managed counter only! Used to write values to short or long term storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local mCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22&#039;, &#039;10;1777193&#039;) -- Write to long term storage (meter_calendar table)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22 10:05:02&#039;, &#039;10;1777193&#039;) -- Write to short term storage (meter table)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;incrementCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (counter incremental) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. To update with a complete new value you will have to do some calculation and take the counter divider into account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local newValue = value&lt;br /&gt;
    local iCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    local counterDivider = x -- x is depending on the counter divider set for the device&lt;br /&gt;
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;valueQuantity&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For counters.&lt;br /&gt;
* &#039;&#039;&#039;valueUnits&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Custom sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sensorType&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;sensorUnit&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;sensorValue&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; &#039;&#039;Number&#039;&#039; where applicable; else &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;updateCustomSensor(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;distance-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Distance sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateDistance(distance)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Electric usage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage. (please use actualWatt)&lt;br /&gt;
* &#039;&#039;&#039;updateEnergy(energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. In Watt. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-controller&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (controller) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;setMode(mode, dparm, action, ooc )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set mode for controller. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_AUTOWITHRESET, domoticz.EVOHOME_MODE_AUTOWITHECO, domoticz.EVOHOME_MODE_AWAY, domoticz.EVOHOME_MODE_DAYOFF, domoticz.EVOHOME_MODE_CUSTOM or domoticz.EVOHOME_MODE_HEATINGOFF. dParm &amp;lt;optional&amp;gt; can be a future time string (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;), a future time object, a future time as number of seconds since epoch or a number representing a positive offset in minutes (max 1 year). action &amp;lt;optional&amp;gt; (1 = run on action script, 0 = disable), ooc &amp;lt;optional&amp;gt; (1 = only trigger the event &amp;amp;amp; log on change, 0 = always trigger &amp;amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-hotwater&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (hotWater) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a.&lt;br /&gt;
* &#039;&#039;&#039;setHotWater(state, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set HotWater Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE You can provide an until date (in ISO 8601 format for domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-relay&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (relay) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;number&#039;&#039; (level percentage)&lt;br /&gt;
* &#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; (true when state is not equal to ‘Off’, false otherwise)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-zones&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (zones) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; .&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a .&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update set point. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE. You can provide an until date (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;). When leaving out untilDate for mode domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE the untilDate will be the next scheduled zone-update time/date. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gas ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;updateGas(usage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Usage in &#039;&#039;&#039;dm&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&#039;&#039;&#039; (liters). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current group-name to new group-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleGroup()&#039;&#039;&#039;: Toggles the state of a group. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hardware-3.0.7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hardware &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;isHardware&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;isPythonPlugin&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: : &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;typeValue&#039;&#039;&#039;: : &#039;&#039;Number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;humidity-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Humidity sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;updateHumidity(humidity, status)&#039;&#039;&#039;: Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kodi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Kodi ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;kodiExecuteAddOn(addonId)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. 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;
* &#039;&#039;&#039;kodiPause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlay()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play an item from the Kodi’s Favorites list optionally starting at &#039;&#039;position&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayPlaylist(name, [position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play a music or video Smart Playlist with &#039;&#039;name&#039;&#039; optionally starting at &#039;&#039;position&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiSetVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the volume for a Kodi device, 0 &amp;amp;lt;= level &amp;amp;lt;= 100.&lt;br /&gt;
* &#039;&#039;&#039;kodiStop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiSwitchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-electricity-instant-and-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== kWh, Electricity (instant and counter) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual usage in Watt.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateElectricity(power, energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WhToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage of the day. Note the unit is Wh and not kWh!&lt;br /&gt;
* &#039;&#039;&#039;WhTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual reading in Watt. Please use actualWatt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;leaf-wetness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Leaf wetness ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wetness&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Wetness value&lt;br /&gt;
* &#039;&#039;&#039;updateWetness(wetness)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logitech-media-server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Logitech Media Server ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will pause the device if it was streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;play()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. If the device was off, it will turn on and start streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the favorites playlist. &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; is optional (0 = default). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playlistID&#039;&#039;&#039;: &#039;&#039;Nubmer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;setVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the volume (0 &amp;amp;lt;= level &amp;amp;lt;= 100). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;startPlaylist(name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the playlist by its &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will stop the device (only effective if the device is streaming). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeUp()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume up with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeDown()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume down with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lux-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lux sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lux&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Lux level for light sensors.&lt;br /&gt;
* &#039;&#039;&#039;updateLux(lux)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;onkyo-receiver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Onkyo receiver ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;onkyoEISCPCommand(command)&#039;&#039;&#039;. &#039;&#039;Function&#039;&#039;. Sends an EISP command to the Onkyo receiver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;opentherm-gateway&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenTherm gateway ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-smart-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== P1 Smart meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usage1&#039;&#039;&#039;, &#039;&#039;&#039;usage2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;return1&#039;&#039;&#039;, &#039;&#039;&#039;return2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateP1(usage1, usage2, return1, return2, cons, prod)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Updates the device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usageDelivered&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;percentage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Percentage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;percentage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePercentage(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;philips-hue-light&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Philips Hue Light ====&lt;br /&gt;
&lt;br /&gt;
See switch below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pressure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Pressure ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pressure&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePressure(pressure)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Rain meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;rain&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; (please note that this does return the rain total for today)&lt;br /&gt;
* &#039;&#039;&#039;rainRate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateRain(rate, counter)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (rate in mm * 100 per hour, counter is total in mm) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rgbww-lighting-limitlessapplamp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== RGBW(W) / Lighting Limitless/Applamp ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;decreaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;getColor()&#039;&#039;&#039;; &#039;&#039;Function&#039;&#039;. Returns table with color attributes or nil when color field of device is not set.&lt;br /&gt;
* &#039;&#039;&#039;increaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setColor(r, g, b, br, cw, ww, m, t)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required, others optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. Meaning and limits of parms can be found [https://wiki.domoticz.com/Domoticz_API/JSON_URL&#039;s#Set_a_light_to_a_certain_color_or_color_temperature here].&lt;br /&gt;
* &#039;&#039;&#039;setColorBrightness()&#039;&#039;&#039;: same as setColor&lt;br /&gt;
* &#039;&#039;&#039;setDiscoMode(modeNum)&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setHex(r, g, b)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required (decimal Values 0-255). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setHue(hue, brightness, isWhite)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested Hue. Hue and brightness required. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setKelvin(Kelvin)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets Kelvin level of the light (For RGBWW devices only). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setNightMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to night mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setRGB(red, green, blue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the lamps RGB color. Values are from 0-255. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setWhiteMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to white mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scale-weight&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scale weight ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;weight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;udateWeight()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scene ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current scene-name to new scene-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-panel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Security Panel ====&lt;br /&gt;
&lt;br /&gt;
Create a security device:&lt;br /&gt;
&lt;br /&gt;
# Set a security panel password in Domoticz settings.&lt;br /&gt;
# Activate the security panel (&#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Security Panel&#039;&#039;&#039; and set it to &#039;&#039;&#039;Disarm&#039;&#039;&#039; (using your password)).&lt;br /&gt;
# Go to the device list in (&#039;&#039;&#039;Setup &amp;amp;gt; Devices&#039;&#039;&#039;) where it should show the security panel device under ‘Not used’.&lt;br /&gt;
# Add the device and give it a name.&lt;br /&gt;
&lt;br /&gt;
Methods/attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;armAway()&#039;&#039;&#039;: Sets a security device to Armed Away. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;armHome()&#039;&#039;&#039;: Sets a security device to Armed Home. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;disarm()&#039;&#039;&#039;: Disarms a security device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;: Same values as domoticz.security value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;smoke-detection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Smoke detection ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;activate()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;reset()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;solar-radiation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Solar radiation ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;radiation&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In Watt/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;updateRadiation(radiation)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;soil-moisture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Soil moisture ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;moisture&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In centibars (cB).&lt;br /&gt;
* &#039;&#039;&#039;updateSoilMoisture(moisture)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sound-level&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sound level ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In dB.&lt;br /&gt;
* &#039;&#039;&#039;updateSoundLevel(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;switch-dimmer-selector-etc.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Switch (dimmer, selector etc.) ====&lt;br /&gt;
&lt;br /&gt;
There are many switch-like devices. Not all methods are applicable for all switch-like devices. You can always use the generic &amp;lt;code&amp;gt;setState(newState)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;close()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Close if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;dimTo(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch a dimming device on and/or dim to the specified level. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;lastLevel&#039;&#039;&#039;: Number. The level of a dimmer just before it was switched off. &#039;&#039;&#039;Note: lastLevel only shows you the previous level if you have a trigger for the device itself. So for instance you have a on-trigger for ‘myDimmer’ and the dimmer is set from 20% to 30%, in your script &amp;lt;code&amp;gt;myDimmer.level == 30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myDimmer.lastLevel == 20&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. For dimmers and other ‘Set Level..%’ devices this holds the level like selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelActions&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. |-separated list of url actions for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current level name for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelNames&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Table holding the level names for selector switch devices.&lt;br /&gt;
* &#039;&#039;&#039;levelVal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Specific for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;maxDimLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;open()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Open if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set deviceStatus to on without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set deviceStatus to off without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setLevel(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to a given level if it supports it (e.g. blinds percentage). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Stop if it supports it (e.g. blinds). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device off it is supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device on if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchSelector(&amp;amp;lt;[level]|[levelname] &amp;amp;gt;)&#039;&#039;&#039; : &#039;&#039;Function&#039;&#039;. Switches a selector switch to a specific level ( levelname or level(numeric) required ) levelname must be exact, for level the closest fit will be picked. See the edit page in Domoticz for such a switch to get a list of the values). Levelname is only supported when level 0 (“Off”) is not removed Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleSwitch()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Toggles the state of the switch (if it is togglable) like On/Off, Open/Close etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTemperature(temperature)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempBaro(temperature, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHumBaro(temperature, humidity, status, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. forecast can be domoticz.BARO_NOINFO, BARO_SUNNY, BARO_PARTLY_CLOUDY, BARO_CLOUDY, BARO_RAIN. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET, HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHum(temperature, humidity [, status] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET or HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Text ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateText(text)&#039;&#039;&#039;: Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-set-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat set point ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-operating-state-3.0.19&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat Operating state &amp;lt;sup&amp;gt;3.0.19&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-type-3-mertik-3.0.15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat type 3 (Mertik) &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-6-3.1.11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat 6 &amp;lt;sup&amp;gt;3.1.11&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Thermostat 6 devices come in several subtypes: Temp/Setpoint, Temp/Hum/Setpoint, Temp/Baro/Setpoint and Temp/Hum/Baro/Setpoint. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. The current set point. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Mapped humidity status value (only for subtypes with humidity). &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update the set point. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update thermostat values. Parameters depend on the subtype: &lt;br /&gt;
&lt;br /&gt;
* - &#039;&#039;Temp/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint)&amp;lt;/code&amp;gt; &lt;br /&gt;
* - &#039;&#039;Temp/Hum/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus)&amp;lt;/code&amp;gt; &lt;br /&gt;
* - &#039;&#039;Temp/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, nil, nil, barometer, forecast)&amp;lt;/code&amp;gt; &lt;br /&gt;
* - &#039;&#039;Temp/Hum/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&amp;lt;/code&amp;gt; &lt;br /&gt;
* - &amp;lt;code&amp;gt;forecast&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;noinfo&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;sunny&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;partlycloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;cloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;rain&#039;&amp;lt;/code&amp;gt; or a numeric value. &lt;br /&gt;
* - &amp;lt;code&amp;gt;humidityStatus&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;dry&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;normal&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;comfortable&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;wet&#039;&amp;lt;/code&amp;gt; or a numeric value. If omitted with humidity provided, it is auto-calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;uv-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UV sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uv&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. UV index.&lt;br /&gt;
* &#039;&#039;&#039;updateUV(uv)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. UV index. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;visibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Visibility ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;visibility&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In km.&lt;br /&gt;
* &#039;&#039;&#039;updateVisibility(distance)&#039;&#039;&#039;:Function*. In km. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;voltage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Voltage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;voltage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateVoltage(voltage)&#039;&#039;&#039;:Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;waterflow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Waterflow ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flow&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In L/m.&lt;br /&gt;
* &#039;&#039;&#039;updateWaterflow(flow)&#039;&#039;&#039;:Function*. In L/m. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wind ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;chill&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;direction&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Degrees.&lt;br /&gt;
* &#039;&#039;&#039;directionString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Formatted wind direction like N, SE.&lt;br /&gt;
* &#039;&#039;&#039;gust&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. ( in meters / second, might change in future releases to Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;gustMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Gust ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;speed&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in the unit set in Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;speedMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;updateWind(bearing, direction, speed, gust, temperature, chill)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Bearing in degrees, direction in N, S, NNW etc, speed in m/s, gust in m/s, temperature and chill in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;youless-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Youless meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;powerYield&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateYouless(total, actual)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zone-heating&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Zone heating ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;heatingMode&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-fan-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Fan mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-thermostat-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Thermostat mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-options-delay-duration-event-triggering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Command options (delay, duration, event triggering) ===&lt;br /&gt;
&lt;br /&gt;
Many dzVents device methods support extra options, like controlling a delay or a duration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    -- switch on for 2 minutes after 10 seconds&lt;br /&gt;
    device.switchOn().afterSec(10).forMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on at a specic time / day&lt;br /&gt;
    device.switchOn().at(&#039;09:00&#039;)                   -- earliest moment it will be 09:00 hr.&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on fri&#039;)         -- earliest moment it will be Friday at 08:53:30&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on sat, sun&#039;)    -- earliest moment it will be Saturday or Sunday at 08:53:30 (whatever comes first)&lt;br /&gt;
&lt;br /&gt;
    -- switch on for 2 minutes after a randomized delay of 1-10 minutes&lt;br /&gt;
    device.switchOff().withinMin(10).forMin(2)&lt;br /&gt;
    device.close().forMin(15)&lt;br /&gt;
    device.open().afterSec(20)&lt;br /&gt;
    device.open().afterMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on but do not trigger follow up events&lt;br /&gt;
    device.switchOn().silent()&lt;br /&gt;
&lt;br /&gt;
    -- flash a light for 3 times&lt;br /&gt;
    device.switchOn().forSec(2).repeatAfterSec(1, 3)&lt;br /&gt;
&lt;br /&gt;
    -- switch the device on but only if the current state isn&#039;t already on:&lt;br /&gt;
    device.switchOn().checkFirst()&lt;br /&gt;
    -- this is a short for:&lt;br /&gt;
    if (device.state == &#039;Off&#039;) then&lt;br /&gt;
        devices.switchOn()&lt;br /&gt;
    end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Options ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;at(hh:mm[:ss][ on [ ddd|dddd ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Activates the command at a certain time [ on a certain day]&lt;br /&gt;
* &#039;&#039;&#039;afterHour(hours), afterMin(minutes), afterSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command after a certain number of hours, minutes or seconds.&lt;br /&gt;
* &#039;&#039;&#039;cancelQueuedCommands()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Cancels queued commands. E.g. you switch on a device after 10 minutes: &amp;lt;code&amp;gt;myDevice.switchOn().afterMin(10)&amp;lt;/code&amp;gt;. Within those 10 minutes you can cancel that command by calling: &amp;lt;code&amp;gt;myDevice.cancelQueuedCommands()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;checkFirst()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Checks if the &#039;&#039;&#039;current&#039;&#039;&#039; state of the device is different than the desired new state. If the target state is the same, no command is sent. If you do &amp;lt;code&amp;gt;mySwitch.switchOn().checkFirst()&amp;lt;/code&amp;gt;, then no switch command is sent if the switch is already on. This command only works with switch-like devices. It is not available for toggle and dim commands, either.&lt;br /&gt;
* &#039;&#039;&#039;forHour(hours), forMin(minutes), forSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command for the duration of hours, minutes or seconds. See table below for applicability and the warning on unexpected behavior of these functions.&lt;br /&gt;
* &#039;&#039;&#039;withinHour(hours), withinMin(minutes), withinSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command within a certain period (specified in hours, minutes or seconds) &#039;&#039;randomly&#039;&#039;. See table below for applicability.&lt;br /&gt;
* &#039;&#039;&#039;silent()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. No follow-up events will be triggered: &amp;lt;code&amp;gt;mySwitch.switchOff().silent()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;repeatAfterHour(hours, [number]), repeatAfterMin(minutes, [number]), repeatAfterSec(seconds, [number])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Repeats the sequence &#039;&#039;number&#039;&#039; times after the specified duration (specified in hours, minutes, or seconds). If no &#039;&#039;number&#039;&#039; is provided, 1 is used. &#039;&#039;&#039;Note that &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; are only applied at the beginning of the sequence and not between the repeats!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the actual switching or changing of the device is done by Domoticz and not by dzVents. dzVents only tells Domoticz what to do; if the options are not carried out as expected, this is likely a Domoticz or hardware issue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note when using forAAA()&#039;&#039;&#039;: Let’s say you have a light that is triggered by a motion detector. Currently the light is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt; and you do this: &amp;lt;code&amp;gt;light.switchOn().forMin(5)&amp;lt;/code&amp;gt;. What happens inside Domoticz is this: at t&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; Domoticz issues the &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command and schedules a command to restore the &#039;&#039;&#039;current&#039;&#039;&#039; state at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; which is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt;. So at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; it will switch the light off.&lt;br /&gt;
&lt;br /&gt;
If, however, &#039;&#039;before the scheduled &amp;lt;code&amp;gt;switchOff()&amp;lt;/code&amp;gt; happens at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&#039;&#039;, new motion is detected and you send this command again at t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; then something unpredictable may seem to happen: &#039;&#039;the light is never turned off!&#039;&#039; This is what happens:&lt;br /&gt;
&lt;br /&gt;
At t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; Domoticz receives the &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; command again. It sees a scheduled command at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; and deletes that command (it is within the new interval). Then Domoticz performs the (unnecessary, it’s already on) &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command. Then it checks the current state of the light which is &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;!! and schedules a command to return to that state at t&amp;lt;sub&amp;gt;2+5&amp;lt;/sub&amp;gt;=t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;. So, at t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; the light is switched on again. And there you have it: the light is not switched off and never will be because future commands will always be checked against the current on-state.&lt;br /&gt;
&lt;br /&gt;
That’s just how it works and you will have to deal with it in your script. So, instead of simply re-issuing &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; you have to check the switch’s state first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;if (light.active) then&lt;br /&gt;
    light.switchOff().afterMin(5)&lt;br /&gt;
else&lt;br /&gt;
    light.switchOn().forMin(5)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or issue these two commands &#039;&#039;both&#039;&#039; as they are mutually exclusive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;light.switchOff().checkFirst().afterMin(5)&lt;br /&gt;
light.switchOn().checkFirst().forMin(5)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Availability ====&lt;br /&gt;
&lt;br /&gt;
Some options are not available to all commands. All the options are available to device switch-like commands like &amp;lt;code&amp;gt;myDevice.switchOff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myGroup.switchOn()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;myBlinds.open()&amp;lt;/code&amp;gt;. For updating (usually Dummy ) devices like a text device &amp;lt;code&amp;gt;myTextDevice.updateText(&#039;zork&#039;)&amp;lt;/code&amp;gt; you can only use &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;. For thermostat setpoint devices and snapshot command silent() is not available. For commands for which dzVents must use openURL, only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; methods are available. These commands are mainly the setAaaaa() commands for RGBW type devices.&lt;br /&gt;
&lt;br /&gt;
See table below&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| option&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| state changes&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;11%&amp;quot;| update commands&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| user variables&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| updateSetpoint&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;8%&amp;quot;| snapshot&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| triggerIFTTT&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| execute ShellCommand&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| emitEvent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repeatAfterAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkFirst()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| • &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancelQueuedCommands()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;span id=&amp;quot;notes-on-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Notes on table ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note 1&#039;&#039;&#039;: AAA is a placeholder for &amp;lt;code&amp;gt;Min/Sec/Hour&amp;lt;/code&amp;gt; affix e.g. &amp;lt;code&amp;gt;afterMin()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Note 2&#039;&#039;&#039;: for &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; is available.&lt;br /&gt;
* &#039;&#039;&#039;Note 3&#039;&#039;&#039;: Note 2 also applies for all commands depending on openURL (like rgbwwDevice.setAaa() commands).&lt;br /&gt;
* &#039;&#039;&#039;Note 4&#039;&#039;&#039;: Including dimTo, switchSelector, setLevel and similar methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;follow-up-event-triggers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Follow-up event triggers ====&lt;br /&gt;
&lt;br /&gt;
Normally if you issue a command, Domoticz will immediately trigger follow-up events, and dzVents will automatically trigger defined event scripts. If you trigger a scene, all devices in that scene will issue a change event. If you have event triggers for these devices, they will be executed by dzVents. If you don’t want this to happen, add &amp;lt;code&amp;gt;.silent()&amp;lt;/code&amp;gt; to your commands (exception is updateSetPoint).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-your-own-device-adapter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create your own device adapter ===&lt;br /&gt;
&lt;br /&gt;
If your device is not recognized by dzVents, you can still operate it using the generic device attributes and methods. It is much nicer, however, to have device specific attributes and methods. Existing recognized adapters are in &amp;lt;code&amp;gt;/path/to/domoticz/dzVents/runtime/device-adapters&amp;lt;/code&amp;gt;. Copy an existing adapter and adapt it to your needs. You can turn debug logging on and inspect the file &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; in the dzVents folder. There you will find the unique signature for your device type. Usually it is a combination of deviceType and deviceSubType, but you can use any of the device attributes in the &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; function. The matches function checks if the device type is suitable for your adapter and the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; function actually creates your specific attributes and methods. Also, if you call &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; you will see all attributes and methods and the attribute &amp;lt;code&amp;gt;_adapters&amp;lt;/code&amp;gt; shows you a list of applied adapters for that device. Finally, register your adapter in &amp;lt;code&amp;gt;Adapters.lua&amp;lt;/code&amp;gt;. Please share your adapter when it is ready and working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: dzVents only runs when there is at least one active dzVents script, either created in the internal web editor or placed as a &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; file in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Without such a script, Domoticz never starts the dzVents Lua engine, so the device adapters are not loaded, &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is not written and any logging you add to your adapter stays silent whatever the log level is. When you develop an adapter before you have a script that uses it, add a minimal placeholder script to activate the engine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-object-api-user-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Variable object API (user variables) ==&lt;br /&gt;
&lt;br /&gt;
User variables created in Domoticz have these attributes and methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Was the variable updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.DATE. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the variable.&lt;br /&gt;
* &#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the variable&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current variable name to new variable name. (does not support timing options)&lt;br /&gt;
* &#039;&#039;&#039;set(value)&#039;&#039;&#039;: Tells Domoticz to update the variable. Supports timing options. See [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|above]].&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.TIME. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Can be domoticz.INTEGER, domoticz.FLOAT, domoticz.STRING, domoticz.DATE, domoticz.TIME.&lt;br /&gt;
* &#039;&#039;&#039;value&#039;&#039;&#039;: &#039;&#039;String|Number|Date|Time&#039;&#039;. Value of the variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Time object ==&lt;br /&gt;
&lt;br /&gt;
Many attributes represent a moment in time, like &amp;lt;code&amp;gt;myDevice.lastUpdate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.time&amp;lt;/code&amp;gt;. In dzVents, a time-like attribute is an object with properties and methods which make your life easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    print(myDevice.lastUpdate.minutesAgo)&lt;br /&gt;
    print(myDevice.lastUpdate.daysAgo)&lt;br /&gt;
&lt;br /&gt;
    -- compare two times&lt;br /&gt;
    print(domoticz.time.compare(myDevice.lastUpdate).secs))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can also create your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;) -- must be this format!!&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you don’t pass a time string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local currentTime = Time()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use this in combination with the various dzVents time attributes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;)&lt;br /&gt;
&lt;br /&gt;
    local tonight = Time(domoticz.time.rawDate .. &#039; 20:00:00&#039;)&lt;br /&gt;
    print (tonight.getISO())&lt;br /&gt;
    -- will print something like: 2016-12-12T20:00:00Z&lt;br /&gt;
    print(t.minutesAgo) -- difference from &#039;now&#039; in minutes&lt;br /&gt;
&lt;br /&gt;
    -- and you can feed it with all same rules as you use&lt;br /&gt;
    -- for the timer = { .. } section:&lt;br /&gt;
    if (t.matchesRule(&#039;at 16:00-21:00&#039;)) then&lt;br /&gt;
        -- t is in between 16:00 and 21:00&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- very powerful if you want to compare two time instances:&lt;br /&gt;
    local anotherTime = Time(&#039;...&#039;) -- fill-in some time here&lt;br /&gt;
    print(t.compare(anotherTime).secs) -- diff in seconds between t and anotherTime.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System event API ===&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a system-event in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;system&#039;&#039; object. The object.type = system-event that triggered the script. ( object.isSystemEvent: true) For backups the object also contains location and durationin seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-properties-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Time properties and methods ===&lt;br /&gt;
&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local Time = require(&#039;Time&#039;)&lt;br /&gt;
local now = Time() -- current time&lt;br /&gt;
local someTime = Time(&#039;2017-12-31 22:19:15&#039;)&lt;br /&gt;
local utcTime = Time(&#039;2017-12-31 22:19:15&#039;, true)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local someTime = domoticz.time.addMinutes(30) -- someTime = domoticz time object for now + 30 minutes&lt;br /&gt;
local someTime = domoticz.time.makeTime() -- someTime = new domoticz time object.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;addAAA(offset)&#039;&#039;&#039;: &#039;&#039;time object&#039;&#039;. time object with given offset (positive or negative. AAA is a placeholder for &amp;lt;code&amp;gt;Seconds, Minutes, Hours or Days&amp;lt;/code&amp;gt; affix e.g. `addHours(-2)&lt;br /&gt;
* &#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightEnd.&lt;br /&gt;
* &#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;:&#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightStart.&lt;br /&gt;
* &#039;&#039;&#039;compare(time)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Compares the current time object with another time object. &#039;&#039;Make sure you pass a Time object!&#039;&#039; Returns a table (all values are &#039;&#039;positive&#039;&#039;, use the compare property to see if &#039;&#039;time&#039;&#039; is in the past or future):&lt;br /&gt;
** &#039;&#039;&#039;milliseconds&#039;&#039;&#039;: Total difference in milliseconds.&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: Total difference in whole seconds.&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: Total difference in whole minutes.&lt;br /&gt;
** &#039;&#039;&#039;hours&#039;&#039;&#039;: Total difference in whole hours.&lt;br /&gt;
** &#039;&#039;&#039;days&#039;&#039;&#039;: Total difference in whole days.&lt;br /&gt;
** &#039;&#039;&#039;compare&#039;&#039;&#039;: 0 = both are equal, 1 = &#039;&#039;time&#039;&#039; is in the future, -1 = &#039;&#039;time&#039;&#039; is in the past.&lt;br /&gt;
* &#039;&#039;&#039;dateToDate( dateString, sourceFormat, targetFormat[ , offSet] )&#039;&#039;&#039;:&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: Returns a reformatted datestring. dateString is a formatted date and source- and targetFormat are representations of the dateString elements and their locations in the string (see examples in dateToTimestamp) . Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;dddd dd mmmm hh:MM:ss&#039;, 1 )              -- &amp;gt; &#039;Friday 31 December 23:31:06&#039;&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;ddd dd mmm hh:MM:ss&#039;, -3600 * 24 - 3 ))  -- &amp;gt; &#039;Thu 30 Dec 23:31:02&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dateToTimestamp([ dateString [,control] ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &#039;&#039;Number&#039;&#039; representing time since epoch in seconds. dateString is a formatted date and control is a representation of the dateString elements and their location in the string. Default control is ‘yyyy-mm-dd hh:MM’. recognized controls are either a Lua pattern string or a string containing following codes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        dddd -- full weekdayname(e.g. Wednesday) language depends on locale&lt;br /&gt;
        ddd  -- abbreviated weekdayname(e.g. Wed) language depends on locale&lt;br /&gt;
        dd   -- day of the month {[01-31]&lt;br /&gt;
        mmmm -- full monthname(e.g September) language depends on locale&lt;br /&gt;
        mmm  -- abbreviated monthname(e.g. Sep) language depends on locale&lt;br /&gt;
        mm   -- month [01-12]&lt;br /&gt;
        yyyy -- 4 digit year&lt;br /&gt;
        yy   -- 2 digit year&lt;br /&gt;
        hh   -- hour 24-hour clock&lt;br /&gt;
        ii   -- hour 12-hour clock&lt;br /&gt;
        MM   -- minute&lt;br /&gt;
        ss   -- second&lt;br /&gt;
        W    -- weeknumber [01-53]&lt;br /&gt;
        w    -- weekday{[0-6] Sunday-Saturday&lt;br /&gt;
        datm -- date and time (e.g. 09/16/98 23:48:10) format depends on locale&lt;br /&gt;
        mer  -- either &amp;quot;AM&amp;quot; or &amp;quot;PM&amp;quot; locale&lt;br /&gt;
        date -- date(e.g. 09/16/98) format depends on locale&lt;br /&gt;
        time -- time (e.g. 23:48:10)&lt;br /&gt;
&lt;br /&gt;
        -- examples:&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59&#039;))                                                      -- &amp;gt; 1609455540&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:01&#039;,&#039;yyyy-mm-dd hh:MM:ss&#039;))                             -- &amp;gt; 1609455541&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;December 31, 23:59:02&#039;,&#039;mmmm dd, hh:MM:ss&#039;))                             -- &amp;gt; 1609455542&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:03&#039;,&#039;(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)&#039; ))  -- &amp;gt; 1609455543&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;20201231235904&#039;,&#039;(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)&#039;))             -- &amp;gt; 1609455544&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayAbbrOfWeek&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. sun,mon,tue,wed,thu,fri or sat&lt;br /&gt;
* &#039;&#039;&#039;daysAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. complete name Sunday, Monday, etc&lt;br /&gt;
* &#039;&#039;&#039;dDate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. timestamp (seconds since 01/01/1970 00:00)&lt;br /&gt;
* &#039;&#039;&#039;getISO&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the ISO 8601 formatted date.&lt;br /&gt;
* &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;hoursAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of hours since the last update.&lt;br /&gt;
* &#039;&#039;&#039;isdst&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Indicates if time is in the daylight saving period&lt;br /&gt;
* &#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if time is today&lt;br /&gt;
* &#039;&#039;&#039;isUTC&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;makeTime(string | table,[isUTC])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. isUTC defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;matchesRule(rule) &#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns true if the rule matches with the time. See [[#timer_trigger_rules|time trigger rules]] for rule examples.&lt;br /&gt;
* &#039;&#039;&#039;millisecondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;minutesAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutesSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;monthAbbrName&#039;&#039;&#039;: String. jan, feb, mar, etc&lt;br /&gt;
* &#039;&#039;&#039;monthName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. January, February, etc&lt;br /&gt;
* &#039;&#039;&#039;msAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;raw&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Generated by Domoticz&lt;br /&gt;
* &#039;&#039;&#039;rawDate&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the date part of the raw data.&lt;br /&gt;
* &#039;&#039;&#039;rawDateTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Combined date / time formatted as domoticz does in API / JSON returns (rawDate .. ’ ’.. rawTime )&lt;br /&gt;
* &#039;&#039;&#039;rawTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM:SS&lt;br /&gt;
* &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunset.&lt;br /&gt;
* &#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunrise.&lt;br /&gt;
* &#039;&#039;&#039;solarnoonInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; Minutes from midnight until solarnoon.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM&lt;br /&gt;
* &#039;&#039;&#039;timestampToDate([ [ timestamp ] , [ pattern ] ,[ offSet ] )&#039;&#039;&#039;: &#039;&#039;function&#039;&#039;. Returns a datestring. timestamp is number of seconds since epoch (default = now) , pattern is a string as explained in this wiki at the description of the domoticz.time.dateToTimestamp function (default = ‘yyyy-mm-dd hh:MM:ss’). Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.timestampToDate(10,&#039;date time&#039;)                               --&amp;gt; &#039;01/01/70 01:00:10&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(60,&#039;ddd mm mmm yyyy ii:MM mer&#039;,&#039;date time&#039;)   --&amp;gt; &#039;Thu 01 Jan 1970 01:01 AM&#039;&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(1598077445,&#039;dd/mm/yy ii:MM mer nZero&#039;)        --&amp;gt; &#039;22/08/20 8:24 AM&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;toUTC(string | table,[offset])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. &amp;lt;sup&amp;gt;3.0.9&amp;lt;/sup&amp;gt; returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. offset defaults to 0.&lt;br /&gt;
* &#039;&#039;&#039;utcSystemTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. UTC system time (only when in UTC mode):&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;utcTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Time stamp in UTC time:&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; day of the week. Sunday = 1, Saturday = 7&lt;br /&gt;
* &#039;&#039;&#039;week&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; week of the year&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: it is currently not possible to change the domoticz.time object instance.&#039;&#039;&#039; ( but you can create a new one with- or without an offset)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shared-helper-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Shared helper functions ==&lt;br /&gt;
&lt;br /&gt;
It is not unlikely that at some point you want to share Lua code among your scripts. Normally in Lua you would have to create a module and require that module in all you scripts. But dzVents makes that easier for you: Inside your scripts folder or in Domoticz’ GUI web editor, create a &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; script (same as for global persistent data) and feed it with this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
        end,&lt;br /&gt;
        MY_CONSTANT = 100 -- doesn&#039;t have to be a function&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the file and then you can use myHandyFunction everywhere in your event scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(&#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
        print(domoticz.helpers.MY_CONSTANT)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt; is needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note: if you need to access the domoticz object in your helper function you have to pass it as a parameter:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(domoticz, param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
            domoticz.log(&#039;Hey&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And pass it along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(domoticz, &#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only &#039;&#039;&#039;one&#039;&#039;&#039; &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requiring-your-own-modules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Requiring your own modules ==&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use the helpers support, but you want to require your own modules, place them either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/modules&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/modules&amp;lt;/code&amp;gt; as these folders are already added to the Lua package path. You can just require those modules: &amp;lt;code&amp;gt;local myModule = require(&#039;myModule&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;persistent-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Persistent data =&lt;br /&gt;
&lt;br /&gt;
In many situations you need to store a device state or other information in your scripts for later use. Like knowing what the state was of a device the previous time the script was executed or what the temperature in a room was 10 minutes ago. Without dzVents, you had to resort to user variables. These are global variables that you create in the Domoticz GUI and that you can access in your scripts like: domoticz.variables(‘previousTemperature’).&lt;br /&gt;
&lt;br /&gt;
Now, for some this is rather inconvenient and they want to control this state information in the event scripts themselves or want to use all of Lua’s variable types. dzVents has a solution for that: &#039;&#039;&#039;persistent script data&#039;&#039;&#039;. This can either be on the script level or on a global level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-level-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Script level persistent variables ==&lt;br /&gt;
&lt;br /&gt;
The values in persistent script variables persist and can be retrieved in the next script run.&lt;br /&gt;
&lt;br /&gt;
For example, send a notification if a switch has been activated 5 times:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = { &#039;MySwitch&#039; }&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            counter = { initial = 0 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (domoticz.data.counter == 5) then&lt;br /&gt;
            domoticz.notify(&#039;The switch was pressed 5 times!&#039;)&lt;br /&gt;
            domoticz.data.counter = 0 -- reset the counter&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.data.counter = domoticz.data.counter + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; section defines a persistent variable called &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;. It also defines an initial value. From then on you can read and set the variable in your script.&lt;br /&gt;
&lt;br /&gt;
You do not have to provide an initial value though. In that case the initial value is &#039;&#039;nil&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        --&lt;br /&gt;
        data = {&lt;br /&gt;
            &#039;x&#039;, &#039;y&#039;, &#039;z&#039; -- note the quotes&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, item)&lt;br /&gt;
            print(tostring(domoticz.data.x)) -- prints nil&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can define as many variables as you like and put whatever value in there that you like. It doesn’t have to be just a number. Just don’t put something in there with functions (well, they are filtered out actually).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-matters-and-watch-your-speed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size matters and watch your speed!! ===&lt;br /&gt;
&lt;br /&gt;
If you include tables (or arrays) in the persistent data, beware to not let them grow. It will definitely slow down script execution because dzVents has to serialize and deserialize the data. It is better to use the historical option as described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;re-initializing-a-variable&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Re-initializing a variable ===&lt;br /&gt;
&lt;br /&gt;
You can re-initialize a persistent variable and re-apply the initial value as defined in the data section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { .. },&lt;br /&gt;
    data = {&lt;br /&gt;
        x = { initial = &#039;initial value&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (domoticz.data.x ~= &#039;initial value&#039;) then&lt;br /&gt;
            domoticz.data.initialize(&#039;x&#039;)&lt;br /&gt;
            print(domoticz.data.x) -- will print &#039;initial value&#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; is just a convenience method. You can of course create a local variable in your module holding the initial value and use it in your data section and your execute function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;global-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Global persistent variables ==&lt;br /&gt;
&lt;br /&gt;
Script level variables are only available in the scripts that define them, but global variables can be accessed and changed in every script. To utilize global persistent variables, create a script file called &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; in your scripts folder with this content (same file where you can also put your shared helper functions):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        helpers = {},&lt;br /&gt;
        data = {&lt;br /&gt;
            peopleAtHome = { initial = false },&lt;br /&gt;
            heatingProgramActive = { initial = false }&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just define the variables that you need and access them in your scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;WindowSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, windowSensor)&lt;br /&gt;
            if (domoticz.globalData.heatingProgramActive&lt;br /&gt;
                and windowSensor.state == &#039;Open&#039;) then&lt;br /&gt;
                domoticz.notify(&amp;quot;Hey don&#039;t open the window when the heating is on!&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only one &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;domoticz.globalData.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; just as like &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a-special-kind-of-persistent-variables-history-true-historical-variables-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== A special kind of persistent variables: &#039;&#039;history = true&#039;&#039; (Historical variables API) ==&lt;br /&gt;
&lt;br /&gt;
In some situations, storing a previous value for a sensor is not enough, and you would like to have more previous values. For example, you want to calculate an average over several readings. Of course you can define a persistent variable holding a table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            previousData = { initial = {} }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            table.insert(domoticz.data.previousData, sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- calculate the average&lt;br /&gt;
            local sum = 0, count = 0&lt;br /&gt;
            for i, temp in pairs(domoticz.data.previousData) do&lt;br /&gt;
                sum = sum + temp&lt;br /&gt;
                count = count + 1&lt;br /&gt;
            end&lt;br /&gt;
            local average = sum / count&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The problem with this is that you have to do a lot of bookkeeping to make sure that there isn’t too much data to store (see [[#How_does_the_storage_stuff_work.3F|below for how it works]]) . Fortunately, dzVents has done this for you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            temperatures = { history = true, maxItems = 10 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            domoticz.data.temperatures.add(sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- average&lt;br /&gt;
            local average = domoticz.data.temperatures.avg()&lt;br /&gt;
&lt;br /&gt;
            -- maximum value in the past hour:&lt;br /&gt;
            local max = domoticz.data.temperatures.maxSince(&#039;01:00:00&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;defining&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Defining ===&lt;br /&gt;
&lt;br /&gt;
Define a script variable or global variable in the data section and set &amp;lt;code&amp;gt;history = true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    …&lt;br /&gt;
    data = {&lt;br /&gt;
        var1 = { history = true, maxItems = 10, maxHours = 1, maxMinutes = 5 }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;maxItems&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Controls how many items are stored in the variable. maxItems has precedence over maxHours and maxMinutes.&lt;br /&gt;
* &#039;&#039;&#039;maxHours&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Data older than &amp;lt;code&amp;gt;maxHours&amp;lt;/code&amp;gt; from now will be discarded. E.g., if set to 2, then data older than 2 hours will be removed at the beginning of the script.&lt;br /&gt;
* &#039;&#039;&#039;maxMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as maxHours but, you guessed it: for minutes this time.. All these options can be combined. &#039;&#039;&#039;Reminder: don’t store too much data. Only put in what you really need!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adding-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Adding data ===&lt;br /&gt;
&lt;br /&gt;
Add new values to a historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz.data.myVar.add(value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As soon as this new value is put on top of the list, the older values shift one place down the line. If &amp;lt;code&amp;gt;maxItems&amp;lt;/code&amp;gt; is reached, then the oldest value will be discarded. &#039;&#039;All methods, like calculating averages or sums, will immediately use this new value!&#039;&#039; If you don’t want this to happen, set the new value at the end of your script or after you have done your analysis.&lt;br /&gt;
&lt;br /&gt;
Any kind of data may be stored in the historical variable: numbers, strings, but also more complex data like tables. However, in order to use the [[#Statistical_functions|statistical methods]], numeric values are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;accessing-values-in-historical-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Accessing values in historical variables ===&lt;br /&gt;
&lt;br /&gt;
Values in a historical variable are indexed, where index 1 is the newest value, 2 is the second newest, and so on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.get(5)&lt;br /&gt;
print(item.data)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, all data in the storage are time-stamped:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.getLatest()&lt;br /&gt;
print(item.time.secondsAgo) -- access the time stamp&lt;br /&gt;
print(item.data) -- access the data&amp;lt;/pre&amp;gt;&lt;br /&gt;
The time attribute by itself is a table with many properties that help you inspect the data points more easily. See [[#Time_object|Time Object]] for all attributes and methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Index ====&lt;br /&gt;
&lt;br /&gt;
All data in the set can be addressed using an index. The item with index = 1 is the youngest, and the item with the highest index is the oldest. Beware, if you have called &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; first, then the first item is that new value! You can always check the size of the set by inspecting &amp;lt;code&amp;gt;myVar.size&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-specification-timeago&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Time specification (&#039;&#039;timeAgo&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
Every data point in the set has a timestamp and the set is ordered so that the youngest item is the first and the oldest item the last. Many functions require a moment in the past to be specified by passing a string in the format &#039;&#039;&#039;&amp;lt;code&amp;gt;hh:mm:ss&amp;lt;/code&amp;gt;&#039;&#039;&#039;, where &#039;&#039;hh&#039;&#039; is the number of hours ago, &#039;&#039;mm&#039;&#039; the number of minutes and &#039;&#039;ss&#039;&#039; the number of seconds. The times are added together, so you don’t have to consider 60 minute boundaries, etc. A time specification of &amp;lt;code&amp;gt;12:88:03&amp;lt;/code&amp;gt; is valid, and points to the data point at or around &amp;lt;code&amp;gt;12*3600 + 88*60 + 3 = 48.483 seconds&amp;lt;/code&amp;gt; in the past.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- get average for the past 30 minutes:&lt;br /&gt;
local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-data-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Getting data points ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get(idx)&#039;&#039;&#039;: Returns the idx-th item in the set. Same as &amp;lt;code&amp;gt;myVar.storage[idx]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getAtTime([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Returns the data point &#039;&#039;closest&#039;&#039; to the moment as specified by &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; and the index in the set. So, &amp;lt;code&amp;gt;myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt; returns the item that is closest to one hour old. It may be a bit younger or a bit older than 1 hour. The second return value is the index in the set: &amp;lt;code&amp;gt;local item, index = myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;getLatest( )&#039;&#039;&#039;: Returns the youngest item in the set. Same as &amp;lt;code&amp;gt;print(myVar.get(1).data)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getOldest( )&#039;&#039;&#039;: Returns the oldest item in the set and the index. Same as &amp;lt;code&amp;gt;print(myVar.get(myVar.size).data)&amp;lt;/code&amp;gt;. Note that the index is always the same as the total size. &amp;lt;code&amp;gt;local item, index = myVar.getOldest()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;: Return the number of data points in the set.&lt;br /&gt;
* &#039;&#039;&#039;subset( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns a subset of the stored data. Default value, if omitted, of &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; is 1. Omitting &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt; takes all items until the end of the set (oldest). E.g., &amp;lt;code&amp;gt;myVar.subset()&amp;lt;/code&amp;gt; returns all data. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;subsetSince( [[#Time_specification_.28timeAgo.29|timeAgo]] )&#039;&#039;&#039;: Returns a subset of the stored data since the relative time specified by timeAgo. So calling &amp;lt;code&amp;gt;myVar.subsetSince(&#039;00:60:00&#039;)&amp;lt;/code&amp;gt; returns all items that have been added to the list in the past 60 minutes. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reset( )&#039;&#039;&#039;: Removes all the items from the set. It could be a good practice to do this often when you know you don’t need older data. For instance, when you turn on a heater and you just want to monitor rising temperatures starting from this moment when the heater is activated. If you don’t need data points from before, then you may call reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-data-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Looping through the data: iterators ====&lt;br /&gt;
&lt;br /&gt;
Similar to the iterators as described [[#Looping_through_the_collections:_iterators|above]], there are convenience methods to make looping through the data set easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Loop over all items in the set: E.g.: &amp;lt;code&amp;gt;myVar.forEach( function( item, index, collection) ... end )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;filter(function)&#039;&#039;&#039;: Create a filtered set of items. The function receives the item and returns true if the item is in the result set. E.g. get a set with item values larger than 20: &amp;lt;code&amp;gt;subset = myVar.filter( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Search for a specific item in the set: E.g. find the first item with a value higher than 20: &amp;lt;code&amp;gt;local item = myVar.find( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the set and do some calculation with it. You call reduce with the function and the initial value. Each iteration the function is called with the accumulator. The function does something with the accumulator and returns a new value for it. Once you get the hang of it, it is very powerful. Best to give an example. To sum all values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        local sum = myVar.reduce(function(acc, item)&lt;br /&gt;
            local value = item.data&lt;br /&gt;
        return acc + value&lt;br /&gt;
        end, 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Suppose you want to get data points older than 45 minutes and count the values that are higher than 20 (of course there are more ways to do this):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myVar = domoticz.data.myVar&lt;br /&gt;
&lt;br /&gt;
    local olderItems = myVar.filter(function (item)&lt;br /&gt;
        return (item.time.minutesAgo &amp;gt; 45)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    local count = olderItems.reduce(function(acc, item)&lt;br /&gt;
        if (item.data &amp;gt; 20) then&lt;br /&gt;
            acc = acc + 1&lt;br /&gt;
        end&lt;br /&gt;
        return acc&lt;br /&gt;
    end, 0)&lt;br /&gt;
&lt;br /&gt;
    print(&#039;Found &#039; .. tostring(count) .. &#039; items&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;statistical-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Statistical functions ====&lt;br /&gt;
&lt;br /&gt;
Statistical functions require &#039;&#039;numerical&#039;&#039; data in the set. If the set is just numbers you can do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add(myDevice.temperature) -- adds a number to the set&lt;br /&gt;
myVar.avg() -- returns the average&amp;lt;/pre&amp;gt;&lt;br /&gt;
If, however, you add more complex data or you want to do a computation first, then you have to &#039;&#039;tell dzVents how to get a numeric value from these data&#039;&#039;. So let’s say you do this to add data to the set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add( { &#039;person&#039; = &#039;John&#039;, waterUsage = u })&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; is a variable that got its value earlier. If you want to calculate the average water usage, then dzVents will not be able to do this because it doesn’t know the value is actually in the &amp;lt;code&amp;gt;waterUsage&amp;lt;/code&amp;gt; attribute! You will get &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To make this work you have to provide a &#039;&#039;&#039;getValue function&#039;&#039;&#039; in the data section when you define the historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {...},&lt;br /&gt;
        data = {&lt;br /&gt;
        myVar = {&lt;br /&gt;
            history = true,&lt;br /&gt;
            maxItems = 10,&lt;br /&gt;
            getValue = function(item)&lt;br /&gt;
                return item.data.waterUsage -- return number!!&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function()...end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This function tells dzVents how to get the numeric value for a data item. &#039;&#039;&#039;Note: the &amp;lt;code&amp;gt;getValue&amp;lt;/code&amp;gt; function has to return a number!&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you don’t intend to use any of these statistical functions you can put whatever you want in the set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avg( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the average of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avgSince([[#Time_specification_.28timeAgo.29|timeAgo]], default )&#039;&#039;&#039;: Calculates the average of all data points since &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt;. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there are no data, otherwise 0. E.g.: &amp;lt;code&amp;gt;local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/code&amp;gt; returns the average over the past 30 minutes.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;med( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the median of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;min( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the lowest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;minSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;min&#039;&#039;&#039; but now within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;max( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the highest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;maxSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;max&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sum( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the summation of all values in the range defined by fromIdx and toIdx. It will return 0 when there are no data.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sumSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;sum&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. It will return 0 when there are no data in the interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;** delta(fromIdx, toIdx, [smoothRange], [default] )**: Returns the delta (difference) between items specified by &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. Provide a valid range (no &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values). [Supports data smoothing]. (#Data_smoothing) when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there is not enough data. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta(2, 5, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;delta2( fromIdx, toIdx, [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but now you can control if the smooth values for the &#039;&#039;from-item&#039;&#039; and the &#039;&#039;to-item&#039;&#039; separately. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta2(2, 5, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSince([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRange], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSince(&#039;00:00:10&#039;, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSinceOrOldest([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;deltaSince&#039;&#039;&#039; but it will take the oldest value in the set if &#039;&#039;timeAgo&#039;&#039; is older than the age of the entire set. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSinceOrOldest(&#039;00:00:10&#039;, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;: Returns the first minimum value (and the item holding the minimal value) in the past. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. For example, given this range of values in the data set (from new to old): &amp;lt;code&amp;gt;10 8 7 5 3 4 5 6&amp;lt;/code&amp;gt;, it will return &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; because older values &#039;&#039;and&#039;&#039; newer values are higher: a local minimum. Use this if you want to know at what time a temperature started to rise after it had been dropping. E.g.:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; local value, item = myVar.localMin()&lt;br /&gt;
 print(&#039; minimum was : &#039; .. value .. &#039;: &#039; .. item.time.secondsAgo .. &#039; seconds ago&#039; )&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMax([smoothRange], default)&#039;&#039;&#039;: Same as &#039;&#039;&#039;localMin&#039;&#039;&#039; but for the maximum value. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;smoothItem(itemIdx, [smoothRange])&#039;&#039;&#039;: Returns a the value of &amp;lt;code&amp;gt;itemIdx&amp;lt;/code&amp;gt; in the set but smoothed by averaging with its neighbors. The number of neighbors is set by &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt;. See [[#Data_smoothing|Data smoothing]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-smoothing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Data smoothing ====&lt;br /&gt;
&lt;br /&gt;
Example: Suppose you store temperatures in the historical variable. These temperatures may have extremes. Perhaps these extremes could be due to sensor reading errors. In order to reduce the effect of these so-called spikes, you could smooth out values. It is like blurring the data. The Raw column is your temperatures. The other columns are calculated by averaging the neighbors. For item 10 the calculations are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Range=1 for time10 = (25 + 31 + 29) / 3 = 28,3&lt;br /&gt;
Range=2 for time10 = (16 + 25 + 31 + 29 + 26) / 5 = 25,4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; align=&amp;quot;center&amp;quot; width=&amp;quot;30% height:10px;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| time&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| raw&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=1&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
| 18&lt;br /&gt;
| 20,0&lt;br /&gt;
| 21,7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 21,7&lt;br /&gt;
| 25,0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 27,3&lt;br /&gt;
| 24,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 27,7&lt;br /&gt;
| 26,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
| 23&lt;br /&gt;
| 28,7&lt;br /&gt;
| 27,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,0&lt;br /&gt;
| 25,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
| 27&lt;br /&gt;
| 23,7&lt;br /&gt;
| 23,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
| 16&lt;br /&gt;
| 22,7&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 24,0&lt;br /&gt;
| 25,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 28,3&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
| 29&lt;br /&gt;
| 28,7&lt;br /&gt;
| 29,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
| 26&lt;br /&gt;
| 30,0&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;13&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 32,0&lt;br /&gt;
| 30,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;16&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 29,7&lt;br /&gt;
| 28,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;17&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,7&lt;br /&gt;
| 28,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 27,3&lt;br /&gt;
| 26,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;19&#039;&#039;&#039;&lt;br /&gt;
| 32&lt;br /&gt;
| 24,3&lt;br /&gt;
| 25,3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;20&#039;&#039;&#039;&lt;br /&gt;
| 19&lt;br /&gt;
| 25,5&lt;br /&gt;
| 24,3&lt;br /&gt;
|}&lt;br /&gt;
A chart illustrates it more clearly. The red line is not smoothed and has more spikes than the others:&lt;br /&gt;
&lt;br /&gt;
[[File:dzvents-smoothing.png|frame|none|alt=|Smoothing]]&lt;br /&gt;
&lt;br /&gt;
Usually a range of 1 or 2 is sufficient when providing a smoothing range to statistical functions. I suggest smoothing when checking deltas, local minimums and maximums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-does-the-storage-stuff-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How does the storage stuff work? ==&lt;br /&gt;
&lt;br /&gt;
For every script file that defines persisted variables (using the &amp;lt;code&amp;gt;data={ … }&amp;lt;/code&amp;gt; section), dzVents will create storage file with the name &amp;lt;code&amp;gt;__data_scriptname.lua&amp;lt;/code&amp;gt; in a subfolder called &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. You can always delete these data files or the entire storage folder if there is a problem with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz/&lt;br /&gt;
    scripts/&lt;br /&gt;
        dzVents/&lt;br /&gt;
            data/&lt;br /&gt;
                __data_yourscript1.lua&lt;br /&gt;
                __data_yourscript2.lua&lt;br /&gt;
                __data_global_data.lua&lt;br /&gt;
            examples/&lt;br /&gt;
            generated_scripts/&lt;br /&gt;
            scripts/&lt;br /&gt;
                yourscript1.lua&lt;br /&gt;
                yourscript2.lua&lt;br /&gt;
                global_data.lua&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you dare to, you can watch inside these files. Every time some data are changed, dzVents will stream the changes back into the data files. &#039;&#039;&#039;Again, make sure you don’t put too much stuff in your persistent data as it may slow things down too much.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-requests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous HTTP requests =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous HTTP request and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use os functions like &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz will terminate the script with a message that it took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to make an http call and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;openURL&amp;lt;/code&amp;gt; on the domoticz object with only the url as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL(&#039;http://domain/path/to/something?withparameters=1&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will make the request that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a url you pass in a table with all the parameters to make the request &#039;&#039;&#039;and&#039;&#039;&#039; your provide a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
    domoticz.openURL({&lt;br /&gt;
        url = &#039;http://domain/path/to/something&#039;,&lt;br /&gt;
        method = &#039;POST&#039;,&lt;br /&gt;
        callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
        postData = {&lt;br /&gt;
            paramA = &#039;something&#039;,&lt;br /&gt;
            paramB = &#039;something else&#039;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will make the request (a POST in this case), and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    httpResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
    if (response.ok) then -- success&lt;br /&gt;
        if (response.isJSON) then&lt;br /&gt;
            domoticz.log(response.json.some.value)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    timer = {&#039;every 5 seconds&#039;},&lt;br /&gt;
    httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
    if (item.isTimer) then&lt;br /&gt;
        domoticz.openURL({&lt;br /&gt;
            url = &#039;...&#039;,&lt;br /&gt;
            callback = &#039;trigger&#039;&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    if (item.isHTTPResponse) then&lt;br /&gt;
        if (item.ok) then&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.openURL(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;url&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. Either &amp;lt;code&amp;gt;&#039;GET&#039;&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;&#039;POST&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;PUT&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;&#039;DELETE&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; .&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to trigger the callback handler script(s).&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. A Lua table or JSON string with additional http request-headers.&lt;br /&gt;
* &#039;&#039;&#039;postData&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. When doing a &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; this data will be the payload of the request (body). If you provide a Lua table then this will automatically be converted to json and the request-header &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; is set. So no need to do that manually. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw response data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Response headers.&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;application/json&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;text/xml&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be in range of 200-299.&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. HTTP status codes. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;statusText&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP status message. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;protocol&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP protocol. See [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;more-about-request-and-response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== More about request and response headers ===&lt;br /&gt;
&lt;br /&gt;
Whenever you do an http request it is not just some data that is sent. Along with the request a bunch of so-called headers are sent along with it. HTTP headers allow the client and the server to pass additional information with the request or the response. Also, in the response there are also headers (response header). These response headers usually tell you what kind of data is returned, if it is compressed, if the request was successful etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;request-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== request headers ====&lt;br /&gt;
&lt;br /&gt;
dzVents allow you to set custom request headers that will accompany the data in the request. Sometimes it is necessary to set these headers like for instance when a API or webservice require a security token or key or when the service needs to know what the format of the response data is. Check the documentation of the web service.&lt;br /&gt;
&lt;br /&gt;
So, let’s say you need to call a web service that requires an api key in the headers and the documentation states it needs to be passed in an x-access-token header. Your openURL command then may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL({&lt;br /&gt;
    url = &#039;https://somedomain.com/service/getInfo&#039;,&lt;br /&gt;
    headers = { [&#039;x-access-token&#039;] = &#039;&amp;lt;api-key&amp;gt;&#039; },&lt;br /&gt;
    method = &#039;GET&#039;,&lt;br /&gt;
    callback = &#039;info&#039;&lt;br /&gt;
})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Check google for more information about request headers. All you need to know here is that dzVents allow you to set these headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== response headers ====&lt;br /&gt;
&lt;br /&gt;
As said earlier, the response also contains a bunch of headers. You can inspect those headers with dzVents but ususally you don’t have to. For starters, dzVents already checks the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header which usually states what kind of data format the response is. If it is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then it automatically converts the json data to a Lua table. Also, it checks the &amp;lt;code&amp;gt;Status&amp;lt;/code&amp;gt; header to see if the request was successful. If so, then it sets the &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; attribute on the response object. So normally you don’t have to inspect the headers. However, sometimes the web service puts a session token in the response header that you have to use in follow-up requests.&lt;br /&gt;
&lt;br /&gt;
So here an example where we have to log in before we can fetch data. It uses two requests: the first performs the log-in and the second grabs the session token from the login response data and uses that token in the second request to get the data we need. In this example we do this every hour.&lt;br /&gt;
&lt;br /&gt;
That would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;loggedin&#039;, &#039;data&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/login&#039;,&lt;br /&gt;
                method = &#039;POST&#039;,&lt;br /&gt;
                postData = { [&#039;username&#039;] = &#039;Luke Skywalker&#039;, [&#039;password&#039;] = &#039;theforce&#039; }&lt;br /&gt;
                callback = &#039;loggedin&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- check to which request this response was the result&lt;br /&gt;
            if (item.trigger == &#039;loggedin&#039;) then&lt;br /&gt;
                -- we are logged in, now grab the session token from the header and&lt;br /&gt;
                -- fetch our data&lt;br /&gt;
                local token = item.headers[&#039;x-session-token&#039;]&lt;br /&gt;
                -- now we have the token, put it in the headers:&lt;br /&gt;
                domoticz.openURL({&lt;br /&gt;
                    url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                    method = &#039;GET&#039;,&lt;br /&gt;
                    headers = { [&#039;x-session-token&#039;] = token },&lt;br /&gt;
                    callback = &#039;data&#039;&lt;br /&gt;
                })&lt;br /&gt;
            else&lt;br /&gt;
                -- it must the data we requested&lt;br /&gt;
                local data = item.data&lt;br /&gt;
                -- do something with it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Some remarks about the response header &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;. If a service is a good web-citizen then it tells you what the format of the data is in this header. So, if the data is a json object then the header should be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;. Unfortunately, there are lot of lazy programmers out there who don’t set this header properly. If that is the case, dzVents cannot detect the format and will not turn it into a Lua table for you automatically. So, if you know it is json but the header is not properly set, then you can easily convert it into a Lua table in your code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                callback = &#039;trigger&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- we know it is json but dzVents cannot detect this&lt;br /&gt;
            -- convert to Lua&lt;br /&gt;
            local json = domoticz.utils.fromJSON(item.data)&lt;br /&gt;
            -- json is now a Lua table&lt;br /&gt;
            print(json.result.title) -- just an example&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous shell command execution =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use functions like &amp;lt;code&amp;gt;utils.osCommand()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;os.Execute()&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to execute a shell command asynchronously and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;executeShellCommand&amp;lt;/code&amp;gt; on the domoticz object with only the command as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.executeShellCommand(&#039;some shell command&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will execute the request in a separate thread and that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a command you pass in a table with the command to be executed &#039;&#039;&#039;and&#039;&#039;&#039; a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;some shell command&#039;,&lt;br /&gt;
            callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
            timeout = timeoutinseconds,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        shellCommandResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
        if response.ok then&lt;br /&gt;
            if (response.isJSON) then&lt;br /&gt;
                domoticz.log(response.json.some.value)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every 5 minutes&#039;,&lt;br /&gt;
        },&lt;br /&gt;
        shellCommandResponses =&lt;br /&gt;
        {&lt;br /&gt;
            scriptVar,&lt;br /&gt;
        },&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.executeShellCommand(&lt;br /&gt;
            {&lt;br /&gt;
                command = &#039;some shell command&#039;,&lt;br /&gt;
                callback = scriptVar,&lt;br /&gt;
                timeout = timeoutinseconds,&lt;br /&gt;
            })&lt;br /&gt;
        elseif item.isShellCommandResponse then&lt;br /&gt;
            if item.statusCode == 0 then&lt;br /&gt;
                ... -- process result (in item.json, -item.xml, -item.lines or item.data)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.executeShellCommand(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;command&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to find a the callback handler script.&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: &#039;&#039;Integer&#039;&#039;. Optional. Max execution time in seconds. defaults to 10 seconds. A value of 0 disables the timeout.&lt;br /&gt;
&lt;br /&gt;
Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: output from the command. (stdout)&lt;br /&gt;
* &#039;&#039;&#039;errorText&#039;&#039;&#039;: Errors generated by the command (stderr)&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Int&#039;&#039;. exitcode generated by the command&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be 0.&lt;br /&gt;
* &#039;&#039;&#039;timeoutOccurred&#039;&#039;&#039; &#039;&#039;Boolean&#039;&#039; &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was aborted by a timeout.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;settings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Settings =&lt;br /&gt;
&lt;br /&gt;
Settings for dzVents are found in the Domoticz GUI: &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039;: Tick this if you don’t want any dzVents script to be executed.&lt;br /&gt;
* &#039;&#039;&#039;Log level&#039;&#039;&#039;: (Note that you can override this setting in the logging section of your script)&lt;br /&gt;
** &#039;&#039;Errors&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info&#039;&#039;: Errors and some minimal information about which script is being executed and why,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info + generic info&#039;&#039;. Even more information about script execution and a bit more log formatting.&lt;br /&gt;
** &#039;&#039;Debug&#039;&#039;. Shows everything and dzVents will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in the scripts/dzVents folder. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.&lt;br /&gt;
** &#039;&#039;No logging&#039;&#039;. As silent as possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
So, you think if you have done everything correctly but things do not work (in some way) as you expected. Here are a couple steps you can do to find the cause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-dzvents-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is dzVents enabled? ===&lt;br /&gt;
&lt;br /&gt;
Check the settings (see above) and make sure the checkbox &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039; is not checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-your-script-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is your script enabled? ===&lt;br /&gt;
&lt;br /&gt;
Make sure the active section in your script is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;active = true&amp;lt;/code&amp;gt;. And, on top of that, if you are using the internal web editor to write your script, make sure that your script is active there and you have clicked Save! “Event active” is a separate checkbox that must be ticked for every active script. When not active, the script name will be red in the list on the right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;do-you-have-at-least-one-active-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Do you have at least one active script? ===&lt;br /&gt;
&lt;br /&gt;
dzVents only starts its Lua engine when there is at least one active dzVents script, either created in the internal web editor or placed as a &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; file in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. With no active script at all, Domoticz skips dzVents completely: nothing is logged whatever the log level is, &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; are not created, and the code in the device adapters never runs. Adding a minimal script is enough to activate the engine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;turn-on-debug-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Turn on debug logging ===&lt;br /&gt;
&lt;br /&gt;
Activate debug logging in the settings (see above). This will produce a lot of extra messages in the Domoticz log (don’t forget to turn it off when you are done troubleshooting!). It is best to monitor the log through the command line, as the log in the browser sometimes tends to not always show all log messages. See the Domoticz manual for how to do that.&lt;br /&gt;
&lt;br /&gt;
When debug logging is enabled, every time dzVents kicks into action (Domoticz throws an event) it will log it, and it will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz. This data lie at the core of the dzVents object model. You can open this file in an editor to see if your device/variable/scene/group/hardware is in there. Note that the data in the file are not exactly the same as what you will get when you interact with dzVents, but it is a good start. If your object is not in the data file, then you will not have access to it in dzVents and dzVents will not be able to match triggers with that object. Something’s wrong if you expect your object to be in there but it is not (is the object active/used?). &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.with a dump of the data sent to dzVents.&lt;br /&gt;
&lt;br /&gt;
Example content of &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    Startdate time  - End date time  (clk - CPU )                 dule / scriptname &amp;amp;lt;&amp;amp;lt; type: &amp;amp;quot;trigger&amp;amp;quot;&lt;br /&gt;
    ---------------------------------------------------------------------------------------------------------------&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0029)                     waqi.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 20 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0016)                   Washer.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 5 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:01 - 11/27/20 18:40:01 (00 - 0.0215)   getWaterFromHomewizard.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WaterfromHomewizard&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.2472)     updateWeatherSensors.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WUS_buienradarResponse&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.0290)                     waqi.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;waqi_nearby&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:41:00 - 11/27/20 18:41:00 (00 - 0.0583)        Bathroom humidity.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every minute between 05:15 and 23:30&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every time Domoticz starts dzVents and debug logging is enabled you should see these lines in the domoticz log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dzVents version: x.y.z&lt;br /&gt;
Event trigger type: aaaa&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where aaaa can be time, custom event, system event, device, uservariable, security or scenegroup. That should give you a clue what kind of event is active. If you don’t see this information then dzVents is not active (or debug logging is not active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-is-still-not-executed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script is still not executed ===&lt;br /&gt;
&lt;br /&gt;
If for some reason your script is not executed while all of the above is done, it is possible that your triggers are not correct. Either the time rule is not matching with the current time (try to set the rule to &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or something simple), or the device name is not correct (check casing), or you use an id that doesn’t exist. Note that in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section, you cannot use the dzVents domoticz object!&lt;br /&gt;
&lt;br /&gt;
Make sure that if you use an id in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section that this id is correct. Go to the device list in Domoticz and find the device and make sure the device is in the ‘used’ list!. Unused devices will not create an event. Find the idx for the device and use that as the id.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that your device names are unique! dzVents will throw a warning in the log if multiple device names match. It’s best practice to have unique names for your devices. Use some clever naming like prefixing like ‘Temperature: living room’ or ‘Lights: living room’. That also makes using wild cards on your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section easier.&lt;br /&gt;
&lt;br /&gt;
If your script is still not triggered, you can try to create a classic Lua event script and see if that does work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging-your-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugging your script ===&lt;br /&gt;
&lt;br /&gt;
A simple way to inspect a device in your script is to dump it to the log: &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt;. This will dump everything known to dzVents of the device so you can inspect what its state is. If you only need to see a subset you can use dumpSelection(‘attributes’), dumpSelection(‘functions’) or dumpSelection(‘tables’) Use print statements or domoticz.log() statements in your script at cricital locations to see if the Lua interpreter reaches that line. Don’t try to print a device object though; use the &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; method for that. It wil log all attributes of the device in the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
If you place a print statement all the way at the top of your script file it will be printed every time dzVents loads your script (that is done at the beginning of each event cycle). Sometimes that is handy to see if your script gets loaded in the first place. If you don’t see your print statement in the log, then likely dzVents didn’t load it and it will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;get-help&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Get help ===&lt;br /&gt;
&lt;br /&gt;
The Domoticz forum is a great resource for help and solutions. Check the [https://www.domoticz.com/forum/viewforum.php?f=59 dzVents forum].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;other-interesting-stuff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Other interesting stuff =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lodash-for-lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== lodash for Lua ==&lt;br /&gt;
&lt;br /&gt;
lodash is a well known and very popular Javascript library filled with dozens of handy helper functions that really make you life a lot easier. Fortunately there is also a Lua version. This is directly available through the domoticz object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _ = domoticz.utils._&lt;br /&gt;
_.print(_.indexOf({2, 3, &#039;x&#039;, 4}, &#039;x&#039;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--- (Removed because link is dead. Hopefully only temporarily) Check out the great documentation [here](http://axmat.github.io/lodash.lua/). ---&amp;gt;&lt;br /&gt;
Check out the documentation [https://htmlpreview.github.io/?https://github.com/rwaaren/lodash.lua/blob/master/doc/index.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;history-link-to-changes-in-previous-versions.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= History [https://wiki.domoticz.com/DzVents_version_History link to changes in previous versions]. =&lt;br /&gt;
&lt;br /&gt;
See link for the complete list of changes&lt;br /&gt;
&lt;br /&gt;
https://wiki.domoticz.com/DzVents_version_History&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19250</id>
		<title>DzVents: next generation Lua scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19250"/>
		<updated>2026-08-02T17:07:02Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Thermostat 6 3.1.11 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: This document is maintained on [https://github.com/domoticz/domoticz/blob/development/dzVents/documentation/README.md github], and the wiki version is automatically generated. Edits should be performed on github, or they may be suggested on the wiki article’s [https://wiki.domoticz.com/Talk:DzVents:_next_generation_Lua_scripting Discussion page]. Editing can be done by any editor but if you are looking for a specialized markDown editor; [https://stackedit.io/app# stackedit.io] would be a good choice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;about-dzvents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About dzVents =&lt;br /&gt;
&lt;br /&gt;
dzVents /diː ziː vɛnts/, short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts. And … &#039;&#039;&#039;it is 100% Lua&#039;&#039;&#039;! So if you already have a bunch of event scripts for Domoticz, upgrading should be fairly easy.&lt;br /&gt;
&lt;br /&gt;
Let’s start with an example. Say you have a switch that when activated, it should activate another switch but only if the room temperature is above a certain level. And when done, it should send a notification. This is how it looks in dzVents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;Room switch&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, roomSwitch)&lt;br /&gt;
        if (roomSwitch.active and domoticz.devices(&#039;Living room&#039;).temperature &amp;gt; 18) then&lt;br /&gt;
        domoticz.devices(&#039;Another switch&#039;).switchOn()&lt;br /&gt;
        domoticz.notify(&#039;This rocks!&#039;,&lt;br /&gt;
                        &#039;Turns out that it is getting warm here&#039;,&lt;br /&gt;
                        domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you have a timer script that should be executed every 10 minutes, but only on weekdays, and have it do something with some user variables and only during daytime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
            --activate my scene&lt;br /&gt;
            domoticz.scenes(&#039;Evening lights&#039;).switchOn()&lt;br /&gt;
            if (domoticz.devices(&#039;My PIR&#039;).lastUpdate.minutesAgo &amp;gt; 5) then&lt;br /&gt;
                domoticz.devices(&#039;Bathroom lights&#039;).switchOff()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you want to detect a humidity rise within the past 5 minutes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;every 5 minutes&#039;}&lt;br /&gt;
    },&lt;br /&gt;
    data =&lt;br /&gt;
    {&lt;br /&gt;
        previousHumidity = { initial = 100 }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        local bathroomSensor = domoticz.devices(&#039;BathroomSensor&#039;)&lt;br /&gt;
        if (bathroomSensor.humidity - domoticz.data.previousHumidity) &amp;gt;= 5 then&lt;br /&gt;
            -- there was a significant rise&lt;br /&gt;
            domoticz.devices(&#039;Ventilator&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
        -- store current value for next cycle&lt;br /&gt;
        domoticz.data.previousHumidity = bathroomSensor.humidity&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just to give you an idea! Everything in your Domoticz system is now logically available in the domoticz object structure. With this domoticz object, you can get to all the information in your system and manipulate your devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;using-dzvents-with-domoticz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Using dzVents with Domoticz =&lt;br /&gt;
&lt;br /&gt;
In Domoticz go to &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other&#039;&#039;&#039; and in the section EventSystem make sure the check-box ‘dzVents disabled’ is not checked. Also make sure that in the Security section in the settings &#039;&#039;&#039;(Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Local Networks (no username/password)&#039;&#039;&#039; you allow 127.0.0.1 (and / or ::1 when using IPv6 ) to not need a password. dzVents does use this port to get the location settings and to send certain commands to Domoticz. Finally make sure you have set your current location in &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Location&#039;&#039;&#039;, otherwise there is no way to determine nighttime/daytime state.&lt;br /&gt;
&lt;br /&gt;
There are two ways of creating dzVents event scripts in Domoticz:&lt;br /&gt;
&lt;br /&gt;
# By creating scripts in your domoticz instance on your domoticz server: &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Make sure that each script has the extension &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; and follows the guidelines as described below.&lt;br /&gt;
# By creating scripts inside Domoticz using the internal Domoticz event editor: Go to &#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Events&#039;&#039;&#039;. Press the + button and choose dzVents. You must then choose a template. They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: scripts that you write on the file-system and inside Domoticz using the internal web-editor all share the same name-space. That means that if you have two scripts with the same name, only the one of the file-system will be used. The log will tell you when this happens.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: Scripts created in the internal editor are stored in the domoticz database and are all written to &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/generated_scripts&amp;lt;/code&amp;gt; on every domoticz restart and every “EventSystem: reset all events…”. Scripts in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt; are not stored in the database and should be backed-up separately. &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quickstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
If you made sure that dzVents system is active, we can do a quick test if everything works:&lt;br /&gt;
&lt;br /&gt;
* Pick a switch in your Domoticz system. Write down the exact name of the switch. If you don’t have a switch then you can create a Dummy switch and use that one.&lt;br /&gt;
* Create a new file in the &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/&amp;lt;/code&amp;gt; folder (or using the web-editor in Domoticz, switch to dzVents mode first.). Call the file &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt;. &#039;&#039;Note: when you create a script in the web-editor you do &#039;&#039;&#039;not&#039;&#039;&#039; add the .lua extension!&#039;&#039; Also, valid script names follow the same rules as [https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words filesystem names].&lt;br /&gt;
* Open &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt; in an editor and fill it with this code and change &amp;lt;code&amp;gt;&amp;amp;lt;exact name of the switch&amp;amp;gt;&amp;lt;/code&amp;gt; with the .. you guessed it… exact name of the switch device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&lt;br /&gt;
            &#039;&amp;lt;exact name of the switch&amp;gt;&#039;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (switch.state == &#039;On&#039;) then&lt;br /&gt;
                domoticz.log(&#039;Hey! I am on!&#039;)&lt;br /&gt;
            else&lt;br /&gt;
                domoticz.log(&#039;Hey! I am off!&#039;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Save the script&lt;br /&gt;
* Open the Domoticz log in the browser&lt;br /&gt;
* In Domoticz GUI perhaps in another browser tab) press the switch.&lt;br /&gt;
* You can watch the log in Domoticz and it should show you that indeed it triggered your script and you should see the log messages.&lt;br /&gt;
&lt;br /&gt;
See the examples folder &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples&amp;lt;/code&amp;gt; for more examples. This folder includes templates you can use to get started as well. And, if you use the GUI web editor to write your script, you will find boilerplate examples in the drop-down below the script type setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;writing-scripts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Writing scripts =&lt;br /&gt;
&lt;br /&gt;
In order for your scripts to work with dzVents, they have to be turned into a Lua module with a specific structure. Basically you make sure it returns a Lua table (object) with predefined keys like &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt;. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;My switch&#039; }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, switch)&lt;br /&gt;
        -- your script logic goes here, something like this:&lt;br /&gt;
        if (switch.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.log(&#039;I am on!&#039;, domoticz.LOG_INFO)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Simply said, the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-part defines the trigger and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part is what should be done if the trigger matches with the current Domoticz event. So all your logic is inside the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sections-in-the-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sections in the script ==&lt;br /&gt;
&lt;br /&gt;
Each dzVents event script has this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    active = true, -- optional&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        -- at least one of these:&lt;br /&gt;
        customEvents = { ... },&lt;br /&gt;
        devices = { ... },&lt;br /&gt;
        groups = { ... },&lt;br /&gt;
        httpResponses = { ... },&lt;br /&gt;
        scenes = { ... },&lt;br /&gt;
        security = { ... },&lt;br /&gt;
        shellCommandResponses = { ... },&lt;br /&gt;
        system = { ... },&lt;br /&gt;
        timer = { ... },&lt;br /&gt;
        variables = { ... },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    data = { ... }, -- optional&lt;br /&gt;
    logging = { ... }, -- optional&lt;br /&gt;
    execute = function(domoticz, item, triggerInfo)&lt;br /&gt;
    -- your code here&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;active-truefalse-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== active = true/false (optional) ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;active = false&amp;lt;/code&amp;gt;, then the script is not activated: &#039;&#039;dzVents will ignore the script completely&#039;&#039;. If you don’t have &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; specified, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is assumed (default value). If you write scripts with Domoticz’ internal script editor then you don’t need this part as the editor has its own way of enabling and disabling scripts.&lt;br /&gt;
&lt;br /&gt;
So, &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; can either be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;true&#039;&#039;&#039;: (default) the script file will be processed.&lt;br /&gt;
* &#039;&#039;&#039;false&#039;&#039;&#039;: the script file is ignored.&lt;br /&gt;
* &#039;&#039;&#039;function(domoticz) … end&#039;&#039;&#039;: A function returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The function will receive the domoticz object with all the information about your domoticz instance: &amp;lt;code&amp;gt;active = function(domoticz) .... end&amp;lt;/code&amp;gt;. For example you could check for a Domoticz variable or switch and prevent the script from being executed. &#039;&#039;&#039;However, be aware that for &#039;&#039;every script&#039;&#039; in your scripts folder, this active function will be called, every cycle!! Therefore, it is better to put all your logic in the execute function instead of in the active function.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== on = { … } ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section tells dzVents &#039;&#039;when&#039;&#039; the execute function has to be executed. It holds all the events/&#039;&#039;&#039;triggers&#039;&#039;&#039; that are monitored by dzVents. If any of the events or triggers match with the current event coming from Domoticz, then the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part of the script is executed by dzVents. The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section has many kinds of subsections that &#039;&#039;can all be used simultaneously&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;customevents-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== customEvents = { … } &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more custom event triggers. This eventTrigger can be activate by a json/api call, a MQTT message (when domoticz is setup to listen to such messages on the hardware tab) or by the dzVents internal command domoticz.emitEvent - The name of the custom-event - The name of the custom-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|See time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;- curl: curl -d &amp;amp;quot;{ &#039;a&#039;:10, &#039;b&#039;:20, &#039;some&#039;:&#039;text&#039;, &#039;sub&#039; : { &#039;x&#039;:10, &#039;y&#039;:20 } }&amp;amp;quot; &amp;amp;quot;http://&amp;amp;lt;domoticzIP:domoticz port&amp;amp;gt;/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;myCustomEvent&amp;amp;gt;&amp;amp;quot;&lt;br /&gt;
- JSON: **&amp;amp;lt; domoticzIP : domoticz port &amp;amp;gt;**/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;MyEvent&amp;amp;gt;&amp;amp;amp;data=myData&lt;br /&gt;
- MQTT simple: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;, &amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;myData&amp;amp;quot;}&lt;br /&gt;
- MQTT complex: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;,&amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;{\&amp;amp;quot;idx\&amp;amp;quot;:29,\&amp;amp;quot;test\&amp;amp;quot;:\&amp;amp;quot;ok\&amp;amp;quot;}&amp;amp;quot; }&lt;br /&gt;
- emitEvent: domoticz.emitEvent(&#039;myCustomEvent&#039; [,])&lt;br /&gt;
    `domoticz.emitEvent(&#039;myEvent&#039;) -- no data`&lt;br /&gt;
    `domoticz.emitEvent(&#039;another event&#039;, &#039;some data&#039;)`&lt;br /&gt;
    `domoticz.emitEvent(&#039;hugeEvent&#039;, { a = 10, b = 20, some = &#039;text&#039;, sub = { x = 10, y = 20 } })`&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;attributes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== Attributes =====&lt;br /&gt;
&lt;br /&gt;
The customEvent object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw customEvent data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid json string. The data is then automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid xml string. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the customEvent data is a valid json string, the response data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;customEvent&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; The string that triggered this customEvent instance. This is useful if you have a script that can be triggered by multiple different customEvent strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the response data is a valid xml string, the customEvent data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== devices = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of device-names or indexes. If a device in your system was updated (e.g. a switch was triggered or a new temperature was received) and it is listed in this section then the execute function is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the device state or value has changed. Each device can be:&lt;br /&gt;
&lt;br /&gt;
* The name of your device between string quotes. &#039;&#039;&#039;You can use the asterisk (*) wild-card here e.g. &amp;lt;code&amp;gt;PIR_*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*_PIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;. E.g.: &amp;lt;code&amp;gt;devices = { &#039;myDevice&#039;, &#039;anotherDevice&#039;, 123, &#039;pir*&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* The index (idx) of your device (as the name may change, the index will usually stay the same, the index can be found in the devices section in Domoticz). &#039;&#039;&#039;Note that idx is a number;&#039;&#039;&#039;&lt;br /&gt;
* The name or idx of your device followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;myDevice&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if &amp;lt;code&amp;gt;myDevice&amp;lt;/code&amp;gt; was changed, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;groups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== groups = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more group-names or indexes. The same rules as devices apply.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpresponses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== httpResponses = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more http callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shellcommandresponses-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== shellCommandResponses = { …} &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scriptcommand callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scenes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== scenes = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scene-names or indexes. The same rules as devices apply. So if your scene is listed in this table then the executed function will be triggered, e.g.: &amp;lt;code&amp;gt;on = { scenes = { &#039;myScene&#039;, &#039;anotherScene&#039; } },&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== security = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more of these security states:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDAWAY&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDHOME&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_DISARMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the security state in Domoticz changes and it matches with any of the states listed here, the script will be executed. See &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples/templates/security.lua&amp;lt;/code&amp;gt; for an example see [[#Security_Panel|Security Panel]] for information about how to create a security panel device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== system = { …} &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more system triggers.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manualBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dailyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hourlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monthlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resetAllDeviceStatus&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt; &amp;lt;code&amp;gt;resetAllEvents&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* The name of the system-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
** &#039;&#039;&#039;start&#039;&#039;&#039; - fired when Domoticz has started.&lt;br /&gt;
** &#039;&#039;&#039;stop&#039;&#039;&#039; - fired when Domoticz is shutting down. As you probably can imagine you have only a limited amount of time - also depending on the load on your system - to have Domoticz do stuff when your script has been completed. Some commands will probably not be executed. Just give it a try.&lt;br /&gt;
** &#039;&#039;&#039;Backups&#039;&#039;&#039; - the trigger item (2nd parameter of the execute function) is a table that holds information about the newly created backup (location, duration in seconds and type). You could use this information to copy the file to some other location or for another purpose.&lt;br /&gt;
*** &#039;&#039;&#039;dailyBackupFinished&#039;&#039;&#039; - automatic backup when set in domoticz&lt;br /&gt;
*** &#039;&#039;&#039;hourlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;monthlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;manualBackupFinished&#039;&#039;&#039; - fired when you start a backup using the Domoticz GUI or via &#039;&#039;&#039;&amp;amp;lt; domoticz IP:domoticz port &amp;amp;gt;&#039;&#039;&#039;/backupdatabase.php&lt;br /&gt;
*** &#039;&#039;&#039;resetAllDeviceStatus&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when the name, description or used / unused state of a device, variable or scene is updated.&lt;br /&gt;
*** &#039;&#039;&#039;resetAllEvents&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when a dzVents script in the internal editor changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== timer = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one ore more time ‘rules’ like &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;at 17:*&amp;lt;/code&amp;gt;. See [[#timer_trigger_rules|&#039;&#039;timer&#039;&#039; trigger rules]]. If any or the rules matches with the current time/date then your execute function is called. E.g.: &amp;lt;code&amp;gt;on = { timer = { &#039;between 30 minutes before sunset and 30 minutes after sunrise&#039; } }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== variables = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more user variable-names as defined in Domoticz ( &#039;&#039;Setup &amp;amp;gt; More options &amp;amp;gt; User variables&#039;&#039;). If any of the variables listed here is updated, ( &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed ).the script is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: Script will only execute when this variable is updated directly by dzVents or by a JSON. If updated with a standard Lua script (using commandArray) or in combination with a time option like afterAAA no event will be triggered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;execute-functiondomoticz-item-triggerinfo-end&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== execute = function(&#039;&#039;&#039;domoticz, item, triggerInfo&#039;&#039;&#039;) … end ===&lt;br /&gt;
&lt;br /&gt;
When all the above conditions are met (active == true and the on section has at least one matching rule), then this &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function is called. This is the heart of your script. The function has three parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 1. (&#039;&#039;&#039;domoticz&#039;&#039;&#039;, item, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
The [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]]. This object gives you access to almost everything in your Domoticz system, including all methods to manipulate them—like modifying switches or sending notifications. More about the [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 2. (domoticz, &#039;&#039;&#039;item&#039;&#039;&#039;, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
Depending on what actually triggered the script, &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is either a:&lt;br /&gt;
&lt;br /&gt;
* [[#Custom_event_API|customEvent]] &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Device_object_API|device]],&lt;br /&gt;
* [[#Variable_object_API_.28user_variables.29|variable]],&lt;br /&gt;
* [[#Scene|scene]],&lt;br /&gt;
* [[#Group|group]],&lt;br /&gt;
* [[#timer_=_%7B_..._%7D|timer]],&lt;br /&gt;
* [[#System_event_API|system]], &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Security_Panel|security]] or&lt;br /&gt;
* [[#Asynchronous_HTTP_requests|httpResponse]]&lt;br /&gt;
* [[#Asynchronous_shell_command_executio|shellCommandResponse]] &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since you can define multiple on-triggers in your script, it is not always clear what the type is of this second parameter. In your code you need to know this in order to properly respond to the different events. To help you inspect the object you can use these attributes like &amp;lt;code&amp;gt;if (item.isDevice) then ... end&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;isCustomEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a customEvent object.&lt;br /&gt;
* &#039;&#039;&#039;isDevice&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Device object.&lt;br /&gt;
* &#039;&#039;&#039;isGroup&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Group object.&lt;br /&gt;
* &#039;&#039;&#039;isHTTPResponse&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is an HTTPResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isShellCommandResponse&#039;&#039;&#039;: . &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a shellcommandResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isScene&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Scene object.&lt;br /&gt;
* &#039;&#039;&#039;isSecurity&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Security object.&lt;br /&gt;
* &#039;&#039;&#039;isSystemEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a system object.&lt;br /&gt;
* &#039;&#039;&#039;isTimer&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Timer object.&lt;br /&gt;
* &#039;&#039;&#039;isVariable&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Variable object.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;: . &#039;&#039;string&#039;&#039;. the timer rule, the security state, the customEvent or the http response callback string that actually triggered your script. E.g. if you have multiple timer rules can inspect &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; which exact timer rule was fired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3. (domoticz, item, &#039;&#039;&#039;triggerInfo&#039;&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: as of version 2.4.0, &amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; has become more or less obsolete and is left in here for backward compatibility. All information is now available on the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; parameter (second parameter of the execute function, see point 2 above).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; holds information about what triggered the script. The object has two attributes:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;type&#039;&#039;&#039;: the type of the the event that triggered the execute function, either: - domoticz.EVENT_TYPE_CUSTOM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_DEVICE, - domoticz.EVENT_TYPE_GROUP - domoticz.EVENT_TYPE_HTTPRESPONSE - domoticz.EVENT_TYPE_SCENE, - domoticz.EVENT_TYPE_SECURITY, - domoticz.EVENT_TYPE_SYSTEM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_TIMER, - domoticz.EVENT_TYPE_VARIABLE)&lt;br /&gt;
# &#039;&#039;&#039;trigger&#039;&#039;&#039;: the timer rule that triggered the script if the script was called due to a timer event, or the security state that triggered the security trigger rule. See [[#timer_trigger_rules|below]] for the possible timer trigger rules.&lt;br /&gt;
# &#039;&#039;&#039;scriptName&#039;&#039;&#039;: the name of the current script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tip-rename-the-parameters-to-better-fit-your-needs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tip: rename the parameters to better fit your needs ====&lt;br /&gt;
&lt;br /&gt;
The names of the execute parameters are actually something you can change to your convenience. For instance, if you only have one trigger for a specific switch device, you can rename &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; it to &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Or if you think &amp;lt;code&amp;gt;domoticz&amp;lt;/code&amp;gt; is too long you can rename it to &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dz&amp;lt;/code&amp;gt; (might save you a lot of typing and may make your code more readable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = &#039;mySwitch&#039;&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(dz, mySwitch)&lt;br /&gt;
        dz.log(mySwitch.state, dz.LOG_INFO)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== data = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional data section allows you to define local variables that will hold their values &#039;&#039;between&#039;&#039; script runs. These variables can get a value in your execute function and the next time the script is executed these variables will have their previous state restored. For more information see the section [[#Persistent_data|Persistent data]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logging-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== logging = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional logging section allows you to override the global logging setting of dzVents as set in &#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem &amp;amp;gt; dzVents Log Level&#039;&#039;. This can be handy when you only want this script to have extensive debug logging while the rest of your script executes silently. You have these options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: This is the minimum log level you want for this script. This can be domoticz.LOG_INFO, domoticz.LOG_STATUS, domoticz.LOG_ERROR or domoticz.LOG_DEBUG&lt;br /&gt;
* &#039;&#039;&#039;marker&#039;&#039;&#039;: A string that is prefixed before each log message. That way you can easily create a filter in the Domoticz log to see just these messages. &#039;&#039;&#039;marker&#039;&#039;&#039; defaults to scriptname&lt;br /&gt;
&lt;br /&gt;
\*LOG_DEBUG will also cause Execution Info to be displayed (start/finished)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;logging = {&lt;br /&gt;
    level = domoticz.LOG_DEBUG,&lt;br /&gt;
    marker = &amp;quot;Hey you&amp;quot;&lt;br /&gt;
    },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;some-trigger-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Some trigger examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to trigger a script not on the minute but 30 seconds later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every minute&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        customEvents =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;delayed&#039;,&lt;br /&gt;
        },&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.emitEvent(&#039;delayed&#039;, domoticz.time.rawTime ).afterSec(30)&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.notify(&#039;Delayed&#039;, &#039;Event was emitted at &#039; .. item.data, domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have two devices—a smoke detector ‘myDetector’ and a room temperature sensor ‘roomTemp’, and you want to send a notification when either the detector detects smoke or the temperature is too high:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = {&lt;br /&gt;
            &#039;myDetector&#039;,&lt;br /&gt;
            &#039;roomTemp&#039;&lt;br /&gt;
    }&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        if ((device.name == &#039;myDetector&#039; and device.active) or&lt;br /&gt;
            (device.name == &#039;roomTemp&#039; and device.temperature &amp;gt;= 45)) then&lt;br /&gt;
            domoticz.notify(&#039;Fire&#039;, &#039;The room is on fire&#039;, domoticz.PRIORITY_EMERGENCY)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / group changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a scene ‘myScene’ and a group ‘myGroup’, and you want to turn on the group as soon as myScene is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        scenes = { &#039;myScene&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, scene)&lt;br /&gt;
        if (scene.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.groups(&#039;myGroup&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you want to send an email when a group is activated at night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        groups = { [&#039;myGroup&#039;] = {&#039;at nighttime&#039;} }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, group)&lt;br /&gt;
        if (group.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.email(&#039;Hey&#039;, &#039;The group is on&#039;, &#039;someone@the.world.org&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timer events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to check the soil humidity every 30 minutes during the day and every hour during the night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every 30 minutes at daytime&#039;,&lt;br /&gt;
            &#039;every 60 minutes at nighttime&#039;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, timer)&lt;br /&gt;
        domoticz.log(&#039;The rule that triggered the event was: &#039; .. timer.trigger&#039;)&lt;br /&gt;
        if (domoticz.devices(&#039;soil&#039;).moisture &amp;gt; 100) then&lt;br /&gt;
            domoticz.devices(&#039;irrigation&#039;).switchOn().forMin(60)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a script that updates a variable ‘myAmountOfMoney’, and if that variable reaches a certain level you want to be notified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        variables = { &#039;myAmountOfMoney&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, variable)&lt;br /&gt;
        -- variable is the variable that&#039;s triggered&lt;br /&gt;
        if (variable.value &amp;gt; 1000000) then&lt;br /&gt;
            domoticz.notify(&#039;Rich&#039;, &#039;You can stop working now&#039;, domoticz.PRIORITY_HIGH)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Security changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a group holding all the lights in your house, and you want to switch it off as soon as the alarm is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        security = { domoticz.SECURITY_ARMEDAWAY }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, security)&lt;br /&gt;
        domoticz.groups(&#039;All lights&#039;).switchOff()&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-request-and-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous HTTP Request and handling ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some external web service that will tell you what the current energy consumption is and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        httpResponses = { &#039;energyRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
            url = &#039;http://url/to/service&#039;,&lt;br /&gt;
            method = &#039;GET&#039;,&lt;br /&gt;
            callback = &#039;energyRetrieved&#039;&lt;br /&gt;
            })&lt;br /&gt;
        elseif (item.isHTTPResponse) then&lt;br /&gt;
            if (item.ok) then -- statusCode == 2xx&lt;br /&gt;
                local current = item.json.consumption&lt;br /&gt;
                domoticz.devices(&#039;myCurrentUsage&#039;).updateEnergy(current)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous shell command execution &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some local shellcommand to measure the speed of your internet connection and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        shellCommandResponses = { &#039;internetspeedRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;speedtest-cli --json&#039;,      -- just an example&lt;br /&gt;
            callback = &#039;internetspeedRetrieved&#039;,   -- see shellCommandResponses above.&lt;br /&gt;
            timeout = 20,                          -- max execution time in seconds&lt;br /&gt;
        })&lt;br /&gt;
        elseif (item.isShellCommandResponse) then&lt;br /&gt;
            if (item.statusCode==0) then&lt;br /&gt;
                domoticz.devices(&#039;myCurrentdownloadspeed&#039;).updateCustomSensor(item.json.download)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_shell_command_execution|asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System changes ===&lt;br /&gt;
&lt;br /&gt;
Do some initial work when domoticz starts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        system =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;start&#039;,&lt;br /&gt;
            &#039;backupDoneDaily&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, system)&lt;br /&gt;
        domoticz.log(&#039;Domoticz sends &#039; .. system.type, domoticz.LOG_INFO)&lt;br /&gt;
&lt;br /&gt;
        if system.type == &#039;start&#039; then&lt;br /&gt;
            domoticz.device(&#039;initial device&#039;).switchOff().silent&lt;br /&gt;
            domoticz.variables(&#039;special startVar&#039;).set(&#039;domoticz started at &#039; .. domoticz.time.rawDateTime )&lt;br /&gt;
        elseif system.type == &#039;backupDoneDaily&#039; then&lt;br /&gt;
            domoticz.notify(&#039;Domoticz backup&#039;, &#039;Ended. Backupfile &#039; .. system.data.location , domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;combined-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Combined rules ===&lt;br /&gt;
&lt;br /&gt;
Let’s say you have a script that checks the status of a lamp and is triggered by motion detector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
            timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
            devices = { &#039;myDetector&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- the timer was triggered&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOff()&lt;br /&gt;
        elseif (item.isDevice and item.active) then&lt;br /&gt;
            -- it must be the detector&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;at-startup-trigger&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== At startup trigger ===&lt;br /&gt;
&lt;br /&gt;
You can add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section to have your script execute once when Domoticz starts, in addition to any other triggers. This is useful when combined with interval-based rules to avoid waiting for the first interval to pass:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        at_startup = true,&lt;br /&gt;
        timer = { &#039;every hour&#039; },&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        -- Runs immediately when Domoticz starts, then every hour&lt;br /&gt;
        domoticz.devices(&#039;myThermostat&#039;).setPoint(21)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; trigger fires on the first timer tick after Domoticz starts (within 2 minutes of startup). It can be combined with any other trigger types (timer, devices, httpResponses, etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is different from &amp;lt;code&amp;gt;system = { &#039;start&#039; }&amp;lt;/code&amp;gt; which is a system event trigger. &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; is simpler - just add the flag and your existing script will also run at startup without needing to check &amp;lt;code&amp;gt;item.isSystemEvent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-trigger-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &#039;&#039;timer&#039;&#039; trigger rules ==&lt;br /&gt;
&lt;br /&gt;
There are several options for time triggers. It is important to know that Domoticz timer events only trigger once every minute, so one minute is the smallest interval for your timer scripts. However, dzVents gives you many options to have full control over when and how often your timer scripts are called (all times are in 24hr format and all dates in dd/mm): Keywords recognized are “at, between, every, except, in, on, or” ( except supported from version &amp;lt;sup&amp;gt;3.0.16&amp;lt;/sup&amp;gt;, or supported from version &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
At every place you read &amp;lt;astroMoment&amp;gt; you can use one of: sunset, sunrise, solarnoon, midnight &#039;&#039;, sunatsouth &#039;&#039;, civiltwilightstart, civiltwilightend, astronomicaltwilightstart &#039;&#039;, astronomicaltwilightend &#039;&#039;, nauticaltwilightstart * or nauticaltwilightend *.&lt;br /&gt;
&lt;br /&gt;
Full daynames are allowed in dzVents &amp;amp;gt;= 3.1.7&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every minute&#039;,             -- causes the script to be called every minute&lt;br /&gt;
            &#039;every other minute&#039;,       -- minutes: xx:00, xx:02, xx:04, ..., xx:58&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; minutes&#039;,       -- starting from xx:00 triggers every xx minutes&lt;br /&gt;
                                        -- (0 &amp;gt; xx &amp;lt; 60)&lt;br /&gt;
            &#039;every hour&#039;,               -- 00:00, 01:00, ..., 23:00 (24x per 24hrs)&lt;br /&gt;
            &#039;every other hour&#039;,         -- 00:00, 02:00, ..., 22:00 (12x per 24hrs)&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; hours&#039;,         -- starting from 00:00, triggers every xx&lt;br /&gt;
                                        -- hours (0 &amp;gt; xx &amp;lt; 24)&lt;br /&gt;
            &#039;at 13:45&#039;,                 -- specific time&lt;br /&gt;
            &#039;at *:45&#039;,                  -- every 45th minute in the hour&lt;br /&gt;
            &#039;at 15:*&#039;,                  -- every minute between 15:00 and 16:00&lt;br /&gt;
            &#039;at 12:45-21:15&#039;,           -- between 12:45 and 21:15. You cannot use &#039;*&#039;!&lt;br /&gt;
            &#039;at 19:30-08:20&#039;,           -- between 19:30 and 8:20 (next day)&lt;br /&gt;
            &#039;at 13:45 on mon,tue&#039;,      -- at 13:45 only on Mondays and Tuesdays (english)&lt;br /&gt;
            &#039;on mon,tue&#039;,               -- on Mondays and Tuesdays&lt;br /&gt;
            &#039;every hour on Saturday&#039;,   -- you guessed it correctly&lt;br /&gt;
            &#039;at sunset&#039;,                -- uses sunset/sunrise/solarnoon info from Domoticz&lt;br /&gt;
            &#039;at sunrise&#039;,&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt;&#039;,         -- dzVents &amp;gt;= 3.0.16 Uses the times received from Domoticz&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt; on sat,sun&#039;,&lt;br /&gt;
            &#039;xx minutes before &amp;lt;astroMoment&amp;gt;&#039;,  --&lt;br /&gt;
            &#039;xx minutes after &amp;lt;astroMoment&amp;gt;&#039;,   -- Please note that these relative times will cross dates&lt;br /&gt;
            &#039;between aa and bb&#039;         -- aa/bb can be a time stamp like 15:44 (if aa &amp;gt; bb will cross dates)&lt;br /&gt;
                                        -- aa/bb can be sunrise/sunset/solarnoon (&#039;between sunset and sunrise&#039; and &#039;between solarnoon and sunrise&#039; will cross dates)&lt;br /&gt;
                                        -- aa/bb can be &#039;xx minutes before/after &amp;lt;astroMoment&amp;gt;&#039;&lt;br /&gt;
            &#039;at &amp;lt;astroRange&amp;gt;&#039;,          -- between &amp;lt;astroMoment&amp;gt;start and &amp;lt;astroMoment&amp;gt;end&lt;br /&gt;
            &#039;at nighttime&#039;,             -- between sunset and sunrise&lt;br /&gt;
            &#039;at daytime&#039;,               -- between sunrise and sunset&lt;br /&gt;
            &#039;at daytime on mon,tue&#039;,    -- between sunrise and sunset only on Mondays and Tuesdays&lt;br /&gt;
            &#039;in week 1-7,44&#039;            -- in week 1-7 or 44&lt;br /&gt;
            &#039;in week 20-25,33-47&#039;       -- between week 20 and 25 or week 33 and 47&lt;br /&gt;
            &#039;in week -12, 33-&#039;          -- week &amp;lt;= 12 or week &amp;gt;= 33&lt;br /&gt;
            &#039;every odd week&#039;,&lt;br /&gt;
            &#039;every even week&#039;,          -- odd or even numbered weeks&lt;br /&gt;
            &#039;on 23/11&#039;,                 -- on 23rd of November (dd/mm)&lt;br /&gt;
            &#039;on 23/11-25/12&#039;,           -- between 23/11 and 25/12&lt;br /&gt;
            &#039;on 2/3-8/3,7/8,6/10-14/10&#039;,-- between march 2 and 8, on august 7 and between October 6 and 14.&lt;br /&gt;
            &#039;on */2,15/*&#039;,              -- every day in February or&lt;br /&gt;
                                        -- every 15th day of the month&lt;br /&gt;
            &#039;on -3/4,4/7-&#039;,             -- before 3/4 or after 4/7&lt;br /&gt;
&lt;br /&gt;
            &#039;at 12:45-21:15 except at 18:00-18:30&#039;, -- between 12:45 and 21:15 but not between 18:00 and 18:30 ( except supported from 3.0.16 onwards )&lt;br /&gt;
            &#039;at daytime except on sun&#039;,             -- between sunrise and sunset but not on Sundays&lt;br /&gt;
            &#039;at daytime or at 23:12&#039;,               -- between sunrise and sunset and also at 23:12&lt;br /&gt;
&lt;br /&gt;
            -- or if you want to go really wild and combine them:&lt;br /&gt;
                &#039;at nighttime at 21:32-05:44 every 5 minutes on sat, sun except at 04:00&#039;, -- except supported from 3.0.16 onwards&lt;br /&gt;
                &#039;every 10 minutes between 20 minutes before sunset and 30 minutes after sunrise on mon,fri,tue on 20/5-18/8&#039;&lt;br /&gt;
&lt;br /&gt;
            -- or just do it yourself:&lt;br /&gt;
                function(domoticz)&lt;br /&gt;
                -- you can use domoticz.time to get the current time&lt;br /&gt;
                -- note that this function is called every minute!&lt;br /&gt;
                -- custom code that either returns true or false&lt;br /&gt;
                ...&lt;br /&gt;
            end&lt;br /&gt;
        },&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The timer events are triggered every minute. If such a trigger occurs, dzVents will scan all timer-based events and will evaluate the timer rules. So, if you have a rule &amp;lt;code&amp;gt;on mon&amp;lt;/code&amp;gt; then the script will be executed &#039;&#039;every minute&#039;&#039; but only on Monday.&lt;br /&gt;
&lt;br /&gt;
Be mindful of the logic if using multiple types of timer triggers. It may not make sense to combine a trigger for a specific or instantaneous time with a trigger for a span or sequence of times (like ‘at sunset’ with ‘every 6 minutes’) in the same construct. Similarly, &amp;lt;code&amp;gt;&#039;between aa and bb&#039;&amp;lt;/code&amp;gt; only makes sense with instantaneous times for &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One important note: if Domoticz, for whatever reason, skips a timer event then you may miss the trigger! Therefore, you should build in some fail-safe checks or some redundancy if you have critical time-based stuff to control. There is nothing dzVents can do about it&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you want your timer script to also run at Domoticz startup (instead of waiting for the first timer match), add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section. See [[#at-startup-trigger|At startup trigger]].&lt;br /&gt;
&lt;br /&gt;
Another important issue: the way it is implemented right now, the &amp;lt;code&amp;gt;every xx minutes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every xx hours&amp;lt;/code&amp;gt; is a bit limited. The interval resets at every *:00 (for minutes) or 00:* for hours. You need an interval that is an integer divider of 60 (or 24 for the hours). So you can do every 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 and 30 minutes only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-domoticz-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= The domoticz object =&lt;br /&gt;
&lt;br /&gt;
The domoticz object passed as the first parameter to the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function contains everything you need to interact with your domotica system. It provides all information made available by the domoticz event system about your custom- and system events, devices, scenes, groups, hardware modules and variables and has methods needed to inspect and manipulate them. Getting this information is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;domoticz.time.isDayTime&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).temperature&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).lastUpdate.minutesAgo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The domoticz object consists of a logically arranges structure. It harbors all methods to manipulate Domoticz. dzVents will take care to notify Domoticz with all your intended changes and actions. Earlier you had to fill a commandArray with obscure commands. That’s no longer the case.&lt;br /&gt;
&lt;br /&gt;
Some more examples: &amp;lt;code&amp;gt;domoticz.devices(123).switchOn().forMin(5).afterSec(10)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My dummy sensor&#039;).updateBarometer(1034, domoticz.BARO_THUNDERSTORM)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One tip before you get started: &#039;&#039;&#039;Make sure that all your devices have unique names. dzVents will give you warnings in the logs if device names are not unique.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-object-api-application-programming-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Domoticz object API (Application Programming Interface) ==&lt;br /&gt;
&lt;br /&gt;
The domoticz object holds all information about your Domoticz system. It has global attributes and methods to query and manipulate your system. It also has a collection of &#039;&#039;&#039;devices&#039;&#039;&#039;, &#039;&#039;&#039;variables&#039;&#039;&#039; (user variables in Domoticz), &#039;&#039;&#039;scenes&#039;&#039;&#039;, &#039;&#039;&#039;groups&#039;&#039;&#039;, &#039;&#039;&#039;hardware&#039;&#039;&#039;. Each of these collections has four iterator functions: &amp;lt;code&amp;gt;find(), forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; to make searching for devices easier. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Domoticz attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a device by idx or name: &amp;lt;code&amp;gt;domoticz.devices(123)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My switch&#039;)&amp;lt;/code&amp;gt;. For the device API see [[#Device_object_API|Device object API]]. To iterate over all devices do: &amp;lt;code&amp;gt;domoticz.devices().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.devices()) do .. end&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;dump([osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all domoticz.settings attributes to the Domoticz log. This ignores the log level setting.&lt;br /&gt;
* &#039;&#039;&#039;email(subject, message, mailTo [, delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send email. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;emitEvent(name,[extra data ])&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a customEvent. If you just pass a name then Domoticz will execute the script(s) that subscribed to the named customEvent after your script has finished. You can optionally pass extra information as a string or table. A table will be automatically converted into a json string and converted back to a table in the subscribed script(s). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;executeShellCommand(command/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a command. If you just pass a command then Domoticz will execute the command after your script has finished but you will not get notified. If you pass options table with a callback then you have the possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_shell_command_execution|asynchronous shell commands]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &#039;&#039;&#039;Note Make sure that when you use this function on a Windows system and use one or more of the special chars &amp;amp;amp;&amp;amp;lt;&amp;amp;gt;()@^| outside double quotes, you will have to escape these with a ^ char &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;groups(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a group by name or idx. Each group has the same interface as a device. To iterate over all groups do: &amp;lt;code&amp;gt;domoticz.groups().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.groups()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Group|Groups]].&lt;br /&gt;
* &#039;&#039;&#039;hardwareInfo(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.6&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning hardwareInfo of a hardware module by name or idx. The return of the function is a table with attributes name, type, typeValue, deviceNames (table with names of all active devices defined on this hardware) and deviceIds (table with idx of all active devices defined on this hardware)&lt;br /&gt;
* &#039;&#039;&#039;hardware(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning a hardware module by name or idx. Each hardware has an interface comparable to group. To iterate over all hardware do: &amp;lt;code&amp;gt;domoticz.hardware().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.hardware()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Hardware|Hardware]].&lt;br /&gt;
* &#039;&#039;&#039;helpers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Collection of shared helper functions available to all your dzVents scripts. See [[#Shared_helper_functions|Shared helper functions]].&lt;br /&gt;
* &#039;&#039;&#039;log(message, [level])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a log entry in the Domoticz log but respects the log minimum level settings. You can provide the loglevel: &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_STATUS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_ERROR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_DEBUG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.LOG_FORCE&amp;lt;/code&amp;gt;. In Domoticz settings you can set the default log level for dzVents.&lt;br /&gt;
* &#039;&#039;&#039;moduleLabel&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; Module (script) name without extension.&lt;br /&gt;
* &#039;&#039;&#039;notify(subject, message [,priority][,sound][,extra][,subsystem][,delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send a notification (like Prowl). Priority can be like &amp;lt;code&amp;gt;domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt; is notification subsystem specific. For NSS_FIREBASE you can use this field to specify the target mobile (‘midx_1’, midx_2, etc..) or specify &amp;lt;code&amp;gt;device.id&amp;lt;/code&amp;gt; so the receiver knows which device triggered the notification. For sound see [[#Constants|list of dzVents Constants]] for the SOUND constants below. &amp;lt;code&amp;gt;subsystem&amp;lt;/code&amp;gt; defaults to all subsystems but can be one subsystem or a table containing one or more notification subsystems. See [[#Constants|list of dzVents Constants]] for &amp;lt;code&amp;gt;domoticz.NSS_subsystem&amp;lt;/code&amp;gt; types. Delay is delay in seconds&lt;br /&gt;
* &#039;&#039;&#039;openURL(url/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ a URL. If you just pass a url then Domoticz will execute the url after your script has finished but you will not get notified. If you pass a table with options then you have to possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_HTTP_requests|asynchronous http requests]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;scenes(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a scene by name or id. Each scene has the same interface as a device. See [[#Device_object_API|Device object API]]. To iterate over all scenes do: &amp;lt;code&amp;gt;domoticz.scenes().forEach(..)&amp;lt;/code&amp;gt;. See [[#looping-through-the-collections-iterators|Looping through the collections: iterators]]. (#Looping_through_the_collections:_iterators). Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.scenes()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Scene|Scenes]].&lt;br /&gt;
* &#039;&#039;&#039;security&#039;&#039;&#039;: Holds the state of the security system e.g. &amp;lt;code&amp;gt;Armed Home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Armed Away&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;sendCommand(command, value[, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: Generic (low-level)command method (adds it to the commandArray) to the list of commands that are being sent back to domoticz. Optional parm delay is delay in seconds &#039;&#039;There is likely no need to use this directly. Use any of the device methods instead (see below).&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;settings&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;domoticzVersion&#039;&#039;&#039;: domoticz version string.&lt;br /&gt;
** &#039;&#039;&#039;dzVentsVersion&#039;&#039;&#039;: dzVents version string.&lt;br /&gt;
** &#039;&#039;&#039;location&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;latitude&#039;&#039;&#039;: domoticz settings locations latitude.&lt;br /&gt;
*** &#039;&#039;&#039;longitude&#039;&#039;&#039;: domoticz settings locations longitude.&lt;br /&gt;
*** &#039;&#039;&#039;name&#039;&#039;&#039;: domoticz settings location Name.&lt;br /&gt;
** &#039;&#039;&#039;secureServer&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; true when domoticz can be accessed via https.&lt;br /&gt;
** &#039;&#039;&#039;serverPort&#039;&#039;&#039;: webserver listening port used by dzVents to access domoticz API.&lt;br /&gt;
** &#039;&#039;&#039;url&#039;&#039;&#039;: internal url to access the API service.&lt;br /&gt;
** &#039;&#039;&#039;webRoot&#039;&#039;&#039;: &amp;lt;code&amp;gt;webroot&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
** &#039;&#039;&#039;wwwBind&#039;&#039;&#039;: &amp;lt;code&amp;gt;wwwbind&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.4&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
* &#039;&#039;&#039;sms(message [, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends an sms if it is configured in Domoticz. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;snapshot(cameraID(s) or camera Name(s)&amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt;,subject)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends email with a camera snapshots if email is configured and set for attachments in Domoticz. Send 1 or multiple camerIDs -names in ; separated string or array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    dz.snapshot()                  -- defaults to id = 1, subject domoticz&lt;br /&gt;
    dz.snapshot(1,&#039;dz&#039;)            -- subject dz&lt;br /&gt;
    dz.snapshot(&#039;1;2;3&#039;)           -- ; separated string&lt;br /&gt;
    dz.snapshot({1,4,7})           -- table&lt;br /&gt;
    dz.snapshot(&#039;test;test2&#039;)      -- ; separated string&lt;br /&gt;
    dz.snapshot({&#039;test&#039;, &#039;test2&#039;}) -- table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTimerPlan(idx)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch the active timer plan to the plan with the given database ID. &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; must be a positive integer matching an existing timer plan ID (as shown in &#039;&#039;&#039;Settings → Timer Plans&#039;&#039;&#039;). Invalid or non-existent plan IDs are silently ignored. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;startTime&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;. Returns the startup time of the Domoticz service.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;systemUptime&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds the system is up.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Current system time. Additional to Time object attributes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if the device was updated today&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will rise.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will set.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will start.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will end.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerHTTPResponse([httpResponse], [delay], [message])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a callback by sending a logmessage. httpResponse defaults to scriptname, delay defaults to 0 (immediate), message defaults to httpResponse. Left in for backward compatibility only. You can use emitEvent / customEvents now.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerIFTTT(makerName [,sValue1, sValue2, sValue3])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ an IFTTT maker event. makerName is required, 0-3 sValue’s are optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;utils&#039;&#039;&#039;: . A subset of handy utilities: Note that these functions must be preceded by domoticz.utils. If you use more then a few declare something like local _u = domoticz.utils at the beginning of your script and use _u.functionName in the remainder. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    _u = domoticz.utils&lt;br /&gt;
    print(_u.rightPad(&#039;test&#039;,10) .. &#039;|||&#039;) -- =&amp;gt; test       |||&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;_.lodashFunctions&#039;&#039;&#039;: This is an entire collection with very handy Luafunctions. Read more about [[#lodash_for_Lua|lodash]]. E.g.: &amp;lt;code&amp;gt;{.lua}   domoticz.utils._.size({&#039;abc&#039;, &#039;def&#039;}))` Returns 2.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;cameraExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid camera &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or cameraID and return ID when entered with valid cameraName or false when not a camera, cameraID or cameraName of an existing camera&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid device &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or deviceID and returns ID when entered with valid deviceName or false when not a device, deviceID or deviceName of an existing (and active) device. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local dz = domoticz&lt;br /&gt;
local _u = dz.utils&lt;br /&gt;
if _u.deviceExists(&#039;myDevice&#039;) then&lt;br /&gt;
    dz.devices(&#039;myDevice&#039;).switchOn()&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device myDevice does not exist!&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local myName = _u.deviceExists(123)&lt;br /&gt;
if myName then&lt;br /&gt;
    dz.log(&#039;Device 123 is &#039; .. myName, dz.LOG_INFO)&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device 123 does not exist&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpTable(table,[levelIndicator],[osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;))&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: print table structure and contents to log&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fileExists(path)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file (with full path) exists.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Decode a base64 string&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromJSON(json, fallback, deSerialize &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Turns a json string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromJSON(&#039;{ &amp;amp;quot;a&amp;amp;quot;: 1 }&#039;)&amp;lt;/code&amp;gt;. Followed by: &amp;lt;code&amp;gt;print( t.a )&amp;lt;/code&amp;gt; will print 1. Optional 2nd param fallback will be returned if json is nil or invalid. Optional 3rd param deSerialize (boolean) determines if the JSON should be deserialized before converting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromXML(xml, fallback )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Turns a xml string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromXML(&#039;&amp;amp;lt;testtag&amp;amp;gt;What a nice feature!&amp;amp;lt;/testtag&amp;amp;gt;&#039;) Followed by:&amp;lt;/code&amp;gt;print( t.texttag)` will print What a nice feature! Optional 2nd param fallback will be returned if xml is nil or invalid.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fuzzyLookup([string|array of strings], parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.14&amp;lt;/sup&amp;gt;. Search fuzzy matching string in parm. If parm is string it returns a number (lower is better match). If parm is array of strings it returns the best matching string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;groupExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid group &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or groupID and return ID when entered with valid groupName or false when not a group, groupID or groupName of an existing group&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; returns name when entered with valid hardwareID or ID when entered with valid hardwareName or false when not a hardwareID or hardwareName of an existing (and active )hardware module&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inTable(table, searchString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;&amp;amp;quot;key&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as a key, &amp;lt;code&amp;gt;&amp;amp;quot;value&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as value and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isJSON(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘application/json’ or string is enclosed in {} and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isXML(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘text/xml’ or ‘application/xml’ or string is enclosed in &amp;amp;lt;&amp;amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leftPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;centerPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Center string by preceding and succeeding with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;numDecimals(number [, integer [, decimals ]])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Format number to float representation. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        domoticz.utils.numDecimals(12.23, 4, 4) -- =&amp;gt; 12.2300,&lt;br /&gt;
        domoticz.utils.numDecimals (12.23,1,1) -- =&amp;gt; 12.2,&lt;br /&gt;
        domoticz.utils.leadingZeros(domoticz.utils.numDecimals (12.23,4,4),9) -- =&amp;gt; 0012.2300&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osCommand(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt; Execute an OS command and return result and returncode. Note: For long running scripts &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; should be used, See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osExecute(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Execute an OS command (no return). Note: For long running scripts &amp;lt;code&amp;gt;executeShellCommand()&amp;lt;/code&amp;gt; should be used. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rightPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Succeed string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;round(number, [decimalPlaces])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Helper function to round numbers. Default decimalPlaces is 0.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sceneExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with valid scene &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or sceneID and return ID when entered with valid sceneName or false when not a scene, sceneID or sceneName of an existing scene&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setLogMarker([marker])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: set logMarker to ‘marker’. Defaults to scriptname. Can be used to change logMarker based on flow in script&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;splitLine(string , splitOnWord ) &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line. Return is a table with line-segments.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringSplit(string [,separator ] [,convertNumber ][,convertNil ]&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line in separate words. Default separator is space. Return is a table with separated words. Default convertNumber is false when set to true it will convert strings to number where possible. Word is ignored when nil, unless convertNil is set; in that case word will be set to the convertNil value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringToSeconds(str)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Returns number of seconds between now and str. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.utils.stringToSeconds(&#039;09:00&#039;)                 -- number of seconds between now and 09:00 hr.&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on fri&#039;)       -- number of seconds between now and Friday at 08:53:30&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on sat, sun&#039;)  -- number of seconds between now and Saturday or Sunday at 08:53:30 ;whatever comes first&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: ) Encode a string to base64&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toCelsius(f, relative)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts temperature from Fahrenheit to Celsius along the temperature scale or when relative == true it uses the fact that 1F = 0.56C. So &amp;lt;code&amp;gt;toCelsius(5, true)&amp;lt;/code&amp;gt; returns 5F*(1/1.8) = 2.78C.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toJSON(luaTable)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a json string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toXML(luaTable, [header])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a xml string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlDecode(s)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple deCoder to convert a string with escaped chars (%20, %3A and the likes) to human readable format.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlEncode(s, [strSub])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple url encoder for string so you can use them in &amp;lt;code&amp;gt;openURL()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;strSub&amp;lt;/code&amp;gt; is optional and defaults to + but you can also pass %20 if you like/need.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variableExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid variable &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or variableID and return ID when entered with valid variableName or false when not a variable, variableID or variableName of an existing variable&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leadingZeros(number, length)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede number with given zeros to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variables(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a variable by it’s name or idx. See [Variable object API] (#Variable_object_API_.28user_variables.29) for the attributes. To iterate over all variables do: &amp;lt;code&amp;gt;domoticz.variables().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. &#039;&#039;&#039;Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.variables()) do .. end&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-collections-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Looping through the collections: iterators ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these collections (tables): devices, scenes, groups, variables, changedDevices and changedVariables. You cannot use the &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; functions. Therefore dzVents has four iterator methods:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Returns the item in the collection for which &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; returns true. When no item is found &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; returns nil.&lt;br /&gt;
# &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Executes function once per array element. The function receives the item in the collection (device or variable). If the function returns &#039;&#039;false&#039;&#039;, the loop is aborted.&lt;br /&gt;
# &#039;&#039;&#039;filter(function / table)&#039;&#039;&#039;: returns items in the collection for which the function returns true. You can also provide a table with names and/or ids.&lt;br /&gt;
# &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the collection and do some calculation with it. You call it with the function and the initial value. Each iteration the function is called with the accumulator and the item in the collection. The function does something with the accumulator and returns a new value for it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Examples: ====&lt;br /&gt;
&lt;br /&gt;
find():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myDevice = domoticz.devices().find(function(device)&lt;br /&gt;
        return device.name == &#039;myDevice&#039;&lt;br /&gt;
    end)&lt;br /&gt;
    domoticz.log(&#039;Id: &#039; .. myDevice.id)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
forEach():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().forEach(function(device)&lt;br /&gt;
        if (device.batteryLevel &amp;lt; 20) then&lt;br /&gt;
        -- do something&lt;br /&gt;
        end&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
filter():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local deadDevices = domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end)&lt;br /&gt;
    deadDevices.forEach(function(zombie)&lt;br /&gt;
        -- do something&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local livingLights = {&lt;br /&gt;
        &#039;window&#039;,&lt;br /&gt;
        &#039;couch&#039;,&lt;br /&gt;
        33, -- kitchen light id&lt;br /&gt;
    }&lt;br /&gt;
    local lights = domoticz.devices().filter(livingLights)&lt;br /&gt;
    lights.forEach(function(light)&lt;br /&gt;
        -- do something&lt;br /&gt;
        light.switchOn()&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can chain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end).forEach(function(zombie)&lt;br /&gt;
        -- do something with the zombie&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Using a reducer to count all devices that are switched on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local count = domoticz.devices().reduce(function(acc, device)&lt;br /&gt;
        if (device.state == &#039;On&#039;) then&lt;br /&gt;
            acc = acc + 1 -- increase the accumulator&lt;br /&gt;
        end&lt;br /&gt;
        return acc -- always return the accumulator&lt;br /&gt;
    end, 0) -- 0 is the initial value for the accumulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;constants&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these constants available for use in your code e.g. &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT: you have to prefix these constants with the name of your domoticz object. Example: &amp;lt;code&amp;gt;domoticz.ALERTLEVEL_RED&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_ORANGE, ALERTLEVEL_RED, ALERTLEVEL_YELLOW&#039;&#039;&#039;: for updating text sensors.&lt;br /&gt;
* &#039;&#039;&#039;BASETYPE_CUSTOM_EVENT &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;,BASETYPE_DEVICE, BASETYPE_SCENE, BASETYPE_GROUP, BASETYPE_HARDWARE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;BASETYPE_VARIABLE, BASETYPE_SECURITY, BASETYPE_TIMER, BASETYPE_HTTP_RESPONSE, BASETYPE_SYSTEM&#039;&#039;&#039;&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;: indicators for the various object types that are passed as the second parameter to the execute function. E.g. you can check if an object is a device object: &amp;lt;code&amp;gt;Lua  if (item.baseType == domoticz.BASETYPE_DEVICE) then ... end&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;BARO_CLOUDY, BARO_CLOUDY_RAIN, BARO_STABLE, BARO_SUNNY, BARO_THUNDERSTORM, BARO_NOINFO, BARO_UNSTABLE, BARO_COMPUTE&#039;&#039;&#039; : for updating barometric values.&lt;br /&gt;
* &#039;&#039;&#039;EVENT_TYPE_DEVICE, EVENT_TYPE_VARIABLE, EVENT_TYPE_CUSTOM&#039;&#039;&#039;, &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_SECURITY, EVENT_TYPE_HTTPRESPONSE, EVENT_TYPE_SYSTEM,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_TIMER&#039;&#039;&#039;: triggerInfo types passed to the execute function in your scripts.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_TEMPORARY_OVERRIDE, EVOHOME_MODE_PERMANENT_OVERRIDE, EVOHOME_MODE_FOLLOW_SCHEDULE&#039;&#039;&#039;: mode for EvoHome system.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_AUTOWITHRESET, EVOHOME_MODE_AUTOWITHECO, EVOHOME_MODE_AWAY, EVOHOME_MODE_DAYOFF, EVOHOME_MODE_CUSTOM, EVOHOME_MODE_HEATINGOFF&#039;&#039;&#039; : mode for EvoHome controller&lt;br /&gt;
* &#039;&#039;&#039;HUM_COMFORTABLE, HUM_DRY, HUM_NORMAL, HUM_WET, HUM_COMPUTE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;: constant for humidity status.&lt;br /&gt;
* &#039;&#039;&#039;INTEGER, FLOAT, STRING, DATE, TIME&#039;&#039;&#039;: variable types.&lt;br /&gt;
* \**LOG_INFO, LOG_STATUS, LOG_ERROR, LOG_DEBUG, LOG_FORCE: for logging messages. LOG_FORCE will always be displayed.&lt;br /&gt;
* &#039;&#039;&#039;NSS_CLICKATELL&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_FIREBASE, NSS_FIREBASE_CLOUD_MESSAGING, NSS_GOOGLE_DEVICES,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; &amp;lt;sup&amp;gt;Only with installed casting plugin&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER, NSS_TELEGRAM, NSS_GOOGLE_CLOUD_MESSAGING&#039;&#039;&#039; &amp;lt;sup&amp;gt;deprecated by Google and replaced by firebase&amp;lt;/sup&amp;gt;: for notification subsystem&lt;br /&gt;
* &#039;&#039;&#039;PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&#039;&#039;&#039;: for notification priority.&lt;br /&gt;
* &#039;&#039;&#039;SECURITY_ARMEDAWAY, SECURITY_ARMEDHOME, SECURITY_DISARMED&#039;&#039;&#039;: for security state.&lt;br /&gt;
* &#039;&#039;&#039;STATE_IDLE, STATE_COOLING, STATE_HEATING&#039;&#039;&#039;: for thermostat operating state.&lt;br /&gt;
* &#039;&#039;&#039;SOUND_ALIEN , SOUND_BIKE, SOUND_BUGLE, SOUND_CASH_REGISTER, SOUND_CLASSICAL, SOUND_CLIMB , SOUND_COSMIC, SOUND_DEFAULT, SOUND_ECHO, SOUND_FALLING, SOUND_GAMELAN, SOUND_INCOMING, SOUND_INTERMISSION, SOUND_MAGIC, SOUND_MECHANICAL, SOUND_NONE, SOUND_PERSISTENT, SOUND_PIANOBAR , SOUND_SIREN, SOUND_SPACEALARM, SOUND_TUGBOAT, SOUND_UPDOWN&#039;&#039;&#039;: for notification sounds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Custom event API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a customEvent in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;notification&#039;&#039; object. The object.type = customEvent (isCustomEvent: true) and object.data contains the passed data to this script. object.trigger is the name of the customEvent that triggered the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-object-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device object API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by switching a device in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;device&#039;&#039; object. Also, each device in Domoticz can be found in the &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; collection (see above). The device object has a set of fixed attributes like &#039;&#039;name&#039;&#039; and &#039;&#039;idx&#039;&#039;. Many devices, however, have different attributes and methods depending on their (hardware)type, subtype and other device specific identifiers. It is possible that you will get an error if you call a method on a device that doesn’t support it, so please check the device properties for your specific hardware to see which are supported (can also be done in your script code!).&lt;br /&gt;
&lt;br /&gt;
dzVents recognizes most of the different device types in Domoticz and creates the proper attributes and methods. It is possible that your device type has attributes that are not recognized; if that’s the case, please create a ticket in the Domoticz [https://github.com/domoticz/domoticz/issues issue tracker on GitHub], and an adapter for that device will be added.&lt;br /&gt;
&lt;br /&gt;
If for some reason you miss a specific attribute or data for a device, then likely the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute will have that information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-all-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device attributes and methods for all devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Same as bState.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;baseType&#039;&#039;&#039; &#039;&#039;String&#039;&#039;. ‘camera’, ‘device’, ‘group’, ‘scene’, ‘hardware’, ‘uservariable’ or ‘security’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;batteryLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-100.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;bState&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Better to use active.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True if the device was updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: This does not necessarily means the device state or value changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;customImage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. When customImage is used for the device-icon this will be the icon-number. It will be 0 if the icon was not changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;description&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Description of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceId&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Another identifier of devices in Domoticz. dzVents uses the id(x) attribute. See device list in Domoticz’ settings table.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceSubType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dump()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all attributes except functions and complete time overview to the Domoticz log. This ignores the log level setting. Use fullDump to include everything.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpSelection([{‘attributes’} ‘functions’ ‘tables’])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.5&amp;lt;/sup&amp;gt; Dump attributes, function-names or table-names to the Domoticz log. This ignores the log level setting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fullDump()&#039;&#039;&#039; &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt; Dump all attributes including functions and the complete time overview to the Domoticz log. This ignores the log level setting. Most of the time dump() shows everything what is needed to debug.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareId&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;icon&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the icon in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the device. You can find the index in the device list (idx column) in Domoticz settings. It’s not truly an index but is unique enough for dzVents to be treated as an id.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;idx&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as id: index of the device&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inActive&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; true if active is false and vice versa. If active is nil inActive is also nil&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Time when the device was updated. **Note: The lastUpdate for devices that triggered the script at hand is in fact the previousUpdate time. The real lastUpdate time for these “script triggering” devices is the current time.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;nValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Numerical representation of the state.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protected&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True when device / scene / group is protected. False otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options] !! **Note: domoticz protects against GUI and API access only. switchOn / switchOff type Blockly / Lua / dzVents commands are not influenced (because they are executed as admin user)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rawData&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;: All values are &#039;&#039;String&#039;&#039; types and hold the raw data received from Domoticz.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current devicename to new devicename Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setDescription(description)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic method to update the description for all devices, groups and scenes. E.g.: device.setDescription(device.description .. ‘/nChanged by’.. item.trigger .. ‘at’ .. domoticz.time.raw). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setIcon(iconNumber)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. method to update the icon for devices. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setState(newState)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method for switch-like devices. E.g.: device.setState(‘On’). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;resumeTimerPlan()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Finds the most recent timer that should have fired today (before now) for this device, scene, or group and executes it immediately. Useful for restoring the correct state after a Domoticz restart or power cut. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. ```lua – Replay last timer for a device domoticz.devices(‘My Light’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a scene domoticz.scenes(‘Evening Scene’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a group domoticz.groups(‘All Lights’).resumeTimerPlan() ```&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setValues(nValue,[ sValue1, sValue2, …])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic alternative method to update device nValue, sValues. Uses domoticz JSON API to force subsequent pushes like influxdb and MQTT. nValue required but when set to nil it defaults to current nValue. sValue parms are optional and can be many. &amp;lt;sup&amp;gt;3.0.8&amp;lt;/sup&amp;gt; If one of sValue parms is ‘parsetrigger’, subsequent eventscripts will be triggered.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For switches, holds the state like ‘On’ or ‘Off’. For dimmers that are on, it is also ‘On’ but there is a level attribute holding the dimming level. &#039;&#039;&#039;For selector switches&#039;&#039;&#039; (Dummy switch) the state holds the &#039;&#039;name&#039;&#039; of the currently selected level. The corresponding numeric level of this state can be found in the &#039;&#039;&#039;rawData&#039;&#039;&#039; attribute: &amp;lt;code&amp;gt;device.rawData[1]&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;signalLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-12&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI(Switches tab). E.g. ‘On/Off’, ‘Door Contact’, ‘Motion Sensor’ or ‘Blinds’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sValue&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the sValue (string Value) of a device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;timedOut&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true when the device couldn’t be reached.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;unit&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Device unit. See device list in Domoticz’ settings for the unit.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;update(&amp;amp;lt; params &amp;amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method. Accepts any number of parameters that will be sent back to Domoticz. There is no need to pass the device.id here. It will be passed for you. Example to update a temperature: &amp;lt;code&amp;gt;device.update(0,12)&amp;lt;/code&amp;gt;. This will eventually result in a commandArray entry &amp;lt;code&amp;gt;[&#039;UpdateDevice&#039;]=&#039;&amp;amp;lt;idx&amp;amp;gt;|0|12&#039;&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;updateQuiet(nValue, sValue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Uses the JSON/API to send nValue and/or sValue to domoticz (at least one should be supplied). Will update the device status in the GUI and trigger events but will not execute the action on the device. Only useful when the status in the GUI is not in line with the actual status. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-specific-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device attributes and methods for specific devices ===&lt;br /&gt;
&lt;br /&gt;
Note that if you do not find your specific device type here you can always inspect what is in the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute. Please let us know that it is missing so we can write an adapter for it (or you can write your own and submit it). Calling &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; will dump all attributes and values for myDevice to the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;air-quality&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Air quality ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;co2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. PPM&lt;br /&gt;
* &#039;&#039;&#039;quality&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Air quality string.&lt;br /&gt;
* &#039;&#039;&#039;updateAirQuality(ppm)&#039;&#039;&#039;: Pass the CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; concentration. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alert-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Alert sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Color of the alert. See domoticz color constants for possible values.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateAlertSensor(level, text)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-1-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 1-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Current in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-3-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 3-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current1&#039;&#039;&#039;, &#039;&#039;&#039;current2&#039;&#039;&#039;, &#039;&#039;&#039;current3&#039;&#039;&#039; : &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current1, current2, current3)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Currents in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. Barometric pressure.&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateBarometer(pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update barometric pressure. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-managed-counter-counter-incremental&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Counter, managed Counter, counter incremental ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Today’s counter value.&lt;br /&gt;
* &#039;&#039;&#039;updateCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &#039;&#039;&#039;Overwrite current value for managed and standard counters; increment for incremental counters !!&#039;&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateHistory( date, sValues )&#039;&#039;&#039;: &#039;&#039;Strings&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt; &#039;&#039;function&#039;&#039; Managed counter only! Used to write values to short or long term storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local mCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22&#039;, &#039;10;1777193&#039;) -- Write to long term storage (meter_calendar table)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22 10:05:02&#039;, &#039;10;1777193&#039;) -- Write to short term storage (meter table)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;incrementCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (counter incremental) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. To update with a complete new value you will have to do some calculation and take the counter divider into account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local newValue = value&lt;br /&gt;
    local iCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    local counterDivider = x -- x is depending on the counter divider set for the device&lt;br /&gt;
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;valueQuantity&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For counters.&lt;br /&gt;
* &#039;&#039;&#039;valueUnits&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Custom sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sensorType&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;sensorUnit&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;sensorValue&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; &#039;&#039;Number&#039;&#039; where applicable; else &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;updateCustomSensor(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;distance-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Distance sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateDistance(distance)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Electric usage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage. (please use actualWatt)&lt;br /&gt;
* &#039;&#039;&#039;updateEnergy(energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. In Watt. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-controller&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (controller) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;setMode(mode, dparm, action, ooc )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set mode for controller. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_AUTOWITHRESET, domoticz.EVOHOME_MODE_AUTOWITHECO, domoticz.EVOHOME_MODE_AWAY, domoticz.EVOHOME_MODE_DAYOFF, domoticz.EVOHOME_MODE_CUSTOM or domoticz.EVOHOME_MODE_HEATINGOFF. dParm &amp;lt;optional&amp;gt; can be a future time string (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;), a future time object, a future time as number of seconds since epoch or a number representing a positive offset in minutes (max 1 year). action &amp;lt;optional&amp;gt; (1 = run on action script, 0 = disable), ooc &amp;lt;optional&amp;gt; (1 = only trigger the event &amp;amp;amp; log on change, 0 = always trigger &amp;amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-hotwater&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (hotWater) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a.&lt;br /&gt;
* &#039;&#039;&#039;setHotWater(state, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set HotWater Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE You can provide an until date (in ISO 8601 format for domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-relay&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (relay) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;number&#039;&#039; (level percentage)&lt;br /&gt;
* &#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; (true when state is not equal to ‘Off’, false otherwise)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-zones&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (zones) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; .&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a .&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update set point. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE. You can provide an until date (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;). When leaving out untilDate for mode domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE the untilDate will be the next scheduled zone-update time/date. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gas ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;updateGas(usage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Usage in &#039;&#039;&#039;dm&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&#039;&#039;&#039; (liters). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current group-name to new group-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleGroup()&#039;&#039;&#039;: Toggles the state of a group. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hardware-3.0.7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hardware &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;isHardware&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;isPythonPlugin&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: : &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;typeValue&#039;&#039;&#039;: : &#039;&#039;Number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;humidity-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Humidity sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;updateHumidity(humidity, status)&#039;&#039;&#039;: Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kodi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Kodi ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;kodiExecuteAddOn(addonId)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. 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;
* &#039;&#039;&#039;kodiPause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlay()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play an item from the Kodi’s Favorites list optionally starting at &#039;&#039;position&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayPlaylist(name, [position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play a music or video Smart Playlist with &#039;&#039;name&#039;&#039; optionally starting at &#039;&#039;position&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiSetVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the volume for a Kodi device, 0 &amp;amp;lt;= level &amp;amp;lt;= 100.&lt;br /&gt;
* &#039;&#039;&#039;kodiStop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiSwitchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-electricity-instant-and-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== kWh, Electricity (instant and counter) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual usage in Watt.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateElectricity(power, energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WhToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage of the day. Note the unit is Wh and not kWh!&lt;br /&gt;
* &#039;&#039;&#039;WhTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual reading in Watt. Please use actualWatt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;leaf-wetness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Leaf wetness ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wetness&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Wetness value&lt;br /&gt;
* &#039;&#039;&#039;updateWetness(wetness)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logitech-media-server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Logitech Media Server ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will pause the device if it was streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;play()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. If the device was off, it will turn on and start streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the favorites playlist. &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; is optional (0 = default). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playlistID&#039;&#039;&#039;: &#039;&#039;Nubmer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;setVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the volume (0 &amp;amp;lt;= level &amp;amp;lt;= 100). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;startPlaylist(name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the playlist by its &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will stop the device (only effective if the device is streaming). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeUp()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume up with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeDown()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume down with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lux-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lux sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lux&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Lux level for light sensors.&lt;br /&gt;
* &#039;&#039;&#039;updateLux(lux)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;onkyo-receiver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Onkyo receiver ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;onkyoEISCPCommand(command)&#039;&#039;&#039;. &#039;&#039;Function&#039;&#039;. Sends an EISP command to the Onkyo receiver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;opentherm-gateway&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenTherm gateway ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-smart-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== P1 Smart meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usage1&#039;&#039;&#039;, &#039;&#039;&#039;usage2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;return1&#039;&#039;&#039;, &#039;&#039;&#039;return2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateP1(usage1, usage2, return1, return2, cons, prod)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Updates the device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usageDelivered&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;percentage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Percentage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;percentage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePercentage(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;philips-hue-light&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Philips Hue Light ====&lt;br /&gt;
&lt;br /&gt;
See switch below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pressure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Pressure ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pressure&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePressure(pressure)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Rain meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;rain&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; (please note that this does return the rain total for today)&lt;br /&gt;
* &#039;&#039;&#039;rainRate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateRain(rate, counter)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (rate in mm * 100 per hour, counter is total in mm) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rgbww-lighting-limitlessapplamp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== RGBW(W) / Lighting Limitless/Applamp ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;decreaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;getColor()&#039;&#039;&#039;; &#039;&#039;Function&#039;&#039;. Returns table with color attributes or nil when color field of device is not set.&lt;br /&gt;
* &#039;&#039;&#039;increaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setColor(r, g, b, br, cw, ww, m, t)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required, others optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. Meaning and limits of parms can be found [https://wiki.domoticz.com/Domoticz_API/JSON_URL&#039;s#Set_a_light_to_a_certain_color_or_color_temperature here].&lt;br /&gt;
* &#039;&#039;&#039;setColorBrightness()&#039;&#039;&#039;: same as setColor&lt;br /&gt;
* &#039;&#039;&#039;setDiscoMode(modeNum)&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setHex(r, g, b)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required (decimal Values 0-255). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setHue(hue, brightness, isWhite)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested Hue. Hue and brightness required. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setKelvin(Kelvin)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets Kelvin level of the light (For RGBWW devices only). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setNightMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to night mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setRGB(red, green, blue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the lamps RGB color. Values are from 0-255. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setWhiteMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to white mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scale-weight&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scale weight ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;weight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;udateWeight()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scene ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current scene-name to new scene-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-panel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Security Panel ====&lt;br /&gt;
&lt;br /&gt;
Create a security device:&lt;br /&gt;
&lt;br /&gt;
# Set a security panel password in Domoticz settings.&lt;br /&gt;
# Activate the security panel (&#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Security Panel&#039;&#039;&#039; and set it to &#039;&#039;&#039;Disarm&#039;&#039;&#039; (using your password)).&lt;br /&gt;
# Go to the device list in (&#039;&#039;&#039;Setup &amp;amp;gt; Devices&#039;&#039;&#039;) where it should show the security panel device under ‘Not used’.&lt;br /&gt;
# Add the device and give it a name.&lt;br /&gt;
&lt;br /&gt;
Methods/attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;armAway()&#039;&#039;&#039;: Sets a security device to Armed Away. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;armHome()&#039;&#039;&#039;: Sets a security device to Armed Home. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;disarm()&#039;&#039;&#039;: Disarms a security device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;: Same values as domoticz.security value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;smoke-detection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Smoke detection ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;activate()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;reset()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;solar-radiation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Solar radiation ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;radiation&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In Watt/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;updateRadiation(radiation)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;soil-moisture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Soil moisture ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;moisture&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In centibars (cB).&lt;br /&gt;
* &#039;&#039;&#039;updateSoilMoisture(moisture)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sound-level&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sound level ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In dB.&lt;br /&gt;
* &#039;&#039;&#039;updateSoundLevel(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;switch-dimmer-selector-etc.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Switch (dimmer, selector etc.) ====&lt;br /&gt;
&lt;br /&gt;
There are many switch-like devices. Not all methods are applicable for all switch-like devices. You can always use the generic &amp;lt;code&amp;gt;setState(newState)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;close()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Close if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;dimTo(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch a dimming device on and/or dim to the specified level. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;lastLevel&#039;&#039;&#039;: Number. The level of a dimmer just before it was switched off. &#039;&#039;&#039;Note: lastLevel only shows you the previous level if you have a trigger for the device itself. So for instance you have a on-trigger for ‘myDimmer’ and the dimmer is set from 20% to 30%, in your script &amp;lt;code&amp;gt;myDimmer.level == 30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myDimmer.lastLevel == 20&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. For dimmers and other ‘Set Level..%’ devices this holds the level like selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelActions&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. |-separated list of url actions for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current level name for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelNames&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Table holding the level names for selector switch devices.&lt;br /&gt;
* &#039;&#039;&#039;levelVal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Specific for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;maxDimLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;open()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Open if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set deviceStatus to on without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set deviceStatus to off without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setLevel(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to a given level if it supports it (e.g. blinds percentage). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Stop if it supports it (e.g. blinds). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device off it is supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device on if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchSelector(&amp;amp;lt;[level]|[levelname] &amp;amp;gt;)&#039;&#039;&#039; : &#039;&#039;Function&#039;&#039;. Switches a selector switch to a specific level ( levelname or level(numeric) required ) levelname must be exact, for level the closest fit will be picked. See the edit page in Domoticz for such a switch to get a list of the values). Levelname is only supported when level 0 (“Off”) is not removed Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleSwitch()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Toggles the state of the switch (if it is togglable) like On/Off, Open/Close etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTemperature(temperature)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempBaro(temperature, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHumBaro(temperature, humidity, status, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. forecast can be domoticz.BARO_NOINFO, BARO_SUNNY, BARO_PARTLY_CLOUDY, BARO_CLOUDY, BARO_RAIN. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET, HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHum(temperature, humidity [, status] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET or HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Text ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateText(text)&#039;&#039;&#039;: Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-set-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat set point ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-operating-state-3.0.19&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat Operating state &amp;lt;sup&amp;gt;3.0.19&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-type-3-mertik-3.0.15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat type 3 (Mertik) &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-6-3.1.11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat 6 &amp;lt;sup&amp;gt;3.1.11&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Thermostat 6 devices come in several subtypes: Temp/Setpoint, Temp/Hum/Setpoint, Temp/Baro/Setpoint and Temp/Hum/Baro/Setpoint. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. The current set point.&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Mapped humidity status value (only for subtypes with humidity).&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update the set point. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update thermostat values. Parameters depend on the subtype:&lt;br /&gt;
** &#039;&#039;Temp/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Hum/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, nil, nil, barometer, forecast)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Hum/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;forecast&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;noinfo&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;sunny&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;partlycloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;cloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;rain&#039;&amp;lt;/code&amp;gt; or a numeric value. &lt;br /&gt;
*** &amp;lt;code&amp;gt;humidityStatus&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;dry&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;normal&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;comfortable&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;wet&#039;&amp;lt;/code&amp;gt; or a numeric value. If omitted with humidity provided, it is auto-calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;uv-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== UV sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uv&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. UV index.&lt;br /&gt;
* &#039;&#039;&#039;updateUV(uv)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. UV index. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;visibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Visibility ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;visibility&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In km.&lt;br /&gt;
* &#039;&#039;&#039;updateVisibility(distance)&#039;&#039;&#039;:Function*. In km. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;voltage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Voltage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;voltage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateVoltage(voltage)&#039;&#039;&#039;:Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;waterflow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Waterflow ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flow&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In L/m.&lt;br /&gt;
* &#039;&#039;&#039;updateWaterflow(flow)&#039;&#039;&#039;:Function*. In L/m. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wind ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;chill&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;direction&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Degrees.&lt;br /&gt;
* &#039;&#039;&#039;directionString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Formatted wind direction like N, SE.&lt;br /&gt;
* &#039;&#039;&#039;gust&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. ( in meters / second, might change in future releases to Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;gustMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Gust ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;speed&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in the unit set in Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;speedMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;updateWind(bearing, direction, speed, gust, temperature, chill)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Bearing in degrees, direction in N, S, NNW etc, speed in m/s, gust in m/s, temperature and chill in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;youless-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Youless meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;powerYield&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateYouless(total, actual)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zone-heating&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Zone heating ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;heatingMode&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-fan-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Fan mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-thermostat-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Thermostat mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-options-delay-duration-event-triggering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Command options (delay, duration, event triggering) ===&lt;br /&gt;
&lt;br /&gt;
Many dzVents device methods support extra options, like controlling a delay or a duration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    -- switch on for 2 minutes after 10 seconds&lt;br /&gt;
    device.switchOn().afterSec(10).forMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on at a specic time / day&lt;br /&gt;
    device.switchOn().at(&#039;09:00&#039;)                   -- earliest moment it will be 09:00 hr.&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on fri&#039;)         -- earliest moment it will be Friday at 08:53:30&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on sat, sun&#039;)    -- earliest moment it will be Saturday or Sunday at 08:53:30 (whatever comes first)&lt;br /&gt;
&lt;br /&gt;
    -- switch on for 2 minutes after a randomized delay of 1-10 minutes&lt;br /&gt;
    device.switchOff().withinMin(10).forMin(2)&lt;br /&gt;
    device.close().forMin(15)&lt;br /&gt;
    device.open().afterSec(20)&lt;br /&gt;
    device.open().afterMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on but do not trigger follow up events&lt;br /&gt;
    device.switchOn().silent()&lt;br /&gt;
&lt;br /&gt;
    -- flash a light for 3 times&lt;br /&gt;
    device.switchOn().forSec(2).repeatAfterSec(1, 3)&lt;br /&gt;
&lt;br /&gt;
    -- switch the device on but only if the current state isn&#039;t already on:&lt;br /&gt;
    device.switchOn().checkFirst()&lt;br /&gt;
    -- this is a short for:&lt;br /&gt;
    if (device.state == &#039;Off&#039;) then&lt;br /&gt;
        devices.switchOn()&lt;br /&gt;
    end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Options ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;at(hh:mm[:ss][ on [ ddd|dddd ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Activates the command at a certain time [ on a certain day]&lt;br /&gt;
* &#039;&#039;&#039;afterHour(hours), afterMin(minutes), afterSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command after a certain number of hours, minutes or seconds.&lt;br /&gt;
* &#039;&#039;&#039;cancelQueuedCommands()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Cancels queued commands. E.g. you switch on a device after 10 minutes: &amp;lt;code&amp;gt;myDevice.switchOn().afterMin(10)&amp;lt;/code&amp;gt;. Within those 10 minutes you can cancel that command by calling: &amp;lt;code&amp;gt;myDevice.cancelQueuedCommands()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;checkFirst()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Checks if the &#039;&#039;&#039;current&#039;&#039;&#039; state of the device is different than the desired new state. If the target state is the same, no command is sent. If you do &amp;lt;code&amp;gt;mySwitch.switchOn().checkFirst()&amp;lt;/code&amp;gt;, then no switch command is sent if the switch is already on. This command only works with switch-like devices. It is not available for toggle and dim commands, either.&lt;br /&gt;
* &#039;&#039;&#039;forHour(hours), forMin(minutes), forSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command for the duration of hours, minutes or seconds. See table below for applicability and the warning on unexpected behavior of these functions.&lt;br /&gt;
* &#039;&#039;&#039;withinHour(hours), withinMin(minutes), withinSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command within a certain period (specified in hours, minutes or seconds) &#039;&#039;randomly&#039;&#039;. See table below for applicability.&lt;br /&gt;
* &#039;&#039;&#039;silent()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. No follow-up events will be triggered: &amp;lt;code&amp;gt;mySwitch.switchOff().silent()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;repeatAfterHour(hours, [number]), repeatAfterMin(minutes, [number]), repeatAfterSec(seconds, [number])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Repeats the sequence &#039;&#039;number&#039;&#039; times after the specified duration (specified in hours, minutes, or seconds). If no &#039;&#039;number&#039;&#039; is provided, 1 is used. &#039;&#039;&#039;Note that &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; are only applied at the beginning of the sequence and not between the repeats!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the actual switching or changing of the device is done by Domoticz and not by dzVents. dzVents only tells Domoticz what to do; if the options are not carried out as expected, this is likely a Domoticz or hardware issue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note when using forAAA()&#039;&#039;&#039;: Let’s say you have a light that is triggered by a motion detector. Currently the light is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt; and you do this: &amp;lt;code&amp;gt;light.switchOn().forMin(5)&amp;lt;/code&amp;gt;. What happens inside Domoticz is this: at t&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; Domoticz issues the &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command and schedules a command to restore the &#039;&#039;&#039;current&#039;&#039;&#039; state at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; which is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt;. So at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; it will switch the light off.&lt;br /&gt;
&lt;br /&gt;
If, however, &#039;&#039;before the scheduled &amp;lt;code&amp;gt;switchOff()&amp;lt;/code&amp;gt; happens at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&#039;&#039;, new motion is detected and you send this command again at t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; then something unpredictable may seem to happen: &#039;&#039;the light is never turned off!&#039;&#039; This is what happens:&lt;br /&gt;
&lt;br /&gt;
At t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; Domoticz receives the &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; command again. It sees a scheduled command at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; and deletes that command (it is within the new interval). Then Domoticz performs the (unnecessary, it’s already on) &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command. Then it checks the current state of the light which is &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;!! and schedules a command to return to that state at t&amp;lt;sub&amp;gt;2+5&amp;lt;/sub&amp;gt;=t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;. So, at t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; the light is switched on again. And there you have it: the light is not switched off and never will be because future commands will always be checked against the current on-state.&lt;br /&gt;
&lt;br /&gt;
That’s just how it works and you will have to deal with it in your script. So, instead of simply re-issuing &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; you have to check the switch’s state first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;if (light.active) then&lt;br /&gt;
    light.switchOff().afterMin(5)&lt;br /&gt;
else&lt;br /&gt;
    light.switchOn().forMin(5)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or issue these two commands &#039;&#039;both&#039;&#039; as they are mutually exclusive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;light.switchOff().checkFirst().afterMin(5)&lt;br /&gt;
light.switchOn().checkFirst().forMin(5)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Availability ====&lt;br /&gt;
&lt;br /&gt;
Some options are not available to all commands. All the options are available to device switch-like commands like &amp;lt;code&amp;gt;myDevice.switchOff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myGroup.switchOn()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;myBlinds.open()&amp;lt;/code&amp;gt;. For updating (usually Dummy ) devices like a text device &amp;lt;code&amp;gt;myTextDevice.updateText(&#039;zork&#039;)&amp;lt;/code&amp;gt; you can only use &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;. For thermostat setpoint devices and snapshot command silent() is not available. For commands for which dzVents must use openURL, only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; methods are available. These commands are mainly the setAaaaa() commands for RGBW type devices.&lt;br /&gt;
&lt;br /&gt;
See table below&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| option&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| state changes&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;11%&amp;quot;| update commands&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| user variables&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| updateSetpoint&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;8%&amp;quot;| snapshot&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| triggerIFTTT&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| execute ShellCommand&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| emitEvent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repeatAfterAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkFirst()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| • &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancelQueuedCommands()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;span id=&amp;quot;notes-on-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Notes on table ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note 1&#039;&#039;&#039;: AAA is a placeholder for &amp;lt;code&amp;gt;Min/Sec/Hour&amp;lt;/code&amp;gt; affix e.g. &amp;lt;code&amp;gt;afterMin()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Note 2&#039;&#039;&#039;: for &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; is available.&lt;br /&gt;
* &#039;&#039;&#039;Note 3&#039;&#039;&#039;: Note 2 also applies for all commands depending on openURL (like rgbwwDevice.setAaa() commands).&lt;br /&gt;
* &#039;&#039;&#039;Note 4&#039;&#039;&#039;: Including dimTo, switchSelector, setLevel and similar methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;follow-up-event-triggers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Follow-up event triggers ====&lt;br /&gt;
&lt;br /&gt;
Normally if you issue a command, Domoticz will immediately trigger follow-up events, and dzVents will automatically trigger defined event scripts. If you trigger a scene, all devices in that scene will issue a change event. If you have event triggers for these devices, they will be executed by dzVents. If you don’t want this to happen, add &amp;lt;code&amp;gt;.silent()&amp;lt;/code&amp;gt; to your commands (exception is updateSetPoint).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-your-own-device-adapter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create your own device adapter ===&lt;br /&gt;
&lt;br /&gt;
If your device is not recognized by dzVents, you can still operate it using the generic device attributes and methods. It is much nicer, however, to have device specific attributes and methods. Existing recognized adapters are in &amp;lt;code&amp;gt;/path/to/domoticz/dzVents/runtime/device-adapters&amp;lt;/code&amp;gt;. Copy an existing adapter and adapt it to your needs. You can turn debug logging on and inspect the file &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; in the dzVents folder. There you will find the unique signature for your device type. Usually it is a combination of deviceType and deviceSubType, but you can use any of the device attributes in the &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; function. The matches function checks if the device type is suitable for your adapter and the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; function actually creates your specific attributes and methods. Also, if you call &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; you will see all attributes and methods and the attribute &amp;lt;code&amp;gt;_adapters&amp;lt;/code&amp;gt; shows you a list of applied adapters for that device. Finally, register your adapter in &amp;lt;code&amp;gt;Adapters.lua&amp;lt;/code&amp;gt;. Please share your adapter when it is ready and working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-object-api-user-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Variable object API (user variables) ==&lt;br /&gt;
&lt;br /&gt;
User variables created in Domoticz have these attributes and methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Was the variable updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.DATE. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the variable.&lt;br /&gt;
* &#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the variable&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current variable name to new variable name. (does not support timing options)&lt;br /&gt;
* &#039;&#039;&#039;set(value)&#039;&#039;&#039;: Tells Domoticz to update the variable. Supports timing options. See [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|above]].&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.TIME. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Can be domoticz.INTEGER, domoticz.FLOAT, domoticz.STRING, domoticz.DATE, domoticz.TIME.&lt;br /&gt;
* &#039;&#039;&#039;value&#039;&#039;&#039;: &#039;&#039;String|Number|Date|Time&#039;&#039;. Value of the variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
	on =&lt;br /&gt;
	{&lt;br /&gt;
		timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	execute = function(domoticz)&lt;br /&gt;
		-- check time of the day&lt;br /&gt;
		if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
			domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time object ==&lt;br /&gt;
&lt;br /&gt;
Many attributes represent a moment in time, like &amp;lt;code&amp;gt;myDevice.lastUpdate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.time&amp;lt;/code&amp;gt;. In dzVents, a time-like attribute is an object with properties and methods which make your life easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    print(myDevice.lastUpdate.minutesAgo)&lt;br /&gt;
    print(myDevice.lastUpdate.daysAgo)&lt;br /&gt;
&lt;br /&gt;
    -- compare two times&lt;br /&gt;
    print(domoticz.time.compare(myDevice.lastUpdate).secs))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can also create your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;) -- must be this format!!&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you don’t pass a time string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local currentTime = Time()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use this in combination with the various dzVents time attributes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;)&lt;br /&gt;
&lt;br /&gt;
    local tonight = Time(domoticz.time.rawDate .. &#039; 20:00:00&#039;)&lt;br /&gt;
    print (tonight.getISO())&lt;br /&gt;
    -- will print something like: 2016-12-12T20:00:00Z&lt;br /&gt;
    print(t.minutesAgo) -- difference from &#039;now&#039; in minutes&lt;br /&gt;
&lt;br /&gt;
    -- and you can feed it with all same rules as you use&lt;br /&gt;
    -- for the timer = { .. } section:&lt;br /&gt;
    if (t.matchesRule(&#039;at 16:00-21:00&#039;)) then&lt;br /&gt;
        -- t is in between 16:00 and 21:00&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- very powerful if you want to compare two time instances:&lt;br /&gt;
    local anotherTime = Time(&#039;...&#039;) -- fill-in some time here&lt;br /&gt;
    print(t.compare(anotherTime).secs) -- diff in seconds between t and anotherTime.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System event API ===&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a system-event in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;system&#039;&#039; object. The object.type = system-event that triggered the script. ( object.isSystemEvent: true) For backups the object also contains location and durationin seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-properties-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Time properties and methods ===&lt;br /&gt;
&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local Time = require(&#039;Time&#039;)&lt;br /&gt;
local now = Time() -- current time&lt;br /&gt;
local someTime = Time(&#039;2017-12-31 22:19:15&#039;)&lt;br /&gt;
local utcTime = Time(&#039;2017-12-31 22:19:15&#039;, true)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local someTime = domoticz.time.addMinutes(30) -- someTime = domoticz time object for now + 30 minutes&lt;br /&gt;
local someTime = domoticz.time.makeTime() -- someTime = new domoticz time object.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;addAAA(offset)&#039;&#039;&#039;: &#039;&#039;time object&#039;&#039;. time object with given offset (positive or negative. AAA is a placeholder for &amp;lt;code&amp;gt;Seconds, Minutes, Hours or Days&amp;lt;/code&amp;gt; affix e.g. `addHours(-2)&lt;br /&gt;
* &#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightEnd.&lt;br /&gt;
* &#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;:&#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightStart.&lt;br /&gt;
* &#039;&#039;&#039;compare(time)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Compares the current time object with another time object. &#039;&#039;Make sure you pass a Time object!&#039;&#039; Returns a table (all values are &#039;&#039;positive&#039;&#039;, use the compare property to see if &#039;&#039;time&#039;&#039; is in the past or future):&lt;br /&gt;
** &#039;&#039;&#039;milliseconds&#039;&#039;&#039;: Total difference in milliseconds.&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: Total difference in whole seconds.&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: Total difference in whole minutes.&lt;br /&gt;
** &#039;&#039;&#039;hours&#039;&#039;&#039;: Total difference in whole hours.&lt;br /&gt;
** &#039;&#039;&#039;days&#039;&#039;&#039;: Total difference in whole days.&lt;br /&gt;
** &#039;&#039;&#039;compare&#039;&#039;&#039;: 0 = both are equal, 1 = &#039;&#039;time&#039;&#039; is in the future, -1 = &#039;&#039;time&#039;&#039; is in the past.&lt;br /&gt;
* &#039;&#039;&#039;dateToDate( dateString, sourceFormat, targetFormat[ , offSet] )&#039;&#039;&#039;:&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: Returns a reformatted datestring. dateString is a formatted date and source- and targetFormat are representations of the dateString elements and their locations in the string (see examples in dateToTimestamp) . Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;dddd dd mmmm hh:MM:ss&#039;, 1 )              -- &amp;gt; &#039;Friday 31 December 23:31:06&#039;&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;ddd dd mmm hh:MM:ss&#039;, -3600 * 24 - 3 ))  -- &amp;gt; &#039;Thu 30 Dec 23:31:02&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dateToTimestamp([ dateString [,control] ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &#039;&#039;Number&#039;&#039; representing time since epoch in seconds. dateString is a formatted date and control is a representation of the dateString elements and their location in the string. Default control is ‘yyyy-mm-dd hh:MM’. recognized controls are either a Lua pattern string or a string containing following codes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        dddd -- full weekdayname(e.g. Wednesday) language depends on locale&lt;br /&gt;
        ddd  -- abbreviated weekdayname(e.g. Wed) language depends on locale&lt;br /&gt;
        dd   -- day of the month {[01-31]&lt;br /&gt;
        mmmm -- full monthname(e.g September) language depends on locale&lt;br /&gt;
        mmm  -- abbreviated monthname(e.g. Sep) language depends on locale&lt;br /&gt;
        mm   -- month [01-12]&lt;br /&gt;
        yyyy -- 4 digit year&lt;br /&gt;
        yy   -- 2 digit year&lt;br /&gt;
        hh   -- hour 24-hour clock&lt;br /&gt;
        ii   -- hour 12-hour clock&lt;br /&gt;
        MM   -- minute&lt;br /&gt;
        ss   -- second&lt;br /&gt;
        W    -- weeknumber [01-53]&lt;br /&gt;
        w    -- weekday{[0-6] Sunday-Saturday&lt;br /&gt;
        datm -- date and time (e.g. 09/16/98 23:48:10) format depends on locale&lt;br /&gt;
        mer  -- either &amp;quot;AM&amp;quot; or &amp;quot;PM&amp;quot; locale&lt;br /&gt;
        date -- date(e.g. 09/16/98) format depends on locale&lt;br /&gt;
        time -- time (e.g. 23:48:10)&lt;br /&gt;
&lt;br /&gt;
        -- examples:&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59&#039;))                                                      -- &amp;gt; 1609455540&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:01&#039;,&#039;yyyy-mm-dd hh:MM:ss&#039;))                             -- &amp;gt; 1609455541&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;December 31, 23:59:02&#039;,&#039;mmmm dd, hh:MM:ss&#039;))                             -- &amp;gt; 1609455542&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:03&#039;,&#039;(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)&#039; ))  -- &amp;gt; 1609455543&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;20201231235904&#039;,&#039;(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)&#039;))             -- &amp;gt; 1609455544&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayAbbrOfWeek&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. sun,mon,tue,wed,thu,fri or sat&lt;br /&gt;
* &#039;&#039;&#039;daysAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. complete name Sunday, Monday, etc&lt;br /&gt;
* &#039;&#039;&#039;dDate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. timestamp (seconds since 01/01/1970 00:00)&lt;br /&gt;
* &#039;&#039;&#039;getISO&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the ISO 8601 formatted date.&lt;br /&gt;
* &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;hoursAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of hours since the last update.&lt;br /&gt;
* &#039;&#039;&#039;isdst&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Indicates if time is in the daylight saving period&lt;br /&gt;
* &#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if time is today&lt;br /&gt;
* &#039;&#039;&#039;isUTC&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;makeTime(string | table,[isUTC])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. isUTC defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;matchesRule(rule) &#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns true if the rule matches with the time. See [[#timer_trigger_rules|time trigger rules]] for rule examples.&lt;br /&gt;
* &#039;&#039;&#039;millisecondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;minutesAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutesSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;monthAbbrName&#039;&#039;&#039;: String. jan, feb, mar, etc&lt;br /&gt;
* &#039;&#039;&#039;monthName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. January, February, etc&lt;br /&gt;
* &#039;&#039;&#039;msAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;raw&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Generated by Domoticz&lt;br /&gt;
* &#039;&#039;&#039;rawDate&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the date part of the raw data.&lt;br /&gt;
* &#039;&#039;&#039;rawDateTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Combined date / time formatted as domoticz does in API / JSON returns (rawDate .. ’ ’.. rawTime )&lt;br /&gt;
* &#039;&#039;&#039;rawTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM:SS&lt;br /&gt;
* &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunset.&lt;br /&gt;
* &#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunrise.&lt;br /&gt;
* &#039;&#039;&#039;solarnoonInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; Minutes from midnight until solarnoon.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM&lt;br /&gt;
* &#039;&#039;&#039;timestampToDate([ [ timestamp ] , [ pattern ] ,[ offSet ] )&#039;&#039;&#039;: &#039;&#039;function&#039;&#039;. Returns a datestring. timestamp is number of seconds since epoch (default = now) , pattern is a string as explained in this wiki at the description of the domoticz.time.dateToTimestamp function (default = ‘yyyy-mm-dd hh:MM:ss’). Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.timestampToDate(10,&#039;date time&#039;)                               --&amp;gt; &#039;01/01/70 01:00:10&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(60,&#039;ddd mm mmm yyyy ii:MM mer&#039;,&#039;date time&#039;)   --&amp;gt; &#039;Thu 01 Jan 1970 01:01 AM&#039;&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(1598077445,&#039;dd/mm/yy ii:MM mer nZero&#039;)        --&amp;gt; &#039;22/08/20 8:24 AM&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;toUTC(string | table,[offset])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. &amp;lt;sup&amp;gt;3.0.9&amp;lt;/sup&amp;gt; returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. offset defaults to 0.&lt;br /&gt;
* &#039;&#039;&#039;utcSystemTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. UTC system time (only when in UTC mode):&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;utcTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Time stamp in UTC time:&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; day of the week. Sunday = 1, Saturday = 7&lt;br /&gt;
* &#039;&#039;&#039;week&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; week of the year&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: it is currently not possible to change the domoticz.time object instance.&#039;&#039;&#039; ( but you can create a new one with- or without an offset)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shared-helper-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Shared helper functions ==&lt;br /&gt;
&lt;br /&gt;
It is not unlikely that at some point you want to share Lua code among your scripts. Normally in Lua you would have to create a module and require that module in all you scripts. But dzVents makes that easier for you: Inside your scripts folder or in Domoticz’ GUI web editor, create a &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; script (same as for global persistent data) and feed it with this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
        end,&lt;br /&gt;
        MY_CONSTANT = 100 -- doesn&#039;t have to be a function&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the file and then you can use myHandyFunction everywhere in your event scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(&#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
        print(domoticz.helpers.MY_CONSTANT)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt; is needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note: if you need to access the domoticz object in your helper function you have to pass it as a parameter:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(domoticz, param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
            domoticz.log(&#039;Hey&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And pass it along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(domoticz, &#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only &#039;&#039;&#039;one&#039;&#039;&#039; &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requiring-your-own-modules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Requiring your own modules ==&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use the helpers support, but you want to require your own modules, place them either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/modules&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/modules&amp;lt;/code&amp;gt; as these folders are already added to the Lua package path. You can just require those modules: &amp;lt;code&amp;gt;local myModule = require(&#039;myModule&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;persistent-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Persistent data =&lt;br /&gt;
&lt;br /&gt;
In many situations you need to store a device state or other information in your scripts for later use. Like knowing what the state was of a device the previous time the script was executed or what the temperature in a room was 10 minutes ago. Without dzVents, you had to resort to user variables. These are global variables that you create in the Domoticz GUI and that you can access in your scripts like: domoticz.variables(‘previousTemperature’).&lt;br /&gt;
&lt;br /&gt;
Now, for some this is rather inconvenient and they want to control this state information in the event scripts themselves or want to use all of Lua’s variable types. dzVents has a solution for that: &#039;&#039;&#039;persistent script data&#039;&#039;&#039;. This can either be on the script level or on a global level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-level-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Script level persistent variables ==&lt;br /&gt;
&lt;br /&gt;
The values in persistent script variables persist and can be retrieved in the next script run.&lt;br /&gt;
&lt;br /&gt;
For example, send a notification if a switch has been activated 5 times:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = { &#039;MySwitch&#039; }&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            counter = { initial = 0 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (domoticz.data.counter == 5) then&lt;br /&gt;
            domoticz.notify(&#039;The switch was pressed 5 times!&#039;)&lt;br /&gt;
            domoticz.data.counter = 0 -- reset the counter&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.data.counter = domoticz.data.counter + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; section defines a persistent variable called &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;. It also defines an initial value. From then on you can read and set the variable in your script.&lt;br /&gt;
&lt;br /&gt;
You do not have to provide an initial value though. In that case the initial value is &#039;&#039;nil&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        --&lt;br /&gt;
        data = {&lt;br /&gt;
            &#039;x&#039;, &#039;y&#039;, &#039;z&#039; -- note the quotes&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, item)&lt;br /&gt;
            print(tostring(domoticz.data.x)) -- prints nil&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can define as many variables as you like and put whatever value in there that you like. It doesn’t have to be just a number. Just don’t put something in there with functions (well, they are filtered out actually).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-matters-and-watch-your-speed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size matters and watch your speed!! ===&lt;br /&gt;
&lt;br /&gt;
If you include tables (or arrays) in the persistent data, beware to not let them grow. It will definitely slow down script execution because dzVents has to serialize and deserialize the data. It is better to use the historical option as described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;re-initializing-a-variable&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Re-initializing a variable ===&lt;br /&gt;
&lt;br /&gt;
You can re-initialize a persistent variable and re-apply the initial value as defined in the data section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { .. },&lt;br /&gt;
    data = {&lt;br /&gt;
        x = { initial = &#039;initial value&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (domoticz.data.x ~= &#039;initial value&#039;) then&lt;br /&gt;
            domoticz.data.initialize(&#039;x&#039;)&lt;br /&gt;
            print(domoticz.data.x) -- will print &#039;initial value&#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; is just a convenience method. You can of course create a local variable in your module holding the initial value and use it in your data section and your execute function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;global-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Global persistent variables ==&lt;br /&gt;
&lt;br /&gt;
Script level variables are only available in the scripts that define them, but global variables can be accessed and changed in every script. To utilize global persistent variables, create a script file called &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; in your scripts folder with this content (same file where you can also put your shared helper functions):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        helpers = {},&lt;br /&gt;
        data = {&lt;br /&gt;
            peopleAtHome = { initial = false },&lt;br /&gt;
            heatingProgramActive = { initial = false }&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just define the variables that you need and access them in your scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;WindowSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, windowSensor)&lt;br /&gt;
            if (domoticz.globalData.heatingProgramActive&lt;br /&gt;
                and windowSensor.state == &#039;Open&#039;) then&lt;br /&gt;
                domoticz.notify(&amp;quot;Hey don&#039;t open the window when the heating is on!&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only one &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;domoticz.globalData.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; just as like &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a-special-kind-of-persistent-variables-history-true-historical-variables-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== A special kind of persistent variables: &#039;&#039;history = true&#039;&#039; (Historical variables API) ==&lt;br /&gt;
&lt;br /&gt;
In some situations, storing a previous value for a sensor is not enough, and you would like to have more previous values. For example, you want to calculate an average over several readings. Of course you can define a persistent variable holding a table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            previousData = { initial = {} }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            table.insert(domoticz.data.previousData, sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- calculate the average&lt;br /&gt;
            local sum = 0, count = 0&lt;br /&gt;
            for i, temp in pairs(domoticz.data.previousData) do&lt;br /&gt;
                sum = sum + temp&lt;br /&gt;
                count = count + 1&lt;br /&gt;
            end&lt;br /&gt;
            local average = sum / count&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The problem with this is that you have to do a lot of bookkeeping to make sure that there isn’t too much data to store (see [[#How_does_the_storage_stuff_work.3F|below for how it works]]) . Fortunately, dzVents has done this for you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            temperatures = { history = true, maxItems = 10 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            domoticz.data.temperatures.add(sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- average&lt;br /&gt;
            local average = domoticz.data.temperatures.avg()&lt;br /&gt;
&lt;br /&gt;
            -- maximum value in the past hour:&lt;br /&gt;
            local max = domoticz.data.temperatures.maxSince(&#039;01:00:00&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;defining&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Defining ===&lt;br /&gt;
&lt;br /&gt;
Define a script variable or global variable in the data section and set &amp;lt;code&amp;gt;history = true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    …&lt;br /&gt;
    data = {&lt;br /&gt;
        var1 = { history = true, maxItems = 10, maxHours = 1, maxMinutes = 5 }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;maxItems&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Controls how many items are stored in the variable. maxItems has precedence over maxHours and maxMinutes.&lt;br /&gt;
* &#039;&#039;&#039;maxHours&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Data older than &amp;lt;code&amp;gt;maxHours&amp;lt;/code&amp;gt; from now will be discarded. E.g., if set to 2, then data older than 2 hours will be removed at the beginning of the script.&lt;br /&gt;
* &#039;&#039;&#039;maxMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as maxHours but, you guessed it: for minutes this time.. All these options can be combined. &#039;&#039;&#039;Reminder: don’t store too much data. Only put in what you really need!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adding-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Adding data ===&lt;br /&gt;
&lt;br /&gt;
Add new values to a historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz.data.myVar.add(value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As soon as this new value is put on top of the list, the older values shift one place down the line. If &amp;lt;code&amp;gt;maxItems&amp;lt;/code&amp;gt; is reached, then the oldest value will be discarded. &#039;&#039;All methods, like calculating averages or sums, will immediately use this new value!&#039;&#039; If you don’t want this to happen, set the new value at the end of your script or after you have done your analysis.&lt;br /&gt;
&lt;br /&gt;
Any kind of data may be stored in the historical variable: numbers, strings, but also more complex data like tables. However, in order to use the [[#Statistical_functions|statistical methods]], numeric values are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;accessing-values-in-historical-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Accessing values in historical variables ===&lt;br /&gt;
&lt;br /&gt;
Values in a historical variable are indexed, where index 1 is the newest value, 2 is the second newest, and so on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.get(5)&lt;br /&gt;
print(item.data)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, all data in the storage are time-stamped:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.getLatest()&lt;br /&gt;
print(item.time.secondsAgo) -- access the time stamp&lt;br /&gt;
print(item.data) -- access the data&amp;lt;/pre&amp;gt;&lt;br /&gt;
The time attribute by itself is a table with many properties that help you inspect the data points more easily. See [[#Time_object|Time Object]] for all attributes and methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Index ====&lt;br /&gt;
&lt;br /&gt;
All data in the set can be addressed using an index. The item with index = 1 is the youngest, and the item with the highest index is the oldest. Beware, if you have called &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; first, then the first item is that new value! You can always check the size of the set by inspecting &amp;lt;code&amp;gt;myVar.size&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-specification-timeago&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Time specification (&#039;&#039;timeAgo&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
Every data point in the set has a timestamp and the set is ordered so that the youngest item is the first and the oldest item the last. Many functions require a moment in the past to be specified by passing a string in the format &#039;&#039;&#039;&amp;lt;code&amp;gt;hh:mm:ss&amp;lt;/code&amp;gt;&#039;&#039;&#039;, where &#039;&#039;hh&#039;&#039; is the number of hours ago, &#039;&#039;mm&#039;&#039; the number of minutes and &#039;&#039;ss&#039;&#039; the number of seconds. The times are added together, so you don’t have to consider 60 minute boundaries, etc. A time specification of &amp;lt;code&amp;gt;12:88:03&amp;lt;/code&amp;gt; is valid, and points to the data point at or around &amp;lt;code&amp;gt;12*3600 + 88*60 + 3 = 48.483 seconds&amp;lt;/code&amp;gt; in the past.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- get average for the past 30 minutes:&lt;br /&gt;
local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-data-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Getting data points ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get(idx)&#039;&#039;&#039;: Returns the idx-th item in the set. Same as &amp;lt;code&amp;gt;myVar.storage[idx]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getAtTime([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Returns the data point &#039;&#039;closest&#039;&#039; to the moment as specified by &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; and the index in the set. So, &amp;lt;code&amp;gt;myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt; returns the item that is closest to one hour old. It may be a bit younger or a bit older than 1 hour. The second return value is the index in the set: &amp;lt;code&amp;gt;local item, index = myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;getLatest( )&#039;&#039;&#039;: Returns the youngest item in the set. Same as &amp;lt;code&amp;gt;print(myVar.get(1).data)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getOldest( )&#039;&#039;&#039;: Returns the oldest item in the set and the index. Same as &amp;lt;code&amp;gt;print(myVar.get(myVar.size).data)&amp;lt;/code&amp;gt;. Note that the index is always the same as the total size. &amp;lt;code&amp;gt;local item, index = myVar.getOldest()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;: Return the number of data points in the set.&lt;br /&gt;
* &#039;&#039;&#039;subset( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns a subset of the stored data. Default value, if omitted, of &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; is 1. Omitting &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt; takes all items until the end of the set (oldest). E.g., &amp;lt;code&amp;gt;myVar.subset()&amp;lt;/code&amp;gt; returns all data. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;subsetSince( [[#Time_specification_.28timeAgo.29|timeAgo]] )&#039;&#039;&#039;: Returns a subset of the stored data since the relative time specified by timeAgo. So calling &amp;lt;code&amp;gt;myVar.subsetSince(&#039;00:60:00&#039;)&amp;lt;/code&amp;gt; returns all items that have been added to the list in the past 60 minutes. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reset( )&#039;&#039;&#039;: Removes all the items from the set. It could be a good practice to do this often when you know you don’t need older data. For instance, when you turn on a heater and you just want to monitor rising temperatures starting from this moment when the heater is activated. If you don’t need data points from before, then you may call reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-data-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Looping through the data: iterators ====&lt;br /&gt;
&lt;br /&gt;
Similar to the iterators as described [[#Looping_through_the_collections:_iterators|above]], there are convenience methods to make looping through the data set easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Loop over all items in the set: E.g.: &amp;lt;code&amp;gt;myVar.forEach( function( item, index, collection) ... end )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;filter(function)&#039;&#039;&#039;: Create a filtered set of items. The function receives the item and returns true if the item is in the result set. E.g. get a set with item values larger than 20: &amp;lt;code&amp;gt;subset = myVar.filter( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Search for a specific item in the set: E.g. find the first item with a value higher than 20: &amp;lt;code&amp;gt;local item = myVar.find( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the set and do some calculation with it. You call reduce with the function and the initial value. Each iteration the function is called with the accumulator. The function does something with the accumulator and returns a new value for it. Once you get the hang of it, it is very powerful. Best to give an example. To sum all values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        local sum = myVar.reduce(function(acc, item)&lt;br /&gt;
            local value = item.data&lt;br /&gt;
        return acc + value&lt;br /&gt;
        end, 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Suppose you want to get data points older than 45 minutes and count the values that are higher than 20 (of course there are more ways to do this):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myVar = domoticz.data.myVar&lt;br /&gt;
&lt;br /&gt;
    local olderItems = myVar.filter(function (item)&lt;br /&gt;
        return (item.time.minutesAgo &amp;gt; 45)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    local count = olderItems.reduce(function(acc, item)&lt;br /&gt;
        if (item.data &amp;gt; 20) then&lt;br /&gt;
            acc = acc + 1&lt;br /&gt;
        end&lt;br /&gt;
        return acc&lt;br /&gt;
    end, 0)&lt;br /&gt;
&lt;br /&gt;
    print(&#039;Found &#039; .. tostring(count) .. &#039; items&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;statistical-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Statistical functions ====&lt;br /&gt;
&lt;br /&gt;
Statistical functions require &#039;&#039;numerical&#039;&#039; data in the set. If the set is just numbers you can do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add(myDevice.temperature) -- adds a number to the set&lt;br /&gt;
myVar.avg() -- returns the average&amp;lt;/pre&amp;gt;&lt;br /&gt;
If, however, you add more complex data or you want to do a computation first, then you have to &#039;&#039;tell dzVents how to get a numeric value from these data&#039;&#039;. So let’s say you do this to add data to the set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add( { &#039;person&#039; = &#039;John&#039;, waterUsage = u })&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; is a variable that got its value earlier. If you want to calculate the average water usage, then dzVents will not be able to do this because it doesn’t know the value is actually in the &amp;lt;code&amp;gt;waterUsage&amp;lt;/code&amp;gt; attribute! You will get &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To make this work you have to provide a &#039;&#039;&#039;getValue function&#039;&#039;&#039; in the data section when you define the historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {...},&lt;br /&gt;
        data = {&lt;br /&gt;
        myVar = {&lt;br /&gt;
            history = true,&lt;br /&gt;
            maxItems = 10,&lt;br /&gt;
            getValue = function(item)&lt;br /&gt;
                return item.data.waterUsage -- return number!!&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function()...end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This function tells dzVents how to get the numeric value for a data item. &#039;&#039;&#039;Note: the &amp;lt;code&amp;gt;getValue&amp;lt;/code&amp;gt; function has to return a number!&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you don’t intend to use any of these statistical functions you can put whatever you want in the set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avg( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the average of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avgSince([[#Time_specification_.28timeAgo.29|timeAgo]], default )&#039;&#039;&#039;: Calculates the average of all data points since &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt;. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there are no data, otherwise 0. E.g.: &amp;lt;code&amp;gt;local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/code&amp;gt; returns the average over the past 30 minutes.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;med( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the median of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;min( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the lowest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;minSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;min&#039;&#039;&#039; but now within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;max( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the highest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;maxSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;max&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sum( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the summation of all values in the range defined by fromIdx and toIdx. It will return 0 when there are no data.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sumSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;sum&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. It will return 0 when there are no data in the interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;** delta(fromIdx, toIdx, [smoothRange], [default] )**: Returns the delta (difference) between items specified by &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. Provide a valid range (no &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values). [Supports data smoothing]. (#Data_smoothing) when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there is not enough data. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta(2, 5, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;delta2( fromIdx, toIdx, [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but now you can control if the smooth values for the &#039;&#039;from-item&#039;&#039; and the &#039;&#039;to-item&#039;&#039; separately. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta2(2, 5, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSince([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRange], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSince(&#039;00:00:10&#039;, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSinceOrOldest([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;deltaSince&#039;&#039;&#039; but it will take the oldest value in the set if &#039;&#039;timeAgo&#039;&#039; is older than the age of the entire set. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSinceOrOldest(&#039;00:00:10&#039;, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;: Returns the first minimum value (and the item holding the minimal value) in the past. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. For example, given this range of values in the data set (from new to old): &amp;lt;code&amp;gt;10 8 7 5 3 4 5 6&amp;lt;/code&amp;gt;, it will return &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; because older values &#039;&#039;and&#039;&#039; newer values are higher: a local minimum. Use this if you want to know at what time a temperature started to rise after it had been dropping. E.g.:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; local value, item = myVar.localMin()&lt;br /&gt;
 print(&#039; minimum was : &#039; .. value .. &#039;: &#039; .. item.time.secondsAgo .. &#039; seconds ago&#039; )&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMax([smoothRange], default)&#039;&#039;&#039;: Same as &#039;&#039;&#039;localMin&#039;&#039;&#039; but for the maximum value. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;smoothItem(itemIdx, [smoothRange])&#039;&#039;&#039;: Returns a the value of &amp;lt;code&amp;gt;itemIdx&amp;lt;/code&amp;gt; in the set but smoothed by averaging with its neighbors. The number of neighbors is set by &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt;. See [[#Data_smoothing|Data smoothing]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-smoothing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Data smoothing ====&lt;br /&gt;
&lt;br /&gt;
Example: Suppose you store temperatures in the historical variable. These temperatures may have extremes. Perhaps these extremes could be due to sensor reading errors. In order to reduce the effect of these so-called spikes, you could smooth out values. It is like blurring the data. The Raw column is your temperatures. The other columns are calculated by averaging the neighbors. For item 10 the calculations are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Range=1 for time10 = (25 + 31 + 29) / 3 = 28,3&lt;br /&gt;
Range=2 for time10 = (16 + 25 + 31 + 29 + 26) / 5 = 25,4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; align=&amp;quot;center&amp;quot; width=&amp;quot;30% height:10px;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| time&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| raw&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=1&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
| 18&lt;br /&gt;
| 20,0&lt;br /&gt;
| 21,7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 21,7&lt;br /&gt;
| 25,0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 27,3&lt;br /&gt;
| 24,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 27,7&lt;br /&gt;
| 26,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
| 23&lt;br /&gt;
| 28,7&lt;br /&gt;
| 27,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,0&lt;br /&gt;
| 25,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
| 27&lt;br /&gt;
| 23,7&lt;br /&gt;
| 23,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
| 16&lt;br /&gt;
| 22,7&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 24,0&lt;br /&gt;
| 25,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 28,3&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
| 29&lt;br /&gt;
| 28,7&lt;br /&gt;
| 29,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
| 26&lt;br /&gt;
| 30,0&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;13&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 32,0&lt;br /&gt;
| 30,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;16&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 29,7&lt;br /&gt;
| 28,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;17&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,7&lt;br /&gt;
| 28,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 27,3&lt;br /&gt;
| 26,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;19&#039;&#039;&#039;&lt;br /&gt;
| 32&lt;br /&gt;
| 24,3&lt;br /&gt;
| 25,3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;20&#039;&#039;&#039;&lt;br /&gt;
| 19&lt;br /&gt;
| 25,5&lt;br /&gt;
| 24,3&lt;br /&gt;
|}&lt;br /&gt;
A chart illustrates it more clearly. The red line is not smoothed and has more spikes than the others:&lt;br /&gt;
&lt;br /&gt;
[[File:dzvents-smoothing.png|frame|none|alt=|Smoothing]]&lt;br /&gt;
&lt;br /&gt;
Usually a range of 1 or 2 is sufficient when providing a smoothing range to statistical functions. I suggest smoothing when checking deltas, local minimums and maximums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-does-the-storage-stuff-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How does the storage stuff work? ==&lt;br /&gt;
&lt;br /&gt;
For every script file that defines persisted variables (using the &amp;lt;code&amp;gt;data={ … }&amp;lt;/code&amp;gt; section), dzVents will create storage file with the name &amp;lt;code&amp;gt;__data_scriptname.lua&amp;lt;/code&amp;gt; in a subfolder called &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. You can always delete these data files or the entire storage folder if there is a problem with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz/&lt;br /&gt;
    scripts/&lt;br /&gt;
        dzVents/&lt;br /&gt;
            data/&lt;br /&gt;
                __data_yourscript1.lua&lt;br /&gt;
                __data_yourscript2.lua&lt;br /&gt;
                __data_global_data.lua&lt;br /&gt;
            examples/&lt;br /&gt;
            generated_scripts/&lt;br /&gt;
            scripts/&lt;br /&gt;
                yourscript1.lua&lt;br /&gt;
                yourscript2.lua&lt;br /&gt;
                global_data.lua&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you dare to, you can watch inside these files. Every time some data are changed, dzVents will stream the changes back into the data files. &#039;&#039;&#039;Again, make sure you don’t put too much stuff in your persistent data as it may slow things down too much.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-requests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous HTTP requests =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous HTTP request and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use os functions like &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz will terminate the script with a message that it took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to make an http call and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;openURL&amp;lt;/code&amp;gt; on the domoticz object with only the url as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL(&#039;http://domain/path/to/something?withparameters=1&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will make the request that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a url you pass in a table with all the parameters to make the request &#039;&#039;&#039;and&#039;&#039;&#039; your provide a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
    domoticz.openURL({&lt;br /&gt;
        url = &#039;http://domain/path/to/something&#039;,&lt;br /&gt;
        method = &#039;POST&#039;,&lt;br /&gt;
        callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
        postData = {&lt;br /&gt;
            paramA = &#039;something&#039;,&lt;br /&gt;
            paramB = &#039;something else&#039;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will make the request (a POST in this case), and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    httpResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
    if (response.ok) then -- success&lt;br /&gt;
        if (response.isJSON) then&lt;br /&gt;
            domoticz.log(response.json.some.value)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    timer = {&#039;every 5 seconds&#039;},&lt;br /&gt;
    httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
    if (item.isTimer) then&lt;br /&gt;
        domoticz.openURL({&lt;br /&gt;
            url = &#039;...&#039;,&lt;br /&gt;
            callback = &#039;trigger&#039;&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    if (item.isHTTPResponse) then&lt;br /&gt;
        if (item.ok) then&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.openURL(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;url&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. Either &amp;lt;code&amp;gt;&#039;GET&#039;&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;&#039;POST&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;PUT&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;&#039;DELETE&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; .&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to trigger the callback handler script(s).&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. A Lua table or JSON string with additional http request-headers.&lt;br /&gt;
* &#039;&#039;&#039;postData&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. When doing a &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; this data will be the payload of the request (body). If you provide a Lua table then this will automatically be converted to json and the request-header &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; is set. So no need to do that manually. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw response data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Response headers.&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;application/json&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;text/xml&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be in range of 200-299.&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. HTTP status codes. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;statusText&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP status message. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;protocol&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP protocol. See [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;more-about-request-and-response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== More about request and response headers ===&lt;br /&gt;
&lt;br /&gt;
Whenever you do an http request it is not just some data that is sent. Along with the request a bunch of so-called headers are sent along with it. HTTP headers allow the client and the server to pass additional information with the request or the response. Also, in the response there are also headers (response header). These response headers usually tell you what kind of data is returned, if it is compressed, if the request was successful etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;request-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== request headers ====&lt;br /&gt;
&lt;br /&gt;
dzVents allow you to set custom request headers that will accompany the data in the request. Sometimes it is necessary to set these headers like for instance when a API or webservice require a security token or key or when the service needs to know what the format of the response data is. Check the documentation of the web service.&lt;br /&gt;
&lt;br /&gt;
So, let’s say you need to call a web service that requires an api key in the headers and the documentation states it needs to be passed in an x-access-token header. Your openURL command then may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL({&lt;br /&gt;
    url = &#039;https://somedomain.com/service/getInfo&#039;,&lt;br /&gt;
    headers = { [&#039;x-access-token&#039;] = &#039;&amp;lt;api-key&amp;gt;&#039; },&lt;br /&gt;
    method = &#039;GET&#039;,&lt;br /&gt;
    callback = &#039;info&#039;&lt;br /&gt;
})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Check google for more information about request headers. All you need to know here is that dzVents allow you to set these headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== response headers ====&lt;br /&gt;
&lt;br /&gt;
As said earlier, the response also contains a bunch of headers. You can inspect those headers with dzVents but ususally you don’t have to. For starters, dzVents already checks the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header which usually states what kind of data format the response is. If it is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then it automatically converts the json data to a Lua table. Also, it checks the &amp;lt;code&amp;gt;Status&amp;lt;/code&amp;gt; header to see if the request was successful. If so, then it sets the &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; attribute on the response object. So normally you don’t have to inspect the headers. However, sometimes the web service puts a session token in the response header that you have to use in follow-up requests.&lt;br /&gt;
&lt;br /&gt;
So here an example where we have to log in before we can fetch data. It uses two requests: the first performs the log-in and the second grabs the session token from the login response data and uses that token in the second request to get the data we need. In this example we do this every hour.&lt;br /&gt;
&lt;br /&gt;
That would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;loggedin&#039;, &#039;data&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/login&#039;,&lt;br /&gt;
                method = &#039;POST&#039;,&lt;br /&gt;
                postData = { [&#039;username&#039;] = &#039;Luke Skywalker&#039;, [&#039;password&#039;] = &#039;theforce&#039; }&lt;br /&gt;
                callback = &#039;loggedin&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- check to which request this response was the result&lt;br /&gt;
            if (item.trigger == &#039;loggedin&#039;) then&lt;br /&gt;
                -- we are logged in, now grab the session token from the header and&lt;br /&gt;
                -- fetch our data&lt;br /&gt;
                local token = item.headers[&#039;x-session-token&#039;]&lt;br /&gt;
                -- now we have the token, put it in the headers:&lt;br /&gt;
                domoticz.openURL({&lt;br /&gt;
                    url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                    method = &#039;GET&#039;,&lt;br /&gt;
                    headers = { [&#039;x-session-token&#039;] = token },&lt;br /&gt;
                    callback = &#039;data&#039;&lt;br /&gt;
                })&lt;br /&gt;
            else&lt;br /&gt;
                -- it must the data we requested&lt;br /&gt;
                local data = item.data&lt;br /&gt;
                -- do something with it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Some remarks about the response header &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;. If a service is a good web-citizen then it tells you what the format of the data is in this header. So, if the data is a json object then the header should be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;. Unfortunately, there are lot of lazy programmers out there who don’t set this header properly. If that is the case, dzVents cannot detect the format and will not turn it into a Lua table for you automatically. So, if you know it is json but the header is not properly set, then you can easily convert it into a Lua table in your code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                callback = &#039;trigger&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- we know it is json but dzVents cannot detect this&lt;br /&gt;
            -- convert to Lua&lt;br /&gt;
            local json = domoticz.utils.fromJSON(item.data)&lt;br /&gt;
            -- json is now a Lua table&lt;br /&gt;
            print(json.result.title) -- just an example&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous shell command execution =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use functions like &amp;lt;code&amp;gt;utils.osCommand()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;os.Execute()&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to execute a shell command asynchronously and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;executeShellCommand&amp;lt;/code&amp;gt; on the domoticz object with only the command as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.executeShellCommand(&#039;some shell command&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will execute the request in a separate thread and that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a command you pass in a table with the command to be executed &#039;&#039;&#039;and&#039;&#039;&#039; a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;some shell command&#039;,&lt;br /&gt;
            callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
            timeout = timeoutinseconds,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        shellCommandResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
        if response.ok then&lt;br /&gt;
            if (response.isJSON) then&lt;br /&gt;
                domoticz.log(response.json.some.value)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every 5 minutes&#039;,&lt;br /&gt;
        },&lt;br /&gt;
        shellCommandResponses =&lt;br /&gt;
        {&lt;br /&gt;
            scriptVar,&lt;br /&gt;
        },&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.executeShellCommand(&lt;br /&gt;
            {&lt;br /&gt;
                command = &#039;some shell command&#039;,&lt;br /&gt;
                callback = scriptVar,&lt;br /&gt;
                timeout = timeoutinseconds,&lt;br /&gt;
            })&lt;br /&gt;
        elseif item.isShellCommandResponse then&lt;br /&gt;
            if item.statusCode == 0 then&lt;br /&gt;
                ... -- process result (in item.json, -item.xml, -item.lines or item.data)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.executeShellCommand(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;command&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to find a the callback handler script.&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: &#039;&#039;Integer&#039;&#039;. Optional. Max execution time in seconds. defaults to 10 seconds. A value of 0 disables the timeout.&lt;br /&gt;
&lt;br /&gt;
Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: output from the command. (stdout)&lt;br /&gt;
* &#039;&#039;&#039;errorText&#039;&#039;&#039;: Errors generated by the command (stderr)&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Int&#039;&#039;. exitcode generated by the command&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be 0.&lt;br /&gt;
* &#039;&#039;&#039;timeoutOccurred&#039;&#039;&#039; &#039;&#039;Boolean&#039;&#039; &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was aborted by a timeout.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;settings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Settings =&lt;br /&gt;
&lt;br /&gt;
Settings for dzVents are found in the Domoticz GUI: &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039;: Tick this if you don’t want any dzVents script to be executed.&lt;br /&gt;
* &#039;&#039;&#039;Log level&#039;&#039;&#039;: (Note that you can override this setting in the logging section of your script)&lt;br /&gt;
** &#039;&#039;Errors&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info&#039;&#039;: Errors and some minimal information about which script is being executed and why,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info + generic info&#039;&#039;. Even more information about script execution and a bit more log formatting.&lt;br /&gt;
** &#039;&#039;Debug&#039;&#039;. Shows everything and dzVents will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in the scripts/dzVents folder. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.&lt;br /&gt;
** &#039;&#039;No logging&#039;&#039;. As silent as possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
So, you think if you have done everything correctly but things do not work (in some way) as you expected. Here are a couple steps you can do to find the cause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-dzvents-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is dzVents enabled? ===&lt;br /&gt;
&lt;br /&gt;
Check the settings (see above) and make sure the checkbox &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039; is not checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-your-script-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is your script enabled? ===&lt;br /&gt;
&lt;br /&gt;
Make sure the active section in your script is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;active = true&amp;lt;/code&amp;gt;. And, on top of that, if you are using the internal web editor to write your script, make sure that your script is active there and you have clicked Save! “Event active” is a separate checkbox that must be ticked for every active script. When not active, the script name will be red in the list on the right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;turn-on-debug-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Turn on debug logging ===&lt;br /&gt;
&lt;br /&gt;
Activate debug logging in the settings (see above). This will produce a lot of extra messages in the Domoticz log (don’t forget to turn it off when you are done troubleshooting!). It is best to monitor the log through the command line, as the log in the browser sometimes tends to not always show all log messages. See the Domoticz manual for how to do that.&lt;br /&gt;
&lt;br /&gt;
When debug logging is enabled, every time dzVents kicks into action (Domoticz throws an event) it will log it, and it will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz. This data lie at the core of the dzVents object model. You can open this file in an editor to see if your device/variable/scene/group/hardware is in there. Note that the data in the file are not exactly the same as what you will get when you interact with dzVents, but it is a good start. If your object is not in the data file, then you will not have access to it in dzVents and dzVents will not be able to match triggers with that object. Something’s wrong if you expect your object to be in there but it is not (is the object active/used?). &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.with a dump of the data sent to dzVents.&lt;br /&gt;
&lt;br /&gt;
Example content of &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    Startdate time  - End date time  (clk - CPU )                 dule / scriptname &amp;amp;lt;&amp;amp;lt; type: &amp;amp;quot;trigger&amp;amp;quot;&lt;br /&gt;
    ---------------------------------------------------------------------------------------------------------------&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0029)                     waqi.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 20 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0016)                   Washer.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 5 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:01 - 11/27/20 18:40:01 (00 - 0.0215)   getWaterFromHomewizard.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WaterfromHomewizard&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.2472)     updateWeatherSensors.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WUS_buienradarResponse&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.0290)                     waqi.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;waqi_nearby&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:41:00 - 11/27/20 18:41:00 (00 - 0.0583)        Bathroom humidity.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every minute between 05:15 and 23:30&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every time Domoticz starts dzVents and debug logging is enabled you should see these lines in the domoticz log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dzVents version: x.y.z&lt;br /&gt;
Event trigger type: aaaa&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where aaaa can be time, custom event, system event, device, uservariable, security or scenegroup. That should give you a clue what kind of event is active. If you don’t see this information then dzVents is not active (or debug logging is not active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-is-still-not-executed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script is still not executed ===&lt;br /&gt;
&lt;br /&gt;
If for some reason your script is not executed while all of the above is done, it is possible that your triggers are not correct. Either the time rule is not matching with the current time (try to set the rule to &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or something simple), or the device name is not correct (check casing), or you use an id that doesn’t exist. Note that in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section, you cannot use the dzVents domoticz object!&lt;br /&gt;
&lt;br /&gt;
Make sure that if you use an id in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section that this id is correct. Go to the device list in Domoticz and find the device and make sure the device is in the ‘used’ list!. Unused devices will not create an event. Find the idx for the device and use that as the id.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that your device names are unique! dzVents will throw a warning in the log if multiple device names match. It’s best practice to have unique names for your devices. Use some clever naming like prefixing like ‘Temperature: living room’ or ‘Lights: living room’. That also makes using wild cards on your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section easier.&lt;br /&gt;
&lt;br /&gt;
If your script is still not triggered, you can try to create a classic Lua event script and see if that does work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging-your-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugging your script ===&lt;br /&gt;
&lt;br /&gt;
A simple way to inspect a device in your script is to dump it to the log: &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt;. This will dump everything known to dzVents of the device so you can inspect what its state is. If you only need to see a subset you can use dumpSelection(‘attributes’), dumpSelection(‘functions’) or dumpSelection(‘tables’) Use print statements or domoticz.log() statements in your script at cricital locations to see if the Lua interpreter reaches that line. Don’t try to print a device object though; use the &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; method for that. It wil log all attributes of the device in the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
If you place a print statement all the way at the top of your script file it will be printed every time dzVents loads your script (that is done at the beginning of each event cycle). Sometimes that is handy to see if your script gets loaded in the first place. If you don’t see your print statement in the log, then likely dzVents didn’t load it and it will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;get-help&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Get help ===&lt;br /&gt;
&lt;br /&gt;
The Domoticz forum is a great resource for help and solutions. Check the [https://www.domoticz.com/forum/viewforum.php?f=59 dzVents forum].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;other-interesting-stuff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Other interesting stuff =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lodash-for-lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== lodash for Lua ==&lt;br /&gt;
&lt;br /&gt;
lodash is a well known and very popular Javascript library filled with dozens of handy helper functions that really make you life a lot easier. Fortunately there is also a Lua version. This is directly available through the domoticz object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _ = domoticz.utils._&lt;br /&gt;
_.print(_.indexOf({2, 3, &#039;x&#039;, 4}, &#039;x&#039;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--- (Removed because link is dead. Hopefully only temporarily) Check out the great documentation [here](http://axmat.github.io/lodash.lua/). ---&amp;gt;&lt;br /&gt;
Check out the documentation [https://htmlpreview.github.io/?https://github.com/rwaaren/lodash.lua/blob/master/doc/index.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;history-link-to-changes-in-previous-versions.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= History [https://wiki.domoticz.com/DzVents_version_History link to changes in previous versions]. =&lt;br /&gt;
&lt;br /&gt;
See link for the complete list of changes&lt;br /&gt;
&lt;br /&gt;
https://wiki.domoticz.com/DzVents_version_History&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19249</id>
		<title>DzVents: next generation Lua scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19249"/>
		<updated>2026-08-02T17:06:17Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Thermostat 6 3.1.11 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: This document is maintained on [https://github.com/domoticz/domoticz/blob/development/dzVents/documentation/README.md github], and the wiki version is automatically generated. Edits should be performed on github, or they may be suggested on the wiki article’s [https://wiki.domoticz.com/Talk:DzVents:_next_generation_Lua_scripting Discussion page]. Editing can be done by any editor but if you are looking for a specialized markDown editor; [https://stackedit.io/app# stackedit.io] would be a good choice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;about-dzvents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About dzVents =&lt;br /&gt;
&lt;br /&gt;
dzVents /diː ziː vɛnts/, short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts. And … &#039;&#039;&#039;it is 100% Lua&#039;&#039;&#039;! So if you already have a bunch of event scripts for Domoticz, upgrading should be fairly easy.&lt;br /&gt;
&lt;br /&gt;
Let’s start with an example. Say you have a switch that when activated, it should activate another switch but only if the room temperature is above a certain level. And when done, it should send a notification. This is how it looks in dzVents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;Room switch&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, roomSwitch)&lt;br /&gt;
        if (roomSwitch.active and domoticz.devices(&#039;Living room&#039;).temperature &amp;gt; 18) then&lt;br /&gt;
        domoticz.devices(&#039;Another switch&#039;).switchOn()&lt;br /&gt;
        domoticz.notify(&#039;This rocks!&#039;,&lt;br /&gt;
                        &#039;Turns out that it is getting warm here&#039;,&lt;br /&gt;
                        domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you have a timer script that should be executed every 10 minutes, but only on weekdays, and have it do something with some user variables and only during daytime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
            --activate my scene&lt;br /&gt;
            domoticz.scenes(&#039;Evening lights&#039;).switchOn()&lt;br /&gt;
            if (domoticz.devices(&#039;My PIR&#039;).lastUpdate.minutesAgo &amp;gt; 5) then&lt;br /&gt;
                domoticz.devices(&#039;Bathroom lights&#039;).switchOff()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you want to detect a humidity rise within the past 5 minutes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;every 5 minutes&#039;}&lt;br /&gt;
    },&lt;br /&gt;
    data =&lt;br /&gt;
    {&lt;br /&gt;
        previousHumidity = { initial = 100 }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        local bathroomSensor = domoticz.devices(&#039;BathroomSensor&#039;)&lt;br /&gt;
        if (bathroomSensor.humidity - domoticz.data.previousHumidity) &amp;gt;= 5 then&lt;br /&gt;
            -- there was a significant rise&lt;br /&gt;
            domoticz.devices(&#039;Ventilator&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
        -- store current value for next cycle&lt;br /&gt;
        domoticz.data.previousHumidity = bathroomSensor.humidity&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just to give you an idea! Everything in your Domoticz system is now logically available in the domoticz object structure. With this domoticz object, you can get to all the information in your system and manipulate your devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;using-dzvents-with-domoticz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Using dzVents with Domoticz =&lt;br /&gt;
&lt;br /&gt;
In Domoticz go to &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other&#039;&#039;&#039; and in the section EventSystem make sure the check-box ‘dzVents disabled’ is not checked. Also make sure that in the Security section in the settings &#039;&#039;&#039;(Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Local Networks (no username/password)&#039;&#039;&#039; you allow 127.0.0.1 (and / or ::1 when using IPv6 ) to not need a password. dzVents does use this port to get the location settings and to send certain commands to Domoticz. Finally make sure you have set your current location in &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Location&#039;&#039;&#039;, otherwise there is no way to determine nighttime/daytime state.&lt;br /&gt;
&lt;br /&gt;
There are two ways of creating dzVents event scripts in Domoticz:&lt;br /&gt;
&lt;br /&gt;
# By creating scripts in your domoticz instance on your domoticz server: &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Make sure that each script has the extension &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; and follows the guidelines as described below.&lt;br /&gt;
# By creating scripts inside Domoticz using the internal Domoticz event editor: Go to &#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Events&#039;&#039;&#039;. Press the + button and choose dzVents. You must then choose a template. They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: scripts that you write on the file-system and inside Domoticz using the internal web-editor all share the same name-space. That means that if you have two scripts with the same name, only the one of the file-system will be used. The log will tell you when this happens.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: Scripts created in the internal editor are stored in the domoticz database and are all written to &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/generated_scripts&amp;lt;/code&amp;gt; on every domoticz restart and every “EventSystem: reset all events…”. Scripts in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt; are not stored in the database and should be backed-up separately. &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quickstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
If you made sure that dzVents system is active, we can do a quick test if everything works:&lt;br /&gt;
&lt;br /&gt;
* Pick a switch in your Domoticz system. Write down the exact name of the switch. If you don’t have a switch then you can create a Dummy switch and use that one.&lt;br /&gt;
* Create a new file in the &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/&amp;lt;/code&amp;gt; folder (or using the web-editor in Domoticz, switch to dzVents mode first.). Call the file &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt;. &#039;&#039;Note: when you create a script in the web-editor you do &#039;&#039;&#039;not&#039;&#039;&#039; add the .lua extension!&#039;&#039; Also, valid script names follow the same rules as [https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words filesystem names].&lt;br /&gt;
* Open &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt; in an editor and fill it with this code and change &amp;lt;code&amp;gt;&amp;amp;lt;exact name of the switch&amp;amp;gt;&amp;lt;/code&amp;gt; with the .. you guessed it… exact name of the switch device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&lt;br /&gt;
            &#039;&amp;lt;exact name of the switch&amp;gt;&#039;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (switch.state == &#039;On&#039;) then&lt;br /&gt;
                domoticz.log(&#039;Hey! I am on!&#039;)&lt;br /&gt;
            else&lt;br /&gt;
                domoticz.log(&#039;Hey! I am off!&#039;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Save the script&lt;br /&gt;
* Open the Domoticz log in the browser&lt;br /&gt;
* In Domoticz GUI perhaps in another browser tab) press the switch.&lt;br /&gt;
* You can watch the log in Domoticz and it should show you that indeed it triggered your script and you should see the log messages.&lt;br /&gt;
&lt;br /&gt;
See the examples folder &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples&amp;lt;/code&amp;gt; for more examples. This folder includes templates you can use to get started as well. And, if you use the GUI web editor to write your script, you will find boilerplate examples in the drop-down below the script type setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;writing-scripts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Writing scripts =&lt;br /&gt;
&lt;br /&gt;
In order for your scripts to work with dzVents, they have to be turned into a Lua module with a specific structure. Basically you make sure it returns a Lua table (object) with predefined keys like &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt;. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;My switch&#039; }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, switch)&lt;br /&gt;
        -- your script logic goes here, something like this:&lt;br /&gt;
        if (switch.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.log(&#039;I am on!&#039;, domoticz.LOG_INFO)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Simply said, the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-part defines the trigger and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part is what should be done if the trigger matches with the current Domoticz event. So all your logic is inside the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sections-in-the-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sections in the script ==&lt;br /&gt;
&lt;br /&gt;
Each dzVents event script has this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    active = true, -- optional&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        -- at least one of these:&lt;br /&gt;
        customEvents = { ... },&lt;br /&gt;
        devices = { ... },&lt;br /&gt;
        groups = { ... },&lt;br /&gt;
        httpResponses = { ... },&lt;br /&gt;
        scenes = { ... },&lt;br /&gt;
        security = { ... },&lt;br /&gt;
        shellCommandResponses = { ... },&lt;br /&gt;
        system = { ... },&lt;br /&gt;
        timer = { ... },&lt;br /&gt;
        variables = { ... },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    data = { ... }, -- optional&lt;br /&gt;
    logging = { ... }, -- optional&lt;br /&gt;
    execute = function(domoticz, item, triggerInfo)&lt;br /&gt;
    -- your code here&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;active-truefalse-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== active = true/false (optional) ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;active = false&amp;lt;/code&amp;gt;, then the script is not activated: &#039;&#039;dzVents will ignore the script completely&#039;&#039;. If you don’t have &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; specified, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is assumed (default value). If you write scripts with Domoticz’ internal script editor then you don’t need this part as the editor has its own way of enabling and disabling scripts.&lt;br /&gt;
&lt;br /&gt;
So, &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; can either be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;true&#039;&#039;&#039;: (default) the script file will be processed.&lt;br /&gt;
* &#039;&#039;&#039;false&#039;&#039;&#039;: the script file is ignored.&lt;br /&gt;
* &#039;&#039;&#039;function(domoticz) … end&#039;&#039;&#039;: A function returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The function will receive the domoticz object with all the information about your domoticz instance: &amp;lt;code&amp;gt;active = function(domoticz) .... end&amp;lt;/code&amp;gt;. For example you could check for a Domoticz variable or switch and prevent the script from being executed. &#039;&#039;&#039;However, be aware that for &#039;&#039;every script&#039;&#039; in your scripts folder, this active function will be called, every cycle!! Therefore, it is better to put all your logic in the execute function instead of in the active function.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== on = { … } ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section tells dzVents &#039;&#039;when&#039;&#039; the execute function has to be executed. It holds all the events/&#039;&#039;&#039;triggers&#039;&#039;&#039; that are monitored by dzVents. If any of the events or triggers match with the current event coming from Domoticz, then the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part of the script is executed by dzVents. The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section has many kinds of subsections that &#039;&#039;can all be used simultaneously&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;customevents-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== customEvents = { … } &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more custom event triggers. This eventTrigger can be activate by a json/api call, a MQTT message (when domoticz is setup to listen to such messages on the hardware tab) or by the dzVents internal command domoticz.emitEvent - The name of the custom-event - The name of the custom-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|See time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;- curl: curl -d &amp;amp;quot;{ &#039;a&#039;:10, &#039;b&#039;:20, &#039;some&#039;:&#039;text&#039;, &#039;sub&#039; : { &#039;x&#039;:10, &#039;y&#039;:20 } }&amp;amp;quot; &amp;amp;quot;http://&amp;amp;lt;domoticzIP:domoticz port&amp;amp;gt;/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;myCustomEvent&amp;amp;gt;&amp;amp;quot;&lt;br /&gt;
- JSON: **&amp;amp;lt; domoticzIP : domoticz port &amp;amp;gt;**/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;MyEvent&amp;amp;gt;&amp;amp;amp;data=myData&lt;br /&gt;
- MQTT simple: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;, &amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;myData&amp;amp;quot;}&lt;br /&gt;
- MQTT complex: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;,&amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;{\&amp;amp;quot;idx\&amp;amp;quot;:29,\&amp;amp;quot;test\&amp;amp;quot;:\&amp;amp;quot;ok\&amp;amp;quot;}&amp;amp;quot; }&lt;br /&gt;
- emitEvent: domoticz.emitEvent(&#039;myCustomEvent&#039; [,])&lt;br /&gt;
    `domoticz.emitEvent(&#039;myEvent&#039;) -- no data`&lt;br /&gt;
    `domoticz.emitEvent(&#039;another event&#039;, &#039;some data&#039;)`&lt;br /&gt;
    `domoticz.emitEvent(&#039;hugeEvent&#039;, { a = 10, b = 20, some = &#039;text&#039;, sub = { x = 10, y = 20 } })`&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;attributes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== Attributes =====&lt;br /&gt;
&lt;br /&gt;
The customEvent object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw customEvent data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid json string. The data is then automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid xml string. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the customEvent data is a valid json string, the response data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;customEvent&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; The string that triggered this customEvent instance. This is useful if you have a script that can be triggered by multiple different customEvent strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the response data is a valid xml string, the customEvent data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== devices = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of device-names or indexes. If a device in your system was updated (e.g. a switch was triggered or a new temperature was received) and it is listed in this section then the execute function is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the device state or value has changed. Each device can be:&lt;br /&gt;
&lt;br /&gt;
* The name of your device between string quotes. &#039;&#039;&#039;You can use the asterisk (*) wild-card here e.g. &amp;lt;code&amp;gt;PIR_*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*_PIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;. E.g.: &amp;lt;code&amp;gt;devices = { &#039;myDevice&#039;, &#039;anotherDevice&#039;, 123, &#039;pir*&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* The index (idx) of your device (as the name may change, the index will usually stay the same, the index can be found in the devices section in Domoticz). &#039;&#039;&#039;Note that idx is a number;&#039;&#039;&#039;&lt;br /&gt;
* The name or idx of your device followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;myDevice&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if &amp;lt;code&amp;gt;myDevice&amp;lt;/code&amp;gt; was changed, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;groups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== groups = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more group-names or indexes. The same rules as devices apply.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpresponses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== httpResponses = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more http callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shellcommandresponses-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== shellCommandResponses = { …} &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scriptcommand callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scenes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== scenes = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scene-names or indexes. The same rules as devices apply. So if your scene is listed in this table then the executed function will be triggered, e.g.: &amp;lt;code&amp;gt;on = { scenes = { &#039;myScene&#039;, &#039;anotherScene&#039; } },&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== security = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more of these security states:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDAWAY&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDHOME&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_DISARMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the security state in Domoticz changes and it matches with any of the states listed here, the script will be executed. See &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples/templates/security.lua&amp;lt;/code&amp;gt; for an example see [[#Security_Panel|Security Panel]] for information about how to create a security panel device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== system = { …} &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more system triggers.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manualBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dailyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hourlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monthlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resetAllDeviceStatus&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt; &amp;lt;code&amp;gt;resetAllEvents&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* The name of the system-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
** &#039;&#039;&#039;start&#039;&#039;&#039; - fired when Domoticz has started.&lt;br /&gt;
** &#039;&#039;&#039;stop&#039;&#039;&#039; - fired when Domoticz is shutting down. As you probably can imagine you have only a limited amount of time - also depending on the load on your system - to have Domoticz do stuff when your script has been completed. Some commands will probably not be executed. Just give it a try.&lt;br /&gt;
** &#039;&#039;&#039;Backups&#039;&#039;&#039; - the trigger item (2nd parameter of the execute function) is a table that holds information about the newly created backup (location, duration in seconds and type). You could use this information to copy the file to some other location or for another purpose.&lt;br /&gt;
*** &#039;&#039;&#039;dailyBackupFinished&#039;&#039;&#039; - automatic backup when set in domoticz&lt;br /&gt;
*** &#039;&#039;&#039;hourlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;monthlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;manualBackupFinished&#039;&#039;&#039; - fired when you start a backup using the Domoticz GUI or via &#039;&#039;&#039;&amp;amp;lt; domoticz IP:domoticz port &amp;amp;gt;&#039;&#039;&#039;/backupdatabase.php&lt;br /&gt;
*** &#039;&#039;&#039;resetAllDeviceStatus&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when the name, description or used / unused state of a device, variable or scene is updated.&lt;br /&gt;
*** &#039;&#039;&#039;resetAllEvents&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when a dzVents script in the internal editor changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== timer = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one ore more time ‘rules’ like &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;at 17:*&amp;lt;/code&amp;gt;. See [[#timer_trigger_rules|&#039;&#039;timer&#039;&#039; trigger rules]]. If any or the rules matches with the current time/date then your execute function is called. E.g.: &amp;lt;code&amp;gt;on = { timer = { &#039;between 30 minutes before sunset and 30 minutes after sunrise&#039; } }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== variables = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more user variable-names as defined in Domoticz ( &#039;&#039;Setup &amp;amp;gt; More options &amp;amp;gt; User variables&#039;&#039;). If any of the variables listed here is updated, ( &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed ).the script is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: Script will only execute when this variable is updated directly by dzVents or by a JSON. If updated with a standard Lua script (using commandArray) or in combination with a time option like afterAAA no event will be triggered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;execute-functiondomoticz-item-triggerinfo-end&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== execute = function(&#039;&#039;&#039;domoticz, item, triggerInfo&#039;&#039;&#039;) … end ===&lt;br /&gt;
&lt;br /&gt;
When all the above conditions are met (active == true and the on section has at least one matching rule), then this &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function is called. This is the heart of your script. The function has three parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 1. (&#039;&#039;&#039;domoticz&#039;&#039;&#039;, item, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
The [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]]. This object gives you access to almost everything in your Domoticz system, including all methods to manipulate them—like modifying switches or sending notifications. More about the [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 2. (domoticz, &#039;&#039;&#039;item&#039;&#039;&#039;, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
Depending on what actually triggered the script, &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is either a:&lt;br /&gt;
&lt;br /&gt;
* [[#Custom_event_API|customEvent]] &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Device_object_API|device]],&lt;br /&gt;
* [[#Variable_object_API_.28user_variables.29|variable]],&lt;br /&gt;
* [[#Scene|scene]],&lt;br /&gt;
* [[#Group|group]],&lt;br /&gt;
* [[#timer_=_%7B_..._%7D|timer]],&lt;br /&gt;
* [[#System_event_API|system]], &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Security_Panel|security]] or&lt;br /&gt;
* [[#Asynchronous_HTTP_requests|httpResponse]]&lt;br /&gt;
* [[#Asynchronous_shell_command_executio|shellCommandResponse]] &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since you can define multiple on-triggers in your script, it is not always clear what the type is of this second parameter. In your code you need to know this in order to properly respond to the different events. To help you inspect the object you can use these attributes like &amp;lt;code&amp;gt;if (item.isDevice) then ... end&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;isCustomEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a customEvent object.&lt;br /&gt;
* &#039;&#039;&#039;isDevice&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Device object.&lt;br /&gt;
* &#039;&#039;&#039;isGroup&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Group object.&lt;br /&gt;
* &#039;&#039;&#039;isHTTPResponse&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is an HTTPResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isShellCommandResponse&#039;&#039;&#039;: . &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a shellcommandResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isScene&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Scene object.&lt;br /&gt;
* &#039;&#039;&#039;isSecurity&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Security object.&lt;br /&gt;
* &#039;&#039;&#039;isSystemEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a system object.&lt;br /&gt;
* &#039;&#039;&#039;isTimer&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Timer object.&lt;br /&gt;
* &#039;&#039;&#039;isVariable&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Variable object.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;: . &#039;&#039;string&#039;&#039;. the timer rule, the security state, the customEvent or the http response callback string that actually triggered your script. E.g. if you have multiple timer rules can inspect &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; which exact timer rule was fired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3. (domoticz, item, &#039;&#039;&#039;triggerInfo&#039;&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: as of version 2.4.0, &amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; has become more or less obsolete and is left in here for backward compatibility. All information is now available on the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; parameter (second parameter of the execute function, see point 2 above).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; holds information about what triggered the script. The object has two attributes:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;type&#039;&#039;&#039;: the type of the the event that triggered the execute function, either: - domoticz.EVENT_TYPE_CUSTOM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_DEVICE, - domoticz.EVENT_TYPE_GROUP - domoticz.EVENT_TYPE_HTTPRESPONSE - domoticz.EVENT_TYPE_SCENE, - domoticz.EVENT_TYPE_SECURITY, - domoticz.EVENT_TYPE_SYSTEM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_TIMER, - domoticz.EVENT_TYPE_VARIABLE)&lt;br /&gt;
# &#039;&#039;&#039;trigger&#039;&#039;&#039;: the timer rule that triggered the script if the script was called due to a timer event, or the security state that triggered the security trigger rule. See [[#timer_trigger_rules|below]] for the possible timer trigger rules.&lt;br /&gt;
# &#039;&#039;&#039;scriptName&#039;&#039;&#039;: the name of the current script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tip-rename-the-parameters-to-better-fit-your-needs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tip: rename the parameters to better fit your needs ====&lt;br /&gt;
&lt;br /&gt;
The names of the execute parameters are actually something you can change to your convenience. For instance, if you only have one trigger for a specific switch device, you can rename &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; it to &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Or if you think &amp;lt;code&amp;gt;domoticz&amp;lt;/code&amp;gt; is too long you can rename it to &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dz&amp;lt;/code&amp;gt; (might save you a lot of typing and may make your code more readable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = &#039;mySwitch&#039;&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(dz, mySwitch)&lt;br /&gt;
        dz.log(mySwitch.state, dz.LOG_INFO)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== data = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional data section allows you to define local variables that will hold their values &#039;&#039;between&#039;&#039; script runs. These variables can get a value in your execute function and the next time the script is executed these variables will have their previous state restored. For more information see the section [[#Persistent_data|Persistent data]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logging-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== logging = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional logging section allows you to override the global logging setting of dzVents as set in &#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem &amp;amp;gt; dzVents Log Level&#039;&#039;. This can be handy when you only want this script to have extensive debug logging while the rest of your script executes silently. You have these options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: This is the minimum log level you want for this script. This can be domoticz.LOG_INFO, domoticz.LOG_STATUS, domoticz.LOG_ERROR or domoticz.LOG_DEBUG&lt;br /&gt;
* &#039;&#039;&#039;marker&#039;&#039;&#039;: A string that is prefixed before each log message. That way you can easily create a filter in the Domoticz log to see just these messages. &#039;&#039;&#039;marker&#039;&#039;&#039; defaults to scriptname&lt;br /&gt;
&lt;br /&gt;
\*LOG_DEBUG will also cause Execution Info to be displayed (start/finished)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;logging = {&lt;br /&gt;
    level = domoticz.LOG_DEBUG,&lt;br /&gt;
    marker = &amp;quot;Hey you&amp;quot;&lt;br /&gt;
    },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;some-trigger-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Some trigger examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to trigger a script not on the minute but 30 seconds later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every minute&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        customEvents =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;delayed&#039;,&lt;br /&gt;
        },&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.emitEvent(&#039;delayed&#039;, domoticz.time.rawTime ).afterSec(30)&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.notify(&#039;Delayed&#039;, &#039;Event was emitted at &#039; .. item.data, domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have two devices—a smoke detector ‘myDetector’ and a room temperature sensor ‘roomTemp’, and you want to send a notification when either the detector detects smoke or the temperature is too high:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = {&lt;br /&gt;
            &#039;myDetector&#039;,&lt;br /&gt;
            &#039;roomTemp&#039;&lt;br /&gt;
    }&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        if ((device.name == &#039;myDetector&#039; and device.active) or&lt;br /&gt;
            (device.name == &#039;roomTemp&#039; and device.temperature &amp;gt;= 45)) then&lt;br /&gt;
            domoticz.notify(&#039;Fire&#039;, &#039;The room is on fire&#039;, domoticz.PRIORITY_EMERGENCY)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / group changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a scene ‘myScene’ and a group ‘myGroup’, and you want to turn on the group as soon as myScene is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        scenes = { &#039;myScene&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, scene)&lt;br /&gt;
        if (scene.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.groups(&#039;myGroup&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you want to send an email when a group is activated at night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        groups = { [&#039;myGroup&#039;] = {&#039;at nighttime&#039;} }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, group)&lt;br /&gt;
        if (group.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.email(&#039;Hey&#039;, &#039;The group is on&#039;, &#039;someone@the.world.org&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timer events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to check the soil humidity every 30 minutes during the day and every hour during the night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every 30 minutes at daytime&#039;,&lt;br /&gt;
            &#039;every 60 minutes at nighttime&#039;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, timer)&lt;br /&gt;
        domoticz.log(&#039;The rule that triggered the event was: &#039; .. timer.trigger&#039;)&lt;br /&gt;
        if (domoticz.devices(&#039;soil&#039;).moisture &amp;gt; 100) then&lt;br /&gt;
            domoticz.devices(&#039;irrigation&#039;).switchOn().forMin(60)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a script that updates a variable ‘myAmountOfMoney’, and if that variable reaches a certain level you want to be notified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        variables = { &#039;myAmountOfMoney&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, variable)&lt;br /&gt;
        -- variable is the variable that&#039;s triggered&lt;br /&gt;
        if (variable.value &amp;gt; 1000000) then&lt;br /&gt;
            domoticz.notify(&#039;Rich&#039;, &#039;You can stop working now&#039;, domoticz.PRIORITY_HIGH)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Security changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a group holding all the lights in your house, and you want to switch it off as soon as the alarm is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        security = { domoticz.SECURITY_ARMEDAWAY }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, security)&lt;br /&gt;
        domoticz.groups(&#039;All lights&#039;).switchOff()&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-request-and-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous HTTP Request and handling ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some external web service that will tell you what the current energy consumption is and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        httpResponses = { &#039;energyRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
            url = &#039;http://url/to/service&#039;,&lt;br /&gt;
            method = &#039;GET&#039;,&lt;br /&gt;
            callback = &#039;energyRetrieved&#039;&lt;br /&gt;
            })&lt;br /&gt;
        elseif (item.isHTTPResponse) then&lt;br /&gt;
            if (item.ok) then -- statusCode == 2xx&lt;br /&gt;
                local current = item.json.consumption&lt;br /&gt;
                domoticz.devices(&#039;myCurrentUsage&#039;).updateEnergy(current)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous shell command execution &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some local shellcommand to measure the speed of your internet connection and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        shellCommandResponses = { &#039;internetspeedRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;speedtest-cli --json&#039;,      -- just an example&lt;br /&gt;
            callback = &#039;internetspeedRetrieved&#039;,   -- see shellCommandResponses above.&lt;br /&gt;
            timeout = 20,                          -- max execution time in seconds&lt;br /&gt;
        })&lt;br /&gt;
        elseif (item.isShellCommandResponse) then&lt;br /&gt;
            if (item.statusCode==0) then&lt;br /&gt;
                domoticz.devices(&#039;myCurrentdownloadspeed&#039;).updateCustomSensor(item.json.download)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_shell_command_execution|asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System changes ===&lt;br /&gt;
&lt;br /&gt;
Do some initial work when domoticz starts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        system =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;start&#039;,&lt;br /&gt;
            &#039;backupDoneDaily&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, system)&lt;br /&gt;
        domoticz.log(&#039;Domoticz sends &#039; .. system.type, domoticz.LOG_INFO)&lt;br /&gt;
&lt;br /&gt;
        if system.type == &#039;start&#039; then&lt;br /&gt;
            domoticz.device(&#039;initial device&#039;).switchOff().silent&lt;br /&gt;
            domoticz.variables(&#039;special startVar&#039;).set(&#039;domoticz started at &#039; .. domoticz.time.rawDateTime )&lt;br /&gt;
        elseif system.type == &#039;backupDoneDaily&#039; then&lt;br /&gt;
            domoticz.notify(&#039;Domoticz backup&#039;, &#039;Ended. Backupfile &#039; .. system.data.location , domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;combined-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Combined rules ===&lt;br /&gt;
&lt;br /&gt;
Let’s say you have a script that checks the status of a lamp and is triggered by motion detector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
            timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
            devices = { &#039;myDetector&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- the timer was triggered&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOff()&lt;br /&gt;
        elseif (item.isDevice and item.active) then&lt;br /&gt;
            -- it must be the detector&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;at-startup-trigger&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== At startup trigger ===&lt;br /&gt;
&lt;br /&gt;
You can add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section to have your script execute once when Domoticz starts, in addition to any other triggers. This is useful when combined with interval-based rules to avoid waiting for the first interval to pass:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        at_startup = true,&lt;br /&gt;
        timer = { &#039;every hour&#039; },&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        -- Runs immediately when Domoticz starts, then every hour&lt;br /&gt;
        domoticz.devices(&#039;myThermostat&#039;).setPoint(21)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; trigger fires on the first timer tick after Domoticz starts (within 2 minutes of startup). It can be combined with any other trigger types (timer, devices, httpResponses, etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is different from &amp;lt;code&amp;gt;system = { &#039;start&#039; }&amp;lt;/code&amp;gt; which is a system event trigger. &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; is simpler - just add the flag and your existing script will also run at startup without needing to check &amp;lt;code&amp;gt;item.isSystemEvent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-trigger-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &#039;&#039;timer&#039;&#039; trigger rules ==&lt;br /&gt;
&lt;br /&gt;
There are several options for time triggers. It is important to know that Domoticz timer events only trigger once every minute, so one minute is the smallest interval for your timer scripts. However, dzVents gives you many options to have full control over when and how often your timer scripts are called (all times are in 24hr format and all dates in dd/mm): Keywords recognized are “at, between, every, except, in, on, or” ( except supported from version &amp;lt;sup&amp;gt;3.0.16&amp;lt;/sup&amp;gt;, or supported from version &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
At every place you read &amp;lt;astroMoment&amp;gt; you can use one of: sunset, sunrise, solarnoon, midnight &#039;&#039;, sunatsouth &#039;&#039;, civiltwilightstart, civiltwilightend, astronomicaltwilightstart &#039;&#039;, astronomicaltwilightend &#039;&#039;, nauticaltwilightstart * or nauticaltwilightend *.&lt;br /&gt;
&lt;br /&gt;
Full daynames are allowed in dzVents &amp;amp;gt;= 3.1.7&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every minute&#039;,             -- causes the script to be called every minute&lt;br /&gt;
            &#039;every other minute&#039;,       -- minutes: xx:00, xx:02, xx:04, ..., xx:58&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; minutes&#039;,       -- starting from xx:00 triggers every xx minutes&lt;br /&gt;
                                        -- (0 &amp;gt; xx &amp;lt; 60)&lt;br /&gt;
            &#039;every hour&#039;,               -- 00:00, 01:00, ..., 23:00 (24x per 24hrs)&lt;br /&gt;
            &#039;every other hour&#039;,         -- 00:00, 02:00, ..., 22:00 (12x per 24hrs)&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; hours&#039;,         -- starting from 00:00, triggers every xx&lt;br /&gt;
                                        -- hours (0 &amp;gt; xx &amp;lt; 24)&lt;br /&gt;
            &#039;at 13:45&#039;,                 -- specific time&lt;br /&gt;
            &#039;at *:45&#039;,                  -- every 45th minute in the hour&lt;br /&gt;
            &#039;at 15:*&#039;,                  -- every minute between 15:00 and 16:00&lt;br /&gt;
            &#039;at 12:45-21:15&#039;,           -- between 12:45 and 21:15. You cannot use &#039;*&#039;!&lt;br /&gt;
            &#039;at 19:30-08:20&#039;,           -- between 19:30 and 8:20 (next day)&lt;br /&gt;
            &#039;at 13:45 on mon,tue&#039;,      -- at 13:45 only on Mondays and Tuesdays (english)&lt;br /&gt;
            &#039;on mon,tue&#039;,               -- on Mondays and Tuesdays&lt;br /&gt;
            &#039;every hour on Saturday&#039;,   -- you guessed it correctly&lt;br /&gt;
            &#039;at sunset&#039;,                -- uses sunset/sunrise/solarnoon info from Domoticz&lt;br /&gt;
            &#039;at sunrise&#039;,&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt;&#039;,         -- dzVents &amp;gt;= 3.0.16 Uses the times received from Domoticz&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt; on sat,sun&#039;,&lt;br /&gt;
            &#039;xx minutes before &amp;lt;astroMoment&amp;gt;&#039;,  --&lt;br /&gt;
            &#039;xx minutes after &amp;lt;astroMoment&amp;gt;&#039;,   -- Please note that these relative times will cross dates&lt;br /&gt;
            &#039;between aa and bb&#039;         -- aa/bb can be a time stamp like 15:44 (if aa &amp;gt; bb will cross dates)&lt;br /&gt;
                                        -- aa/bb can be sunrise/sunset/solarnoon (&#039;between sunset and sunrise&#039; and &#039;between solarnoon and sunrise&#039; will cross dates)&lt;br /&gt;
                                        -- aa/bb can be &#039;xx minutes before/after &amp;lt;astroMoment&amp;gt;&#039;&lt;br /&gt;
            &#039;at &amp;lt;astroRange&amp;gt;&#039;,          -- between &amp;lt;astroMoment&amp;gt;start and &amp;lt;astroMoment&amp;gt;end&lt;br /&gt;
            &#039;at nighttime&#039;,             -- between sunset and sunrise&lt;br /&gt;
            &#039;at daytime&#039;,               -- between sunrise and sunset&lt;br /&gt;
            &#039;at daytime on mon,tue&#039;,    -- between sunrise and sunset only on Mondays and Tuesdays&lt;br /&gt;
            &#039;in week 1-7,44&#039;            -- in week 1-7 or 44&lt;br /&gt;
            &#039;in week 20-25,33-47&#039;       -- between week 20 and 25 or week 33 and 47&lt;br /&gt;
            &#039;in week -12, 33-&#039;          -- week &amp;lt;= 12 or week &amp;gt;= 33&lt;br /&gt;
            &#039;every odd week&#039;,&lt;br /&gt;
            &#039;every even week&#039;,          -- odd or even numbered weeks&lt;br /&gt;
            &#039;on 23/11&#039;,                 -- on 23rd of November (dd/mm)&lt;br /&gt;
            &#039;on 23/11-25/12&#039;,           -- between 23/11 and 25/12&lt;br /&gt;
            &#039;on 2/3-8/3,7/8,6/10-14/10&#039;,-- between march 2 and 8, on august 7 and between October 6 and 14.&lt;br /&gt;
            &#039;on */2,15/*&#039;,              -- every day in February or&lt;br /&gt;
                                        -- every 15th day of the month&lt;br /&gt;
            &#039;on -3/4,4/7-&#039;,             -- before 3/4 or after 4/7&lt;br /&gt;
&lt;br /&gt;
            &#039;at 12:45-21:15 except at 18:00-18:30&#039;, -- between 12:45 and 21:15 but not between 18:00 and 18:30 ( except supported from 3.0.16 onwards )&lt;br /&gt;
            &#039;at daytime except on sun&#039;,             -- between sunrise and sunset but not on Sundays&lt;br /&gt;
            &#039;at daytime or at 23:12&#039;,               -- between sunrise and sunset and also at 23:12&lt;br /&gt;
&lt;br /&gt;
            -- or if you want to go really wild and combine them:&lt;br /&gt;
                &#039;at nighttime at 21:32-05:44 every 5 minutes on sat, sun except at 04:00&#039;, -- except supported from 3.0.16 onwards&lt;br /&gt;
                &#039;every 10 minutes between 20 minutes before sunset and 30 minutes after sunrise on mon,fri,tue on 20/5-18/8&#039;&lt;br /&gt;
&lt;br /&gt;
            -- or just do it yourself:&lt;br /&gt;
                function(domoticz)&lt;br /&gt;
                -- you can use domoticz.time to get the current time&lt;br /&gt;
                -- note that this function is called every minute!&lt;br /&gt;
                -- custom code that either returns true or false&lt;br /&gt;
                ...&lt;br /&gt;
            end&lt;br /&gt;
        },&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The timer events are triggered every minute. If such a trigger occurs, dzVents will scan all timer-based events and will evaluate the timer rules. So, if you have a rule &amp;lt;code&amp;gt;on mon&amp;lt;/code&amp;gt; then the script will be executed &#039;&#039;every minute&#039;&#039; but only on Monday.&lt;br /&gt;
&lt;br /&gt;
Be mindful of the logic if using multiple types of timer triggers. It may not make sense to combine a trigger for a specific or instantaneous time with a trigger for a span or sequence of times (like ‘at sunset’ with ‘every 6 minutes’) in the same construct. Similarly, &amp;lt;code&amp;gt;&#039;between aa and bb&#039;&amp;lt;/code&amp;gt; only makes sense with instantaneous times for &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One important note: if Domoticz, for whatever reason, skips a timer event then you may miss the trigger! Therefore, you should build in some fail-safe checks or some redundancy if you have critical time-based stuff to control. There is nothing dzVents can do about it&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you want your timer script to also run at Domoticz startup (instead of waiting for the first timer match), add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section. See [[#at-startup-trigger|At startup trigger]].&lt;br /&gt;
&lt;br /&gt;
Another important issue: the way it is implemented right now, the &amp;lt;code&amp;gt;every xx minutes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every xx hours&amp;lt;/code&amp;gt; is a bit limited. The interval resets at every *:00 (for minutes) or 00:* for hours. You need an interval that is an integer divider of 60 (or 24 for the hours). So you can do every 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 and 30 minutes only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-domoticz-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= The domoticz object =&lt;br /&gt;
&lt;br /&gt;
The domoticz object passed as the first parameter to the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function contains everything you need to interact with your domotica system. It provides all information made available by the domoticz event system about your custom- and system events, devices, scenes, groups, hardware modules and variables and has methods needed to inspect and manipulate them. Getting this information is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;domoticz.time.isDayTime&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).temperature&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).lastUpdate.minutesAgo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The domoticz object consists of a logically arranges structure. It harbors all methods to manipulate Domoticz. dzVents will take care to notify Domoticz with all your intended changes and actions. Earlier you had to fill a commandArray with obscure commands. That’s no longer the case.&lt;br /&gt;
&lt;br /&gt;
Some more examples: &amp;lt;code&amp;gt;domoticz.devices(123).switchOn().forMin(5).afterSec(10)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My dummy sensor&#039;).updateBarometer(1034, domoticz.BARO_THUNDERSTORM)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One tip before you get started: &#039;&#039;&#039;Make sure that all your devices have unique names. dzVents will give you warnings in the logs if device names are not unique.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-object-api-application-programming-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Domoticz object API (Application Programming Interface) ==&lt;br /&gt;
&lt;br /&gt;
The domoticz object holds all information about your Domoticz system. It has global attributes and methods to query and manipulate your system. It also has a collection of &#039;&#039;&#039;devices&#039;&#039;&#039;, &#039;&#039;&#039;variables&#039;&#039;&#039; (user variables in Domoticz), &#039;&#039;&#039;scenes&#039;&#039;&#039;, &#039;&#039;&#039;groups&#039;&#039;&#039;, &#039;&#039;&#039;hardware&#039;&#039;&#039;. Each of these collections has four iterator functions: &amp;lt;code&amp;gt;find(), forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; to make searching for devices easier. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Domoticz attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a device by idx or name: &amp;lt;code&amp;gt;domoticz.devices(123)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My switch&#039;)&amp;lt;/code&amp;gt;. For the device API see [[#Device_object_API|Device object API]]. To iterate over all devices do: &amp;lt;code&amp;gt;domoticz.devices().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.devices()) do .. end&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;dump([osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all domoticz.settings attributes to the Domoticz log. This ignores the log level setting.&lt;br /&gt;
* &#039;&#039;&#039;email(subject, message, mailTo [, delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send email. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;emitEvent(name,[extra data ])&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a customEvent. If you just pass a name then Domoticz will execute the script(s) that subscribed to the named customEvent after your script has finished. You can optionally pass extra information as a string or table. A table will be automatically converted into a json string and converted back to a table in the subscribed script(s). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;executeShellCommand(command/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a command. If you just pass a command then Domoticz will execute the command after your script has finished but you will not get notified. If you pass options table with a callback then you have the possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_shell_command_execution|asynchronous shell commands]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &#039;&#039;&#039;Note Make sure that when you use this function on a Windows system and use one or more of the special chars &amp;amp;amp;&amp;amp;lt;&amp;amp;gt;()@^| outside double quotes, you will have to escape these with a ^ char &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;groups(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a group by name or idx. Each group has the same interface as a device. To iterate over all groups do: &amp;lt;code&amp;gt;domoticz.groups().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.groups()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Group|Groups]].&lt;br /&gt;
* &#039;&#039;&#039;hardwareInfo(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.6&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning hardwareInfo of a hardware module by name or idx. The return of the function is a table with attributes name, type, typeValue, deviceNames (table with names of all active devices defined on this hardware) and deviceIds (table with idx of all active devices defined on this hardware)&lt;br /&gt;
* &#039;&#039;&#039;hardware(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning a hardware module by name or idx. Each hardware has an interface comparable to group. To iterate over all hardware do: &amp;lt;code&amp;gt;domoticz.hardware().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.hardware()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Hardware|Hardware]].&lt;br /&gt;
* &#039;&#039;&#039;helpers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Collection of shared helper functions available to all your dzVents scripts. See [[#Shared_helper_functions|Shared helper functions]].&lt;br /&gt;
* &#039;&#039;&#039;log(message, [level])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a log entry in the Domoticz log but respects the log minimum level settings. You can provide the loglevel: &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_STATUS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_ERROR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_DEBUG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.LOG_FORCE&amp;lt;/code&amp;gt;. In Domoticz settings you can set the default log level for dzVents.&lt;br /&gt;
* &#039;&#039;&#039;moduleLabel&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; Module (script) name without extension.&lt;br /&gt;
* &#039;&#039;&#039;notify(subject, message [,priority][,sound][,extra][,subsystem][,delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send a notification (like Prowl). Priority can be like &amp;lt;code&amp;gt;domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt; is notification subsystem specific. For NSS_FIREBASE you can use this field to specify the target mobile (‘midx_1’, midx_2, etc..) or specify &amp;lt;code&amp;gt;device.id&amp;lt;/code&amp;gt; so the receiver knows which device triggered the notification. For sound see [[#Constants|list of dzVents Constants]] for the SOUND constants below. &amp;lt;code&amp;gt;subsystem&amp;lt;/code&amp;gt; defaults to all subsystems but can be one subsystem or a table containing one or more notification subsystems. See [[#Constants|list of dzVents Constants]] for &amp;lt;code&amp;gt;domoticz.NSS_subsystem&amp;lt;/code&amp;gt; types. Delay is delay in seconds&lt;br /&gt;
* &#039;&#039;&#039;openURL(url/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ a URL. If you just pass a url then Domoticz will execute the url after your script has finished but you will not get notified. If you pass a table with options then you have to possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_HTTP_requests|asynchronous http requests]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;scenes(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a scene by name or id. Each scene has the same interface as a device. See [[#Device_object_API|Device object API]]. To iterate over all scenes do: &amp;lt;code&amp;gt;domoticz.scenes().forEach(..)&amp;lt;/code&amp;gt;. See [[#looping-through-the-collections-iterators|Looping through the collections: iterators]]. (#Looping_through_the_collections:_iterators). Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.scenes()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Scene|Scenes]].&lt;br /&gt;
* &#039;&#039;&#039;security&#039;&#039;&#039;: Holds the state of the security system e.g. &amp;lt;code&amp;gt;Armed Home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Armed Away&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;sendCommand(command, value[, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: Generic (low-level)command method (adds it to the commandArray) to the list of commands that are being sent back to domoticz. Optional parm delay is delay in seconds &#039;&#039;There is likely no need to use this directly. Use any of the device methods instead (see below).&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;settings&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;domoticzVersion&#039;&#039;&#039;: domoticz version string.&lt;br /&gt;
** &#039;&#039;&#039;dzVentsVersion&#039;&#039;&#039;: dzVents version string.&lt;br /&gt;
** &#039;&#039;&#039;location&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;latitude&#039;&#039;&#039;: domoticz settings locations latitude.&lt;br /&gt;
*** &#039;&#039;&#039;longitude&#039;&#039;&#039;: domoticz settings locations longitude.&lt;br /&gt;
*** &#039;&#039;&#039;name&#039;&#039;&#039;: domoticz settings location Name.&lt;br /&gt;
** &#039;&#039;&#039;secureServer&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; true when domoticz can be accessed via https.&lt;br /&gt;
** &#039;&#039;&#039;serverPort&#039;&#039;&#039;: webserver listening port used by dzVents to access domoticz API.&lt;br /&gt;
** &#039;&#039;&#039;url&#039;&#039;&#039;: internal url to access the API service.&lt;br /&gt;
** &#039;&#039;&#039;webRoot&#039;&#039;&#039;: &amp;lt;code&amp;gt;webroot&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
** &#039;&#039;&#039;wwwBind&#039;&#039;&#039;: &amp;lt;code&amp;gt;wwwbind&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.4&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
* &#039;&#039;&#039;sms(message [, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends an sms if it is configured in Domoticz. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;snapshot(cameraID(s) or camera Name(s)&amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt;,subject)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends email with a camera snapshots if email is configured and set for attachments in Domoticz. Send 1 or multiple camerIDs -names in ; separated string or array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    dz.snapshot()                  -- defaults to id = 1, subject domoticz&lt;br /&gt;
    dz.snapshot(1,&#039;dz&#039;)            -- subject dz&lt;br /&gt;
    dz.snapshot(&#039;1;2;3&#039;)           -- ; separated string&lt;br /&gt;
    dz.snapshot({1,4,7})           -- table&lt;br /&gt;
    dz.snapshot(&#039;test;test2&#039;)      -- ; separated string&lt;br /&gt;
    dz.snapshot({&#039;test&#039;, &#039;test2&#039;}) -- table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTimerPlan(idx)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch the active timer plan to the plan with the given database ID. &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; must be a positive integer matching an existing timer plan ID (as shown in &#039;&#039;&#039;Settings → Timer Plans&#039;&#039;&#039;). Invalid or non-existent plan IDs are silently ignored. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;startTime&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;. Returns the startup time of the Domoticz service.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;systemUptime&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds the system is up.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Current system time. Additional to Time object attributes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if the device was updated today&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will rise.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will set.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will start.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will end.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerHTTPResponse([httpResponse], [delay], [message])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a callback by sending a logmessage. httpResponse defaults to scriptname, delay defaults to 0 (immediate), message defaults to httpResponse. Left in for backward compatibility only. You can use emitEvent / customEvents now.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerIFTTT(makerName [,sValue1, sValue2, sValue3])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ an IFTTT maker event. makerName is required, 0-3 sValue’s are optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;utils&#039;&#039;&#039;: . A subset of handy utilities: Note that these functions must be preceded by domoticz.utils. If you use more then a few declare something like local _u = domoticz.utils at the beginning of your script and use _u.functionName in the remainder. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    _u = domoticz.utils&lt;br /&gt;
    print(_u.rightPad(&#039;test&#039;,10) .. &#039;|||&#039;) -- =&amp;gt; test       |||&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;_.lodashFunctions&#039;&#039;&#039;: This is an entire collection with very handy Luafunctions. Read more about [[#lodash_for_Lua|lodash]]. E.g.: &amp;lt;code&amp;gt;{.lua}   domoticz.utils._.size({&#039;abc&#039;, &#039;def&#039;}))` Returns 2.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;cameraExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid camera &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or cameraID and return ID when entered with valid cameraName or false when not a camera, cameraID or cameraName of an existing camera&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid device &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or deviceID and returns ID when entered with valid deviceName or false when not a device, deviceID or deviceName of an existing (and active) device. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local dz = domoticz&lt;br /&gt;
local _u = dz.utils&lt;br /&gt;
if _u.deviceExists(&#039;myDevice&#039;) then&lt;br /&gt;
    dz.devices(&#039;myDevice&#039;).switchOn()&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device myDevice does not exist!&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local myName = _u.deviceExists(123)&lt;br /&gt;
if myName then&lt;br /&gt;
    dz.log(&#039;Device 123 is &#039; .. myName, dz.LOG_INFO)&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device 123 does not exist&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpTable(table,[levelIndicator],[osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;))&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: print table structure and contents to log&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fileExists(path)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file (with full path) exists.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Decode a base64 string&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromJSON(json, fallback, deSerialize &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Turns a json string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromJSON(&#039;{ &amp;amp;quot;a&amp;amp;quot;: 1 }&#039;)&amp;lt;/code&amp;gt;. Followed by: &amp;lt;code&amp;gt;print( t.a )&amp;lt;/code&amp;gt; will print 1. Optional 2nd param fallback will be returned if json is nil or invalid. Optional 3rd param deSerialize (boolean) determines if the JSON should be deserialized before converting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromXML(xml, fallback )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Turns a xml string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromXML(&#039;&amp;amp;lt;testtag&amp;amp;gt;What a nice feature!&amp;amp;lt;/testtag&amp;amp;gt;&#039;) Followed by:&amp;lt;/code&amp;gt;print( t.texttag)` will print What a nice feature! Optional 2nd param fallback will be returned if xml is nil or invalid.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fuzzyLookup([string|array of strings], parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.14&amp;lt;/sup&amp;gt;. Search fuzzy matching string in parm. If parm is string it returns a number (lower is better match). If parm is array of strings it returns the best matching string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;groupExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid group &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or groupID and return ID when entered with valid groupName or false when not a group, groupID or groupName of an existing group&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; returns name when entered with valid hardwareID or ID when entered with valid hardwareName or false when not a hardwareID or hardwareName of an existing (and active )hardware module&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inTable(table, searchString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;&amp;amp;quot;key&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as a key, &amp;lt;code&amp;gt;&amp;amp;quot;value&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as value and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isJSON(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘application/json’ or string is enclosed in {} and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isXML(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘text/xml’ or ‘application/xml’ or string is enclosed in &amp;amp;lt;&amp;amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leftPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;centerPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Center string by preceding and succeeding with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;numDecimals(number [, integer [, decimals ]])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Format number to float representation. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        domoticz.utils.numDecimals(12.23, 4, 4) -- =&amp;gt; 12.2300,&lt;br /&gt;
        domoticz.utils.numDecimals (12.23,1,1) -- =&amp;gt; 12.2,&lt;br /&gt;
        domoticz.utils.leadingZeros(domoticz.utils.numDecimals (12.23,4,4),9) -- =&amp;gt; 0012.2300&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osCommand(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt; Execute an OS command and return result and returncode. Note: For long running scripts &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; should be used, See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osExecute(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Execute an OS command (no return). Note: For long running scripts &amp;lt;code&amp;gt;executeShellCommand()&amp;lt;/code&amp;gt; should be used. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rightPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Succeed string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;round(number, [decimalPlaces])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Helper function to round numbers. Default decimalPlaces is 0.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sceneExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with valid scene &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or sceneID and return ID when entered with valid sceneName or false when not a scene, sceneID or sceneName of an existing scene&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setLogMarker([marker])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: set logMarker to ‘marker’. Defaults to scriptname. Can be used to change logMarker based on flow in script&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;splitLine(string , splitOnWord ) &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line. Return is a table with line-segments.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringSplit(string [,separator ] [,convertNumber ][,convertNil ]&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line in separate words. Default separator is space. Return is a table with separated words. Default convertNumber is false when set to true it will convert strings to number where possible. Word is ignored when nil, unless convertNil is set; in that case word will be set to the convertNil value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringToSeconds(str)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Returns number of seconds between now and str. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.utils.stringToSeconds(&#039;09:00&#039;)                 -- number of seconds between now and 09:00 hr.&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on fri&#039;)       -- number of seconds between now and Friday at 08:53:30&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on sat, sun&#039;)  -- number of seconds between now and Saturday or Sunday at 08:53:30 ;whatever comes first&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: ) Encode a string to base64&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toCelsius(f, relative)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts temperature from Fahrenheit to Celsius along the temperature scale or when relative == true it uses the fact that 1F = 0.56C. So &amp;lt;code&amp;gt;toCelsius(5, true)&amp;lt;/code&amp;gt; returns 5F*(1/1.8) = 2.78C.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toJSON(luaTable)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a json string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toXML(luaTable, [header])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a xml string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlDecode(s)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple deCoder to convert a string with escaped chars (%20, %3A and the likes) to human readable format.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlEncode(s, [strSub])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple url encoder for string so you can use them in &amp;lt;code&amp;gt;openURL()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;strSub&amp;lt;/code&amp;gt; is optional and defaults to + but you can also pass %20 if you like/need.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variableExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid variable &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or variableID and return ID when entered with valid variableName or false when not a variable, variableID or variableName of an existing variable&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leadingZeros(number, length)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede number with given zeros to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variables(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a variable by it’s name or idx. See [Variable object API] (#Variable_object_API_.28user_variables.29) for the attributes. To iterate over all variables do: &amp;lt;code&amp;gt;domoticz.variables().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. &#039;&#039;&#039;Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.variables()) do .. end&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-collections-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Looping through the collections: iterators ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these collections (tables): devices, scenes, groups, variables, changedDevices and changedVariables. You cannot use the &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; functions. Therefore dzVents has four iterator methods:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Returns the item in the collection for which &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; returns true. When no item is found &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; returns nil.&lt;br /&gt;
# &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Executes function once per array element. The function receives the item in the collection (device or variable). If the function returns &#039;&#039;false&#039;&#039;, the loop is aborted.&lt;br /&gt;
# &#039;&#039;&#039;filter(function / table)&#039;&#039;&#039;: returns items in the collection for which the function returns true. You can also provide a table with names and/or ids.&lt;br /&gt;
# &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the collection and do some calculation with it. You call it with the function and the initial value. Each iteration the function is called with the accumulator and the item in the collection. The function does something with the accumulator and returns a new value for it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Examples: ====&lt;br /&gt;
&lt;br /&gt;
find():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myDevice = domoticz.devices().find(function(device)&lt;br /&gt;
        return device.name == &#039;myDevice&#039;&lt;br /&gt;
    end)&lt;br /&gt;
    domoticz.log(&#039;Id: &#039; .. myDevice.id)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
forEach():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().forEach(function(device)&lt;br /&gt;
        if (device.batteryLevel &amp;lt; 20) then&lt;br /&gt;
        -- do something&lt;br /&gt;
        end&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
filter():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local deadDevices = domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end)&lt;br /&gt;
    deadDevices.forEach(function(zombie)&lt;br /&gt;
        -- do something&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local livingLights = {&lt;br /&gt;
        &#039;window&#039;,&lt;br /&gt;
        &#039;couch&#039;,&lt;br /&gt;
        33, -- kitchen light id&lt;br /&gt;
    }&lt;br /&gt;
    local lights = domoticz.devices().filter(livingLights)&lt;br /&gt;
    lights.forEach(function(light)&lt;br /&gt;
        -- do something&lt;br /&gt;
        light.switchOn()&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can chain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end).forEach(function(zombie)&lt;br /&gt;
        -- do something with the zombie&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Using a reducer to count all devices that are switched on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local count = domoticz.devices().reduce(function(acc, device)&lt;br /&gt;
        if (device.state == &#039;On&#039;) then&lt;br /&gt;
            acc = acc + 1 -- increase the accumulator&lt;br /&gt;
        end&lt;br /&gt;
        return acc -- always return the accumulator&lt;br /&gt;
    end, 0) -- 0 is the initial value for the accumulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;constants&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these constants available for use in your code e.g. &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT: you have to prefix these constants with the name of your domoticz object. Example: &amp;lt;code&amp;gt;domoticz.ALERTLEVEL_RED&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_ORANGE, ALERTLEVEL_RED, ALERTLEVEL_YELLOW&#039;&#039;&#039;: for updating text sensors.&lt;br /&gt;
* &#039;&#039;&#039;BASETYPE_CUSTOM_EVENT &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;,BASETYPE_DEVICE, BASETYPE_SCENE, BASETYPE_GROUP, BASETYPE_HARDWARE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;BASETYPE_VARIABLE, BASETYPE_SECURITY, BASETYPE_TIMER, BASETYPE_HTTP_RESPONSE, BASETYPE_SYSTEM&#039;&#039;&#039;&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;: indicators for the various object types that are passed as the second parameter to the execute function. E.g. you can check if an object is a device object: &amp;lt;code&amp;gt;Lua  if (item.baseType == domoticz.BASETYPE_DEVICE) then ... end&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;BARO_CLOUDY, BARO_CLOUDY_RAIN, BARO_STABLE, BARO_SUNNY, BARO_THUNDERSTORM, BARO_NOINFO, BARO_UNSTABLE, BARO_COMPUTE&#039;&#039;&#039; : for updating barometric values.&lt;br /&gt;
* &#039;&#039;&#039;EVENT_TYPE_DEVICE, EVENT_TYPE_VARIABLE, EVENT_TYPE_CUSTOM&#039;&#039;&#039;, &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_SECURITY, EVENT_TYPE_HTTPRESPONSE, EVENT_TYPE_SYSTEM,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_TIMER&#039;&#039;&#039;: triggerInfo types passed to the execute function in your scripts.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_TEMPORARY_OVERRIDE, EVOHOME_MODE_PERMANENT_OVERRIDE, EVOHOME_MODE_FOLLOW_SCHEDULE&#039;&#039;&#039;: mode for EvoHome system.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_AUTOWITHRESET, EVOHOME_MODE_AUTOWITHECO, EVOHOME_MODE_AWAY, EVOHOME_MODE_DAYOFF, EVOHOME_MODE_CUSTOM, EVOHOME_MODE_HEATINGOFF&#039;&#039;&#039; : mode for EvoHome controller&lt;br /&gt;
* &#039;&#039;&#039;HUM_COMFORTABLE, HUM_DRY, HUM_NORMAL, HUM_WET, HUM_COMPUTE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;: constant for humidity status.&lt;br /&gt;
* &#039;&#039;&#039;INTEGER, FLOAT, STRING, DATE, TIME&#039;&#039;&#039;: variable types.&lt;br /&gt;
* \**LOG_INFO, LOG_STATUS, LOG_ERROR, LOG_DEBUG, LOG_FORCE: for logging messages. LOG_FORCE will always be displayed.&lt;br /&gt;
* &#039;&#039;&#039;NSS_CLICKATELL&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_FIREBASE, NSS_FIREBASE_CLOUD_MESSAGING, NSS_GOOGLE_DEVICES,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; &amp;lt;sup&amp;gt;Only with installed casting plugin&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER, NSS_TELEGRAM, NSS_GOOGLE_CLOUD_MESSAGING&#039;&#039;&#039; &amp;lt;sup&amp;gt;deprecated by Google and replaced by firebase&amp;lt;/sup&amp;gt;: for notification subsystem&lt;br /&gt;
* &#039;&#039;&#039;PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&#039;&#039;&#039;: for notification priority.&lt;br /&gt;
* &#039;&#039;&#039;SECURITY_ARMEDAWAY, SECURITY_ARMEDHOME, SECURITY_DISARMED&#039;&#039;&#039;: for security state.&lt;br /&gt;
* &#039;&#039;&#039;STATE_IDLE, STATE_COOLING, STATE_HEATING&#039;&#039;&#039;: for thermostat operating state.&lt;br /&gt;
* &#039;&#039;&#039;SOUND_ALIEN , SOUND_BIKE, SOUND_BUGLE, SOUND_CASH_REGISTER, SOUND_CLASSICAL, SOUND_CLIMB , SOUND_COSMIC, SOUND_DEFAULT, SOUND_ECHO, SOUND_FALLING, SOUND_GAMELAN, SOUND_INCOMING, SOUND_INTERMISSION, SOUND_MAGIC, SOUND_MECHANICAL, SOUND_NONE, SOUND_PERSISTENT, SOUND_PIANOBAR , SOUND_SIREN, SOUND_SPACEALARM, SOUND_TUGBOAT, SOUND_UPDOWN&#039;&#039;&#039;: for notification sounds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Custom event API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a customEvent in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;notification&#039;&#039; object. The object.type = customEvent (isCustomEvent: true) and object.data contains the passed data to this script. object.trigger is the name of the customEvent that triggered the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-object-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device object API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by switching a device in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;device&#039;&#039; object. Also, each device in Domoticz can be found in the &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; collection (see above). The device object has a set of fixed attributes like &#039;&#039;name&#039;&#039; and &#039;&#039;idx&#039;&#039;. Many devices, however, have different attributes and methods depending on their (hardware)type, subtype and other device specific identifiers. It is possible that you will get an error if you call a method on a device that doesn’t support it, so please check the device properties for your specific hardware to see which are supported (can also be done in your script code!).&lt;br /&gt;
&lt;br /&gt;
dzVents recognizes most of the different device types in Domoticz and creates the proper attributes and methods. It is possible that your device type has attributes that are not recognized; if that’s the case, please create a ticket in the Domoticz [https://github.com/domoticz/domoticz/issues issue tracker on GitHub], and an adapter for that device will be added.&lt;br /&gt;
&lt;br /&gt;
If for some reason you miss a specific attribute or data for a device, then likely the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute will have that information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-all-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device attributes and methods for all devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Same as bState.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;baseType&#039;&#039;&#039; &#039;&#039;String&#039;&#039;. ‘camera’, ‘device’, ‘group’, ‘scene’, ‘hardware’, ‘uservariable’ or ‘security’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;batteryLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-100.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;bState&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Better to use active.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True if the device was updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: This does not necessarily means the device state or value changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;customImage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. When customImage is used for the device-icon this will be the icon-number. It will be 0 if the icon was not changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;description&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Description of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceId&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Another identifier of devices in Domoticz. dzVents uses the id(x) attribute. See device list in Domoticz’ settings table.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceSubType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dump()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all attributes except functions and complete time overview to the Domoticz log. This ignores the log level setting. Use fullDump to include everything.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpSelection([{‘attributes’} ‘functions’ ‘tables’])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.5&amp;lt;/sup&amp;gt; Dump attributes, function-names or table-names to the Domoticz log. This ignores the log level setting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fullDump()&#039;&#039;&#039; &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt; Dump all attributes including functions and the complete time overview to the Domoticz log. This ignores the log level setting. Most of the time dump() shows everything what is needed to debug.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareId&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;icon&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the icon in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the device. You can find the index in the device list (idx column) in Domoticz settings. It’s not truly an index but is unique enough for dzVents to be treated as an id.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;idx&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as id: index of the device&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inActive&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; true if active is false and vice versa. If active is nil inActive is also nil&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Time when the device was updated. **Note: The lastUpdate for devices that triggered the script at hand is in fact the previousUpdate time. The real lastUpdate time for these “script triggering” devices is the current time.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;nValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Numerical representation of the state.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protected&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True when device / scene / group is protected. False otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options] !! **Note: domoticz protects against GUI and API access only. switchOn / switchOff type Blockly / Lua / dzVents commands are not influenced (because they are executed as admin user)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rawData&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;: All values are &#039;&#039;String&#039;&#039; types and hold the raw data received from Domoticz.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current devicename to new devicename Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setDescription(description)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic method to update the description for all devices, groups and scenes. E.g.: device.setDescription(device.description .. ‘/nChanged by’.. item.trigger .. ‘at’ .. domoticz.time.raw). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setIcon(iconNumber)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. method to update the icon for devices. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setState(newState)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method for switch-like devices. E.g.: device.setState(‘On’). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;resumeTimerPlan()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Finds the most recent timer that should have fired today (before now) for this device, scene, or group and executes it immediately. Useful for restoring the correct state after a Domoticz restart or power cut. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. ```lua – Replay last timer for a device domoticz.devices(‘My Light’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a scene domoticz.scenes(‘Evening Scene’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a group domoticz.groups(‘All Lights’).resumeTimerPlan() ```&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setValues(nValue,[ sValue1, sValue2, …])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic alternative method to update device nValue, sValues. Uses domoticz JSON API to force subsequent pushes like influxdb and MQTT. nValue required but when set to nil it defaults to current nValue. sValue parms are optional and can be many. &amp;lt;sup&amp;gt;3.0.8&amp;lt;/sup&amp;gt; If one of sValue parms is ‘parsetrigger’, subsequent eventscripts will be triggered.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For switches, holds the state like ‘On’ or ‘Off’. For dimmers that are on, it is also ‘On’ but there is a level attribute holding the dimming level. &#039;&#039;&#039;For selector switches&#039;&#039;&#039; (Dummy switch) the state holds the &#039;&#039;name&#039;&#039; of the currently selected level. The corresponding numeric level of this state can be found in the &#039;&#039;&#039;rawData&#039;&#039;&#039; attribute: &amp;lt;code&amp;gt;device.rawData[1]&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;signalLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-12&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI(Switches tab). E.g. ‘On/Off’, ‘Door Contact’, ‘Motion Sensor’ or ‘Blinds’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sValue&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the sValue (string Value) of a device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;timedOut&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true when the device couldn’t be reached.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;unit&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Device unit. See device list in Domoticz’ settings for the unit.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;update(&amp;amp;lt; params &amp;amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method. Accepts any number of parameters that will be sent back to Domoticz. There is no need to pass the device.id here. It will be passed for you. Example to update a temperature: &amp;lt;code&amp;gt;device.update(0,12)&amp;lt;/code&amp;gt;. This will eventually result in a commandArray entry &amp;lt;code&amp;gt;[&#039;UpdateDevice&#039;]=&#039;&amp;amp;lt;idx&amp;amp;gt;|0|12&#039;&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;updateQuiet(nValue, sValue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Uses the JSON/API to send nValue and/or sValue to domoticz (at least one should be supplied). Will update the device status in the GUI and trigger events but will not execute the action on the device. Only useful when the status in the GUI is not in line with the actual status. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-specific-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device attributes and methods for specific devices ===&lt;br /&gt;
&lt;br /&gt;
Note that if you do not find your specific device type here you can always inspect what is in the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute. Please let us know that it is missing so we can write an adapter for it (or you can write your own and submit it). Calling &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; will dump all attributes and values for myDevice to the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;air-quality&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Air quality ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;co2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. PPM&lt;br /&gt;
* &#039;&#039;&#039;quality&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Air quality string.&lt;br /&gt;
* &#039;&#039;&#039;updateAirQuality(ppm)&#039;&#039;&#039;: Pass the CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; concentration. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alert-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Alert sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Color of the alert. See domoticz color constants for possible values.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateAlertSensor(level, text)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-1-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 1-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Current in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-3-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 3-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current1&#039;&#039;&#039;, &#039;&#039;&#039;current2&#039;&#039;&#039;, &#039;&#039;&#039;current3&#039;&#039;&#039; : &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current1, current2, current3)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Currents in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. Barometric pressure.&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateBarometer(pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update barometric pressure. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-managed-counter-counter-incremental&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Counter, managed Counter, counter incremental ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Today’s counter value.&lt;br /&gt;
* &#039;&#039;&#039;updateCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &#039;&#039;&#039;Overwrite current value for managed and standard counters; increment for incremental counters !!&#039;&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateHistory( date, sValues )&#039;&#039;&#039;: &#039;&#039;Strings&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt; &#039;&#039;function&#039;&#039; Managed counter only! Used to write values to short or long term storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local mCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22&#039;, &#039;10;1777193&#039;) -- Write to long term storage (meter_calendar table)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22 10:05:02&#039;, &#039;10;1777193&#039;) -- Write to short term storage (meter table)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;incrementCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (counter incremental) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. To update with a complete new value you will have to do some calculation and take the counter divider into account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local newValue = value&lt;br /&gt;
    local iCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    local counterDivider = x -- x is depending on the counter divider set for the device&lt;br /&gt;
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;valueQuantity&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For counters.&lt;br /&gt;
* &#039;&#039;&#039;valueUnits&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Custom sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sensorType&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;sensorUnit&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;sensorValue&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; &#039;&#039;Number&#039;&#039; where applicable; else &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;updateCustomSensor(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;distance-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Distance sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateDistance(distance)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Electric usage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage. (please use actualWatt)&lt;br /&gt;
* &#039;&#039;&#039;updateEnergy(energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. In Watt. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-controller&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (controller) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;setMode(mode, dparm, action, ooc )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set mode for controller. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_AUTOWITHRESET, domoticz.EVOHOME_MODE_AUTOWITHECO, domoticz.EVOHOME_MODE_AWAY, domoticz.EVOHOME_MODE_DAYOFF, domoticz.EVOHOME_MODE_CUSTOM or domoticz.EVOHOME_MODE_HEATINGOFF. dParm &amp;lt;optional&amp;gt; can be a future time string (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;), a future time object, a future time as number of seconds since epoch or a number representing a positive offset in minutes (max 1 year). action &amp;lt;optional&amp;gt; (1 = run on action script, 0 = disable), ooc &amp;lt;optional&amp;gt; (1 = only trigger the event &amp;amp;amp; log on change, 0 = always trigger &amp;amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-hotwater&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (hotWater) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a.&lt;br /&gt;
* &#039;&#039;&#039;setHotWater(state, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set HotWater Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE You can provide an until date (in ISO 8601 format for domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-relay&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (relay) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;number&#039;&#039; (level percentage)&lt;br /&gt;
* &#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; (true when state is not equal to ‘Off’, false otherwise)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-zones&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (zones) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; .&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a .&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update set point. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE. You can provide an until date (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;). When leaving out untilDate for mode domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE the untilDate will be the next scheduled zone-update time/date. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gas ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;updateGas(usage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Usage in &#039;&#039;&#039;dm&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&#039;&#039;&#039; (liters). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current group-name to new group-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleGroup()&#039;&#039;&#039;: Toggles the state of a group. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hardware-3.0.7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hardware &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;isHardware&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;isPythonPlugin&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: : &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;typeValue&#039;&#039;&#039;: : &#039;&#039;Number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;humidity-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Humidity sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;updateHumidity(humidity, status)&#039;&#039;&#039;: Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kodi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Kodi ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;kodiExecuteAddOn(addonId)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. 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;
* &#039;&#039;&#039;kodiPause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlay()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play an item from the Kodi’s Favorites list optionally starting at &#039;&#039;position&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayPlaylist(name, [position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play a music or video Smart Playlist with &#039;&#039;name&#039;&#039; optionally starting at &#039;&#039;position&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiSetVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the volume for a Kodi device, 0 &amp;amp;lt;= level &amp;amp;lt;= 100.&lt;br /&gt;
* &#039;&#039;&#039;kodiStop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiSwitchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-electricity-instant-and-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== kWh, Electricity (instant and counter) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual usage in Watt.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateElectricity(power, energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WhToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage of the day. Note the unit is Wh and not kWh!&lt;br /&gt;
* &#039;&#039;&#039;WhTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual reading in Watt. Please use actualWatt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;leaf-wetness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Leaf wetness ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wetness&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Wetness value&lt;br /&gt;
* &#039;&#039;&#039;updateWetness(wetness)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logitech-media-server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Logitech Media Server ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will pause the device if it was streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;play()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. If the device was off, it will turn on and start streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the favorites playlist. &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; is optional (0 = default). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playlistID&#039;&#039;&#039;: &#039;&#039;Nubmer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;setVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the volume (0 &amp;amp;lt;= level &amp;amp;lt;= 100). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;startPlaylist(name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the playlist by its &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will stop the device (only effective if the device is streaming). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeUp()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume up with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeDown()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume down with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lux-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lux sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lux&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Lux level for light sensors.&lt;br /&gt;
* &#039;&#039;&#039;updateLux(lux)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;onkyo-receiver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Onkyo receiver ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;onkyoEISCPCommand(command)&#039;&#039;&#039;. &#039;&#039;Function&#039;&#039;. Sends an EISP command to the Onkyo receiver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;opentherm-gateway&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenTherm gateway ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-smart-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== P1 Smart meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usage1&#039;&#039;&#039;, &#039;&#039;&#039;usage2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;return1&#039;&#039;&#039;, &#039;&#039;&#039;return2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateP1(usage1, usage2, return1, return2, cons, prod)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Updates the device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usageDelivered&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;percentage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Percentage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;percentage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePercentage(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;philips-hue-light&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Philips Hue Light ====&lt;br /&gt;
&lt;br /&gt;
See switch below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pressure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Pressure ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pressure&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePressure(pressure)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Rain meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;rain&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; (please note that this does return the rain total for today)&lt;br /&gt;
* &#039;&#039;&#039;rainRate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateRain(rate, counter)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (rate in mm * 100 per hour, counter is total in mm) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rgbww-lighting-limitlessapplamp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== RGBW(W) / Lighting Limitless/Applamp ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;decreaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;getColor()&#039;&#039;&#039;; &#039;&#039;Function&#039;&#039;. Returns table with color attributes or nil when color field of device is not set.&lt;br /&gt;
* &#039;&#039;&#039;increaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setColor(r, g, b, br, cw, ww, m, t)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required, others optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. Meaning and limits of parms can be found [https://wiki.domoticz.com/Domoticz_API/JSON_URL&#039;s#Set_a_light_to_a_certain_color_or_color_temperature here].&lt;br /&gt;
* &#039;&#039;&#039;setColorBrightness()&#039;&#039;&#039;: same as setColor&lt;br /&gt;
* &#039;&#039;&#039;setDiscoMode(modeNum)&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setHex(r, g, b)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required (decimal Values 0-255). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setHue(hue, brightness, isWhite)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested Hue. Hue and brightness required. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setKelvin(Kelvin)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets Kelvin level of the light (For RGBWW devices only). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setNightMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to night mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setRGB(red, green, blue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the lamps RGB color. Values are from 0-255. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setWhiteMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to white mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scale-weight&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scale weight ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;weight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;udateWeight()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scene ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current scene-name to new scene-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-panel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Security Panel ====&lt;br /&gt;
&lt;br /&gt;
Create a security device:&lt;br /&gt;
&lt;br /&gt;
# Set a security panel password in Domoticz settings.&lt;br /&gt;
# Activate the security panel (&#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Security Panel&#039;&#039;&#039; and set it to &#039;&#039;&#039;Disarm&#039;&#039;&#039; (using your password)).&lt;br /&gt;
# Go to the device list in (&#039;&#039;&#039;Setup &amp;amp;gt; Devices&#039;&#039;&#039;) where it should show the security panel device under ‘Not used’.&lt;br /&gt;
# Add the device and give it a name.&lt;br /&gt;
&lt;br /&gt;
Methods/attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;armAway()&#039;&#039;&#039;: Sets a security device to Armed Away. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;armHome()&#039;&#039;&#039;: Sets a security device to Armed Home. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;disarm()&#039;&#039;&#039;: Disarms a security device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;: Same values as domoticz.security value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;smoke-detection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Smoke detection ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;activate()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;reset()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;solar-radiation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Solar radiation ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;radiation&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In Watt/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;updateRadiation(radiation)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;soil-moisture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Soil moisture ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;moisture&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In centibars (cB).&lt;br /&gt;
* &#039;&#039;&#039;updateSoilMoisture(moisture)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sound-level&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sound level ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In dB.&lt;br /&gt;
* &#039;&#039;&#039;updateSoundLevel(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;switch-dimmer-selector-etc.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Switch (dimmer, selector etc.) ====&lt;br /&gt;
&lt;br /&gt;
There are many switch-like devices. Not all methods are applicable for all switch-like devices. You can always use the generic &amp;lt;code&amp;gt;setState(newState)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;close()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Close if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;dimTo(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch a dimming device on and/or dim to the specified level. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;lastLevel&#039;&#039;&#039;: Number. The level of a dimmer just before it was switched off. &#039;&#039;&#039;Note: lastLevel only shows you the previous level if you have a trigger for the device itself. So for instance you have a on-trigger for ‘myDimmer’ and the dimmer is set from 20% to 30%, in your script &amp;lt;code&amp;gt;myDimmer.level == 30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myDimmer.lastLevel == 20&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. For dimmers and other ‘Set Level..%’ devices this holds the level like selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelActions&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. |-separated list of url actions for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current level name for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelNames&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Table holding the level names for selector switch devices.&lt;br /&gt;
* &#039;&#039;&#039;levelVal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Specific for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;maxDimLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;open()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Open if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set deviceStatus to on without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set deviceStatus to off without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setLevel(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to a given level if it supports it (e.g. blinds percentage). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Stop if it supports it (e.g. blinds). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device off it is supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device on if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchSelector(&amp;amp;lt;[level]|[levelname] &amp;amp;gt;)&#039;&#039;&#039; : &#039;&#039;Function&#039;&#039;. Switches a selector switch to a specific level ( levelname or level(numeric) required ) levelname must be exact, for level the closest fit will be picked. See the edit page in Domoticz for such a switch to get a list of the values). Levelname is only supported when level 0 (“Off”) is not removed Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleSwitch()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Toggles the state of the switch (if it is togglable) like On/Off, Open/Close etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTemperature(temperature)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempBaro(temperature, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHumBaro(temperature, humidity, status, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. forecast can be domoticz.BARO_NOINFO, BARO_SUNNY, BARO_PARTLY_CLOUDY, BARO_CLOUDY, BARO_RAIN. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET, HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHum(temperature, humidity [, status] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET or HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Text ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateText(text)&#039;&#039;&#039;: Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-set-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat set point ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-operating-state-3.0.19&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat Operating state &amp;lt;sup&amp;gt;3.0.19&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-type-3-mertik-3.0.15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat type 3 (Mertik) &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-6-3.1.11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat 6 &amp;lt;sup&amp;gt;3.1.11&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Thermostat 6 devices come in several subtypes: Temp/Setpoint, Temp/Hum/Setpoint, Temp/Baro/Setpoint and Temp/Hum/Baro/Setpoint. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. The current set point.&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Mapped humidity status value (only for subtypes with humidity).&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update the set point. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update thermostat values. Parameters depend on the subtype:&lt;br /&gt;
** &#039;&#039;Temp/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Hum/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, nil, nil, barometer, forecast)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &#039;&#039;Temp/Hum/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;forecast&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;noinfo&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;sunny&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;partlycloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;cloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;rain&#039;&amp;lt;/code&amp;gt; or a numeric value. &lt;br /&gt;
** &amp;lt;code&amp;gt;humidityStatus&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;dry&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;normal&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;comfortable&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;wet&#039;&amp;lt;/code&amp;gt; or a numeric value. If omitted with humidity provided, it is auto-calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;uv-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UV sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uv&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. UV index.&lt;br /&gt;
* &#039;&#039;&#039;updateUV(uv)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. UV index. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;visibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Visibility ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;visibility&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In km.&lt;br /&gt;
* &#039;&#039;&#039;updateVisibility(distance)&#039;&#039;&#039;:Function*. In km. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;voltage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Voltage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;voltage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateVoltage(voltage)&#039;&#039;&#039;:Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;waterflow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Waterflow ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flow&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In L/m.&lt;br /&gt;
* &#039;&#039;&#039;updateWaterflow(flow)&#039;&#039;&#039;:Function*. In L/m. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wind ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;chill&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;direction&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Degrees.&lt;br /&gt;
* &#039;&#039;&#039;directionString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Formatted wind direction like N, SE.&lt;br /&gt;
* &#039;&#039;&#039;gust&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. ( in meters / second, might change in future releases to Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;gustMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Gust ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;speed&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in the unit set in Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;speedMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;updateWind(bearing, direction, speed, gust, temperature, chill)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Bearing in degrees, direction in N, S, NNW etc, speed in m/s, gust in m/s, temperature and chill in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;youless-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Youless meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;powerYield&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateYouless(total, actual)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zone-heating&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Zone heating ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;heatingMode&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-fan-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Fan mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-thermostat-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Thermostat mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-options-delay-duration-event-triggering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Command options (delay, duration, event triggering) ===&lt;br /&gt;
&lt;br /&gt;
Many dzVents device methods support extra options, like controlling a delay or a duration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    -- switch on for 2 minutes after 10 seconds&lt;br /&gt;
    device.switchOn().afterSec(10).forMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on at a specic time / day&lt;br /&gt;
    device.switchOn().at(&#039;09:00&#039;)                   -- earliest moment it will be 09:00 hr.&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on fri&#039;)         -- earliest moment it will be Friday at 08:53:30&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on sat, sun&#039;)    -- earliest moment it will be Saturday or Sunday at 08:53:30 (whatever comes first)&lt;br /&gt;
&lt;br /&gt;
    -- switch on for 2 minutes after a randomized delay of 1-10 minutes&lt;br /&gt;
    device.switchOff().withinMin(10).forMin(2)&lt;br /&gt;
    device.close().forMin(15)&lt;br /&gt;
    device.open().afterSec(20)&lt;br /&gt;
    device.open().afterMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on but do not trigger follow up events&lt;br /&gt;
    device.switchOn().silent()&lt;br /&gt;
&lt;br /&gt;
    -- flash a light for 3 times&lt;br /&gt;
    device.switchOn().forSec(2).repeatAfterSec(1, 3)&lt;br /&gt;
&lt;br /&gt;
    -- switch the device on but only if the current state isn&#039;t already on:&lt;br /&gt;
    device.switchOn().checkFirst()&lt;br /&gt;
    -- this is a short for:&lt;br /&gt;
    if (device.state == &#039;Off&#039;) then&lt;br /&gt;
        devices.switchOn()&lt;br /&gt;
    end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Options ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;at(hh:mm[:ss][ on [ ddd|dddd ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Activates the command at a certain time [ on a certain day]&lt;br /&gt;
* &#039;&#039;&#039;afterHour(hours), afterMin(minutes), afterSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command after a certain number of hours, minutes or seconds.&lt;br /&gt;
* &#039;&#039;&#039;cancelQueuedCommands()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Cancels queued commands. E.g. you switch on a device after 10 minutes: &amp;lt;code&amp;gt;myDevice.switchOn().afterMin(10)&amp;lt;/code&amp;gt;. Within those 10 minutes you can cancel that command by calling: &amp;lt;code&amp;gt;myDevice.cancelQueuedCommands()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;checkFirst()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Checks if the &#039;&#039;&#039;current&#039;&#039;&#039; state of the device is different than the desired new state. If the target state is the same, no command is sent. If you do &amp;lt;code&amp;gt;mySwitch.switchOn().checkFirst()&amp;lt;/code&amp;gt;, then no switch command is sent if the switch is already on. This command only works with switch-like devices. It is not available for toggle and dim commands, either.&lt;br /&gt;
* &#039;&#039;&#039;forHour(hours), forMin(minutes), forSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command for the duration of hours, minutes or seconds. See table below for applicability and the warning on unexpected behavior of these functions.&lt;br /&gt;
* &#039;&#039;&#039;withinHour(hours), withinMin(minutes), withinSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command within a certain period (specified in hours, minutes or seconds) &#039;&#039;randomly&#039;&#039;. See table below for applicability.&lt;br /&gt;
* &#039;&#039;&#039;silent()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. No follow-up events will be triggered: &amp;lt;code&amp;gt;mySwitch.switchOff().silent()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;repeatAfterHour(hours, [number]), repeatAfterMin(minutes, [number]), repeatAfterSec(seconds, [number])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Repeats the sequence &#039;&#039;number&#039;&#039; times after the specified duration (specified in hours, minutes, or seconds). If no &#039;&#039;number&#039;&#039; is provided, 1 is used. &#039;&#039;&#039;Note that &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; are only applied at the beginning of the sequence and not between the repeats!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the actual switching or changing of the device is done by Domoticz and not by dzVents. dzVents only tells Domoticz what to do; if the options are not carried out as expected, this is likely a Domoticz or hardware issue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note when using forAAA()&#039;&#039;&#039;: Let’s say you have a light that is triggered by a motion detector. Currently the light is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt; and you do this: &amp;lt;code&amp;gt;light.switchOn().forMin(5)&amp;lt;/code&amp;gt;. What happens inside Domoticz is this: at t&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; Domoticz issues the &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command and schedules a command to restore the &#039;&#039;&#039;current&#039;&#039;&#039; state at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; which is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt;. So at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; it will switch the light off.&lt;br /&gt;
&lt;br /&gt;
If, however, &#039;&#039;before the scheduled &amp;lt;code&amp;gt;switchOff()&amp;lt;/code&amp;gt; happens at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&#039;&#039;, new motion is detected and you send this command again at t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; then something unpredictable may seem to happen: &#039;&#039;the light is never turned off!&#039;&#039; This is what happens:&lt;br /&gt;
&lt;br /&gt;
At t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; Domoticz receives the &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; command again. It sees a scheduled command at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; and deletes that command (it is within the new interval). Then Domoticz performs the (unnecessary, it’s already on) &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command. Then it checks the current state of the light which is &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;!! and schedules a command to return to that state at t&amp;lt;sub&amp;gt;2+5&amp;lt;/sub&amp;gt;=t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;. So, at t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; the light is switched on again. And there you have it: the light is not switched off and never will be because future commands will always be checked against the current on-state.&lt;br /&gt;
&lt;br /&gt;
That’s just how it works and you will have to deal with it in your script. So, instead of simply re-issuing &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; you have to check the switch’s state first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;if (light.active) then&lt;br /&gt;
    light.switchOff().afterMin(5)&lt;br /&gt;
else&lt;br /&gt;
    light.switchOn().forMin(5)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or issue these two commands &#039;&#039;both&#039;&#039; as they are mutually exclusive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;light.switchOff().checkFirst().afterMin(5)&lt;br /&gt;
light.switchOn().checkFirst().forMin(5)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Availability ====&lt;br /&gt;
&lt;br /&gt;
Some options are not available to all commands. All the options are available to device switch-like commands like &amp;lt;code&amp;gt;myDevice.switchOff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myGroup.switchOn()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;myBlinds.open()&amp;lt;/code&amp;gt;. For updating (usually Dummy ) devices like a text device &amp;lt;code&amp;gt;myTextDevice.updateText(&#039;zork&#039;)&amp;lt;/code&amp;gt; you can only use &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;. For thermostat setpoint devices and snapshot command silent() is not available. For commands for which dzVents must use openURL, only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; methods are available. These commands are mainly the setAaaaa() commands for RGBW type devices.&lt;br /&gt;
&lt;br /&gt;
See table below&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| option&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| state changes&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;11%&amp;quot;| update commands&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| user variables&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| updateSetpoint&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;8%&amp;quot;| snapshot&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| triggerIFTTT&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| execute ShellCommand&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| emitEvent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repeatAfterAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkFirst()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| • &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancelQueuedCommands()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;span id=&amp;quot;notes-on-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Notes on table ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note 1&#039;&#039;&#039;: AAA is a placeholder for &amp;lt;code&amp;gt;Min/Sec/Hour&amp;lt;/code&amp;gt; affix e.g. &amp;lt;code&amp;gt;afterMin()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Note 2&#039;&#039;&#039;: for &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; is available.&lt;br /&gt;
* &#039;&#039;&#039;Note 3&#039;&#039;&#039;: Note 2 also applies for all commands depending on openURL (like rgbwwDevice.setAaa() commands).&lt;br /&gt;
* &#039;&#039;&#039;Note 4&#039;&#039;&#039;: Including dimTo, switchSelector, setLevel and similar methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;follow-up-event-triggers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Follow-up event triggers ====&lt;br /&gt;
&lt;br /&gt;
Normally if you issue a command, Domoticz will immediately trigger follow-up events, and dzVents will automatically trigger defined event scripts. If you trigger a scene, all devices in that scene will issue a change event. If you have event triggers for these devices, they will be executed by dzVents. If you don’t want this to happen, add &amp;lt;code&amp;gt;.silent()&amp;lt;/code&amp;gt; to your commands (exception is updateSetPoint).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-your-own-device-adapter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create your own device adapter ===&lt;br /&gt;
&lt;br /&gt;
If your device is not recognized by dzVents, you can still operate it using the generic device attributes and methods. It is much nicer, however, to have device specific attributes and methods. Existing recognized adapters are in &amp;lt;code&amp;gt;/path/to/domoticz/dzVents/runtime/device-adapters&amp;lt;/code&amp;gt;. Copy an existing adapter and adapt it to your needs. You can turn debug logging on and inspect the file &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; in the dzVents folder. There you will find the unique signature for your device type. Usually it is a combination of deviceType and deviceSubType, but you can use any of the device attributes in the &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; function. The matches function checks if the device type is suitable for your adapter and the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; function actually creates your specific attributes and methods. Also, if you call &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; you will see all attributes and methods and the attribute &amp;lt;code&amp;gt;_adapters&amp;lt;/code&amp;gt; shows you a list of applied adapters for that device. Finally, register your adapter in &amp;lt;code&amp;gt;Adapters.lua&amp;lt;/code&amp;gt;. Please share your adapter when it is ready and working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-object-api-user-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Variable object API (user variables) ==&lt;br /&gt;
&lt;br /&gt;
User variables created in Domoticz have these attributes and methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Was the variable updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.DATE. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the variable.&lt;br /&gt;
* &#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the variable&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current variable name to new variable name. (does not support timing options)&lt;br /&gt;
* &#039;&#039;&#039;set(value)&#039;&#039;&#039;: Tells Domoticz to update the variable. Supports timing options. See [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|above]].&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.TIME. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Can be domoticz.INTEGER, domoticz.FLOAT, domoticz.STRING, domoticz.DATE, domoticz.TIME.&lt;br /&gt;
* &#039;&#039;&#039;value&#039;&#039;&#039;: &#039;&#039;String|Number|Date|Time&#039;&#039;. Value of the variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
	on =&lt;br /&gt;
	{&lt;br /&gt;
		timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	execute = function(domoticz)&lt;br /&gt;
		-- check time of the day&lt;br /&gt;
		if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
			domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time object ==&lt;br /&gt;
&lt;br /&gt;
Many attributes represent a moment in time, like &amp;lt;code&amp;gt;myDevice.lastUpdate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.time&amp;lt;/code&amp;gt;. In dzVents, a time-like attribute is an object with properties and methods which make your life easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    print(myDevice.lastUpdate.minutesAgo)&lt;br /&gt;
    print(myDevice.lastUpdate.daysAgo)&lt;br /&gt;
&lt;br /&gt;
    -- compare two times&lt;br /&gt;
    print(domoticz.time.compare(myDevice.lastUpdate).secs))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can also create your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;) -- must be this format!!&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you don’t pass a time string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local currentTime = Time()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use this in combination with the various dzVents time attributes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;)&lt;br /&gt;
&lt;br /&gt;
    local tonight = Time(domoticz.time.rawDate .. &#039; 20:00:00&#039;)&lt;br /&gt;
    print (tonight.getISO())&lt;br /&gt;
    -- will print something like: 2016-12-12T20:00:00Z&lt;br /&gt;
    print(t.minutesAgo) -- difference from &#039;now&#039; in minutes&lt;br /&gt;
&lt;br /&gt;
    -- and you can feed it with all same rules as you use&lt;br /&gt;
    -- for the timer = { .. } section:&lt;br /&gt;
    if (t.matchesRule(&#039;at 16:00-21:00&#039;)) then&lt;br /&gt;
        -- t is in between 16:00 and 21:00&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- very powerful if you want to compare two time instances:&lt;br /&gt;
    local anotherTime = Time(&#039;...&#039;) -- fill-in some time here&lt;br /&gt;
    print(t.compare(anotherTime).secs) -- diff in seconds between t and anotherTime.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System event API ===&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a system-event in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;system&#039;&#039; object. The object.type = system-event that triggered the script. ( object.isSystemEvent: true) For backups the object also contains location and durationin seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-properties-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Time properties and methods ===&lt;br /&gt;
&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local Time = require(&#039;Time&#039;)&lt;br /&gt;
local now = Time() -- current time&lt;br /&gt;
local someTime = Time(&#039;2017-12-31 22:19:15&#039;)&lt;br /&gt;
local utcTime = Time(&#039;2017-12-31 22:19:15&#039;, true)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local someTime = domoticz.time.addMinutes(30) -- someTime = domoticz time object for now + 30 minutes&lt;br /&gt;
local someTime = domoticz.time.makeTime() -- someTime = new domoticz time object.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;addAAA(offset)&#039;&#039;&#039;: &#039;&#039;time object&#039;&#039;. time object with given offset (positive or negative. AAA is a placeholder for &amp;lt;code&amp;gt;Seconds, Minutes, Hours or Days&amp;lt;/code&amp;gt; affix e.g. `addHours(-2)&lt;br /&gt;
* &#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightEnd.&lt;br /&gt;
* &#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;:&#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightStart.&lt;br /&gt;
* &#039;&#039;&#039;compare(time)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Compares the current time object with another time object. &#039;&#039;Make sure you pass a Time object!&#039;&#039; Returns a table (all values are &#039;&#039;positive&#039;&#039;, use the compare property to see if &#039;&#039;time&#039;&#039; is in the past or future):&lt;br /&gt;
** &#039;&#039;&#039;milliseconds&#039;&#039;&#039;: Total difference in milliseconds.&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: Total difference in whole seconds.&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: Total difference in whole minutes.&lt;br /&gt;
** &#039;&#039;&#039;hours&#039;&#039;&#039;: Total difference in whole hours.&lt;br /&gt;
** &#039;&#039;&#039;days&#039;&#039;&#039;: Total difference in whole days.&lt;br /&gt;
** &#039;&#039;&#039;compare&#039;&#039;&#039;: 0 = both are equal, 1 = &#039;&#039;time&#039;&#039; is in the future, -1 = &#039;&#039;time&#039;&#039; is in the past.&lt;br /&gt;
* &#039;&#039;&#039;dateToDate( dateString, sourceFormat, targetFormat[ , offSet] )&#039;&#039;&#039;:&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: Returns a reformatted datestring. dateString is a formatted date and source- and targetFormat are representations of the dateString elements and their locations in the string (see examples in dateToTimestamp) . Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;dddd dd mmmm hh:MM:ss&#039;, 1 )              -- &amp;gt; &#039;Friday 31 December 23:31:06&#039;&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;ddd dd mmm hh:MM:ss&#039;, -3600 * 24 - 3 ))  -- &amp;gt; &#039;Thu 30 Dec 23:31:02&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dateToTimestamp([ dateString [,control] ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &#039;&#039;Number&#039;&#039; representing time since epoch in seconds. dateString is a formatted date and control is a representation of the dateString elements and their location in the string. Default control is ‘yyyy-mm-dd hh:MM’. recognized controls are either a Lua pattern string or a string containing following codes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        dddd -- full weekdayname(e.g. Wednesday) language depends on locale&lt;br /&gt;
        ddd  -- abbreviated weekdayname(e.g. Wed) language depends on locale&lt;br /&gt;
        dd   -- day of the month {[01-31]&lt;br /&gt;
        mmmm -- full monthname(e.g September) language depends on locale&lt;br /&gt;
        mmm  -- abbreviated monthname(e.g. Sep) language depends on locale&lt;br /&gt;
        mm   -- month [01-12]&lt;br /&gt;
        yyyy -- 4 digit year&lt;br /&gt;
        yy   -- 2 digit year&lt;br /&gt;
        hh   -- hour 24-hour clock&lt;br /&gt;
        ii   -- hour 12-hour clock&lt;br /&gt;
        MM   -- minute&lt;br /&gt;
        ss   -- second&lt;br /&gt;
        W    -- weeknumber [01-53]&lt;br /&gt;
        w    -- weekday{[0-6] Sunday-Saturday&lt;br /&gt;
        datm -- date and time (e.g. 09/16/98 23:48:10) format depends on locale&lt;br /&gt;
        mer  -- either &amp;quot;AM&amp;quot; or &amp;quot;PM&amp;quot; locale&lt;br /&gt;
        date -- date(e.g. 09/16/98) format depends on locale&lt;br /&gt;
        time -- time (e.g. 23:48:10)&lt;br /&gt;
&lt;br /&gt;
        -- examples:&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59&#039;))                                                      -- &amp;gt; 1609455540&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:01&#039;,&#039;yyyy-mm-dd hh:MM:ss&#039;))                             -- &amp;gt; 1609455541&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;December 31, 23:59:02&#039;,&#039;mmmm dd, hh:MM:ss&#039;))                             -- &amp;gt; 1609455542&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:03&#039;,&#039;(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)&#039; ))  -- &amp;gt; 1609455543&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;20201231235904&#039;,&#039;(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)&#039;))             -- &amp;gt; 1609455544&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayAbbrOfWeek&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. sun,mon,tue,wed,thu,fri or sat&lt;br /&gt;
* &#039;&#039;&#039;daysAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. complete name Sunday, Monday, etc&lt;br /&gt;
* &#039;&#039;&#039;dDate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. timestamp (seconds since 01/01/1970 00:00)&lt;br /&gt;
* &#039;&#039;&#039;getISO&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the ISO 8601 formatted date.&lt;br /&gt;
* &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;hoursAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of hours since the last update.&lt;br /&gt;
* &#039;&#039;&#039;isdst&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Indicates if time is in the daylight saving period&lt;br /&gt;
* &#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if time is today&lt;br /&gt;
* &#039;&#039;&#039;isUTC&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;makeTime(string | table,[isUTC])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. isUTC defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;matchesRule(rule) &#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns true if the rule matches with the time. See [[#timer_trigger_rules|time trigger rules]] for rule examples.&lt;br /&gt;
* &#039;&#039;&#039;millisecondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;minutesAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutesSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;monthAbbrName&#039;&#039;&#039;: String. jan, feb, mar, etc&lt;br /&gt;
* &#039;&#039;&#039;monthName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. January, February, etc&lt;br /&gt;
* &#039;&#039;&#039;msAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;raw&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Generated by Domoticz&lt;br /&gt;
* &#039;&#039;&#039;rawDate&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the date part of the raw data.&lt;br /&gt;
* &#039;&#039;&#039;rawDateTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Combined date / time formatted as domoticz does in API / JSON returns (rawDate .. ’ ’.. rawTime )&lt;br /&gt;
* &#039;&#039;&#039;rawTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM:SS&lt;br /&gt;
* &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunset.&lt;br /&gt;
* &#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunrise.&lt;br /&gt;
* &#039;&#039;&#039;solarnoonInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; Minutes from midnight until solarnoon.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM&lt;br /&gt;
* &#039;&#039;&#039;timestampToDate([ [ timestamp ] , [ pattern ] ,[ offSet ] )&#039;&#039;&#039;: &#039;&#039;function&#039;&#039;. Returns a datestring. timestamp is number of seconds since epoch (default = now) , pattern is a string as explained in this wiki at the description of the domoticz.time.dateToTimestamp function (default = ‘yyyy-mm-dd hh:MM:ss’). Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.timestampToDate(10,&#039;date time&#039;)                               --&amp;gt; &#039;01/01/70 01:00:10&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(60,&#039;ddd mm mmm yyyy ii:MM mer&#039;,&#039;date time&#039;)   --&amp;gt; &#039;Thu 01 Jan 1970 01:01 AM&#039;&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(1598077445,&#039;dd/mm/yy ii:MM mer nZero&#039;)        --&amp;gt; &#039;22/08/20 8:24 AM&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;toUTC(string | table,[offset])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. &amp;lt;sup&amp;gt;3.0.9&amp;lt;/sup&amp;gt; returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. offset defaults to 0.&lt;br /&gt;
* &#039;&#039;&#039;utcSystemTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. UTC system time (only when in UTC mode):&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;utcTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Time stamp in UTC time:&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; day of the week. Sunday = 1, Saturday = 7&lt;br /&gt;
* &#039;&#039;&#039;week&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; week of the year&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: it is currently not possible to change the domoticz.time object instance.&#039;&#039;&#039; ( but you can create a new one with- or without an offset)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shared-helper-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Shared helper functions ==&lt;br /&gt;
&lt;br /&gt;
It is not unlikely that at some point you want to share Lua code among your scripts. Normally in Lua you would have to create a module and require that module in all you scripts. But dzVents makes that easier for you: Inside your scripts folder or in Domoticz’ GUI web editor, create a &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; script (same as for global persistent data) and feed it with this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
        end,&lt;br /&gt;
        MY_CONSTANT = 100 -- doesn&#039;t have to be a function&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the file and then you can use myHandyFunction everywhere in your event scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(&#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
        print(domoticz.helpers.MY_CONSTANT)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt; is needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note: if you need to access the domoticz object in your helper function you have to pass it as a parameter:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(domoticz, param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
            domoticz.log(&#039;Hey&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And pass it along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(domoticz, &#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only &#039;&#039;&#039;one&#039;&#039;&#039; &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requiring-your-own-modules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Requiring your own modules ==&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use the helpers support, but you want to require your own modules, place them either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/modules&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/modules&amp;lt;/code&amp;gt; as these folders are already added to the Lua package path. You can just require those modules: &amp;lt;code&amp;gt;local myModule = require(&#039;myModule&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;persistent-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Persistent data =&lt;br /&gt;
&lt;br /&gt;
In many situations you need to store a device state or other information in your scripts for later use. Like knowing what the state was of a device the previous time the script was executed or what the temperature in a room was 10 minutes ago. Without dzVents, you had to resort to user variables. These are global variables that you create in the Domoticz GUI and that you can access in your scripts like: domoticz.variables(‘previousTemperature’).&lt;br /&gt;
&lt;br /&gt;
Now, for some this is rather inconvenient and they want to control this state information in the event scripts themselves or want to use all of Lua’s variable types. dzVents has a solution for that: &#039;&#039;&#039;persistent script data&#039;&#039;&#039;. This can either be on the script level or on a global level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-level-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Script level persistent variables ==&lt;br /&gt;
&lt;br /&gt;
The values in persistent script variables persist and can be retrieved in the next script run.&lt;br /&gt;
&lt;br /&gt;
For example, send a notification if a switch has been activated 5 times:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = { &#039;MySwitch&#039; }&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            counter = { initial = 0 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (domoticz.data.counter == 5) then&lt;br /&gt;
            domoticz.notify(&#039;The switch was pressed 5 times!&#039;)&lt;br /&gt;
            domoticz.data.counter = 0 -- reset the counter&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.data.counter = domoticz.data.counter + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; section defines a persistent variable called &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;. It also defines an initial value. From then on you can read and set the variable in your script.&lt;br /&gt;
&lt;br /&gt;
You do not have to provide an initial value though. In that case the initial value is &#039;&#039;nil&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        --&lt;br /&gt;
        data = {&lt;br /&gt;
            &#039;x&#039;, &#039;y&#039;, &#039;z&#039; -- note the quotes&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, item)&lt;br /&gt;
            print(tostring(domoticz.data.x)) -- prints nil&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can define as many variables as you like and put whatever value in there that you like. It doesn’t have to be just a number. Just don’t put something in there with functions (well, they are filtered out actually).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-matters-and-watch-your-speed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size matters and watch your speed!! ===&lt;br /&gt;
&lt;br /&gt;
If you include tables (or arrays) in the persistent data, beware to not let them grow. It will definitely slow down script execution because dzVents has to serialize and deserialize the data. It is better to use the historical option as described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;re-initializing-a-variable&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Re-initializing a variable ===&lt;br /&gt;
&lt;br /&gt;
You can re-initialize a persistent variable and re-apply the initial value as defined in the data section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { .. },&lt;br /&gt;
    data = {&lt;br /&gt;
        x = { initial = &#039;initial value&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (domoticz.data.x ~= &#039;initial value&#039;) then&lt;br /&gt;
            domoticz.data.initialize(&#039;x&#039;)&lt;br /&gt;
            print(domoticz.data.x) -- will print &#039;initial value&#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; is just a convenience method. You can of course create a local variable in your module holding the initial value and use it in your data section and your execute function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;global-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Global persistent variables ==&lt;br /&gt;
&lt;br /&gt;
Script level variables are only available in the scripts that define them, but global variables can be accessed and changed in every script. To utilize global persistent variables, create a script file called &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; in your scripts folder with this content (same file where you can also put your shared helper functions):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        helpers = {},&lt;br /&gt;
        data = {&lt;br /&gt;
            peopleAtHome = { initial = false },&lt;br /&gt;
            heatingProgramActive = { initial = false }&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just define the variables that you need and access them in your scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;WindowSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, windowSensor)&lt;br /&gt;
            if (domoticz.globalData.heatingProgramActive&lt;br /&gt;
                and windowSensor.state == &#039;Open&#039;) then&lt;br /&gt;
                domoticz.notify(&amp;quot;Hey don&#039;t open the window when the heating is on!&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only one &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;domoticz.globalData.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; just as like &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a-special-kind-of-persistent-variables-history-true-historical-variables-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== A special kind of persistent variables: &#039;&#039;history = true&#039;&#039; (Historical variables API) ==&lt;br /&gt;
&lt;br /&gt;
In some situations, storing a previous value for a sensor is not enough, and you would like to have more previous values. For example, you want to calculate an average over several readings. Of course you can define a persistent variable holding a table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            previousData = { initial = {} }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            table.insert(domoticz.data.previousData, sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- calculate the average&lt;br /&gt;
            local sum = 0, count = 0&lt;br /&gt;
            for i, temp in pairs(domoticz.data.previousData) do&lt;br /&gt;
                sum = sum + temp&lt;br /&gt;
                count = count + 1&lt;br /&gt;
            end&lt;br /&gt;
            local average = sum / count&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The problem with this is that you have to do a lot of bookkeeping to make sure that there isn’t too much data to store (see [[#How_does_the_storage_stuff_work.3F|below for how it works]]) . Fortunately, dzVents has done this for you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            temperatures = { history = true, maxItems = 10 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            domoticz.data.temperatures.add(sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- average&lt;br /&gt;
            local average = domoticz.data.temperatures.avg()&lt;br /&gt;
&lt;br /&gt;
            -- maximum value in the past hour:&lt;br /&gt;
            local max = domoticz.data.temperatures.maxSince(&#039;01:00:00&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;defining&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Defining ===&lt;br /&gt;
&lt;br /&gt;
Define a script variable or global variable in the data section and set &amp;lt;code&amp;gt;history = true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    …&lt;br /&gt;
    data = {&lt;br /&gt;
        var1 = { history = true, maxItems = 10, maxHours = 1, maxMinutes = 5 }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;maxItems&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Controls how many items are stored in the variable. maxItems has precedence over maxHours and maxMinutes.&lt;br /&gt;
* &#039;&#039;&#039;maxHours&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Data older than &amp;lt;code&amp;gt;maxHours&amp;lt;/code&amp;gt; from now will be discarded. E.g., if set to 2, then data older than 2 hours will be removed at the beginning of the script.&lt;br /&gt;
* &#039;&#039;&#039;maxMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as maxHours but, you guessed it: for minutes this time.. All these options can be combined. &#039;&#039;&#039;Reminder: don’t store too much data. Only put in what you really need!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adding-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Adding data ===&lt;br /&gt;
&lt;br /&gt;
Add new values to a historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz.data.myVar.add(value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As soon as this new value is put on top of the list, the older values shift one place down the line. If &amp;lt;code&amp;gt;maxItems&amp;lt;/code&amp;gt; is reached, then the oldest value will be discarded. &#039;&#039;All methods, like calculating averages or sums, will immediately use this new value!&#039;&#039; If you don’t want this to happen, set the new value at the end of your script or after you have done your analysis.&lt;br /&gt;
&lt;br /&gt;
Any kind of data may be stored in the historical variable: numbers, strings, but also more complex data like tables. However, in order to use the [[#Statistical_functions|statistical methods]], numeric values are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;accessing-values-in-historical-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Accessing values in historical variables ===&lt;br /&gt;
&lt;br /&gt;
Values in a historical variable are indexed, where index 1 is the newest value, 2 is the second newest, and so on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.get(5)&lt;br /&gt;
print(item.data)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, all data in the storage are time-stamped:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.getLatest()&lt;br /&gt;
print(item.time.secondsAgo) -- access the time stamp&lt;br /&gt;
print(item.data) -- access the data&amp;lt;/pre&amp;gt;&lt;br /&gt;
The time attribute by itself is a table with many properties that help you inspect the data points more easily. See [[#Time_object|Time Object]] for all attributes and methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Index ====&lt;br /&gt;
&lt;br /&gt;
All data in the set can be addressed using an index. The item with index = 1 is the youngest, and the item with the highest index is the oldest. Beware, if you have called &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; first, then the first item is that new value! You can always check the size of the set by inspecting &amp;lt;code&amp;gt;myVar.size&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-specification-timeago&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Time specification (&#039;&#039;timeAgo&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
Every data point in the set has a timestamp and the set is ordered so that the youngest item is the first and the oldest item the last. Many functions require a moment in the past to be specified by passing a string in the format &#039;&#039;&#039;&amp;lt;code&amp;gt;hh:mm:ss&amp;lt;/code&amp;gt;&#039;&#039;&#039;, where &#039;&#039;hh&#039;&#039; is the number of hours ago, &#039;&#039;mm&#039;&#039; the number of minutes and &#039;&#039;ss&#039;&#039; the number of seconds. The times are added together, so you don’t have to consider 60 minute boundaries, etc. A time specification of &amp;lt;code&amp;gt;12:88:03&amp;lt;/code&amp;gt; is valid, and points to the data point at or around &amp;lt;code&amp;gt;12*3600 + 88*60 + 3 = 48.483 seconds&amp;lt;/code&amp;gt; in the past.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- get average for the past 30 minutes:&lt;br /&gt;
local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-data-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Getting data points ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get(idx)&#039;&#039;&#039;: Returns the idx-th item in the set. Same as &amp;lt;code&amp;gt;myVar.storage[idx]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getAtTime([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Returns the data point &#039;&#039;closest&#039;&#039; to the moment as specified by &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; and the index in the set. So, &amp;lt;code&amp;gt;myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt; returns the item that is closest to one hour old. It may be a bit younger or a bit older than 1 hour. The second return value is the index in the set: &amp;lt;code&amp;gt;local item, index = myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;getLatest( )&#039;&#039;&#039;: Returns the youngest item in the set. Same as &amp;lt;code&amp;gt;print(myVar.get(1).data)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getOldest( )&#039;&#039;&#039;: Returns the oldest item in the set and the index. Same as &amp;lt;code&amp;gt;print(myVar.get(myVar.size).data)&amp;lt;/code&amp;gt;. Note that the index is always the same as the total size. &amp;lt;code&amp;gt;local item, index = myVar.getOldest()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;: Return the number of data points in the set.&lt;br /&gt;
* &#039;&#039;&#039;subset( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns a subset of the stored data. Default value, if omitted, of &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; is 1. Omitting &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt; takes all items until the end of the set (oldest). E.g., &amp;lt;code&amp;gt;myVar.subset()&amp;lt;/code&amp;gt; returns all data. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;subsetSince( [[#Time_specification_.28timeAgo.29|timeAgo]] )&#039;&#039;&#039;: Returns a subset of the stored data since the relative time specified by timeAgo. So calling &amp;lt;code&amp;gt;myVar.subsetSince(&#039;00:60:00&#039;)&amp;lt;/code&amp;gt; returns all items that have been added to the list in the past 60 minutes. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reset( )&#039;&#039;&#039;: Removes all the items from the set. It could be a good practice to do this often when you know you don’t need older data. For instance, when you turn on a heater and you just want to monitor rising temperatures starting from this moment when the heater is activated. If you don’t need data points from before, then you may call reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-data-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Looping through the data: iterators ====&lt;br /&gt;
&lt;br /&gt;
Similar to the iterators as described [[#Looping_through_the_collections:_iterators|above]], there are convenience methods to make looping through the data set easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Loop over all items in the set: E.g.: &amp;lt;code&amp;gt;myVar.forEach( function( item, index, collection) ... end )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;filter(function)&#039;&#039;&#039;: Create a filtered set of items. The function receives the item and returns true if the item is in the result set. E.g. get a set with item values larger than 20: &amp;lt;code&amp;gt;subset = myVar.filter( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Search for a specific item in the set: E.g. find the first item with a value higher than 20: &amp;lt;code&amp;gt;local item = myVar.find( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the set and do some calculation with it. You call reduce with the function and the initial value. Each iteration the function is called with the accumulator. The function does something with the accumulator and returns a new value for it. Once you get the hang of it, it is very powerful. Best to give an example. To sum all values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        local sum = myVar.reduce(function(acc, item)&lt;br /&gt;
            local value = item.data&lt;br /&gt;
        return acc + value&lt;br /&gt;
        end, 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Suppose you want to get data points older than 45 minutes and count the values that are higher than 20 (of course there are more ways to do this):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myVar = domoticz.data.myVar&lt;br /&gt;
&lt;br /&gt;
    local olderItems = myVar.filter(function (item)&lt;br /&gt;
        return (item.time.minutesAgo &amp;gt; 45)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    local count = olderItems.reduce(function(acc, item)&lt;br /&gt;
        if (item.data &amp;gt; 20) then&lt;br /&gt;
            acc = acc + 1&lt;br /&gt;
        end&lt;br /&gt;
        return acc&lt;br /&gt;
    end, 0)&lt;br /&gt;
&lt;br /&gt;
    print(&#039;Found &#039; .. tostring(count) .. &#039; items&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;statistical-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Statistical functions ====&lt;br /&gt;
&lt;br /&gt;
Statistical functions require &#039;&#039;numerical&#039;&#039; data in the set. If the set is just numbers you can do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add(myDevice.temperature) -- adds a number to the set&lt;br /&gt;
myVar.avg() -- returns the average&amp;lt;/pre&amp;gt;&lt;br /&gt;
If, however, you add more complex data or you want to do a computation first, then you have to &#039;&#039;tell dzVents how to get a numeric value from these data&#039;&#039;. So let’s say you do this to add data to the set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add( { &#039;person&#039; = &#039;John&#039;, waterUsage = u })&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; is a variable that got its value earlier. If you want to calculate the average water usage, then dzVents will not be able to do this because it doesn’t know the value is actually in the &amp;lt;code&amp;gt;waterUsage&amp;lt;/code&amp;gt; attribute! You will get &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To make this work you have to provide a &#039;&#039;&#039;getValue function&#039;&#039;&#039; in the data section when you define the historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {...},&lt;br /&gt;
        data = {&lt;br /&gt;
        myVar = {&lt;br /&gt;
            history = true,&lt;br /&gt;
            maxItems = 10,&lt;br /&gt;
            getValue = function(item)&lt;br /&gt;
                return item.data.waterUsage -- return number!!&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function()...end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This function tells dzVents how to get the numeric value for a data item. &#039;&#039;&#039;Note: the &amp;lt;code&amp;gt;getValue&amp;lt;/code&amp;gt; function has to return a number!&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you don’t intend to use any of these statistical functions you can put whatever you want in the set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avg( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the average of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avgSince([[#Time_specification_.28timeAgo.29|timeAgo]], default )&#039;&#039;&#039;: Calculates the average of all data points since &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt;. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there are no data, otherwise 0. E.g.: &amp;lt;code&amp;gt;local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/code&amp;gt; returns the average over the past 30 minutes.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;med( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the median of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;min( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the lowest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;minSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;min&#039;&#039;&#039; but now within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;max( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the highest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;maxSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;max&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sum( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the summation of all values in the range defined by fromIdx and toIdx. It will return 0 when there are no data.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sumSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;sum&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. It will return 0 when there are no data in the interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;** delta(fromIdx, toIdx, [smoothRange], [default] )**: Returns the delta (difference) between items specified by &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. Provide a valid range (no &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values). [Supports data smoothing]. (#Data_smoothing) when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there is not enough data. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta(2, 5, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;delta2( fromIdx, toIdx, [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but now you can control if the smooth values for the &#039;&#039;from-item&#039;&#039; and the &#039;&#039;to-item&#039;&#039; separately. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta2(2, 5, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSince([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRange], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSince(&#039;00:00:10&#039;, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSinceOrOldest([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;deltaSince&#039;&#039;&#039; but it will take the oldest value in the set if &#039;&#039;timeAgo&#039;&#039; is older than the age of the entire set. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSinceOrOldest(&#039;00:00:10&#039;, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;: Returns the first minimum value (and the item holding the minimal value) in the past. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. For example, given this range of values in the data set (from new to old): &amp;lt;code&amp;gt;10 8 7 5 3 4 5 6&amp;lt;/code&amp;gt;, it will return &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; because older values &#039;&#039;and&#039;&#039; newer values are higher: a local minimum. Use this if you want to know at what time a temperature started to rise after it had been dropping. E.g.:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; local value, item = myVar.localMin()&lt;br /&gt;
 print(&#039; minimum was : &#039; .. value .. &#039;: &#039; .. item.time.secondsAgo .. &#039; seconds ago&#039; )&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMax([smoothRange], default)&#039;&#039;&#039;: Same as &#039;&#039;&#039;localMin&#039;&#039;&#039; but for the maximum value. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;smoothItem(itemIdx, [smoothRange])&#039;&#039;&#039;: Returns a the value of &amp;lt;code&amp;gt;itemIdx&amp;lt;/code&amp;gt; in the set but smoothed by averaging with its neighbors. The number of neighbors is set by &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt;. See [[#Data_smoothing|Data smoothing]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-smoothing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Data smoothing ====&lt;br /&gt;
&lt;br /&gt;
Example: Suppose you store temperatures in the historical variable. These temperatures may have extremes. Perhaps these extremes could be due to sensor reading errors. In order to reduce the effect of these so-called spikes, you could smooth out values. It is like blurring the data. The Raw column is your temperatures. The other columns are calculated by averaging the neighbors. For item 10 the calculations are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Range=1 for time10 = (25 + 31 + 29) / 3 = 28,3&lt;br /&gt;
Range=2 for time10 = (16 + 25 + 31 + 29 + 26) / 5 = 25,4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; align=&amp;quot;center&amp;quot; width=&amp;quot;30% height:10px;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| time&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| raw&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=1&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
| 18&lt;br /&gt;
| 20,0&lt;br /&gt;
| 21,7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 21,7&lt;br /&gt;
| 25,0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 27,3&lt;br /&gt;
| 24,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 27,7&lt;br /&gt;
| 26,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
| 23&lt;br /&gt;
| 28,7&lt;br /&gt;
| 27,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,0&lt;br /&gt;
| 25,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
| 27&lt;br /&gt;
| 23,7&lt;br /&gt;
| 23,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
| 16&lt;br /&gt;
| 22,7&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 24,0&lt;br /&gt;
| 25,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 28,3&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
| 29&lt;br /&gt;
| 28,7&lt;br /&gt;
| 29,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
| 26&lt;br /&gt;
| 30,0&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;13&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 32,0&lt;br /&gt;
| 30,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;16&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 29,7&lt;br /&gt;
| 28,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;17&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,7&lt;br /&gt;
| 28,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 27,3&lt;br /&gt;
| 26,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;19&#039;&#039;&#039;&lt;br /&gt;
| 32&lt;br /&gt;
| 24,3&lt;br /&gt;
| 25,3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;20&#039;&#039;&#039;&lt;br /&gt;
| 19&lt;br /&gt;
| 25,5&lt;br /&gt;
| 24,3&lt;br /&gt;
|}&lt;br /&gt;
A chart illustrates it more clearly. The red line is not smoothed and has more spikes than the others:&lt;br /&gt;
&lt;br /&gt;
[[File:dzvents-smoothing.png|frame|none|alt=|Smoothing]]&lt;br /&gt;
&lt;br /&gt;
Usually a range of 1 or 2 is sufficient when providing a smoothing range to statistical functions. I suggest smoothing when checking deltas, local minimums and maximums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-does-the-storage-stuff-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How does the storage stuff work? ==&lt;br /&gt;
&lt;br /&gt;
For every script file that defines persisted variables (using the &amp;lt;code&amp;gt;data={ … }&amp;lt;/code&amp;gt; section), dzVents will create storage file with the name &amp;lt;code&amp;gt;__data_scriptname.lua&amp;lt;/code&amp;gt; in a subfolder called &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. You can always delete these data files or the entire storage folder if there is a problem with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz/&lt;br /&gt;
    scripts/&lt;br /&gt;
        dzVents/&lt;br /&gt;
            data/&lt;br /&gt;
                __data_yourscript1.lua&lt;br /&gt;
                __data_yourscript2.lua&lt;br /&gt;
                __data_global_data.lua&lt;br /&gt;
            examples/&lt;br /&gt;
            generated_scripts/&lt;br /&gt;
            scripts/&lt;br /&gt;
                yourscript1.lua&lt;br /&gt;
                yourscript2.lua&lt;br /&gt;
                global_data.lua&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you dare to, you can watch inside these files. Every time some data are changed, dzVents will stream the changes back into the data files. &#039;&#039;&#039;Again, make sure you don’t put too much stuff in your persistent data as it may slow things down too much.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-requests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous HTTP requests =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous HTTP request and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use os functions like &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz will terminate the script with a message that it took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to make an http call and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;openURL&amp;lt;/code&amp;gt; on the domoticz object with only the url as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL(&#039;http://domain/path/to/something?withparameters=1&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will make the request that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a url you pass in a table with all the parameters to make the request &#039;&#039;&#039;and&#039;&#039;&#039; your provide a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
    domoticz.openURL({&lt;br /&gt;
        url = &#039;http://domain/path/to/something&#039;,&lt;br /&gt;
        method = &#039;POST&#039;,&lt;br /&gt;
        callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
        postData = {&lt;br /&gt;
            paramA = &#039;something&#039;,&lt;br /&gt;
            paramB = &#039;something else&#039;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will make the request (a POST in this case), and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    httpResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
    if (response.ok) then -- success&lt;br /&gt;
        if (response.isJSON) then&lt;br /&gt;
            domoticz.log(response.json.some.value)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    timer = {&#039;every 5 seconds&#039;},&lt;br /&gt;
    httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
    if (item.isTimer) then&lt;br /&gt;
        domoticz.openURL({&lt;br /&gt;
            url = &#039;...&#039;,&lt;br /&gt;
            callback = &#039;trigger&#039;&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    if (item.isHTTPResponse) then&lt;br /&gt;
        if (item.ok) then&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.openURL(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;url&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. Either &amp;lt;code&amp;gt;&#039;GET&#039;&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;&#039;POST&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;PUT&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;&#039;DELETE&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; .&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to trigger the callback handler script(s).&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. A Lua table or JSON string with additional http request-headers.&lt;br /&gt;
* &#039;&#039;&#039;postData&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. When doing a &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; this data will be the payload of the request (body). If you provide a Lua table then this will automatically be converted to json and the request-header &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; is set. So no need to do that manually. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw response data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Response headers.&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;application/json&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;text/xml&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be in range of 200-299.&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. HTTP status codes. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;statusText&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP status message. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;protocol&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP protocol. See [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;more-about-request-and-response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== More about request and response headers ===&lt;br /&gt;
&lt;br /&gt;
Whenever you do an http request it is not just some data that is sent. Along with the request a bunch of so-called headers are sent along with it. HTTP headers allow the client and the server to pass additional information with the request or the response. Also, in the response there are also headers (response header). These response headers usually tell you what kind of data is returned, if it is compressed, if the request was successful etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;request-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== request headers ====&lt;br /&gt;
&lt;br /&gt;
dzVents allow you to set custom request headers that will accompany the data in the request. Sometimes it is necessary to set these headers like for instance when a API or webservice require a security token or key or when the service needs to know what the format of the response data is. Check the documentation of the web service.&lt;br /&gt;
&lt;br /&gt;
So, let’s say you need to call a web service that requires an api key in the headers and the documentation states it needs to be passed in an x-access-token header. Your openURL command then may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL({&lt;br /&gt;
    url = &#039;https://somedomain.com/service/getInfo&#039;,&lt;br /&gt;
    headers = { [&#039;x-access-token&#039;] = &#039;&amp;lt;api-key&amp;gt;&#039; },&lt;br /&gt;
    method = &#039;GET&#039;,&lt;br /&gt;
    callback = &#039;info&#039;&lt;br /&gt;
})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Check google for more information about request headers. All you need to know here is that dzVents allow you to set these headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== response headers ====&lt;br /&gt;
&lt;br /&gt;
As said earlier, the response also contains a bunch of headers. You can inspect those headers with dzVents but ususally you don’t have to. For starters, dzVents already checks the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header which usually states what kind of data format the response is. If it is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then it automatically converts the json data to a Lua table. Also, it checks the &amp;lt;code&amp;gt;Status&amp;lt;/code&amp;gt; header to see if the request was successful. If so, then it sets the &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; attribute on the response object. So normally you don’t have to inspect the headers. However, sometimes the web service puts a session token in the response header that you have to use in follow-up requests.&lt;br /&gt;
&lt;br /&gt;
So here an example where we have to log in before we can fetch data. It uses two requests: the first performs the log-in and the second grabs the session token from the login response data and uses that token in the second request to get the data we need. In this example we do this every hour.&lt;br /&gt;
&lt;br /&gt;
That would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;loggedin&#039;, &#039;data&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/login&#039;,&lt;br /&gt;
                method = &#039;POST&#039;,&lt;br /&gt;
                postData = { [&#039;username&#039;] = &#039;Luke Skywalker&#039;, [&#039;password&#039;] = &#039;theforce&#039; }&lt;br /&gt;
                callback = &#039;loggedin&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- check to which request this response was the result&lt;br /&gt;
            if (item.trigger == &#039;loggedin&#039;) then&lt;br /&gt;
                -- we are logged in, now grab the session token from the header and&lt;br /&gt;
                -- fetch our data&lt;br /&gt;
                local token = item.headers[&#039;x-session-token&#039;]&lt;br /&gt;
                -- now we have the token, put it in the headers:&lt;br /&gt;
                domoticz.openURL({&lt;br /&gt;
                    url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                    method = &#039;GET&#039;,&lt;br /&gt;
                    headers = { [&#039;x-session-token&#039;] = token },&lt;br /&gt;
                    callback = &#039;data&#039;&lt;br /&gt;
                })&lt;br /&gt;
            else&lt;br /&gt;
                -- it must the data we requested&lt;br /&gt;
                local data = item.data&lt;br /&gt;
                -- do something with it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Some remarks about the response header &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;. If a service is a good web-citizen then it tells you what the format of the data is in this header. So, if the data is a json object then the header should be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;. Unfortunately, there are lot of lazy programmers out there who don’t set this header properly. If that is the case, dzVents cannot detect the format and will not turn it into a Lua table for you automatically. So, if you know it is json but the header is not properly set, then you can easily convert it into a Lua table in your code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                callback = &#039;trigger&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- we know it is json but dzVents cannot detect this&lt;br /&gt;
            -- convert to Lua&lt;br /&gt;
            local json = domoticz.utils.fromJSON(item.data)&lt;br /&gt;
            -- json is now a Lua table&lt;br /&gt;
            print(json.result.title) -- just an example&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous shell command execution =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use functions like &amp;lt;code&amp;gt;utils.osCommand()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;os.Execute()&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to execute a shell command asynchronously and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;executeShellCommand&amp;lt;/code&amp;gt; on the domoticz object with only the command as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.executeShellCommand(&#039;some shell command&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will execute the request in a separate thread and that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a command you pass in a table with the command to be executed &#039;&#039;&#039;and&#039;&#039;&#039; a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;some shell command&#039;,&lt;br /&gt;
            callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
            timeout = timeoutinseconds,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        shellCommandResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
        if response.ok then&lt;br /&gt;
            if (response.isJSON) then&lt;br /&gt;
                domoticz.log(response.json.some.value)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every 5 minutes&#039;,&lt;br /&gt;
        },&lt;br /&gt;
        shellCommandResponses =&lt;br /&gt;
        {&lt;br /&gt;
            scriptVar,&lt;br /&gt;
        },&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.executeShellCommand(&lt;br /&gt;
            {&lt;br /&gt;
                command = &#039;some shell command&#039;,&lt;br /&gt;
                callback = scriptVar,&lt;br /&gt;
                timeout = timeoutinseconds,&lt;br /&gt;
            })&lt;br /&gt;
        elseif item.isShellCommandResponse then&lt;br /&gt;
            if item.statusCode == 0 then&lt;br /&gt;
                ... -- process result (in item.json, -item.xml, -item.lines or item.data)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.executeShellCommand(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;command&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to find a the callback handler script.&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: &#039;&#039;Integer&#039;&#039;. Optional. Max execution time in seconds. defaults to 10 seconds. A value of 0 disables the timeout.&lt;br /&gt;
&lt;br /&gt;
Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: output from the command. (stdout)&lt;br /&gt;
* &#039;&#039;&#039;errorText&#039;&#039;&#039;: Errors generated by the command (stderr)&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Int&#039;&#039;. exitcode generated by the command&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be 0.&lt;br /&gt;
* &#039;&#039;&#039;timeoutOccurred&#039;&#039;&#039; &#039;&#039;Boolean&#039;&#039; &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was aborted by a timeout.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;settings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Settings =&lt;br /&gt;
&lt;br /&gt;
Settings for dzVents are found in the Domoticz GUI: &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039;: Tick this if you don’t want any dzVents script to be executed.&lt;br /&gt;
* &#039;&#039;&#039;Log level&#039;&#039;&#039;: (Note that you can override this setting in the logging section of your script)&lt;br /&gt;
** &#039;&#039;Errors&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info&#039;&#039;: Errors and some minimal information about which script is being executed and why,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info + generic info&#039;&#039;. Even more information about script execution and a bit more log formatting.&lt;br /&gt;
** &#039;&#039;Debug&#039;&#039;. Shows everything and dzVents will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in the scripts/dzVents folder. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.&lt;br /&gt;
** &#039;&#039;No logging&#039;&#039;. As silent as possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
So, you think if you have done everything correctly but things do not work (in some way) as you expected. Here are a couple steps you can do to find the cause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-dzvents-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is dzVents enabled? ===&lt;br /&gt;
&lt;br /&gt;
Check the settings (see above) and make sure the checkbox &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039; is not checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-your-script-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is your script enabled? ===&lt;br /&gt;
&lt;br /&gt;
Make sure the active section in your script is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;active = true&amp;lt;/code&amp;gt;. And, on top of that, if you are using the internal web editor to write your script, make sure that your script is active there and you have clicked Save! “Event active” is a separate checkbox that must be ticked for every active script. When not active, the script name will be red in the list on the right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;turn-on-debug-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Turn on debug logging ===&lt;br /&gt;
&lt;br /&gt;
Activate debug logging in the settings (see above). This will produce a lot of extra messages in the Domoticz log (don’t forget to turn it off when you are done troubleshooting!). It is best to monitor the log through the command line, as the log in the browser sometimes tends to not always show all log messages. See the Domoticz manual for how to do that.&lt;br /&gt;
&lt;br /&gt;
When debug logging is enabled, every time dzVents kicks into action (Domoticz throws an event) it will log it, and it will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz. This data lie at the core of the dzVents object model. You can open this file in an editor to see if your device/variable/scene/group/hardware is in there. Note that the data in the file are not exactly the same as what you will get when you interact with dzVents, but it is a good start. If your object is not in the data file, then you will not have access to it in dzVents and dzVents will not be able to match triggers with that object. Something’s wrong if you expect your object to be in there but it is not (is the object active/used?). &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.with a dump of the data sent to dzVents.&lt;br /&gt;
&lt;br /&gt;
Example content of &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    Startdate time  - End date time  (clk - CPU )                 dule / scriptname &amp;amp;lt;&amp;amp;lt; type: &amp;amp;quot;trigger&amp;amp;quot;&lt;br /&gt;
    ---------------------------------------------------------------------------------------------------------------&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0029)                     waqi.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 20 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0016)                   Washer.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 5 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:01 - 11/27/20 18:40:01 (00 - 0.0215)   getWaterFromHomewizard.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WaterfromHomewizard&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.2472)     updateWeatherSensors.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WUS_buienradarResponse&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.0290)                     waqi.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;waqi_nearby&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:41:00 - 11/27/20 18:41:00 (00 - 0.0583)        Bathroom humidity.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every minute between 05:15 and 23:30&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every time Domoticz starts dzVents and debug logging is enabled you should see these lines in the domoticz log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dzVents version: x.y.z&lt;br /&gt;
Event trigger type: aaaa&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where aaaa can be time, custom event, system event, device, uservariable, security or scenegroup. That should give you a clue what kind of event is active. If you don’t see this information then dzVents is not active (or debug logging is not active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-is-still-not-executed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script is still not executed ===&lt;br /&gt;
&lt;br /&gt;
If for some reason your script is not executed while all of the above is done, it is possible that your triggers are not correct. Either the time rule is not matching with the current time (try to set the rule to &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or something simple), or the device name is not correct (check casing), or you use an id that doesn’t exist. Note that in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section, you cannot use the dzVents domoticz object!&lt;br /&gt;
&lt;br /&gt;
Make sure that if you use an id in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section that this id is correct. Go to the device list in Domoticz and find the device and make sure the device is in the ‘used’ list!. Unused devices will not create an event. Find the idx for the device and use that as the id.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that your device names are unique! dzVents will throw a warning in the log if multiple device names match. It’s best practice to have unique names for your devices. Use some clever naming like prefixing like ‘Temperature: living room’ or ‘Lights: living room’. That also makes using wild cards on your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section easier.&lt;br /&gt;
&lt;br /&gt;
If your script is still not triggered, you can try to create a classic Lua event script and see if that does work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging-your-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugging your script ===&lt;br /&gt;
&lt;br /&gt;
A simple way to inspect a device in your script is to dump it to the log: &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt;. This will dump everything known to dzVents of the device so you can inspect what its state is. If you only need to see a subset you can use dumpSelection(‘attributes’), dumpSelection(‘functions’) or dumpSelection(‘tables’) Use print statements or domoticz.log() statements in your script at cricital locations to see if the Lua interpreter reaches that line. Don’t try to print a device object though; use the &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; method for that. It wil log all attributes of the device in the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
If you place a print statement all the way at the top of your script file it will be printed every time dzVents loads your script (that is done at the beginning of each event cycle). Sometimes that is handy to see if your script gets loaded in the first place. If you don’t see your print statement in the log, then likely dzVents didn’t load it and it will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;get-help&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Get help ===&lt;br /&gt;
&lt;br /&gt;
The Domoticz forum is a great resource for help and solutions. Check the [https://www.domoticz.com/forum/viewforum.php?f=59 dzVents forum].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;other-interesting-stuff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Other interesting stuff =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lodash-for-lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== lodash for Lua ==&lt;br /&gt;
&lt;br /&gt;
lodash is a well known and very popular Javascript library filled with dozens of handy helper functions that really make you life a lot easier. Fortunately there is also a Lua version. This is directly available through the domoticz object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _ = domoticz.utils._&lt;br /&gt;
_.print(_.indexOf({2, 3, &#039;x&#039;, 4}, &#039;x&#039;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--- (Removed because link is dead. Hopefully only temporarily) Check out the great documentation [here](http://axmat.github.io/lodash.lua/). ---&amp;gt;&lt;br /&gt;
Check out the documentation [https://htmlpreview.github.io/?https://github.com/rwaaren/lodash.lua/blob/master/doc/index.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;history-link-to-changes-in-previous-versions.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= History [https://wiki.domoticz.com/DzVents_version_History link to changes in previous versions]. =&lt;br /&gt;
&lt;br /&gt;
See link for the complete list of changes&lt;br /&gt;
&lt;br /&gt;
https://wiki.domoticz.com/DzVents_version_History&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19248</id>
		<title>DzVents: next generation Lua scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19248"/>
		<updated>2026-08-02T17:03:39Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Thermostat 6 3.1.11 */ layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: This document is maintained on [https://github.com/domoticz/domoticz/blob/development/dzVents/documentation/README.md github], and the wiki version is automatically generated. Edits should be performed on github, or they may be suggested on the wiki article’s [https://wiki.domoticz.com/Talk:DzVents:_next_generation_Lua_scripting Discussion page]. Editing can be done by any editor but if you are looking for a specialized markDown editor; [https://stackedit.io/app# stackedit.io] would be a good choice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;about-dzvents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About dzVents =&lt;br /&gt;
&lt;br /&gt;
dzVents /diː ziː vɛnts/, short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts. And … &#039;&#039;&#039;it is 100% Lua&#039;&#039;&#039;! So if you already have a bunch of event scripts for Domoticz, upgrading should be fairly easy.&lt;br /&gt;
&lt;br /&gt;
Let’s start with an example. Say you have a switch that when activated, it should activate another switch but only if the room temperature is above a certain level. And when done, it should send a notification. This is how it looks in dzVents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;Room switch&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, roomSwitch)&lt;br /&gt;
        if (roomSwitch.active and domoticz.devices(&#039;Living room&#039;).temperature &amp;gt; 18) then&lt;br /&gt;
        domoticz.devices(&#039;Another switch&#039;).switchOn()&lt;br /&gt;
        domoticz.notify(&#039;This rocks!&#039;,&lt;br /&gt;
                        &#039;Turns out that it is getting warm here&#039;,&lt;br /&gt;
                        domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you have a timer script that should be executed every 10 minutes, but only on weekdays, and have it do something with some user variables and only during daytime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
            --activate my scene&lt;br /&gt;
            domoticz.scenes(&#039;Evening lights&#039;).switchOn()&lt;br /&gt;
            if (domoticz.devices(&#039;My PIR&#039;).lastUpdate.minutesAgo &amp;gt; 5) then&lt;br /&gt;
                domoticz.devices(&#039;Bathroom lights&#039;).switchOff()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you want to detect a humidity rise within the past 5 minutes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;every 5 minutes&#039;}&lt;br /&gt;
    },&lt;br /&gt;
    data =&lt;br /&gt;
    {&lt;br /&gt;
        previousHumidity = { initial = 100 }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        local bathroomSensor = domoticz.devices(&#039;BathroomSensor&#039;)&lt;br /&gt;
        if (bathroomSensor.humidity - domoticz.data.previousHumidity) &amp;gt;= 5 then&lt;br /&gt;
            -- there was a significant rise&lt;br /&gt;
            domoticz.devices(&#039;Ventilator&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
        -- store current value for next cycle&lt;br /&gt;
        domoticz.data.previousHumidity = bathroomSensor.humidity&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just to give you an idea! Everything in your Domoticz system is now logically available in the domoticz object structure. With this domoticz object, you can get to all the information in your system and manipulate your devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;using-dzvents-with-domoticz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Using dzVents with Domoticz =&lt;br /&gt;
&lt;br /&gt;
In Domoticz go to &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other&#039;&#039;&#039; and in the section EventSystem make sure the check-box ‘dzVents disabled’ is not checked. Also make sure that in the Security section in the settings &#039;&#039;&#039;(Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Local Networks (no username/password)&#039;&#039;&#039; you allow 127.0.0.1 (and / or ::1 when using IPv6 ) to not need a password. dzVents does use this port to get the location settings and to send certain commands to Domoticz. Finally make sure you have set your current location in &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Location&#039;&#039;&#039;, otherwise there is no way to determine nighttime/daytime state.&lt;br /&gt;
&lt;br /&gt;
There are two ways of creating dzVents event scripts in Domoticz:&lt;br /&gt;
&lt;br /&gt;
# By creating scripts in your domoticz instance on your domoticz server: &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Make sure that each script has the extension &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; and follows the guidelines as described below.&lt;br /&gt;
# By creating scripts inside Domoticz using the internal Domoticz event editor: Go to &#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Events&#039;&#039;&#039;. Press the + button and choose dzVents. You must then choose a template. They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: scripts that you write on the file-system and inside Domoticz using the internal web-editor all share the same name-space. That means that if you have two scripts with the same name, only the one of the file-system will be used. The log will tell you when this happens.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: Scripts created in the internal editor are stored in the domoticz database and are all written to &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/generated_scripts&amp;lt;/code&amp;gt; on every domoticz restart and every “EventSystem: reset all events…”. Scripts in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt; are not stored in the database and should be backed-up separately. &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quickstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
If you made sure that dzVents system is active, we can do a quick test if everything works:&lt;br /&gt;
&lt;br /&gt;
* Pick a switch in your Domoticz system. Write down the exact name of the switch. If you don’t have a switch then you can create a Dummy switch and use that one.&lt;br /&gt;
* Create a new file in the &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/&amp;lt;/code&amp;gt; folder (or using the web-editor in Domoticz, switch to dzVents mode first.). Call the file &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt;. &#039;&#039;Note: when you create a script in the web-editor you do &#039;&#039;&#039;not&#039;&#039;&#039; add the .lua extension!&#039;&#039; Also, valid script names follow the same rules as [https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words filesystem names].&lt;br /&gt;
* Open &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt; in an editor and fill it with this code and change &amp;lt;code&amp;gt;&amp;amp;lt;exact name of the switch&amp;amp;gt;&amp;lt;/code&amp;gt; with the .. you guessed it… exact name of the switch device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&lt;br /&gt;
            &#039;&amp;lt;exact name of the switch&amp;gt;&#039;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (switch.state == &#039;On&#039;) then&lt;br /&gt;
                domoticz.log(&#039;Hey! I am on!&#039;)&lt;br /&gt;
            else&lt;br /&gt;
                domoticz.log(&#039;Hey! I am off!&#039;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Save the script&lt;br /&gt;
* Open the Domoticz log in the browser&lt;br /&gt;
* In Domoticz GUI perhaps in another browser tab) press the switch.&lt;br /&gt;
* You can watch the log in Domoticz and it should show you that indeed it triggered your script and you should see the log messages.&lt;br /&gt;
&lt;br /&gt;
See the examples folder &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples&amp;lt;/code&amp;gt; for more examples. This folder includes templates you can use to get started as well. And, if you use the GUI web editor to write your script, you will find boilerplate examples in the drop-down below the script type setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;writing-scripts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Writing scripts =&lt;br /&gt;
&lt;br /&gt;
In order for your scripts to work with dzVents, they have to be turned into a Lua module with a specific structure. Basically you make sure it returns a Lua table (object) with predefined keys like &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt;. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;My switch&#039; }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, switch)&lt;br /&gt;
        -- your script logic goes here, something like this:&lt;br /&gt;
        if (switch.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.log(&#039;I am on!&#039;, domoticz.LOG_INFO)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Simply said, the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-part defines the trigger and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part is what should be done if the trigger matches with the current Domoticz event. So all your logic is inside the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sections-in-the-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sections in the script ==&lt;br /&gt;
&lt;br /&gt;
Each dzVents event script has this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    active = true, -- optional&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        -- at least one of these:&lt;br /&gt;
        customEvents = { ... },&lt;br /&gt;
        devices = { ... },&lt;br /&gt;
        groups = { ... },&lt;br /&gt;
        httpResponses = { ... },&lt;br /&gt;
        scenes = { ... },&lt;br /&gt;
        security = { ... },&lt;br /&gt;
        shellCommandResponses = { ... },&lt;br /&gt;
        system = { ... },&lt;br /&gt;
        timer = { ... },&lt;br /&gt;
        variables = { ... },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    data = { ... }, -- optional&lt;br /&gt;
    logging = { ... }, -- optional&lt;br /&gt;
    execute = function(domoticz, item, triggerInfo)&lt;br /&gt;
    -- your code here&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;active-truefalse-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== active = true/false (optional) ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;active = false&amp;lt;/code&amp;gt;, then the script is not activated: &#039;&#039;dzVents will ignore the script completely&#039;&#039;. If you don’t have &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; specified, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is assumed (default value). If you write scripts with Domoticz’ internal script editor then you don’t need this part as the editor has its own way of enabling and disabling scripts.&lt;br /&gt;
&lt;br /&gt;
So, &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; can either be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;true&#039;&#039;&#039;: (default) the script file will be processed.&lt;br /&gt;
* &#039;&#039;&#039;false&#039;&#039;&#039;: the script file is ignored.&lt;br /&gt;
* &#039;&#039;&#039;function(domoticz) … end&#039;&#039;&#039;: A function returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The function will receive the domoticz object with all the information about your domoticz instance: &amp;lt;code&amp;gt;active = function(domoticz) .... end&amp;lt;/code&amp;gt;. For example you could check for a Domoticz variable or switch and prevent the script from being executed. &#039;&#039;&#039;However, be aware that for &#039;&#039;every script&#039;&#039; in your scripts folder, this active function will be called, every cycle!! Therefore, it is better to put all your logic in the execute function instead of in the active function.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== on = { … } ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section tells dzVents &#039;&#039;when&#039;&#039; the execute function has to be executed. It holds all the events/&#039;&#039;&#039;triggers&#039;&#039;&#039; that are monitored by dzVents. If any of the events or triggers match with the current event coming from Domoticz, then the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part of the script is executed by dzVents. The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section has many kinds of subsections that &#039;&#039;can all be used simultaneously&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;customevents-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== customEvents = { … } &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more custom event triggers. This eventTrigger can be activate by a json/api call, a MQTT message (when domoticz is setup to listen to such messages on the hardware tab) or by the dzVents internal command domoticz.emitEvent - The name of the custom-event - The name of the custom-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|See time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;- curl: curl -d &amp;amp;quot;{ &#039;a&#039;:10, &#039;b&#039;:20, &#039;some&#039;:&#039;text&#039;, &#039;sub&#039; : { &#039;x&#039;:10, &#039;y&#039;:20 } }&amp;amp;quot; &amp;amp;quot;http://&amp;amp;lt;domoticzIP:domoticz port&amp;amp;gt;/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;myCustomEvent&amp;amp;gt;&amp;amp;quot;&lt;br /&gt;
- JSON: **&amp;amp;lt; domoticzIP : domoticz port &amp;amp;gt;**/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;MyEvent&amp;amp;gt;&amp;amp;amp;data=myData&lt;br /&gt;
- MQTT simple: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;, &amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;myData&amp;amp;quot;}&lt;br /&gt;
- MQTT complex: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;,&amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;{\&amp;amp;quot;idx\&amp;amp;quot;:29,\&amp;amp;quot;test\&amp;amp;quot;:\&amp;amp;quot;ok\&amp;amp;quot;}&amp;amp;quot; }&lt;br /&gt;
- emitEvent: domoticz.emitEvent(&#039;myCustomEvent&#039; [,])&lt;br /&gt;
    `domoticz.emitEvent(&#039;myEvent&#039;) -- no data`&lt;br /&gt;
    `domoticz.emitEvent(&#039;another event&#039;, &#039;some data&#039;)`&lt;br /&gt;
    `domoticz.emitEvent(&#039;hugeEvent&#039;, { a = 10, b = 20, some = &#039;text&#039;, sub = { x = 10, y = 20 } })`&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;attributes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== Attributes =====&lt;br /&gt;
&lt;br /&gt;
The customEvent object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw customEvent data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid json string. The data is then automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid xml string. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the customEvent data is a valid json string, the response data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;customEvent&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; The string that triggered this customEvent instance. This is useful if you have a script that can be triggered by multiple different customEvent strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the response data is a valid xml string, the customEvent data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== devices = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of device-names or indexes. If a device in your system was updated (e.g. a switch was triggered or a new temperature was received) and it is listed in this section then the execute function is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the device state or value has changed. Each device can be:&lt;br /&gt;
&lt;br /&gt;
* The name of your device between string quotes. &#039;&#039;&#039;You can use the asterisk (*) wild-card here e.g. &amp;lt;code&amp;gt;PIR_*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*_PIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;. E.g.: &amp;lt;code&amp;gt;devices = { &#039;myDevice&#039;, &#039;anotherDevice&#039;, 123, &#039;pir*&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* The index (idx) of your device (as the name may change, the index will usually stay the same, the index can be found in the devices section in Domoticz). &#039;&#039;&#039;Note that idx is a number;&#039;&#039;&#039;&lt;br /&gt;
* The name or idx of your device followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;myDevice&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if &amp;lt;code&amp;gt;myDevice&amp;lt;/code&amp;gt; was changed, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;groups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== groups = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more group-names or indexes. The same rules as devices apply.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpresponses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== httpResponses = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more http callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shellcommandresponses-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== shellCommandResponses = { …} &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scriptcommand callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scenes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== scenes = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scene-names or indexes. The same rules as devices apply. So if your scene is listed in this table then the executed function will be triggered, e.g.: &amp;lt;code&amp;gt;on = { scenes = { &#039;myScene&#039;, &#039;anotherScene&#039; } },&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== security = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more of these security states:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDAWAY&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDHOME&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_DISARMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the security state in Domoticz changes and it matches with any of the states listed here, the script will be executed. See &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples/templates/security.lua&amp;lt;/code&amp;gt; for an example see [[#Security_Panel|Security Panel]] for information about how to create a security panel device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== system = { …} &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more system triggers.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manualBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dailyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hourlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monthlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resetAllDeviceStatus&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt; &amp;lt;code&amp;gt;resetAllEvents&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* The name of the system-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
** &#039;&#039;&#039;start&#039;&#039;&#039; - fired when Domoticz has started.&lt;br /&gt;
** &#039;&#039;&#039;stop&#039;&#039;&#039; - fired when Domoticz is shutting down. As you probably can imagine you have only a limited amount of time - also depending on the load on your system - to have Domoticz do stuff when your script has been completed. Some commands will probably not be executed. Just give it a try.&lt;br /&gt;
** &#039;&#039;&#039;Backups&#039;&#039;&#039; - the trigger item (2nd parameter of the execute function) is a table that holds information about the newly created backup (location, duration in seconds and type). You could use this information to copy the file to some other location or for another purpose.&lt;br /&gt;
*** &#039;&#039;&#039;dailyBackupFinished&#039;&#039;&#039; - automatic backup when set in domoticz&lt;br /&gt;
*** &#039;&#039;&#039;hourlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;monthlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;manualBackupFinished&#039;&#039;&#039; - fired when you start a backup using the Domoticz GUI or via &#039;&#039;&#039;&amp;amp;lt; domoticz IP:domoticz port &amp;amp;gt;&#039;&#039;&#039;/backupdatabase.php&lt;br /&gt;
*** &#039;&#039;&#039;resetAllDeviceStatus&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when the name, description or used / unused state of a device, variable or scene is updated.&lt;br /&gt;
*** &#039;&#039;&#039;resetAllEvents&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when a dzVents script in the internal editor changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== timer = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one ore more time ‘rules’ like &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;at 17:*&amp;lt;/code&amp;gt;. See [[#timer_trigger_rules|&#039;&#039;timer&#039;&#039; trigger rules]]. If any or the rules matches with the current time/date then your execute function is called. E.g.: &amp;lt;code&amp;gt;on = { timer = { &#039;between 30 minutes before sunset and 30 minutes after sunrise&#039; } }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== variables = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more user variable-names as defined in Domoticz ( &#039;&#039;Setup &amp;amp;gt; More options &amp;amp;gt; User variables&#039;&#039;). If any of the variables listed here is updated, ( &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed ).the script is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: Script will only execute when this variable is updated directly by dzVents or by a JSON. If updated with a standard Lua script (using commandArray) or in combination with a time option like afterAAA no event will be triggered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;execute-functiondomoticz-item-triggerinfo-end&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== execute = function(&#039;&#039;&#039;domoticz, item, triggerInfo&#039;&#039;&#039;) … end ===&lt;br /&gt;
&lt;br /&gt;
When all the above conditions are met (active == true and the on section has at least one matching rule), then this &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function is called. This is the heart of your script. The function has three parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 1. (&#039;&#039;&#039;domoticz&#039;&#039;&#039;, item, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
The [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]]. This object gives you access to almost everything in your Domoticz system, including all methods to manipulate them—like modifying switches or sending notifications. More about the [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 2. (domoticz, &#039;&#039;&#039;item&#039;&#039;&#039;, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
Depending on what actually triggered the script, &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is either a:&lt;br /&gt;
&lt;br /&gt;
* [[#Custom_event_API|customEvent]] &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Device_object_API|device]],&lt;br /&gt;
* [[#Variable_object_API_.28user_variables.29|variable]],&lt;br /&gt;
* [[#Scene|scene]],&lt;br /&gt;
* [[#Group|group]],&lt;br /&gt;
* [[#timer_=_%7B_..._%7D|timer]],&lt;br /&gt;
* [[#System_event_API|system]], &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Security_Panel|security]] or&lt;br /&gt;
* [[#Asynchronous_HTTP_requests|httpResponse]]&lt;br /&gt;
* [[#Asynchronous_shell_command_executio|shellCommandResponse]] &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since you can define multiple on-triggers in your script, it is not always clear what the type is of this second parameter. In your code you need to know this in order to properly respond to the different events. To help you inspect the object you can use these attributes like &amp;lt;code&amp;gt;if (item.isDevice) then ... end&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;isCustomEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a customEvent object.&lt;br /&gt;
* &#039;&#039;&#039;isDevice&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Device object.&lt;br /&gt;
* &#039;&#039;&#039;isGroup&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Group object.&lt;br /&gt;
* &#039;&#039;&#039;isHTTPResponse&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is an HTTPResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isShellCommandResponse&#039;&#039;&#039;: . &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a shellcommandResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isScene&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Scene object.&lt;br /&gt;
* &#039;&#039;&#039;isSecurity&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Security object.&lt;br /&gt;
* &#039;&#039;&#039;isSystemEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a system object.&lt;br /&gt;
* &#039;&#039;&#039;isTimer&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Timer object.&lt;br /&gt;
* &#039;&#039;&#039;isVariable&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Variable object.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;: . &#039;&#039;string&#039;&#039;. the timer rule, the security state, the customEvent or the http response callback string that actually triggered your script. E.g. if you have multiple timer rules can inspect &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; which exact timer rule was fired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3. (domoticz, item, &#039;&#039;&#039;triggerInfo&#039;&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: as of version 2.4.0, &amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; has become more or less obsolete and is left in here for backward compatibility. All information is now available on the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; parameter (second parameter of the execute function, see point 2 above).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; holds information about what triggered the script. The object has two attributes:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;type&#039;&#039;&#039;: the type of the the event that triggered the execute function, either: - domoticz.EVENT_TYPE_CUSTOM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_DEVICE, - domoticz.EVENT_TYPE_GROUP - domoticz.EVENT_TYPE_HTTPRESPONSE - domoticz.EVENT_TYPE_SCENE, - domoticz.EVENT_TYPE_SECURITY, - domoticz.EVENT_TYPE_SYSTEM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_TIMER, - domoticz.EVENT_TYPE_VARIABLE)&lt;br /&gt;
# &#039;&#039;&#039;trigger&#039;&#039;&#039;: the timer rule that triggered the script if the script was called due to a timer event, or the security state that triggered the security trigger rule. See [[#timer_trigger_rules|below]] for the possible timer trigger rules.&lt;br /&gt;
# &#039;&#039;&#039;scriptName&#039;&#039;&#039;: the name of the current script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tip-rename-the-parameters-to-better-fit-your-needs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tip: rename the parameters to better fit your needs ====&lt;br /&gt;
&lt;br /&gt;
The names of the execute parameters are actually something you can change to your convenience. For instance, if you only have one trigger for a specific switch device, you can rename &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; it to &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Or if you think &amp;lt;code&amp;gt;domoticz&amp;lt;/code&amp;gt; is too long you can rename it to &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dz&amp;lt;/code&amp;gt; (might save you a lot of typing and may make your code more readable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = &#039;mySwitch&#039;&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(dz, mySwitch)&lt;br /&gt;
        dz.log(mySwitch.state, dz.LOG_INFO)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== data = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional data section allows you to define local variables that will hold their values &#039;&#039;between&#039;&#039; script runs. These variables can get a value in your execute function and the next time the script is executed these variables will have their previous state restored. For more information see the section [[#Persistent_data|Persistent data]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logging-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== logging = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional logging section allows you to override the global logging setting of dzVents as set in &#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem &amp;amp;gt; dzVents Log Level&#039;&#039;. This can be handy when you only want this script to have extensive debug logging while the rest of your script executes silently. You have these options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: This is the minimum log level you want for this script. This can be domoticz.LOG_INFO, domoticz.LOG_STATUS, domoticz.LOG_ERROR or domoticz.LOG_DEBUG&lt;br /&gt;
* &#039;&#039;&#039;marker&#039;&#039;&#039;: A string that is prefixed before each log message. That way you can easily create a filter in the Domoticz log to see just these messages. &#039;&#039;&#039;marker&#039;&#039;&#039; defaults to scriptname&lt;br /&gt;
&lt;br /&gt;
\*LOG_DEBUG will also cause Execution Info to be displayed (start/finished)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;logging = {&lt;br /&gt;
    level = domoticz.LOG_DEBUG,&lt;br /&gt;
    marker = &amp;quot;Hey you&amp;quot;&lt;br /&gt;
    },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;some-trigger-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Some trigger examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to trigger a script not on the minute but 30 seconds later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every minute&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        customEvents =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;delayed&#039;,&lt;br /&gt;
        },&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.emitEvent(&#039;delayed&#039;, domoticz.time.rawTime ).afterSec(30)&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.notify(&#039;Delayed&#039;, &#039;Event was emitted at &#039; .. item.data, domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have two devices—a smoke detector ‘myDetector’ and a room temperature sensor ‘roomTemp’, and you want to send a notification when either the detector detects smoke or the temperature is too high:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = {&lt;br /&gt;
            &#039;myDetector&#039;,&lt;br /&gt;
            &#039;roomTemp&#039;&lt;br /&gt;
    }&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        if ((device.name == &#039;myDetector&#039; and device.active) or&lt;br /&gt;
            (device.name == &#039;roomTemp&#039; and device.temperature &amp;gt;= 45)) then&lt;br /&gt;
            domoticz.notify(&#039;Fire&#039;, &#039;The room is on fire&#039;, domoticz.PRIORITY_EMERGENCY)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / group changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a scene ‘myScene’ and a group ‘myGroup’, and you want to turn on the group as soon as myScene is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        scenes = { &#039;myScene&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, scene)&lt;br /&gt;
        if (scene.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.groups(&#039;myGroup&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you want to send an email when a group is activated at night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        groups = { [&#039;myGroup&#039;] = {&#039;at nighttime&#039;} }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, group)&lt;br /&gt;
        if (group.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.email(&#039;Hey&#039;, &#039;The group is on&#039;, &#039;someone@the.world.org&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timer events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to check the soil humidity every 30 minutes during the day and every hour during the night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every 30 minutes at daytime&#039;,&lt;br /&gt;
            &#039;every 60 minutes at nighttime&#039;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, timer)&lt;br /&gt;
        domoticz.log(&#039;The rule that triggered the event was: &#039; .. timer.trigger&#039;)&lt;br /&gt;
        if (domoticz.devices(&#039;soil&#039;).moisture &amp;gt; 100) then&lt;br /&gt;
            domoticz.devices(&#039;irrigation&#039;).switchOn().forMin(60)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a script that updates a variable ‘myAmountOfMoney’, and if that variable reaches a certain level you want to be notified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        variables = { &#039;myAmountOfMoney&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, variable)&lt;br /&gt;
        -- variable is the variable that&#039;s triggered&lt;br /&gt;
        if (variable.value &amp;gt; 1000000) then&lt;br /&gt;
            domoticz.notify(&#039;Rich&#039;, &#039;You can stop working now&#039;, domoticz.PRIORITY_HIGH)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Security changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a group holding all the lights in your house, and you want to switch it off as soon as the alarm is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        security = { domoticz.SECURITY_ARMEDAWAY }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, security)&lt;br /&gt;
        domoticz.groups(&#039;All lights&#039;).switchOff()&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-request-and-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous HTTP Request and handling ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some external web service that will tell you what the current energy consumption is and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        httpResponses = { &#039;energyRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
            url = &#039;http://url/to/service&#039;,&lt;br /&gt;
            method = &#039;GET&#039;,&lt;br /&gt;
            callback = &#039;energyRetrieved&#039;&lt;br /&gt;
            })&lt;br /&gt;
        elseif (item.isHTTPResponse) then&lt;br /&gt;
            if (item.ok) then -- statusCode == 2xx&lt;br /&gt;
                local current = item.json.consumption&lt;br /&gt;
                domoticz.devices(&#039;myCurrentUsage&#039;).updateEnergy(current)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous shell command execution &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some local shellcommand to measure the speed of your internet connection and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        shellCommandResponses = { &#039;internetspeedRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;speedtest-cli --json&#039;,      -- just an example&lt;br /&gt;
            callback = &#039;internetspeedRetrieved&#039;,   -- see shellCommandResponses above.&lt;br /&gt;
            timeout = 20,                          -- max execution time in seconds&lt;br /&gt;
        })&lt;br /&gt;
        elseif (item.isShellCommandResponse) then&lt;br /&gt;
            if (item.statusCode==0) then&lt;br /&gt;
                domoticz.devices(&#039;myCurrentdownloadspeed&#039;).updateCustomSensor(item.json.download)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_shell_command_execution|asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System changes ===&lt;br /&gt;
&lt;br /&gt;
Do some initial work when domoticz starts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        system =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;start&#039;,&lt;br /&gt;
            &#039;backupDoneDaily&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, system)&lt;br /&gt;
        domoticz.log(&#039;Domoticz sends &#039; .. system.type, domoticz.LOG_INFO)&lt;br /&gt;
&lt;br /&gt;
        if system.type == &#039;start&#039; then&lt;br /&gt;
            domoticz.device(&#039;initial device&#039;).switchOff().silent&lt;br /&gt;
            domoticz.variables(&#039;special startVar&#039;).set(&#039;domoticz started at &#039; .. domoticz.time.rawDateTime )&lt;br /&gt;
        elseif system.type == &#039;backupDoneDaily&#039; then&lt;br /&gt;
            domoticz.notify(&#039;Domoticz backup&#039;, &#039;Ended. Backupfile &#039; .. system.data.location , domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;combined-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Combined rules ===&lt;br /&gt;
&lt;br /&gt;
Let’s say you have a script that checks the status of a lamp and is triggered by motion detector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
            timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
            devices = { &#039;myDetector&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- the timer was triggered&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOff()&lt;br /&gt;
        elseif (item.isDevice and item.active) then&lt;br /&gt;
            -- it must be the detector&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;at-startup-trigger&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== At startup trigger ===&lt;br /&gt;
&lt;br /&gt;
You can add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section to have your script execute once when Domoticz starts, in addition to any other triggers. This is useful when combined with interval-based rules to avoid waiting for the first interval to pass:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        at_startup = true,&lt;br /&gt;
        timer = { &#039;every hour&#039; },&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        -- Runs immediately when Domoticz starts, then every hour&lt;br /&gt;
        domoticz.devices(&#039;myThermostat&#039;).setPoint(21)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; trigger fires on the first timer tick after Domoticz starts (within 2 minutes of startup). It can be combined with any other trigger types (timer, devices, httpResponses, etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is different from &amp;lt;code&amp;gt;system = { &#039;start&#039; }&amp;lt;/code&amp;gt; which is a system event trigger. &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; is simpler - just add the flag and your existing script will also run at startup without needing to check &amp;lt;code&amp;gt;item.isSystemEvent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-trigger-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &#039;&#039;timer&#039;&#039; trigger rules ==&lt;br /&gt;
&lt;br /&gt;
There are several options for time triggers. It is important to know that Domoticz timer events only trigger once every minute, so one minute is the smallest interval for your timer scripts. However, dzVents gives you many options to have full control over when and how often your timer scripts are called (all times are in 24hr format and all dates in dd/mm): Keywords recognized are “at, between, every, except, in, on, or” ( except supported from version &amp;lt;sup&amp;gt;3.0.16&amp;lt;/sup&amp;gt;, or supported from version &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
At every place you read &amp;lt;astroMoment&amp;gt; you can use one of: sunset, sunrise, solarnoon, midnight &#039;&#039;, sunatsouth &#039;&#039;, civiltwilightstart, civiltwilightend, astronomicaltwilightstart &#039;&#039;, astronomicaltwilightend &#039;&#039;, nauticaltwilightstart * or nauticaltwilightend *.&lt;br /&gt;
&lt;br /&gt;
Full daynames are allowed in dzVents &amp;amp;gt;= 3.1.7&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every minute&#039;,             -- causes the script to be called every minute&lt;br /&gt;
            &#039;every other minute&#039;,       -- minutes: xx:00, xx:02, xx:04, ..., xx:58&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; minutes&#039;,       -- starting from xx:00 triggers every xx minutes&lt;br /&gt;
                                        -- (0 &amp;gt; xx &amp;lt; 60)&lt;br /&gt;
            &#039;every hour&#039;,               -- 00:00, 01:00, ..., 23:00 (24x per 24hrs)&lt;br /&gt;
            &#039;every other hour&#039;,         -- 00:00, 02:00, ..., 22:00 (12x per 24hrs)&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; hours&#039;,         -- starting from 00:00, triggers every xx&lt;br /&gt;
                                        -- hours (0 &amp;gt; xx &amp;lt; 24)&lt;br /&gt;
            &#039;at 13:45&#039;,                 -- specific time&lt;br /&gt;
            &#039;at *:45&#039;,                  -- every 45th minute in the hour&lt;br /&gt;
            &#039;at 15:*&#039;,                  -- every minute between 15:00 and 16:00&lt;br /&gt;
            &#039;at 12:45-21:15&#039;,           -- between 12:45 and 21:15. You cannot use &#039;*&#039;!&lt;br /&gt;
            &#039;at 19:30-08:20&#039;,           -- between 19:30 and 8:20 (next day)&lt;br /&gt;
            &#039;at 13:45 on mon,tue&#039;,      -- at 13:45 only on Mondays and Tuesdays (english)&lt;br /&gt;
            &#039;on mon,tue&#039;,               -- on Mondays and Tuesdays&lt;br /&gt;
            &#039;every hour on Saturday&#039;,   -- you guessed it correctly&lt;br /&gt;
            &#039;at sunset&#039;,                -- uses sunset/sunrise/solarnoon info from Domoticz&lt;br /&gt;
            &#039;at sunrise&#039;,&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt;&#039;,         -- dzVents &amp;gt;= 3.0.16 Uses the times received from Domoticz&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt; on sat,sun&#039;,&lt;br /&gt;
            &#039;xx minutes before &amp;lt;astroMoment&amp;gt;&#039;,  --&lt;br /&gt;
            &#039;xx minutes after &amp;lt;astroMoment&amp;gt;&#039;,   -- Please note that these relative times will cross dates&lt;br /&gt;
            &#039;between aa and bb&#039;         -- aa/bb can be a time stamp like 15:44 (if aa &amp;gt; bb will cross dates)&lt;br /&gt;
                                        -- aa/bb can be sunrise/sunset/solarnoon (&#039;between sunset and sunrise&#039; and &#039;between solarnoon and sunrise&#039; will cross dates)&lt;br /&gt;
                                        -- aa/bb can be &#039;xx minutes before/after &amp;lt;astroMoment&amp;gt;&#039;&lt;br /&gt;
            &#039;at &amp;lt;astroRange&amp;gt;&#039;,          -- between &amp;lt;astroMoment&amp;gt;start and &amp;lt;astroMoment&amp;gt;end&lt;br /&gt;
            &#039;at nighttime&#039;,             -- between sunset and sunrise&lt;br /&gt;
            &#039;at daytime&#039;,               -- between sunrise and sunset&lt;br /&gt;
            &#039;at daytime on mon,tue&#039;,    -- between sunrise and sunset only on Mondays and Tuesdays&lt;br /&gt;
            &#039;in week 1-7,44&#039;            -- in week 1-7 or 44&lt;br /&gt;
            &#039;in week 20-25,33-47&#039;       -- between week 20 and 25 or week 33 and 47&lt;br /&gt;
            &#039;in week -12, 33-&#039;          -- week &amp;lt;= 12 or week &amp;gt;= 33&lt;br /&gt;
            &#039;every odd week&#039;,&lt;br /&gt;
            &#039;every even week&#039;,          -- odd or even numbered weeks&lt;br /&gt;
            &#039;on 23/11&#039;,                 -- on 23rd of November (dd/mm)&lt;br /&gt;
            &#039;on 23/11-25/12&#039;,           -- between 23/11 and 25/12&lt;br /&gt;
            &#039;on 2/3-8/3,7/8,6/10-14/10&#039;,-- between march 2 and 8, on august 7 and between October 6 and 14.&lt;br /&gt;
            &#039;on */2,15/*&#039;,              -- every day in February or&lt;br /&gt;
                                        -- every 15th day of the month&lt;br /&gt;
            &#039;on -3/4,4/7-&#039;,             -- before 3/4 or after 4/7&lt;br /&gt;
&lt;br /&gt;
            &#039;at 12:45-21:15 except at 18:00-18:30&#039;, -- between 12:45 and 21:15 but not between 18:00 and 18:30 ( except supported from 3.0.16 onwards )&lt;br /&gt;
            &#039;at daytime except on sun&#039;,             -- between sunrise and sunset but not on Sundays&lt;br /&gt;
            &#039;at daytime or at 23:12&#039;,               -- between sunrise and sunset and also at 23:12&lt;br /&gt;
&lt;br /&gt;
            -- or if you want to go really wild and combine them:&lt;br /&gt;
                &#039;at nighttime at 21:32-05:44 every 5 minutes on sat, sun except at 04:00&#039;, -- except supported from 3.0.16 onwards&lt;br /&gt;
                &#039;every 10 minutes between 20 minutes before sunset and 30 minutes after sunrise on mon,fri,tue on 20/5-18/8&#039;&lt;br /&gt;
&lt;br /&gt;
            -- or just do it yourself:&lt;br /&gt;
                function(domoticz)&lt;br /&gt;
                -- you can use domoticz.time to get the current time&lt;br /&gt;
                -- note that this function is called every minute!&lt;br /&gt;
                -- custom code that either returns true or false&lt;br /&gt;
                ...&lt;br /&gt;
            end&lt;br /&gt;
        },&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The timer events are triggered every minute. If such a trigger occurs, dzVents will scan all timer-based events and will evaluate the timer rules. So, if you have a rule &amp;lt;code&amp;gt;on mon&amp;lt;/code&amp;gt; then the script will be executed &#039;&#039;every minute&#039;&#039; but only on Monday.&lt;br /&gt;
&lt;br /&gt;
Be mindful of the logic if using multiple types of timer triggers. It may not make sense to combine a trigger for a specific or instantaneous time with a trigger for a span or sequence of times (like ‘at sunset’ with ‘every 6 minutes’) in the same construct. Similarly, &amp;lt;code&amp;gt;&#039;between aa and bb&#039;&amp;lt;/code&amp;gt; only makes sense with instantaneous times for &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One important note: if Domoticz, for whatever reason, skips a timer event then you may miss the trigger! Therefore, you should build in some fail-safe checks or some redundancy if you have critical time-based stuff to control. There is nothing dzVents can do about it&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you want your timer script to also run at Domoticz startup (instead of waiting for the first timer match), add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section. See [[#at-startup-trigger|At startup trigger]].&lt;br /&gt;
&lt;br /&gt;
Another important issue: the way it is implemented right now, the &amp;lt;code&amp;gt;every xx minutes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every xx hours&amp;lt;/code&amp;gt; is a bit limited. The interval resets at every *:00 (for minutes) or 00:* for hours. You need an interval that is an integer divider of 60 (or 24 for the hours). So you can do every 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 and 30 minutes only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-domoticz-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= The domoticz object =&lt;br /&gt;
&lt;br /&gt;
The domoticz object passed as the first parameter to the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function contains everything you need to interact with your domotica system. It provides all information made available by the domoticz event system about your custom- and system events, devices, scenes, groups, hardware modules and variables and has methods needed to inspect and manipulate them. Getting this information is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;domoticz.time.isDayTime&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).temperature&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).lastUpdate.minutesAgo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The domoticz object consists of a logically arranges structure. It harbors all methods to manipulate Domoticz. dzVents will take care to notify Domoticz with all your intended changes and actions. Earlier you had to fill a commandArray with obscure commands. That’s no longer the case.&lt;br /&gt;
&lt;br /&gt;
Some more examples: &amp;lt;code&amp;gt;domoticz.devices(123).switchOn().forMin(5).afterSec(10)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My dummy sensor&#039;).updateBarometer(1034, domoticz.BARO_THUNDERSTORM)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One tip before you get started: &#039;&#039;&#039;Make sure that all your devices have unique names. dzVents will give you warnings in the logs if device names are not unique.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-object-api-application-programming-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Domoticz object API (Application Programming Interface) ==&lt;br /&gt;
&lt;br /&gt;
The domoticz object holds all information about your Domoticz system. It has global attributes and methods to query and manipulate your system. It also has a collection of &#039;&#039;&#039;devices&#039;&#039;&#039;, &#039;&#039;&#039;variables&#039;&#039;&#039; (user variables in Domoticz), &#039;&#039;&#039;scenes&#039;&#039;&#039;, &#039;&#039;&#039;groups&#039;&#039;&#039;, &#039;&#039;&#039;hardware&#039;&#039;&#039;. Each of these collections has four iterator functions: &amp;lt;code&amp;gt;find(), forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; to make searching for devices easier. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Domoticz attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a device by idx or name: &amp;lt;code&amp;gt;domoticz.devices(123)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My switch&#039;)&amp;lt;/code&amp;gt;. For the device API see [[#Device_object_API|Device object API]]. To iterate over all devices do: &amp;lt;code&amp;gt;domoticz.devices().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.devices()) do .. end&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;dump([osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all domoticz.settings attributes to the Domoticz log. This ignores the log level setting.&lt;br /&gt;
* &#039;&#039;&#039;email(subject, message, mailTo [, delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send email. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;emitEvent(name,[extra data ])&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a customEvent. If you just pass a name then Domoticz will execute the script(s) that subscribed to the named customEvent after your script has finished. You can optionally pass extra information as a string or table. A table will be automatically converted into a json string and converted back to a table in the subscribed script(s). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;executeShellCommand(command/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a command. If you just pass a command then Domoticz will execute the command after your script has finished but you will not get notified. If you pass options table with a callback then you have the possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_shell_command_execution|asynchronous shell commands]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &#039;&#039;&#039;Note Make sure that when you use this function on a Windows system and use one or more of the special chars &amp;amp;amp;&amp;amp;lt;&amp;amp;gt;()@^| outside double quotes, you will have to escape these with a ^ char &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;groups(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a group by name or idx. Each group has the same interface as a device. To iterate over all groups do: &amp;lt;code&amp;gt;domoticz.groups().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.groups()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Group|Groups]].&lt;br /&gt;
* &#039;&#039;&#039;hardwareInfo(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.6&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning hardwareInfo of a hardware module by name or idx. The return of the function is a table with attributes name, type, typeValue, deviceNames (table with names of all active devices defined on this hardware) and deviceIds (table with idx of all active devices defined on this hardware)&lt;br /&gt;
* &#039;&#039;&#039;hardware(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning a hardware module by name or idx. Each hardware has an interface comparable to group. To iterate over all hardware do: &amp;lt;code&amp;gt;domoticz.hardware().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.hardware()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Hardware|Hardware]].&lt;br /&gt;
* &#039;&#039;&#039;helpers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Collection of shared helper functions available to all your dzVents scripts. See [[#Shared_helper_functions|Shared helper functions]].&lt;br /&gt;
* &#039;&#039;&#039;log(message, [level])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a log entry in the Domoticz log but respects the log minimum level settings. You can provide the loglevel: &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_STATUS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_ERROR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_DEBUG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.LOG_FORCE&amp;lt;/code&amp;gt;. In Domoticz settings you can set the default log level for dzVents.&lt;br /&gt;
* &#039;&#039;&#039;moduleLabel&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; Module (script) name without extension.&lt;br /&gt;
* &#039;&#039;&#039;notify(subject, message [,priority][,sound][,extra][,subsystem][,delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send a notification (like Prowl). Priority can be like &amp;lt;code&amp;gt;domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt; is notification subsystem specific. For NSS_FIREBASE you can use this field to specify the target mobile (‘midx_1’, midx_2, etc..) or specify &amp;lt;code&amp;gt;device.id&amp;lt;/code&amp;gt; so the receiver knows which device triggered the notification. For sound see [[#Constants|list of dzVents Constants]] for the SOUND constants below. &amp;lt;code&amp;gt;subsystem&amp;lt;/code&amp;gt; defaults to all subsystems but can be one subsystem or a table containing one or more notification subsystems. See [[#Constants|list of dzVents Constants]] for &amp;lt;code&amp;gt;domoticz.NSS_subsystem&amp;lt;/code&amp;gt; types. Delay is delay in seconds&lt;br /&gt;
* &#039;&#039;&#039;openURL(url/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ a URL. If you just pass a url then Domoticz will execute the url after your script has finished but you will not get notified. If you pass a table with options then you have to possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_HTTP_requests|asynchronous http requests]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;scenes(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a scene by name or id. Each scene has the same interface as a device. See [[#Device_object_API|Device object API]]. To iterate over all scenes do: &amp;lt;code&amp;gt;domoticz.scenes().forEach(..)&amp;lt;/code&amp;gt;. See [[#looping-through-the-collections-iterators|Looping through the collections: iterators]]. (#Looping_through_the_collections:_iterators). Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.scenes()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Scene|Scenes]].&lt;br /&gt;
* &#039;&#039;&#039;security&#039;&#039;&#039;: Holds the state of the security system e.g. &amp;lt;code&amp;gt;Armed Home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Armed Away&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;sendCommand(command, value[, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: Generic (low-level)command method (adds it to the commandArray) to the list of commands that are being sent back to domoticz. Optional parm delay is delay in seconds &#039;&#039;There is likely no need to use this directly. Use any of the device methods instead (see below).&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;settings&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;domoticzVersion&#039;&#039;&#039;: domoticz version string.&lt;br /&gt;
** &#039;&#039;&#039;dzVentsVersion&#039;&#039;&#039;: dzVents version string.&lt;br /&gt;
** &#039;&#039;&#039;location&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;latitude&#039;&#039;&#039;: domoticz settings locations latitude.&lt;br /&gt;
*** &#039;&#039;&#039;longitude&#039;&#039;&#039;: domoticz settings locations longitude.&lt;br /&gt;
*** &#039;&#039;&#039;name&#039;&#039;&#039;: domoticz settings location Name.&lt;br /&gt;
** &#039;&#039;&#039;secureServer&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; true when domoticz can be accessed via https.&lt;br /&gt;
** &#039;&#039;&#039;serverPort&#039;&#039;&#039;: webserver listening port used by dzVents to access domoticz API.&lt;br /&gt;
** &#039;&#039;&#039;url&#039;&#039;&#039;: internal url to access the API service.&lt;br /&gt;
** &#039;&#039;&#039;webRoot&#039;&#039;&#039;: &amp;lt;code&amp;gt;webroot&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
** &#039;&#039;&#039;wwwBind&#039;&#039;&#039;: &amp;lt;code&amp;gt;wwwbind&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.4&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
* &#039;&#039;&#039;sms(message [, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends an sms if it is configured in Domoticz. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;snapshot(cameraID(s) or camera Name(s)&amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt;,subject)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends email with a camera snapshots if email is configured and set for attachments in Domoticz. Send 1 or multiple camerIDs -names in ; separated string or array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    dz.snapshot()                  -- defaults to id = 1, subject domoticz&lt;br /&gt;
    dz.snapshot(1,&#039;dz&#039;)            -- subject dz&lt;br /&gt;
    dz.snapshot(&#039;1;2;3&#039;)           -- ; separated string&lt;br /&gt;
    dz.snapshot({1,4,7})           -- table&lt;br /&gt;
    dz.snapshot(&#039;test;test2&#039;)      -- ; separated string&lt;br /&gt;
    dz.snapshot({&#039;test&#039;, &#039;test2&#039;}) -- table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTimerPlan(idx)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch the active timer plan to the plan with the given database ID. &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; must be a positive integer matching an existing timer plan ID (as shown in &#039;&#039;&#039;Settings → Timer Plans&#039;&#039;&#039;). Invalid or non-existent plan IDs are silently ignored. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;startTime&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;. Returns the startup time of the Domoticz service.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;systemUptime&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds the system is up.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Current system time. Additional to Time object attributes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if the device was updated today&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will rise.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will set.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will start.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will end.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerHTTPResponse([httpResponse], [delay], [message])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a callback by sending a logmessage. httpResponse defaults to scriptname, delay defaults to 0 (immediate), message defaults to httpResponse. Left in for backward compatibility only. You can use emitEvent / customEvents now.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerIFTTT(makerName [,sValue1, sValue2, sValue3])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ an IFTTT maker event. makerName is required, 0-3 sValue’s are optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;utils&#039;&#039;&#039;: . A subset of handy utilities: Note that these functions must be preceded by domoticz.utils. If you use more then a few declare something like local _u = domoticz.utils at the beginning of your script and use _u.functionName in the remainder. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    _u = domoticz.utils&lt;br /&gt;
    print(_u.rightPad(&#039;test&#039;,10) .. &#039;|||&#039;) -- =&amp;gt; test       |||&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;_.lodashFunctions&#039;&#039;&#039;: This is an entire collection with very handy Luafunctions. Read more about [[#lodash_for_Lua|lodash]]. E.g.: &amp;lt;code&amp;gt;{.lua}   domoticz.utils._.size({&#039;abc&#039;, &#039;def&#039;}))` Returns 2.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;cameraExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid camera &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or cameraID and return ID when entered with valid cameraName or false when not a camera, cameraID or cameraName of an existing camera&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid device &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or deviceID and returns ID when entered with valid deviceName or false when not a device, deviceID or deviceName of an existing (and active) device. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local dz = domoticz&lt;br /&gt;
local _u = dz.utils&lt;br /&gt;
if _u.deviceExists(&#039;myDevice&#039;) then&lt;br /&gt;
    dz.devices(&#039;myDevice&#039;).switchOn()&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device myDevice does not exist!&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local myName = _u.deviceExists(123)&lt;br /&gt;
if myName then&lt;br /&gt;
    dz.log(&#039;Device 123 is &#039; .. myName, dz.LOG_INFO)&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device 123 does not exist&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpTable(table,[levelIndicator],[osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;))&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: print table structure and contents to log&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fileExists(path)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file (with full path) exists.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Decode a base64 string&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromJSON(json, fallback, deSerialize &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Turns a json string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromJSON(&#039;{ &amp;amp;quot;a&amp;amp;quot;: 1 }&#039;)&amp;lt;/code&amp;gt;. Followed by: &amp;lt;code&amp;gt;print( t.a )&amp;lt;/code&amp;gt; will print 1. Optional 2nd param fallback will be returned if json is nil or invalid. Optional 3rd param deSerialize (boolean) determines if the JSON should be deserialized before converting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromXML(xml, fallback )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Turns a xml string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromXML(&#039;&amp;amp;lt;testtag&amp;amp;gt;What a nice feature!&amp;amp;lt;/testtag&amp;amp;gt;&#039;) Followed by:&amp;lt;/code&amp;gt;print( t.texttag)` will print What a nice feature! Optional 2nd param fallback will be returned if xml is nil or invalid.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fuzzyLookup([string|array of strings], parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.14&amp;lt;/sup&amp;gt;. Search fuzzy matching string in parm. If parm is string it returns a number (lower is better match). If parm is array of strings it returns the best matching string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;groupExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid group &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or groupID and return ID when entered with valid groupName or false when not a group, groupID or groupName of an existing group&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; returns name when entered with valid hardwareID or ID when entered with valid hardwareName or false when not a hardwareID or hardwareName of an existing (and active )hardware module&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inTable(table, searchString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;&amp;amp;quot;key&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as a key, &amp;lt;code&amp;gt;&amp;amp;quot;value&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as value and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isJSON(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘application/json’ or string is enclosed in {} and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isXML(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘text/xml’ or ‘application/xml’ or string is enclosed in &amp;amp;lt;&amp;amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leftPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;centerPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Center string by preceding and succeeding with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;numDecimals(number [, integer [, decimals ]])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Format number to float representation. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        domoticz.utils.numDecimals(12.23, 4, 4) -- =&amp;gt; 12.2300,&lt;br /&gt;
        domoticz.utils.numDecimals (12.23,1,1) -- =&amp;gt; 12.2,&lt;br /&gt;
        domoticz.utils.leadingZeros(domoticz.utils.numDecimals (12.23,4,4),9) -- =&amp;gt; 0012.2300&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osCommand(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt; Execute an OS command and return result and returncode. Note: For long running scripts &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; should be used, See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osExecute(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Execute an OS command (no return). Note: For long running scripts &amp;lt;code&amp;gt;executeShellCommand()&amp;lt;/code&amp;gt; should be used. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rightPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Succeed string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;round(number, [decimalPlaces])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Helper function to round numbers. Default decimalPlaces is 0.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sceneExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with valid scene &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or sceneID and return ID when entered with valid sceneName or false when not a scene, sceneID or sceneName of an existing scene&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setLogMarker([marker])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: set logMarker to ‘marker’. Defaults to scriptname. Can be used to change logMarker based on flow in script&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;splitLine(string , splitOnWord ) &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line. Return is a table with line-segments.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringSplit(string [,separator ] [,convertNumber ][,convertNil ]&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line in separate words. Default separator is space. Return is a table with separated words. Default convertNumber is false when set to true it will convert strings to number where possible. Word is ignored when nil, unless convertNil is set; in that case word will be set to the convertNil value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringToSeconds(str)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Returns number of seconds between now and str. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.utils.stringToSeconds(&#039;09:00&#039;)                 -- number of seconds between now and 09:00 hr.&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on fri&#039;)       -- number of seconds between now and Friday at 08:53:30&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on sat, sun&#039;)  -- number of seconds between now and Saturday or Sunday at 08:53:30 ;whatever comes first&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: ) Encode a string to base64&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toCelsius(f, relative)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts temperature from Fahrenheit to Celsius along the temperature scale or when relative == true it uses the fact that 1F = 0.56C. So &amp;lt;code&amp;gt;toCelsius(5, true)&amp;lt;/code&amp;gt; returns 5F*(1/1.8) = 2.78C.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toJSON(luaTable)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a json string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toXML(luaTable, [header])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a xml string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlDecode(s)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple deCoder to convert a string with escaped chars (%20, %3A and the likes) to human readable format.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlEncode(s, [strSub])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple url encoder for string so you can use them in &amp;lt;code&amp;gt;openURL()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;strSub&amp;lt;/code&amp;gt; is optional and defaults to + but you can also pass %20 if you like/need.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variableExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid variable &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or variableID and return ID when entered with valid variableName or false when not a variable, variableID or variableName of an existing variable&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leadingZeros(number, length)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede number with given zeros to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variables(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a variable by it’s name or idx. See [Variable object API] (#Variable_object_API_.28user_variables.29) for the attributes. To iterate over all variables do: &amp;lt;code&amp;gt;domoticz.variables().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. &#039;&#039;&#039;Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.variables()) do .. end&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-collections-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Looping through the collections: iterators ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these collections (tables): devices, scenes, groups, variables, changedDevices and changedVariables. You cannot use the &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; functions. Therefore dzVents has four iterator methods:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Returns the item in the collection for which &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; returns true. When no item is found &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; returns nil.&lt;br /&gt;
# &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Executes function once per array element. The function receives the item in the collection (device or variable). If the function returns &#039;&#039;false&#039;&#039;, the loop is aborted.&lt;br /&gt;
# &#039;&#039;&#039;filter(function / table)&#039;&#039;&#039;: returns items in the collection for which the function returns true. You can also provide a table with names and/or ids.&lt;br /&gt;
# &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the collection and do some calculation with it. You call it with the function and the initial value. Each iteration the function is called with the accumulator and the item in the collection. The function does something with the accumulator and returns a new value for it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Examples: ====&lt;br /&gt;
&lt;br /&gt;
find():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myDevice = domoticz.devices().find(function(device)&lt;br /&gt;
        return device.name == &#039;myDevice&#039;&lt;br /&gt;
    end)&lt;br /&gt;
    domoticz.log(&#039;Id: &#039; .. myDevice.id)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
forEach():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().forEach(function(device)&lt;br /&gt;
        if (device.batteryLevel &amp;lt; 20) then&lt;br /&gt;
        -- do something&lt;br /&gt;
        end&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
filter():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local deadDevices = domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end)&lt;br /&gt;
    deadDevices.forEach(function(zombie)&lt;br /&gt;
        -- do something&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local livingLights = {&lt;br /&gt;
        &#039;window&#039;,&lt;br /&gt;
        &#039;couch&#039;,&lt;br /&gt;
        33, -- kitchen light id&lt;br /&gt;
    }&lt;br /&gt;
    local lights = domoticz.devices().filter(livingLights)&lt;br /&gt;
    lights.forEach(function(light)&lt;br /&gt;
        -- do something&lt;br /&gt;
        light.switchOn()&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can chain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end).forEach(function(zombie)&lt;br /&gt;
        -- do something with the zombie&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Using a reducer to count all devices that are switched on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local count = domoticz.devices().reduce(function(acc, device)&lt;br /&gt;
        if (device.state == &#039;On&#039;) then&lt;br /&gt;
            acc = acc + 1 -- increase the accumulator&lt;br /&gt;
        end&lt;br /&gt;
        return acc -- always return the accumulator&lt;br /&gt;
    end, 0) -- 0 is the initial value for the accumulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;constants&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these constants available for use in your code e.g. &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT: you have to prefix these constants with the name of your domoticz object. Example: &amp;lt;code&amp;gt;domoticz.ALERTLEVEL_RED&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_ORANGE, ALERTLEVEL_RED, ALERTLEVEL_YELLOW&#039;&#039;&#039;: for updating text sensors.&lt;br /&gt;
* &#039;&#039;&#039;BASETYPE_CUSTOM_EVENT &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;,BASETYPE_DEVICE, BASETYPE_SCENE, BASETYPE_GROUP, BASETYPE_HARDWARE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;BASETYPE_VARIABLE, BASETYPE_SECURITY, BASETYPE_TIMER, BASETYPE_HTTP_RESPONSE, BASETYPE_SYSTEM&#039;&#039;&#039;&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;: indicators for the various object types that are passed as the second parameter to the execute function. E.g. you can check if an object is a device object: &amp;lt;code&amp;gt;Lua  if (item.baseType == domoticz.BASETYPE_DEVICE) then ... end&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;BARO_CLOUDY, BARO_CLOUDY_RAIN, BARO_STABLE, BARO_SUNNY, BARO_THUNDERSTORM, BARO_NOINFO, BARO_UNSTABLE, BARO_COMPUTE&#039;&#039;&#039; : for updating barometric values.&lt;br /&gt;
* &#039;&#039;&#039;EVENT_TYPE_DEVICE, EVENT_TYPE_VARIABLE, EVENT_TYPE_CUSTOM&#039;&#039;&#039;, &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_SECURITY, EVENT_TYPE_HTTPRESPONSE, EVENT_TYPE_SYSTEM,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_TIMER&#039;&#039;&#039;: triggerInfo types passed to the execute function in your scripts.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_TEMPORARY_OVERRIDE, EVOHOME_MODE_PERMANENT_OVERRIDE, EVOHOME_MODE_FOLLOW_SCHEDULE&#039;&#039;&#039;: mode for EvoHome system.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_AUTOWITHRESET, EVOHOME_MODE_AUTOWITHECO, EVOHOME_MODE_AWAY, EVOHOME_MODE_DAYOFF, EVOHOME_MODE_CUSTOM, EVOHOME_MODE_HEATINGOFF&#039;&#039;&#039; : mode for EvoHome controller&lt;br /&gt;
* &#039;&#039;&#039;HUM_COMFORTABLE, HUM_DRY, HUM_NORMAL, HUM_WET, HUM_COMPUTE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;: constant for humidity status.&lt;br /&gt;
* &#039;&#039;&#039;INTEGER, FLOAT, STRING, DATE, TIME&#039;&#039;&#039;: variable types.&lt;br /&gt;
* \**LOG_INFO, LOG_STATUS, LOG_ERROR, LOG_DEBUG, LOG_FORCE: for logging messages. LOG_FORCE will always be displayed.&lt;br /&gt;
* &#039;&#039;&#039;NSS_CLICKATELL&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_FIREBASE, NSS_FIREBASE_CLOUD_MESSAGING, NSS_GOOGLE_DEVICES,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; &amp;lt;sup&amp;gt;Only with installed casting plugin&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER, NSS_TELEGRAM, NSS_GOOGLE_CLOUD_MESSAGING&#039;&#039;&#039; &amp;lt;sup&amp;gt;deprecated by Google and replaced by firebase&amp;lt;/sup&amp;gt;: for notification subsystem&lt;br /&gt;
* &#039;&#039;&#039;PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&#039;&#039;&#039;: for notification priority.&lt;br /&gt;
* &#039;&#039;&#039;SECURITY_ARMEDAWAY, SECURITY_ARMEDHOME, SECURITY_DISARMED&#039;&#039;&#039;: for security state.&lt;br /&gt;
* &#039;&#039;&#039;STATE_IDLE, STATE_COOLING, STATE_HEATING&#039;&#039;&#039;: for thermostat operating state.&lt;br /&gt;
* &#039;&#039;&#039;SOUND_ALIEN , SOUND_BIKE, SOUND_BUGLE, SOUND_CASH_REGISTER, SOUND_CLASSICAL, SOUND_CLIMB , SOUND_COSMIC, SOUND_DEFAULT, SOUND_ECHO, SOUND_FALLING, SOUND_GAMELAN, SOUND_INCOMING, SOUND_INTERMISSION, SOUND_MAGIC, SOUND_MECHANICAL, SOUND_NONE, SOUND_PERSISTENT, SOUND_PIANOBAR , SOUND_SIREN, SOUND_SPACEALARM, SOUND_TUGBOAT, SOUND_UPDOWN&#039;&#039;&#039;: for notification sounds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Custom event API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a customEvent in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;notification&#039;&#039; object. The object.type = customEvent (isCustomEvent: true) and object.data contains the passed data to this script. object.trigger is the name of the customEvent that triggered the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-object-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device object API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by switching a device in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;device&#039;&#039; object. Also, each device in Domoticz can be found in the &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; collection (see above). The device object has a set of fixed attributes like &#039;&#039;name&#039;&#039; and &#039;&#039;idx&#039;&#039;. Many devices, however, have different attributes and methods depending on their (hardware)type, subtype and other device specific identifiers. It is possible that you will get an error if you call a method on a device that doesn’t support it, so please check the device properties for your specific hardware to see which are supported (can also be done in your script code!).&lt;br /&gt;
&lt;br /&gt;
dzVents recognizes most of the different device types in Domoticz and creates the proper attributes and methods. It is possible that your device type has attributes that are not recognized; if that’s the case, please create a ticket in the Domoticz [https://github.com/domoticz/domoticz/issues issue tracker on GitHub], and an adapter for that device will be added.&lt;br /&gt;
&lt;br /&gt;
If for some reason you miss a specific attribute or data for a device, then likely the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute will have that information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-all-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device attributes and methods for all devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Same as bState.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;baseType&#039;&#039;&#039; &#039;&#039;String&#039;&#039;. ‘camera’, ‘device’, ‘group’, ‘scene’, ‘hardware’, ‘uservariable’ or ‘security’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;batteryLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-100.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;bState&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Better to use active.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True if the device was updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: This does not necessarily means the device state or value changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;customImage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. When customImage is used for the device-icon this will be the icon-number. It will be 0 if the icon was not changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;description&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Description of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceId&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Another identifier of devices in Domoticz. dzVents uses the id(x) attribute. See device list in Domoticz’ settings table.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceSubType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dump()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all attributes except functions and complete time overview to the Domoticz log. This ignores the log level setting. Use fullDump to include everything.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpSelection([{‘attributes’} ‘functions’ ‘tables’])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.5&amp;lt;/sup&amp;gt; Dump attributes, function-names or table-names to the Domoticz log. This ignores the log level setting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fullDump()&#039;&#039;&#039; &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt; Dump all attributes including functions and the complete time overview to the Domoticz log. This ignores the log level setting. Most of the time dump() shows everything what is needed to debug.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareId&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;icon&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the icon in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the device. You can find the index in the device list (idx column) in Domoticz settings. It’s not truly an index but is unique enough for dzVents to be treated as an id.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;idx&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as id: index of the device&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inActive&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; true if active is false and vice versa. If active is nil inActive is also nil&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Time when the device was updated. **Note: The lastUpdate for devices that triggered the script at hand is in fact the previousUpdate time. The real lastUpdate time for these “script triggering” devices is the current time.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;nValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Numerical representation of the state.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protected&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True when device / scene / group is protected. False otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options] !! **Note: domoticz protects against GUI and API access only. switchOn / switchOff type Blockly / Lua / dzVents commands are not influenced (because they are executed as admin user)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rawData&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;: All values are &#039;&#039;String&#039;&#039; types and hold the raw data received from Domoticz.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current devicename to new devicename Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setDescription(description)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic method to update the description for all devices, groups and scenes. E.g.: device.setDescription(device.description .. ‘/nChanged by’.. item.trigger .. ‘at’ .. domoticz.time.raw). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setIcon(iconNumber)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. method to update the icon for devices. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setState(newState)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method for switch-like devices. E.g.: device.setState(‘On’). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;resumeTimerPlan()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Finds the most recent timer that should have fired today (before now) for this device, scene, or group and executes it immediately. Useful for restoring the correct state after a Domoticz restart or power cut. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. ```lua – Replay last timer for a device domoticz.devices(‘My Light’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a scene domoticz.scenes(‘Evening Scene’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a group domoticz.groups(‘All Lights’).resumeTimerPlan() ```&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setValues(nValue,[ sValue1, sValue2, …])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic alternative method to update device nValue, sValues. Uses domoticz JSON API to force subsequent pushes like influxdb and MQTT. nValue required but when set to nil it defaults to current nValue. sValue parms are optional and can be many. &amp;lt;sup&amp;gt;3.0.8&amp;lt;/sup&amp;gt; If one of sValue parms is ‘parsetrigger’, subsequent eventscripts will be triggered.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For switches, holds the state like ‘On’ or ‘Off’. For dimmers that are on, it is also ‘On’ but there is a level attribute holding the dimming level. &#039;&#039;&#039;For selector switches&#039;&#039;&#039; (Dummy switch) the state holds the &#039;&#039;name&#039;&#039; of the currently selected level. The corresponding numeric level of this state can be found in the &#039;&#039;&#039;rawData&#039;&#039;&#039; attribute: &amp;lt;code&amp;gt;device.rawData[1]&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;signalLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-12&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI(Switches tab). E.g. ‘On/Off’, ‘Door Contact’, ‘Motion Sensor’ or ‘Blinds’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sValue&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the sValue (string Value) of a device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;timedOut&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true when the device couldn’t be reached.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;unit&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Device unit. See device list in Domoticz’ settings for the unit.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;update(&amp;amp;lt; params &amp;amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method. Accepts any number of parameters that will be sent back to Domoticz. There is no need to pass the device.id here. It will be passed for you. Example to update a temperature: &amp;lt;code&amp;gt;device.update(0,12)&amp;lt;/code&amp;gt;. This will eventually result in a commandArray entry &amp;lt;code&amp;gt;[&#039;UpdateDevice&#039;]=&#039;&amp;amp;lt;idx&amp;amp;gt;|0|12&#039;&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;updateQuiet(nValue, sValue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Uses the JSON/API to send nValue and/or sValue to domoticz (at least one should be supplied). Will update the device status in the GUI and trigger events but will not execute the action on the device. Only useful when the status in the GUI is not in line with the actual status. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-specific-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device attributes and methods for specific devices ===&lt;br /&gt;
&lt;br /&gt;
Note that if you do not find your specific device type here you can always inspect what is in the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute. Please let us know that it is missing so we can write an adapter for it (or you can write your own and submit it). Calling &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; will dump all attributes and values for myDevice to the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;air-quality&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Air quality ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;co2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. PPM&lt;br /&gt;
* &#039;&#039;&#039;quality&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Air quality string.&lt;br /&gt;
* &#039;&#039;&#039;updateAirQuality(ppm)&#039;&#039;&#039;: Pass the CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; concentration. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alert-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Alert sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Color of the alert. See domoticz color constants for possible values.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateAlertSensor(level, text)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-1-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 1-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Current in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-3-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 3-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current1&#039;&#039;&#039;, &#039;&#039;&#039;current2&#039;&#039;&#039;, &#039;&#039;&#039;current3&#039;&#039;&#039; : &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current1, current2, current3)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Currents in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. Barometric pressure.&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateBarometer(pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update barometric pressure. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-managed-counter-counter-incremental&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Counter, managed Counter, counter incremental ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Today’s counter value.&lt;br /&gt;
* &#039;&#039;&#039;updateCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &#039;&#039;&#039;Overwrite current value for managed and standard counters; increment for incremental counters !!&#039;&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateHistory( date, sValues )&#039;&#039;&#039;: &#039;&#039;Strings&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt; &#039;&#039;function&#039;&#039; Managed counter only! Used to write values to short or long term storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local mCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22&#039;, &#039;10;1777193&#039;) -- Write to long term storage (meter_calendar table)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22 10:05:02&#039;, &#039;10;1777193&#039;) -- Write to short term storage (meter table)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;incrementCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (counter incremental) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. To update with a complete new value you will have to do some calculation and take the counter divider into account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local newValue = value&lt;br /&gt;
    local iCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    local counterDivider = x -- x is depending on the counter divider set for the device&lt;br /&gt;
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;valueQuantity&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For counters.&lt;br /&gt;
* &#039;&#039;&#039;valueUnits&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Custom sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sensorType&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;sensorUnit&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;sensorValue&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; &#039;&#039;Number&#039;&#039; where applicable; else &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;updateCustomSensor(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;distance-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Distance sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateDistance(distance)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Electric usage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage. (please use actualWatt)&lt;br /&gt;
* &#039;&#039;&#039;updateEnergy(energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. In Watt. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-controller&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (controller) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;setMode(mode, dparm, action, ooc )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set mode for controller. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_AUTOWITHRESET, domoticz.EVOHOME_MODE_AUTOWITHECO, domoticz.EVOHOME_MODE_AWAY, domoticz.EVOHOME_MODE_DAYOFF, domoticz.EVOHOME_MODE_CUSTOM or domoticz.EVOHOME_MODE_HEATINGOFF. dParm &amp;lt;optional&amp;gt; can be a future time string (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;), a future time object, a future time as number of seconds since epoch or a number representing a positive offset in minutes (max 1 year). action &amp;lt;optional&amp;gt; (1 = run on action script, 0 = disable), ooc &amp;lt;optional&amp;gt; (1 = only trigger the event &amp;amp;amp; log on change, 0 = always trigger &amp;amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-hotwater&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (hotWater) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a.&lt;br /&gt;
* &#039;&#039;&#039;setHotWater(state, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set HotWater Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE You can provide an until date (in ISO 8601 format for domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-relay&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (relay) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;number&#039;&#039; (level percentage)&lt;br /&gt;
* &#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; (true when state is not equal to ‘Off’, false otherwise)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-zones&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (zones) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; .&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a .&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update set point. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE. You can provide an until date (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;). When leaving out untilDate for mode domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE the untilDate will be the next scheduled zone-update time/date. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gas ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;updateGas(usage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Usage in &#039;&#039;&#039;dm&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&#039;&#039;&#039; (liters). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current group-name to new group-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleGroup()&#039;&#039;&#039;: Toggles the state of a group. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hardware-3.0.7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hardware &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;isHardware&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;isPythonPlugin&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: : &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;typeValue&#039;&#039;&#039;: : &#039;&#039;Number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;humidity-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Humidity sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;updateHumidity(humidity, status)&#039;&#039;&#039;: Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kodi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Kodi ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;kodiExecuteAddOn(addonId)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. 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;
* &#039;&#039;&#039;kodiPause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlay()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play an item from the Kodi’s Favorites list optionally starting at &#039;&#039;position&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayPlaylist(name, [position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play a music or video Smart Playlist with &#039;&#039;name&#039;&#039; optionally starting at &#039;&#039;position&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiSetVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the volume for a Kodi device, 0 &amp;amp;lt;= level &amp;amp;lt;= 100.&lt;br /&gt;
* &#039;&#039;&#039;kodiStop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiSwitchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-electricity-instant-and-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== kWh, Electricity (instant and counter) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual usage in Watt.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateElectricity(power, energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WhToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage of the day. Note the unit is Wh and not kWh!&lt;br /&gt;
* &#039;&#039;&#039;WhTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual reading in Watt. Please use actualWatt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;leaf-wetness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Leaf wetness ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wetness&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Wetness value&lt;br /&gt;
* &#039;&#039;&#039;updateWetness(wetness)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logitech-media-server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Logitech Media Server ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will pause the device if it was streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;play()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. If the device was off, it will turn on and start streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the favorites playlist. &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; is optional (0 = default). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playlistID&#039;&#039;&#039;: &#039;&#039;Nubmer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;setVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the volume (0 &amp;amp;lt;= level &amp;amp;lt;= 100). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;startPlaylist(name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the playlist by its &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will stop the device (only effective if the device is streaming). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeUp()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume up with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeDown()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume down with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lux-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lux sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lux&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Lux level for light sensors.&lt;br /&gt;
* &#039;&#039;&#039;updateLux(lux)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;onkyo-receiver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Onkyo receiver ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;onkyoEISCPCommand(command)&#039;&#039;&#039;. &#039;&#039;Function&#039;&#039;. Sends an EISP command to the Onkyo receiver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;opentherm-gateway&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenTherm gateway ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-smart-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== P1 Smart meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usage1&#039;&#039;&#039;, &#039;&#039;&#039;usage2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;return1&#039;&#039;&#039;, &#039;&#039;&#039;return2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateP1(usage1, usage2, return1, return2, cons, prod)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Updates the device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usageDelivered&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;percentage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Percentage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;percentage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePercentage(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;philips-hue-light&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Philips Hue Light ====&lt;br /&gt;
&lt;br /&gt;
See switch below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pressure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Pressure ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pressure&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePressure(pressure)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Rain meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;rain&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; (please note that this does return the rain total for today)&lt;br /&gt;
* &#039;&#039;&#039;rainRate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateRain(rate, counter)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (rate in mm * 100 per hour, counter is total in mm) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rgbww-lighting-limitlessapplamp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== RGBW(W) / Lighting Limitless/Applamp ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;decreaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;getColor()&#039;&#039;&#039;; &#039;&#039;Function&#039;&#039;. Returns table with color attributes or nil when color field of device is not set.&lt;br /&gt;
* &#039;&#039;&#039;increaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setColor(r, g, b, br, cw, ww, m, t)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required, others optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. Meaning and limits of parms can be found [https://wiki.domoticz.com/Domoticz_API/JSON_URL&#039;s#Set_a_light_to_a_certain_color_or_color_temperature here].&lt;br /&gt;
* &#039;&#039;&#039;setColorBrightness()&#039;&#039;&#039;: same as setColor&lt;br /&gt;
* &#039;&#039;&#039;setDiscoMode(modeNum)&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setHex(r, g, b)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required (decimal Values 0-255). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setHue(hue, brightness, isWhite)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested Hue. Hue and brightness required. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setKelvin(Kelvin)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets Kelvin level of the light (For RGBWW devices only). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setNightMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to night mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setRGB(red, green, blue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the lamps RGB color. Values are from 0-255. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setWhiteMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to white mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scale-weight&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scale weight ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;weight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;udateWeight()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scene ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current scene-name to new scene-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-panel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Security Panel ====&lt;br /&gt;
&lt;br /&gt;
Create a security device:&lt;br /&gt;
&lt;br /&gt;
# Set a security panel password in Domoticz settings.&lt;br /&gt;
# Activate the security panel (&#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Security Panel&#039;&#039;&#039; and set it to &#039;&#039;&#039;Disarm&#039;&#039;&#039; (using your password)).&lt;br /&gt;
# Go to the device list in (&#039;&#039;&#039;Setup &amp;amp;gt; Devices&#039;&#039;&#039;) where it should show the security panel device under ‘Not used’.&lt;br /&gt;
# Add the device and give it a name.&lt;br /&gt;
&lt;br /&gt;
Methods/attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;armAway()&#039;&#039;&#039;: Sets a security device to Armed Away. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;armHome()&#039;&#039;&#039;: Sets a security device to Armed Home. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;disarm()&#039;&#039;&#039;: Disarms a security device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;: Same values as domoticz.security value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;smoke-detection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Smoke detection ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;activate()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;reset()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;solar-radiation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Solar radiation ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;radiation&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In Watt/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;updateRadiation(radiation)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;soil-moisture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Soil moisture ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;moisture&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In centibars (cB).&lt;br /&gt;
* &#039;&#039;&#039;updateSoilMoisture(moisture)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sound-level&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sound level ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In dB.&lt;br /&gt;
* &#039;&#039;&#039;updateSoundLevel(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;switch-dimmer-selector-etc.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Switch (dimmer, selector etc.) ====&lt;br /&gt;
&lt;br /&gt;
There are many switch-like devices. Not all methods are applicable for all switch-like devices. You can always use the generic &amp;lt;code&amp;gt;setState(newState)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;close()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Close if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;dimTo(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch a dimming device on and/or dim to the specified level. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;lastLevel&#039;&#039;&#039;: Number. The level of a dimmer just before it was switched off. &#039;&#039;&#039;Note: lastLevel only shows you the previous level if you have a trigger for the device itself. So for instance you have a on-trigger for ‘myDimmer’ and the dimmer is set from 20% to 30%, in your script &amp;lt;code&amp;gt;myDimmer.level == 30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myDimmer.lastLevel == 20&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. For dimmers and other ‘Set Level..%’ devices this holds the level like selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelActions&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. |-separated list of url actions for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current level name for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelNames&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Table holding the level names for selector switch devices.&lt;br /&gt;
* &#039;&#039;&#039;levelVal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Specific for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;maxDimLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;open()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Open if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set deviceStatus to on without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set deviceStatus to off without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setLevel(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to a given level if it supports it (e.g. blinds percentage). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Stop if it supports it (e.g. blinds). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device off it is supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device on if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchSelector(&amp;amp;lt;[level]|[levelname] &amp;amp;gt;)&#039;&#039;&#039; : &#039;&#039;Function&#039;&#039;. Switches a selector switch to a specific level ( levelname or level(numeric) required ) levelname must be exact, for level the closest fit will be picked. See the edit page in Domoticz for such a switch to get a list of the values). Levelname is only supported when level 0 (“Off”) is not removed Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleSwitch()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Toggles the state of the switch (if it is togglable) like On/Off, Open/Close etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTemperature(temperature)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempBaro(temperature, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHumBaro(temperature, humidity, status, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. forecast can be domoticz.BARO_NOINFO, BARO_SUNNY, BARO_PARTLY_CLOUDY, BARO_CLOUDY, BARO_RAIN. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET, HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHum(temperature, humidity [, status] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET or HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Text ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateText(text)&#039;&#039;&#039;: Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-set-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat set point ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-operating-state-3.0.19&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat Operating state &amp;lt;sup&amp;gt;3.0.19&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-type-3-mertik-3.0.15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat type 3 (Mertik) &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-6-3.1.11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat 6 &amp;lt;sup&amp;gt;3.1.11&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Thermostat 6 devices come in several subtypes: Temp/Setpoint, Temp/Hum/Setpoint, Temp/Baro/Setpoint and Temp/Hum/Baro/Setpoint. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. The current set point. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Mapped humidity status value (only for subtypes with humidity). &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update the set point. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update thermostat values. Parameters depend on the subtype: &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;Temp/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;Temp/Hum/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;Temp/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, nil, nil, barometer, forecast)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;Temp/Hum/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;forecast&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;noinfo&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;sunny&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;partlycloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;cloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;rain&#039;&amp;lt;/code&amp;gt; or a numeric value. - &amp;lt;code&amp;gt;humidityStatus&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;dry&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;normal&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;comfortable&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;wet&#039;&amp;lt;/code&amp;gt; or a numeric value. If omitted with humidity provided, it is auto-calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;uv-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UV sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uv&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. UV index.&lt;br /&gt;
* &#039;&#039;&#039;updateUV(uv)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. UV index. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;visibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Visibility ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;visibility&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In km.&lt;br /&gt;
* &#039;&#039;&#039;updateVisibility(distance)&#039;&#039;&#039;:Function*. In km. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;voltage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Voltage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;voltage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateVoltage(voltage)&#039;&#039;&#039;:Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;waterflow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Waterflow ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flow&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In L/m.&lt;br /&gt;
* &#039;&#039;&#039;updateWaterflow(flow)&#039;&#039;&#039;:Function*. In L/m. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wind ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;chill&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;direction&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Degrees.&lt;br /&gt;
* &#039;&#039;&#039;directionString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Formatted wind direction like N, SE.&lt;br /&gt;
* &#039;&#039;&#039;gust&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. ( in meters / second, might change in future releases to Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;gustMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Gust ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;speed&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in the unit set in Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;speedMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;updateWind(bearing, direction, speed, gust, temperature, chill)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Bearing in degrees, direction in N, S, NNW etc, speed in m/s, gust in m/s, temperature and chill in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;youless-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Youless meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;powerYield&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateYouless(total, actual)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zone-heating&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Zone heating ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;heatingMode&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-fan-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Fan mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-thermostat-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Thermostat mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-options-delay-duration-event-triggering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Command options (delay, duration, event triggering) ===&lt;br /&gt;
&lt;br /&gt;
Many dzVents device methods support extra options, like controlling a delay or a duration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    -- switch on for 2 minutes after 10 seconds&lt;br /&gt;
    device.switchOn().afterSec(10).forMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on at a specic time / day&lt;br /&gt;
    device.switchOn().at(&#039;09:00&#039;)                   -- earliest moment it will be 09:00 hr.&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on fri&#039;)         -- earliest moment it will be Friday at 08:53:30&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on sat, sun&#039;)    -- earliest moment it will be Saturday or Sunday at 08:53:30 (whatever comes first)&lt;br /&gt;
&lt;br /&gt;
    -- switch on for 2 minutes after a randomized delay of 1-10 minutes&lt;br /&gt;
    device.switchOff().withinMin(10).forMin(2)&lt;br /&gt;
    device.close().forMin(15)&lt;br /&gt;
    device.open().afterSec(20)&lt;br /&gt;
    device.open().afterMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on but do not trigger follow up events&lt;br /&gt;
    device.switchOn().silent()&lt;br /&gt;
&lt;br /&gt;
    -- flash a light for 3 times&lt;br /&gt;
    device.switchOn().forSec(2).repeatAfterSec(1, 3)&lt;br /&gt;
&lt;br /&gt;
    -- switch the device on but only if the current state isn&#039;t already on:&lt;br /&gt;
    device.switchOn().checkFirst()&lt;br /&gt;
    -- this is a short for:&lt;br /&gt;
    if (device.state == &#039;Off&#039;) then&lt;br /&gt;
        devices.switchOn()&lt;br /&gt;
    end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Options ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;at(hh:mm[:ss][ on [ ddd|dddd ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Activates the command at a certain time [ on a certain day]&lt;br /&gt;
* &#039;&#039;&#039;afterHour(hours), afterMin(minutes), afterSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command after a certain number of hours, minutes or seconds.&lt;br /&gt;
* &#039;&#039;&#039;cancelQueuedCommands()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Cancels queued commands. E.g. you switch on a device after 10 minutes: &amp;lt;code&amp;gt;myDevice.switchOn().afterMin(10)&amp;lt;/code&amp;gt;. Within those 10 minutes you can cancel that command by calling: &amp;lt;code&amp;gt;myDevice.cancelQueuedCommands()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;checkFirst()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Checks if the &#039;&#039;&#039;current&#039;&#039;&#039; state of the device is different than the desired new state. If the target state is the same, no command is sent. If you do &amp;lt;code&amp;gt;mySwitch.switchOn().checkFirst()&amp;lt;/code&amp;gt;, then no switch command is sent if the switch is already on. This command only works with switch-like devices. It is not available for toggle and dim commands, either.&lt;br /&gt;
* &#039;&#039;&#039;forHour(hours), forMin(minutes), forSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command for the duration of hours, minutes or seconds. See table below for applicability and the warning on unexpected behavior of these functions.&lt;br /&gt;
* &#039;&#039;&#039;withinHour(hours), withinMin(minutes), withinSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command within a certain period (specified in hours, minutes or seconds) &#039;&#039;randomly&#039;&#039;. See table below for applicability.&lt;br /&gt;
* &#039;&#039;&#039;silent()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. No follow-up events will be triggered: &amp;lt;code&amp;gt;mySwitch.switchOff().silent()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;repeatAfterHour(hours, [number]), repeatAfterMin(minutes, [number]), repeatAfterSec(seconds, [number])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Repeats the sequence &#039;&#039;number&#039;&#039; times after the specified duration (specified in hours, minutes, or seconds). If no &#039;&#039;number&#039;&#039; is provided, 1 is used. &#039;&#039;&#039;Note that &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; are only applied at the beginning of the sequence and not between the repeats!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the actual switching or changing of the device is done by Domoticz and not by dzVents. dzVents only tells Domoticz what to do; if the options are not carried out as expected, this is likely a Domoticz or hardware issue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note when using forAAA()&#039;&#039;&#039;: Let’s say you have a light that is triggered by a motion detector. Currently the light is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt; and you do this: &amp;lt;code&amp;gt;light.switchOn().forMin(5)&amp;lt;/code&amp;gt;. What happens inside Domoticz is this: at t&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; Domoticz issues the &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command and schedules a command to restore the &#039;&#039;&#039;current&#039;&#039;&#039; state at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; which is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt;. So at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; it will switch the light off.&lt;br /&gt;
&lt;br /&gt;
If, however, &#039;&#039;before the scheduled &amp;lt;code&amp;gt;switchOff()&amp;lt;/code&amp;gt; happens at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&#039;&#039;, new motion is detected and you send this command again at t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; then something unpredictable may seem to happen: &#039;&#039;the light is never turned off!&#039;&#039; This is what happens:&lt;br /&gt;
&lt;br /&gt;
At t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; Domoticz receives the &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; command again. It sees a scheduled command at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; and deletes that command (it is within the new interval). Then Domoticz performs the (unnecessary, it’s already on) &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command. Then it checks the current state of the light which is &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;!! and schedules a command to return to that state at t&amp;lt;sub&amp;gt;2+5&amp;lt;/sub&amp;gt;=t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;. So, at t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; the light is switched on again. And there you have it: the light is not switched off and never will be because future commands will always be checked against the current on-state.&lt;br /&gt;
&lt;br /&gt;
That’s just how it works and you will have to deal with it in your script. So, instead of simply re-issuing &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; you have to check the switch’s state first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;if (light.active) then&lt;br /&gt;
    light.switchOff().afterMin(5)&lt;br /&gt;
else&lt;br /&gt;
    light.switchOn().forMin(5)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or issue these two commands &#039;&#039;both&#039;&#039; as they are mutually exclusive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;light.switchOff().checkFirst().afterMin(5)&lt;br /&gt;
light.switchOn().checkFirst().forMin(5)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Availability ====&lt;br /&gt;
&lt;br /&gt;
Some options are not available to all commands. All the options are available to device switch-like commands like &amp;lt;code&amp;gt;myDevice.switchOff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myGroup.switchOn()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;myBlinds.open()&amp;lt;/code&amp;gt;. For updating (usually Dummy ) devices like a text device &amp;lt;code&amp;gt;myTextDevice.updateText(&#039;zork&#039;)&amp;lt;/code&amp;gt; you can only use &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;. For thermostat setpoint devices and snapshot command silent() is not available. For commands for which dzVents must use openURL, only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; methods are available. These commands are mainly the setAaaaa() commands for RGBW type devices.&lt;br /&gt;
&lt;br /&gt;
See table below&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| option&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| state changes&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;11%&amp;quot;| update commands&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| user variables&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| updateSetpoint&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;8%&amp;quot;| snapshot&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| triggerIFTTT&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| execute ShellCommand&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| emitEvent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repeatAfterAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkFirst()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| • &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancelQueuedCommands()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;span id=&amp;quot;notes-on-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Notes on table ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note 1&#039;&#039;&#039;: AAA is a placeholder for &amp;lt;code&amp;gt;Min/Sec/Hour&amp;lt;/code&amp;gt; affix e.g. &amp;lt;code&amp;gt;afterMin()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Note 2&#039;&#039;&#039;: for &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; is available.&lt;br /&gt;
* &#039;&#039;&#039;Note 3&#039;&#039;&#039;: Note 2 also applies for all commands depending on openURL (like rgbwwDevice.setAaa() commands).&lt;br /&gt;
* &#039;&#039;&#039;Note 4&#039;&#039;&#039;: Including dimTo, switchSelector, setLevel and similar methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;follow-up-event-triggers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Follow-up event triggers ====&lt;br /&gt;
&lt;br /&gt;
Normally if you issue a command, Domoticz will immediately trigger follow-up events, and dzVents will automatically trigger defined event scripts. If you trigger a scene, all devices in that scene will issue a change event. If you have event triggers for these devices, they will be executed by dzVents. If you don’t want this to happen, add &amp;lt;code&amp;gt;.silent()&amp;lt;/code&amp;gt; to your commands (exception is updateSetPoint).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-your-own-device-adapter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create your own device adapter ===&lt;br /&gt;
&lt;br /&gt;
If your device is not recognized by dzVents, you can still operate it using the generic device attributes and methods. It is much nicer, however, to have device specific attributes and methods. Existing recognized adapters are in &amp;lt;code&amp;gt;/path/to/domoticz/dzVents/runtime/device-adapters&amp;lt;/code&amp;gt;. Copy an existing adapter and adapt it to your needs. You can turn debug logging on and inspect the file &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; in the dzVents folder. There you will find the unique signature for your device type. Usually it is a combination of deviceType and deviceSubType, but you can use any of the device attributes in the &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; function. The matches function checks if the device type is suitable for your adapter and the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; function actually creates your specific attributes and methods. Also, if you call &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; you will see all attributes and methods and the attribute &amp;lt;code&amp;gt;_adapters&amp;lt;/code&amp;gt; shows you a list of applied adapters for that device. Finally, register your adapter in &amp;lt;code&amp;gt;Adapters.lua&amp;lt;/code&amp;gt;. Please share your adapter when it is ready and working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-object-api-user-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Variable object API (user variables) ==&lt;br /&gt;
&lt;br /&gt;
User variables created in Domoticz have these attributes and methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Was the variable updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.DATE. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the variable.&lt;br /&gt;
* &#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the variable&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current variable name to new variable name. (does not support timing options)&lt;br /&gt;
* &#039;&#039;&#039;set(value)&#039;&#039;&#039;: Tells Domoticz to update the variable. Supports timing options. See [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|above]].&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.TIME. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Can be domoticz.INTEGER, domoticz.FLOAT, domoticz.STRING, domoticz.DATE, domoticz.TIME.&lt;br /&gt;
* &#039;&#039;&#039;value&#039;&#039;&#039;: &#039;&#039;String|Number|Date|Time&#039;&#039;. Value of the variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
	on =&lt;br /&gt;
	{&lt;br /&gt;
		timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	execute = function(domoticz)&lt;br /&gt;
		-- check time of the day&lt;br /&gt;
		if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
			domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time object ==&lt;br /&gt;
&lt;br /&gt;
Many attributes represent a moment in time, like &amp;lt;code&amp;gt;myDevice.lastUpdate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.time&amp;lt;/code&amp;gt;. In dzVents, a time-like attribute is an object with properties and methods which make your life easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    print(myDevice.lastUpdate.minutesAgo)&lt;br /&gt;
    print(myDevice.lastUpdate.daysAgo)&lt;br /&gt;
&lt;br /&gt;
    -- compare two times&lt;br /&gt;
    print(domoticz.time.compare(myDevice.lastUpdate).secs))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can also create your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;) -- must be this format!!&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you don’t pass a time string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local currentTime = Time()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use this in combination with the various dzVents time attributes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;)&lt;br /&gt;
&lt;br /&gt;
    local tonight = Time(domoticz.time.rawDate .. &#039; 20:00:00&#039;)&lt;br /&gt;
    print (tonight.getISO())&lt;br /&gt;
    -- will print something like: 2016-12-12T20:00:00Z&lt;br /&gt;
    print(t.minutesAgo) -- difference from &#039;now&#039; in minutes&lt;br /&gt;
&lt;br /&gt;
    -- and you can feed it with all same rules as you use&lt;br /&gt;
    -- for the timer = { .. } section:&lt;br /&gt;
    if (t.matchesRule(&#039;at 16:00-21:00&#039;)) then&lt;br /&gt;
        -- t is in between 16:00 and 21:00&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- very powerful if you want to compare two time instances:&lt;br /&gt;
    local anotherTime = Time(&#039;...&#039;) -- fill-in some time here&lt;br /&gt;
    print(t.compare(anotherTime).secs) -- diff in seconds between t and anotherTime.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System event API ===&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a system-event in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;system&#039;&#039; object. The object.type = system-event that triggered the script. ( object.isSystemEvent: true) For backups the object also contains location and durationin seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-properties-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Time properties and methods ===&lt;br /&gt;
&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local Time = require(&#039;Time&#039;)&lt;br /&gt;
local now = Time() -- current time&lt;br /&gt;
local someTime = Time(&#039;2017-12-31 22:19:15&#039;)&lt;br /&gt;
local utcTime = Time(&#039;2017-12-31 22:19:15&#039;, true)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local someTime = domoticz.time.addMinutes(30) -- someTime = domoticz time object for now + 30 minutes&lt;br /&gt;
local someTime = domoticz.time.makeTime() -- someTime = new domoticz time object.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;addAAA(offset)&#039;&#039;&#039;: &#039;&#039;time object&#039;&#039;. time object with given offset (positive or negative. AAA is a placeholder for &amp;lt;code&amp;gt;Seconds, Minutes, Hours or Days&amp;lt;/code&amp;gt; affix e.g. `addHours(-2)&lt;br /&gt;
* &#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightEnd.&lt;br /&gt;
* &#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;:&#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightStart.&lt;br /&gt;
* &#039;&#039;&#039;compare(time)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Compares the current time object with another time object. &#039;&#039;Make sure you pass a Time object!&#039;&#039; Returns a table (all values are &#039;&#039;positive&#039;&#039;, use the compare property to see if &#039;&#039;time&#039;&#039; is in the past or future):&lt;br /&gt;
** &#039;&#039;&#039;milliseconds&#039;&#039;&#039;: Total difference in milliseconds.&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: Total difference in whole seconds.&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: Total difference in whole minutes.&lt;br /&gt;
** &#039;&#039;&#039;hours&#039;&#039;&#039;: Total difference in whole hours.&lt;br /&gt;
** &#039;&#039;&#039;days&#039;&#039;&#039;: Total difference in whole days.&lt;br /&gt;
** &#039;&#039;&#039;compare&#039;&#039;&#039;: 0 = both are equal, 1 = &#039;&#039;time&#039;&#039; is in the future, -1 = &#039;&#039;time&#039;&#039; is in the past.&lt;br /&gt;
* &#039;&#039;&#039;dateToDate( dateString, sourceFormat, targetFormat[ , offSet] )&#039;&#039;&#039;:&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: Returns a reformatted datestring. dateString is a formatted date and source- and targetFormat are representations of the dateString elements and their locations in the string (see examples in dateToTimestamp) . Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;dddd dd mmmm hh:MM:ss&#039;, 1 )              -- &amp;gt; &#039;Friday 31 December 23:31:06&#039;&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;ddd dd mmm hh:MM:ss&#039;, -3600 * 24 - 3 ))  -- &amp;gt; &#039;Thu 30 Dec 23:31:02&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dateToTimestamp([ dateString [,control] ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &#039;&#039;Number&#039;&#039; representing time since epoch in seconds. dateString is a formatted date and control is a representation of the dateString elements and their location in the string. Default control is ‘yyyy-mm-dd hh:MM’. recognized controls are either a Lua pattern string or a string containing following codes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        dddd -- full weekdayname(e.g. Wednesday) language depends on locale&lt;br /&gt;
        ddd  -- abbreviated weekdayname(e.g. Wed) language depends on locale&lt;br /&gt;
        dd   -- day of the month {[01-31]&lt;br /&gt;
        mmmm -- full monthname(e.g September) language depends on locale&lt;br /&gt;
        mmm  -- abbreviated monthname(e.g. Sep) language depends on locale&lt;br /&gt;
        mm   -- month [01-12]&lt;br /&gt;
        yyyy -- 4 digit year&lt;br /&gt;
        yy   -- 2 digit year&lt;br /&gt;
        hh   -- hour 24-hour clock&lt;br /&gt;
        ii   -- hour 12-hour clock&lt;br /&gt;
        MM   -- minute&lt;br /&gt;
        ss   -- second&lt;br /&gt;
        W    -- weeknumber [01-53]&lt;br /&gt;
        w    -- weekday{[0-6] Sunday-Saturday&lt;br /&gt;
        datm -- date and time (e.g. 09/16/98 23:48:10) format depends on locale&lt;br /&gt;
        mer  -- either &amp;quot;AM&amp;quot; or &amp;quot;PM&amp;quot; locale&lt;br /&gt;
        date -- date(e.g. 09/16/98) format depends on locale&lt;br /&gt;
        time -- time (e.g. 23:48:10)&lt;br /&gt;
&lt;br /&gt;
        -- examples:&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59&#039;))                                                      -- &amp;gt; 1609455540&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:01&#039;,&#039;yyyy-mm-dd hh:MM:ss&#039;))                             -- &amp;gt; 1609455541&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;December 31, 23:59:02&#039;,&#039;mmmm dd, hh:MM:ss&#039;))                             -- &amp;gt; 1609455542&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:03&#039;,&#039;(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)&#039; ))  -- &amp;gt; 1609455543&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;20201231235904&#039;,&#039;(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)&#039;))             -- &amp;gt; 1609455544&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayAbbrOfWeek&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. sun,mon,tue,wed,thu,fri or sat&lt;br /&gt;
* &#039;&#039;&#039;daysAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. complete name Sunday, Monday, etc&lt;br /&gt;
* &#039;&#039;&#039;dDate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. timestamp (seconds since 01/01/1970 00:00)&lt;br /&gt;
* &#039;&#039;&#039;getISO&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the ISO 8601 formatted date.&lt;br /&gt;
* &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;hoursAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of hours since the last update.&lt;br /&gt;
* &#039;&#039;&#039;isdst&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Indicates if time is in the daylight saving period&lt;br /&gt;
* &#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if time is today&lt;br /&gt;
* &#039;&#039;&#039;isUTC&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;makeTime(string | table,[isUTC])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. isUTC defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;matchesRule(rule) &#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns true if the rule matches with the time. See [[#timer_trigger_rules|time trigger rules]] for rule examples.&lt;br /&gt;
* &#039;&#039;&#039;millisecondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;minutesAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutesSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;monthAbbrName&#039;&#039;&#039;: String. jan, feb, mar, etc&lt;br /&gt;
* &#039;&#039;&#039;monthName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. January, February, etc&lt;br /&gt;
* &#039;&#039;&#039;msAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;raw&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Generated by Domoticz&lt;br /&gt;
* &#039;&#039;&#039;rawDate&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the date part of the raw data.&lt;br /&gt;
* &#039;&#039;&#039;rawDateTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Combined date / time formatted as domoticz does in API / JSON returns (rawDate .. ’ ’.. rawTime )&lt;br /&gt;
* &#039;&#039;&#039;rawTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM:SS&lt;br /&gt;
* &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunset.&lt;br /&gt;
* &#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunrise.&lt;br /&gt;
* &#039;&#039;&#039;solarnoonInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; Minutes from midnight until solarnoon.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM&lt;br /&gt;
* &#039;&#039;&#039;timestampToDate([ [ timestamp ] , [ pattern ] ,[ offSet ] )&#039;&#039;&#039;: &#039;&#039;function&#039;&#039;. Returns a datestring. timestamp is number of seconds since epoch (default = now) , pattern is a string as explained in this wiki at the description of the domoticz.time.dateToTimestamp function (default = ‘yyyy-mm-dd hh:MM:ss’). Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.timestampToDate(10,&#039;date time&#039;)                               --&amp;gt; &#039;01/01/70 01:00:10&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(60,&#039;ddd mm mmm yyyy ii:MM mer&#039;,&#039;date time&#039;)   --&amp;gt; &#039;Thu 01 Jan 1970 01:01 AM&#039;&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(1598077445,&#039;dd/mm/yy ii:MM mer nZero&#039;)        --&amp;gt; &#039;22/08/20 8:24 AM&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;toUTC(string | table,[offset])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. &amp;lt;sup&amp;gt;3.0.9&amp;lt;/sup&amp;gt; returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. offset defaults to 0.&lt;br /&gt;
* &#039;&#039;&#039;utcSystemTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. UTC system time (only when in UTC mode):&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;utcTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Time stamp in UTC time:&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; day of the week. Sunday = 1, Saturday = 7&lt;br /&gt;
* &#039;&#039;&#039;week&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; week of the year&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: it is currently not possible to change the domoticz.time object instance.&#039;&#039;&#039; ( but you can create a new one with- or without an offset)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shared-helper-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Shared helper functions ==&lt;br /&gt;
&lt;br /&gt;
It is not unlikely that at some point you want to share Lua code among your scripts. Normally in Lua you would have to create a module and require that module in all you scripts. But dzVents makes that easier for you: Inside your scripts folder or in Domoticz’ GUI web editor, create a &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; script (same as for global persistent data) and feed it with this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
        end,&lt;br /&gt;
        MY_CONSTANT = 100 -- doesn&#039;t have to be a function&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the file and then you can use myHandyFunction everywhere in your event scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(&#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
        print(domoticz.helpers.MY_CONSTANT)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt; is needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note: if you need to access the domoticz object in your helper function you have to pass it as a parameter:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(domoticz, param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
            domoticz.log(&#039;Hey&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And pass it along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(domoticz, &#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only &#039;&#039;&#039;one&#039;&#039;&#039; &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requiring-your-own-modules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Requiring your own modules ==&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use the helpers support, but you want to require your own modules, place them either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/modules&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/modules&amp;lt;/code&amp;gt; as these folders are already added to the Lua package path. You can just require those modules: &amp;lt;code&amp;gt;local myModule = require(&#039;myModule&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;persistent-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Persistent data =&lt;br /&gt;
&lt;br /&gt;
In many situations you need to store a device state or other information in your scripts for later use. Like knowing what the state was of a device the previous time the script was executed or what the temperature in a room was 10 minutes ago. Without dzVents, you had to resort to user variables. These are global variables that you create in the Domoticz GUI and that you can access in your scripts like: domoticz.variables(‘previousTemperature’).&lt;br /&gt;
&lt;br /&gt;
Now, for some this is rather inconvenient and they want to control this state information in the event scripts themselves or want to use all of Lua’s variable types. dzVents has a solution for that: &#039;&#039;&#039;persistent script data&#039;&#039;&#039;. This can either be on the script level or on a global level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-level-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Script level persistent variables ==&lt;br /&gt;
&lt;br /&gt;
The values in persistent script variables persist and can be retrieved in the next script run.&lt;br /&gt;
&lt;br /&gt;
For example, send a notification if a switch has been activated 5 times:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = { &#039;MySwitch&#039; }&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            counter = { initial = 0 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (domoticz.data.counter == 5) then&lt;br /&gt;
            domoticz.notify(&#039;The switch was pressed 5 times!&#039;)&lt;br /&gt;
            domoticz.data.counter = 0 -- reset the counter&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.data.counter = domoticz.data.counter + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; section defines a persistent variable called &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;. It also defines an initial value. From then on you can read and set the variable in your script.&lt;br /&gt;
&lt;br /&gt;
You do not have to provide an initial value though. In that case the initial value is &#039;&#039;nil&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        --&lt;br /&gt;
        data = {&lt;br /&gt;
            &#039;x&#039;, &#039;y&#039;, &#039;z&#039; -- note the quotes&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, item)&lt;br /&gt;
            print(tostring(domoticz.data.x)) -- prints nil&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can define as many variables as you like and put whatever value in there that you like. It doesn’t have to be just a number. Just don’t put something in there with functions (well, they are filtered out actually).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-matters-and-watch-your-speed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size matters and watch your speed!! ===&lt;br /&gt;
&lt;br /&gt;
If you include tables (or arrays) in the persistent data, beware to not let them grow. It will definitely slow down script execution because dzVents has to serialize and deserialize the data. It is better to use the historical option as described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;re-initializing-a-variable&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Re-initializing a variable ===&lt;br /&gt;
&lt;br /&gt;
You can re-initialize a persistent variable and re-apply the initial value as defined in the data section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { .. },&lt;br /&gt;
    data = {&lt;br /&gt;
        x = { initial = &#039;initial value&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (domoticz.data.x ~= &#039;initial value&#039;) then&lt;br /&gt;
            domoticz.data.initialize(&#039;x&#039;)&lt;br /&gt;
            print(domoticz.data.x) -- will print &#039;initial value&#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; is just a convenience method. You can of course create a local variable in your module holding the initial value and use it in your data section and your execute function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;global-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Global persistent variables ==&lt;br /&gt;
&lt;br /&gt;
Script level variables are only available in the scripts that define them, but global variables can be accessed and changed in every script. To utilize global persistent variables, create a script file called &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; in your scripts folder with this content (same file where you can also put your shared helper functions):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        helpers = {},&lt;br /&gt;
        data = {&lt;br /&gt;
            peopleAtHome = { initial = false },&lt;br /&gt;
            heatingProgramActive = { initial = false }&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just define the variables that you need and access them in your scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;WindowSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, windowSensor)&lt;br /&gt;
            if (domoticz.globalData.heatingProgramActive&lt;br /&gt;
                and windowSensor.state == &#039;Open&#039;) then&lt;br /&gt;
                domoticz.notify(&amp;quot;Hey don&#039;t open the window when the heating is on!&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only one &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;domoticz.globalData.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; just as like &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a-special-kind-of-persistent-variables-history-true-historical-variables-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== A special kind of persistent variables: &#039;&#039;history = true&#039;&#039; (Historical variables API) ==&lt;br /&gt;
&lt;br /&gt;
In some situations, storing a previous value for a sensor is not enough, and you would like to have more previous values. For example, you want to calculate an average over several readings. Of course you can define a persistent variable holding a table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            previousData = { initial = {} }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            table.insert(domoticz.data.previousData, sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- calculate the average&lt;br /&gt;
            local sum = 0, count = 0&lt;br /&gt;
            for i, temp in pairs(domoticz.data.previousData) do&lt;br /&gt;
                sum = sum + temp&lt;br /&gt;
                count = count + 1&lt;br /&gt;
            end&lt;br /&gt;
            local average = sum / count&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The problem with this is that you have to do a lot of bookkeeping to make sure that there isn’t too much data to store (see [[#How_does_the_storage_stuff_work.3F|below for how it works]]) . Fortunately, dzVents has done this for you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            temperatures = { history = true, maxItems = 10 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            domoticz.data.temperatures.add(sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- average&lt;br /&gt;
            local average = domoticz.data.temperatures.avg()&lt;br /&gt;
&lt;br /&gt;
            -- maximum value in the past hour:&lt;br /&gt;
            local max = domoticz.data.temperatures.maxSince(&#039;01:00:00&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;defining&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Defining ===&lt;br /&gt;
&lt;br /&gt;
Define a script variable or global variable in the data section and set &amp;lt;code&amp;gt;history = true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    …&lt;br /&gt;
    data = {&lt;br /&gt;
        var1 = { history = true, maxItems = 10, maxHours = 1, maxMinutes = 5 }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;maxItems&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Controls how many items are stored in the variable. maxItems has precedence over maxHours and maxMinutes.&lt;br /&gt;
* &#039;&#039;&#039;maxHours&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Data older than &amp;lt;code&amp;gt;maxHours&amp;lt;/code&amp;gt; from now will be discarded. E.g., if set to 2, then data older than 2 hours will be removed at the beginning of the script.&lt;br /&gt;
* &#039;&#039;&#039;maxMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as maxHours but, you guessed it: for minutes this time.. All these options can be combined. &#039;&#039;&#039;Reminder: don’t store too much data. Only put in what you really need!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adding-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Adding data ===&lt;br /&gt;
&lt;br /&gt;
Add new values to a historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz.data.myVar.add(value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As soon as this new value is put on top of the list, the older values shift one place down the line. If &amp;lt;code&amp;gt;maxItems&amp;lt;/code&amp;gt; is reached, then the oldest value will be discarded. &#039;&#039;All methods, like calculating averages or sums, will immediately use this new value!&#039;&#039; If you don’t want this to happen, set the new value at the end of your script or after you have done your analysis.&lt;br /&gt;
&lt;br /&gt;
Any kind of data may be stored in the historical variable: numbers, strings, but also more complex data like tables. However, in order to use the [[#Statistical_functions|statistical methods]], numeric values are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;accessing-values-in-historical-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Accessing values in historical variables ===&lt;br /&gt;
&lt;br /&gt;
Values in a historical variable are indexed, where index 1 is the newest value, 2 is the second newest, and so on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.get(5)&lt;br /&gt;
print(item.data)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, all data in the storage are time-stamped:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.getLatest()&lt;br /&gt;
print(item.time.secondsAgo) -- access the time stamp&lt;br /&gt;
print(item.data) -- access the data&amp;lt;/pre&amp;gt;&lt;br /&gt;
The time attribute by itself is a table with many properties that help you inspect the data points more easily. See [[#Time_object|Time Object]] for all attributes and methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Index ====&lt;br /&gt;
&lt;br /&gt;
All data in the set can be addressed using an index. The item with index = 1 is the youngest, and the item with the highest index is the oldest. Beware, if you have called &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; first, then the first item is that new value! You can always check the size of the set by inspecting &amp;lt;code&amp;gt;myVar.size&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-specification-timeago&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Time specification (&#039;&#039;timeAgo&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
Every data point in the set has a timestamp and the set is ordered so that the youngest item is the first and the oldest item the last. Many functions require a moment in the past to be specified by passing a string in the format &#039;&#039;&#039;&amp;lt;code&amp;gt;hh:mm:ss&amp;lt;/code&amp;gt;&#039;&#039;&#039;, where &#039;&#039;hh&#039;&#039; is the number of hours ago, &#039;&#039;mm&#039;&#039; the number of minutes and &#039;&#039;ss&#039;&#039; the number of seconds. The times are added together, so you don’t have to consider 60 minute boundaries, etc. A time specification of &amp;lt;code&amp;gt;12:88:03&amp;lt;/code&amp;gt; is valid, and points to the data point at or around &amp;lt;code&amp;gt;12*3600 + 88*60 + 3 = 48.483 seconds&amp;lt;/code&amp;gt; in the past.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- get average for the past 30 minutes:&lt;br /&gt;
local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-data-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Getting data points ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get(idx)&#039;&#039;&#039;: Returns the idx-th item in the set. Same as &amp;lt;code&amp;gt;myVar.storage[idx]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getAtTime([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Returns the data point &#039;&#039;closest&#039;&#039; to the moment as specified by &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; and the index in the set. So, &amp;lt;code&amp;gt;myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt; returns the item that is closest to one hour old. It may be a bit younger or a bit older than 1 hour. The second return value is the index in the set: &amp;lt;code&amp;gt;local item, index = myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;getLatest( )&#039;&#039;&#039;: Returns the youngest item in the set. Same as &amp;lt;code&amp;gt;print(myVar.get(1).data)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getOldest( )&#039;&#039;&#039;: Returns the oldest item in the set and the index. Same as &amp;lt;code&amp;gt;print(myVar.get(myVar.size).data)&amp;lt;/code&amp;gt;. Note that the index is always the same as the total size. &amp;lt;code&amp;gt;local item, index = myVar.getOldest()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;: Return the number of data points in the set.&lt;br /&gt;
* &#039;&#039;&#039;subset( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns a subset of the stored data. Default value, if omitted, of &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; is 1. Omitting &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt; takes all items until the end of the set (oldest). E.g., &amp;lt;code&amp;gt;myVar.subset()&amp;lt;/code&amp;gt; returns all data. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;subsetSince( [[#Time_specification_.28timeAgo.29|timeAgo]] )&#039;&#039;&#039;: Returns a subset of the stored data since the relative time specified by timeAgo. So calling &amp;lt;code&amp;gt;myVar.subsetSince(&#039;00:60:00&#039;)&amp;lt;/code&amp;gt; returns all items that have been added to the list in the past 60 minutes. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reset( )&#039;&#039;&#039;: Removes all the items from the set. It could be a good practice to do this often when you know you don’t need older data. For instance, when you turn on a heater and you just want to monitor rising temperatures starting from this moment when the heater is activated. If you don’t need data points from before, then you may call reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-data-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Looping through the data: iterators ====&lt;br /&gt;
&lt;br /&gt;
Similar to the iterators as described [[#Looping_through_the_collections:_iterators|above]], there are convenience methods to make looping through the data set easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Loop over all items in the set: E.g.: &amp;lt;code&amp;gt;myVar.forEach( function( item, index, collection) ... end )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;filter(function)&#039;&#039;&#039;: Create a filtered set of items. The function receives the item and returns true if the item is in the result set. E.g. get a set with item values larger than 20: &amp;lt;code&amp;gt;subset = myVar.filter( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Search for a specific item in the set: E.g. find the first item with a value higher than 20: &amp;lt;code&amp;gt;local item = myVar.find( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the set and do some calculation with it. You call reduce with the function and the initial value. Each iteration the function is called with the accumulator. The function does something with the accumulator and returns a new value for it. Once you get the hang of it, it is very powerful. Best to give an example. To sum all values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        local sum = myVar.reduce(function(acc, item)&lt;br /&gt;
            local value = item.data&lt;br /&gt;
        return acc + value&lt;br /&gt;
        end, 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Suppose you want to get data points older than 45 minutes and count the values that are higher than 20 (of course there are more ways to do this):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myVar = domoticz.data.myVar&lt;br /&gt;
&lt;br /&gt;
    local olderItems = myVar.filter(function (item)&lt;br /&gt;
        return (item.time.minutesAgo &amp;gt; 45)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    local count = olderItems.reduce(function(acc, item)&lt;br /&gt;
        if (item.data &amp;gt; 20) then&lt;br /&gt;
            acc = acc + 1&lt;br /&gt;
        end&lt;br /&gt;
        return acc&lt;br /&gt;
    end, 0)&lt;br /&gt;
&lt;br /&gt;
    print(&#039;Found &#039; .. tostring(count) .. &#039; items&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;statistical-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Statistical functions ====&lt;br /&gt;
&lt;br /&gt;
Statistical functions require &#039;&#039;numerical&#039;&#039; data in the set. If the set is just numbers you can do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add(myDevice.temperature) -- adds a number to the set&lt;br /&gt;
myVar.avg() -- returns the average&amp;lt;/pre&amp;gt;&lt;br /&gt;
If, however, you add more complex data or you want to do a computation first, then you have to &#039;&#039;tell dzVents how to get a numeric value from these data&#039;&#039;. So let’s say you do this to add data to the set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add( { &#039;person&#039; = &#039;John&#039;, waterUsage = u })&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; is a variable that got its value earlier. If you want to calculate the average water usage, then dzVents will not be able to do this because it doesn’t know the value is actually in the &amp;lt;code&amp;gt;waterUsage&amp;lt;/code&amp;gt; attribute! You will get &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To make this work you have to provide a &#039;&#039;&#039;getValue function&#039;&#039;&#039; in the data section when you define the historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {...},&lt;br /&gt;
        data = {&lt;br /&gt;
        myVar = {&lt;br /&gt;
            history = true,&lt;br /&gt;
            maxItems = 10,&lt;br /&gt;
            getValue = function(item)&lt;br /&gt;
                return item.data.waterUsage -- return number!!&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function()...end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This function tells dzVents how to get the numeric value for a data item. &#039;&#039;&#039;Note: the &amp;lt;code&amp;gt;getValue&amp;lt;/code&amp;gt; function has to return a number!&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you don’t intend to use any of these statistical functions you can put whatever you want in the set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avg( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the average of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avgSince([[#Time_specification_.28timeAgo.29|timeAgo]], default )&#039;&#039;&#039;: Calculates the average of all data points since &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt;. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there are no data, otherwise 0. E.g.: &amp;lt;code&amp;gt;local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/code&amp;gt; returns the average over the past 30 minutes.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;med( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the median of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;min( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the lowest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;minSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;min&#039;&#039;&#039; but now within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;max( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the highest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;maxSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;max&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sum( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the summation of all values in the range defined by fromIdx and toIdx. It will return 0 when there are no data.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sumSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;sum&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. It will return 0 when there are no data in the interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;** delta(fromIdx, toIdx, [smoothRange], [default] )**: Returns the delta (difference) between items specified by &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. Provide a valid range (no &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values). [Supports data smoothing]. (#Data_smoothing) when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there is not enough data. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta(2, 5, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;delta2( fromIdx, toIdx, [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but now you can control if the smooth values for the &#039;&#039;from-item&#039;&#039; and the &#039;&#039;to-item&#039;&#039; separately. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta2(2, 5, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSince([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRange], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSince(&#039;00:00:10&#039;, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSinceOrOldest([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;deltaSince&#039;&#039;&#039; but it will take the oldest value in the set if &#039;&#039;timeAgo&#039;&#039; is older than the age of the entire set. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSinceOrOldest(&#039;00:00:10&#039;, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;: Returns the first minimum value (and the item holding the minimal value) in the past. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. For example, given this range of values in the data set (from new to old): &amp;lt;code&amp;gt;10 8 7 5 3 4 5 6&amp;lt;/code&amp;gt;, it will return &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; because older values &#039;&#039;and&#039;&#039; newer values are higher: a local minimum. Use this if you want to know at what time a temperature started to rise after it had been dropping. E.g.:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; local value, item = myVar.localMin()&lt;br /&gt;
 print(&#039; minimum was : &#039; .. value .. &#039;: &#039; .. item.time.secondsAgo .. &#039; seconds ago&#039; )&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMax([smoothRange], default)&#039;&#039;&#039;: Same as &#039;&#039;&#039;localMin&#039;&#039;&#039; but for the maximum value. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;smoothItem(itemIdx, [smoothRange])&#039;&#039;&#039;: Returns a the value of &amp;lt;code&amp;gt;itemIdx&amp;lt;/code&amp;gt; in the set but smoothed by averaging with its neighbors. The number of neighbors is set by &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt;. See [[#Data_smoothing|Data smoothing]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-smoothing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Data smoothing ====&lt;br /&gt;
&lt;br /&gt;
Example: Suppose you store temperatures in the historical variable. These temperatures may have extremes. Perhaps these extremes could be due to sensor reading errors. In order to reduce the effect of these so-called spikes, you could smooth out values. It is like blurring the data. The Raw column is your temperatures. The other columns are calculated by averaging the neighbors. For item 10 the calculations are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Range=1 for time10 = (25 + 31 + 29) / 3 = 28,3&lt;br /&gt;
Range=2 for time10 = (16 + 25 + 31 + 29 + 26) / 5 = 25,4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; align=&amp;quot;center&amp;quot; width=&amp;quot;30% height:10px;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| time&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| raw&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=1&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
| 18&lt;br /&gt;
| 20,0&lt;br /&gt;
| 21,7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 21,7&lt;br /&gt;
| 25,0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 27,3&lt;br /&gt;
| 24,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 27,7&lt;br /&gt;
| 26,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
| 23&lt;br /&gt;
| 28,7&lt;br /&gt;
| 27,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,0&lt;br /&gt;
| 25,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
| 27&lt;br /&gt;
| 23,7&lt;br /&gt;
| 23,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
| 16&lt;br /&gt;
| 22,7&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 24,0&lt;br /&gt;
| 25,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 28,3&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
| 29&lt;br /&gt;
| 28,7&lt;br /&gt;
| 29,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
| 26&lt;br /&gt;
| 30,0&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;13&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 32,0&lt;br /&gt;
| 30,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;16&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 29,7&lt;br /&gt;
| 28,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;17&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,7&lt;br /&gt;
| 28,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 27,3&lt;br /&gt;
| 26,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;19&#039;&#039;&#039;&lt;br /&gt;
| 32&lt;br /&gt;
| 24,3&lt;br /&gt;
| 25,3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;20&#039;&#039;&#039;&lt;br /&gt;
| 19&lt;br /&gt;
| 25,5&lt;br /&gt;
| 24,3&lt;br /&gt;
|}&lt;br /&gt;
A chart illustrates it more clearly. The red line is not smoothed and has more spikes than the others:&lt;br /&gt;
&lt;br /&gt;
[[File:dzvents-smoothing.png|frame|none|alt=|Smoothing]]&lt;br /&gt;
&lt;br /&gt;
Usually a range of 1 or 2 is sufficient when providing a smoothing range to statistical functions. I suggest smoothing when checking deltas, local minimums and maximums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-does-the-storage-stuff-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How does the storage stuff work? ==&lt;br /&gt;
&lt;br /&gt;
For every script file that defines persisted variables (using the &amp;lt;code&amp;gt;data={ … }&amp;lt;/code&amp;gt; section), dzVents will create storage file with the name &amp;lt;code&amp;gt;__data_scriptname.lua&amp;lt;/code&amp;gt; in a subfolder called &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. You can always delete these data files or the entire storage folder if there is a problem with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz/&lt;br /&gt;
    scripts/&lt;br /&gt;
        dzVents/&lt;br /&gt;
            data/&lt;br /&gt;
                __data_yourscript1.lua&lt;br /&gt;
                __data_yourscript2.lua&lt;br /&gt;
                __data_global_data.lua&lt;br /&gt;
            examples/&lt;br /&gt;
            generated_scripts/&lt;br /&gt;
            scripts/&lt;br /&gt;
                yourscript1.lua&lt;br /&gt;
                yourscript2.lua&lt;br /&gt;
                global_data.lua&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you dare to, you can watch inside these files. Every time some data are changed, dzVents will stream the changes back into the data files. &#039;&#039;&#039;Again, make sure you don’t put too much stuff in your persistent data as it may slow things down too much.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-requests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous HTTP requests =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous HTTP request and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use os functions like &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz will terminate the script with a message that it took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to make an http call and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;openURL&amp;lt;/code&amp;gt; on the domoticz object with only the url as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL(&#039;http://domain/path/to/something?withparameters=1&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will make the request that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a url you pass in a table with all the parameters to make the request &#039;&#039;&#039;and&#039;&#039;&#039; your provide a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
    domoticz.openURL({&lt;br /&gt;
        url = &#039;http://domain/path/to/something&#039;,&lt;br /&gt;
        method = &#039;POST&#039;,&lt;br /&gt;
        callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
        postData = {&lt;br /&gt;
            paramA = &#039;something&#039;,&lt;br /&gt;
            paramB = &#039;something else&#039;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will make the request (a POST in this case), and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    httpResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
    if (response.ok) then -- success&lt;br /&gt;
        if (response.isJSON) then&lt;br /&gt;
            domoticz.log(response.json.some.value)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    timer = {&#039;every 5 seconds&#039;},&lt;br /&gt;
    httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
    if (item.isTimer) then&lt;br /&gt;
        domoticz.openURL({&lt;br /&gt;
            url = &#039;...&#039;,&lt;br /&gt;
            callback = &#039;trigger&#039;&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    if (item.isHTTPResponse) then&lt;br /&gt;
        if (item.ok) then&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.openURL(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;url&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. Either &amp;lt;code&amp;gt;&#039;GET&#039;&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;&#039;POST&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;PUT&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;&#039;DELETE&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; .&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to trigger the callback handler script(s).&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. A Lua table or JSON string with additional http request-headers.&lt;br /&gt;
* &#039;&#039;&#039;postData&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. When doing a &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; this data will be the payload of the request (body). If you provide a Lua table then this will automatically be converted to json and the request-header &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; is set. So no need to do that manually. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw response data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Response headers.&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;application/json&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;text/xml&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be in range of 200-299.&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. HTTP status codes. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;statusText&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP status message. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;protocol&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP protocol. See [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;more-about-request-and-response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== More about request and response headers ===&lt;br /&gt;
&lt;br /&gt;
Whenever you do an http request it is not just some data that is sent. Along with the request a bunch of so-called headers are sent along with it. HTTP headers allow the client and the server to pass additional information with the request or the response. Also, in the response there are also headers (response header). These response headers usually tell you what kind of data is returned, if it is compressed, if the request was successful etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;request-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== request headers ====&lt;br /&gt;
&lt;br /&gt;
dzVents allow you to set custom request headers that will accompany the data in the request. Sometimes it is necessary to set these headers like for instance when a API or webservice require a security token or key or when the service needs to know what the format of the response data is. Check the documentation of the web service.&lt;br /&gt;
&lt;br /&gt;
So, let’s say you need to call a web service that requires an api key in the headers and the documentation states it needs to be passed in an x-access-token header. Your openURL command then may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL({&lt;br /&gt;
    url = &#039;https://somedomain.com/service/getInfo&#039;,&lt;br /&gt;
    headers = { [&#039;x-access-token&#039;] = &#039;&amp;lt;api-key&amp;gt;&#039; },&lt;br /&gt;
    method = &#039;GET&#039;,&lt;br /&gt;
    callback = &#039;info&#039;&lt;br /&gt;
})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Check google for more information about request headers. All you need to know here is that dzVents allow you to set these headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== response headers ====&lt;br /&gt;
&lt;br /&gt;
As said earlier, the response also contains a bunch of headers. You can inspect those headers with dzVents but ususally you don’t have to. For starters, dzVents already checks the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header which usually states what kind of data format the response is. If it is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then it automatically converts the json data to a Lua table. Also, it checks the &amp;lt;code&amp;gt;Status&amp;lt;/code&amp;gt; header to see if the request was successful. If so, then it sets the &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; attribute on the response object. So normally you don’t have to inspect the headers. However, sometimes the web service puts a session token in the response header that you have to use in follow-up requests.&lt;br /&gt;
&lt;br /&gt;
So here an example where we have to log in before we can fetch data. It uses two requests: the first performs the log-in and the second grabs the session token from the login response data and uses that token in the second request to get the data we need. In this example we do this every hour.&lt;br /&gt;
&lt;br /&gt;
That would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;loggedin&#039;, &#039;data&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/login&#039;,&lt;br /&gt;
                method = &#039;POST&#039;,&lt;br /&gt;
                postData = { [&#039;username&#039;] = &#039;Luke Skywalker&#039;, [&#039;password&#039;] = &#039;theforce&#039; }&lt;br /&gt;
                callback = &#039;loggedin&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- check to which request this response was the result&lt;br /&gt;
            if (item.trigger == &#039;loggedin&#039;) then&lt;br /&gt;
                -- we are logged in, now grab the session token from the header and&lt;br /&gt;
                -- fetch our data&lt;br /&gt;
                local token = item.headers[&#039;x-session-token&#039;]&lt;br /&gt;
                -- now we have the token, put it in the headers:&lt;br /&gt;
                domoticz.openURL({&lt;br /&gt;
                    url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                    method = &#039;GET&#039;,&lt;br /&gt;
                    headers = { [&#039;x-session-token&#039;] = token },&lt;br /&gt;
                    callback = &#039;data&#039;&lt;br /&gt;
                })&lt;br /&gt;
            else&lt;br /&gt;
                -- it must the data we requested&lt;br /&gt;
                local data = item.data&lt;br /&gt;
                -- do something with it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Some remarks about the response header &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;. If a service is a good web-citizen then it tells you what the format of the data is in this header. So, if the data is a json object then the header should be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;. Unfortunately, there are lot of lazy programmers out there who don’t set this header properly. If that is the case, dzVents cannot detect the format and will not turn it into a Lua table for you automatically. So, if you know it is json but the header is not properly set, then you can easily convert it into a Lua table in your code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                callback = &#039;trigger&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- we know it is json but dzVents cannot detect this&lt;br /&gt;
            -- convert to Lua&lt;br /&gt;
            local json = domoticz.utils.fromJSON(item.data)&lt;br /&gt;
            -- json is now a Lua table&lt;br /&gt;
            print(json.result.title) -- just an example&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous shell command execution =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use functions like &amp;lt;code&amp;gt;utils.osCommand()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;os.Execute()&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to execute a shell command asynchronously and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;executeShellCommand&amp;lt;/code&amp;gt; on the domoticz object with only the command as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.executeShellCommand(&#039;some shell command&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will execute the request in a separate thread and that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a command you pass in a table with the command to be executed &#039;&#039;&#039;and&#039;&#039;&#039; a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;some shell command&#039;,&lt;br /&gt;
            callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
            timeout = timeoutinseconds,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        shellCommandResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
        if response.ok then&lt;br /&gt;
            if (response.isJSON) then&lt;br /&gt;
                domoticz.log(response.json.some.value)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every 5 minutes&#039;,&lt;br /&gt;
        },&lt;br /&gt;
        shellCommandResponses =&lt;br /&gt;
        {&lt;br /&gt;
            scriptVar,&lt;br /&gt;
        },&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.executeShellCommand(&lt;br /&gt;
            {&lt;br /&gt;
                command = &#039;some shell command&#039;,&lt;br /&gt;
                callback = scriptVar,&lt;br /&gt;
                timeout = timeoutinseconds,&lt;br /&gt;
            })&lt;br /&gt;
        elseif item.isShellCommandResponse then&lt;br /&gt;
            if item.statusCode == 0 then&lt;br /&gt;
                ... -- process result (in item.json, -item.xml, -item.lines or item.data)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.executeShellCommand(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;command&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to find a the callback handler script.&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: &#039;&#039;Integer&#039;&#039;. Optional. Max execution time in seconds. defaults to 10 seconds. A value of 0 disables the timeout.&lt;br /&gt;
&lt;br /&gt;
Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: output from the command. (stdout)&lt;br /&gt;
* &#039;&#039;&#039;errorText&#039;&#039;&#039;: Errors generated by the command (stderr)&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Int&#039;&#039;. exitcode generated by the command&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be 0.&lt;br /&gt;
* &#039;&#039;&#039;timeoutOccurred&#039;&#039;&#039; &#039;&#039;Boolean&#039;&#039; &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was aborted by a timeout.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;settings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Settings =&lt;br /&gt;
&lt;br /&gt;
Settings for dzVents are found in the Domoticz GUI: &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039;: Tick this if you don’t want any dzVents script to be executed.&lt;br /&gt;
* &#039;&#039;&#039;Log level&#039;&#039;&#039;: (Note that you can override this setting in the logging section of your script)&lt;br /&gt;
** &#039;&#039;Errors&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info&#039;&#039;: Errors and some minimal information about which script is being executed and why,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info + generic info&#039;&#039;. Even more information about script execution and a bit more log formatting.&lt;br /&gt;
** &#039;&#039;Debug&#039;&#039;. Shows everything and dzVents will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in the scripts/dzVents folder. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.&lt;br /&gt;
** &#039;&#039;No logging&#039;&#039;. As silent as possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
So, you think if you have done everything correctly but things do not work (in some way) as you expected. Here are a couple steps you can do to find the cause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-dzvents-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is dzVents enabled? ===&lt;br /&gt;
&lt;br /&gt;
Check the settings (see above) and make sure the checkbox &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039; is not checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-your-script-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is your script enabled? ===&lt;br /&gt;
&lt;br /&gt;
Make sure the active section in your script is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;active = true&amp;lt;/code&amp;gt;. And, on top of that, if you are using the internal web editor to write your script, make sure that your script is active there and you have clicked Save! “Event active” is a separate checkbox that must be ticked for every active script. When not active, the script name will be red in the list on the right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;turn-on-debug-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Turn on debug logging ===&lt;br /&gt;
&lt;br /&gt;
Activate debug logging in the settings (see above). This will produce a lot of extra messages in the Domoticz log (don’t forget to turn it off when you are done troubleshooting!). It is best to monitor the log through the command line, as the log in the browser sometimes tends to not always show all log messages. See the Domoticz manual for how to do that.&lt;br /&gt;
&lt;br /&gt;
When debug logging is enabled, every time dzVents kicks into action (Domoticz throws an event) it will log it, and it will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz. This data lie at the core of the dzVents object model. You can open this file in an editor to see if your device/variable/scene/group/hardware is in there. Note that the data in the file are not exactly the same as what you will get when you interact with dzVents, but it is a good start. If your object is not in the data file, then you will not have access to it in dzVents and dzVents will not be able to match triggers with that object. Something’s wrong if you expect your object to be in there but it is not (is the object active/used?). &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.with a dump of the data sent to dzVents.&lt;br /&gt;
&lt;br /&gt;
Example content of &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    Startdate time  - End date time  (clk - CPU )                 dule / scriptname &amp;amp;lt;&amp;amp;lt; type: &amp;amp;quot;trigger&amp;amp;quot;&lt;br /&gt;
    ---------------------------------------------------------------------------------------------------------------&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0029)                     waqi.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 20 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0016)                   Washer.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 5 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:01 - 11/27/20 18:40:01 (00 - 0.0215)   getWaterFromHomewizard.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WaterfromHomewizard&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.2472)     updateWeatherSensors.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WUS_buienradarResponse&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.0290)                     waqi.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;waqi_nearby&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:41:00 - 11/27/20 18:41:00 (00 - 0.0583)        Bathroom humidity.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every minute between 05:15 and 23:30&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every time Domoticz starts dzVents and debug logging is enabled you should see these lines in the domoticz log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dzVents version: x.y.z&lt;br /&gt;
Event trigger type: aaaa&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where aaaa can be time, custom event, system event, device, uservariable, security or scenegroup. That should give you a clue what kind of event is active. If you don’t see this information then dzVents is not active (or debug logging is not active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-is-still-not-executed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script is still not executed ===&lt;br /&gt;
&lt;br /&gt;
If for some reason your script is not executed while all of the above is done, it is possible that your triggers are not correct. Either the time rule is not matching with the current time (try to set the rule to &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or something simple), or the device name is not correct (check casing), or you use an id that doesn’t exist. Note that in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section, you cannot use the dzVents domoticz object!&lt;br /&gt;
&lt;br /&gt;
Make sure that if you use an id in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section that this id is correct. Go to the device list in Domoticz and find the device and make sure the device is in the ‘used’ list!. Unused devices will not create an event. Find the idx for the device and use that as the id.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that your device names are unique! dzVents will throw a warning in the log if multiple device names match. It’s best practice to have unique names for your devices. Use some clever naming like prefixing like ‘Temperature: living room’ or ‘Lights: living room’. That also makes using wild cards on your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section easier.&lt;br /&gt;
&lt;br /&gt;
If your script is still not triggered, you can try to create a classic Lua event script and see if that does work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging-your-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugging your script ===&lt;br /&gt;
&lt;br /&gt;
A simple way to inspect a device in your script is to dump it to the log: &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt;. This will dump everything known to dzVents of the device so you can inspect what its state is. If you only need to see a subset you can use dumpSelection(‘attributes’), dumpSelection(‘functions’) or dumpSelection(‘tables’) Use print statements or domoticz.log() statements in your script at cricital locations to see if the Lua interpreter reaches that line. Don’t try to print a device object though; use the &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; method for that. It wil log all attributes of the device in the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
If you place a print statement all the way at the top of your script file it will be printed every time dzVents loads your script (that is done at the beginning of each event cycle). Sometimes that is handy to see if your script gets loaded in the first place. If you don’t see your print statement in the log, then likely dzVents didn’t load it and it will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;get-help&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Get help ===&lt;br /&gt;
&lt;br /&gt;
The Domoticz forum is a great resource for help and solutions. Check the [https://www.domoticz.com/forum/viewforum.php?f=59 dzVents forum].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;other-interesting-stuff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Other interesting stuff =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lodash-for-lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== lodash for Lua ==&lt;br /&gt;
&lt;br /&gt;
lodash is a well known and very popular Javascript library filled with dozens of handy helper functions that really make you life a lot easier. Fortunately there is also a Lua version. This is directly available through the domoticz object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _ = domoticz.utils._&lt;br /&gt;
_.print(_.indexOf({2, 3, &#039;x&#039;, 4}, &#039;x&#039;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--- (Removed because link is dead. Hopefully only temporarily) Check out the great documentation [here](http://axmat.github.io/lodash.lua/). ---&amp;gt;&lt;br /&gt;
Check out the documentation [https://htmlpreview.github.io/?https://github.com/rwaaren/lodash.lua/blob/master/doc/index.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;history-link-to-changes-in-previous-versions.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= History [https://wiki.domoticz.com/DzVents_version_History link to changes in previous versions]. =&lt;br /&gt;
&lt;br /&gt;
See link for the complete list of changes&lt;br /&gt;
&lt;br /&gt;
https://wiki.domoticz.com/DzVents_version_History&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19247</id>
		<title>DzVents: next generation Lua scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents:_next_generation_Lua_scripting&amp;diff=19247"/>
		<updated>2026-08-02T17:01:11Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Variable attributes and methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: This document is maintained on [https://github.com/domoticz/domoticz/blob/development/dzVents/documentation/README.md github], and the wiki version is automatically generated. Edits should be performed on github, or they may be suggested on the wiki article’s [https://wiki.domoticz.com/Talk:DzVents:_next_generation_Lua_scripting Discussion page]. Editing can be done by any editor but if you are looking for a specialized markDown editor; [https://stackedit.io/app# stackedit.io] would be a good choice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;about-dzvents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= About dzVents =&lt;br /&gt;
&lt;br /&gt;
dzVents /diː ziː vɛnts/, short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts. And … &#039;&#039;&#039;it is 100% Lua&#039;&#039;&#039;! So if you already have a bunch of event scripts for Domoticz, upgrading should be fairly easy.&lt;br /&gt;
&lt;br /&gt;
Let’s start with an example. Say you have a switch that when activated, it should activate another switch but only if the room temperature is above a certain level. And when done, it should send a notification. This is how it looks in dzVents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;Room switch&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, roomSwitch)&lt;br /&gt;
        if (roomSwitch.active and domoticz.devices(&#039;Living room&#039;).temperature &amp;gt; 18) then&lt;br /&gt;
        domoticz.devices(&#039;Another switch&#039;).switchOn()&lt;br /&gt;
        domoticz.notify(&#039;This rocks!&#039;,&lt;br /&gt;
                        &#039;Turns out that it is getting warm here&#039;,&lt;br /&gt;
                        domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you have a timer script that should be executed every 10 minutes, but only on weekdays, and have it do something with some user variables and only during daytime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        -- check time of the day&lt;br /&gt;
        if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
            domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
            --activate my scene&lt;br /&gt;
            domoticz.scenes(&#039;Evening lights&#039;).switchOn()&lt;br /&gt;
            if (domoticz.devices(&#039;My PIR&#039;).lastUpdate.minutesAgo &amp;gt; 5) then&lt;br /&gt;
                domoticz.devices(&#039;Bathroom lights&#039;).switchOff()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or you want to detect a humidity rise within the past 5 minutes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer = {&#039;every 5 minutes&#039;}&lt;br /&gt;
    },&lt;br /&gt;
    data =&lt;br /&gt;
    {&lt;br /&gt;
        previousHumidity = { initial = 100 }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        local bathroomSensor = domoticz.devices(&#039;BathroomSensor&#039;)&lt;br /&gt;
        if (bathroomSensor.humidity - domoticz.data.previousHumidity) &amp;gt;= 5 then&lt;br /&gt;
            -- there was a significant rise&lt;br /&gt;
            domoticz.devices(&#039;Ventilator&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
        -- store current value for next cycle&lt;br /&gt;
        domoticz.data.previousHumidity = bathroomSensor.humidity&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just to give you an idea! Everything in your Domoticz system is now logically available in the domoticz object structure. With this domoticz object, you can get to all the information in your system and manipulate your devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;using-dzvents-with-domoticz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Using dzVents with Domoticz =&lt;br /&gt;
&lt;br /&gt;
In Domoticz go to &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other&#039;&#039;&#039; and in the section EventSystem make sure the check-box ‘dzVents disabled’ is not checked. Also make sure that in the Security section in the settings &#039;&#039;&#039;(Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Local Networks (no username/password)&#039;&#039;&#039; you allow 127.0.0.1 (and / or ::1 when using IPv6 ) to not need a password. dzVents does use this port to get the location settings and to send certain commands to Domoticz. Finally make sure you have set your current location in &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; System &amp;amp;gt; Location&#039;&#039;&#039;, otherwise there is no way to determine nighttime/daytime state.&lt;br /&gt;
&lt;br /&gt;
There are two ways of creating dzVents event scripts in Domoticz:&lt;br /&gt;
&lt;br /&gt;
# By creating scripts in your domoticz instance on your domoticz server: &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt;. Make sure that each script has the extension &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt; and follows the guidelines as described below.&lt;br /&gt;
# By creating scripts inside Domoticz using the internal Domoticz event editor: Go to &#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Events&#039;&#039;&#039;. Press the + button and choose dzVents. You must then choose a template. They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: scripts that you write on the file-system and inside Domoticz using the internal web-editor all share the same name-space. That means that if you have two scripts with the same name, only the one of the file-system will be used. The log will tell you when this happens.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: Scripts created in the internal editor are stored in the domoticz database and are all written to &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/generated_scripts&amp;lt;/code&amp;gt; on every domoticz restart and every “EventSystem: reset all events…”. Scripts in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts&amp;lt;/code&amp;gt; are not stored in the database and should be backed-up separately. &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;quickstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
&lt;br /&gt;
If you made sure that dzVents system is active, we can do a quick test if everything works:&lt;br /&gt;
&lt;br /&gt;
* Pick a switch in your Domoticz system. Write down the exact name of the switch. If you don’t have a switch then you can create a Dummy switch and use that one.&lt;br /&gt;
* Create a new file in the &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/&amp;lt;/code&amp;gt; folder (or using the web-editor in Domoticz, switch to dzVents mode first.). Call the file &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt;. &#039;&#039;Note: when you create a script in the web-editor you do &#039;&#039;&#039;not&#039;&#039;&#039; add the .lua extension!&#039;&#039; Also, valid script names follow the same rules as [https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words filesystem names].&lt;br /&gt;
* Open &amp;lt;code&amp;gt;test.lua&amp;lt;/code&amp;gt; in an editor and fill it with this code and change &amp;lt;code&amp;gt;&amp;amp;lt;exact name of the switch&amp;amp;gt;&amp;lt;/code&amp;gt; with the .. you guessed it… exact name of the switch device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&lt;br /&gt;
            &#039;&amp;lt;exact name of the switch&amp;gt;&#039;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (switch.state == &#039;On&#039;) then&lt;br /&gt;
                domoticz.log(&#039;Hey! I am on!&#039;)&lt;br /&gt;
            else&lt;br /&gt;
                domoticz.log(&#039;Hey! I am off!&#039;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Save the script&lt;br /&gt;
* Open the Domoticz log in the browser&lt;br /&gt;
* In Domoticz GUI perhaps in another browser tab) press the switch.&lt;br /&gt;
* You can watch the log in Domoticz and it should show you that indeed it triggered your script and you should see the log messages.&lt;br /&gt;
&lt;br /&gt;
See the examples folder &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples&amp;lt;/code&amp;gt; for more examples. This folder includes templates you can use to get started as well. And, if you use the GUI web editor to write your script, you will find boilerplate examples in the drop-down below the script type setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;writing-scripts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Writing scripts =&lt;br /&gt;
&lt;br /&gt;
In order for your scripts to work with dzVents, they have to be turned into a Lua module with a specific structure. Basically you make sure it returns a Lua table (object) with predefined keys like &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt;. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = { &#039;My switch&#039; }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, switch)&lt;br /&gt;
        -- your script logic goes here, something like this:&lt;br /&gt;
        if (switch.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.log(&#039;I am on!&#039;, domoticz.LOG_INFO)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Simply said, the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-part defines the trigger and the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part is what should be done if the trigger matches with the current Domoticz event. So all your logic is inside the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sections-in-the-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Sections in the script ==&lt;br /&gt;
&lt;br /&gt;
Each dzVents event script has this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    active = true, -- optional&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        -- at least one of these:&lt;br /&gt;
        customEvents = { ... },&lt;br /&gt;
        devices = { ... },&lt;br /&gt;
        groups = { ... },&lt;br /&gt;
        httpResponses = { ... },&lt;br /&gt;
        scenes = { ... },&lt;br /&gt;
        security = { ... },&lt;br /&gt;
        shellCommandResponses = { ... },&lt;br /&gt;
        system = { ... },&lt;br /&gt;
        timer = { ... },&lt;br /&gt;
        variables = { ... },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    data = { ... }, -- optional&lt;br /&gt;
    logging = { ... }, -- optional&lt;br /&gt;
    execute = function(domoticz, item, triggerInfo)&lt;br /&gt;
    -- your code here&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;active-truefalse-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== active = true/false (optional) ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;active = false&amp;lt;/code&amp;gt;, then the script is not activated: &#039;&#039;dzVents will ignore the script completely&#039;&#039;. If you don’t have &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; specified, &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; is assumed (default value). If you write scripts with Domoticz’ internal script editor then you don’t need this part as the editor has its own way of enabling and disabling scripts.&lt;br /&gt;
&lt;br /&gt;
So, &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; can either be:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;true&#039;&#039;&#039;: (default) the script file will be processed.&lt;br /&gt;
* &#039;&#039;&#039;false&#039;&#039;&#039;: the script file is ignored.&lt;br /&gt;
* &#039;&#039;&#039;function(domoticz) … end&#039;&#039;&#039;: A function returning &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The function will receive the domoticz object with all the information about your domoticz instance: &amp;lt;code&amp;gt;active = function(domoticz) .... end&amp;lt;/code&amp;gt;. For example you could check for a Domoticz variable or switch and prevent the script from being executed. &#039;&#039;&#039;However, be aware that for &#039;&#039;every script&#039;&#039; in your scripts folder, this active function will be called, every cycle!! Therefore, it is better to put all your logic in the execute function instead of in the active function.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== on = { … } ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section tells dzVents &#039;&#039;when&#039;&#039; the execute function has to be executed. It holds all the events/&#039;&#039;&#039;triggers&#039;&#039;&#039; that are monitored by dzVents. If any of the events or triggers match with the current event coming from Domoticz, then the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; part of the script is executed by dzVents. The &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section has many kinds of subsections that &#039;&#039;can all be used simultaneously&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;customevents-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== customEvents = { … } &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more custom event triggers. This eventTrigger can be activate by a json/api call, a MQTT message (when domoticz is setup to listen to such messages on the hardware tab) or by the dzVents internal command domoticz.emitEvent - The name of the custom-event - The name of the custom-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|See time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== API =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;- curl: curl -d &amp;amp;quot;{ &#039;a&#039;:10, &#039;b&#039;:20, &#039;some&#039;:&#039;text&#039;, &#039;sub&#039; : { &#039;x&#039;:10, &#039;y&#039;:20 } }&amp;amp;quot; &amp;amp;quot;http://&amp;amp;lt;domoticzIP:domoticz port&amp;amp;gt;/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;myCustomEvent&amp;amp;gt;&amp;amp;quot;&lt;br /&gt;
- JSON: **&amp;amp;lt; domoticzIP : domoticz port &amp;amp;gt;**/json.htm?type=command&amp;amp;amp;param=customevent&amp;amp;amp;event=&amp;amp;lt;MyEvent&amp;amp;gt;&amp;amp;amp;data=myData&lt;br /&gt;
- MQTT simple: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;, &amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;myData&amp;amp;quot;}&lt;br /&gt;
- MQTT complex: {&amp;amp;quot;command&amp;amp;quot;:&amp;amp;quot;customevent&amp;amp;quot;,&amp;amp;quot;event&amp;amp;quot;:&amp;amp;quot;MyEvent&amp;amp;quot;,&amp;amp;quot;data&amp;amp;quot;:&amp;amp;quot;{\&amp;amp;quot;idx\&amp;amp;quot;:29,\&amp;amp;quot;test\&amp;amp;quot;:\&amp;amp;quot;ok\&amp;amp;quot;}&amp;amp;quot; }&lt;br /&gt;
- emitEvent: domoticz.emitEvent(&#039;myCustomEvent&#039; [,])&lt;br /&gt;
    `domoticz.emitEvent(&#039;myEvent&#039;) -- no data`&lt;br /&gt;
    `domoticz.emitEvent(&#039;another event&#039;, &#039;some data&#039;)`&lt;br /&gt;
    `domoticz.emitEvent(&#039;hugeEvent&#039;, { a = 10, b = 20, some = &#039;text&#039;, sub = { x = 10, y = 20 } })`&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;attributes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
===== Attributes =====&lt;br /&gt;
&lt;br /&gt;
The customEvent object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw customEvent data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid json string. The data is then automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; true when the customEvent data is a valid xml string. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the customEvent data is a valid json string, the response data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;customEvent&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; The string that triggered this customEvent instance. This is useful if you have a script that can be triggered by multiple different customEvent strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; When the response data is a valid xml string, the customEvent data is automatically converted to a Lua table for quick and easy access. nil otherwise&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== devices = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of device-names or indexes. If a device in your system was updated (e.g. a switch was triggered or a new temperature was received) and it is listed in this section then the execute function is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the device state or value has changed. Each device can be:&lt;br /&gt;
&lt;br /&gt;
* The name of your device between string quotes. &#039;&#039;&#039;You can use the asterisk (*) wild-card here e.g. &amp;lt;code&amp;gt;PIR_*&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*_PIR&amp;lt;/code&amp;gt;&#039;&#039;&#039;. E.g.: &amp;lt;code&amp;gt;devices = { &#039;myDevice&#039;, &#039;anotherDevice&#039;, 123, &#039;pir*&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* The index (idx) of your device (as the name may change, the index will usually stay the same, the index can be found in the devices section in Domoticz). &#039;&#039;&#039;Note that idx is a number;&#039;&#039;&#039;&lt;br /&gt;
* The name or idx of your device followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;myDevice&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if &amp;lt;code&amp;gt;myDevice&amp;lt;/code&amp;gt; was changed, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;groups&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== groups = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more group-names or indexes. The same rules as devices apply.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpresponses&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== httpResponses = { …} ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more http callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shellcommandresponses-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== shellCommandResponses = { …} &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scriptcommand callback triggers. Use this in conjunction with &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; where you will provide Domoticz with the callback trigger. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scenes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== scenes = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more scene-names or indexes. The same rules as devices apply. So if your scene is listed in this table then the executed function will be triggered, e.g.: &amp;lt;code&amp;gt;on = { scenes = { &#039;myScene&#039;, &#039;anotherScene&#039; } },&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== security = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more of these security states:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDAWAY&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_ARMEDHOME&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;domoticz.SECURITY_DISARMED&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the security state in Domoticz changes and it matches with any of the states listed here, the script will be executed. See &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/examples/templates/security.lua&amp;lt;/code&amp;gt; for an example see [[#Security_Panel|Security Panel]] for information about how to create a security panel device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-3.0.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== system = { …} &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more system triggers.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manualBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dailyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hourlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monthlyBackupFinished&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;resetAllDeviceStatus&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt; &amp;lt;code&amp;gt;resetAllEvents&amp;lt;/code&amp;gt;, &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;&lt;br /&gt;
* The name of the system-event followed by a time constraint, such as: &amp;lt;code&amp;gt;[&#039;start&#039;] = { &#039;at 15:*&#039;, &#039;at 22:* on sat, sun&#039; }&amp;lt;/code&amp;gt; The script will be executed if domoticz is started, &#039;&#039;&#039;and&#039;&#039;&#039; it is either between 15:00 and 16:00 or between 22:00 and 23:00 in the weekend. See [[#timer_trigger_rules|time trigger rules]].&lt;br /&gt;
** &#039;&#039;&#039;start&#039;&#039;&#039; - fired when Domoticz has started.&lt;br /&gt;
** &#039;&#039;&#039;stop&#039;&#039;&#039; - fired when Domoticz is shutting down. As you probably can imagine you have only a limited amount of time - also depending on the load on your system - to have Domoticz do stuff when your script has been completed. Some commands will probably not be executed. Just give it a try.&lt;br /&gt;
** &#039;&#039;&#039;Backups&#039;&#039;&#039; - the trigger item (2nd parameter of the execute function) is a table that holds information about the newly created backup (location, duration in seconds and type). You could use this information to copy the file to some other location or for another purpose.&lt;br /&gt;
*** &#039;&#039;&#039;dailyBackupFinished&#039;&#039;&#039; - automatic backup when set in domoticz&lt;br /&gt;
*** &#039;&#039;&#039;hourlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;monthlyBackupFinished&#039;&#039;&#039; - ” ”&lt;br /&gt;
*** &#039;&#039;&#039;manualBackupFinished&#039;&#039;&#039; - fired when you start a backup using the Domoticz GUI or via &#039;&#039;&#039;&amp;amp;lt; domoticz IP:domoticz port &amp;amp;gt;&#039;&#039;&#039;/backupdatabase.php&lt;br /&gt;
*** &#039;&#039;&#039;resetAllDeviceStatus&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when the name, description or used / unused state of a device, variable or scene is updated.&lt;br /&gt;
*** &#039;&#039;&#039;resetAllEvents&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.5&amp;lt;/sup&amp;gt;- fired when a dzVents script in the internal editor changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== timer = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one ore more time ‘rules’ like &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;at 17:*&amp;lt;/code&amp;gt;. See [[#timer_trigger_rules|&#039;&#039;timer&#039;&#039; trigger rules]]. If any or the rules matches with the current time/date then your execute function is called. E.g.: &amp;lt;code&amp;gt;on = { timer = { &#039;between 30 minutes before sunset and 30 minutes after sunrise&#039; } }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== variables = { … } ====&lt;br /&gt;
&lt;br /&gt;
A list of one or more user variable-names as defined in Domoticz ( &#039;&#039;Setup &amp;amp;gt; More options &amp;amp;gt; User variables&#039;&#039;). If any of the variables listed here is updated, ( &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed ).the script is executed. &#039;&#039;&#039;Note&#039;&#039;&#039;: Script will only execute when this variable is updated directly by dzVents or by a JSON. If updated with a standard Lua script (using commandArray) or in combination with a time option like afterAAA no event will be triggered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;execute-functiondomoticz-item-triggerinfo-end&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== execute = function(&#039;&#039;&#039;domoticz, item, triggerInfo&#039;&#039;&#039;) … end ===&lt;br /&gt;
&lt;br /&gt;
When all the above conditions are met (active == true and the on section has at least one matching rule), then this &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function is called. This is the heart of your script. The function has three parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 1. (&#039;&#039;&#039;domoticz&#039;&#039;&#039;, item, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
The [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]]. This object gives you access to almost everything in your Domoticz system, including all methods to manipulate them—like modifying switches or sending notifications. More about the [[#Domoticz_object_API_.28Application_Programming_Interface.29|domoticz object]] below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 2. (domoticz, &#039;&#039;&#039;item&#039;&#039;&#039;, triggerInfo) ====&lt;br /&gt;
&lt;br /&gt;
Depending on what actually triggered the script, &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is either a:&lt;br /&gt;
&lt;br /&gt;
* [[#Custom_event_API|customEvent]] &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Device_object_API|device]],&lt;br /&gt;
* [[#Variable_object_API_.28user_variables.29|variable]],&lt;br /&gt;
* [[#Scene|scene]],&lt;br /&gt;
* [[#Group|group]],&lt;br /&gt;
* [[#timer_=_%7B_..._%7D|timer]],&lt;br /&gt;
* [[#System_event_API|system]], &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[#Security_Panel|security]] or&lt;br /&gt;
* [[#Asynchronous_HTTP_requests|httpResponse]]&lt;br /&gt;
* [[#Asynchronous_shell_command_executio|shellCommandResponse]] &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since you can define multiple on-triggers in your script, it is not always clear what the type is of this second parameter. In your code you need to know this in order to properly respond to the different events. To help you inspect the object you can use these attributes like &amp;lt;code&amp;gt;if (item.isDevice) then ... end&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;isCustomEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a customEvent object.&lt;br /&gt;
* &#039;&#039;&#039;isDevice&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Device object.&lt;br /&gt;
* &#039;&#039;&#039;isGroup&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Group object.&lt;br /&gt;
* &#039;&#039;&#039;isHTTPResponse&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is an HTTPResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isShellCommandResponse&#039;&#039;&#039;: . &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a shellcommandResponse object.&lt;br /&gt;
* &#039;&#039;&#039;isScene&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Scene object.&lt;br /&gt;
* &#039;&#039;&#039;isSecurity&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Security object.&lt;br /&gt;
* &#039;&#039;&#039;isSystemEvent&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;. returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a system object.&lt;br /&gt;
* &#039;&#039;&#039;isTimer&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Timer object.&lt;br /&gt;
* &#039;&#039;&#039;isVariable&#039;&#039;&#039;: . returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the item is a Variable object.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;: . &#039;&#039;string&#039;&#039;. the timer rule, the security state, the customEvent or the http response callback string that actually triggered your script. E.g. if you have multiple timer rules can inspect &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; which exact timer rule was fired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-item-triggerinfo-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3. (domoticz, item, &#039;&#039;&#039;triggerInfo&#039;&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: as of version 2.4.0, &amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; has become more or less obsolete and is left in here for backward compatibility. All information is now available on the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; parameter (second parameter of the execute function, see point 2 above).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;triggerInfo&amp;lt;/code&amp;gt; holds information about what triggered the script. The object has two attributes:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;type&#039;&#039;&#039;: the type of the the event that triggered the execute function, either: - domoticz.EVENT_TYPE_CUSTOM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_DEVICE, - domoticz.EVENT_TYPE_GROUP - domoticz.EVENT_TYPE_HTTPRESPONSE - domoticz.EVENT_TYPE_SCENE, - domoticz.EVENT_TYPE_SECURITY, - domoticz.EVENT_TYPE_SYSTEM,&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; - domoticz.EVENT_TYPE_TIMER, - domoticz.EVENT_TYPE_VARIABLE)&lt;br /&gt;
# &#039;&#039;&#039;trigger&#039;&#039;&#039;: the timer rule that triggered the script if the script was called due to a timer event, or the security state that triggered the security trigger rule. See [[#timer_trigger_rules|below]] for the possible timer trigger rules.&lt;br /&gt;
# &#039;&#039;&#039;scriptName&#039;&#039;&#039;: the name of the current script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tip-rename-the-parameters-to-better-fit-your-needs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Tip: rename the parameters to better fit your needs ====&lt;br /&gt;
&lt;br /&gt;
The names of the execute parameters are actually something you can change to your convenience. For instance, if you only have one trigger for a specific switch device, you can rename &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; it to &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;. Or if you think &amp;lt;code&amp;gt;domoticz&amp;lt;/code&amp;gt; is too long you can rename it to &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dz&amp;lt;/code&amp;gt; (might save you a lot of typing and may make your code more readable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = &#039;mySwitch&#039;&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(dz, mySwitch)&lt;br /&gt;
        dz.log(mySwitch.state, dz.LOG_INFO)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== data = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional data section allows you to define local variables that will hold their values &#039;&#039;between&#039;&#039; script runs. These variables can get a value in your execute function and the next time the script is executed these variables will have their previous state restored. For more information see the section [[#Persistent_data|Persistent data]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logging-optional&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== logging = { … } (optional) ===&lt;br /&gt;
&lt;br /&gt;
The optional logging section allows you to override the global logging setting of dzVents as set in &#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem &amp;amp;gt; dzVents Log Level&#039;&#039;. This can be handy when you only want this script to have extensive debug logging while the rest of your script executes silently. You have these options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: This is the minimum log level you want for this script. This can be domoticz.LOG_INFO, domoticz.LOG_STATUS, domoticz.LOG_ERROR or domoticz.LOG_DEBUG&lt;br /&gt;
* &#039;&#039;&#039;marker&#039;&#039;&#039;: A string that is prefixed before each log message. That way you can easily create a filter in the Domoticz log to see just these messages. &#039;&#039;&#039;marker&#039;&#039;&#039; defaults to scriptname&lt;br /&gt;
&lt;br /&gt;
\*LOG_DEBUG will also cause Execution Info to be displayed (start/finished)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;logging = {&lt;br /&gt;
    level = domoticz.LOG_DEBUG,&lt;br /&gt;
    marker = &amp;quot;Hey you&amp;quot;&lt;br /&gt;
    },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;some-trigger-examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Some trigger examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Custom events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to trigger a script not on the minute but 30 seconds later.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every minute&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        customEvents =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;delayed&#039;,&lt;br /&gt;
        },&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.emitEvent(&#039;delayed&#039;, domoticz.time.rawTime ).afterSec(30)&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.notify(&#039;Delayed&#039;, &#039;Event was emitted at &#039; .. item.data, domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have two devices—a smoke detector ‘myDetector’ and a room temperature sensor ‘roomTemp’, and you want to send a notification when either the detector detects smoke or the temperature is too high:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        devices = {&lt;br /&gt;
            &#039;myDetector&#039;,&lt;br /&gt;
            &#039;roomTemp&#039;&lt;br /&gt;
    }&lt;br /&gt;
},&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        if ((device.name == &#039;myDetector&#039; and device.active) or&lt;br /&gt;
            (device.name == &#039;roomTemp&#039; and device.temperature &amp;gt;= 45)) then&lt;br /&gt;
            domoticz.notify(&#039;Fire&#039;, &#039;The room is on fire&#039;, domoticz.PRIORITY_EMERGENCY)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene-group-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Scene / group changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a scene ‘myScene’ and a group ‘myGroup’, and you want to turn on the group as soon as myScene is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        scenes = { &#039;myScene&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, scene)&lt;br /&gt;
        if (scene.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.groups(&#039;myGroup&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you want to send an email when a group is activated at night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        groups = { [&#039;myGroup&#039;] = {&#039;at nighttime&#039;} }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, group)&lt;br /&gt;
        if (group.state == &#039;On&#039;) then&lt;br /&gt;
            domoticz.email(&#039;Hey&#039;, &#039;The group is on&#039;, &#039;someone@the.world.org&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Timer events ===&lt;br /&gt;
&lt;br /&gt;
Suppose you want to check the soil humidity every 30 minutes during the day and every hour during the night:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every 30 minutes at daytime&#039;,&lt;br /&gt;
            &#039;every 60 minutes at nighttime&#039;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, timer)&lt;br /&gt;
        domoticz.log(&#039;The rule that triggered the event was: &#039; .. timer.trigger&#039;)&lt;br /&gt;
        if (domoticz.devices(&#039;soil&#039;).moisture &amp;gt; 100) then&lt;br /&gt;
            domoticz.devices(&#039;irrigation&#039;).switchOn().forMin(60)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a script that updates a variable ‘myAmountOfMoney’, and if that variable reaches a certain level you want to be notified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        variables = { &#039;myAmountOfMoney&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, variable)&lt;br /&gt;
        -- variable is the variable that&#039;s triggered&lt;br /&gt;
        if (variable.value &amp;gt; 1000000) then&lt;br /&gt;
            domoticz.notify(&#039;Rich&#039;, &#039;You can stop working now&#039;, domoticz.PRIORITY_HIGH)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Security changes ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have a group holding all the lights in your house, and you want to switch it off as soon as the alarm is activated:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        security = { domoticz.SECURITY_ARMEDAWAY }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, security)&lt;br /&gt;
        domoticz.groups(&#039;All lights&#039;).switchOff()&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-request-and-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous HTTP Request and handling ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some external web service that will tell you what the current energy consumption is and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        httpResponses = { &#039;energyRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
            url = &#039;http://url/to/service&#039;,&lt;br /&gt;
            method = &#039;GET&#039;,&lt;br /&gt;
            callback = &#039;energyRetrieved&#039;&lt;br /&gt;
            })&lt;br /&gt;
        elseif (item.isHTTPResponse) then&lt;br /&gt;
            if (item.ok) then -- statusCode == 2xx&lt;br /&gt;
                local current = item.json.consumption&lt;br /&gt;
                domoticz.devices(&#039;myCurrentUsage&#039;).updateEnergy(current)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_HTTP_requests|asynchronous http requests]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution-3.1.0&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Asynchronous shell command execution &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Suppose you have some local shellcommand to measure the speed of your internet connection and you want that information in Domoticz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
        shellCommandResponses = { &#039;internetspeedRetrieved&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;speedtest-cli --json&#039;,      -- just an example&lt;br /&gt;
            callback = &#039;internetspeedRetrieved&#039;,   -- see shellCommandResponses above.&lt;br /&gt;
            timeout = 20,                          -- max execution time in seconds&lt;br /&gt;
        })&lt;br /&gt;
        elseif (item.isShellCommandResponse) then&lt;br /&gt;
            if (item.statusCode==0) then&lt;br /&gt;
                domoticz.devices(&#039;myCurrentdownloadspeed&#039;).updateCustomSensor(item.json.download)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
See[[#Asynchronous_shell_command_execution|asynchronous shell commands]] for more information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-changes&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System changes ===&lt;br /&gt;
&lt;br /&gt;
Do some initial work when domoticz starts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        system =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;start&#039;,&lt;br /&gt;
            &#039;backupDoneDaily&#039;,&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, system)&lt;br /&gt;
        domoticz.log(&#039;Domoticz sends &#039; .. system.type, domoticz.LOG_INFO)&lt;br /&gt;
&lt;br /&gt;
        if system.type == &#039;start&#039; then&lt;br /&gt;
            domoticz.device(&#039;initial device&#039;).switchOff().silent&lt;br /&gt;
            domoticz.variables(&#039;special startVar&#039;).set(&#039;domoticz started at &#039; .. domoticz.time.rawDateTime )&lt;br /&gt;
        elseif system.type == &#039;backupDoneDaily&#039; then&lt;br /&gt;
            domoticz.notify(&#039;Domoticz backup&#039;, &#039;Ended. Backupfile &#039; .. system.data.location , domoticz.PRIORITY_LOW)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;combined-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Combined rules ===&lt;br /&gt;
&lt;br /&gt;
Let’s say you have a script that checks the status of a lamp and is triggered by motion detector:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
            timer = { &#039;every 5 minutes&#039; },&lt;br /&gt;
            devices = { &#039;myDetector&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- the timer was triggered&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOff()&lt;br /&gt;
        elseif (item.isDevice and item.active) then&lt;br /&gt;
            -- it must be the detector&lt;br /&gt;
            domoticz.devices(&#039;myLamp&#039;).switchOn()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;at-startup-trigger&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== At startup trigger ===&lt;br /&gt;
&lt;br /&gt;
You can add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section to have your script execute once when Domoticz starts, in addition to any other triggers. This is useful when combined with interval-based rules to avoid waiting for the first interval to pass:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        at_startup = true,&lt;br /&gt;
        timer = { &#039;every hour&#039; },&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        -- Runs immediately when Domoticz starts, then every hour&lt;br /&gt;
        domoticz.devices(&#039;myThermostat&#039;).setPoint(21)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; trigger fires on the first timer tick after Domoticz starts (within 2 minutes of startup). It can be combined with any other trigger types (timer, devices, httpResponses, etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This is different from &amp;lt;code&amp;gt;system = { &#039;start&#039; }&amp;lt;/code&amp;gt; which is a system event trigger. &amp;lt;code&amp;gt;at_startup&amp;lt;/code&amp;gt; is simpler - just add the flag and your existing script will also run at startup without needing to check &amp;lt;code&amp;gt;item.isSystemEvent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;timer-trigger-rules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &#039;&#039;timer&#039;&#039; trigger rules ==&lt;br /&gt;
&lt;br /&gt;
There are several options for time triggers. It is important to know that Domoticz timer events only trigger once every minute, so one minute is the smallest interval for your timer scripts. However, dzVents gives you many options to have full control over when and how often your timer scripts are called (all times are in 24hr format and all dates in dd/mm): Keywords recognized are “at, between, every, except, in, on, or” ( except supported from version &amp;lt;sup&amp;gt;3.0.16&amp;lt;/sup&amp;gt;, or supported from version &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; ).&lt;br /&gt;
&lt;br /&gt;
At every place you read &amp;lt;astroMoment&amp;gt; you can use one of: sunset, sunrise, solarnoon, midnight &#039;&#039;, sunatsouth &#039;&#039;, civiltwilightstart, civiltwilightend, astronomicaltwilightstart &#039;&#039;, astronomicaltwilightend &#039;&#039;, nauticaltwilightstart * or nauticaltwilightend *.&lt;br /&gt;
&lt;br /&gt;
Full daynames are allowed in dzVents &amp;amp;gt;= 3.1.7&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    on = {&lt;br /&gt;
        timer = {&lt;br /&gt;
            &#039;every minute&#039;,             -- causes the script to be called every minute&lt;br /&gt;
            &#039;every other minute&#039;,       -- minutes: xx:00, xx:02, xx:04, ..., xx:58&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; minutes&#039;,       -- starting from xx:00 triggers every xx minutes&lt;br /&gt;
                                        -- (0 &amp;gt; xx &amp;lt; 60)&lt;br /&gt;
            &#039;every hour&#039;,               -- 00:00, 01:00, ..., 23:00 (24x per 24hrs)&lt;br /&gt;
            &#039;every other hour&#039;,         -- 00:00, 02:00, ..., 22:00 (12x per 24hrs)&lt;br /&gt;
            &#039;every &amp;lt;xx&amp;gt; hours&#039;,         -- starting from 00:00, triggers every xx&lt;br /&gt;
                                        -- hours (0 &amp;gt; xx &amp;lt; 24)&lt;br /&gt;
            &#039;at 13:45&#039;,                 -- specific time&lt;br /&gt;
            &#039;at *:45&#039;,                  -- every 45th minute in the hour&lt;br /&gt;
            &#039;at 15:*&#039;,                  -- every minute between 15:00 and 16:00&lt;br /&gt;
            &#039;at 12:45-21:15&#039;,           -- between 12:45 and 21:15. You cannot use &#039;*&#039;!&lt;br /&gt;
            &#039;at 19:30-08:20&#039;,           -- between 19:30 and 8:20 (next day)&lt;br /&gt;
            &#039;at 13:45 on mon,tue&#039;,      -- at 13:45 only on Mondays and Tuesdays (english)&lt;br /&gt;
            &#039;on mon,tue&#039;,               -- on Mondays and Tuesdays&lt;br /&gt;
            &#039;every hour on Saturday&#039;,   -- you guessed it correctly&lt;br /&gt;
            &#039;at sunset&#039;,                -- uses sunset/sunrise/solarnoon info from Domoticz&lt;br /&gt;
            &#039;at sunrise&#039;,&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt;&#039;,         -- dzVents &amp;gt;= 3.0.16 Uses the times received from Domoticz&lt;br /&gt;
            &#039;at &amp;lt;astroMoment&amp;gt; on sat,sun&#039;,&lt;br /&gt;
            &#039;xx minutes before &amp;lt;astroMoment&amp;gt;&#039;,  --&lt;br /&gt;
            &#039;xx minutes after &amp;lt;astroMoment&amp;gt;&#039;,   -- Please note that these relative times will cross dates&lt;br /&gt;
            &#039;between aa and bb&#039;         -- aa/bb can be a time stamp like 15:44 (if aa &amp;gt; bb will cross dates)&lt;br /&gt;
                                        -- aa/bb can be sunrise/sunset/solarnoon (&#039;between sunset and sunrise&#039; and &#039;between solarnoon and sunrise&#039; will cross dates)&lt;br /&gt;
                                        -- aa/bb can be &#039;xx minutes before/after &amp;lt;astroMoment&amp;gt;&#039;&lt;br /&gt;
            &#039;at &amp;lt;astroRange&amp;gt;&#039;,          -- between &amp;lt;astroMoment&amp;gt;start and &amp;lt;astroMoment&amp;gt;end&lt;br /&gt;
            &#039;at nighttime&#039;,             -- between sunset and sunrise&lt;br /&gt;
            &#039;at daytime&#039;,               -- between sunrise and sunset&lt;br /&gt;
            &#039;at daytime on mon,tue&#039;,    -- between sunrise and sunset only on Mondays and Tuesdays&lt;br /&gt;
            &#039;in week 1-7,44&#039;            -- in week 1-7 or 44&lt;br /&gt;
            &#039;in week 20-25,33-47&#039;       -- between week 20 and 25 or week 33 and 47&lt;br /&gt;
            &#039;in week -12, 33-&#039;          -- week &amp;lt;= 12 or week &amp;gt;= 33&lt;br /&gt;
            &#039;every odd week&#039;,&lt;br /&gt;
            &#039;every even week&#039;,          -- odd or even numbered weeks&lt;br /&gt;
            &#039;on 23/11&#039;,                 -- on 23rd of November (dd/mm)&lt;br /&gt;
            &#039;on 23/11-25/12&#039;,           -- between 23/11 and 25/12&lt;br /&gt;
            &#039;on 2/3-8/3,7/8,6/10-14/10&#039;,-- between march 2 and 8, on august 7 and between October 6 and 14.&lt;br /&gt;
            &#039;on */2,15/*&#039;,              -- every day in February or&lt;br /&gt;
                                        -- every 15th day of the month&lt;br /&gt;
            &#039;on -3/4,4/7-&#039;,             -- before 3/4 or after 4/7&lt;br /&gt;
&lt;br /&gt;
            &#039;at 12:45-21:15 except at 18:00-18:30&#039;, -- between 12:45 and 21:15 but not between 18:00 and 18:30 ( except supported from 3.0.16 onwards )&lt;br /&gt;
            &#039;at daytime except on sun&#039;,             -- between sunrise and sunset but not on Sundays&lt;br /&gt;
            &#039;at daytime or at 23:12&#039;,               -- between sunrise and sunset and also at 23:12&lt;br /&gt;
&lt;br /&gt;
            -- or if you want to go really wild and combine them:&lt;br /&gt;
                &#039;at nighttime at 21:32-05:44 every 5 minutes on sat, sun except at 04:00&#039;, -- except supported from 3.0.16 onwards&lt;br /&gt;
                &#039;every 10 minutes between 20 minutes before sunset and 30 minutes after sunrise on mon,fri,tue on 20/5-18/8&#039;&lt;br /&gt;
&lt;br /&gt;
            -- or just do it yourself:&lt;br /&gt;
                function(domoticz)&lt;br /&gt;
                -- you can use domoticz.time to get the current time&lt;br /&gt;
                -- note that this function is called every minute!&lt;br /&gt;
                -- custom code that either returns true or false&lt;br /&gt;
                ...&lt;br /&gt;
            end&lt;br /&gt;
        },&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The timer events are triggered every minute. If such a trigger occurs, dzVents will scan all timer-based events and will evaluate the timer rules. So, if you have a rule &amp;lt;code&amp;gt;on mon&amp;lt;/code&amp;gt; then the script will be executed &#039;&#039;every minute&#039;&#039; but only on Monday.&lt;br /&gt;
&lt;br /&gt;
Be mindful of the logic if using multiple types of timer triggers. It may not make sense to combine a trigger for a specific or instantaneous time with a trigger for a span or sequence of times (like ‘at sunset’ with ‘every 6 minutes’) in the same construct. Similarly, &amp;lt;code&amp;gt;&#039;between aa and bb&#039;&amp;lt;/code&amp;gt; only makes sense with instantaneous times for &amp;lt;code&amp;gt;aa&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;bb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;One important note: if Domoticz, for whatever reason, skips a timer event then you may miss the trigger! Therefore, you should build in some fail-safe checks or some redundancy if you have critical time-based stuff to control. There is nothing dzVents can do about it&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip:&#039;&#039;&#039; If you want your timer script to also run at Domoticz startup (instead of waiting for the first timer match), add &amp;lt;code&amp;gt;at_startup = true&amp;lt;/code&amp;gt; to your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section. See [[#at-startup-trigger|At startup trigger]].&lt;br /&gt;
&lt;br /&gt;
Another important issue: the way it is implemented right now, the &amp;lt;code&amp;gt;every xx minutes&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every xx hours&amp;lt;/code&amp;gt; is a bit limited. The interval resets at every *:00 (for minutes) or 00:* for hours. You need an interval that is an integer divider of 60 (or 24 for the hours). So you can do every 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 and 30 minutes only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-domoticz-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= The domoticz object =&lt;br /&gt;
&lt;br /&gt;
The domoticz object passed as the first parameter to the &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; function contains everything you need to interact with your domotica system. It provides all information made available by the domoticz event system about your custom- and system events, devices, scenes, groups, hardware modules and variables and has methods needed to inspect and manipulate them. Getting this information is easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;domoticz.time.isDayTime&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).temperature&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My sensor&#039;).lastUpdate.minutesAgo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The domoticz object consists of a logically arranges structure. It harbors all methods to manipulate Domoticz. dzVents will take care to notify Domoticz with all your intended changes and actions. Earlier you had to fill a commandArray with obscure commands. That’s no longer the case.&lt;br /&gt;
&lt;br /&gt;
Some more examples: &amp;lt;code&amp;gt;domoticz.devices(123).switchOn().forMin(5).afterSec(10)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My dummy sensor&#039;).updateBarometer(1034, domoticz.BARO_THUNDERSTORM)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
One tip before you get started: &#039;&#039;&#039;Make sure that all your devices have unique names. dzVents will give you warnings in the logs if device names are not unique.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-object-api-application-programming-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Domoticz object API (Application Programming Interface) ==&lt;br /&gt;
&lt;br /&gt;
The domoticz object holds all information about your Domoticz system. It has global attributes and methods to query and manipulate your system. It also has a collection of &#039;&#039;&#039;devices&#039;&#039;&#039;, &#039;&#039;&#039;variables&#039;&#039;&#039; (user variables in Domoticz), &#039;&#039;&#039;scenes&#039;&#039;&#039;, &#039;&#039;&#039;groups&#039;&#039;&#039;, &#039;&#039;&#039;hardware&#039;&#039;&#039;. Each of these collections has four iterator functions: &amp;lt;code&amp;gt;find(), forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; to make searching for devices easier. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;domoticz-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Domoticz attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a device by idx or name: &amp;lt;code&amp;gt;domoticz.devices(123)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.devices(&#039;My switch&#039;)&amp;lt;/code&amp;gt;. For the device API see [[#Device_object_API|Device object API]]. To iterate over all devices do: &amp;lt;code&amp;gt;domoticz.devices().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.devices()) do .. end&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;dump([osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all domoticz.settings attributes to the Domoticz log. This ignores the log level setting.&lt;br /&gt;
* &#039;&#039;&#039;email(subject, message, mailTo [, delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send email. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;emitEvent(name,[extra data ])&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a customEvent. If you just pass a name then Domoticz will execute the script(s) that subscribed to the named customEvent after your script has finished. You can optionally pass extra information as a string or table. A table will be automatically converted into a json string and converted back to a table in the subscribed script(s). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;executeShellCommand(command/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; Have Domoticz ‘call’ a command. If you just pass a command then Domoticz will execute the command after your script has finished but you will not get notified. If you pass options table with a callback then you have the possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_shell_command_execution|asynchronous shell commands]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. &#039;&#039;&#039;Note Make sure that when you use this function on a Windows system and use one or more of the special chars &amp;amp;amp;&amp;amp;lt;&amp;amp;gt;()@^| outside double quotes, you will have to escape these with a ^ char &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;groups(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a group by name or idx. Each group has the same interface as a device. To iterate over all groups do: &amp;lt;code&amp;gt;domoticz.groups().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.groups()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Group|Groups]].&lt;br /&gt;
* &#039;&#039;&#039;hardwareInfo(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.6&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning hardwareInfo of a hardware module by name or idx. The return of the function is a table with attributes name, type, typeValue, deviceNames (table with names of all active devices defined on this hardware) and deviceIds (table with idx of all active devices defined on this hardware)&lt;br /&gt;
* &#039;&#039;&#039;hardware(idx/name)&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: A function returning a hardware module by name or idx. Each hardware has an interface comparable to group. To iterate over all hardware do: &amp;lt;code&amp;gt;domoticz.hardware().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.hardware()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Hardware|Hardware]].&lt;br /&gt;
* &#039;&#039;&#039;helpers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Collection of shared helper functions available to all your dzVents scripts. See [[#Shared_helper_functions|Shared helper functions]].&lt;br /&gt;
* &#039;&#039;&#039;log(message, [level])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a log entry in the Domoticz log but respects the log minimum level settings. You can provide the loglevel: &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_STATUS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_ERROR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;domoticz.LOG_DEBUG&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.LOG_FORCE&amp;lt;/code&amp;gt;. In Domoticz settings you can set the default log level for dzVents.&lt;br /&gt;
* &#039;&#039;&#039;moduleLabel&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.3&amp;lt;/sup&amp;gt; Module (script) name without extension.&lt;br /&gt;
* &#039;&#039;&#039;notify(subject, message [,priority][,sound][,extra][,subsystem][,delay]&amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Send a notification (like Prowl). Priority can be like &amp;lt;code&amp;gt;domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt; is notification subsystem specific. For NSS_FIREBASE you can use this field to specify the target mobile (‘midx_1’, midx_2, etc..) or specify &amp;lt;code&amp;gt;device.id&amp;lt;/code&amp;gt; so the receiver knows which device triggered the notification. For sound see [[#Constants|list of dzVents Constants]] for the SOUND constants below. &amp;lt;code&amp;gt;subsystem&amp;lt;/code&amp;gt; defaults to all subsystems but can be one subsystem or a table containing one or more notification subsystems. See [[#Constants|list of dzVents Constants]] for &amp;lt;code&amp;gt;domoticz.NSS_subsystem&amp;lt;/code&amp;gt; types. Delay is delay in seconds&lt;br /&gt;
* &#039;&#039;&#039;openURL(url/options)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ a URL. If you just pass a url then Domoticz will execute the url after your script has finished but you will not get notified. If you pass a table with options then you have to possibility to receive the results of the request in a dzVents script. Read more about [[#Asynchronous_HTTP_requests|asynchronous http requests]] with dzVents. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;scenes(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: A function returning a scene by name or id. Each scene has the same interface as a device. See [[#Device_object_API|Device object API]]. To iterate over all scenes do: &amp;lt;code&amp;gt;domoticz.scenes().forEach(..)&amp;lt;/code&amp;gt;. See [[#looping-through-the-collections-iterators|Looping through the collections: iterators]]. (#Looping_through_the_collections:_iterators). Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.scenes()) do .. end&amp;lt;/code&amp;gt;. Read more about [[#Scene|Scenes]].&lt;br /&gt;
* &#039;&#039;&#039;security&#039;&#039;&#039;: Holds the state of the security system e.g. &amp;lt;code&amp;gt;Armed Home&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Armed Away&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;sendCommand(command, value[, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;: Generic (low-level)command method (adds it to the commandArray) to the list of commands that are being sent back to domoticz. Optional parm delay is delay in seconds &#039;&#039;There is likely no need to use this directly. Use any of the device methods instead (see below).&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;settings&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;&#039;domoticzVersion&#039;&#039;&#039;: domoticz version string.&lt;br /&gt;
** &#039;&#039;&#039;dzVentsVersion&#039;&#039;&#039;: dzVents version string.&lt;br /&gt;
** &#039;&#039;&#039;location&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;&#039;latitude&#039;&#039;&#039;: domoticz settings locations latitude.&lt;br /&gt;
*** &#039;&#039;&#039;longitude&#039;&#039;&#039;: domoticz settings locations longitude.&lt;br /&gt;
*** &#039;&#039;&#039;name&#039;&#039;&#039;: domoticz settings location Name.&lt;br /&gt;
** &#039;&#039;&#039;secureServer&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; true when domoticz can be accessed via https.&lt;br /&gt;
** &#039;&#039;&#039;serverPort&#039;&#039;&#039;: webserver listening port used by dzVents to access domoticz API.&lt;br /&gt;
** &#039;&#039;&#039;url&#039;&#039;&#039;: internal url to access the API service.&lt;br /&gt;
** &#039;&#039;&#039;webRoot&#039;&#039;&#039;: &amp;lt;code&amp;gt;webroot&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.1&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
** &#039;&#039;&#039;wwwBind&#039;&#039;&#039;: &amp;lt;code&amp;gt;wwwbind&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.1.4&amp;lt;/sup&amp;gt; value as specified when starting the Domoticz service (or default).&lt;br /&gt;
* &#039;&#039;&#039;sms(message [, delay] &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends an sms if it is configured in Domoticz. Optional parm delay is delay in seconds.&lt;br /&gt;
* &#039;&#039;&#039;snapshot(cameraID(s) or camera Name(s)&amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt;,subject)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sends email with a camera snapshots if email is configured and set for attachments in Domoticz. Send 1 or multiple camerIDs -names in ; separated string or array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    dz.snapshot()                  -- defaults to id = 1, subject domoticz&lt;br /&gt;
    dz.snapshot(1,&#039;dz&#039;)            -- subject dz&lt;br /&gt;
    dz.snapshot(&#039;1;2;3&#039;)           -- ; separated string&lt;br /&gt;
    dz.snapshot({1,4,7})           -- table&lt;br /&gt;
    dz.snapshot(&#039;test;test2&#039;)      -- ; separated string&lt;br /&gt;
    dz.snapshot({&#039;test&#039;, &#039;test2&#039;}) -- table&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTimerPlan(idx)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch the active timer plan to the plan with the given database ID. &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; must be a positive integer matching an existing timer plan ID (as shown in &#039;&#039;&#039;Settings → Timer Plans&#039;&#039;&#039;). Invalid or non-existent plan IDs are silently ignored. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;startTime&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;. Returns the startup time of the Domoticz service.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;systemUptime&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds the system is up.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Current system time. Additional to Time object attributes:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilDayTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isCivilNightTime&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if the device was updated today&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will rise.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the sun will set.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will start.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since midnight when the civil twilight will end.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerHTTPResponse([httpResponse], [delay], [message])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Creates a callback by sending a logmessage. httpResponse defaults to scriptname, delay defaults to 0 (immediate), message defaults to httpResponse. Left in for backward compatibility only. You can use emitEvent / customEvents now.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;triggerIFTTT(makerName [,sValue1, sValue2, sValue3])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Have Domoticz ‘call’ an IFTTT maker event. makerName is required, 0-3 sValue’s are optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;utils&#039;&#039;&#039;: . A subset of handy utilities: Note that these functions must be preceded by domoticz.utils. If you use more then a few declare something like local _u = domoticz.utils at the beginning of your script and use _u.functionName in the remainder. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    _u = domoticz.utils&lt;br /&gt;
    print(_u.rightPad(&#039;test&#039;,10) .. &#039;|||&#039;) -- =&amp;gt; test       |||&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;_.lodashFunctions&#039;&#039;&#039;: This is an entire collection with very handy Luafunctions. Read more about [[#lodash_for_Lua|lodash]]. E.g.: &amp;lt;code&amp;gt;{.lua}   domoticz.utils._.size({&#039;abc&#039;, &#039;def&#039;}))` Returns 2.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;cameraExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid camera &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or cameraID and return ID when entered with valid cameraName or false when not a camera, cameraID or cameraName of an existing camera&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid device &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or deviceID and returns ID when entered with valid deviceName or false when not a device, deviceID or deviceName of an existing (and active) device. Example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local dz = domoticz&lt;br /&gt;
local _u = dz.utils&lt;br /&gt;
if _u.deviceExists(&#039;myDevice&#039;) then&lt;br /&gt;
    dz.devices(&#039;myDevice&#039;).switchOn()&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device myDevice does not exist!&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local myName = _u.deviceExists(123)&lt;br /&gt;
if myName then&lt;br /&gt;
    dz.log(&#039;Device 123 is &#039; .. myName, dz.LOG_INFO)&lt;br /&gt;
else&lt;br /&gt;
    dz.log(&#039;Device 123 does not exist&#039;, dz.LOG_ERROR)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpTable(table,[levelIndicator],[osfile]&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;))&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: print table structure and contents to log&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fileExists(path)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the file (with full path) exists.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Decode a base64 string&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromJSON(json, fallback, deSerialize &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt; )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Turns a json string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromJSON(&#039;{ &amp;amp;quot;a&amp;amp;quot;: 1 }&#039;)&amp;lt;/code&amp;gt;. Followed by: &amp;lt;code&amp;gt;print( t.a )&amp;lt;/code&amp;gt; will print 1. Optional 2nd param fallback will be returned if json is nil or invalid. Optional 3rd param deSerialize (boolean) determines if the JSON should be deserialized before converting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fromXML(xml, fallback )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Turns a xml string to a Lua table. Example: &amp;lt;code&amp;gt;local t = domoticz.utils.fromXML(&#039;&amp;amp;lt;testtag&amp;amp;gt;What a nice feature!&amp;amp;lt;/testtag&amp;amp;gt;&#039;) Followed by:&amp;lt;/code&amp;gt;print( t.texttag)` will print What a nice feature! Optional 2nd param fallback will be returned if xml is nil or invalid.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fuzzyLookup([string|array of strings], parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.14&amp;lt;/sup&amp;gt;. Search fuzzy matching string in parm. If parm is string it returns a number (lower is better match). If parm is array of strings it returns the best matching string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;groupExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid group &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or groupID and return ID when entered with valid groupName or false when not a group, groupID or groupName of an existing group&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; returns name when entered with valid hardwareID or ID when entered with valid hardwareName or false when not a hardwareID or hardwareName of an existing (and active )hardware module&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inTable(table, searchString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &amp;lt;code&amp;gt;&amp;amp;quot;key&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as a key, &amp;lt;code&amp;gt;&amp;amp;quot;value&amp;amp;quot;&amp;lt;/code&amp;gt; if table has searchString as value and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isJSON(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘application/json’ or string is enclosed in {} and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;isXML(string[, content])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.4&amp;lt;/sup&amp;gt; Returns &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if content is ‘text/xml’ or ‘application/xml’ or string is enclosed in &amp;amp;lt;&amp;amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leftPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;centerPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Center string by preceding and succeeding with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;numDecimals(number [, integer [, decimals ]])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Format number to float representation. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        domoticz.utils.numDecimals(12.23, 4, 4) -- =&amp;gt; 12.2300,&lt;br /&gt;
        domoticz.utils.numDecimals (12.23,1,1) -- =&amp;gt; 12.2,&lt;br /&gt;
        domoticz.utils.leadingZeros(domoticz.utils.numDecimals (12.23,4,4),9) -- =&amp;gt; 0012.2300&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osCommand(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.13&amp;lt;/sup&amp;gt; Execute an OS command and return result and returncode. Note: For long running scripts &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; should be used, See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;osExecute(cmd)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Execute an OS command (no return). Note: For long running scripts &amp;lt;code&amp;gt;executeShellCommand()&amp;lt;/code&amp;gt; should be used. See [[#Asynchronous_shell_command_execution|Asynchronous shell commands]] for more information.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rightPad(string, length [, character])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Succeed string with given character(s) (default = space) to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;round(number, [decimalPlaces])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Helper function to round numbers. Default decimalPlaces is 0.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sceneExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with valid scene &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or sceneID and return ID when entered with valid sceneName or false when not a scene, sceneID or sceneName of an existing scene&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setLogMarker([marker])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: set logMarker to ‘marker’. Defaults to scriptname. Can be used to change logMarker based on flow in script&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;splitLine(string , splitOnWord ) &amp;lt;sup&amp;gt;3.1.8&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line. Return is a table with line-segments.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringSplit(string [,separator ] [,convertNumber ][,convertNil ]&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt;)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Helper function to split a line in separate words. Default separator is space. Return is a table with separated words. Default convertNumber is false when set to true it will convert strings to number where possible. Word is ignored when nil, unless convertNil is set; in that case word will be set to the convertNil value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;stringToSeconds(str)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: &amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Returns number of seconds between now and str. &#039;&#039;Examples:&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.utils.stringToSeconds(&#039;09:00&#039;)                 -- number of seconds between now and 09:00 hr.&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on fri&#039;)       -- number of seconds between now and Friday at 08:53:30&lt;br /&gt;
domoticz.utils.stringToSeconds(&#039;08:53:30 on sat, sun&#039;)  -- number of seconds between now and Saturday or Sunday at 08:53:30 ;whatever comes first&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toBase64(string)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: ) Encode a string to base64&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toCelsius(f, relative)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts temperature from Fahrenheit to Celsius along the temperature scale or when relative == true it uses the fact that 1F = 0.56C. So &amp;lt;code&amp;gt;toCelsius(5, true)&amp;lt;/code&amp;gt; returns 5F*(1/1.8) = 2.78C.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toJSON(luaTable)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a json string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;toXML(luaTable, [header])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Converts a Lua table to a xml string.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlDecode(s)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple deCoder to convert a string with escaped chars (%20, %3A and the likes) to human readable format.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;urlEncode(s, [strSub])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Simple url encoder for string so you can use them in &amp;lt;code&amp;gt;openURL()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;strSub&amp;lt;/code&amp;gt; is optional and defaults to + but you can also pass %20 if you like/need.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variableExists(parm)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: returns name when entered with a valid variable &amp;lt;sup&amp;gt;3.0.12&amp;lt;/sup&amp;gt; or variableID and return ID when entered with valid variableName or false when not a variable, variableID or variableName of an existing variable&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;leadingZeros(number, length)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Precede number with given zeros to given length.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;variables(idx/name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. A function returning a variable by it’s name or idx. See [Variable object API] (#Variable_object_API_.28user_variables.29) for the attributes. To iterate over all variables do: &amp;lt;code&amp;gt;domoticz.variables().forEach(..)&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. &#039;&#039;&#039;Note that you cannot do &amp;lt;code&amp;gt;for i, j in pairs(domoticz.variables()) do .. end&amp;lt;/code&amp;gt;&#039;&#039;&#039;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-collections-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Looping through the collections: iterators ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these collections (tables): devices, scenes, groups, variables, changedDevices and changedVariables. You cannot use the &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; functions. Therefore dzVents has four iterator methods:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Returns the item in the collection for which &amp;lt;code&amp;gt;function&amp;lt;/code&amp;gt; returns true. When no item is found &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; returns nil.&lt;br /&gt;
# &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Executes function once per array element. The function receives the item in the collection (device or variable). If the function returns &#039;&#039;false&#039;&#039;, the loop is aborted.&lt;br /&gt;
# &#039;&#039;&#039;filter(function / table)&#039;&#039;&#039;: returns items in the collection for which the function returns true. You can also provide a table with names and/or ids.&lt;br /&gt;
# &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the collection and do some calculation with it. You call it with the function and the initial value. Each iteration the function is called with the accumulator and the item in the collection. The function does something with the accumulator and returns a new value for it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;examples&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Examples: ====&lt;br /&gt;
&lt;br /&gt;
find():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myDevice = domoticz.devices().find(function(device)&lt;br /&gt;
        return device.name == &#039;myDevice&#039;&lt;br /&gt;
    end)&lt;br /&gt;
    domoticz.log(&#039;Id: &#039; .. myDevice.id)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
forEach():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().forEach(function(device)&lt;br /&gt;
        if (device.batteryLevel &amp;lt; 20) then&lt;br /&gt;
        -- do something&lt;br /&gt;
        end&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
filter():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local deadDevices = domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end)&lt;br /&gt;
    deadDevices.forEach(function(zombie)&lt;br /&gt;
        -- do something&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local livingLights = {&lt;br /&gt;
        &#039;window&#039;,&lt;br /&gt;
        &#039;couch&#039;,&lt;br /&gt;
        33, -- kitchen light id&lt;br /&gt;
    }&lt;br /&gt;
    local lights = domoticz.devices().filter(livingLights)&lt;br /&gt;
    lights.forEach(function(light)&lt;br /&gt;
        -- do something&lt;br /&gt;
        light.switchOn()&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can chain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    domoticz.devices().filter(function(device)&lt;br /&gt;
        return (device.lastUpdate.minutesAgo &amp;gt; 60)&lt;br /&gt;
    end).forEach(function(zombie)&lt;br /&gt;
        -- do something with the zombie&lt;br /&gt;
    end)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Using a reducer to count all devices that are switched on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local count = domoticz.devices().reduce(function(acc, device)&lt;br /&gt;
        if (device.state == &#039;On&#039;) then&lt;br /&gt;
            acc = acc + 1 -- increase the accumulator&lt;br /&gt;
        end&lt;br /&gt;
        return acc -- always return the accumulator&lt;br /&gt;
    end, 0) -- 0 is the initial value for the accumulator&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;constants&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
The domoticz object has these constants available for use in your code e.g. &amp;lt;code&amp;gt;domoticz.LOG_INFO&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT: you have to prefix these constants with the name of your domoticz object. Example: &amp;lt;code&amp;gt;domoticz.ALERTLEVEL_RED&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_ORANGE, ALERTLEVEL_RED, ALERTLEVEL_YELLOW&#039;&#039;&#039;: for updating text sensors.&lt;br /&gt;
* &#039;&#039;&#039;BASETYPE_CUSTOM_EVENT &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;,BASETYPE_DEVICE, BASETYPE_SCENE, BASETYPE_GROUP, BASETYPE_HARDWARE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;BASETYPE_VARIABLE, BASETYPE_SECURITY, BASETYPE_TIMER, BASETYPE_HTTP_RESPONSE, BASETYPE_SYSTEM&#039;&#039;&#039;&amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;: indicators for the various object types that are passed as the second parameter to the execute function. E.g. you can check if an object is a device object: &amp;lt;code&amp;gt;Lua  if (item.baseType == domoticz.BASETYPE_DEVICE) then ... end&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;BARO_CLOUDY, BARO_CLOUDY_RAIN, BARO_STABLE, BARO_SUNNY, BARO_THUNDERSTORM, BARO_NOINFO, BARO_UNSTABLE, BARO_COMPUTE&#039;&#039;&#039; : for updating barometric values.&lt;br /&gt;
* &#039;&#039;&#039;EVENT_TYPE_DEVICE, EVENT_TYPE_VARIABLE, EVENT_TYPE_CUSTOM&#039;&#039;&#039;, &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_SECURITY, EVENT_TYPE_HTTPRESPONSE, EVENT_TYPE_SYSTEM,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt; &#039;&#039;&#039;EVENT_TYPE_TIMER&#039;&#039;&#039;: triggerInfo types passed to the execute function in your scripts.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_TEMPORARY_OVERRIDE, EVOHOME_MODE_PERMANENT_OVERRIDE, EVOHOME_MODE_FOLLOW_SCHEDULE&#039;&#039;&#039;: mode for EvoHome system.&lt;br /&gt;
* &#039;&#039;&#039;EVOHOME_MODE_AUTO, EVOHOME_MODE_AUTOWITHRESET, EVOHOME_MODE_AUTOWITHECO, EVOHOME_MODE_AWAY, EVOHOME_MODE_DAYOFF, EVOHOME_MODE_CUSTOM, EVOHOME_MODE_HEATINGOFF&#039;&#039;&#039; : mode for EvoHome controller&lt;br /&gt;
* &#039;&#039;&#039;HUM_COMFORTABLE, HUM_DRY, HUM_NORMAL, HUM_WET, HUM_COMPUTE&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;: constant for humidity status.&lt;br /&gt;
* &#039;&#039;&#039;INTEGER, FLOAT, STRING, DATE, TIME&#039;&#039;&#039;: variable types.&lt;br /&gt;
* \**LOG_INFO, LOG_STATUS, LOG_ERROR, LOG_DEBUG, LOG_FORCE: for logging messages. LOG_FORCE will always be displayed.&lt;br /&gt;
* &#039;&#039;&#039;NSS_CLICKATELL&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_FIREBASE, NSS_FIREBASE_CLOUD_MESSAGING, NSS_GOOGLE_DEVICES,&#039;&#039;&#039; &amp;lt;sup&amp;gt;3.0.10&amp;lt;/sup&amp;gt; &amp;lt;sup&amp;gt;Only with installed casting plugin&amp;lt;/sup&amp;gt;, &#039;&#039;&#039;NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER, NSS_TELEGRAM, NSS_GOOGLE_CLOUD_MESSAGING&#039;&#039;&#039; &amp;lt;sup&amp;gt;deprecated by Google and replaced by firebase&amp;lt;/sup&amp;gt;: for notification subsystem&lt;br /&gt;
* &#039;&#039;&#039;PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY&#039;&#039;&#039;: for notification priority.&lt;br /&gt;
* &#039;&#039;&#039;SECURITY_ARMEDAWAY, SECURITY_ARMEDHOME, SECURITY_DISARMED&#039;&#039;&#039;: for security state.&lt;br /&gt;
* &#039;&#039;&#039;STATE_IDLE, STATE_COOLING, STATE_HEATING&#039;&#039;&#039;: for thermostat operating state.&lt;br /&gt;
* &#039;&#039;&#039;SOUND_ALIEN , SOUND_BIKE, SOUND_BUGLE, SOUND_CASH_REGISTER, SOUND_CLASSICAL, SOUND_CLIMB , SOUND_COSMIC, SOUND_DEFAULT, SOUND_ECHO, SOUND_FALLING, SOUND_GAMELAN, SOUND_INCOMING, SOUND_INTERMISSION, SOUND_MAGIC, SOUND_MECHANICAL, SOUND_NONE, SOUND_PERSISTENT, SOUND_PIANOBAR , SOUND_SIREN, SOUND_SPACEALARM, SOUND_TUGBOAT, SOUND_UPDOWN&#039;&#039;&#039;: for notification sounds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Custom event API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a customEvent in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;notification&#039;&#039; object. The object.type = customEvent (isCustomEvent: true) and object.data contains the passed data to this script. object.trigger is the name of the customEvent that triggered the script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-object-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device object API ==&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by switching a device in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;device&#039;&#039; object. Also, each device in Domoticz can be found in the &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; collection (see above). The device object has a set of fixed attributes like &#039;&#039;name&#039;&#039; and &#039;&#039;idx&#039;&#039;. Many devices, however, have different attributes and methods depending on their (hardware)type, subtype and other device specific identifiers. It is possible that you will get an error if you call a method on a device that doesn’t support it, so please check the device properties for your specific hardware to see which are supported (can also be done in your script code!).&lt;br /&gt;
&lt;br /&gt;
dzVents recognizes most of the different device types in Domoticz and creates the proper attributes and methods. It is possible that your device type has attributes that are not recognized; if that’s the case, please create a ticket in the Domoticz [https://github.com/domoticz/domoticz/issues issue tracker on GitHub], and an adapter for that device will be added.&lt;br /&gt;
&lt;br /&gt;
If for some reason you miss a specific attribute or data for a device, then likely the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute will have that information.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-all-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Device attributes and methods for all devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Same as bState.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;baseType&#039;&#039;&#039; &#039;&#039;String&#039;&#039;. ‘camera’, ‘device’, ‘group’, ‘scene’, ‘hardware’, ‘uservariable’ or ‘security’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;batteryLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-100.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;bState&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true for some common states like ‘On’ or ‘Open’ or ‘Motion’. Better to use active.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True if the device was updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: This does not necessarily means the device state or value changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;customImage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. When customImage is used for the device-icon this will be the icon-number. It will be 0 if the icon was not changed.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;description&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Description of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceId&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Another identifier of devices in Domoticz. dzVents uses the id(x) attribute. See device list in Domoticz’ settings table.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceSubType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deviceType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dump()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Dump all attributes except functions and complete time overview to the Domoticz log. This ignores the log level setting. Use fullDump to include everything.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;dumpSelection([{‘attributes’} ‘functions’ ‘tables’])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.5&amp;lt;/sup&amp;gt; Dump attributes, function-names or table-names to the Domoticz log. This ignores the log level setting.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;fullDump()&#039;&#039;&#039; &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.1.16&amp;lt;/sup&amp;gt; Dump all attributes including functions and the complete time overview to the Domoticz log. This ignores the log level setting. Most of the time dump() shows everything what is needed to debug.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareId&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;hardwareTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;icon&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the icon in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the device. You can find the index in the device list (idx column) in Domoticz settings. It’s not truly an index but is unique enough for dzVents to be treated as an id.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;idx&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as id: index of the device&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;inActive&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; true if active is false and vice versa. If active is nil inActive is also nil&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;: Time when the device was updated. **Note: The lastUpdate for devices that triggered the script at hand is in fact the previousUpdate time. The real lastUpdate time for these “script triggering” devices is the current time.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;nValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Numerical representation of the state.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protected&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. True when device / scene / group is protected. False otherwise.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options] !! **Note: domoticz protects against GUI and API access only. switchOn / switchOff type Blockly / Lua / dzVents commands are not influenced (because they are executed as admin user)&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rawData&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;: All values are &#039;&#039;String&#039;&#039; types and hold the raw data received from Domoticz.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current devicename to new devicename Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setDescription(description)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic method to update the description for all devices, groups and scenes. E.g.: device.setDescription(device.description .. ‘/nChanged by’.. item.trigger .. ‘at’ .. domoticz.time.raw). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setIcon(iconNumber)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. method to update the icon for devices. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setState(newState)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method for switch-like devices. E.g.: device.setState(‘On’). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;resumeTimerPlan()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Finds the most recent timer that should have fired today (before now) for this device, scene, or group and executes it immediately. Useful for restoring the correct state after a Domoticz restart or power cut. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. ```lua – Replay last timer for a device domoticz.devices(‘My Light’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a scene domoticz.scenes(‘Evening Scene’).resumeTimerPlan()&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;– Replay last timer for a group domoticz.groups(‘All Lights’).resumeTimerPlan() ```&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;setValues(nValue,[ sValue1, sValue2, …])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic alternative method to update device nValue, sValues. Uses domoticz JSON API to force subsequent pushes like influxdb and MQTT. nValue required but when set to nil it defaults to current nValue. sValue parms are optional and can be many. &amp;lt;sup&amp;gt;3.0.8&amp;lt;/sup&amp;gt; If one of sValue parms is ‘parsetrigger’, subsequent eventscripts will be triggered.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For switches, holds the state like ‘On’ or ‘Off’. For dimmers that are on, it is also ‘On’ but there is a level attribute holding the dimming level. &#039;&#039;&#039;For selector switches&#039;&#039;&#039; (Dummy switch) the state holds the &#039;&#039;name&#039;&#039; of the currently selected level. The corresponding numeric level of this state can be found in the &#039;&#039;&#039;rawData&#039;&#039;&#039; attribute: &amp;lt;code&amp;gt;device.rawData[1]&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;signalLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; If applicable for that device then it will be from 0-12&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchType&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. See Domoticz devices table in Domoticz GUI(Switches tab). E.g. ‘On/Off’, ‘Door Contact’, ‘Motion Sensor’ or ‘Blinds’&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sValue&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the sValue (string Value) of a device.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;switchTypeValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. See Domoticz devices table in Domoticz GUI.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;timedOut&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Is true when the device couldn’t be reached.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;unit&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Device unit. See device list in Domoticz’ settings for the unit.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;update(&amp;amp;lt; params &amp;amp;gt;)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Generic update method. Accepts any number of parameters that will be sent back to Domoticz. There is no need to pass the device.id here. It will be passed for you. Example to update a temperature: &amp;lt;code&amp;gt;device.update(0,12)&amp;lt;/code&amp;gt;. This will eventually result in a commandArray entry &amp;lt;code&amp;gt;[&#039;UpdateDevice&#039;]=&#039;&amp;amp;lt;idx&amp;amp;gt;|0|12&#039;&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;updateQuiet(nValue, sValue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Uses the JSON/API to send nValue and/or sValue to domoticz (at least one should be supplied). Will update the device status in the GUI and trigger events but will not execute the action on the device. Only useful when the status in the GUI is not in line with the actual status. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;device-attributes-and-methods-for-specific-devices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Device attributes and methods for specific devices ===&lt;br /&gt;
&lt;br /&gt;
Note that if you do not find your specific device type here you can always inspect what is in the &amp;lt;code&amp;gt;rawData&amp;lt;/code&amp;gt; attribute. Please let us know that it is missing so we can write an adapter for it (or you can write your own and submit it). Calling &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; will dump all attributes and values for myDevice to the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;air-quality&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Air quality ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;co2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. PPM&lt;br /&gt;
* &#039;&#039;&#039;quality&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Air quality string.&lt;br /&gt;
* &#039;&#039;&#039;updateAirQuality(ppm)&#039;&#039;&#039;: Pass the CO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; concentration. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;alert-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Alert sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Color of the alert. See domoticz color constants for possible values.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateAlertSensor(level, text)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Level can be domoticz.ALERTLEVEL_GREY, ALERTLEVEL_GREEN, ALERTLEVEL_YELLOW, ALERTLEVEL_ORANGE, ALERTLEVEL_RED. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-1-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 1-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Current in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ampère-3-phase&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Ampère, 3-phase ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;current1&#039;&#039;&#039;, &#039;&#039;&#039;current2&#039;&#039;&#039;, &#039;&#039;&#039;current3&#039;&#039;&#039; : &#039;&#039;Number&#039;&#039;. Ampère.&lt;br /&gt;
* &#039;&#039;&#039;updateCurrent(current1, current2, current3)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Currents in Ampère. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. Barometric pressure.&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateBarometer(pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update barometric pressure. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;counter-managed-counter-counter-incremental&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Counter, managed Counter, counter incremental ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Today’s counter value.&lt;br /&gt;
* &#039;&#039;&#039;updateCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. &#039;&#039;&#039;Overwrite current value for managed and standard counters; increment for incremental counters !!&#039;&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;updateHistory( date, sValues )&#039;&#039;&#039;: &#039;&#039;Strings&#039;&#039; &amp;lt;sup&amp;gt;3.1.3&amp;lt;/sup&amp;gt; &#039;&#039;function&#039;&#039; Managed counter only! Used to write values to short or long term storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local mCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22&#039;, &#039;10;1777193&#039;) -- Write to long term storage (meter_calendar table)&lt;br /&gt;
    mCounter.updateHistory(&#039;2021-01-22 10:05:02&#039;, &#039;10;1777193&#039;) -- Write to short term storage (meter table)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;incrementCounter(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (counter incremental) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. To update with a complete new value you will have to do some calculation and take the counter divider into account.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local newValue = value&lt;br /&gt;
    local iCounter = domoticz.devices(&#039;device name&#039;)&lt;br /&gt;
    local counterDivider = x -- x is depending on the counter divider set for the device&lt;br /&gt;
    iCounter.incrementCounter( ( -1 * iCounter.counter * counterDivider ) + newValue )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;valueQuantity&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. For counters.&lt;br /&gt;
* &#039;&#039;&#039;valueUnits&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;custom-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Custom sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sensorType&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;sensorUnit&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;sensorValue&#039;&#039;&#039;: &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; &#039;&#039;Number&#039;&#039; where applicable; else &#039;&#039;String&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;updateCustomSensor(value)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;distance-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Distance sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateDistance(distance)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;electric-usage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Electric usage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current Watt usage. (please use actualWatt)&lt;br /&gt;
* &#039;&#039;&#039;updateEnergy(energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. In Watt. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-controller&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (controller) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; &amp;lt;sup&amp;gt;3.0.0&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;setMode(mode, dparm, action, ooc )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set mode for controller. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_AUTOWITHRESET, domoticz.EVOHOME_MODE_AUTOWITHECO, domoticz.EVOHOME_MODE_AWAY, domoticz.EVOHOME_MODE_DAYOFF, domoticz.EVOHOME_MODE_CUSTOM or domoticz.EVOHOME_MODE_HEATINGOFF. dParm &amp;lt;optional&amp;gt; can be a future time string (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;), a future time object, a future time as number of seconds since epoch or a number representing a positive offset in minutes (max 1 year). action &amp;lt;optional&amp;gt; (1 = run on action script, 0 = disable), ooc &amp;lt;optional&amp;gt; (1 = only trigger the event &amp;amp;amp; log on change, 0 = always trigger &amp;amp;amp; log)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-hotwater&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (hotWater) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a.&lt;br /&gt;
* &#039;&#039;&#039;setHotWater(state, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set HotWater Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE You can provide an until date (in ISO 8601 format for domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-relay&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (relay) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; (‘On’ or ‘Off’)&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;number&#039;&#039; (level percentage)&lt;br /&gt;
* &#039;&#039;&#039;active&#039;&#039;&#039;: &#039;&#039;boolean&#039;&#039; (true when state is not equal to ‘Off’, false otherwise)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;evohome-zones&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Evohome (zones) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;string&#039;&#039; .&lt;br /&gt;
* &#039;&#039;&#039;untilDate&#039;&#039;&#039;: &#039;&#039;string in ISO 8601 format&#039;&#039; or n/a .&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint, mode, until)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update set point. Mode can be domoticz.EVOHOME_MODE_AUTO, domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE, domoticz.EVOHOME_MODE_FOLLOW_SCHEDULE or domoticz.EVOHOME_MODE_PERMANENT_OVERRIDE. You can provide an until date (in ISO 8601 format e.g.: &amp;lt;code&amp;gt;os.date(&amp;amp;quot;!%Y-%m-%dT%TZ&amp;amp;quot;)&amp;lt;/code&amp;gt;). When leaving out untilDate for mode domoticz.EVOHOME_MODE_TEMPORARY_OVERRIDE the untilDate will be the next scheduled zone-update time/date. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gas&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gas ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value in m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;updateGas(usage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Usage in &#039;&#039;&#039;dm&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&#039;&#039;&#039; (liters). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current group-name to new group-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleGroup()&#039;&#039;&#039;: Toggles the state of a group. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hardware-3.0.7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hardware &amp;lt;sup&amp;gt;3.0.7&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;isHardware&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;isPythonPlugin&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: : &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;typeValue&#039;&#039;&#039;: : &#039;&#039;Number&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;humidity-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Humidity sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;updateHumidity(humidity, status)&#039;&#039;&#039;: Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kodi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Kodi ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;kodiExecuteAddOn(addonId)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. 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;
* &#039;&#039;&#039;kodiPause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Pause command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlay()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Play command, only effective if the device was streaming and has been paused.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play an item from the Kodi’s Favorites list optionally starting at &#039;&#039;position&#039;&#039;. Favorite positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiPlayPlaylist(name, [position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will play a music or video Smart Playlist with &#039;&#039;name&#039;&#039; optionally starting at &#039;&#039;position&#039;&#039;. Playlist positions start from 0 which is the default.&lt;br /&gt;
* &#039;&#039;&#039;kodiSetVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the volume for a Kodi device, 0 &amp;amp;lt;= level &amp;amp;lt;= 100.&lt;br /&gt;
* &#039;&#039;&#039;kodiStop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will send a Stop command, only effective if the device is streaming.&lt;br /&gt;
* &#039;&#039;&#039;kodiSwitchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device off if this is supported in settings on the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kwh-electricity-instant-and-counter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== kWh, Electricity (instant and counter) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actualWatt&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual usage in Watt.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateElectricity(power, energy)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WhToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage of the day. Note the unit is Wh and not kWh!&lt;br /&gt;
* &#039;&#039;&#039;WhTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Total Wh usage.&lt;br /&gt;
* &#039;&#039;&#039;WhActual&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Actual reading in Watt. Please use actualWatt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;leaf-wetness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Leaf wetness ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;wetness&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Wetness value&lt;br /&gt;
* &#039;&#039;&#039;updateWetness(wetness)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;logitech-media-server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Logitech Media Server ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pause()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will pause the device if it was streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;play()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. If the device was off, it will turn on and start streaming. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playFavorites([position])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the favorites playlist. &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; is optional (0 = default). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;playlistID&#039;&#039;&#039;: &#039;&#039;Nubmer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;setVolume(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the volume (0 &amp;amp;lt;= level &amp;amp;lt;= 100). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;startPlaylist(name)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will start the playlist by its &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will stop the device (only effective if the device is streaming). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeUp()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume up with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;volumeDown()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Will turn the device volume down with 2 points. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lux-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lux sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lux&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Lux level for light sensors.&lt;br /&gt;
* &#039;&#039;&#039;updateLux(lux)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;onkyo-receiver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Onkyo receiver ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;onkyoEISCPCommand(command)&#039;&#039;&#039;. &#039;&#039;Function&#039;&#039;. Sends an EISP command to the Onkyo receiver.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;opentherm-gateway&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenTherm gateway ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;p1-smart-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== P1 Smart meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usage1&#039;&#039;&#039;, &#039;&#039;&#039;usage2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;return1&#039;&#039;&#039;, &#039;&#039;&#039;return2&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateP1(usage1, usage2, return1, return2, cons, prod)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Updates the device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;usage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;usageDelivered&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;percentage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Percentage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;percentage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePercentage(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;philips-hue-light&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Philips Hue Light ====&lt;br /&gt;
&lt;br /&gt;
See switch below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pressure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Pressure ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;pressure&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updatePressure(pressure)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rain-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Rain meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;rain&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; (please note that this does return the rain total for today)&lt;br /&gt;
* &#039;&#039;&#039;rainRate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateRain(rate, counter)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. (rate in mm * 100 per hour, counter is total in mm) Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rgbww-lighting-limitlessapplamp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== RGBW(W) / Lighting Limitless/Applamp ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;decreaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;getColor()&#039;&#039;&#039;; &#039;&#039;Function&#039;&#039;. Returns table with color attributes or nil when color field of device is not set.&lt;br /&gt;
* &#039;&#039;&#039;increaseBrightness()&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setColor(r, g, b, br, cw, ww, m, t)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required, others optional. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. Meaning and limits of parms can be found [https://wiki.domoticz.com/Domoticz_API/JSON_URL&#039;s#Set_a_light_to_a_certain_color_or_color_temperature here].&lt;br /&gt;
* &#039;&#039;&#039;setColorBrightness()&#039;&#039;&#039;: same as setColor&lt;br /&gt;
* &#039;&#039;&#039;setDiscoMode(modeNum)&#039;&#039;&#039;: deprecated because only very limited supported and will be removed from API&lt;br /&gt;
* &#039;&#039;&#039;setHex(r, g, b)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested color. r, g, b required (decimal Values 0-255). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setHue(hue, brightness, isWhite)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the light to requested Hue. Hue and brightness required. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setKelvin(Kelvin)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets Kelvin level of the light (For RGBWW devices only). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setNightMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to night mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setRGB(red, green, blue)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set the lamps RGB color. Values are from 0-255. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setWhiteMode()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Sets the lamp to white mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scale-weight&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scale weight ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;weight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;udateWeight()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scene&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scene ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;devices()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the collection of associated devices. Supports the same iterators as for &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt;. See [[#Looping_through_the_collections:_iterators|Looping through the collections: iterators]]. Note that the function doesn’t allow you to get a device by its name or id. Use &amp;lt;code&amp;gt;domoticz.devices()&amp;lt;/code&amp;gt; for that.&lt;br /&gt;
* &#039;&#039;&#039;protectionOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to off. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;protectionOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. switch protection to on. Supports some [command options]&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current scene-name to new scene-name Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security-panel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Security Panel ====&lt;br /&gt;
&lt;br /&gt;
Create a security device:&lt;br /&gt;
&lt;br /&gt;
# Set a security panel password in Domoticz settings.&lt;br /&gt;
# Activate the security panel (&#039;&#039;&#039;Setup &amp;amp;gt; More Options &amp;amp;gt; Security Panel&#039;&#039;&#039; and set it to &#039;&#039;&#039;Disarm&#039;&#039;&#039; (using your password)).&lt;br /&gt;
# Go to the device list in (&#039;&#039;&#039;Setup &amp;amp;gt; Devices&#039;&#039;&#039;) where it should show the security panel device under ‘Not used’.&lt;br /&gt;
# Add the device and give it a name.&lt;br /&gt;
&lt;br /&gt;
Methods/attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;armAway()&#039;&#039;&#039;: Sets a security device to Armed Away. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;armHome()&#039;&#039;&#039;: Sets a security device to Armed Home. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;disarm()&#039;&#039;&#039;: Disarms a security device. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;: Same values as domoticz.security value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;smoke-detection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Smoke detection ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;activate()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;reset()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;solar-radiation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Solar radiation ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;radiation&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In Watt/m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;updateRadiation(radiation)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;soil-moisture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Soil moisture ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;moisture&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In centibars (cB).&lt;br /&gt;
* &#039;&#039;&#039;updateSoilMoisture(moisture)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sound-level&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sound level ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;. &#039;&#039;Number&#039;&#039;. In dB.&lt;br /&gt;
* &#039;&#039;&#039;updateSoundLevel(level)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;switch-dimmer-selector-etc.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Switch (dimmer, selector etc.) ====&lt;br /&gt;
&lt;br /&gt;
There are many switch-like devices. Not all methods are applicable for all switch-like devices. You can always use the generic &amp;lt;code&amp;gt;setState(newState)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;close()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Close if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;dimTo(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch a dimming device on and/or dim to the specified level. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;lastLevel&#039;&#039;&#039;: Number. The level of a dimmer just before it was switched off. &#039;&#039;&#039;Note: lastLevel only shows you the previous level if you have a trigger for the device itself. So for instance you have a on-trigger for ‘myDimmer’ and the dimmer is set from 20% to 30%, in your script &amp;lt;code&amp;gt;myDimmer.level == 30&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myDimmer.lastLevel == 20&amp;lt;/code&amp;gt;. &#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;level&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. For dimmers and other ‘Set Level..%’ devices this holds the level like selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelActions&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. |-separated list of url actions for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current level name for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;levelNames&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Table holding the level names for selector switch devices.&lt;br /&gt;
* &#039;&#039;&#039;levelVal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Specific for selector switches.&lt;br /&gt;
* &#039;&#039;&#039;maxDimLevel&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;open()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Open if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set deviceStatus to on without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;quietOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. set deviceStatus to off without physically switching it. Subsequent Events are triggered. Supports some [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;setLevel(percentage)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to a given level if it supports it (e.g. blinds percentage). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;stop()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set device to Stop if it supports it (e.g. blinds). Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOff()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device off it is supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchOn()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Switch device on if it supports it. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;switchSelector(&amp;amp;lt;[level]|[levelname] &amp;amp;gt;)&#039;&#039;&#039; : &#039;&#039;Function&#039;&#039;. Switches a selector switch to a specific level ( levelname or level(numeric) required ) levelname must be exact, for level the closest fit will be picked. See the edit page in Domoticz for such a switch to get a list of the values). Levelname is only supported when level 0 (“Off”) is not removed Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
* &#039;&#039;&#039;toggleSwitch()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Toggles the state of the switch (if it is togglable) like On/Off, Open/Close etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTemperature(temperature)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempBaro(temperature, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Forecast can be domoticz.BARO_STABLE, BARO_SUNNY, BARO_CLOUDY, BARO_UNSTABLE, BARO_THUNDERSTORM. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity-barometer-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity, Barometer sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;barometer&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;forecast&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;forecastString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHumBaro(temperature, humidity, status, pressure, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. forecast can be domoticz.BARO_NOINFO, BARO_SUNNY, BARO_PARTLY_CLOUDY, BARO_CLOUDY, BARO_RAIN. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET, HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;temperature-humidity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Temperature, Humidity ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dewPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidity&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatus&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Value matches with domoticz.HUM_NORMAL, -HUM_DRY, HUM_COMFORTABLE, -HUM_WET.&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateTempHum(temperature, humidity [, status] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET or HUM_COMPUTE (let dzVents do the math)&amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt;. Note: temperature must be in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Text ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;updateText(text)&#039;&#039;&#039;: Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-set-point&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat set point ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-operating-state-3.0.19&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat Operating state &amp;lt;sup&amp;gt;3.0.19&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-type-3-mertik-3.0.15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat type 3 (Mertik) &amp;lt;sup&amp;gt;3.0.15&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. List of all modes&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Current mode&lt;br /&gt;
* &#039;&#039;&#039;updateMode(mode)&#039;&#039;&#039;:&#039;&#039;Function&#039;&#039;. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;thermostat-6-3.1.11&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Thermostat 6 &amp;lt;sup&amp;gt;3.1.11&amp;lt;/sup&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Thermostat 6 devices come in several subtypes: Temp/Setpoint, Temp/Hum/Setpoint, Temp/Baro/Setpoint and Temp/Hum/Baro/Setpoint. - &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. The current set point. - &#039;&#039;&#039;humidityStatusValue&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Mapped humidity status value (only for subtypes with humidity). - &#039;&#039;&#039;updateSetPoint(setPoint)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update the set point. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]]. - &#039;&#039;&#039;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Update thermostat values. Parameters depend on the subtype: - &#039;&#039;Temp/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint)&amp;lt;/code&amp;gt; - &#039;&#039;Temp/Hum/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus)&amp;lt;/code&amp;gt; - &#039;&#039;Temp/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, nil, nil, barometer, forecast)&amp;lt;/code&amp;gt; - &#039;&#039;Temp/Hum/Baro/Setpoint&#039;&#039;: &amp;lt;code&amp;gt;updateThermostat(temperature, setPoint, humidity, humidityStatus, barometer, forecast)&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;forecast&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;noinfo&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;sunny&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;partlycloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;cloudy&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;rain&#039;&amp;lt;/code&amp;gt; or a numeric value. - &amp;lt;code&amp;gt;humidityStatus&amp;lt;/code&amp;gt; can be a string: &amp;lt;code&amp;gt;&#039;dry&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;normal&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;comfortable&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;wet&#039;&amp;lt;/code&amp;gt; or a numeric value. If omitted with humidity provided, it is auto-calculated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;uv-sensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UV sensor ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;uv&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. UV index.&lt;br /&gt;
* &#039;&#039;&#039;updateUV(uv)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. UV index. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;visibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Visibility ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;visibility&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In km.&lt;br /&gt;
* &#039;&#039;&#039;updateVisibility(distance)&#039;&#039;&#039;:Function*. In km. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;voltage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Voltage ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;voltage&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateVoltage(voltage)&#039;&#039;&#039;:Function*. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;waterflow&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Waterflow ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flow&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. In L/m.&lt;br /&gt;
* &#039;&#039;&#039;updateWaterflow(flow)&#039;&#039;&#039;:Function*. In L/m. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wind&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Wind ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;chill&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;direction&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Degrees.&lt;br /&gt;
* &#039;&#039;&#039;directionString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Formatted wind direction like N, SE.&lt;br /&gt;
* &#039;&#039;&#039;gust&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. ( in meters / second, might change in future releases to Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;gustMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Gust ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;temperature&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;speed&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in the unit set in Meters/Counters settings for Wind Meter )&lt;br /&gt;
* &#039;&#039;&#039;speedMs&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Windspeed ( in meters / second )&lt;br /&gt;
* &#039;&#039;&#039;updateWind(bearing, direction, speed, gust, temperature, chill)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Bearing in degrees, direction in N, S, NNW etc, speed in m/s, gust in m/s, temperature and chill in Celsius. Use &amp;lt;code&amp;gt;domoticz.toCelsius()&amp;lt;/code&amp;gt; to convert a Fahrenheit temperature to Celsius. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;youless-meter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Youless meter ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredToday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;counterDeliveredTotal&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;powerYield&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;updateYouless(total, actual)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zone-heating&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Zone heating ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;setPoint&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;heatingMode&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-fan-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Fan mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;z-wave-thermostat-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Z-Wave Thermostat mode ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Current mode number.&lt;br /&gt;
* &#039;&#039;&#039;modeString&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Mode name.&lt;br /&gt;
* &#039;&#039;&#039;modes&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Lists all available modes.&lt;br /&gt;
* &#039;&#039;&#039;updateMode(modeString)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Set new mode. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;command-options-delay-duration-event-triggering&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Command options (delay, duration, event triggering) ===&lt;br /&gt;
&lt;br /&gt;
Many dzVents device methods support extra options, like controlling a delay or a duration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
    -- switch on for 2 minutes after 10 seconds&lt;br /&gt;
    device.switchOn().afterSec(10).forMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on at a specic time / day&lt;br /&gt;
    device.switchOn().at(&#039;09:00&#039;)                   -- earliest moment it will be 09:00 hr.&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on fri&#039;)         -- earliest moment it will be Friday at 08:53:30&lt;br /&gt;
    device.switchOn().at(&#039;08:53:30 on sat, sun&#039;)    -- earliest moment it will be Saturday or Sunday at 08:53:30 (whatever comes first)&lt;br /&gt;
&lt;br /&gt;
    -- switch on for 2 minutes after a randomized delay of 1-10 minutes&lt;br /&gt;
    device.switchOff().withinMin(10).forMin(2)&lt;br /&gt;
    device.close().forMin(15)&lt;br /&gt;
    device.open().afterSec(20)&lt;br /&gt;
    device.open().afterMin(2)&lt;br /&gt;
&lt;br /&gt;
    -- switch on but do not trigger follow up events&lt;br /&gt;
    device.switchOn().silent()&lt;br /&gt;
&lt;br /&gt;
    -- flash a light for 3 times&lt;br /&gt;
    device.switchOn().forSec(2).repeatAfterSec(1, 3)&lt;br /&gt;
&lt;br /&gt;
    -- switch the device on but only if the current state isn&#039;t already on:&lt;br /&gt;
    device.switchOn().checkFirst()&lt;br /&gt;
    -- this is a short for:&lt;br /&gt;
    if (device.state == &#039;Off&#039;) then&lt;br /&gt;
        devices.switchOn()&lt;br /&gt;
    end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;options&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Options ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;at(hh:mm[:ss][ on [ ddd|dddd ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;.&amp;lt;sup&amp;gt;3.0.1&amp;lt;/sup&amp;gt; Activates the command at a certain time [ on a certain day]&lt;br /&gt;
* &#039;&#039;&#039;afterHour(hours), afterMin(minutes), afterSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command after a certain number of hours, minutes or seconds.&lt;br /&gt;
* &#039;&#039;&#039;cancelQueuedCommands()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Cancels queued commands. E.g. you switch on a device after 10 minutes: &amp;lt;code&amp;gt;myDevice.switchOn().afterMin(10)&amp;lt;/code&amp;gt;. Within those 10 minutes you can cancel that command by calling: &amp;lt;code&amp;gt;myDevice.cancelQueuedCommands()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;checkFirst()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Checks if the &#039;&#039;&#039;current&#039;&#039;&#039; state of the device is different than the desired new state. If the target state is the same, no command is sent. If you do &amp;lt;code&amp;gt;mySwitch.switchOn().checkFirst()&amp;lt;/code&amp;gt;, then no switch command is sent if the switch is already on. This command only works with switch-like devices. It is not available for toggle and dim commands, either.&lt;br /&gt;
* &#039;&#039;&#039;forHour(hours), forMin(minutes), forSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command for the duration of hours, minutes or seconds. See table below for applicability and the warning on unexpected behavior of these functions.&lt;br /&gt;
* &#039;&#039;&#039;withinHour(hours), withinMin(minutes), withinSec(seconds)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Activates the command within a certain period (specified in hours, minutes or seconds) &#039;&#039;randomly&#039;&#039;. See table below for applicability.&lt;br /&gt;
* &#039;&#039;&#039;silent()&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. No follow-up events will be triggered: &amp;lt;code&amp;gt;mySwitch.switchOff().silent()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;repeatAfterHour(hours, [number]), repeatAfterMin(minutes, [number]), repeatAfterSec(seconds, [number])&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Repeats the sequence &#039;&#039;number&#039;&#039; times after the specified duration (specified in hours, minutes, or seconds). If no &#039;&#039;number&#039;&#039; is provided, 1 is used. &#039;&#039;&#039;Note that &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; are only applied at the beginning of the sequence and not between the repeats!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note that the actual switching or changing of the device is done by Domoticz and not by dzVents. dzVents only tells Domoticz what to do; if the options are not carried out as expected, this is likely a Domoticz or hardware issue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note when using forAAA()&#039;&#039;&#039;: Let’s say you have a light that is triggered by a motion detector. Currently the light is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt; and you do this: &amp;lt;code&amp;gt;light.switchOn().forMin(5)&amp;lt;/code&amp;gt;. What happens inside Domoticz is this: at t&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; Domoticz issues the &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command and schedules a command to restore the &#039;&#039;&#039;current&#039;&#039;&#039; state at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; which is &amp;lt;code&amp;gt;Off&amp;lt;/code&amp;gt;. So at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; it will switch the light off.&lt;br /&gt;
&lt;br /&gt;
If, however, &#039;&#039;before the scheduled &amp;lt;code&amp;gt;switchOff()&amp;lt;/code&amp;gt; happens at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&#039;&#039;, new motion is detected and you send this command again at t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; then something unpredictable may seem to happen: &#039;&#039;the light is never turned off!&#039;&#039; This is what happens:&lt;br /&gt;
&lt;br /&gt;
At t&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; Domoticz receives the &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; command again. It sees a scheduled command at t&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt; and deletes that command (it is within the new interval). Then Domoticz performs the (unnecessary, it’s already on) &amp;lt;code&amp;gt;switchOn()&amp;lt;/code&amp;gt; command. Then it checks the current state of the light which is &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;!! and schedules a command to return to that state at t&amp;lt;sub&amp;gt;2+5&amp;lt;/sub&amp;gt;=t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt;. So, at t&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; the light is switched on again. And there you have it: the light is not switched off and never will be because future commands will always be checked against the current on-state.&lt;br /&gt;
&lt;br /&gt;
That’s just how it works and you will have to deal with it in your script. So, instead of simply re-issuing &amp;lt;code&amp;gt;switchOn().forMin(5)&amp;lt;/code&amp;gt; you have to check the switch’s state first:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;if (light.active) then&lt;br /&gt;
    light.switchOff().afterMin(5)&lt;br /&gt;
else&lt;br /&gt;
    light.switchOn().forMin(5)&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or issue these two commands &#039;&#039;both&#039;&#039; as they are mutually exclusive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;light.switchOff().checkFirst().afterMin(5)&lt;br /&gt;
light.switchOn().checkFirst().forMin(5)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Availability ====&lt;br /&gt;
&lt;br /&gt;
Some options are not available to all commands. All the options are available to device switch-like commands like &amp;lt;code&amp;gt;myDevice.switchOff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myGroup.switchOn()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;myBlinds.open()&amp;lt;/code&amp;gt;. For updating (usually Dummy ) devices like a text device &amp;lt;code&amp;gt;myTextDevice.updateText(&#039;zork&#039;)&amp;lt;/code&amp;gt; you can only use &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;. For thermostat setpoint devices and snapshot command silent() is not available. For commands for which dzVents must use openURL, only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; methods are available. These commands are mainly the setAaaaa() commands for RGBW type devices.&lt;br /&gt;
&lt;br /&gt;
See table below&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!width=&amp;quot;17%&amp;quot;| option&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| state changes&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;11%&amp;quot;| update commands&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| user variables&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| updateSetpoint&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;8%&amp;quot;| snapshot&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;10%&amp;quot;| triggerIFTTT&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| execute ShellCommand&lt;br /&gt;
!align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| emitEvent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;silent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repeatAfterAAA()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;checkFirst()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| • &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancelQueuedCommands()&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| •&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
|align=&amp;quot;center&amp;quot;| n/a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;span id=&amp;quot;notes-on-table&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Notes on table ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note 1&#039;&#039;&#039;: AAA is a placeholder for &amp;lt;code&amp;gt;Min/Sec/Hour&amp;lt;/code&amp;gt; affix e.g. &amp;lt;code&amp;gt;afterMin()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Note 2&#039;&#039;&#039;: for &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; only &amp;lt;code&amp;gt;at()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;afterAAA()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;withinAAA()&amp;lt;/code&amp;gt; is available.&lt;br /&gt;
* &#039;&#039;&#039;Note 3&#039;&#039;&#039;: Note 2 also applies for all commands depending on openURL (like rgbwwDevice.setAaa() commands).&lt;br /&gt;
* &#039;&#039;&#039;Note 4&#039;&#039;&#039;: Including dimTo, switchSelector, setLevel and similar methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;follow-up-event-triggers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Follow-up event triggers ====&lt;br /&gt;
&lt;br /&gt;
Normally if you issue a command, Domoticz will immediately trigger follow-up events, and dzVents will automatically trigger defined event scripts. If you trigger a scene, all devices in that scene will issue a change event. If you have event triggers for these devices, they will be executed by dzVents. If you don’t want this to happen, add &amp;lt;code&amp;gt;.silent()&amp;lt;/code&amp;gt; to your commands (exception is updateSetPoint).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-your-own-device-adapter&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create your own device adapter ===&lt;br /&gt;
&lt;br /&gt;
If your device is not recognized by dzVents, you can still operate it using the generic device attributes and methods. It is much nicer, however, to have device specific attributes and methods. Existing recognized adapters are in &amp;lt;code&amp;gt;/path/to/domoticz/dzVents/runtime/device-adapters&amp;lt;/code&amp;gt;. Copy an existing adapter and adapt it to your needs. You can turn debug logging on and inspect the file &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; in the dzVents folder. There you will find the unique signature for your device type. Usually it is a combination of deviceType and deviceSubType, but you can use any of the device attributes in the &amp;lt;code&amp;gt;matches&amp;lt;/code&amp;gt; function. The matches function checks if the device type is suitable for your adapter and the &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt; function actually creates your specific attributes and methods. Also, if you call &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; you will see all attributes and methods and the attribute &amp;lt;code&amp;gt;_adapters&amp;lt;/code&amp;gt; shows you a list of applied adapters for that device. Finally, register your adapter in &amp;lt;code&amp;gt;Adapters.lua&amp;lt;/code&amp;gt;. Please share your adapter when it is ready and working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-object-api-user-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Variable object API (user variables) ==&lt;br /&gt;
&lt;br /&gt;
User variables created in Domoticz have these attributes and methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;variable-attributes-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Variable attributes and methods ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;changed&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Was the variable updated. &#039;&#039;&#039;Note&#039;&#039;&#039;: update does not necessarily means the variable value or type changed.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.DATE. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Index of the variable.&lt;br /&gt;
* &#039;&#039;&#039;lastUpdate&#039;&#039;&#039;: &#039;&#039;[[#Time_object|Time Object]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;name&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Name of the variable&lt;br /&gt;
* &#039;&#039;&#039;rename(newName)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Change current variable name to new variable name. (does not support timing options)&lt;br /&gt;
* &#039;&#039;&#039;set(value)&#039;&#039;&#039;: Tells Domoticz to update the variable. Supports timing options. See [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|above]].&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;Date&#039;&#039;. If type is domoticz.TIME. See lastUpdate for the sub-attributes.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Can be domoticz.INTEGER, domoticz.FLOAT, domoticz.STRING, domoticz.DATE, domoticz.TIME.&lt;br /&gt;
* &#039;&#039;&#039;value&#039;&#039;&#039;: &#039;&#039;String|Number|Date|Time&#039;&#039;. Value of the variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
return&lt;br /&gt;
{&lt;br /&gt;
	on =&lt;br /&gt;
	{&lt;br /&gt;
		timer = {&#039;Every 10 minutes on mon,tue,wed,thu,fri&#039;}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	execute = function(domoticz)&lt;br /&gt;
		-- check time of the day&lt;br /&gt;
		if (domoticz.time.isDayTime and domoticz.variables(&#039;myVar&#039;).value == 10) then&lt;br /&gt;
			domoticz.variables(&#039;anotherVar&#039;).set(15)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time object ==&lt;br /&gt;
&lt;br /&gt;
Many attributes represent a moment in time, like &amp;lt;code&amp;gt;myDevice.lastUpdate&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;domoticz.time&amp;lt;/code&amp;gt;. In dzVents, a time-like attribute is an object with properties and methods which make your life easier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    print(myDevice.lastUpdate.minutesAgo)&lt;br /&gt;
    print(myDevice.lastUpdate.daysAgo)&lt;br /&gt;
&lt;br /&gt;
    -- compare two times&lt;br /&gt;
    print(domoticz.time.compare(myDevice.lastUpdate).secs))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can also create your own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;) -- must be this format!!&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you don’t pass a time string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local currentTime = Time()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use this in combination with the various dzVents time attributes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local Time = require(&#039;Time&#039;)&lt;br /&gt;
    local t = Time(&#039;2016-12-12 07:35:00&#039;)&lt;br /&gt;
&lt;br /&gt;
    local tonight = Time(domoticz.time.rawDate .. &#039; 20:00:00&#039;)&lt;br /&gt;
    print (tonight.getISO())&lt;br /&gt;
    -- will print something like: 2016-12-12T20:00:00Z&lt;br /&gt;
    print(t.minutesAgo) -- difference from &#039;now&#039; in minutes&lt;br /&gt;
&lt;br /&gt;
    -- and you can feed it with all same rules as you use&lt;br /&gt;
    -- for the timer = { .. } section:&lt;br /&gt;
    if (t.matchesRule(&#039;at 16:00-21:00&#039;)) then&lt;br /&gt;
        -- t is in between 16:00 and 21:00&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- very powerful if you want to compare two time instances:&lt;br /&gt;
    local anotherTime = Time(&#039;...&#039;) -- fill-in some time here&lt;br /&gt;
    print(t.compare(anotherTime).secs) -- diff in seconds between t and anotherTime.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;system-event-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== System event API ===&lt;br /&gt;
&lt;br /&gt;
If you have a dzVents script that is triggered by a system-event in Domoticz then the second parameter passed to the execute function will be a &#039;&#039;system&#039;&#039; object. The object.type = system-event that triggered the script. ( object.isSystemEvent: true) For backups the object also contains location and durationin seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-properties-and-methods&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Time properties and methods ===&lt;br /&gt;
&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local Time = require(&#039;Time&#039;)&lt;br /&gt;
local now = Time() -- current time&lt;br /&gt;
local someTime = Time(&#039;2017-12-31 22:19:15&#039;)&lt;br /&gt;
local utcTime = Time(&#039;2017-12-31 22:19:15&#039;, true)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Creation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local someTime = domoticz.time.addMinutes(30) -- someTime = domoticz time object for now + 30 minutes&lt;br /&gt;
local someTime = domoticz.time.makeTime() -- someTime = new domoticz time object.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;addAAA(offset)&#039;&#039;&#039;: &#039;&#039;time object&#039;&#039;. time object with given offset (positive or negative. AAA is a placeholder for &amp;lt;code&amp;gt;Seconds, Minutes, Hours or Days&amp;lt;/code&amp;gt; affix e.g. `addHours(-2)&lt;br /&gt;
* &#039;&#039;&#039;civTwilightEndInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightEnd.&lt;br /&gt;
* &#039;&#039;&#039;civTwilightStartInMinutes&#039;&#039;&#039;:&#039;&#039;Number&#039;&#039;. Minutes from midnight until civTwilightStart.&lt;br /&gt;
* &#039;&#039;&#039;compare(time)&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Compares the current time object with another time object. &#039;&#039;Make sure you pass a Time object!&#039;&#039; Returns a table (all values are &#039;&#039;positive&#039;&#039;, use the compare property to see if &#039;&#039;time&#039;&#039; is in the past or future):&lt;br /&gt;
** &#039;&#039;&#039;milliseconds&#039;&#039;&#039;: Total difference in milliseconds.&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: Total difference in whole seconds.&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: Total difference in whole minutes.&lt;br /&gt;
** &#039;&#039;&#039;hours&#039;&#039;&#039;: Total difference in whole hours.&lt;br /&gt;
** &#039;&#039;&#039;days&#039;&#039;&#039;: Total difference in whole days.&lt;br /&gt;
** &#039;&#039;&#039;compare&#039;&#039;&#039;: 0 = both are equal, 1 = &#039;&#039;time&#039;&#039; is in the future, -1 = &#039;&#039;time&#039;&#039; is in the past.&lt;br /&gt;
* &#039;&#039;&#039;dateToDate( dateString, sourceFormat, targetFormat[ , offSet] )&#039;&#039;&#039;:&amp;lt;sup&amp;gt;3.0.17&amp;lt;/sup&amp;gt; &#039;&#039;Function&#039;&#039;: Returns a reformatted datestring. dateString is a formatted date and source- and targetFormat are representations of the dateString elements and their locations in the string (see examples in dateToTimestamp) . Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;dddd dd mmmm hh:MM:ss&#039;, 1 )              -- &amp;gt; &#039;Friday 31 December 23:31:06&#039;&lt;br /&gt;
        domoticz.time.dateToDate(&#039;31/12/2021 23:31:05&#039;,&#039;dd/mm/yyyy hh:MM:ss&#039;, &#039;ddd dd mmm hh:MM:ss&#039;, -3600 * 24 - 3 ))  -- &amp;gt; &#039;Thu 30 Dec 23:31:02&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;dateToTimestamp([ dateString [,control] ] )&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;: Returns &#039;&#039;Number&#039;&#039; representing time since epoch in seconds. dateString is a formatted date and control is a representation of the dateString elements and their location in the string. Default control is ‘yyyy-mm-dd hh:MM’. recognized controls are either a Lua pattern string or a string containing following codes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        dddd -- full weekdayname(e.g. Wednesday) language depends on locale&lt;br /&gt;
        ddd  -- abbreviated weekdayname(e.g. Wed) language depends on locale&lt;br /&gt;
        dd   -- day of the month {[01-31]&lt;br /&gt;
        mmmm -- full monthname(e.g September) language depends on locale&lt;br /&gt;
        mmm  -- abbreviated monthname(e.g. Sep) language depends on locale&lt;br /&gt;
        mm   -- month [01-12]&lt;br /&gt;
        yyyy -- 4 digit year&lt;br /&gt;
        yy   -- 2 digit year&lt;br /&gt;
        hh   -- hour 24-hour clock&lt;br /&gt;
        ii   -- hour 12-hour clock&lt;br /&gt;
        MM   -- minute&lt;br /&gt;
        ss   -- second&lt;br /&gt;
        W    -- weeknumber [01-53]&lt;br /&gt;
        w    -- weekday{[0-6] Sunday-Saturday&lt;br /&gt;
        datm -- date and time (e.g. 09/16/98 23:48:10) format depends on locale&lt;br /&gt;
        mer  -- either &amp;quot;AM&amp;quot; or &amp;quot;PM&amp;quot; locale&lt;br /&gt;
        date -- date(e.g. 09/16/98) format depends on locale&lt;br /&gt;
        time -- time (e.g. 23:48:10)&lt;br /&gt;
&lt;br /&gt;
        -- examples:&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59&#039;))                                                      -- &amp;gt; 1609455540&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:01&#039;,&#039;yyyy-mm-dd hh:MM:ss&#039;))                             -- &amp;gt; 1609455541&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;December 31, 23:59:02&#039;,&#039;mmmm dd, hh:MM:ss&#039;))                             -- &amp;gt; 1609455542&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;2020-12-31 23:59:03&#039;,&#039;(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)%D+(%d+)&#039; ))  -- &amp;gt; 1609455543&lt;br /&gt;
        domoticz.time.dateToTimestamp(&#039;20201231235904&#039;,&#039;(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)&#039;))             -- &amp;gt; 1609455544&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayAbbrOfWeek&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. sun,mon,tue,wed,thu,fri or sat&lt;br /&gt;
* &#039;&#039;&#039;daysAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;dayName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. complete name Sunday, Monday, etc&lt;br /&gt;
* &#039;&#039;&#039;dDate&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. timestamp (seconds since 01/01/1970 00:00)&lt;br /&gt;
* &#039;&#039;&#039;getISO&#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns the ISO 8601 formatted date.&lt;br /&gt;
* &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;hoursAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of hours since the last update.&lt;br /&gt;
* &#039;&#039;&#039;isdst&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.0.18&amp;lt;/sup&amp;gt; Indicates if time is in the daylight saving period&lt;br /&gt;
* &#039;&#039;&#039;isToday&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Indicates if time is today&lt;br /&gt;
* &#039;&#039;&#039;isUTC&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;makeTime(string | table,[isUTC])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. isUTC defaults to false.&lt;br /&gt;
* &#039;&#039;&#039;matchesRule(rule) &#039;&#039;&#039;: &#039;&#039;Function&#039;&#039;. Returns true if the rule matches with the time. See [[#timer_trigger_rules|time trigger rules]] for rule examples.&lt;br /&gt;
* &#039;&#039;&#039;millisecondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;minutesAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of minutes since the last update.&lt;br /&gt;
* &#039;&#039;&#039;minutesSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;monthAbbrName&#039;&#039;&#039;: String. jan, feb, mar, etc&lt;br /&gt;
* &#039;&#039;&#039;monthName&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. January, February, etc&lt;br /&gt;
* &#039;&#039;&#039;msAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of milliseconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;raw&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Generated by Domoticz&lt;br /&gt;
* &#039;&#039;&#039;rawDate&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the date part of the raw data.&lt;br /&gt;
* &#039;&#039;&#039;rawDateTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Combined date / time formatted as domoticz does in API / JSON returns (rawDate .. ’ ’.. rawTime )&lt;br /&gt;
* &#039;&#039;&#039;rawTime&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM:SS&lt;br /&gt;
* &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsSinceMidnight&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;secondsAgo&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Number of seconds since the last update.&lt;br /&gt;
* &#039;&#039;&#039;sunsetInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunset.&lt;br /&gt;
* &#039;&#039;&#039;sunriseInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Minutes from midnight until sunrise.&lt;br /&gt;
* &#039;&#039;&#039;solarnoonInMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. &amp;lt;sup&amp;gt;3.0.11&amp;lt;/sup&amp;gt; Minutes from midnight until solarnoon.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Returns the time part of the raw data as HH:MM&lt;br /&gt;
* &#039;&#039;&#039;timestampToDate([ [ timestamp ] , [ pattern ] ,[ offSet ] )&#039;&#039;&#039;: &#039;&#039;function&#039;&#039;. Returns a datestring. timestamp is number of seconds since epoch (default = now) , pattern is a string as explained in this wiki at the description of the domoticz.time.dateToTimestamp function (default = ‘yyyy-mm-dd hh:MM:ss’). Offset is a number (default = 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        -- examples:&lt;br /&gt;
        domoticz.time.timestampToDate(10,&#039;date time&#039;)                               --&amp;gt; &#039;01/01/70 01:00:10&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(60,&#039;ddd mm mmm yyyy ii:MM mer&#039;,&#039;date time&#039;)   --&amp;gt; &#039;Thu 01 Jan 1970 01:01 AM&#039;&#039;&lt;br /&gt;
        domoticz.time.timestampToDate(1598077445,&#039;dd/mm/yy ii:MM mer nZero&#039;)        --&amp;gt; &#039;22/08/20 8:24 AM&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;toUTC(string | table,[offset])&#039;&#039;&#039;: &#039;&#039;domoticz time object&#039;&#039;. &amp;lt;sup&amp;gt;3.0.9&amp;lt;/sup&amp;gt; returns domoticz time object based on first parameter (time as table or string) string format must be ‘yyyy-mm-dd hh:mm:ss’. offset defaults to 0.&lt;br /&gt;
* &#039;&#039;&#039;utcSystemTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. UTC system time (only when in UTC mode):&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;utcTime&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Time stamp in UTC time:&lt;br /&gt;
** &#039;&#039;&#039;day&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;hour&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;month&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;minutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;seconds&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;year&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;wday&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; day of the week. Sunday = 1, Saturday = 7&lt;br /&gt;
* &#039;&#039;&#039;week&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039; week of the year&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: it is currently not possible to change the domoticz.time object instance.&#039;&#039;&#039; ( but you can create a new one with- or without an offset)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;shared-helper-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Shared helper functions ==&lt;br /&gt;
&lt;br /&gt;
It is not unlikely that at some point you want to share Lua code among your scripts. Normally in Lua you would have to create a module and require that module in all you scripts. But dzVents makes that easier for you: Inside your scripts folder or in Domoticz’ GUI web editor, create a &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; script (same as for global persistent data) and feed it with this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
        end,&lt;br /&gt;
        MY_CONSTANT = 100 -- doesn&#039;t have to be a function&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the file and then you can use myHandyFunction everywhere in your event scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(&#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
        print(domoticz.helpers.MY_CONSTANT)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;dofile&amp;lt;/code&amp;gt; is needed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important note: if you need to access the domoticz object in your helper function you have to pass it as a parameter:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    helpers = {&lt;br /&gt;
        myHandyFunction = function(domoticz, param1, param2)&lt;br /&gt;
            -- do your stuff&lt;br /&gt;
            domoticz.log(&#039;Hey&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And pass it along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    ...&lt;br /&gt;
    execute = function(domoticz, device)&lt;br /&gt;
        local results = domoticz.helpers.myHandyFunction(domoticz, &#039;bla&#039;, &#039;boo&#039;)&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only &#039;&#039;&#039;one&#039;&#039;&#039; &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;requiring-your-own-modules&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Requiring your own modules ==&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use the helpers support, but you want to require your own modules, place them either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/modules&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/scripts/modules&amp;lt;/code&amp;gt; as these folders are already added to the Lua package path. You can just require those modules: &amp;lt;code&amp;gt;local myModule = require(&#039;myModule&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;persistent-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Persistent data =&lt;br /&gt;
&lt;br /&gt;
In many situations you need to store a device state or other information in your scripts for later use. Like knowing what the state was of a device the previous time the script was executed or what the temperature in a room was 10 minutes ago. Without dzVents, you had to resort to user variables. These are global variables that you create in the Domoticz GUI and that you can access in your scripts like: domoticz.variables(‘previousTemperature’).&lt;br /&gt;
&lt;br /&gt;
Now, for some this is rather inconvenient and they want to control this state information in the event scripts themselves or want to use all of Lua’s variable types. dzVents has a solution for that: &#039;&#039;&#039;persistent script data&#039;&#039;&#039;. This can either be on the script level or on a global level.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-level-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Script level persistent variables ==&lt;br /&gt;
&lt;br /&gt;
The values in persistent script variables persist and can be retrieved in the next script run.&lt;br /&gt;
&lt;br /&gt;
For example, send a notification if a switch has been activated 5 times:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = { &#039;MySwitch&#039; }&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            counter = { initial = 0 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, switch)&lt;br /&gt;
            if (domoticz.data.counter == 5) then&lt;br /&gt;
            domoticz.notify(&#039;The switch was pressed 5 times!&#039;)&lt;br /&gt;
            domoticz.data.counter = 0 -- reset the counter&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.data.counter = domoticz.data.counter + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; section defines a persistent variable called &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;. It also defines an initial value. From then on you can read and set the variable in your script.&lt;br /&gt;
&lt;br /&gt;
You do not have to provide an initial value though. In that case the initial value is &#039;&#039;nil&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        --&lt;br /&gt;
        data = {&lt;br /&gt;
            &#039;x&#039;, &#039;y&#039;, &#039;z&#039; -- note the quotes&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, item)&lt;br /&gt;
            print(tostring(domoticz.data.x)) -- prints nil&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can define as many variables as you like and put whatever value in there that you like. It doesn’t have to be just a number. Just don’t put something in there with functions (well, they are filtered out actually).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;size-matters-and-watch-your-speed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Size matters and watch your speed!! ===&lt;br /&gt;
&lt;br /&gt;
If you include tables (or arrays) in the persistent data, beware to not let them grow. It will definitely slow down script execution because dzVents has to serialize and deserialize the data. It is better to use the historical option as described below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;re-initializing-a-variable&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Re-initializing a variable ===&lt;br /&gt;
&lt;br /&gt;
You can re-initialize a persistent variable and re-apply the initial value as defined in the data section:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { .. },&lt;br /&gt;
    data = {&lt;br /&gt;
        x = { initial = &#039;initial value&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (domoticz.data.x ~= &#039;initial value&#039;) then&lt;br /&gt;
            domoticz.data.initialize(&#039;x&#039;)&lt;br /&gt;
            print(domoticz.data.x) -- will print &#039;initial value&#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; is just a convenience method. You can of course create a local variable in your module holding the initial value and use it in your data section and your execute function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;global-persistent-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Global persistent variables ==&lt;br /&gt;
&lt;br /&gt;
Script level variables are only available in the scripts that define them, but global variables can be accessed and changed in every script. To utilize global persistent variables, create a script file called &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; in your scripts folder with this content (same file where you can also put your shared helper functions):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        helpers = {},&lt;br /&gt;
        data = {&lt;br /&gt;
            peopleAtHome = { initial = false },&lt;br /&gt;
            heatingProgramActive = { initial = false }&lt;br /&gt;
        }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Just define the variables that you need and access them in your scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;WindowSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, windowSensor)&lt;br /&gt;
            if (domoticz.globalData.heatingProgramActive&lt;br /&gt;
                and windowSensor.state == &#039;Open&#039;) then&lt;br /&gt;
                domoticz.notify(&amp;quot;Hey don&#039;t open the window when the heating is on!&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: there can be only one &amp;lt;code&amp;gt;global_data.lua&amp;lt;/code&amp;gt; on your system. Either in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents/script&amp;lt;/code&amp;gt; or in Domoticz’ internal GUI web editor.&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;domoticz.globalData.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt; just as like &amp;lt;code&amp;gt;domoticz.data.initialize(&#039;&amp;amp;lt;varname&amp;amp;gt;&#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a-special-kind-of-persistent-variables-history-true-historical-variables-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== A special kind of persistent variables: &#039;&#039;history = true&#039;&#039; (Historical variables API) ==&lt;br /&gt;
&lt;br /&gt;
In some situations, storing a previous value for a sensor is not enough, and you would like to have more previous values. For example, you want to calculate an average over several readings. Of course you can define a persistent variable holding a table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            previousData = { initial = {} }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            table.insert(domoticz.data.previousData, sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- calculate the average&lt;br /&gt;
            local sum = 0, count = 0&lt;br /&gt;
            for i, temp in pairs(domoticz.data.previousData) do&lt;br /&gt;
                sum = sum + temp&lt;br /&gt;
                count = count + 1&lt;br /&gt;
            end&lt;br /&gt;
            local average = sum / count&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The problem with this is that you have to do a lot of bookkeeping to make sure that there isn’t too much data to store (see [[#How_does_the_storage_stuff_work.3F|below for how it works]]) . Fortunately, dzVents has done this for you:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {&lt;br /&gt;
            devices = {&#039;MyTempSensor&#039;}&lt;br /&gt;
        },&lt;br /&gt;
        data = {&lt;br /&gt;
            temperatures = { history = true, maxItems = 10 }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function(domoticz, sensor)&lt;br /&gt;
            -- add new data&lt;br /&gt;
            domoticz.data.temperatures.add(sensor.temperature)&lt;br /&gt;
&lt;br /&gt;
            -- average&lt;br /&gt;
            local average = domoticz.data.temperatures.avg()&lt;br /&gt;
&lt;br /&gt;
            -- maximum value in the past hour:&lt;br /&gt;
            local max = domoticz.data.temperatures.maxSince(&#039;01:00:00&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;defining&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Defining ===&lt;br /&gt;
&lt;br /&gt;
Define a script variable or global variable in the data section and set &amp;lt;code&amp;gt;history = true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    …&lt;br /&gt;
    data = {&lt;br /&gt;
        var1 = { history = true, maxItems = 10, maxHours = 1, maxMinutes = 5 }&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;maxItems&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Controls how many items are stored in the variable. maxItems has precedence over maxHours and maxMinutes.&lt;br /&gt;
* &#039;&#039;&#039;maxHours&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Data older than &amp;lt;code&amp;gt;maxHours&amp;lt;/code&amp;gt; from now will be discarded. E.g., if set to 2, then data older than 2 hours will be removed at the beginning of the script.&lt;br /&gt;
* &#039;&#039;&#039;maxMinutes&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. Same as maxHours but, you guessed it: for minutes this time.. All these options can be combined. &#039;&#039;&#039;Reminder: don’t store too much data. Only put in what you really need!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adding-data&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Adding data ===&lt;br /&gt;
&lt;br /&gt;
Add new values to a historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz.data.myVar.add(value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As soon as this new value is put on top of the list, the older values shift one place down the line. If &amp;lt;code&amp;gt;maxItems&amp;lt;/code&amp;gt; is reached, then the oldest value will be discarded. &#039;&#039;All methods, like calculating averages or sums, will immediately use this new value!&#039;&#039; If you don’t want this to happen, set the new value at the end of your script or after you have done your analysis.&lt;br /&gt;
&lt;br /&gt;
Any kind of data may be stored in the historical variable: numbers, strings, but also more complex data like tables. However, in order to use the [[#Statistical_functions|statistical methods]], numeric values are required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;accessing-values-in-historical-variables&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Accessing values in historical variables ===&lt;br /&gt;
&lt;br /&gt;
Values in a historical variable are indexed, where index 1 is the newest value, 2 is the second newest, and so on:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.get(5)&lt;br /&gt;
print(item.data)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, all data in the storage are time-stamped:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local item = domoticz.data.myVar.getLatest()&lt;br /&gt;
print(item.time.secondsAgo) -- access the time stamp&lt;br /&gt;
print(item.data) -- access the data&amp;lt;/pre&amp;gt;&lt;br /&gt;
The time attribute by itself is a table with many properties that help you inspect the data points more easily. See [[#Time_object|Time Object]] for all attributes and methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Index ====&lt;br /&gt;
&lt;br /&gt;
All data in the set can be addressed using an index. The item with index = 1 is the youngest, and the item with the highest index is the oldest. Beware, if you have called &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; first, then the first item is that new value! You can always check the size of the set by inspecting &amp;lt;code&amp;gt;myVar.size&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;time-specification-timeago&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Time specification (&#039;&#039;timeAgo&#039;&#039;) ====&lt;br /&gt;
&lt;br /&gt;
Every data point in the set has a timestamp and the set is ordered so that the youngest item is the first and the oldest item the last. Many functions require a moment in the past to be specified by passing a string in the format &#039;&#039;&#039;&amp;lt;code&amp;gt;hh:mm:ss&amp;lt;/code&amp;gt;&#039;&#039;&#039;, where &#039;&#039;hh&#039;&#039; is the number of hours ago, &#039;&#039;mm&#039;&#039; the number of minutes and &#039;&#039;ss&#039;&#039; the number of seconds. The times are added together, so you don’t have to consider 60 minute boundaries, etc. A time specification of &amp;lt;code&amp;gt;12:88:03&amp;lt;/code&amp;gt; is valid, and points to the data point at or around &amp;lt;code&amp;gt;12*3600 + 88*60 + 3 = 48.483 seconds&amp;lt;/code&amp;gt; in the past.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- get average for the past 30 minutes:&lt;br /&gt;
local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting-data-points&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Getting data points ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get(idx)&#039;&#039;&#039;: Returns the idx-th item in the set. Same as &amp;lt;code&amp;gt;myVar.storage[idx]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getAtTime([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Returns the data point &#039;&#039;closest&#039;&#039; to the moment as specified by &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; and the index in the set. So, &amp;lt;code&amp;gt;myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt; returns the item that is closest to one hour old. It may be a bit younger or a bit older than 1 hour. The second return value is the index in the set: &amp;lt;code&amp;gt;local item, index = myVar.getAtTime(&#039;1:00:00&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;getLatest( )&#039;&#039;&#039;: Returns the youngest item in the set. Same as &amp;lt;code&amp;gt;print(myVar.get(1).data)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;getOldest( )&#039;&#039;&#039;: Returns the oldest item in the set and the index. Same as &amp;lt;code&amp;gt;print(myVar.get(myVar.size).data)&amp;lt;/code&amp;gt;. Note that the index is always the same as the total size. &amp;lt;code&amp;gt;local item, index = myVar.getOldest()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;: Return the number of data points in the set.&lt;br /&gt;
* &#039;&#039;&#039;subset( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns a subset of the stored data. Default value, if omitted, of &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; is 1. Omitting &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt; takes all items until the end of the set (oldest). E.g., &amp;lt;code&amp;gt;myVar.subset()&amp;lt;/code&amp;gt; returns all data. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;subsetSince( [[#Time_specification_.28timeAgo.29|timeAgo]] )&#039;&#039;&#039;: Returns a subset of the stored data since the relative time specified by timeAgo. So calling &amp;lt;code&amp;gt;myVar.subsetSince(&#039;00:60:00&#039;)&amp;lt;/code&amp;gt; returns all items that have been added to the list in the past 60 minutes. The result set supports [[#Looping_through_the_data:_iterators|iterators]] &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reduce&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reset( )&#039;&#039;&#039;: Removes all the items from the set. It could be a good practice to do this often when you know you don’t need older data. For instance, when you turn on a heater and you just want to monitor rising temperatures starting from this moment when the heater is activated. If you don’t need data points from before, then you may call reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;looping-through-the-data-iterators&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Looping through the data: iterators ====&lt;br /&gt;
&lt;br /&gt;
Similar to the iterators as described [[#Looping_through_the_collections:_iterators|above]], there are convenience methods to make looping through the data set easier.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;forEach(function)&#039;&#039;&#039;: Loop over all items in the set: E.g.: &amp;lt;code&amp;gt;myVar.forEach( function( item, index, collection) ... end )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;filter(function)&#039;&#039;&#039;: Create a filtered set of items. The function receives the item and returns true if the item is in the result set. E.g. get a set with item values larger than 20: &amp;lt;code&amp;gt;subset = myVar.filter( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;find(function)&#039;&#039;&#039;: Search for a specific item in the set: E.g. find the first item with a value higher than 20: &amp;lt;code&amp;gt;local item = myVar.find( function (item) return (item.data &amp;amp;gt; 20) end )&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;reduce(function, initial)&#039;&#039;&#039;: Loop over all items in the set and do some calculation with it. You call reduce with the function and the initial value. Each iteration the function is called with the accumulator. The function does something with the accumulator and returns a new value for it. Once you get the hang of it, it is very powerful. Best to give an example. To sum all values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;        local sum = myVar.reduce(function(acc, item)&lt;br /&gt;
            local value = item.data&lt;br /&gt;
        return acc + value&lt;br /&gt;
        end, 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Suppose you want to get data points older than 45 minutes and count the values that are higher than 20 (of course there are more ways to do this):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    local myVar = domoticz.data.myVar&lt;br /&gt;
&lt;br /&gt;
    local olderItems = myVar.filter(function (item)&lt;br /&gt;
        return (item.time.minutesAgo &amp;gt; 45)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    local count = olderItems.reduce(function(acc, item)&lt;br /&gt;
        if (item.data &amp;gt; 20) then&lt;br /&gt;
            acc = acc + 1&lt;br /&gt;
        end&lt;br /&gt;
        return acc&lt;br /&gt;
    end, 0)&lt;br /&gt;
&lt;br /&gt;
    print(&#039;Found &#039; .. tostring(count) .. &#039; items&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;statistical-functions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Statistical functions ====&lt;br /&gt;
&lt;br /&gt;
Statistical functions require &#039;&#039;numerical&#039;&#039; data in the set. If the set is just numbers you can do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add(myDevice.temperature) -- adds a number to the set&lt;br /&gt;
myVar.avg() -- returns the average&amp;lt;/pre&amp;gt;&lt;br /&gt;
If, however, you add more complex data or you want to do a computation first, then you have to &#039;&#039;tell dzVents how to get a numeric value from these data&#039;&#039;. So let’s say you do this to add data to the set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;myVar.add( { &#039;person&#039; = &#039;John&#039;, waterUsage = u })&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; is a variable that got its value earlier. If you want to calculate the average water usage, then dzVents will not be able to do this because it doesn’t know the value is actually in the &amp;lt;code&amp;gt;waterUsage&amp;lt;/code&amp;gt; attribute! You will get &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To make this work you have to provide a &#039;&#039;&#039;getValue function&#039;&#039;&#039; in the data section when you define the historical variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;    return {&lt;br /&gt;
        active = true,&lt;br /&gt;
        on = {...},&lt;br /&gt;
        data = {&lt;br /&gt;
        myVar = {&lt;br /&gt;
            history = true,&lt;br /&gt;
            maxItems = 10,&lt;br /&gt;
            getValue = function(item)&lt;br /&gt;
                return item.data.waterUsage -- return number!!&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
        },&lt;br /&gt;
        execute = function()...end&lt;br /&gt;
    }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This function tells dzVents how to get the numeric value for a data item. &#039;&#039;&#039;Note: the &amp;lt;code&amp;gt;getValue&amp;lt;/code&amp;gt; function has to return a number!&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you don’t intend to use any of these statistical functions you can put whatever you want in the set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avg( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the average of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;avgSince([[#Time_specification_.28timeAgo.29|timeAgo]], default )&#039;&#039;&#039;: Calculates the average of all data points since &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt;. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there are no data, otherwise 0. E.g.: &amp;lt;code&amp;gt;local avg = myVar.avgSince(&#039;00:30:00&#039;)&amp;lt;/code&amp;gt; returns the average over the past 30 minutes.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;med( [fromIdx], [toIdx], [default] )&#039;&#039;&#039;: Calculates the median of all item values within the range &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. If no data are in the set, the value &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; will be returned instead of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;min( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the lowest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;minSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;min&#039;&#039;&#039; but now within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;max( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the highest value in the range defined by fromIdx and toIdx.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;maxSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;max&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sum( [fromIdx], [toIdx] )&#039;&#039;&#039;: Returns the summation of all values in the range defined by fromIdx and toIdx. It will return 0 when there are no data.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;sumSince([[#Time_specification_.28timeAgo.29|timeAgo]])&#039;&#039;&#039;: Same as &#039;&#039;&#039;sum&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. It will return 0 when there are no data in the interval.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;** delta(fromIdx, toIdx, [smoothRange], [default] )**: Returns the delta (difference) between items specified by &amp;lt;code&amp;gt;fromIdx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;toIdx&amp;lt;/code&amp;gt;. Provide a valid range (no &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values). [Supports data smoothing]. (#Data_smoothing) when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. Returns &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if there is not enough data. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta(2, 5, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;delta2( fromIdx, toIdx, [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but now you can control if the smooth values for the &#039;&#039;from-item&#039;&#039; and the &#039;&#039;to-item&#039;&#039; separately. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = delta2(2, 5, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSince([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRange], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;delta&#039;&#039;&#039; but within the &amp;lt;code&amp;gt;timeAgo&amp;lt;/code&amp;gt; interval. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSince(&#039;00:00:10&#039;, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;deltaSinceOrOldest([[#Time_specification_.28timeAgo.29|timeAgo]], [smoothRangeFrom], [smoothRangeTo], [default] )&#039;&#039;&#039;: Same as &#039;&#039;&#039;deltaSince&#039;&#039;&#039; but it will take the oldest value in the set if &#039;&#039;timeAgo&#039;&#039; is older than the age of the entire set. The function also returns the fromItem and the toItem that is used to calculate the delta with: &amp;lt;code&amp;gt;local delta, from, to = deltaSinceOrOldest(&#039;00:00:10&#039;, 3, 3)&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMin( [smoothRange], default )&#039;&#039;&#039;: Returns the first minimum value (and the item holding the minimal value) in the past. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value. For example, given this range of values in the data set (from new to old): &amp;lt;code&amp;gt;10 8 7 5 3 4 5 6&amp;lt;/code&amp;gt;, it will return &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; because older values &#039;&#039;and&#039;&#039; newer values are higher: a local minimum. Use this if you want to know at what time a temperature started to rise after it had been dropping. E.g.:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; local value, item = myVar.localMin()&lt;br /&gt;
 print(&#039; minimum was : &#039; .. value .. &#039;: &#039; .. item.time.secondsAgo .. &#039; seconds ago&#039; )&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;localMax([smoothRange], default)&#039;&#039;&#039;: Same as &#039;&#039;&#039;localMin&#039;&#039;&#039; but for the maximum value. [[#Data_smoothing|Supports data smoothing]] when providing a &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt; value.&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;smoothItem(itemIdx, [smoothRange])&#039;&#039;&#039;: Returns a the value of &amp;lt;code&amp;gt;itemIdx&amp;lt;/code&amp;gt; in the set but smoothed by averaging with its neighbors. The number of neighbors is set by &amp;lt;code&amp;gt;smoothRange&amp;lt;/code&amp;gt;. See [[#Data_smoothing|Data smoothing]].&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;data-smoothing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Data smoothing ====&lt;br /&gt;
&lt;br /&gt;
Example: Suppose you store temperatures in the historical variable. These temperatures may have extremes. Perhaps these extremes could be due to sensor reading errors. In order to reduce the effect of these so-called spikes, you could smooth out values. It is like blurring the data. The Raw column is your temperatures. The other columns are calculated by averaging the neighbors. For item 10 the calculations are:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Range=1 for time10 = (25 + 31 + 29) / 3 = 28,3&lt;br /&gt;
Range=2 for time10 = (16 + 25 + 31 + 29 + 26) / 5 = 25,4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; align=&amp;quot;center&amp;quot; width=&amp;quot;30% height:10px;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| time&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| raw&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=1&lt;br /&gt;
! style=&amp;quot;text-align: center; background:darkblue; color:white&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;align=&amp;quot;center&amp;quot; width=&amp;quot;12%&amp;quot;| range=2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
| 18&lt;br /&gt;
| 20,0&lt;br /&gt;
| 21,7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 21,7&lt;br /&gt;
| 25,0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 27,3&lt;br /&gt;
| 24,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 27,7&lt;br /&gt;
| 26,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
| 23&lt;br /&gt;
| 28,7&lt;br /&gt;
| 27,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,0&lt;br /&gt;
| 25,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
| 27&lt;br /&gt;
| 23,7&lt;br /&gt;
| 23,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
| 16&lt;br /&gt;
| 22,7&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
| 25&lt;br /&gt;
| 24,0&lt;br /&gt;
| 25,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 28,3&lt;br /&gt;
| 25,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
| 29&lt;br /&gt;
| 28,7&lt;br /&gt;
| 29,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
| 26&lt;br /&gt;
| 30,0&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;13&#039;&#039;&#039;&lt;br /&gt;
| 35&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;14&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 32,0&lt;br /&gt;
| 30,4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
| 31&lt;br /&gt;
| 30,3&lt;br /&gt;
| 30,8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;16&#039;&#039;&#039;&lt;br /&gt;
| 30&lt;br /&gt;
| 29,7&lt;br /&gt;
| 28,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;17&#039;&#039;&#039;&lt;br /&gt;
| 28&lt;br /&gt;
| 26,7&lt;br /&gt;
| 28,6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;18&#039;&#039;&#039;&lt;br /&gt;
| 22&lt;br /&gt;
| 27,3&lt;br /&gt;
| 26,2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;19&#039;&#039;&#039;&lt;br /&gt;
| 32&lt;br /&gt;
| 24,3&lt;br /&gt;
| 25,3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;20&#039;&#039;&#039;&lt;br /&gt;
| 19&lt;br /&gt;
| 25,5&lt;br /&gt;
| 24,3&lt;br /&gt;
|}&lt;br /&gt;
A chart illustrates it more clearly. The red line is not smoothed and has more spikes than the others:&lt;br /&gt;
&lt;br /&gt;
[[File:dzvents-smoothing.png|frame|none|alt=|Smoothing]]&lt;br /&gt;
&lt;br /&gt;
Usually a range of 1 or 2 is sufficient when providing a smoothing range to statistical functions. I suggest smoothing when checking deltas, local minimums and maximums.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;how-does-the-storage-stuff-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== How does the storage stuff work? ==&lt;br /&gt;
&lt;br /&gt;
For every script file that defines persisted variables (using the &amp;lt;code&amp;gt;data={ … }&amp;lt;/code&amp;gt; section), dzVents will create storage file with the name &amp;lt;code&amp;gt;__data_scriptname.lua&amp;lt;/code&amp;gt; in a subfolder called &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. You can always delete these data files or the entire storage folder if there is a problem with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;domoticz/&lt;br /&gt;
    scripts/&lt;br /&gt;
        dzVents/&lt;br /&gt;
            data/&lt;br /&gt;
                __data_yourscript1.lua&lt;br /&gt;
                __data_yourscript2.lua&lt;br /&gt;
                __data_global_data.lua&lt;br /&gt;
            examples/&lt;br /&gt;
            generated_scripts/&lt;br /&gt;
            scripts/&lt;br /&gt;
                yourscript1.lua&lt;br /&gt;
                yourscript2.lua&lt;br /&gt;
                global_data.lua&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you dare to, you can watch inside these files. Every time some data are changed, dzVents will stream the changes back into the data files. &#039;&#039;&#039;Again, make sure you don’t put too much stuff in your persistent data as it may slow things down too much.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-http-requests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous HTTP requests =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous HTTP request and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use os functions like &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz will terminate the script with a message that it took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to make an http call and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.openURL()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;openURL&amp;lt;/code&amp;gt; on the domoticz object with only the url as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL(&#039;http://domain/path/to/something?withparameters=1&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will make the request that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a url you pass in a table with all the parameters to make the request &#039;&#039;&#039;and&#039;&#039;&#039; your provide a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
    domoticz.openURL({&lt;br /&gt;
        url = &#039;http://domain/path/to/something&#039;,&lt;br /&gt;
        method = &#039;POST&#039;,&lt;br /&gt;
        callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
        postData = {&lt;br /&gt;
            paramA = &#039;something&#039;,&lt;br /&gt;
            paramB = &#039;something else&#039;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will make the request (a POST in this case), and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    httpResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
    if (response.ok) then -- success&lt;br /&gt;
        if (response.isJSON) then&lt;br /&gt;
            domoticz.log(response.json.some.value)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
    timer = {&#039;every 5 seconds&#039;},&lt;br /&gt;
    httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
    if (item.isTimer) then&lt;br /&gt;
        domoticz.openURL({&lt;br /&gt;
            url = &#039;...&#039;,&lt;br /&gt;
            callback = &#039;trigger&#039;&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    if (item.isHTTPResponse) then&lt;br /&gt;
        if (item.ok) then&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.openURL(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;url&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;method&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. Either &amp;lt;code&amp;gt;&#039;GET&#039;&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;&#039;POST&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;PUT&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;&#039;DELETE&#039;&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; .&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to trigger the callback handler script(s).&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. A Lua table or JSON string with additional http request-headers.&lt;br /&gt;
* &#039;&#039;&#039;postData&#039;&#039;&#039;: &#039;&#039;Table / String&#039;&#039;. Optional. When doing a &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PUT&amp;lt;/code&amp;gt; &amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; or &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&amp;lt;sup&amp;gt;3.0.2&amp;lt;/sup&amp;gt; this data will be the payload of the request (body). If you provide a Lua table then this will automatically be converted to json and the request-header &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; is set. So no need to do that manually. Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: Raw response data.&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;headers&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. Response headers.&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;application/json&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. Short for &amp;lt;code&amp;gt;response.headers[&#039;Content-Type&#039;] == &#039;text/xml&#039;&amp;lt;/code&amp;gt;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. &amp;lt;sup&amp;gt;3.1.0&amp;lt;/sup&amp;gt; When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be in range of 200-299.&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Number&#039;&#039;. HTTP status codes. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;statusText&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP status message. See [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;protocol&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. HTTP protocol. See [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP response status codes].&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;more-about-request-and-response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== More about request and response headers ===&lt;br /&gt;
&lt;br /&gt;
Whenever you do an http request it is not just some data that is sent. Along with the request a bunch of so-called headers are sent along with it. HTTP headers allow the client and the server to pass additional information with the request or the response. Also, in the response there are also headers (response header). These response headers usually tell you what kind of data is returned, if it is compressed, if the request was successful etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;request-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== request headers ====&lt;br /&gt;
&lt;br /&gt;
dzVents allow you to set custom request headers that will accompany the data in the request. Sometimes it is necessary to set these headers like for instance when a API or webservice require a security token or key or when the service needs to know what the format of the response data is. Check the documentation of the web service.&lt;br /&gt;
&lt;br /&gt;
So, let’s say you need to call a web service that requires an api key in the headers and the documentation states it needs to be passed in an x-access-token header. Your openURL command then may look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.openURL({&lt;br /&gt;
    url = &#039;https://somedomain.com/service/getInfo&#039;,&lt;br /&gt;
    headers = { [&#039;x-access-token&#039;] = &#039;&amp;lt;api-key&amp;gt;&#039; },&lt;br /&gt;
    method = &#039;GET&#039;,&lt;br /&gt;
    callback = &#039;info&#039;&lt;br /&gt;
})&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Check google for more information about request headers. All you need to know here is that dzVents allow you to set these headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;response-headers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== response headers ====&lt;br /&gt;
&lt;br /&gt;
As said earlier, the response also contains a bunch of headers. You can inspect those headers with dzVents but ususally you don’t have to. For starters, dzVents already checks the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header which usually states what kind of data format the response is. If it is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then it automatically converts the json data to a Lua table. Also, it checks the &amp;lt;code&amp;gt;Status&amp;lt;/code&amp;gt; header to see if the request was successful. If so, then it sets the &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; attribute on the response object. So normally you don’t have to inspect the headers. However, sometimes the web service puts a session token in the response header that you have to use in follow-up requests.&lt;br /&gt;
&lt;br /&gt;
So here an example where we have to log in before we can fetch data. It uses two requests: the first performs the log-in and the second grabs the session token from the login response data and uses that token in the second request to get the data we need. In this example we do this every hour.&lt;br /&gt;
&lt;br /&gt;
That would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;loggedin&#039;, &#039;data&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/login&#039;,&lt;br /&gt;
                method = &#039;POST&#039;,&lt;br /&gt;
                postData = { [&#039;username&#039;] = &#039;Luke Skywalker&#039;, [&#039;password&#039;] = &#039;theforce&#039; }&lt;br /&gt;
                callback = &#039;loggedin&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- check to which request this response was the result&lt;br /&gt;
            if (item.trigger == &#039;loggedin&#039;) then&lt;br /&gt;
                -- we are logged in, now grab the session token from the header and&lt;br /&gt;
                -- fetch our data&lt;br /&gt;
                local token = item.headers[&#039;x-session-token&#039;]&lt;br /&gt;
                -- now we have the token, put it in the headers:&lt;br /&gt;
                domoticz.openURL({&lt;br /&gt;
                    url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                    method = &#039;GET&#039;,&lt;br /&gt;
                    headers = { [&#039;x-session-token&#039;] = token },&lt;br /&gt;
                    callback = &#039;data&#039;&lt;br /&gt;
                })&lt;br /&gt;
            else&lt;br /&gt;
                -- it must the data we requested&lt;br /&gt;
                local data = item.data&lt;br /&gt;
                -- do something with it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Some remarks about the response header &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;. If a service is a good web-citizen then it tells you what the format of the data is in this header. So, if the data is a json object then the header should be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;. Unfortunately, there are lot of lazy programmers out there who don’t set this header properly. If that is the case, dzVents cannot detect the format and will not turn it into a Lua table for you automatically. So, if you know it is json but the header is not properly set, then you can easily convert it into a Lua table in your code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        timer = {&#039;every hour&#039;},&lt;br /&gt;
        httpResponses = { &#039;trigger&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if (item.isTimer) then&lt;br /&gt;
            -- login&lt;br /&gt;
            domoticz.openURL({&lt;br /&gt;
                url = &#039;https://somedomain.com/getData&#039;,&lt;br /&gt;
                callback = &#039;trigger&#039;&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
        if (item.isHTTPResponse and item.ok) then&lt;br /&gt;
            -- we know it is json but dzVents cannot detect this&lt;br /&gt;
            -- convert to Lua&lt;br /&gt;
            local json = domoticz.utils.fromJSON(item.data)&lt;br /&gt;
            -- json is now a Lua table&lt;br /&gt;
            print(json.result.title) -- just an example&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;asynchronous-shell-command-execution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Asynchronous shell command execution =&lt;br /&gt;
&lt;br /&gt;
dzVents allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don’t block the system while waiting for the response. Earlier you had to use functions like &amp;lt;code&amp;gt;utils.osCommand()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;os.Execute()&amp;lt;/code&amp;gt; and some magic to make sure that you didn’t block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.&lt;br /&gt;
&lt;br /&gt;
dzVents to the rescue. With dzVents there are two ways to execute a shell command asynchronously and it is determined by how you use the &amp;lt;code&amp;gt;domoticz.executeShellCommand()&amp;lt;/code&amp;gt; command. The simplest form simply calls &amp;lt;code&amp;gt;executeShellCommand&amp;lt;/code&amp;gt; on the domoticz object with only the command as the parameter (a string value):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;domoticz.executeShellCommand(&#039;some shell command&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After your script is finished, Domoticz will execute the request in a separate thread and that’s where it ends. No callback. Nothing.&lt;br /&gt;
&lt;br /&gt;
The second way is different. Instead of passing a command you pass in a table with the command to be executed &#039;&#039;&#039;and&#039;&#039;&#039; a &#039;&#039;callback trigger&#039;&#039; which is just a string or a name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = { ... }, -- some trigger&lt;br /&gt;
    execute = function(domoticz)&lt;br /&gt;
        domoticz.executeShellCommand({&lt;br /&gt;
            command = &#039;some shell command&#039;,&lt;br /&gt;
            callback = &#039;mycallbackstring&#039;,&lt;br /&gt;
            timeout = timeoutinseconds,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (&#039;&#039;mycallbackstring&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return {&lt;br /&gt;
    on = {&lt;br /&gt;
        shellCommandResponses = { &#039;mycallbackstring&#039; }&lt;br /&gt;
    },&lt;br /&gt;
    execute = function(domoticz, response)&lt;br /&gt;
        if response.ok then&lt;br /&gt;
            if (response.isJSON) then&lt;br /&gt;
                domoticz.log(response.json.some.value)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            domoticz.log(&#039;There was an error&#039;, domoticz.LOG_ERROR)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Of course you can combine the script that issues the request and handles the response in one script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;return&lt;br /&gt;
{&lt;br /&gt;
    on =&lt;br /&gt;
    {&lt;br /&gt;
        timer =&lt;br /&gt;
        {&lt;br /&gt;
            &#039;every 5 minutes&#039;,&lt;br /&gt;
        },&lt;br /&gt;
        shellCommandResponses =&lt;br /&gt;
        {&lt;br /&gt;
            scriptVar,&lt;br /&gt;
        },&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    execute = function(domoticz, item)&lt;br /&gt;
        if item.isTimer then&lt;br /&gt;
            domoticz.executeShellCommand(&lt;br /&gt;
            {&lt;br /&gt;
                command = &#039;some shell command&#039;,&lt;br /&gt;
                callback = scriptVar,&lt;br /&gt;
                timeout = timeoutinseconds,&lt;br /&gt;
            })&lt;br /&gt;
        elseif item.isShellCommandResponse then&lt;br /&gt;
            if item.statusCode == 0 then&lt;br /&gt;
                ... -- process result (in item.json, -item.xml, -item.lines or item.data)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;api-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-the-request-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Making the request: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;domoticz.executeShellCommand(options)&#039;&#039;&#039;: &#039;&#039;options&#039;&#039; is a Lua table:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;command&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. Optional. A custom string that will be used by dzVents to find a the callback handler script.&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: &#039;&#039;Integer&#039;&#039;. Optional. Max execution time in seconds. defaults to 10 seconds. A value of 0 disables the timeout.&lt;br /&gt;
&lt;br /&gt;
Supports [[#Command_options_.28delay.2C_duration.2C_event_triggering.29|command options]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-response-object-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== The response object ===&lt;br /&gt;
&lt;br /&gt;
The response object (second parameter in your execute function) has these attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;data&#039;&#039;&#039;: output from the command. (stdout)&lt;br /&gt;
* &#039;&#039;&#039;errorText&#039;&#039;&#039;: Errors generated by the command (stderr)&lt;br /&gt;
* &#039;&#039;&#039;statusCode&#039;&#039;&#039;: &#039;&#039;Int&#039;&#039;. exitcode generated by the command&lt;br /&gt;
* &#039;&#039;&#039;hasLines&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table. (isJSON and isXML have preference)&lt;br /&gt;
* &#039;&#039;&#039;isJSON&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;isXML&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. When true, the data is automatically converted to a Lua table.&lt;br /&gt;
* &#039;&#039;&#039;json&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;lines&#039;&#039;&#039;: &#039;&#039;Table&#039;&#039;. When the response data has multiple lines but is not a JSON or XML string then the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;ok&#039;&#039;&#039;: &#039;&#039;Boolean&#039;&#039;. &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was successful. It checks for statusCode to be 0.&lt;br /&gt;
* &#039;&#039;&#039;timeoutOccurred&#039;&#039;&#039; &#039;&#039;Boolean&#039;&#039; &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; when the request was aborted by a timeout.&lt;br /&gt;
* &#039;&#039;&#039;trigger&#039;&#039;&#039;, &#039;&#039;&#039;callback&#039;&#039;&#039;: &#039;&#039;String&#039;&#039;. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.&lt;br /&gt;
* &#039;&#039;&#039;xml&#039;&#039;&#039;. &#039;&#039;Table&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; , the response data is automatically converted to a Lua table for quick and easy access.&lt;br /&gt;
* &#039;&#039;&#039;xmlEncoding&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml encoding] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
* &#039;&#039;&#039;xmlVersion&#039;&#039;&#039;. &#039;&#039;String&#039;&#039;. When the response data is &amp;lt;code&amp;gt;text/xml&amp;lt;/code&amp;gt; See [ xml versions ] ( https://en.wikipedia.org/wiki/XML ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;settings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Settings =&lt;br /&gt;
&lt;br /&gt;
Settings for dzVents are found in the Domoticz GUI: &#039;&#039;&#039;Setup &amp;amp;gt; Settings &amp;amp;gt; Other &amp;amp;gt; EventSystem&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039;: Tick this if you don’t want any dzVents script to be executed.&lt;br /&gt;
* &#039;&#039;&#039;Log level&#039;&#039;&#039;: (Note that you can override this setting in the logging section of your script)&lt;br /&gt;
** &#039;&#039;Errors&#039;&#039;,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info&#039;&#039;: Errors and some minimal information about which script is being executed and why,&lt;br /&gt;
** &#039;&#039;Errors + minimal execution info + generic info&#039;&#039;. Even more information about script execution and a bit more log formatting.&lt;br /&gt;
** &#039;&#039;Debug&#039;&#039;. Shows everything and dzVents will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in the scripts/dzVents folder. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.&lt;br /&gt;
** &#039;&#039;No logging&#039;&#039;. As silent as possible.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;troubleshooting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
So, you think if you have done everything correctly but things do not work (in some way) as you expected. Here are a couple steps you can do to find the cause.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-dzvents-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is dzVents enabled? ===&lt;br /&gt;
&lt;br /&gt;
Check the settings (see above) and make sure the checkbox &#039;&#039;&#039;dzVents disabled&#039;&#039;&#039; is not checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;is-your-script-enabled&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Is your script enabled? ===&lt;br /&gt;
&lt;br /&gt;
Make sure the active section in your script is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;active = true&amp;lt;/code&amp;gt;. And, on top of that, if you are using the internal web editor to write your script, make sure that your script is active there and you have clicked Save! “Event active” is a separate checkbox that must be ticked for every active script. When not active, the script name will be red in the list on the right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;turn-on-debug-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Turn on debug logging ===&lt;br /&gt;
&lt;br /&gt;
Activate debug logging in the settings (see above). This will produce a lot of extra messages in the Domoticz log (don’t forget to turn it off when you are done troubleshooting!). It is best to monitor the log through the command line, as the log in the browser sometimes tends to not always show all log messages. See the Domoticz manual for how to do that.&lt;br /&gt;
&lt;br /&gt;
When debug logging is enabled, every time dzVents kicks into action (Domoticz throws an event) it will log it, and it will create the files &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/path/to/domoticz/scripts/dzVents&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;domoticzData.lua&amp;lt;/code&amp;gt; is a dump of all the data received by dzVents from Domoticz. This data lie at the core of the dzVents object model. You can open this file in an editor to see if your device/variable/scene/group/hardware is in there. Note that the data in the file are not exactly the same as what you will get when you interact with dzVents, but it is a good start. If your object is not in the data file, then you will not have access to it in dzVents and dzVents will not be able to match triggers with that object. Something’s wrong if you expect your object to be in there but it is not (is the object active/used?). &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt; is a summary of the execution time and CPU usage of the user scripts active during the debug period.with a dump of the data sent to dzVents.&lt;br /&gt;
&lt;br /&gt;
Example content of &amp;lt;code&amp;gt;module.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    Startdate time  - End date time  (clk - CPU )                 dule / scriptname &amp;amp;lt;&amp;amp;lt; type: &amp;amp;quot;trigger&amp;amp;quot;&lt;br /&gt;
    ---------------------------------------------------------------------------------------------------------------&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0029)                     waqi.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 20 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:00 - 11/27/20 18:40:00 (00 - 0.0016)                   Washer.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every 5 minutes&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:01 - 11/27/20 18:40:01 (00 - 0.0215)   getWaterFromHomewizard.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WaterfromHomewizard&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.2472)     updateWeatherSensors.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;WUS_buienradarResponse&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:40:03 - 11/27/20 18:40:03 (00 - 0.0290)                     waqi.lua &amp;amp;lt;&amp;amp;lt; HTTPResponse: &amp;amp;quot;waqi_nearby&amp;amp;quot;&lt;br /&gt;
    11/27/20 18:41:00 - 11/27/20 18:41:00 (00 - 0.0583)        Bathroom humidity.lua &amp;amp;lt;&amp;amp;lt; timer: &amp;amp;quot;every minute between 05:15 and 23:30&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Every time Domoticz starts dzVents and debug logging is enabled you should see these lines in the domoticz log:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dzVents version: x.y.z&lt;br /&gt;
Event trigger type: aaaa&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where aaaa can be time, custom event, system event, device, uservariable, security or scenegroup. That should give you a clue what kind of event is active. If you don’t see this information then dzVents is not active (or debug logging is not active).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;script-is-still-not-executed&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Script is still not executed ===&lt;br /&gt;
&lt;br /&gt;
If for some reason your script is not executed while all of the above is done, it is possible that your triggers are not correct. Either the time rule is not matching with the current time (try to set the rule to &amp;lt;code&amp;gt;every minute&amp;lt;/code&amp;gt; or something simple), or the device name is not correct (check casing), or you use an id that doesn’t exist. Note that in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section, you cannot use the dzVents domoticz object!&lt;br /&gt;
&lt;br /&gt;
Make sure that if you use an id in the &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section that this id is correct. Go to the device list in Domoticz and find the device and make sure the device is in the ‘used’ list!. Unused devices will not create an event. Find the idx for the device and use that as the id.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that your device names are unique! dzVents will throw a warning in the log if multiple device names match. It’s best practice to have unique names for your devices. Use some clever naming like prefixing like ‘Temperature: living room’ or ‘Lights: living room’. That also makes using wild cards on your &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; section easier.&lt;br /&gt;
&lt;br /&gt;
If your script is still not triggered, you can try to create a classic Lua event script and see if that does work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging-your-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugging your script ===&lt;br /&gt;
&lt;br /&gt;
A simple way to inspect a device in your script is to dump it to the log: &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt;. This will dump everything known to dzVents of the device so you can inspect what its state is. If you only need to see a subset you can use dumpSelection(‘attributes’), dumpSelection(‘functions’) or dumpSelection(‘tables’) Use print statements or domoticz.log() statements in your script at cricital locations to see if the Lua interpreter reaches that line. Don’t try to print a device object though; use the &amp;lt;code&amp;gt;myDevice.dump()&amp;lt;/code&amp;gt; method for that. It wil log all attributes of the device in the Domoticz log.&lt;br /&gt;
&lt;br /&gt;
If you place a print statement all the way at the top of your script file it will be printed every time dzVents loads your script (that is done at the beginning of each event cycle). Sometimes that is handy to see if your script gets loaded in the first place. If you don’t see your print statement in the log, then likely dzVents didn’t load it and it will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;get-help&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Get help ===&lt;br /&gt;
&lt;br /&gt;
The Domoticz forum is a great resource for help and solutions. Check the [https://www.domoticz.com/forum/viewforum.php?f=59 dzVents forum].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;other-interesting-stuff&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Other interesting stuff =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lodash-for-lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== lodash for Lua ==&lt;br /&gt;
&lt;br /&gt;
lodash is a well known and very popular Javascript library filled with dozens of handy helper functions that really make you life a lot easier. Fortunately there is also a Lua version. This is directly available through the domoticz object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _ = domoticz.utils._&lt;br /&gt;
_.print(_.indexOf({2, 3, &#039;x&#039;, 4}, &#039;x&#039;))&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--- (Removed because link is dead. Hopefully only temporarily) Check out the great documentation [here](http://axmat.github.io/lodash.lua/). ---&amp;gt;&lt;br /&gt;
Check out the documentation [https://htmlpreview.github.io/?https://github.com/rwaaren/lodash.lua/blob/master/doc/index.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;history-link-to-changes-in-previous-versions.&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= History [https://wiki.domoticz.com/DzVents_version_History link to changes in previous versions]. =&lt;br /&gt;
&lt;br /&gt;
See link for the complete list of changes&lt;br /&gt;
&lt;br /&gt;
https://wiki.domoticz.com/DzVents_version_History&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19246</id>
		<title>DzVents automation wizard</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19246"/>
		<updated>2026-07-10T09:18:19Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Domoticz Automation Wizard&#039;&#039;&#039; is a built-in step-by-step UI tool allowing you to create &amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; Lua scripts without writing code. Accessible via the Events Editor, it guides you through selecting triggers, conditions, and actions. The tool automatically translates these parameters into readable, underlying code.&lt;br /&gt;
&lt;br /&gt;
== How to Access the Wizard ==&lt;br /&gt;
&lt;br /&gt;
# Open your &#039;&#039;&#039;Domoticz dashboard&#039;&#039;&#039; and navigate to &amp;lt;code&amp;gt;Setup&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;More Options&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt;. (see als wiki [[Events]])&lt;br /&gt;
# Click the &#039;&#039;&#039;+ button&#039;&#039;&#039; to create a new script.&lt;br /&gt;
# Select &#039;&#039;&#039;dzVents&#039;&#039;&#039; and launch the &#039;&#039;&#039;Automation Wizard&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
[[File:Dzventsautomationwizard.png]]&lt;br /&gt;
&lt;br /&gt;
== How it Works (UI Steps) ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Trigger Selection:&#039;&#039;&#039; Define what activates the script (e.g., a specific device turning On, a security panel state change, or a time schedule).&lt;br /&gt;
* &#039;&#039;&#039;Configuration:&#039;&#039;&#039; Establish exactly which device or condition to evaluate.&lt;br /&gt;
* &#039;&#039;&#039;Action Setup:&#039;&#039;&#039; Determine the outcome (e.g., toggle another light, send a notification).&lt;br /&gt;
* &#039;&#039;&#039;Review &amp;amp; Output:&#039;&#039;&#039; The wizard dynamically generates the proper [[DzVents: next generation Lua scripting|&amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; syntax]], minimizing potential syntax errors.&lt;br /&gt;
&lt;br /&gt;
== Typical Use Cases ==&lt;br /&gt;
&lt;br /&gt;
* Linking a motion detector to a smart plug while factoring in room temperature or lux constraints.&lt;br /&gt;
* Setting up automatic sunset and sunrise schedules.&lt;br /&gt;
* Sending automated alerts if a door sensor changes state&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Automation&amp;diff=19245</id>
		<title>Automation</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Automation&amp;diff=19245"/>
		<updated>2026-07-10T07:30:56Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Events system scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
=Introduction=&lt;br /&gt;
&lt;br /&gt;
This page gives an overview of different methods of automation for devices to act on input from sensors or switches.&lt;br /&gt;
&lt;br /&gt;
=Scenes and Groups=&lt;br /&gt;
What is the difference between Scenes and Groups:&lt;br /&gt;
&lt;br /&gt;
*A &amp;quot;Group&amp;quot; is a set you can turn on or off together. Like a big extension cord with a power switch. They all go on or off. But every device can switch on with different characteristics like dim level, color etc.&lt;br /&gt;
*A &amp;quot;Scene&amp;quot; is a predefined setup of lights and devices. So you can setup 1 light to be on, another to off. Have the ledstrip/milight set to a nice blue color, close your curtains, switch on your radio on station Xyz. That&#039;s also why you can&#039;t switch a scene off, but only to on. You will have to make an extra scene (or group) to switch the devices off.&lt;br /&gt;
&lt;br /&gt;
So for example a group is used to turn all lights off when you leave the house.&lt;br /&gt;
&lt;br /&gt;
And a scene is used when you have a nice setup of lightning you want when you are going to watch a movie.&lt;br /&gt;
&lt;br /&gt;
For more instructions go to page [[Managing Devices#Scenes .28also for Groups.29|Managing devices - Scenes and Groups]]&lt;br /&gt;
&lt;br /&gt;
=Timers=&lt;br /&gt;
Each switch, group, scene or thermostat device can be activated by timers to change the status or for thermostats, the setpoint temperature.&lt;br /&gt;
&lt;br /&gt;
There can be more timers per switch/thermostat so you can make a complete schedule. They also make part of a [[Timer Plan|timer plan]] so you can set up for example a holiday schedule for your lights.&lt;br /&gt;
&lt;br /&gt;
The timer options are partly dependent of the switch type and Timer type. There are lots of timer types like &amp;quot;x minutes after sunset&amp;quot;, monthly, even day numbers, daily at time xx:xx etc.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[Managing Devices#Edit Device Timers|Managing Devices -  Edit Device Timers]]&lt;br /&gt;
=Notifications=&lt;br /&gt;
There are a great selection of notification types so it&#039;s possible to do some interesting things with this but chances are any of those interesting things should go under the action scripts.&lt;br /&gt;
&lt;br /&gt;
This option is available on the Switches screen when you select a switch to work with.&lt;br /&gt;
&lt;br /&gt;
See also the [[Application Settings|Application Settings, section Notifications]] for general setup of notifications and page [[Managing Devices#Edit Notifications|Managing Devices - Edit Notifications]] for creating device notifications.&lt;br /&gt;
&lt;br /&gt;
=Scripts=&lt;br /&gt;
For more complex automation scripts can be used.&lt;br /&gt;
&lt;br /&gt;
You have a choice of [[Blockly]], Python, [[LUA commands|LUA]] or [[DzVents: next generation Lua scripting|dzVents]]. Blockly is the easiest way to start. You&#039;ll get more power with dzVents.&lt;br /&gt;
&lt;br /&gt;
Please see the [[Scripting in Domoticz|scripting]] details on how to use either of these scripting methods.&lt;br /&gt;
&lt;br /&gt;
==Devices Action Scripts==&lt;br /&gt;
[[File:2015-08-21 12 26 41-Domoticz.png|frame]]Devices (Switches) have an &#039;&#039;On Action&#039;&#039; and &#039;&#039;Off Action&#039;&#039; option that allows you to run a script either via a URL or via the script folder. This will be discussed in the [[Scripting in Domoticz|script page]].&lt;br /&gt;
To get to these you need to edit a switch.&lt;br /&gt;
&lt;br /&gt;
See also page [[Managing Devices]]&lt;br /&gt;
&lt;br /&gt;
==Events system scripts==&lt;br /&gt;
Domoticz allows you to write scripts in the Web-Interface just go to the e  [[Events|Event system]]:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup -&amp;gt; More Options -&amp;gt; Events&#039;&#039;&#039; in this view you see a &amp;quot;+&amp;quot; sign in a tab to choose what script you want to write.&lt;br /&gt;
&lt;br /&gt;
;Script Method&lt;br /&gt;
:You have a choice of [[Blockly]], [[Python Events|Python]], [[LUA commands|LUA]] or [[DzVents: next generation Lua scripting|dzVents]]. Blockly is the easiest way to start. You&#039;ll get more power with dzVents but Blockly is a great place to start!&lt;br /&gt;
&lt;br /&gt;
==== DzVents automation wizard ====&lt;br /&gt;
In 2026.2 the [[DzVents automation wizard]] has been introduced which makes it easier to create the dzvents scripts, no code required.&lt;br /&gt;
;[[Events|For more info on the event sytem check wifi page Event system]]&lt;br /&gt;
;[[File:Events_user_interface.png|none|frame|[[File:Blockly example.png|alt=|left]]]]&lt;br /&gt;
&lt;br /&gt;
==Lua, Python and DzVents File System Based==&lt;br /&gt;
For technical users that want to write complicated scripts and include additional Lua, DzVents or Python modules and scripts, Domoticz also supports file-based scripts. These are not included in the Domoticz standard Backup &amp;amp; Restore functions and are not versioned so this needs to be done manually. For more info check page [[Scripting in Domoticz]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
[[Scripting_in_Domoticz| Scripts]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Automation&amp;diff=19244</id>
		<title>Automation</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Automation&amp;diff=19244"/>
		<updated>2026-07-10T07:29:51Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Events system scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
=Introduction=&lt;br /&gt;
&lt;br /&gt;
This page gives an overview of different methods of automation for devices to act on input from sensors or switches.&lt;br /&gt;
&lt;br /&gt;
=Scenes and Groups=&lt;br /&gt;
What is the difference between Scenes and Groups:&lt;br /&gt;
&lt;br /&gt;
*A &amp;quot;Group&amp;quot; is a set you can turn on or off together. Like a big extension cord with a power switch. They all go on or off. But every device can switch on with different characteristics like dim level, color etc.&lt;br /&gt;
*A &amp;quot;Scene&amp;quot; is a predefined setup of lights and devices. So you can setup 1 light to be on, another to off. Have the ledstrip/milight set to a nice blue color, close your curtains, switch on your radio on station Xyz. That&#039;s also why you can&#039;t switch a scene off, but only to on. You will have to make an extra scene (or group) to switch the devices off.&lt;br /&gt;
&lt;br /&gt;
So for example a group is used to turn all lights off when you leave the house.&lt;br /&gt;
&lt;br /&gt;
And a scene is used when you have a nice setup of lightning you want when you are going to watch a movie.&lt;br /&gt;
&lt;br /&gt;
For more instructions go to page [[Managing Devices#Scenes .28also for Groups.29|Managing devices - Scenes and Groups]]&lt;br /&gt;
&lt;br /&gt;
=Timers=&lt;br /&gt;
Each switch, group, scene or thermostat device can be activated by timers to change the status or for thermostats, the setpoint temperature.&lt;br /&gt;
&lt;br /&gt;
There can be more timers per switch/thermostat so you can make a complete schedule. They also make part of a [[Timer Plan|timer plan]] so you can set up for example a holiday schedule for your lights.&lt;br /&gt;
&lt;br /&gt;
The timer options are partly dependent of the switch type and Timer type. There are lots of timer types like &amp;quot;x minutes after sunset&amp;quot;, monthly, even day numbers, daily at time xx:xx etc.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[Managing Devices#Edit Device Timers|Managing Devices -  Edit Device Timers]]&lt;br /&gt;
=Notifications=&lt;br /&gt;
There are a great selection of notification types so it&#039;s possible to do some interesting things with this but chances are any of those interesting things should go under the action scripts.&lt;br /&gt;
&lt;br /&gt;
This option is available on the Switches screen when you select a switch to work with.&lt;br /&gt;
&lt;br /&gt;
See also the [[Application Settings|Application Settings, section Notifications]] for general setup of notifications and page [[Managing Devices#Edit Notifications|Managing Devices - Edit Notifications]] for creating device notifications.&lt;br /&gt;
&lt;br /&gt;
=Scripts=&lt;br /&gt;
For more complex automation scripts can be used.&lt;br /&gt;
&lt;br /&gt;
You have a choice of [[Blockly]], Python, [[LUA commands|LUA]] or [[DzVents: next generation Lua scripting|dzVents]]. Blockly is the easiest way to start. You&#039;ll get more power with dzVents.&lt;br /&gt;
&lt;br /&gt;
Please see the [[Scripting in Domoticz|scripting]] details on how to use either of these scripting methods.&lt;br /&gt;
&lt;br /&gt;
==Devices Action Scripts==&lt;br /&gt;
[[File:2015-08-21 12 26 41-Domoticz.png|frame]]Devices (Switches) have an &#039;&#039;On Action&#039;&#039; and &#039;&#039;Off Action&#039;&#039; option that allows you to run a script either via a URL or via the script folder. This will be discussed in the [[Scripting in Domoticz|script page]].&lt;br /&gt;
To get to these you need to edit a switch.&lt;br /&gt;
&lt;br /&gt;
See also page [[Managing Devices]]&lt;br /&gt;
&lt;br /&gt;
==Events system scripts==&lt;br /&gt;
Domoticz allows you to write scripts in the Web-Interface just go to the e  [[Events|Event system]]:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setup -&amp;gt; More Options -&amp;gt; Events&#039;&#039;&#039; in this view you see a &amp;quot;+&amp;quot; sign in a tab to choose what script you want to write.&lt;br /&gt;
&lt;br /&gt;
;Script Method&lt;br /&gt;
:You have a choice of [[Blockly]], [[Python Events|Python]], [[LUA commands|LUA]] or [[DzVents: next generation Lua scripting|dzVents]]. Blockly is the easiest way to start. You&#039;ll get more power with dzVents but Blockly is a great place to start!&lt;br /&gt;
;&lt;br /&gt;
;[[Events|For more info check wifi page Event system]]&lt;br /&gt;
;[[File:Events_user_interface.png|none|frame|[[File:Blockly example.png|alt=|left]]]]&lt;br /&gt;
&lt;br /&gt;
==Lua, Python and DzVents File System Based==&lt;br /&gt;
For technical users that want to write complicated scripts and include additional Lua, DzVents or Python modules and scripts, Domoticz also supports file-based scripts. These are not included in the Domoticz standard Backup &amp;amp; Restore functions and are not versioned so this needs to be done manually. For more info check page [[Scripting in Domoticz]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
[[Scripting_in_Domoticz| Scripts]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Events&amp;diff=19243</id>
		<title>Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Events&amp;diff=19243"/>
		<updated>2026-07-10T07:24:08Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* dzVents Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Event System handles scripts/actions that are activated on triggers like device changes, security events, time, user variables etc&lt;br /&gt;
&lt;br /&gt;
Domoticz will execute all time, variable and device triggers when the relevant trigger occurs, e.g. the device scripts are run when a device changes, the variable scripts are run when a variable changes, the time scripts will run every minute. Also scripts don&#039;t run in background. Domoticz will wait for the script to complete so don&#039;t use sleep() statements and get the script done as fast as possible. Also be aware of time consuming (external) actions like getting solar panel data from an internet portal that can block the throughput of other events in Domoticz.&lt;br /&gt;
&lt;br /&gt;
The event system will have two options to create events:&lt;br /&gt;
&lt;br /&gt;
==Using script creation &amp;amp; editing functionality within Domoticz itself==&lt;br /&gt;
&lt;br /&gt;
You can find the interface here: &#039;&#039;&#039;Setup -&amp;gt; More options -&amp;gt; Events&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The Events page has 2 sections:&lt;br /&gt;
&lt;br /&gt;
#&#039;&#039;&#039;My automation scripts&#039;&#039;&#039;.  A list of all your scripts (enabled or disabled) stored in the database.&lt;br /&gt;
#&#039;&#039;&#039;Editor&#039;&#039;&#039; Here you can create and edit your scripts.It has minimal 2 tabs, when adding a script it will be added to the tabs&lt;br /&gt;
##&#039;&#039;&#039;Device current state list&#039;&#039;&#039; Here all your devices are listed with the current value so you do not have to switch to the device list in Setup-Devices. There is a Refresh button to update the statuses.&lt;br /&gt;
##&#039;&#039;&#039;Add script (+ sign)&#039;&#039;&#039;.  The Editor/Event Engine that will be used for the script. Drop down values:&lt;br /&gt;
##*Blockly&lt;br /&gt;
##*Python&lt;br /&gt;
##*Lua With drop down list for event type&lt;br /&gt;
##*dzVents With drop down list for event type&lt;br /&gt;
##*&#039;&#039;&#039;Event Type&#039;&#039;&#039;.   Controls what events events will cause Domoticz to execute the script.  Drop down values:&lt;br /&gt;
##*#All - Will run whenever anything happens that triggers the event system to run a script&lt;br /&gt;
##*#Device - Will run whenever ANY device state/value change&lt;br /&gt;
##*#Security - Will run whenever there is a security event&lt;br /&gt;
##*#Time - Will run once per minute.  Scripts are executed one at a time.&lt;br /&gt;
##*#User Variable - Will run when User Variables are updated&lt;br /&gt;
##*#dzVents has more event types, [[DzVents: next generation LUA scripting|see the documentation]]&lt;br /&gt;
&lt;br /&gt;
Event scripts can be enabled or disabled using the &amp;quot;On/Off&amp;quot; checkbox. Disabled events are marked red in the events list. &lt;br /&gt;
&lt;br /&gt;
Event scripts can be saved with the Save button and be deleted with the Delete button.&lt;br /&gt;
&lt;br /&gt;
Scripts will be stored in the Domoticz database itself so do not need to be backed up separately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Events user interface.png]]&lt;br /&gt;
&lt;br /&gt;
===Devices Current states Tab===&lt;br /&gt;
In this Tab you can see the current state and values of all devices in the Domoticz environment. &lt;br /&gt;
&lt;br /&gt;
With the button Refresh these states and values are refreshed.&lt;br /&gt;
&lt;br /&gt;
[[File:Events Device status.png]]&lt;br /&gt;
&lt;br /&gt;
===The &amp;quot;Blockly&amp;quot; interface===&lt;br /&gt;
&lt;br /&gt;
For getting started with [[Blockly]] go to its wiki page [[Blockly]].&lt;br /&gt;
&lt;br /&gt;
[[File:Blockymonday.PNG]]&lt;br /&gt;
&lt;br /&gt;
Domoticz examples can be found in the forum: http://www.domoticz.com/forum/viewtopic.php?f=15&amp;amp;t=31 &lt;br /&gt;
&lt;br /&gt;
===dzVents Interface===&lt;br /&gt;
[[DzVents: next generation Lua scripting|DzVents]] short for Domoticz Easy Events, brings Lua scripting in Domoticz to a whole new level. Writing scripts for Domoticz has never been so easy. Not only can you define triggers more easily, and have full control over timer-based scripts with extensive scheduling support, dzVents presents you with an easy to use API to all necessary information in Domoticz. No longer do you have to combine all kinds of information given to you by Domoticz in many different data tables. You don’t have to construct complex commandArrays anymore. dzVents encapsulates all the Domoticz peculiarities regarding controlling and querying your devices. And on top of that, script performance has increased a lot if you have many scripts because Domoticz will fetch all device information only once for all your device scripts and timer scripts.&lt;br /&gt;
&lt;br /&gt;
By creating scripts inside Domoticz using the internal Domoticz event editor. To create a new dzVents script:&lt;br /&gt;
&lt;br /&gt;
#Go to &#039;&#039;&#039;Setup &amp;gt; More Options &amp;gt; Events&#039;&#039;&#039;.&lt;br /&gt;
#Press the + button and choose &#039;&#039;&#039;dzVents&#039;&#039;&#039;.&lt;br /&gt;
#You must then choose a template on event type&lt;br /&gt;
&lt;br /&gt;
They are there just for convenience during writing the script; the actual trigger for the script is determined by what you entered in the on = section. The internal event editor have a help button when writing dzVents scripts, next to Save and Delete. This button opens this wiki in a separate browser tab when clicked. Name your script to your liking but leave out the extension .lua&lt;br /&gt;
&lt;br /&gt;
Check out [[DzVents: next generation Lua scripting]] for instructions how to use DzVents including extensive documentation.&lt;br /&gt;
&lt;br /&gt;
==== DzVents automation wizard ====&lt;br /&gt;
In 2026.2 the [[DzVents automation wizard]] has been introduced which makes it easier to create the dzvents scripts, no code required.&lt;br /&gt;
&lt;br /&gt;
[[File:Dzventsautomationwizard.png]]&lt;br /&gt;
&lt;br /&gt;
===Lua Interface===&lt;br /&gt;
&lt;br /&gt;
Lua events maintain through the editor work in the way that file based Lua scripts do and use the same &#039;commandArray&#039; interface.  There are samples and help on this Wiki.  Currently Python is only an option if Domoticz is built from source with Python enabled.&lt;br /&gt;
&lt;br /&gt;
The Lua editor is context sensitive and will prompt with auto-complete options and show common errors to help with debugging.  The editor theme can be changed by pressing the control and comma keys at the same time. Domoticz will save the scheme when events are saved.&lt;br /&gt;
&lt;br /&gt;
To create a new Lua event:&lt;br /&gt;
&lt;br /&gt;
#Go to &#039;&#039;&#039;Setup &amp;gt; More Options &amp;gt; Events&#039;&#039;&#039;.&lt;br /&gt;
#Press the + button and choose &#039;&#039;&#039;Lua&#039;&#039;&#039;.&lt;br /&gt;
#You must then choose a template on event type&lt;br /&gt;
&lt;br /&gt;
A template script will be shown that shows one way of processing that type of event.  &lt;br /&gt;
&lt;br /&gt;
The [[LUA_commands]] page has more information on the available commands that can be passed back to Domoticz.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Python Interface===&lt;br /&gt;
Python events maintain through the editor work in the way that file based Lua scripts do and use the same &#039;commandArray&#039; interface. This python event system has limited functionality, it can only switch devices On/Off, no other update parameters are available.&lt;br /&gt;
&lt;br /&gt;
Currently Python is only an option if Domoticz is built from source with Python enabled (but enabled as default)&lt;br /&gt;
&lt;br /&gt;
The Python editor is context sensitive and will prompt with auto-complete options and show common errors to help with debugging.  The editor theme can be changed by pressing the control and comma keys at the same time. Domoticz will save the scheme when events are saved.&lt;br /&gt;
&lt;br /&gt;
To create a new Python event:&lt;br /&gt;
&lt;br /&gt;
#Go to &#039;&#039;&#039;Setup &amp;gt; More Options &amp;gt; Events&#039;&#039;&#039;.&lt;br /&gt;
#Press the + button and choose &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
#You must then choose a template on event type&lt;br /&gt;
&lt;br /&gt;
A template script will be shown that shows one way of processing that type of event.  &lt;br /&gt;
&lt;br /&gt;
The  [[Python Events]] page has more information on the available commands that can be passed back to Domoticz.&lt;br /&gt;
&lt;br /&gt;
===User Variables===&lt;br /&gt;
You can use [[User variables]] to store your custom values to be used in scripts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text Editor Default Keyboard Shortcuts===&lt;br /&gt;
The build in Text Editor (ACE) has some handy short cuts. They are all listed here https://github.com/ajaxorg/ace/wiki/Default-Keyboard-Shortcuts&lt;br /&gt;
&lt;br /&gt;
Some Examples:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Line Operations====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Windows/Linux&lt;br /&gt;
!Mac&lt;br /&gt;
!Action&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-D&lt;br /&gt;
|Command-D&lt;br /&gt;
|Remove line&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Shift-Down&lt;br /&gt;
|Command-Option-Down&lt;br /&gt;
|Copy lines down&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Shift-Up&lt;br /&gt;
|Command-Option-Up&lt;br /&gt;
|Copy lines up&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Down&lt;br /&gt;
|Option-Down&lt;br /&gt;
|Move lines down&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Up&lt;br /&gt;
|Option-Up&lt;br /&gt;
|Move lines up&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Delete&lt;br /&gt;
|Ctrl-K&lt;br /&gt;
|Remove to line end&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Backspace&lt;br /&gt;
|Command-Backspace&lt;br /&gt;
|Remove to linestart&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Backspace&lt;br /&gt;
|Option-Backspace, Ctrl-Option-Backspace&lt;br /&gt;
|Remove word left&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Delete&lt;br /&gt;
|Option-Delete&lt;br /&gt;
|Remove word right&lt;br /&gt;
|-&lt;br /&gt;
| ---&lt;br /&gt;
|Ctrl-O&lt;br /&gt;
|Split line&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Selection====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Windows/Linux&lt;br /&gt;
!Mac&lt;br /&gt;
!Action&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-A&lt;br /&gt;
|Command-A&lt;br /&gt;
|Select all&lt;br /&gt;
|-&lt;br /&gt;
|Shift-Left&lt;br /&gt;
|Shift-Left&lt;br /&gt;
|Select left&lt;br /&gt;
|-&lt;br /&gt;
|Shift-Right&lt;br /&gt;
|Shift-Right&lt;br /&gt;
|Select right&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-Left&lt;br /&gt;
|Option-Shift-Left&lt;br /&gt;
|Select word left&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-Right&lt;br /&gt;
|Option-Shift-Right&lt;br /&gt;
|Select word right&lt;br /&gt;
|-&lt;br /&gt;
|Shift-Home&lt;br /&gt;
|Shift-Home&lt;br /&gt;
|Select line start&lt;br /&gt;
|-&lt;br /&gt;
|Shift-End&lt;br /&gt;
|Shift-End&lt;br /&gt;
|Select line end&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Shift-Right&lt;br /&gt;
|Command-Shift-Right&lt;br /&gt;
|Select to line end&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Shift-Left&lt;br /&gt;
|Command-Shift-Left&lt;br /&gt;
|Select to line start&lt;br /&gt;
|-&lt;br /&gt;
|Shift-Up&lt;br /&gt;
|Shift-Up&lt;br /&gt;
|Select up&lt;br /&gt;
|-&lt;br /&gt;
|Shift-Down&lt;br /&gt;
|Shift-Down&lt;br /&gt;
|Select down&lt;br /&gt;
|-&lt;br /&gt;
|Shift-PageUp&lt;br /&gt;
|Shift-PageUp&lt;br /&gt;
|Select page up&lt;br /&gt;
|-&lt;br /&gt;
|Shift-PageDown&lt;br /&gt;
|Shift-PageDown&lt;br /&gt;
|Select page down&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-Home&lt;br /&gt;
|Command-Shift-Up&lt;br /&gt;
|Select to start&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-End&lt;br /&gt;
|Command-Shift-Down&lt;br /&gt;
|Select to end&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-D&lt;br /&gt;
|Command-Shift-D&lt;br /&gt;
|Duplicate selection&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-P&lt;br /&gt;
| ---&lt;br /&gt;
|Select to matching bracket&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Find/Replace====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Windows/Linux&lt;br /&gt;
!Mac&lt;br /&gt;
!Action&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-F&lt;br /&gt;
|Command-F&lt;br /&gt;
|Find&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-H&lt;br /&gt;
|Command-Option-F&lt;br /&gt;
|Replace&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-K&lt;br /&gt;
|Command-G&lt;br /&gt;
|Find next&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl-Shift-K&lt;br /&gt;
|Command-Shift-G&lt;br /&gt;
|Find previous&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==By adding your own scripts to the scripts/lua/ dir in your domoticz installation folder.==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: &#039;&#039;&#039;&#039;&#039;The power of Domoticz and Lua can be generalised by writing [[Smart Lua Scripts]], this method of combining a switch naming convention and a Lua script, allows a simple script to be used multiple times and simplifies both the addition and maintenance of further devices.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The lua scripts folder has two demo scripts that can serve as a starting point. The script filename has 3 components each sub-divided by an underscore&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;lt;code&amp;gt;script_trigger_name.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Trigger can be &#039;time&#039;, &#039;device&#039;, &#039;variable&#039; or &#039;security&#039;, name can be any string for your reference, script_device_MyOtherDeviceNameOnWhenMyDeviceNameOn.lua for instance. &lt;br /&gt;
&lt;br /&gt;
Domoticz will execute all time, variable and device triggers when the relevant trigger occurs, e.g. the device scripts are run when a device changes, the variable scripts are run when a variable changes, the time scripts will run every minute. Also scripts don&#039;t run in background. Domoticz will wait for the script to complete so don&#039;t use sleep() statements and get the script done as fast as possible.&lt;br /&gt;
&lt;br /&gt;
Domoticz ignores all scripts named &amp;quot;demo&amp;quot; and scripts without the .lua extension, so copy the examples and change the name. &lt;br /&gt;
&lt;br /&gt;
Make sure that if you are using non-ansi characters you save the file in UTF-8 encoding, without a BOM header&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LUA Scripts===&lt;br /&gt;
The [[LUA_commands]] page has more information on the available commands that can be passed back to Domoticz.&lt;br /&gt;
&lt;br /&gt;
====Tables====&lt;br /&gt;
&lt;br /&gt;
=====Available in time triggered scripts=====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
timeofday&lt;br /&gt;
uservariables&lt;br /&gt;
uservariables_lastupdate&lt;br /&gt;
&lt;br /&gt;
globalvariables&lt;br /&gt;
&lt;br /&gt;
otherdevices&lt;br /&gt;
otherdevices_idx&lt;br /&gt;
otherdevices_lastlevel&lt;br /&gt;
otherdevices_lastupdate&lt;br /&gt;
otherdevices_svalues&lt;br /&gt;
&lt;br /&gt;
-- Below tables only when such devices exist on your system. (else nil)&lt;br /&gt;
otherdevices_barometer&lt;br /&gt;
otherdevices_dewpoint&lt;br /&gt;
otherdevices_humidity&lt;br /&gt;
otherdevices_rain&lt;br /&gt;
otherdevices_rain_lasthour&lt;br /&gt;
otherdevices_temperature&lt;br /&gt;
otherdevices_utility&lt;br /&gt;
otherdevices_weather&lt;br /&gt;
otherdevices_winddir&lt;br /&gt;
otherdevices_windgust&lt;br /&gt;
otherdevices_windspeed&lt;br /&gt;
otherdevices_zwavealarms&lt;br /&gt;
&lt;br /&gt;
otherdevices_scenesgroups&lt;br /&gt;
otherdevices_scenesgroups_idx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Tables available in device triggered scripts=====&lt;br /&gt;
&lt;br /&gt;
All of the tables available in device triggered scripts  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
devicechanged&lt;br /&gt;
devicechanged_ext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Tables available in variable triggered scripts=====&lt;br /&gt;
&lt;br /&gt;
All of the tables available in variable triggered scripts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
uservariablechanged&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Use of Tables=====&lt;br /&gt;
The &#039;&#039;devicechanged&#039;&#039; table contains a devicename entry, indicating the new state for the device that triggered the device event:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 devicechanged[&#039;devicename&#039;]=&#039;Status&#039;, e.g. devicechanged[&#039;MyLamp&#039;]=&#039;On&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
if the device that triggered a device-event measures temperature, humidity or barometric pressure, there will obviously not be a devicechanged[&#039;devicename&#039;]=&#039;Status&#039; value because these values are analogue and not digital (on or off). &lt;br /&gt;
Instead, the value type is appended (added) to the devicename and can be checked as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 devicechanged[&#039;devicename_Temperature&#039;] = value&lt;br /&gt;
 devicechanged[&#039;devicename_Humidity&#039;] = value&lt;br /&gt;
 devicechanged[&#039;devicename_Barometer&#039;] = value&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The whole string (devicename + type) is case sensitive, value type should start with uppercase. If your thermometer is named &amp;quot;MyThermometer&amp;quot;, check its incoming temperature value by stating something like &amp;quot;if devicechanged[&#039;MyThermometer_Temperature&#039;] &amp;gt; 20 then&amp;quot;. If you&#039;re not sure which values are coming in:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 for i, v in pairs(devicechanged) do print(i, v) end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &#039;&#039;otherdevices&#039;&#039; table contains the status for all other devices, e.g.: &amp;lt;code&amp;gt;otherdevices[&#039;yourotherdevicename&#039;]=&#039;On&#039;&amp;lt;/code&amp;gt;. When a script is triggered by time, there will be no devicechanged value, so use otherdevices to access device states. &lt;br /&gt;
&lt;br /&gt;
The o&#039;&#039;therdevices_lastupdate&#039;&#039; table contains the date + time of last update for all other devices, e.g.:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;otherdevices_lastupdate[&#039;Door&#039;] = &#039;2013-07-10 18:14:32&#039;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Temperature, humidity and barometer values for other devices can be found in otherdevices_temperature[&#039;yourdevice&#039;],otherdevices_humidity[&#039;yourdevice&#039;] and otherdevices_barometer[&#039;yourdevice&#039;] tables.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;otherdevices_idx&#039;&#039; table contains the indexes for devices (which can be seen in &#039;Devices&#039; tab, used in json sequests etc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;otherdevices_idx[&#039;Door&#039;] = 42&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To modify an otherdevice value, you should use commandArray[&#039;UpdateDevice&#039;]=&#039;idx|nValue|sValue&#039; where idx is the device index, nValue and sValue the values to modify (see json page for details - [[Domoticz API/JSON URL&#039;s]])&lt;br /&gt;
&lt;br /&gt;
For using user variables in Lua scripts, there are three tables available: &#039;&#039;uservariables, uservariables_lastupdate&#039;&#039; and &#039;&#039;uservariablechanged&#039;&#039;. The uservariablechanged table (with only the variable that triggered the event) is only available in your event scripts (script_variable_name.lua), the other two are always available. Reference your variable by name, e.g. if uservariables[&amp;quot;MyVar&amp;quot;] = ...&lt;br /&gt;
&lt;br /&gt;
====commandArray====&lt;br /&gt;
Each script has to return a commandArray, which is filled based on succesful execution of your script. Commands in the commandArray will only be executed after the array has been returned back to Domoticz to be executed at the end of the script. This means that is is not possible to have one Lua script do multiple actions on the same device.&lt;br /&gt;
&lt;br /&gt;
Using the 3 or 2 tables (depending on event type), build your own event logic, for instance:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 if (devicechanged[&#039;MyDeviceName&#039;] == &#039;On&#039; and otherdevices[&#039;MyOtherDeviceName&#039;] == &#039;Off&#039;) then&lt;br /&gt;
     commandArray[&#039;MyOtherDeviceName&#039;]=&#039;On&#039;&lt;br /&gt;
 end&lt;br /&gt;
 return commandArray&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Put device names and states between the square brackets exactly like they appear in Domoticz, the string is case sensitive and spaces need to be included e.g. devicechanged[&#039;Blue Light&#039;].&lt;br /&gt;
&lt;br /&gt;
When adding device states to the command array, choose the required command for your device, e.g. &#039;On&#039;, &#039;Off&#039;, &#039;Group On&#039;, etc. For dimmable devices, use command &#039;Set Level X&#039; where X is a percentage (0-100) integer (do not put a percentage symbol after the value). There are three ways to set a device state. The most basic one is to just specify the new state (e.g. On/Off), which will set the new state immediately when the script logic evaluates to true.&lt;br /&gt;
&lt;br /&gt;
It is also possible to change the state for a device for a fixed period of time; if the device only needs to be turned on for 10 minutes, use &#039;On FOR 10&#039;.&lt;br /&gt;
&lt;br /&gt;
To add a randomized timer to a device change, for instance to turn on a device somewhere in the next 30 minutes, use &#039;On RANDOM 30&#039;. FOR and RANDOM are in minutes.&lt;br /&gt;
&lt;br /&gt;
To change the state for a device after a fixed period of time; if the device only needs to be turned on after 10 seconds, use &#039;On AFTER 10&#039;. AFTER is in seconds and accepts 3 seconds at least. (&#039;On AFTER 2&#039; doesn&#039;t work).&lt;br /&gt;
&lt;br /&gt;
You can schedule severals commands. In this example , the testSwitch will go On after 5 seconds , and then goes On again 10 seconds after. (and not 15 seconds after ...)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
   commandArray[#commandArray + 1] = {[&#039;testSwitch&#039;] =&#039;On AFTER 5&#039; }&lt;br /&gt;
   commandArray[#commandArray + 1] = {[&#039;testSwitch&#039;] =&#039;On AFTER 15&#039; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keywords FOR , RANDOM, AFTER must be written in CAPITAL LETTER.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To switch a &#039;&#039;&#039;scene or group&#039;&#039;&#039;, put prefix &#039;Scene:&#039; or &#039;Group:&#039; in front of the scene name. Note that it is not possible to check the state of a scene or group, since that is not its intended use. Check a (significant) single device from the scene/group table before switching scenes. Scenes can only be turned on, groups can be turned on and off. It is also possible to activate or deactivate a group or scene schedule by using &#039;Active&#039; or &#039;Inactive&#039;. This for instance enables the activation of presence simulation; when an alarm device is activated, also activate lighting schedules to simulate presence.&lt;br /&gt;
&lt;br /&gt;
====Notifications====&lt;br /&gt;
Using the &#039;SendNotification&#039; command a message can be sent to email or the notification system, whichever is set in Domoticz preferences.&amp;lt;br&amp;gt;&lt;br /&gt;
Use a # to separate subject, message body, priority and sound (pushover only).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Priority values:&amp;lt;br&amp;gt;&lt;br /&gt;
 -2 Low (Not available on Pushover)&amp;lt;br&amp;gt;&lt;br /&gt;
 -1 Moderate (Prowl/NMA) Quiet (Pushover)&amp;lt;br&amp;gt;&lt;br /&gt;
  0 Normal&amp;lt;br&amp;gt;&lt;br /&gt;
  1 High (Prowl/NMA) bypasses quiet hours (Pushover)&amp;lt;br&amp;gt;&lt;br /&gt;
  2 Emergency (Prowl/NMA) requires confirmation (Pushover)&amp;lt;br&amp;gt;&lt;br /&gt;
The Pushover system also supports different sounds. See [https://pushover.net/api#sounds]&lt;br /&gt;
&lt;br /&gt;
====CommandArray Examples====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using &#039;OpenURL&#039; it is possible to trigger a url/api based on an event. The url will not retrieve/parse any data, use it for one way communication.&lt;br /&gt;
&lt;br /&gt;
By prepending &amp;quot;Variable:&amp;quot; an existing variable can be updated. &lt;br /&gt;
&lt;br /&gt;
Some valid examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray[&#039;Switch&#039;]=&#039;On&#039;&lt;br /&gt;
 commandArray[&#039;Blinds&#039;]=&#039;Close&#039;&lt;br /&gt;
 commandArray[&#039;Scene:Livingroom&#039;]=&#039;On&#039;         -- remember, Scene cannot be turned Off!&lt;br /&gt;
 commandArray[&#039;Group:Kitchen&#039;]=&#039;Inactive&#039;&lt;br /&gt;
 commandArray[&#039;Keyfob&#039;]=&#039;Group On&#039;&lt;br /&gt;
 commandArray[&#039;DimmableDevice&#039;]=&#039;Set Level 50&#039;&lt;br /&gt;
 commandArray[&#039;Selector&#039;]=&#039;Set Level: 50&#039;&lt;br /&gt;
 commandArray[&#039;SendNotification&#039;]=&#039;subject#body#0&#039;&lt;br /&gt;
 commandArray[&#039;SendEmail&#039;]=&#039;subject#body#your@email.com&#039;&lt;br /&gt;
 commandArray[&#039;OpenURL&#039;]=&#039;www.yourdomain.com/api/movecamtopreset.cgi&#039; &lt;br /&gt;
 commandArray[&#039;Blinds&#039;]=&#039;Open RANDOM 30&#039;&lt;br /&gt;
 commandArray[&#039;Porch Light&#039;]=&#039;On FOR 2&#039;&lt;br /&gt;
 commandArray[&#039;Variable:MyVar&#039;]=&#039;Some value&#039;&lt;br /&gt;
 commandArray[&#039;Variable:MyVar&#039;]=&#039;Some value AFTER 3&#039;&lt;br /&gt;
 commandArray[textDeviceIdx] = { [&#039;UpdateDevice&#039;] = textDeviceIdx..&#039;|0|&#039;..&#039;some text&#039; }&lt;br /&gt;
 commandArray[tempDeviceIdx] = { [&#039;UpdateDevice&#039;] = tempDeviceIdx..&#039;|0|&#039;..temp }&lt;br /&gt;
 commandArray[tempHumDevIdx] = { [&#039;UpdateDevice&#039;] = tempHumDevIdx..&#039;|0|&#039;.. temp ..&#039;;&#039;.. hum ..&#039;;&#039;.. hum_stat }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-- ... (see json page [[Domoticz API/JSON URL&#039;s]] for exact number of arguments)&lt;br /&gt;
&lt;br /&gt;
In device scripts, *always* do a check on the state of the changed device first. The device scripts are triggered fairly often, especially when you have a lot of thermometers and other measurement devices. If you just set the commandArray without any conditions, the script always just execute those commands at every device change, and those changes will trigger the scripts again and again resulting in a loop.&lt;br /&gt;
&lt;br /&gt;
The same event will not fire unless the previous one completes. If an action is set using &amp;quot;Set FOR x minutes&amp;quot; or &amp;quot;RANDOM within x minutes&amp;quot;, the same event will not schedule until the first one completes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using time conditions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 time = os.date(&amp;quot;*t&amp;quot;)&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 if (devicechanged[&#039;MyDeviceName&#039;] == &#039;On&#039; and otherdevices[&#039;MyOtherDeviceName&#039;] == &#039;Off&#039; and time.hour &amp;gt;= 22) then&lt;br /&gt;
    commandArray[&#039;MyOtherDeviceName&#039;]=&#039;On&#039;&lt;br /&gt;
 end&lt;br /&gt;
 return commandArray &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For checking day- or nighttime use the timeofday array with boolean variables &amp;quot;Daytime&amp;quot; and &amp;quot;Nighttime&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 if (timeofday[&#039;Nighttime&#039;]) then&lt;br /&gt;
      print(&#039;its nighttime&#039;)&lt;br /&gt;
 end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If you want sunrise or sunset in a numeric value, use timeofday[&#039;SunriseInMinutes&#039;] and timeofday[&#039;SunsetInMinutes&#039;]. So when sunrise is at 7:13, timeofday[&#039;SunriseInMinutes&#039;] will be 433.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: start each &amp;quot;commandArray&amp;quot; line with a tab to indent it under the &amp;quot;if&amp;quot; statement. You can give multiple commands by specifying multiple command array entries:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 if (devicechanged[&#039;MyDeviceName&#039;] == &#039;On&#039; and otherdevices[&#039;MyOtherDeviceName&#039;] == &#039;Off&#039;) then&lt;br /&gt;
    commandArray[&#039;MyOtherDeviceName1&#039;]=&#039;On&#039;&lt;br /&gt;
    commandArray[&#039;MyOtherDeviceName2&#039;]=&#039;On&#039;&lt;br /&gt;
    commandArray[&#039;MyOtherDeviceName3&#039;]=&#039;Off&#039;&lt;br /&gt;
    commandArray[&#039;Scene:MyScene&#039;]=&#039;On&#039;&lt;br /&gt;
    commandArray[&#039;SendNotification&#039;]=&#039;subject#body#0&#039;&lt;br /&gt;
    commandArray[&#039;OpenURL&#039;]=&#039;www.yourdomain.com/api/movecamtopreset.cgi&#039; &lt;br /&gt;
    commandArray[&#039;Variable:MyVar&#039;]=&#039;Some value&#039;&lt;br /&gt;
 end&lt;br /&gt;
 return commandArray&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The Lua print command will output its statements to the domoticz log, so you can use that to check on values or your logic. For instance, if you want to check the other device states that get passed into Lua, add line:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 for i, v in pairs(otherdevices) do print(i, v) end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Make sure to disable it after debugging as it clutters the log. &lt;br /&gt;
&lt;br /&gt;
The commandArray also supports nested tables to send the same command type multiple times. To do this, give the command a numeric index (not alphanumeric with or without quotes!) and place the required action in a nested table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 commandArray[1]={[&#039;OpenURL&#039;]=&#039;www.cam1.com/api/movecamtopreset.cgi&#039; }&lt;br /&gt;
 commandArray[2]={[&#039;OpenURL&#039;]=&#039;www.cam2.com/api/movecamtopreset.cgi&#039; }&lt;br /&gt;
 commandArray[3]={[&#039;OpenURL&#039;]=&#039;www.cam3.com/api/movecamtopreset.cgi&#039; }&lt;br /&gt;
 return commandArray&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will run three url commands with separate addresses. Always start the commandarray index at 1; Lua uses 1 based indexes, so commandArray[0] will not run.&lt;br /&gt;
&lt;br /&gt;
Some examples (not meaningful, just to explain what will happen):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 commandArray[&#039;Lamp&#039;]=&#039;On&#039;&lt;br /&gt;
 commandArray[1]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[2]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[3]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[&#039;Lamp&#039;]=&#039;On&#039;&lt;br /&gt;
 return commandArray&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will turn &amp;quot;Lamp&amp;quot; on 4 times (the last array item overwrites the first).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 commandArray = {}&lt;br /&gt;
 commandArray[&#039;Lamp&#039;]=&#039;On&#039;&lt;br /&gt;
 commandArray[0]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[1]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[2]={[&#039;Lamp&#039;]=&#039;On&#039;}&lt;br /&gt;
 commandArray[&#039;Lamp&#039;]=&#039;On&#039;&lt;br /&gt;
 return commandArray&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will turn &amp;quot;Lamp&amp;quot; on 3 times (the last array item overwrites the first and the zero index is ignored).&lt;br /&gt;
&lt;br /&gt;
Tips&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Use this usefull form instead of counting the number of commands&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
commandArray[#commandArray + 1] = ...&lt;br /&gt;
commandArray[#commandArray + 1] = ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current state of the event system:&lt;br /&gt;
&lt;br /&gt;
- Not all device states are correctly passed to Lua at the moment, but the most common ones like On/Off, Open/Closed are. &lt;br /&gt;
- There is no check on the command in the commandArray. When you return commandArray[&#039;Kitchen light&#039;]=&amp;quot;Up&amp;quot;, we will not indicate that kitchen lights aren&#039;t meant to go up. Make sure you pass a valid command for the device. &lt;br /&gt;
&lt;br /&gt;
Unfortunately, Domoticz doesn&#039;t report which device changed state thereby causing a script_device_xx.lua script to run. However the devicechanged table gives the game away. The following can be used to identify which device was the culprit so include it at the beginning of your device scripts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 logging = true&lt;br /&gt;
 d = otherdevices&lt;br /&gt;
 device = &amp;quot;&amp;quot;&lt;br /&gt;
 for i, v in pairs(devicechanged) do&lt;br /&gt;
   if (#device == 0 or #i &amp;lt; #device) then device = i end&lt;br /&gt;
 end&lt;br /&gt;
 if (logging) then print(&amp;quot;Triggered by &amp;quot; .. device .. &amp;quot; now &amp;quot; .. d[device]) end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Subsequently, you can use something like the following to decide what to do next:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
 if (device == &amp;quot;PIR_1&amp;quot; or device == &amp;quot;PIR_2&amp;quot; or device == &amp;quot;PIR_3&amp;quot;) then&lt;br /&gt;
   if (d[device] == &amp;quot;Motion&amp;quot; and not globalvariables[&amp;quot;Security&amp;quot;] == &amp;quot;Disarmed&amp;quot; ) then&lt;br /&gt;
     whatever&lt;br /&gt;
   end&lt;br /&gt;
   return commandArray&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 if (device == &amp;quot;Keyfob&amp;quot; and d[device] == &amp;quot;On&amp;quot;) then&lt;br /&gt;
   whatever&lt;br /&gt;
   return commandArray&lt;br /&gt;
 end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... and so on&lt;br /&gt;
&lt;br /&gt;
The power of Domoticz and Lua can be generalised by writing [[Smart Lua Scripts]], this method of combining a switch naming convention and a Lua script, allows a simple script to be used multiple times and simplifies both the addition and maintenance of further devices.&lt;br /&gt;
&lt;br /&gt;
Post any issues here: &amp;lt;http://www.domoticz.com/forum/viewtopic.php?f=6&amp;amp;t=6&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Event Script Examples==&lt;br /&gt;
Lua Example scripts here: [[Event script examples]]&lt;br /&gt;
&lt;br /&gt;
Wiki page with examples: [[Scripts]]&lt;br /&gt;
&lt;br /&gt;
Post Lua script examples and discussion here: &amp;lt;http://www.domoticz.com/forum/viewtopic.php?f=4&amp;amp;t=39&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Post your own Blockly examples in forum: &amp;lt;http://www.domoticz.com/forum/viewtopic.php?f=4&amp;amp;t=31&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Post your own DzVents examples in forum: &amp;lt;https://www.domoticz.com/forum/viewforum.php?f=72&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Blockly]]&lt;br /&gt;
[[Category:Lua]]&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:Scripting‏‎]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19242</id>
		<title>DzVents automation wizard</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19242"/>
		<updated>2026-07-10T07:18:40Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* How it Works (UI Steps) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Domoticz Automation Wizard&#039;&#039;&#039; is a built-in step-by-step UI tool allowing you to create &amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; Lua scripts without writing code. Accessible via the Events Editor, it guides you through selecting triggers, conditions, and actions. The tool automatically translates these parameters into readable, underlying code.&lt;br /&gt;
&lt;br /&gt;
== How to Access the Wizard ==&lt;br /&gt;
&lt;br /&gt;
# Open your &#039;&#039;&#039;Domoticz dashboard&#039;&#039;&#039; and navigate to &amp;lt;code&amp;gt;Setup&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;More Options&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &#039;&#039;&#039;+ button&#039;&#039;&#039; to create a new script.&lt;br /&gt;
# Select &#039;&#039;&#039;dzVents&#039;&#039;&#039; and launch the &#039;&#039;&#039;Automation Wizard&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
[[File:Dzventsautomationwizard.png]]&lt;br /&gt;
&lt;br /&gt;
== How it Works (UI Steps) ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Trigger Selection:&#039;&#039;&#039; Define what activates the script (e.g., a specific device turning On, a security panel state change, or a time schedule).&lt;br /&gt;
* &#039;&#039;&#039;Configuration:&#039;&#039;&#039; Establish exactly which device or condition to evaluate.&lt;br /&gt;
* &#039;&#039;&#039;Action Setup:&#039;&#039;&#039; Determine the outcome (e.g., toggle another light, send a notification).&lt;br /&gt;
* &#039;&#039;&#039;Review &amp;amp; Output:&#039;&#039;&#039; The wizard dynamically generates the proper [[DzVents: next generation Lua scripting|&amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; syntax]], minimizing potential syntax errors.&lt;br /&gt;
&lt;br /&gt;
== Typical Use Cases ==&lt;br /&gt;
&lt;br /&gt;
* Linking a motion detector to a smart plug while factoring in room temperature or lux constraints.&lt;br /&gt;
* Setting up automatic sunset and sunrise schedules.&lt;br /&gt;
* Sending automated alerts if a door sensor changes state&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19241</id>
		<title>DzVents automation wizard</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=DzVents_automation_wizard&amp;diff=19241"/>
		<updated>2026-07-10T07:17:37Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: Created page with &amp;quot;The &amp;#039;&amp;#039;&amp;#039;Domoticz Automation Wizard&amp;#039;&amp;#039;&amp;#039; is a built-in step-by-step UI tool allowing you to create &amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; Lua scripts without writing code. Accessible via the Events Editor, it guides you through selecting triggers, conditions, and actions. The tool automatically translates these parameters into readable, underlying code.  == How to Access the Wizard ==  # Open your &amp;#039;&amp;#039;&amp;#039;Domoticz dashboard&amp;#039;&amp;#039;&amp;#039; and navigate to &amp;lt;code&amp;gt;Setup&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;More Options&amp;lt;/code&amp;gt; → &amp;lt;c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Domoticz Automation Wizard&#039;&#039;&#039; is a built-in step-by-step UI tool allowing you to create &amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; Lua scripts without writing code. Accessible via the Events Editor, it guides you through selecting triggers, conditions, and actions. The tool automatically translates these parameters into readable, underlying code.&lt;br /&gt;
&lt;br /&gt;
== How to Access the Wizard ==&lt;br /&gt;
&lt;br /&gt;
# Open your &#039;&#039;&#039;Domoticz dashboard&#039;&#039;&#039; and navigate to &amp;lt;code&amp;gt;Setup&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;More Options&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &#039;&#039;&#039;+ button&#039;&#039;&#039; to create a new script.&lt;br /&gt;
# Select &#039;&#039;&#039;dzVents&#039;&#039;&#039; and launch the &#039;&#039;&#039;Automation Wizard&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
[[File:Dzventsautomationwizard.png]]&lt;br /&gt;
&lt;br /&gt;
== How it Works (UI Steps) ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Trigger Selection:&#039;&#039;&#039; Define what activates the script (e.g., a specific device turning On, a security panel state change, or a time schedule).&lt;br /&gt;
* &#039;&#039;&#039;Configuration:&#039;&#039;&#039; Establish exactly which device or condition to evaluate.&lt;br /&gt;
* &#039;&#039;&#039;Action Setup:&#039;&#039;&#039; Determine the outcome (e.g., toggle another light, send a notification).&lt;br /&gt;
* &#039;&#039;&#039;Review &amp;amp; Output:&#039;&#039;&#039; The wizard dynamically generates the proper &amp;lt;code&amp;gt;dzVents&amp;lt;/code&amp;gt; syntax, minimizing potential syntax errors.&lt;br /&gt;
&lt;br /&gt;
== Typical Use Cases ==&lt;br /&gt;
&lt;br /&gt;
* Linking a motion detector to a smart plug while factoring in room temperature or lux constraints.&lt;br /&gt;
* Setting up automatic sunset and sunrise schedules.&lt;br /&gt;
* Sending automated alerts if a door sensor changes state&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=File:Dzventsautomationwizard.png&amp;diff=19240</id>
		<title>File:Dzventsautomationwizard.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=File:Dzventsautomationwizard.png&amp;diff=19240"/>
		<updated>2026-07-10T07:14:43Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dzvents automation wizard&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19239</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19239"/>
		<updated>2026-07-07T07:52:22Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js server (https://github.com/matter-js/matterjs-server)  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Thread and Matter rely heavily on IPv6, so make sure your network and Domoticz device can communicate on IPv6  &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Navigate to the docker compose directory (as example) where the matter.js docker-compose.yml file is created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd docker/matterjs-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose logs -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19237</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19237"/>
		<updated>2026-07-03T08:46:33Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ PypluginStore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|PyPluginStore&lt;br /&gt;
|modern plugin manager for Domoticz&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44626 link]&lt;br /&gt;
|https://github.com/adrighem/PyPluginStore&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus, to control 1 or more single-phase energy meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|DTS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus, to control 1 or more three-phase energy meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dts238&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti EQ2021 EQ3021 boilers&lt;br /&gt;
|Emmeti hot water heat pump&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-eq2021&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|Garbage Calender NL&lt;br /&gt;
|garbage/waste collection schedule&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44560 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_garbage&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|HP iLo monitor&lt;br /&gt;
|HP server monitor&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44638 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_HP_ilo&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KPN experia v10&lt;br /&gt;
|KPN Experia Box V10 Device Presence Tracker and control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44623 link]&lt;br /&gt;
|https://github.com/adrighem/domoticz-kpn-experia-v10&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WiFiTic Teleinfo&lt;br /&gt;
|Cartelectronic WiFiTic module&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44704 link]&lt;br /&gt;
|https://github.com/DebugBill/domoticz-wifitic&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Managing_Devices&amp;diff=19233</id>
		<title>Managing Devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Managing_Devices&amp;diff=19233"/>
		<updated>2026-06-28T20:45:04Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Edit Notifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Devices are created when the [[Hardware Setup|Hardware gateway]] (Setup - Hardware) to were the devices are connected to is added to Domoticz.&lt;br /&gt;
&lt;br /&gt;
[[Hardware Setup|D]]&amp;lt;nowiki/&amp;gt;evices can be managed in the [[Setup Devices|Devices lis]]&amp;lt;nowiki/&amp;gt;t (menu Setup - Devices) or in the overview screens Switches, Scenes, Temperature, Weather and Utility. It depends on the type of device where they are placed.&lt;br /&gt;
&lt;br /&gt;
For each type of device there is a tab in the top bar navigation. The tabs can be switched on/off in the menu [[Application Settings|Setup - Settings]]. It is not possible to move devices from one tab to the other.&lt;br /&gt;
&lt;br /&gt;
Basic steps to add devices:&lt;br /&gt;
&lt;br /&gt;
#Go to Setup - [[Application Settings|Settings]] to set your location (important for day/night timing).&lt;br /&gt;
#Go to Setup - [[Hardware Setup|Hardware]] and add an hardware gateway. Follow the instructions for that particular hardware gateway.&lt;br /&gt;
#Go to Setup - [[Setup Devices|Devices]] to enable (if disabled) the devices created by the hardware gateway&lt;br /&gt;
&lt;br /&gt;
==Device Widgets==&lt;br /&gt;
Each hardware device can be represented by one (ore more) device widgets. For example a smart thermostat can have a Temp Setpoint widget, a Set Mode widget, a Temp Sensor widget etc&lt;br /&gt;
&lt;br /&gt;
As they have different functions they could show up in different Device Tabs (Switches, Temperature, Weather, Utility) in Domoticz.&lt;br /&gt;
&lt;br /&gt;
If the device is battery controlled and the battery level is low, the highlight color will be Yellow (see also [[Application Settings#Battery Low Level|wiki page for settings]])&lt;br /&gt;
&lt;br /&gt;
If the devices is not seen for a long time (timed out) the highlight color will be Red. (See also [[Application Settings#Battery Low Level|wiki page for settings]])&lt;br /&gt;
&lt;br /&gt;
Some basic actions you can do with device widgets:&lt;br /&gt;
&lt;br /&gt;
*Adding some devices as your &#039;[[Managing Devices#Dashboard|favorites]]&#039; by clicking on the yellow star on the device Widget. These devices will show up on your [[Managing Devices#Dashboard|dashboard]], to give you easy access.&lt;br /&gt;
*Setup [[Managing Devices#Edit Notifications|notifications]] when for example sensors are going to a predefined level (eg temp &amp;lt; 0 degrees)&lt;br /&gt;
*Setup [[Managing Devices#Edit Device Timers|Timers]] to switch devices on or off in a time schedule ([[Timer Plan]])&lt;br /&gt;
*Adding a [[Floorplans|floorplan]]. If you want you can create a floorplan, and place buttons on there for all your devices. You can even set this as your dashboard if you want.&lt;br /&gt;
*Show [[Managing Devices#Show Device Log|Device Log files]] or graphs per day/month/year. Generate yearly reports for further analysis&lt;br /&gt;
&lt;br /&gt;
==Switches==&lt;br /&gt;
Switches are devices that can switch from one state to the other (on/off/level etc) and are displayed in widgets. The lights/switches tab includes devices like:&lt;br /&gt;
&lt;br /&gt;
*Light Switches &lt;br /&gt;
*Door sensors &lt;br /&gt;
*Blinds (see special page for [[Blinds]])&lt;br /&gt;
*Doorbells &lt;br /&gt;
*Security &lt;br /&gt;
*Sirens&lt;br /&gt;
&lt;br /&gt;
[[File:Switches screen.png|none|frame]]&lt;br /&gt;
 Each item has the following options:  &lt;br /&gt;
&lt;br /&gt;
- Status icon that can be push to toggle on/off status (depending on the hardware)  &lt;br /&gt;
&lt;br /&gt;
- Favorite push icon (to display this device on the Dashboard tab)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Show Device Log|#Log]] (Displays the log) &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Device|#Edit]] (Edit device parameters, and Sub/Slave Devices)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Device Timers|#Timers]] (For setting up a schedule per device) &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Notifications|#Notifications]] (see Notification chapter)  &lt;br /&gt;
&lt;br /&gt;
By Dragging/Dropping the sensor items, you can change the position of the devices in the window.  &lt;br /&gt;
&lt;br /&gt;
Lights and Switches can be added by:  &lt;br /&gt;
&lt;br /&gt;
- Auto Learning &lt;br /&gt;
&lt;br /&gt;
- Manual Setup  &lt;br /&gt;
&lt;br /&gt;
- Activating them through the [[Setup Devices|Setup - Devices page]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Adding a RF Light/Switch by Auto Learning===&lt;br /&gt;
Prerequisite: Have setting &amp;quot;[[Application Settings#Hardware.2FDevice|Accept new hardware devices]]&amp;quot; enabled (enabled by default) &lt;br /&gt;
&lt;br /&gt;
By pressing the ‘Learn Light/Switch’ button you have 5 seconds to press the remote/switch/sensor.  &lt;br /&gt;
&lt;br /&gt;
Note: Be sure you have no other Domoticz switches/Lights (eg Zwave, Zigbee, plugin controlled etc) are triggered during these 5 seconds. Else you get an error message that device is already known. &lt;br /&gt;
&lt;br /&gt;
[[File:Add Switches buttons.png]] &lt;br /&gt;
&lt;br /&gt;
If this time is too short you should position yourself nearer the remote/switch/sensor by using a portable computer such as Tablet or Smartphone   &lt;br /&gt;
&lt;br /&gt;
Once you press the button the following screen is presented: &lt;br /&gt;
&lt;br /&gt;
[[File:Add RF Switch light.png]]&lt;br /&gt;
&lt;br /&gt;
===Adding a RF Light/Switch Manually ===&lt;br /&gt;
If you know the switch brand/type/address it is also possible to enter the parameters by hand.  &lt;br /&gt;
&lt;br /&gt;
It is also possible to create a new [[Dummy for virtual Switches|‘virtual’ device]] that can control a light without having to buy a remote/switch.  &lt;br /&gt;
&lt;br /&gt;
[[File:Add Switch light manually.png]]&lt;br /&gt;
&lt;br /&gt;
===Sub/Slave devices===&lt;br /&gt;
Used for RFLink/RfXCom devices to synchronise on/off statuses in Domoticz as these RF devices don&#039;t send status feedback.&lt;br /&gt;
&lt;br /&gt;
Note: To use a switch to switch multiple lights on/off use the Domoticz [[Managing Devices#Scenes .28also for Groups.29|Group (or scene)]] functionality.&lt;br /&gt;
&lt;br /&gt;
To set a Master for a particular switch/light, click on the Edit button of the Sub/Slave device, Select the Master device from the pull down list and click on Add.  &lt;br /&gt;
&lt;br /&gt;
See below for more usage examples.  &lt;br /&gt;
&lt;br /&gt;
[[File:Sub slave Master.png]]    &lt;br /&gt;
&lt;br /&gt;
Most Lights can be controlled from up to 6 remotes.   &lt;br /&gt;
&lt;br /&gt;
See the following two examples:  &lt;br /&gt;
&lt;br /&gt;
====Example 1 (Outdoor Light) ====&lt;br /&gt;
Imagine you have an outdoor light that is controlled by a switch (*a) from inside the house.  &lt;br /&gt;
&lt;br /&gt;
It is possible to buy small remote controllers (*b) for on a keychain.  &lt;br /&gt;
&lt;br /&gt;
When you also want to control the outside light from this small remote, the small remote (*b) is a Sub/Slave device from the main switch (*a).  &lt;br /&gt;
&lt;br /&gt;
====Example 2 (Floor Lights) ====&lt;br /&gt;
Imagine you have a house with two floors, each floor has its own switch (*a, first floor) and (*b, second floor).  &lt;br /&gt;
&lt;br /&gt;
Downstairs next to your exit door you have a switch (*c) to turn ON / OFF ALL the lights. In this case the &lt;br /&gt;
&lt;br /&gt;
switch (*c) is a Sub/Slave device for switch (*a, first floor) and (*b, second floor)  &lt;br /&gt;
&lt;br /&gt;
Consult your hardware manual on how to setup two/multiple switches for one light.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Note: When adding a Sub/Slave device, this will not be visible in the ‘Lights’ tab by default. You see this device in the ‘Edit’ screen from the device you added it too.  &lt;br /&gt;
&lt;br /&gt;
If you also want to control or see the Sub/Slave device, you will have to add this device again, and set it up as Main device. &lt;br /&gt;
&lt;br /&gt;
==Scenes (also for Groups)==&lt;br /&gt;
In the tab Scenes you can manually add Scenes and Groups to switch multiple devices in one time. &lt;br /&gt;
&lt;br /&gt;
[[File:Group and Scene widget.png]] &lt;br /&gt;
&lt;br /&gt;
What is the difference between Scenes and Groups:&lt;br /&gt;
&lt;br /&gt;
*A &amp;quot;Group&amp;quot; is a set you can turn on or off together. Like a big extension cord with a power switch. They all go on or off. But every device can switch on with different characteristics like dim level, color etc.&lt;br /&gt;
*A &amp;quot;Scene&amp;quot; is a predefined setup of lights and devices. So you can setup 1 light to be on, another to off. Have the ledstrip/milight set to a nice blue color, close your curtains, switch on your radio on station Xyz. That&#039;s also why you can&#039;t switch a scene off, but only to on. You will have to make an extra scene (or group) to switch the devices off.&lt;br /&gt;
&lt;br /&gt;
So for example a group is used to turn all lights off when you leave the house.&lt;br /&gt;
&lt;br /&gt;
And a scene is used when you have a nice setup of lightning you want when you are going to watch a movie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;States&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*On: All related devices are On.&lt;br /&gt;
*Off: All related devices are Off.&lt;br /&gt;
*Mixed: Related devices have a mixed On/Off state&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add a Group/Scene&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To Add a Group or Scene click on the Add Scene button, type a name and decide if you want to make a group or scene. Click on Add Scene to finally create it.&lt;br /&gt;
&lt;br /&gt;
[[File:Add Group or Scene.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Edit Group Scene===&lt;br /&gt;
Click on Edit button of the group scene to add devices to the group scene and change the characteristics (dim level, color, on/off/toggle etc) when switching on.&lt;br /&gt;
&lt;br /&gt;
The Off delay on switch device in a Group/Scene causes a device to switch Off with a delay of the set amount of seconds after the switchOff command is given.&lt;br /&gt;
&lt;br /&gt;
This differs from the [[Managing Devices#On Off Delay|Off delay on a normal switch]]&lt;br /&gt;
&lt;br /&gt;
Click on the timer button to set timers for the Scene or group. See the [[Managing Devices#Edit Device Timers|general timer instruction]].&lt;br /&gt;
&lt;br /&gt;
Activation Device: You can use a Domoticz Switch to trigger the Group or Scene. &lt;br /&gt;
&lt;br /&gt;
* Use the &#039;&#039;&#039;Add Device&#039;&#039;&#039; button to add a device by using it (eg remote or zigbee switch). &lt;br /&gt;
* Use the &#039;&#039;&#039;Add Manual Light/Switch Device&#039;&#039;&#039; button the select a switch/light from the list of Domoticz devices.&lt;br /&gt;
&lt;br /&gt;
Devices: Add or remove devices that should be part of the Group or Scene. You can also set the state of the selected device.&lt;br /&gt;
&lt;br /&gt;
[[File:Edit Group or Scene.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Temperature==&lt;br /&gt;
The temperature tab includes all sensors that have a temperature sensor. &lt;br /&gt;
&lt;br /&gt;
[[File:Afbeelding 12.png]] &lt;br /&gt;
&lt;br /&gt;
A temperature sensor can also include a Humidity sensor.  &lt;br /&gt;
&lt;br /&gt;
Each item has the following options:  &lt;br /&gt;
&lt;br /&gt;
- Favorite push icon (to display this device on the Dashboard tab)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Show Device Log|#Log]] (Displays the Device log or Graph)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Device|#Edit]] (Edit device parameters)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Notifications|#Notifications]] (see Notification page)  &lt;br /&gt;
&lt;br /&gt;
By Dragging/Dropping the sensor items, you can change the position of the devices in the window.  &lt;br /&gt;
&lt;br /&gt;
===Custom Graph===&lt;br /&gt;
Most devices have a Report button. In the Temperature tab the is a Custom Graph reporting button where you can set out various sensor values in one graph.&lt;br /&gt;
&lt;br /&gt;
For example the inside and outside temperature of last week.&lt;br /&gt;
&lt;br /&gt;
[[File:Custom graph2.png]]&lt;br /&gt;
&lt;br /&gt;
==Weather==&lt;br /&gt;
The weather tab includes all sensors that are related to weather&lt;br /&gt;
&lt;br /&gt;
[[File:Afbeelding 11.png]]&lt;br /&gt;
&lt;br /&gt;
A weather sensor can be&lt;br /&gt;
&lt;br /&gt;
- Rain Meter  &lt;br /&gt;
&lt;br /&gt;
- Wind Meter  &lt;br /&gt;
&lt;br /&gt;
- UV Meter &lt;br /&gt;
&lt;br /&gt;
- Barometer  &lt;br /&gt;
&lt;br /&gt;
Each item has the following options:  &lt;br /&gt;
&lt;br /&gt;
- Favorite push icon (to display this device on the Dashboard tab)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Show Device Log|#Log]] (Displays the Device log or Graph) &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Device|#Edit]] (Edit device parameters) &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Notifications|#Notifications]] (see Notification page) &lt;br /&gt;
&lt;br /&gt;
- Forecast (shows the weather forecast when [[Weather forecast from forecast.io in Domoticz|Darksky weather forecast site is added]])&lt;br /&gt;
&lt;br /&gt;
By Dragging/Dropping the sensor items, you can change the position of the devices in the window.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Utility==&lt;br /&gt;
The utility tab includes meter sensors (Energy / Gas / P1 / YouLess / Voltage / AD / Air Quality / …), percentage, text and lux sensors and thermostats (for setting setpoints)&lt;br /&gt;
&lt;br /&gt;
[[File:Utility tab.png]] &lt;br /&gt;
&lt;br /&gt;
Each item has the following options:  &lt;br /&gt;
&lt;br /&gt;
- Favorite push icon (to display this device on the Dashboard tab)   &lt;br /&gt;
&lt;br /&gt;
- [[#Log]] (Displays the log)   &lt;br /&gt;
&lt;br /&gt;
- [[#Edit]] (Edit device parameters)   &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Device Timers|#Timers]] (For setting up a time schedule for thermostat setpoints)  &lt;br /&gt;
&lt;br /&gt;
- [[Managing Devices#Edit Notifications|#Notifications]] (see Notification chapter)  &lt;br /&gt;
&lt;br /&gt;
By Dragging/Dropping the sensor items, you can change the position of the devices in the window.  &lt;br /&gt;
&lt;br /&gt;
===Labels Compact/Mobile mode===&lt;br /&gt;
When using the dashboard in compact or mobile mode, there is limited room for the current status.  &lt;br /&gt;
&lt;br /&gt;
Therefor the following labels apply:  &lt;br /&gt;
&lt;br /&gt;
*R = Return &lt;br /&gt;
*T = Today &lt;br /&gt;
*U = Usage &lt;br /&gt;
*A = Actual&lt;br /&gt;
&lt;br /&gt;
==Dashboard==&lt;br /&gt;
In the Dashboard all the devices are listed that you have flagged as favorite with the favorite toggle switch (star) on each device widget. They will be ordered on the dashboard in the same ways as on the tabs.&lt;br /&gt;
&lt;br /&gt;
If you want to display a device only on the dashboard and not on the device tabs/pages you can [[Managing Devices#Make Hidden|make it hidden]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Dashboard Dz.png]]&lt;br /&gt;
&lt;br /&gt;
==Floorplan==&lt;br /&gt;
With [[Floorplans]] you can create a graphical interface of your home and rooms. When clicking on a room you will be zoomed in to view the room in more detail.&lt;br /&gt;
&lt;br /&gt;
Switches can be activated directly from the floorplan. See the page [[Floorplans]] for more instructions.&lt;br /&gt;
&lt;br /&gt;
If you want to display a device only on the floorplan and not on the device tabs/pages you can [[Managing Devices#Make Hidden|make it hidden]].&lt;br /&gt;
&lt;br /&gt;
[[File:Floorplan machinon.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Show Device Log==&lt;br /&gt;
By pressing the log button you can see the log of the sensor. If the device logs numeric values they will be displayed as a graph per day/month/year. If the sensor logs text you will get a table of values.  &lt;br /&gt;
&lt;br /&gt;
For switches also the origin of the changed value will be displayed (script/user).   &lt;br /&gt;
&lt;br /&gt;
It is possible to &#039;&#039;&#039;zoom in/out&#039;&#039;&#039; by selecting a range. On mobile devices use double finger moves.  &lt;br /&gt;
&lt;br /&gt;
For temperatures and some other dataranges it is also possible to see the &#039;&#039;&#039;past month/year data&#039;&#039;&#039; next to the last month/year data. So you can visualize the difference. It is also possible to show a &#039;&#039;&#039;Trendline&#039;&#039;&#039; wich indicates the trend of the sensor value. &lt;br /&gt;
&lt;br /&gt;
For some utility devices (eg Electricity, Gas, Water etc) a &#039;&#039;&#039;Comparison&#039;&#039;&#039; graph over the years is displayed &lt;br /&gt;
&lt;br /&gt;
By pressing the &#039;&#039;&#039;BACK&#039;&#039;&#039; button you return to the overview.&lt;br /&gt;
&lt;br /&gt;
By pressing on ([[Managing Devices#Custom Graph|Custom]]) &#039;&#039;&#039;Report&#039;&#039;&#039; you can go to the Report function. Here you see yearly and monthly reports and can you export them to  excel.xls, .csv and image files for further processing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;[[File:Domoticz logging.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Comparison log.png]]&lt;br /&gt;
&lt;br /&gt;
===Custom Graph===&lt;br /&gt;
In the Temperature tab the is a Custom Graph reporting button where you can set out various sensor values in one graph.&lt;br /&gt;
&lt;br /&gt;
For example the inside and outside temperature of last week.&lt;br /&gt;
&lt;br /&gt;
[[File:Custom graph2.png]]&lt;br /&gt;
&lt;br /&gt;
===Device Report===&lt;br /&gt;
Most sensor devices have a Report button on the LOG page (see previous section). With the report you can go back in your history. It is also possible to export the data as images, CSV or Excel files.&lt;br /&gt;
&lt;br /&gt;
The up/down arrows in the last column indicate a increase or decrease value compared with the month or day earlier.&lt;br /&gt;
&lt;br /&gt;
When click on the blue Arrow in the month column you get a detailed value report per day of that month.&lt;br /&gt;
&lt;br /&gt;
For Temperature devices also the lowest and highest value are listed. For a year also the [https://en.wikipedia.org/wiki/Heating_degree_day degree days] is listed so you can compare your energy consumption for heating based on true values.&lt;br /&gt;
&lt;br /&gt;
For energy devices a yearly summary is listed. The earning or costs are calculated by the tariffs set in the page [[Application Settings#Meter.2FCounters Setup|Setup-Setting- Meters Counters]]. Also Day/night tarifs and delivery and return (eg from solar panels) are supported for P1 Smart Meter devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example Reports Energy devices&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:P1-report.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Device report.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example reports Temperature device&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Report Temperature device.png]]&lt;br /&gt;
===Remove incorrect value from database===&lt;br /&gt;
It is possible to remove (or delete) an incorrect sensor value (record) from the database by &amp;lt;code&amp;gt;shift+left mouse click&amp;lt;/code&amp;gt; on the value in one of the graphs on the device log page. You will get a popup dialog to approve the removal.  &lt;br /&gt;
&lt;br /&gt;
On a tablet/smartphone without mouse: Select the to be deleted/removed value by clicking on it and thereafter click the pancake menu in right top corner. Then the acknowledgement popup will be shown. &lt;br /&gt;
&lt;br /&gt;
NOTE: This function is not working on the report page so it is not possible to remove data with this function older than 1 year. &lt;br /&gt;
&lt;br /&gt;
[[File:Remove value.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exporting graph data===&lt;br /&gt;
By clicking on the right top hamburger icon in a graph you can select the export data method of that graph &lt;br /&gt;
&lt;br /&gt;
Options are to export into an image/document file (PNG, JPEG, PDF, SVG) or download the values as an CSV or Excel file.&lt;br /&gt;
&lt;br /&gt;
If you want to export a specific time span use a [[Domoticz API/JSON URL&#039;s#History|Domoticz History API call]].&lt;br /&gt;
&lt;br /&gt;
[[File:Export graph data.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Edit Device==&lt;br /&gt;
In this dialog you can rename the device, change the switch type, remove, or replace it.                   &lt;br /&gt;
&lt;br /&gt;
===Switches===&lt;br /&gt;
Blinds: See special page for [[Blinds]]&lt;br /&gt;
&lt;br /&gt;
Also you can add delays, extra actions by [[Scripting in Domoticz|scripts]] or [[Domoticz API/JSON URL&#039;s|http API json commands]], protect it for unauthorised usage etc.                  &lt;br /&gt;
&lt;br /&gt;
[[File:Edit Switches.png]]&lt;br /&gt;
&lt;br /&gt;
====Make Hidden====&lt;br /&gt;
If you add a dollar ($) sign infront of the name (eg $device_name) the device becomes hidden (but active). It will disappear from the Sensor/Switches tabs. It still will be visible on the [[Setup Devices|device list]] and can be used in the [[Floorplans|floorplan]] (room $Hidden Devices).&lt;br /&gt;
&lt;br /&gt;
Also when you have made the device favorite before renaming the device stays visible on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Change Switch Type====&lt;br /&gt;
In the edit dialog you can modify the type of switch. The other attributes depends on the type of switch.&lt;br /&gt;
&lt;br /&gt;
For a full list and short description see wiki page [[Dummy_for_virtual_Switches#Switches]]&lt;br /&gt;
&lt;br /&gt;
[[File:Switch-Types.png]]&lt;br /&gt;
&lt;br /&gt;
====Change Icon====&lt;br /&gt;
Here you can Change the Icon for the device. It is possible to use your own [[Custom icons for webinterface|custom icons]]&lt;br /&gt;
&lt;br /&gt;
====On Off Delay====&lt;br /&gt;
The On delay causes a device to switch On with a delay of the set amount of seconds after the switchOn command is given.&lt;br /&gt;
&lt;br /&gt;
The Off delay on switch device causes a device to switch Off with a delay of the set amount of seconds after the device switched to On.&lt;br /&gt;
&lt;br /&gt;
The Off delay on switch device in a Group/Scene causes a device to switch Off with a delay of the set amount of seconds after the switchOff command is given.&lt;br /&gt;
&lt;br /&gt;
====On Off Action====&lt;br /&gt;
Here you can refer to [[scripts]] or [[Domoticz API/JSON URL&#039;s|Domoticz API/JSON URL]] to trigger other actions inside or outside Domoticz.&lt;br /&gt;
&lt;br /&gt;
Also possible to use http/https URL&#039;s when the device can be switched in this way (eg ESPEasy, Tasmota, etc)&lt;br /&gt;
&lt;br /&gt;
[[File:2015-08-21 12 26 41-Domoticz.png|679x679px]]&lt;br /&gt;
&lt;br /&gt;
====Protected====&lt;br /&gt;
Enable (default Disabled) extra protection for switching of this device. This will give a popup when trying to switch the device.&lt;br /&gt;
&lt;br /&gt;
The Switch/Light protection password is managed by setting [[Application Settings#Light.2FSwitch%20Protection|Light/Switch Protection]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
Sensor have less options to edit:&lt;br /&gt;
&lt;br /&gt;
====Make Hidden====&lt;br /&gt;
If you add a dollar ($) sign infront of the name (eg $device_name) the device becomes hidden (but active). It will disappear from the Sensor/Switches tabs. It still will be visible on the [[Setup Devices|device list]] and can be used in the [[Floorplans|floorplan]] (room $Hidden Devices).&lt;br /&gt;
&lt;br /&gt;
Also when you have made the device favorite before renaming the device stays visible on the dashboard.&lt;br /&gt;
&lt;br /&gt;
====Change Icon====&lt;br /&gt;
Here you can Change the Icon for the device. It is possible to use your own [[Custom icons for webinterface|custom icons]]&lt;br /&gt;
&lt;br /&gt;
====Multiplier/Adjustment====&lt;br /&gt;
Some Sensors like temperature have Adjustment or Multiplier field to calibrate the measured value with the real, to be displayed value.&lt;br /&gt;
&lt;br /&gt;
[[File:Edit Temp Sensor.png]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Delete===&lt;br /&gt;
To delete the device from the database click on the DELETE button. After confirmation the device and its stored values will be deleted.&lt;br /&gt;
&lt;br /&gt;
===Replace device===&lt;br /&gt;
Some devices change their unique ID when a new battery is installed and will get a new idx ID in Domoticz. Also when migration from one hardware gateway to another (eg OpenZwave to Zwave-JS-UI) you could need to replace devices. &lt;br /&gt;
&lt;br /&gt;
To move the old sensor data (history logging) to the new device act as follow:  &lt;br /&gt;
&lt;br /&gt;
*First, add (or is added by new gateway) the new device to the system, and call it for example ‘New UV Meter’. &lt;br /&gt;
*Next press the Edit button on the Old device, select replace and select the new Device. (In this case the devices called ‘New UV Meter’). &lt;br /&gt;
*Next press OK. Result:&lt;br /&gt;
**The old and new device will be merged and get the name and IDX of the &#039;&#039;&#039;old device&#039;&#039;&#039;. This will prevent changes in scripts that use this device.&lt;br /&gt;
**The new device will be deleted. (behavior since Stable 2022.1)&lt;br /&gt;
**If there is a hardware gateway difference between Old and New device (eg when switching from OZW to Zwave JS UI MQTT) the merged device (with old name and idx) will get the hardware gateway of the new device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Edit Device Timers==&lt;br /&gt;
Each switch, group, scene or thermostat device can be activated by timers to change the status or for thermostats the setpoint temperature.&lt;br /&gt;
&lt;br /&gt;
There can be more timers per switch/thermostat so you can make a complete schedule. &lt;br /&gt;
&lt;br /&gt;
They also make part of a [[Timer Plan|timer plan]] so you can set up for example a holiday schedule for your lights.&lt;br /&gt;
&lt;br /&gt;
The timer options are partly dependent of the switch type and Timer type.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;add&#039;&#039;&#039; a timer to the device fill in the setting parameters and click on button &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;modify&#039;&#039;&#039; an existing timer select the timer, modify the settings and click on button &#039;&#039;Update&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;copy&#039;&#039;&#039; a timer, select an existing timer, modify the settings and click on button &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;delete&#039;&#039;&#039; a timer, select an existing timer and click on button &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Standard Settings===&lt;br /&gt;
&lt;br /&gt;
*Enable/Disable.&lt;br /&gt;
*Type: Trigger type for timers, Can be based on specific time, per day, month, year or based on delta against Sunrise or Sunset (which are calculated based on your location in Settings). See the list of timers types below the image.&lt;br /&gt;
*Time: The absolute time in hh:min to change status or setpoint of the device. Can also be a delta against before/after Sunrise/Sunset timer types, eg 1:30 hours before sunset&lt;br /&gt;
*Randomness: Add a randomness to the activation time. The Random timer delta can be set in the [[Application Settings#Random Timer|settings menu]]. Could be useful to switch lamps on/off more randomly on holiday timing schedules.&lt;br /&gt;
*Persistent: Will be available in all [[Timer Plan|timer plans]] when enabled. (available from beta dd 20-12-2023)&lt;br /&gt;
*Command: The command for setting the device status. On or Off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: It will take several minutes after saving that the timer entries become active. So for testing purposes take a minimum of 2 minutes delta from current time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Domoticz calculates some events like Sunset and Sunrise, Twilight etc based on your location, so be sure you have set the location correctly in menu &#039;&#039;&#039;Setup -&amp;gt; Settings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Optional Settings===&lt;br /&gt;
&lt;br /&gt;
*Level: &lt;br /&gt;
**In case of a dimmer type you can set the dimlevel.&lt;br /&gt;
**In case of a selector switch the selector level&lt;br /&gt;
*Color: In case of a color RGB lamp you can set the color.&lt;br /&gt;
*Value: In case of a Thermostat this is the setpoint value.&lt;br /&gt;
*When and Days: (depends on Timer type). Short select the the days of the week the timers settings should be valid. Alternativly you can select the active days manually.&lt;br /&gt;
*Date: (depends on Timer type). Select a date from the popup calendar or type a date in yyyy-mm-dd format.&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[File:Edit Timers.png|none|frame]]&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;Timer types:&#039;&#039;&#039;===&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;
For an explanation of Civil, Nautical and Astronomical Twilight check the wikipedia page: https://en.wikipedia.org/wiki/Twilight&lt;br /&gt;
&lt;br /&gt;
===Weekly timer editor===&lt;br /&gt;
From version 2023.1 it is now possible to switch from table to grid view for easy creating an managing weekly timer schedules.&lt;br /&gt;
&lt;br /&gt;
Click on the Grid tab to enable the week overview.&lt;br /&gt;
&lt;br /&gt;
[[File:Timers-weekly-editor.png]]&lt;br /&gt;
&lt;br /&gt;
==Edit Notifications==&lt;br /&gt;
Each device has different notifications (depending on the hardware options).  &lt;br /&gt;
[[File:Edit Notifications.png|none|frame]] &lt;br /&gt;
&lt;br /&gt;
For example, in the above screenshot, you want to be notified if the temperature rises above 45 degrees.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Switches&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Type: Can notify on Type &amp;lt;code&amp;gt;Switch On&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Switch Off&amp;lt;/code&amp;gt; state. &lt;br /&gt;
&lt;br /&gt;
Level: For selector switches and dimmers a level condition can be added. &lt;br /&gt;
&lt;br /&gt;
Custom Message: An optional custom message can be added. You can use parameters $value and $name in this custom message. &lt;br /&gt;
&lt;br /&gt;
Action: Optional a script can be added to run on notification trigger. For example to run a TextToSpeak notification. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sensors&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Can notify on Type: &lt;br /&gt;
&lt;br /&gt;
*Value (Usage, Temperature, Today etc): When the measured value meets the conditions you entered (eg temperature rises above 45 degrees).&lt;br /&gt;
*Last Update: When the last update time was according your conditions (eg Last update time was larger dan 60 minutes away).&lt;br /&gt;
&lt;br /&gt;
[[File:NotificationWithScript.jpg]]&lt;br /&gt;
&lt;br /&gt;
Also settings for   &lt;br /&gt;
&lt;br /&gt;
*Priority (of notification),&lt;br /&gt;
*Ignore default interval of [[Application Settings|settings page]] (enable/disable)&lt;br /&gt;
*Action: Optional a script can be added to run on notification trigger. For example to run a TextToSpeak notification.&lt;br /&gt;
*Recovery Notification  (enable/disable when the sensor conditions have been recovered). This check box is only available for devices in Temperature, Weather and Utility tab. Not available for switches/light devices.&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;add&#039;&#039;&#039; a notification to the device fill in the setting parameters and click on button &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;modify&#039;&#039;&#039; an existing notification select the notification, modify the settings and click on button &#039;&#039;Update&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;copy&#039;&#039;&#039; a notification, select an existing notification, modify the settings and click on button &#039;&#039;Add&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To &#039;&#039;&#039;delete&#039;&#039;&#039; a notification, select an existing notification and click on button &#039;&#039;Delete&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification systems&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The following [[Notifications|notification]] services are supported:&lt;br /&gt;
&lt;br /&gt;
*Prowl (iPhone/iPad)&lt;br /&gt;
*NMA (Android)&lt;br /&gt;
*PushBullet&lt;br /&gt;
*Pushsafer (iOS/Android/Windows10/Chrome/Firefox) + Image&lt;br /&gt;
*Pushover (Android/iOs)&lt;br /&gt;
*Pushalot (Windows/Windows Phone)&lt;br /&gt;
*Clickatell SMS&lt;br /&gt;
*Custom HTTP/Action&lt;br /&gt;
*Kodi Media Player&lt;br /&gt;
*Logitech Media Server&lt;br /&gt;
*Google Cloud Messaging&lt;br /&gt;
*Telegram&lt;br /&gt;
&lt;br /&gt;
See also the [[Application Settings#Notifications|Applications Settings section Notification]] and the [[Notifications]] page for the various notification methods.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Domoticz_API/JSON_URL%27s&amp;diff=19232</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=19232"/>
		<updated>2026-06-26T06:47:12Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Counter Incremental */&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://forum.domoticz.com/viewtopic.php?p=303581#p303581&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;The following old RType commands will keep working but will give a deprecation warning eg&amp;lt;/s&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;s&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;/s&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Warning: in Domoticz stable 2025.1 these old RType API calls are really removed and instead of a warning you will get an error (404 - not found)!!&#039;&#039;&#039;&#039;&#039;&lt;br /&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;
*&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;
==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=IDX&amp;amp;setpoint=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;
&lt;br /&gt;
For &#039;&#039;&#039;Thermostat6&#039;&#039;&#039; devices, implemented in beta 2025.2, the following update additional update API calls are available:&lt;br /&gt;
&lt;br /&gt;
== Update temp/hum/baro/setpoint ==&lt;br /&gt;
You cannot just set the temp/Hum/baro, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;HUM;HUM_STAT;BAR;BAR_FOR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast does not seem to work....&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&lt;br /&gt;
* HUM = Humidity&lt;br /&gt;
* HUM_STAT = Humidity status&lt;br /&gt;
* BAR = Barometric pressure&lt;br /&gt;
* BAR_FOR = Barometer forecast&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HUM_STAT can be one of:&lt;br /&gt;
&lt;br /&gt;
* 0=Normal&lt;br /&gt;
* 1=Comfortable&lt;br /&gt;
* 2=Dry&lt;br /&gt;
* 3=Wet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Barometer forecast of device type &amp;quot;General&amp;quot; (Virtual) can be one of:&lt;br /&gt;
&lt;br /&gt;
0 = No Info &lt;br /&gt;
&lt;br /&gt;
1 = Sunny&lt;br /&gt;
&lt;br /&gt;
2 = Partly Cloudy&lt;br /&gt;
&lt;br /&gt;
3 = Cloudy&lt;br /&gt;
&lt;br /&gt;
4 = Rain&lt;br /&gt;
&lt;br /&gt;
== Update temp/setpoint ==&lt;br /&gt;
You cannot just set the temp, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&lt;br /&gt;
&lt;br /&gt;
== Update temp/hum/setpoint ==&lt;br /&gt;
You cannot just set the temp/Hum, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;HUM;HUM_STAT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&lt;br /&gt;
&lt;br /&gt;
== Update temp/baro/setpoint ==&lt;br /&gt;
You cannot just set the temp/baro, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;BAR;BAR_FOR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast does not seem to work....&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&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;
== List hardware ==&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;
==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=dotransferdevice&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;
&lt;br /&gt;
The divider should also be used on Cutom if you want to report on digits. Eg if you set Unit to Euro but want to report on cents (eg 0.30) then you have to supply the value in cents (1 euro = 100 cents) and use the divider 100.&lt;br /&gt;
&lt;br /&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), see also the  normal Counter description above.&lt;br /&gt;
&lt;br /&gt;
It will increment the counter value by the value supplied in svalue. 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;&#039;&#039;&#039;DisableLogAutoUpdate&#039;&#039;&#039;&amp;quot; device option to &amp;quot;&#039;&#039;&#039;true&#039;&#039;&#039;&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;&#039;&#039;&#039;AddDBLogEntry&#039;&#039;&#039;&amp;quot; device option to &amp;quot;&#039;&#039;&#039;true&#039;&#039;&#039;&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/Light 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;
Shows the log entries of the IDX switch/light device.&lt;br /&gt;
&lt;br /&gt;
===Delete history log===&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;
Deletes all the log entries from the DB for a specific IDX and device displays the current switch/light state.&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;
Shows the log entries of the IDX text device.&lt;br /&gt;
&lt;br /&gt;
===Delete history log===&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;
Deletes all the log entries from the DB for a specific IDX and text device displays the current text.&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;taction=&amp;lt;action command&amp;gt;&amp;amp;tactive=&amp;lt;true/false&amp;gt;&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&amp;amp;idx=nnn&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;
A bash script to query the json result of a temperature device and print the temperature value &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;
A simple bash script can be used to get the device status, by executing for example:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DOMOTICZ_URL=&amp;quot;http://localhost:8080&amp;quot;&lt;br /&gt;
DEVICE_IDX=1209&lt;br /&gt;
&lt;br /&gt;
status=`curl -s &amp;quot;${DOMOTICZ_URL}/json.htm?type=command&amp;amp;param=getdevices&amp;amp;rid=${DEVICE_IDX}&amp;quot; | jq &#039;.result[0].Data&#039; |tr -d \&amp;quot;`&lt;br /&gt;
#status variable assumes value Off or On, in case of light device.&lt;br /&gt;
if [ &amp;quot;a${status}&amp;quot; == &amp;quot;aOff&amp;quot; ]; then&lt;br /&gt;
    # device status is Off&lt;br /&gt;
    # ...&lt;br /&gt;
else&lt;br /&gt;
    # device status is On&lt;br /&gt;
    # ...&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&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>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Domoticz_API/JSON_URL%27s&amp;diff=19231</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=19231"/>
		<updated>2026-06-26T06:44:41Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Counter */&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://forum.domoticz.com/viewtopic.php?p=303581#p303581&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;The following old RType commands will keep working but will give a deprecation warning eg&amp;lt;/s&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;s&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;/s&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Warning: in Domoticz stable 2025.1 these old RType API calls are really removed and instead of a warning you will get an error (404 - not found)!!&#039;&#039;&#039;&#039;&#039;&lt;br /&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;
*&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;
==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=IDX&amp;amp;setpoint=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;
&lt;br /&gt;
For &#039;&#039;&#039;Thermostat6&#039;&#039;&#039; devices, implemented in beta 2025.2, the following update additional update API calls are available:&lt;br /&gt;
&lt;br /&gt;
== Update temp/hum/baro/setpoint ==&lt;br /&gt;
You cannot just set the temp/Hum/baro, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;HUM;HUM_STAT;BAR;BAR_FOR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast does not seem to work....&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&lt;br /&gt;
* HUM = Humidity&lt;br /&gt;
* HUM_STAT = Humidity status&lt;br /&gt;
* BAR = Barometric pressure&lt;br /&gt;
* BAR_FOR = Barometer forecast&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HUM_STAT can be one of:&lt;br /&gt;
&lt;br /&gt;
* 0=Normal&lt;br /&gt;
* 1=Comfortable&lt;br /&gt;
* 2=Dry&lt;br /&gt;
* 3=Wet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Barometer forecast of device type &amp;quot;General&amp;quot; (Virtual) can be one of:&lt;br /&gt;
&lt;br /&gt;
0 = No Info &lt;br /&gt;
&lt;br /&gt;
1 = Sunny&lt;br /&gt;
&lt;br /&gt;
2 = Partly Cloudy&lt;br /&gt;
&lt;br /&gt;
3 = Cloudy&lt;br /&gt;
&lt;br /&gt;
4 = Rain&lt;br /&gt;
&lt;br /&gt;
== Update temp/setpoint ==&lt;br /&gt;
You cannot just set the temp, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&lt;br /&gt;
&lt;br /&gt;
== Update temp/hum/setpoint ==&lt;br /&gt;
You cannot just set the temp/Hum, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;HUM;HUM_STAT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&lt;br /&gt;
&lt;br /&gt;
== Update temp/baro/setpoint ==&lt;br /&gt;
You cannot just set the temp/baro, you have to set everything including setpoint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/json.htm?type=command&amp;amp;param=udevice&amp;amp;idx=IDX&amp;amp;nvalue=0&amp;amp;svalue=TEMP;SETPOINT;BAR;BAR_FOR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Barometer forecast does not seem to work....&lt;br /&gt;
&lt;br /&gt;
See temp/hum/baro/setpoint for the applicable options.&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;
== List hardware ==&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;
==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=dotransferdevice&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;
&lt;br /&gt;
The divider should also be used on Cutom if you want to report on digits. Eg if you set Unit to Euro but want to report on cents (eg 0.30) then you have to supply the value in cents (1 euro = 100 cents) and use the divider 100.&lt;br /&gt;
&lt;br /&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;&#039;&#039;&#039;DisableLogAutoUpdate&#039;&#039;&#039;&amp;quot; device option to &amp;quot;&#039;&#039;&#039;true&#039;&#039;&#039;&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;&#039;&#039;&#039;AddDBLogEntry&#039;&#039;&#039;&amp;quot; device option to &amp;quot;&#039;&#039;&#039;true&#039;&#039;&#039;&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/Light 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;
Shows the log entries of the IDX switch/light device.&lt;br /&gt;
&lt;br /&gt;
===Delete history log===&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;
Deletes all the log entries from the DB for a specific IDX and device displays the current switch/light state.&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;
Shows the log entries of the IDX text device.&lt;br /&gt;
&lt;br /&gt;
===Delete history log===&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;
Deletes all the log entries from the DB for a specific IDX and text device displays the current text.&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;taction=&amp;lt;action command&amp;gt;&amp;amp;tactive=&amp;lt;true/false&amp;gt;&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&amp;amp;idx=nnn&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;
A bash script to query the json result of a temperature device and print the temperature value &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;
A simple bash script can be used to get the device status, by executing for example:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DOMOTICZ_URL=&amp;quot;http://localhost:8080&amp;quot;&lt;br /&gt;
DEVICE_IDX=1209&lt;br /&gt;
&lt;br /&gt;
status=`curl -s &amp;quot;${DOMOTICZ_URL}/json.htm?type=command&amp;amp;param=getdevices&amp;amp;rid=${DEVICE_IDX}&amp;quot; | jq &#039;.result[0].Data&#039; |tr -d \&amp;quot;`&lt;br /&gt;
#status variable assumes value Off or On, in case of light device.&lt;br /&gt;
if [ &amp;quot;a${status}&amp;quot; == &amp;quot;aOff&amp;quot; ]; then&lt;br /&gt;
    # device status is Off&lt;br /&gt;
    # ...&lt;br /&gt;
else&lt;br /&gt;
    # device status is On&lt;br /&gt;
    # ...&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&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>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19230</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19230"/>
		<updated>2026-06-25T15:49:09Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Wifitic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|Garbage Calender NL&lt;br /&gt;
|garbage/waste collection schedule&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44560 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_garbage&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|HP iLo monitor&lt;br /&gt;
|HP server monitor&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44638 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_HP_ilo&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KPN experia v10&lt;br /&gt;
|KPN Experia Box V10 Device Presence Tracker and control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44623 link]&lt;br /&gt;
|https://github.com/adrighem/domoticz-kpn-experia-v10&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WiFiTic Teleinfo&lt;br /&gt;
|Cartelectronic WiFiTic module&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44704 link]&lt;br /&gt;
|https://github.com/DebugBill/domoticz-wifitic&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19229</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19229"/>
		<updated>2026-06-25T15:44:04Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ experia&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|Garbage Calender NL&lt;br /&gt;
|garbage/waste collection schedule&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44560 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_garbage&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|HP iLo monitor&lt;br /&gt;
|HP server monitor&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44638 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_HP_ilo&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KPN experia v10&lt;br /&gt;
|KPN Experia Box V10 Device Presence Tracker and control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44623 link]&lt;br /&gt;
|https://github.com/adrighem/domoticz-kpn-experia-v10&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19228</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19228"/>
		<updated>2026-06-25T15:40:55Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ HP Ilo server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|Garbage Calender NL&lt;br /&gt;
|garbage/waste collection schedule&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44560 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_garbage&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|HP iLo monitor&lt;br /&gt;
|HP server monitor&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44638 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_HP_ilo&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19227</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19227"/>
		<updated>2026-06-25T15:36:08Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Garbage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|Garbage Calender NL&lt;br /&gt;
|garbage/waste collection schedule&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44560 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_garbage&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19226</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19226"/>
		<updated>2026-06-25T15:32:19Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Dreame vacuum&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dreame vacuum&lt;br /&gt;
|Dreame robot vacuums&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44655 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_dreame/&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19225</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19225"/>
		<updated>2026-06-25T15:28:42Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Kiosk browser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|Fully Kiosk Browser&lt;br /&gt;
|to control Fully Kiosk Browser&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44325 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_fullykiosk&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19224</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19224"/>
		<updated>2026-06-25T15:25:38Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Home presence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Home presence&lt;br /&gt;
|home presence detection using phone MAC addresses and arp-scan&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44754 link]&lt;br /&gt;
|https://github.com/blooesky/Detect-Presence-at-Home---Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19223</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19223"/>
		<updated>2026-06-25T14:40:05Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ TPlink router&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Router&lt;br /&gt;
|TP-Link routers supported by the &amp;lt;code&amp;gt;tplinkrouterc6u&amp;lt;/code&amp;gt; library&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/blooesky/Domoticz-TPLinkRouter&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19222</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19222"/>
		<updated>2026-06-25T14:37:36Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Python Plugins List */ Marstek&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Marstek&lt;br /&gt;
|Marstek CT Smart Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Haaibaai/Domoticz-Marstek&lt;br /&gt;
|-&lt;br /&gt;
|Marstek Modbus&lt;br /&gt;
|Marstek Venus V3 home battery over Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hopSilentSimon/Domoticz_Marstek_Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19220</id>
		<title>Integrations and Protocols</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19220"/>
		<updated>2026-06-10T08:17:00Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* AI Agent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domoticz can speak a lot of device languages and connect to many different interfaces. Those devices are in the world of computers techically called &amp;quot;protocols&amp;quot; and computing interfaces are called API (Application Programming Interface).&lt;br /&gt;
&lt;br /&gt;
This page is about helping you summerize languages or &#039;protocols&#039; which Domoticz can understand, and other ways of helping Domoticz connecting to different devices or other bridges/hubs/gateways/controllers, for example through plugins (addons). &lt;br /&gt;
&lt;br /&gt;
This summery also tries mention a few examples of such devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Plugins (Addons)=&lt;br /&gt;
Python Plugins (sometimes also refered to as addons, add-ons, or extensions) expand Domoticz abilties to connect to even more devices, bridges, gateways, hubs, controllers, off-line or online services, and more.&lt;br /&gt;
&lt;br /&gt;
*[[Plugins]] - A list of plugins available. New ones are rapidly being added. Look in the forum under &#039;python&#039; to find the latest additions.&lt;br /&gt;
*[[Using_Python_plugins]] - Details on how to install a plugin.&lt;br /&gt;
*[[Developing a Python plugin]] - Details on how to develop your own plugin.&lt;br /&gt;
&lt;br /&gt;
==On your device==&lt;br /&gt;
Your Domoticz server might have built-in sensors, or talk to other software on your server.&lt;br /&gt;
&lt;br /&gt;
*[[Adding internal pc sensors to Domoticz on Windows systems|Adding internal PC sensors to Domoticz on Windows systems]]&lt;br /&gt;
*[[Write_Domoticz_logfile_to_Synology_Log_Center|Write Domoticz log to Synology Log Center]]&lt;br /&gt;
*[[PiFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
Plug devices directly into your Domoticz server. &lt;br /&gt;
&lt;br /&gt;
*[[Voltcraft_CO-20 | Voltcraft CO-20 airquality sensor]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buienradar==&lt;br /&gt;
Your own private Buienradar Weatherstation. From Domoticz build V4.11230 and up it is possible to add native Buienradar instead of using plugin&lt;br /&gt;
&lt;br /&gt;
*[[Buienradar | Buienradar native implementation]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AI Agent =&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process at the &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; endpoint. AI agents can now discover and control devices using the &amp;lt;code&amp;gt;search_devices&amp;lt;/code&amp;gt; tool - making Domoticz one of the first home automation platforms with built-in MCP support.&lt;br /&gt;
&lt;br /&gt;
An AI agent can create sensors and devices (&amp;lt;code&amp;gt;create_sensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;create_device&amp;lt;/code&amp;gt;), hide or permanently delete them, and read full sensor history through &amp;lt;code&amp;gt;get_sensor_history&amp;lt;/code&amp;gt; - daily calendar data for every sensor type plus the event log for switches and scenes. Battery and RSSI/signal levels now appear right in device search, with &amp;lt;code&amp;gt;hw_idx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;include_unused&amp;lt;/code&amp;gt; filters and resource-URI autocompletion to keep queries precise.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
= Voice Control =&lt;br /&gt;
[[Alexa Smart Home Integration|Alexa]]&lt;br /&gt;
&lt;br /&gt;
=Protocols=&lt;br /&gt;
Below you will find a number of protcols, and details about gateways that give access to large groups of devices using those protocols. Gateways are often devices that plug into or communicate with your server, such as a bluetooth dongle or wireless receiver and transmitter.&lt;br /&gt;
&lt;br /&gt;
==IP (Internet Protocol) with TCP/UDP and HTTP==&lt;br /&gt;
IP (Internet Protocol) are your everyday network protocols used on local networks and the internet. This is the basic language spoken by all servers and computers on the internet and by devices in your home network, including your WiFi. &lt;br /&gt;
&lt;br /&gt;
===Wired &amp;amp; Wireless===&lt;br /&gt;
These are devices that have gotten an IP address on your local network. Your router hands out these IP addresses.&lt;br /&gt;
&lt;br /&gt;
*[[Philips Hue Lights]]&lt;br /&gt;
*[[Fritzbox|FRITZ!Box callmonitor]]&lt;br /&gt;
*[[Wake-up_On_Lan|Wake-on-LAN (WoL) a PC with Domoticz]]&lt;br /&gt;
*[[Sonos|Sonos: different solutions for integrating Sonos within Domoticz]]&lt;br /&gt;
*[[Essent|Essent E-Thermostat (ICY)]]&lt;br /&gt;
*[[ESP8266 WiFi module]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Web===&lt;br /&gt;
These are services on the internet that you connect to through your internet router. Domoticz can talk to all kinds of services on the internet and get or deposit data there, such as the current weather.&lt;br /&gt;
&lt;br /&gt;
*[[HttpLink|Push data from Domoticz to your own server]]&lt;br /&gt;
*[[Weather forecast from forecast.io in Domoticz|&amp;lt;s&amp;gt;Weather forecast from forecast.io in Domoticz&amp;lt;/s&amp;gt;]] Not functional any more&lt;br /&gt;
*[[Virtual weather devices|&amp;lt;s&amp;gt;Virtual weather devices (Weather Underground)&amp;lt;/s&amp;gt;]] Not functional anymore&lt;br /&gt;
*[[Open Weather Map]] devices&lt;br /&gt;
*[[Domoticz and PvOutput.org|Domoticz and PVOutput.org]]&lt;br /&gt;
*[[Telegram Bot|Installing Telegram Notification System - Telegram Bot Method]]&lt;br /&gt;
*[[Secure_Nginx_Proxy_Setup|x509-Auth w/Nginx for secure remote access.]]&lt;br /&gt;
*[[Smappee |Smappee energymonitor in Domoticz]]&lt;br /&gt;
*[https://www.npmjs.com/package/corrently4domoticz Corrently - German Green Power Index in Domoticz] (Node JS Package)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT==&lt;br /&gt;
This standard, that works on top op TCP/IP, has been around for decades, but has been embraced as the Internet of Things (IoT) hype grew. Domoticz supports [[MQTT]], and will listen on the &#039;&#039;domoticz/in&#039;&#039; topic.&lt;br /&gt;
&lt;br /&gt;
Domoticz also supports platforms that use the MQTT HA Auto Discover protocol, see wiki [[MQTT|MQTT Auto discover Gateway]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LoRa==&lt;br /&gt;
For devices that use LoRa radio technology, a [[TTNMQTT]] module is available which retrieves data using MQTT from The Things Network.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Z-Wave==&lt;br /&gt;
The Z-Wave protocol propriatory wireless standard created especially for smart devices, &lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Z-Wave on consist of several generations where the newer versions are back-wards compatible with the older generation however incoperating older generation devices into can sometimes lower the encryption level used in your network-mesh.&lt;br /&gt;
&lt;br /&gt;
The downside of the Z-Wave protocol being propriatory is means that there are less manufacturers and devices cost more but the upside is that because it is propriatory interoperability between differet manufacturers is much better than more open protocols, so compatibility between devices and gateways/bridges/controllers is almost always better.&lt;br /&gt;
&lt;br /&gt;
*Using [[Zwave-JS-UI]]&lt;br /&gt;
*[[Zwave|Setting up Z-Wave]] with OpenZwave (deprecated)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zigbee==&lt;br /&gt;
Zigbee is a suite of IEEE 802.15.4-based protocol standards some of which are designed to be used by smart devices for home automation.&lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Zigbee protocol standards are managed by the Zigbee Alliance and they have relativly low royalty fees and allow anyone to manufacturer chips for Zigbee and Zigbee protocol stacks. Official certification of manufacturers devices by the Zigbee Alliance cost more and though it is not requires it is still recommended, which makes it possible for devices to be non cerfified devices to be cheap and certified devices to be relativly inexpensive.&lt;br /&gt;
&lt;br /&gt;
The downside of the Zigbee protocol being loosley controlled by Zigbee Alliance, not even requireing certifications or quality control means that there can be interoperability issues between differet manufacturers, so compatibility between devices and gateways/bridges/controllers can not be garanteed. Because of this is recommended to preferably buy devices that are &amp;quot;Zigbee 3.0&amp;quot; cerfified by the Zigbee Alliance as that should mean that they have been independently tested to at least meet their minimum requirements of follwing the official Zigbee standards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Zigbee#Zigbee support in Domoticz|Options available for connecting to  Zigbee devices from Domoticz]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matter ==&lt;br /&gt;
Matter is a new secure, reliable and local standard protocol for smart/IoT devices launched at the end of 2022 by the Connectivity Standards Alliance.&lt;br /&gt;
&lt;br /&gt;
Domoticz has a Matter integration based on matter.js server, see wiki page [[Matter]]&lt;br /&gt;
&lt;br /&gt;
==315 and 433 MHz==&lt;br /&gt;
The 433MHz frequency range in Europe and Asia as well as 315 MHz radio frequency range in North America are the wild west radio spectrums of the wireless world because anyone can use it freely without any licences or permissions needed as long as the do not have too stong radios.&lt;br /&gt;
&lt;br /&gt;
Because there are basically no rules all kinds of &amp;quot;cowboy&amp;quot; devices have been built with an equally big amount of different languages (protocol) being spoken. &lt;br /&gt;
&lt;br /&gt;
The frequency range for the &amp;quot;433MHz&amp;quot; spectrum is actually a range from 433.05 MHz to 434.79 MHz with center frequency being 433.92 MHz (which is also the most commonly uses by most of these types of devices in  Europe and Asia). The frequency range for the &amp;quot;315MHz&amp;quot; spectrum is actually a range from 315.xx MHz to 315.xx MHz with center frequency being 315.xx MHz (which is also the most commonly uses by most of these types of devices in North America). &lt;br /&gt;
&lt;br /&gt;
Most of the devices in these spectrums do not support tw-way communcation and in most cases the use unencrypted communications, so in theory anyone could listen in on it, or even control your devices. So please don&#039;t buy a pacemaker with a 433Mhz remote.&lt;br /&gt;
&lt;br /&gt;
Thanks to gateways/bridges like RFXcom and RFLink which speak and can translate a lot of these languages (protocols), Domoticz can interact with a lof of those type of devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[RFXcom|Setting up RFXCom]]. This is a commercial product, with two versions. Please buy the newer E version.&lt;br /&gt;
*[[RFLink|Setting up RFLink]]. This is free (but not open source) software which you can flash on an Arduino Mega.&lt;br /&gt;
*[[rtl_433|Setting up rtl_433]]. This is free, open source software which uses a software defined radio USB dongle to receive signals from 433MHz devices (and other frequencies like 868 Mhz are possible too).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==868 and 915 MHz==&lt;br /&gt;
A lot of more recent hardware that uses Radio Frequencies to communicate do not use the 433 Mhz anymore but the also open 868 Mhz band (including more standardized protocols like Z-Wave, Zigbee, LoRa, etc.).&lt;br /&gt;
Not all hardware uses standardized protocols, a lot still uses their own manufacturer proprietary implementation. Like within the 433 Mhz spectrum, you need a transceiver hooked up to Domoticz to send and receive signal to- and from these devices. For example the RTL SDR dongles using the rtl_433 library (which also supports 868 Mhz and other frequencies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WiFi 2.4 GHz==&lt;br /&gt;
This is the same spectrum that the Wifi standard uses, but there are lots of less well known protocols that operate here too. It&#039;s also a bit of a wild west.&lt;br /&gt;
&lt;br /&gt;
*[[MySensors|Mysensors.org: connecting with all MySensors-gateways]]&lt;br /&gt;
*[https://github.com/mario-peters/ShellyCloudPlugin Shelly Cloud Plugin] that works with many Shelly devices&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bluetooth==&lt;br /&gt;
A popular short-range wireless standard. The Raspberry Pi, the most popular platform for Domoticz, now has built in Bluetooth.&lt;br /&gt;
&lt;br /&gt;
*[[BTAudio|Bluetooth Audio]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Homekit (Apple)==&lt;br /&gt;
This is a protocol created by Apple.&lt;br /&gt;
&lt;br /&gt;
*[[Homekit_Siri | Apple HomeKit with Siri support]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1-wire==&lt;br /&gt;
This is a standard for connecting very simple sensors.&lt;br /&gt;
&lt;br /&gt;
*[http://domoticz.com/wiki/1Wire Using 1-Wire with Domoticz]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DomBus==&lt;br /&gt;
RS485 serial bus protocol operating at 115200bps: with a 4 wires shielded cable it&#039;s possible to carry data and 12/24V power supply to all modules.&lt;br /&gt;
&lt;br /&gt;
This protocol is used by [[Creasol_Dombus|Creasol DomBus]] modules.&lt;br /&gt;
&lt;br /&gt;
==X10==&lt;br /&gt;
It&#039;s an older standard, but it checks out.&lt;br /&gt;
&lt;br /&gt;
*[[X10 with CM11a|X10 devices with a CM11a]]&lt;br /&gt;
*[[X10 devices, CM15 Pro|X10 devices with a CM15 Pro]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==eHouse TCP/IP &amp;amp; UDP==&lt;br /&gt;
eHouse IP Controllers uses:&lt;br /&gt;
&lt;br /&gt;
*- TCP/IP for direct communication (send commands/events) implementing challenge-response algoritm for security.&lt;br /&gt;
*- TCP/IP (via Internet / LAN / WiFi) via eHouse PRO server gathering all IP and NON IP controllers statuses.&lt;br /&gt;
*- UDP broadcasts for distributing IP controllers status all over LAN/WiFi network without connection to device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eHouse NON IP Controllers:&lt;br /&gt;
&lt;br /&gt;
*- work under eHouse PRO server supervision, which is a gateway/proxy and all statuses are also broadcasted by UDP.&lt;br /&gt;
*- TCP/IP commands directed to eHouse PRO server are resend to NON IP devices.&lt;br /&gt;
*[[eHouse]] |  [[eHouse Protocol]] |  [[eHouse Configuration]] | [[Supported Controllers]]&lt;br /&gt;
&lt;br /&gt;
==Infrared==&lt;br /&gt;
IR (I.R. = infrared or infra-red)&lt;br /&gt;
&lt;br /&gt;
*[[eHouse IR]]&lt;br /&gt;
&lt;br /&gt;
==Unsorted==&lt;br /&gt;
Please help sort these.&lt;br /&gt;
&lt;br /&gt;
*[[EnOcean]]&lt;br /&gt;
*[[S0Meter|S0-pulsecounter]]&lt;br /&gt;
*[[Basic Tellstick functionality with Domoticz]]&lt;br /&gt;
*[[Limitless/AppLamp_LED|Limitless/AppLamp/Milight RGBW bulbs/led strips]]&lt;br /&gt;
*[[Harmony Hub Control]]. Native [[Harmony Hub]](version 1.1956)&lt;br /&gt;
*[[Pi-Mote|Using Energenie Pi-mote with Domoticz]]&lt;br /&gt;
*[[LIFX|LIFX lightbulbs]]&lt;br /&gt;
*[[Wemo|Belkin WeMo]]&lt;br /&gt;
*[[MPD_%26_Domoticz|Music Player Daemon (MPD) &amp;amp; Domoticz]]&lt;br /&gt;
*[[SMASpot Monitoring in Domoticz]]&lt;br /&gt;
*[[Talking Domoticz|Let Domoticz speak to inform you]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A larger list of devices that Domoticz supports can be found on the [[Hardware|hardware overview page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
&lt;br /&gt;
*[[Hardware| Hardware]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19219</id>
		<title>Integrations and Protocols</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19219"/>
		<updated>2026-06-10T08:16:44Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* AI Agent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domoticz can speak a lot of device languages and connect to many different interfaces. Those devices are in the world of computers techically called &amp;quot;protocols&amp;quot; and computing interfaces are called API (Application Programming Interface).&lt;br /&gt;
&lt;br /&gt;
This page is about helping you summerize languages or &#039;protocols&#039; which Domoticz can understand, and other ways of helping Domoticz connecting to different devices or other bridges/hubs/gateways/controllers, for example through plugins (addons). &lt;br /&gt;
&lt;br /&gt;
This summery also tries mention a few examples of such devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Plugins (Addons)=&lt;br /&gt;
Python Plugins (sometimes also refered to as addons, add-ons, or extensions) expand Domoticz abilties to connect to even more devices, bridges, gateways, hubs, controllers, off-line or online services, and more.&lt;br /&gt;
&lt;br /&gt;
*[[Plugins]] - A list of plugins available. New ones are rapidly being added. Look in the forum under &#039;python&#039; to find the latest additions.&lt;br /&gt;
*[[Using_Python_plugins]] - Details on how to install a plugin.&lt;br /&gt;
*[[Developing a Python plugin]] - Details on how to develop your own plugin.&lt;br /&gt;
&lt;br /&gt;
==On your device==&lt;br /&gt;
Your Domoticz server might have built-in sensors, or talk to other software on your server.&lt;br /&gt;
&lt;br /&gt;
*[[Adding internal pc sensors to Domoticz on Windows systems|Adding internal PC sensors to Domoticz on Windows systems]]&lt;br /&gt;
*[[Write_Domoticz_logfile_to_Synology_Log_Center|Write Domoticz log to Synology Log Center]]&lt;br /&gt;
*[[PiFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
Plug devices directly into your Domoticz server. &lt;br /&gt;
&lt;br /&gt;
*[[Voltcraft_CO-20 | Voltcraft CO-20 airquality sensor]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buienradar==&lt;br /&gt;
Your own private Buienradar Weatherstation. From Domoticz build V4.11230 and up it is possible to add native Buienradar instead of using plugin&lt;br /&gt;
&lt;br /&gt;
*[[Buienradar | Buienradar native implementation]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AI Agent =&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
= Voice Control =&lt;br /&gt;
[[Alexa Smart Home Integration|Alexa]]&lt;br /&gt;
&lt;br /&gt;
=Protocols=&lt;br /&gt;
Below you will find a number of protcols, and details about gateways that give access to large groups of devices using those protocols. Gateways are often devices that plug into or communicate with your server, such as a bluetooth dongle or wireless receiver and transmitter.&lt;br /&gt;
&lt;br /&gt;
==IP (Internet Protocol) with TCP/UDP and HTTP==&lt;br /&gt;
IP (Internet Protocol) are your everyday network protocols used on local networks and the internet. This is the basic language spoken by all servers and computers on the internet and by devices in your home network, including your WiFi. &lt;br /&gt;
&lt;br /&gt;
===Wired &amp;amp; Wireless===&lt;br /&gt;
These are devices that have gotten an IP address on your local network. Your router hands out these IP addresses.&lt;br /&gt;
&lt;br /&gt;
*[[Philips Hue Lights]]&lt;br /&gt;
*[[Fritzbox|FRITZ!Box callmonitor]]&lt;br /&gt;
*[[Wake-up_On_Lan|Wake-on-LAN (WoL) a PC with Domoticz]]&lt;br /&gt;
*[[Sonos|Sonos: different solutions for integrating Sonos within Domoticz]]&lt;br /&gt;
*[[Essent|Essent E-Thermostat (ICY)]]&lt;br /&gt;
*[[ESP8266 WiFi module]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Web===&lt;br /&gt;
These are services on the internet that you connect to through your internet router. Domoticz can talk to all kinds of services on the internet and get or deposit data there, such as the current weather.&lt;br /&gt;
&lt;br /&gt;
*[[HttpLink|Push data from Domoticz to your own server]]&lt;br /&gt;
*[[Weather forecast from forecast.io in Domoticz|&amp;lt;s&amp;gt;Weather forecast from forecast.io in Domoticz&amp;lt;/s&amp;gt;]] Not functional any more&lt;br /&gt;
*[[Virtual weather devices|&amp;lt;s&amp;gt;Virtual weather devices (Weather Underground)&amp;lt;/s&amp;gt;]] Not functional anymore&lt;br /&gt;
*[[Open Weather Map]] devices&lt;br /&gt;
*[[Domoticz and PvOutput.org|Domoticz and PVOutput.org]]&lt;br /&gt;
*[[Telegram Bot|Installing Telegram Notification System - Telegram Bot Method]]&lt;br /&gt;
*[[Secure_Nginx_Proxy_Setup|x509-Auth w/Nginx for secure remote access.]]&lt;br /&gt;
*[[Smappee |Smappee energymonitor in Domoticz]]&lt;br /&gt;
*[https://www.npmjs.com/package/corrently4domoticz Corrently - German Green Power Index in Domoticz] (Node JS Package)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT==&lt;br /&gt;
This standard, that works on top op TCP/IP, has been around for decades, but has been embraced as the Internet of Things (IoT) hype grew. Domoticz supports [[MQTT]], and will listen on the &#039;&#039;domoticz/in&#039;&#039; topic.&lt;br /&gt;
&lt;br /&gt;
Domoticz also supports platforms that use the MQTT HA Auto Discover protocol, see wiki [[MQTT|MQTT Auto discover Gateway]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LoRa==&lt;br /&gt;
For devices that use LoRa radio technology, a [[TTNMQTT]] module is available which retrieves data using MQTT from The Things Network.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Z-Wave==&lt;br /&gt;
The Z-Wave protocol propriatory wireless standard created especially for smart devices, &lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Z-Wave on consist of several generations where the newer versions are back-wards compatible with the older generation however incoperating older generation devices into can sometimes lower the encryption level used in your network-mesh.&lt;br /&gt;
&lt;br /&gt;
The downside of the Z-Wave protocol being propriatory is means that there are less manufacturers and devices cost more but the upside is that because it is propriatory interoperability between differet manufacturers is much better than more open protocols, so compatibility between devices and gateways/bridges/controllers is almost always better.&lt;br /&gt;
&lt;br /&gt;
*Using [[Zwave-JS-UI]]&lt;br /&gt;
*[[Zwave|Setting up Z-Wave]] with OpenZwave (deprecated)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zigbee==&lt;br /&gt;
Zigbee is a suite of IEEE 802.15.4-based protocol standards some of which are designed to be used by smart devices for home automation.&lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Zigbee protocol standards are managed by the Zigbee Alliance and they have relativly low royalty fees and allow anyone to manufacturer chips for Zigbee and Zigbee protocol stacks. Official certification of manufacturers devices by the Zigbee Alliance cost more and though it is not requires it is still recommended, which makes it possible for devices to be non cerfified devices to be cheap and certified devices to be relativly inexpensive.&lt;br /&gt;
&lt;br /&gt;
The downside of the Zigbee protocol being loosley controlled by Zigbee Alliance, not even requireing certifications or quality control means that there can be interoperability issues between differet manufacturers, so compatibility between devices and gateways/bridges/controllers can not be garanteed. Because of this is recommended to preferably buy devices that are &amp;quot;Zigbee 3.0&amp;quot; cerfified by the Zigbee Alliance as that should mean that they have been independently tested to at least meet their minimum requirements of follwing the official Zigbee standards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Zigbee#Zigbee support in Domoticz|Options available for connecting to  Zigbee devices from Domoticz]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matter ==&lt;br /&gt;
Matter is a new secure, reliable and local standard protocol for smart/IoT devices launched at the end of 2022 by the Connectivity Standards Alliance.&lt;br /&gt;
&lt;br /&gt;
Domoticz has a Matter integration based on matter.js server, see wiki page [[Matter]]&lt;br /&gt;
&lt;br /&gt;
==315 and 433 MHz==&lt;br /&gt;
The 433MHz frequency range in Europe and Asia as well as 315 MHz radio frequency range in North America are the wild west radio spectrums of the wireless world because anyone can use it freely without any licences or permissions needed as long as the do not have too stong radios.&lt;br /&gt;
&lt;br /&gt;
Because there are basically no rules all kinds of &amp;quot;cowboy&amp;quot; devices have been built with an equally big amount of different languages (protocol) being spoken. &lt;br /&gt;
&lt;br /&gt;
The frequency range for the &amp;quot;433MHz&amp;quot; spectrum is actually a range from 433.05 MHz to 434.79 MHz with center frequency being 433.92 MHz (which is also the most commonly uses by most of these types of devices in  Europe and Asia). The frequency range for the &amp;quot;315MHz&amp;quot; spectrum is actually a range from 315.xx MHz to 315.xx MHz with center frequency being 315.xx MHz (which is also the most commonly uses by most of these types of devices in North America). &lt;br /&gt;
&lt;br /&gt;
Most of the devices in these spectrums do not support tw-way communcation and in most cases the use unencrypted communications, so in theory anyone could listen in on it, or even control your devices. So please don&#039;t buy a pacemaker with a 433Mhz remote.&lt;br /&gt;
&lt;br /&gt;
Thanks to gateways/bridges like RFXcom and RFLink which speak and can translate a lot of these languages (protocols), Domoticz can interact with a lof of those type of devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[RFXcom|Setting up RFXCom]]. This is a commercial product, with two versions. Please buy the newer E version.&lt;br /&gt;
*[[RFLink|Setting up RFLink]]. This is free (but not open source) software which you can flash on an Arduino Mega.&lt;br /&gt;
*[[rtl_433|Setting up rtl_433]]. This is free, open source software which uses a software defined radio USB dongle to receive signals from 433MHz devices (and other frequencies like 868 Mhz are possible too).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==868 and 915 MHz==&lt;br /&gt;
A lot of more recent hardware that uses Radio Frequencies to communicate do not use the 433 Mhz anymore but the also open 868 Mhz band (including more standardized protocols like Z-Wave, Zigbee, LoRa, etc.).&lt;br /&gt;
Not all hardware uses standardized protocols, a lot still uses their own manufacturer proprietary implementation. Like within the 433 Mhz spectrum, you need a transceiver hooked up to Domoticz to send and receive signal to- and from these devices. For example the RTL SDR dongles using the rtl_433 library (which also supports 868 Mhz and other frequencies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WiFi 2.4 GHz==&lt;br /&gt;
This is the same spectrum that the Wifi standard uses, but there are lots of less well known protocols that operate here too. It&#039;s also a bit of a wild west.&lt;br /&gt;
&lt;br /&gt;
*[[MySensors|Mysensors.org: connecting with all MySensors-gateways]]&lt;br /&gt;
*[https://github.com/mario-peters/ShellyCloudPlugin Shelly Cloud Plugin] that works with many Shelly devices&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bluetooth==&lt;br /&gt;
A popular short-range wireless standard. The Raspberry Pi, the most popular platform for Domoticz, now has built in Bluetooth.&lt;br /&gt;
&lt;br /&gt;
*[[BTAudio|Bluetooth Audio]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Homekit (Apple)==&lt;br /&gt;
This is a protocol created by Apple.&lt;br /&gt;
&lt;br /&gt;
*[[Homekit_Siri | Apple HomeKit with Siri support]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1-wire==&lt;br /&gt;
This is a standard for connecting very simple sensors.&lt;br /&gt;
&lt;br /&gt;
*[http://domoticz.com/wiki/1Wire Using 1-Wire with Domoticz]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DomBus==&lt;br /&gt;
RS485 serial bus protocol operating at 115200bps: with a 4 wires shielded cable it&#039;s possible to carry data and 12/24V power supply to all modules.&lt;br /&gt;
&lt;br /&gt;
This protocol is used by [[Creasol_Dombus|Creasol DomBus]] modules.&lt;br /&gt;
&lt;br /&gt;
==X10==&lt;br /&gt;
It&#039;s an older standard, but it checks out.&lt;br /&gt;
&lt;br /&gt;
*[[X10 with CM11a|X10 devices with a CM11a]]&lt;br /&gt;
*[[X10 devices, CM15 Pro|X10 devices with a CM15 Pro]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==eHouse TCP/IP &amp;amp; UDP==&lt;br /&gt;
eHouse IP Controllers uses:&lt;br /&gt;
&lt;br /&gt;
*- TCP/IP for direct communication (send commands/events) implementing challenge-response algoritm for security.&lt;br /&gt;
*- TCP/IP (via Internet / LAN / WiFi) via eHouse PRO server gathering all IP and NON IP controllers statuses.&lt;br /&gt;
*- UDP broadcasts for distributing IP controllers status all over LAN/WiFi network without connection to device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eHouse NON IP Controllers:&lt;br /&gt;
&lt;br /&gt;
*- work under eHouse PRO server supervision, which is a gateway/proxy and all statuses are also broadcasted by UDP.&lt;br /&gt;
*- TCP/IP commands directed to eHouse PRO server are resend to NON IP devices.&lt;br /&gt;
*[[eHouse]] |  [[eHouse Protocol]] |  [[eHouse Configuration]] | [[Supported Controllers]]&lt;br /&gt;
&lt;br /&gt;
==Infrared==&lt;br /&gt;
IR (I.R. = infrared or infra-red)&lt;br /&gt;
&lt;br /&gt;
*[[eHouse IR]]&lt;br /&gt;
&lt;br /&gt;
==Unsorted==&lt;br /&gt;
Please help sort these.&lt;br /&gt;
&lt;br /&gt;
*[[EnOcean]]&lt;br /&gt;
*[[S0Meter|S0-pulsecounter]]&lt;br /&gt;
*[[Basic Tellstick functionality with Domoticz]]&lt;br /&gt;
*[[Limitless/AppLamp_LED|Limitless/AppLamp/Milight RGBW bulbs/led strips]]&lt;br /&gt;
*[[Harmony Hub Control]]. Native [[Harmony Hub]](version 1.1956)&lt;br /&gt;
*[[Pi-Mote|Using Energenie Pi-mote with Domoticz]]&lt;br /&gt;
*[[LIFX|LIFX lightbulbs]]&lt;br /&gt;
*[[Wemo|Belkin WeMo]]&lt;br /&gt;
*[[MPD_%26_Domoticz|Music Player Daemon (MPD) &amp;amp; Domoticz]]&lt;br /&gt;
*[[SMASpot Monitoring in Domoticz]]&lt;br /&gt;
*[[Talking Domoticz|Let Domoticz speak to inform you]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A larger list of devices that Domoticz supports can be found on the [[Hardware|hardware overview page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
&lt;br /&gt;
*[[Hardware| Hardware]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19218</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19218"/>
		<updated>2026-06-10T08:13:35Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* AI Agent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
[[File:Dynamic Dashboard.png|right]]&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
*[[Energy dashboard|Energy Dashboard]] to view your energy flows in your house&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process at the &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; endpoint. AI agents can now discover and control devices using the &amp;lt;code&amp;gt;search_devices&amp;lt;/code&amp;gt; tool - making Domoticz one of the first home automation platforms with built-in MCP support.&lt;br /&gt;
&lt;br /&gt;
An AI agent can create sensors and devices (&amp;lt;code&amp;gt;create_sensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;create_device&amp;lt;/code&amp;gt;), hide or permanently delete them, and read full sensor history through &amp;lt;code&amp;gt;get_sensor_history&amp;lt;/code&amp;gt; - daily calendar data for every sensor type plus the event log for switches and scenes. Battery and RSSI/signal levels now appear right in device search, with &amp;lt;code&amp;gt;hw_idx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;include_unused&amp;lt;/code&amp;gt; filters and resource-URI autocompletion to keep queries precise.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
*[[Alexa Smart Home Integration|Alexa Smart Home integration]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19217</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19217"/>
		<updated>2026-06-10T08:10:20Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* AI Agent */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
[[File:Dynamic Dashboard.png|right]]&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
*[[Energy dashboard|Energy Dashboard]] to view your energy flows in your house&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process at the &amp;lt;code&amp;gt;/mcp&amp;lt;/code&amp;gt; endpoint. AI agents can now discover and control devices using the &amp;lt;code&amp;gt;search_devices&amp;lt;/code&amp;gt; tool - making Domoticz one of the first home automation platforms with built-in MCP support.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
*[[Alexa Smart Home Integration|Alexa Smart Home integration]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19216</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19216"/>
		<updated>2026-06-09T21:01:12Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* User Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
[[File:Dynamic Dashboard.png|right]]&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
*[[Energy dashboard|Energy Dashboard]] to view your energy flows in your house&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
*[[Alexa Smart Home Integration|Alexa Smart Home integration]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19215</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19215"/>
		<updated>2026-06-09T20:58:38Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* User Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
[[File:Dynamic Dashboard.png|right]]&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
*[[Alexa Smart Home Integration|Alexa Smart Home integration]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=File:Dynamic_Dashboard.png&amp;diff=19214</id>
		<title>File:Dynamic Dashboard.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=File:Dynamic_Dashboard.png&amp;diff=19214"/>
		<updated>2026-06-09T20:57:33Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dynamic Dashboard&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19213</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19213"/>
		<updated>2026-06-09T20:48:26Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Remote Access */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
*[[Alexa Smart Home Integration|Alexa Smart Home integration]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19212</id>
		<title>Integrations and Protocols</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19212"/>
		<updated>2026-06-09T20:46:49Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Plugins (Addons) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domoticz can speak a lot of device languages and connect to many different interfaces. Those devices are in the world of computers techically called &amp;quot;protocols&amp;quot; and computing interfaces are called API (Application Programming Interface).&lt;br /&gt;
&lt;br /&gt;
This page is about helping you summerize languages or &#039;protocols&#039; which Domoticz can understand, and other ways of helping Domoticz connecting to different devices or other bridges/hubs/gateways/controllers, for example through plugins (addons). &lt;br /&gt;
&lt;br /&gt;
This summery also tries mention a few examples of such devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Plugins (Addons)=&lt;br /&gt;
Python Plugins (sometimes also refered to as addons, add-ons, or extensions) expand Domoticz abilties to connect to even more devices, bridges, gateways, hubs, controllers, off-line or online services, and more.&lt;br /&gt;
&lt;br /&gt;
*[[Plugins]] - A list of plugins available. New ones are rapidly being added. Look in the forum under &#039;python&#039; to find the latest additions.&lt;br /&gt;
*[[Using_Python_plugins]] - Details on how to install a plugin.&lt;br /&gt;
*[[Developing a Python plugin]] - Details on how to develop your own plugin.&lt;br /&gt;
&lt;br /&gt;
==On your device==&lt;br /&gt;
Your Domoticz server might have built-in sensors, or talk to other software on your server.&lt;br /&gt;
&lt;br /&gt;
*[[Adding internal pc sensors to Domoticz on Windows systems|Adding internal PC sensors to Domoticz on Windows systems]]&lt;br /&gt;
*[[Write_Domoticz_logfile_to_Synology_Log_Center|Write Domoticz log to Synology Log Center]]&lt;br /&gt;
*[[PiFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
Plug devices directly into your Domoticz server. &lt;br /&gt;
&lt;br /&gt;
*[[Voltcraft_CO-20 | Voltcraft CO-20 airquality sensor]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buienradar==&lt;br /&gt;
Your own private Buienradar Weatherstation. From Domoticz build V4.11230 and up it is possible to add native Buienradar instead of using plugin&lt;br /&gt;
&lt;br /&gt;
*[[Buienradar | Buienradar native implementation]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AI Agent =&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
=Protocols=&lt;br /&gt;
Below you will find a number of protcols, and details about gateways that give access to large groups of devices using those protocols. Gateways are often devices that plug into or communicate with your server, such as a bluetooth dongle or wireless receiver and transmitter.&lt;br /&gt;
&lt;br /&gt;
==IP (Internet Protocol) with TCP/UDP and HTTP==&lt;br /&gt;
IP (Internet Protocol) are your everyday network protocols used on local networks and the internet. This is the basic language spoken by all servers and computers on the internet and by devices in your home network, including your WiFi. &lt;br /&gt;
&lt;br /&gt;
===Wired &amp;amp; Wireless===&lt;br /&gt;
These are devices that have gotten an IP address on your local network. Your router hands out these IP addresses.&lt;br /&gt;
&lt;br /&gt;
*[[Philips Hue Lights]]&lt;br /&gt;
*[[Fritzbox|FRITZ!Box callmonitor]]&lt;br /&gt;
*[[Wake-up_On_Lan|Wake-on-LAN (WoL) a PC with Domoticz]]&lt;br /&gt;
*[[Sonos|Sonos: different solutions for integrating Sonos within Domoticz]]&lt;br /&gt;
*[[Essent|Essent E-Thermostat (ICY)]]&lt;br /&gt;
*[[ESP8266 WiFi module]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Web===&lt;br /&gt;
These are services on the internet that you connect to through your internet router. Domoticz can talk to all kinds of services on the internet and get or deposit data there, such as the current weather.&lt;br /&gt;
&lt;br /&gt;
*[[HttpLink|Push data from Domoticz to your own server]]&lt;br /&gt;
*[[Weather forecast from forecast.io in Domoticz|&amp;lt;s&amp;gt;Weather forecast from forecast.io in Domoticz&amp;lt;/s&amp;gt;]] Not functional any more&lt;br /&gt;
*[[Virtual weather devices|&amp;lt;s&amp;gt;Virtual weather devices (Weather Underground)&amp;lt;/s&amp;gt;]] Not functional anymore&lt;br /&gt;
*[[Open Weather Map]] devices&lt;br /&gt;
*[[Domoticz and PvOutput.org|Domoticz and PVOutput.org]]&lt;br /&gt;
*[[Telegram Bot|Installing Telegram Notification System - Telegram Bot Method]]&lt;br /&gt;
*[[Secure_Nginx_Proxy_Setup|x509-Auth w/Nginx for secure remote access.]]&lt;br /&gt;
*[[Smappee |Smappee energymonitor in Domoticz]]&lt;br /&gt;
*[https://www.npmjs.com/package/corrently4domoticz Corrently - German Green Power Index in Domoticz] (Node JS Package)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT==&lt;br /&gt;
This standard, that works on top op TCP/IP, has been around for decades, but has been embraced as the Internet of Things (IoT) hype grew. Domoticz supports [[MQTT]], and will listen on the &#039;&#039;domoticz/in&#039;&#039; topic.&lt;br /&gt;
&lt;br /&gt;
Domoticz also supports platforms that use the MQTT HA Auto Discover protocol, see wiki [[MQTT|MQTT Auto discover Gateway]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LoRa==&lt;br /&gt;
For devices that use LoRa radio technology, a [[TTNMQTT]] module is available which retrieves data using MQTT from The Things Network.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Z-Wave==&lt;br /&gt;
The Z-Wave protocol propriatory wireless standard created especially for smart devices, &lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Z-Wave on consist of several generations where the newer versions are back-wards compatible with the older generation however incoperating older generation devices into can sometimes lower the encryption level used in your network-mesh.&lt;br /&gt;
&lt;br /&gt;
The downside of the Z-Wave protocol being propriatory is means that there are less manufacturers and devices cost more but the upside is that because it is propriatory interoperability between differet manufacturers is much better than more open protocols, so compatibility between devices and gateways/bridges/controllers is almost always better.&lt;br /&gt;
&lt;br /&gt;
*Using [[Zwave-JS-UI]]&lt;br /&gt;
*[[Zwave|Setting up Z-Wave]] with OpenZwave (deprecated)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zigbee==&lt;br /&gt;
Zigbee is a suite of IEEE 802.15.4-based protocol standards some of which are designed to be used by smart devices for home automation.&lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Zigbee protocol standards are managed by the Zigbee Alliance and they have relativly low royalty fees and allow anyone to manufacturer chips for Zigbee and Zigbee protocol stacks. Official certification of manufacturers devices by the Zigbee Alliance cost more and though it is not requires it is still recommended, which makes it possible for devices to be non cerfified devices to be cheap and certified devices to be relativly inexpensive.&lt;br /&gt;
&lt;br /&gt;
The downside of the Zigbee protocol being loosley controlled by Zigbee Alliance, not even requireing certifications or quality control means that there can be interoperability issues between differet manufacturers, so compatibility between devices and gateways/bridges/controllers can not be garanteed. Because of this is recommended to preferably buy devices that are &amp;quot;Zigbee 3.0&amp;quot; cerfified by the Zigbee Alliance as that should mean that they have been independently tested to at least meet their minimum requirements of follwing the official Zigbee standards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Zigbee#Zigbee support in Domoticz|Options available for connecting to  Zigbee devices from Domoticz]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matter ==&lt;br /&gt;
Matter is a new secure, reliable and local standard protocol for smart/IoT devices launched at the end of 2022 by the Connectivity Standards Alliance.&lt;br /&gt;
&lt;br /&gt;
Domoticz has a Matter integration based on matter.js server, see wiki page [[Matter]]&lt;br /&gt;
&lt;br /&gt;
==315 and 433 MHz==&lt;br /&gt;
The 433MHz frequency range in Europe and Asia as well as 315 MHz radio frequency range in North America are the wild west radio spectrums of the wireless world because anyone can use it freely without any licences or permissions needed as long as the do not have too stong radios.&lt;br /&gt;
&lt;br /&gt;
Because there are basically no rules all kinds of &amp;quot;cowboy&amp;quot; devices have been built with an equally big amount of different languages (protocol) being spoken. &lt;br /&gt;
&lt;br /&gt;
The frequency range for the &amp;quot;433MHz&amp;quot; spectrum is actually a range from 433.05 MHz to 434.79 MHz with center frequency being 433.92 MHz (which is also the most commonly uses by most of these types of devices in  Europe and Asia). The frequency range for the &amp;quot;315MHz&amp;quot; spectrum is actually a range from 315.xx MHz to 315.xx MHz with center frequency being 315.xx MHz (which is also the most commonly uses by most of these types of devices in North America). &lt;br /&gt;
&lt;br /&gt;
Most of the devices in these spectrums do not support tw-way communcation and in most cases the use unencrypted communications, so in theory anyone could listen in on it, or even control your devices. So please don&#039;t buy a pacemaker with a 433Mhz remote.&lt;br /&gt;
&lt;br /&gt;
Thanks to gateways/bridges like RFXcom and RFLink which speak and can translate a lot of these languages (protocols), Domoticz can interact with a lof of those type of devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[RFXcom|Setting up RFXCom]]. This is a commercial product, with two versions. Please buy the newer E version.&lt;br /&gt;
*[[RFLink|Setting up RFLink]]. This is free (but not open source) software which you can flash on an Arduino Mega.&lt;br /&gt;
*[[rtl_433|Setting up rtl_433]]. This is free, open source software which uses a software defined radio USB dongle to receive signals from 433MHz devices (and other frequencies like 868 Mhz are possible too).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==868 and 915 MHz==&lt;br /&gt;
A lot of more recent hardware that uses Radio Frequencies to communicate do not use the 433 Mhz anymore but the also open 868 Mhz band (including more standardized protocols like Z-Wave, Zigbee, LoRa, etc.).&lt;br /&gt;
Not all hardware uses standardized protocols, a lot still uses their own manufacturer proprietary implementation. Like within the 433 Mhz spectrum, you need a transceiver hooked up to Domoticz to send and receive signal to- and from these devices. For example the RTL SDR dongles using the rtl_433 library (which also supports 868 Mhz and other frequencies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WiFi 2.4 GHz==&lt;br /&gt;
This is the same spectrum that the Wifi standard uses, but there are lots of less well known protocols that operate here too. It&#039;s also a bit of a wild west.&lt;br /&gt;
&lt;br /&gt;
*[[MySensors|Mysensors.org: connecting with all MySensors-gateways]]&lt;br /&gt;
*[https://github.com/mario-peters/ShellyCloudPlugin Shelly Cloud Plugin] that works with many Shelly devices&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bluetooth==&lt;br /&gt;
A popular short-range wireless standard. The Raspberry Pi, the most popular platform for Domoticz, now has built in Bluetooth.&lt;br /&gt;
&lt;br /&gt;
*[[BTAudio|Bluetooth Audio]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Homekit (Apple)==&lt;br /&gt;
This is a protocol created by Apple.&lt;br /&gt;
&lt;br /&gt;
*[[Homekit_Siri | Apple HomeKit with Siri support]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1-wire==&lt;br /&gt;
This is a standard for connecting very simple sensors.&lt;br /&gt;
&lt;br /&gt;
*[http://domoticz.com/wiki/1Wire Using 1-Wire with Domoticz]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DomBus==&lt;br /&gt;
RS485 serial bus protocol operating at 115200bps: with a 4 wires shielded cable it&#039;s possible to carry data and 12/24V power supply to all modules.&lt;br /&gt;
&lt;br /&gt;
This protocol is used by [[Creasol_Dombus|Creasol DomBus]] modules.&lt;br /&gt;
&lt;br /&gt;
==X10==&lt;br /&gt;
It&#039;s an older standard, but it checks out.&lt;br /&gt;
&lt;br /&gt;
*[[X10 with CM11a|X10 devices with a CM11a]]&lt;br /&gt;
*[[X10 devices, CM15 Pro|X10 devices with a CM15 Pro]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==eHouse TCP/IP &amp;amp; UDP==&lt;br /&gt;
eHouse IP Controllers uses:&lt;br /&gt;
&lt;br /&gt;
*- TCP/IP for direct communication (send commands/events) implementing challenge-response algoritm for security.&lt;br /&gt;
*- TCP/IP (via Internet / LAN / WiFi) via eHouse PRO server gathering all IP and NON IP controllers statuses.&lt;br /&gt;
*- UDP broadcasts for distributing IP controllers status all over LAN/WiFi network without connection to device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eHouse NON IP Controllers:&lt;br /&gt;
&lt;br /&gt;
*- work under eHouse PRO server supervision, which is a gateway/proxy and all statuses are also broadcasted by UDP.&lt;br /&gt;
*- TCP/IP commands directed to eHouse PRO server are resend to NON IP devices.&lt;br /&gt;
*[[eHouse]] |  [[eHouse Protocol]] |  [[eHouse Configuration]] | [[Supported Controllers]]&lt;br /&gt;
&lt;br /&gt;
==Infrared==&lt;br /&gt;
IR (I.R. = infrared or infra-red)&lt;br /&gt;
&lt;br /&gt;
*[[eHouse IR]]&lt;br /&gt;
&lt;br /&gt;
==Unsorted==&lt;br /&gt;
Please help sort these.&lt;br /&gt;
&lt;br /&gt;
*[[EnOcean]]&lt;br /&gt;
*[[S0Meter|S0-pulsecounter]]&lt;br /&gt;
*[[Basic Tellstick functionality with Domoticz]]&lt;br /&gt;
*[[Limitless/AppLamp_LED|Limitless/AppLamp/Milight RGBW bulbs/led strips]]&lt;br /&gt;
*[[Harmony Hub Control]]. Native [[Harmony Hub]](version 1.1956)&lt;br /&gt;
*[[Pi-Mote|Using Energenie Pi-mote with Domoticz]]&lt;br /&gt;
*[[LIFX|LIFX lightbulbs]]&lt;br /&gt;
*[[Wemo|Belkin WeMo]]&lt;br /&gt;
*[[MPD_%26_Domoticz|Music Player Daemon (MPD) &amp;amp; Domoticz]]&lt;br /&gt;
*[[SMASpot Monitoring in Domoticz]]&lt;br /&gt;
*[[Talking Domoticz|Let Domoticz speak to inform you]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A larger list of devices that Domoticz supports can be found on the [[Hardware|hardware overview page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
&lt;br /&gt;
*[[Hardware| Hardware]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19211</id>
		<title>Integrations and Protocols</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Integrations_and_Protocols&amp;diff=19211"/>
		<updated>2026-06-09T20:45:12Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domoticz can speak a lot of device languages and connect to many different interfaces. Those devices are in the world of computers techically called &amp;quot;protocols&amp;quot; and computing interfaces are called API (Application Programming Interface).&lt;br /&gt;
&lt;br /&gt;
This page is about helping you summerize languages or &#039;protocols&#039; which Domoticz can understand, and other ways of helping Domoticz connecting to different devices or other bridges/hubs/gateways/controllers, for example through plugins (addons). &lt;br /&gt;
&lt;br /&gt;
This summery also tries mention a few examples of such devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Plugins (Addons)=&lt;br /&gt;
Python Plugins (sometimes also refered to as addons, add-ons, or extensions) expand Domoticz abilties to connect to even more devices, bridges, gateways, hubs, controllers, off-line or online services, and more.&lt;br /&gt;
&lt;br /&gt;
*[[Plugins]] - A list of plugins available. New ones are rapidly being added. Look in the forum under &#039;python&#039; to find the latest additions.&lt;br /&gt;
*[[Using_Python_plugins]] - Details on how to install a plugin.&lt;br /&gt;
*[[Developing a Python plugin]] - Details on how to develop your own plugin.&lt;br /&gt;
&lt;br /&gt;
==On your device==&lt;br /&gt;
Your Domoticz server might have built-in sensors, or talk to other software on your server.&lt;br /&gt;
&lt;br /&gt;
*[[Adding internal pc sensors to Domoticz on Windows systems|Adding internal PC sensors to Domoticz on Windows systems]]&lt;br /&gt;
*[[Write_Domoticz_logfile_to_Synology_Log_Center|Write Domoticz log to Synology Log Center]]&lt;br /&gt;
*[[PiFace]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
Plug devices directly into your Domoticz server. &lt;br /&gt;
&lt;br /&gt;
*[[Voltcraft_CO-20 | Voltcraft CO-20 airquality sensor]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Buienradar==&lt;br /&gt;
Your own private Buienradar Weatherstation. From Domoticz build V4.11230 and up it is possible to add native Buienradar instead of using plugin&lt;br /&gt;
&lt;br /&gt;
*[[Buienradar | Buienradar native implementation]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Protocols=&lt;br /&gt;
Below you will find a number of protcols, and details about gateways that give access to large groups of devices using those protocols. Gateways are often devices that plug into or communicate with your server, such as a bluetooth dongle or wireless receiver and transmitter.&lt;br /&gt;
&lt;br /&gt;
==IP (Internet Protocol) with TCP/UDP and HTTP==&lt;br /&gt;
IP (Internet Protocol) are your everyday network protocols used on local networks and the internet. This is the basic language spoken by all servers and computers on the internet and by devices in your home network, including your WiFi. &lt;br /&gt;
&lt;br /&gt;
===Wired &amp;amp; Wireless===&lt;br /&gt;
These are devices that have gotten an IP address on your local network. Your router hands out these IP addresses.&lt;br /&gt;
&lt;br /&gt;
*[[Philips Hue Lights]]&lt;br /&gt;
*[[Fritzbox|FRITZ!Box callmonitor]]&lt;br /&gt;
*[[Wake-up_On_Lan|Wake-on-LAN (WoL) a PC with Domoticz]]&lt;br /&gt;
*[[Sonos|Sonos: different solutions for integrating Sonos within Domoticz]]&lt;br /&gt;
*[[Essent|Essent E-Thermostat (ICY)]]&lt;br /&gt;
*[[ESP8266 WiFi module]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Web===&lt;br /&gt;
These are services on the internet that you connect to through your internet router. Domoticz can talk to all kinds of services on the internet and get or deposit data there, such as the current weather.&lt;br /&gt;
&lt;br /&gt;
*[[HttpLink|Push data from Domoticz to your own server]]&lt;br /&gt;
*[[Weather forecast from forecast.io in Domoticz|&amp;lt;s&amp;gt;Weather forecast from forecast.io in Domoticz&amp;lt;/s&amp;gt;]] Not functional any more&lt;br /&gt;
*[[Virtual weather devices|&amp;lt;s&amp;gt;Virtual weather devices (Weather Underground)&amp;lt;/s&amp;gt;]] Not functional anymore&lt;br /&gt;
*[[Open Weather Map]] devices&lt;br /&gt;
*[[Domoticz and PvOutput.org|Domoticz and PVOutput.org]]&lt;br /&gt;
*[[Telegram Bot|Installing Telegram Notification System - Telegram Bot Method]]&lt;br /&gt;
*[[Secure_Nginx_Proxy_Setup|x509-Auth w/Nginx for secure remote access.]]&lt;br /&gt;
*[[Smappee |Smappee energymonitor in Domoticz]]&lt;br /&gt;
*[https://www.npmjs.com/package/corrently4domoticz Corrently - German Green Power Index in Domoticz] (Node JS Package)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==MQTT==&lt;br /&gt;
This standard, that works on top op TCP/IP, has been around for decades, but has been embraced as the Internet of Things (IoT) hype grew. Domoticz supports [[MQTT]], and will listen on the &#039;&#039;domoticz/in&#039;&#039; topic.&lt;br /&gt;
&lt;br /&gt;
Domoticz also supports platforms that use the MQTT HA Auto Discover protocol, see wiki [[MQTT|MQTT Auto discover Gateway]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LoRa==&lt;br /&gt;
For devices that use LoRa radio technology, a [[TTNMQTT]] module is available which retrieves data using MQTT from The Things Network.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Z-Wave==&lt;br /&gt;
The Z-Wave protocol propriatory wireless standard created especially for smart devices, &lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Z-Wave on consist of several generations where the newer versions are back-wards compatible with the older generation however incoperating older generation devices into can sometimes lower the encryption level used in your network-mesh.&lt;br /&gt;
&lt;br /&gt;
The downside of the Z-Wave protocol being propriatory is means that there are less manufacturers and devices cost more but the upside is that because it is propriatory interoperability between differet manufacturers is much better than more open protocols, so compatibility between devices and gateways/bridges/controllers is almost always better.&lt;br /&gt;
&lt;br /&gt;
*Using [[Zwave-JS-UI]]&lt;br /&gt;
*[[Zwave|Setting up Z-Wave]] with OpenZwave (deprecated)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zigbee==&lt;br /&gt;
Zigbee is a suite of IEEE 802.15.4-based protocol standards some of which are designed to be used by smart devices for home automation.&lt;br /&gt;
&lt;br /&gt;
It creating its own isolated wireless network-mesh which boosts in range the more mains-powered devices you that you add your network mesh, with all mains-powered devices acting as repeater. t supports encyption, so it is harder to listen in on your devices.&lt;br /&gt;
&lt;br /&gt;
Zigbee protocol standards are managed by the Zigbee Alliance and they have relativly low royalty fees and allow anyone to manufacturer chips for Zigbee and Zigbee protocol stacks. Official certification of manufacturers devices by the Zigbee Alliance cost more and though it is not requires it is still recommended, which makes it possible for devices to be non cerfified devices to be cheap and certified devices to be relativly inexpensive.&lt;br /&gt;
&lt;br /&gt;
The downside of the Zigbee protocol being loosley controlled by Zigbee Alliance, not even requireing certifications or quality control means that there can be interoperability issues between differet manufacturers, so compatibility between devices and gateways/bridges/controllers can not be garanteed. Because of this is recommended to preferably buy devices that are &amp;quot;Zigbee 3.0&amp;quot; cerfified by the Zigbee Alliance as that should mean that they have been independently tested to at least meet their minimum requirements of follwing the official Zigbee standards.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[Zigbee#Zigbee support in Domoticz|Options available for connecting to  Zigbee devices from Domoticz]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matter ==&lt;br /&gt;
Matter is a new secure, reliable and local standard protocol for smart/IoT devices launched at the end of 2022 by the Connectivity Standards Alliance.&lt;br /&gt;
&lt;br /&gt;
Domoticz has a Matter integration based on matter.js server, see wiki page [[Matter]]&lt;br /&gt;
&lt;br /&gt;
==315 and 433 MHz==&lt;br /&gt;
The 433MHz frequency range in Europe and Asia as well as 315 MHz radio frequency range in North America are the wild west radio spectrums of the wireless world because anyone can use it freely without any licences or permissions needed as long as the do not have too stong radios.&lt;br /&gt;
&lt;br /&gt;
Because there are basically no rules all kinds of &amp;quot;cowboy&amp;quot; devices have been built with an equally big amount of different languages (protocol) being spoken. &lt;br /&gt;
&lt;br /&gt;
The frequency range for the &amp;quot;433MHz&amp;quot; spectrum is actually a range from 433.05 MHz to 434.79 MHz with center frequency being 433.92 MHz (which is also the most commonly uses by most of these types of devices in  Europe and Asia). The frequency range for the &amp;quot;315MHz&amp;quot; spectrum is actually a range from 315.xx MHz to 315.xx MHz with center frequency being 315.xx MHz (which is also the most commonly uses by most of these types of devices in North America). &lt;br /&gt;
&lt;br /&gt;
Most of the devices in these spectrums do not support tw-way communcation and in most cases the use unencrypted communications, so in theory anyone could listen in on it, or even control your devices. So please don&#039;t buy a pacemaker with a 433Mhz remote.&lt;br /&gt;
&lt;br /&gt;
Thanks to gateways/bridges like RFXcom and RFLink which speak and can translate a lot of these languages (protocols), Domoticz can interact with a lof of those type of devices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[[RFXcom|Setting up RFXCom]]. This is a commercial product, with two versions. Please buy the newer E version.&lt;br /&gt;
*[[RFLink|Setting up RFLink]]. This is free (but not open source) software which you can flash on an Arduino Mega.&lt;br /&gt;
*[[rtl_433|Setting up rtl_433]]. This is free, open source software which uses a software defined radio USB dongle to receive signals from 433MHz devices (and other frequencies like 868 Mhz are possible too).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==868 and 915 MHz==&lt;br /&gt;
A lot of more recent hardware that uses Radio Frequencies to communicate do not use the 433 Mhz anymore but the also open 868 Mhz band (including more standardized protocols like Z-Wave, Zigbee, LoRa, etc.).&lt;br /&gt;
Not all hardware uses standardized protocols, a lot still uses their own manufacturer proprietary implementation. Like within the 433 Mhz spectrum, you need a transceiver hooked up to Domoticz to send and receive signal to- and from these devices. For example the RTL SDR dongles using the rtl_433 library (which also supports 868 Mhz and other frequencies).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==WiFi 2.4 GHz==&lt;br /&gt;
This is the same spectrum that the Wifi standard uses, but there are lots of less well known protocols that operate here too. It&#039;s also a bit of a wild west.&lt;br /&gt;
&lt;br /&gt;
*[[MySensors|Mysensors.org: connecting with all MySensors-gateways]]&lt;br /&gt;
*[https://github.com/mario-peters/ShellyCloudPlugin Shelly Cloud Plugin] that works with many Shelly devices&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bluetooth==&lt;br /&gt;
A popular short-range wireless standard. The Raspberry Pi, the most popular platform for Domoticz, now has built in Bluetooth.&lt;br /&gt;
&lt;br /&gt;
*[[BTAudio|Bluetooth Audio]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Homekit (Apple)==&lt;br /&gt;
This is a protocol created by Apple.&lt;br /&gt;
&lt;br /&gt;
*[[Homekit_Siri | Apple HomeKit with Siri support]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1-wire==&lt;br /&gt;
This is a standard for connecting very simple sensors.&lt;br /&gt;
&lt;br /&gt;
*[http://domoticz.com/wiki/1Wire Using 1-Wire with Domoticz]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DomBus==&lt;br /&gt;
RS485 serial bus protocol operating at 115200bps: with a 4 wires shielded cable it&#039;s possible to carry data and 12/24V power supply to all modules.&lt;br /&gt;
&lt;br /&gt;
This protocol is used by [[Creasol_Dombus|Creasol DomBus]] modules.&lt;br /&gt;
&lt;br /&gt;
==X10==&lt;br /&gt;
It&#039;s an older standard, but it checks out.&lt;br /&gt;
&lt;br /&gt;
*[[X10 with CM11a|X10 devices with a CM11a]]&lt;br /&gt;
*[[X10 devices, CM15 Pro|X10 devices with a CM15 Pro]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==eHouse TCP/IP &amp;amp; UDP==&lt;br /&gt;
eHouse IP Controllers uses:&lt;br /&gt;
&lt;br /&gt;
*- TCP/IP for direct communication (send commands/events) implementing challenge-response algoritm for security.&lt;br /&gt;
*- TCP/IP (via Internet / LAN / WiFi) via eHouse PRO server gathering all IP and NON IP controllers statuses.&lt;br /&gt;
*- UDP broadcasts for distributing IP controllers status all over LAN/WiFi network without connection to device&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eHouse NON IP Controllers:&lt;br /&gt;
&lt;br /&gt;
*- work under eHouse PRO server supervision, which is a gateway/proxy and all statuses are also broadcasted by UDP.&lt;br /&gt;
*- TCP/IP commands directed to eHouse PRO server are resend to NON IP devices.&lt;br /&gt;
*[[eHouse]] |  [[eHouse Protocol]] |  [[eHouse Configuration]] | [[Supported Controllers]]&lt;br /&gt;
&lt;br /&gt;
==Infrared==&lt;br /&gt;
IR (I.R. = infrared or infra-red)&lt;br /&gt;
&lt;br /&gt;
*[[eHouse IR]]&lt;br /&gt;
&lt;br /&gt;
==Unsorted==&lt;br /&gt;
Please help sort these.&lt;br /&gt;
&lt;br /&gt;
*[[EnOcean]]&lt;br /&gt;
*[[S0Meter|S0-pulsecounter]]&lt;br /&gt;
*[[Basic Tellstick functionality with Domoticz]]&lt;br /&gt;
*[[Limitless/AppLamp_LED|Limitless/AppLamp/Milight RGBW bulbs/led strips]]&lt;br /&gt;
*[[Harmony Hub Control]]. Native [[Harmony Hub]](version 1.1956)&lt;br /&gt;
*[[Pi-Mote|Using Energenie Pi-mote with Domoticz]]&lt;br /&gt;
*[[LIFX|LIFX lightbulbs]]&lt;br /&gt;
*[[Wemo|Belkin WeMo]]&lt;br /&gt;
*[[MPD_%26_Domoticz|Music Player Daemon (MPD) &amp;amp; Domoticz]]&lt;br /&gt;
*[[SMASpot Monitoring in Domoticz]]&lt;br /&gt;
*[[Talking Domoticz|Let Domoticz speak to inform you]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A larger list of devices that Domoticz supports can be found on the [[Hardware|hardware overview page]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
[[Category:Hardware]]&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
&lt;br /&gt;
=Continue to the next page of the introduction=&lt;br /&gt;
&lt;br /&gt;
*[[Hardware| Hardware]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19210</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19210"/>
		<updated>2026-06-09T20:39:06Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Setup, More Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
== AI Agent ==&lt;br /&gt;
Domoticz adds built-in support for the Model Context Protocol (MCP), allowing AI assistants and LLM clients to monitor and control your home automation system directly — without any external intermediary process.&lt;br /&gt;
&lt;br /&gt;
See for more instructions page [[MCP model context protocol LLM]]&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19209</id>
		<title>Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Configuration&amp;diff=19209"/>
		<updated>2026-06-09T20:35:41Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* User Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Domoticz connects a lot of devices, so it&#039;s not surprising that there are a lot of settings you can dive into.&lt;br /&gt;
&lt;br /&gt;
- Some devices can be directly connected to Domoticz through the network (Wifi or LAN). An example would be a smart thermostat like the [[Toon|Eneco Toon thermostat]].&amp;lt;br&amp;gt;&lt;br /&gt;
- Others connect via Gateways, USB or LAN These are devices that enable access to a whole family of new things. An example would be a 433Mhz radiotransmitter like RFXCOM or any other device that acts as a bridge like [[Zigbee]] or [[Zwave]]&amp;lt;br&amp;gt;&lt;br /&gt;
- Domoticz can also interact with internet services, such as [[MQTT]],  [[FibaroLink]], Google Pub/Sub and publish to IOT sites, [[Influxdb|InfluxDB]] etc.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a [[Android|great Android app]] as well. And you can even connect your[[Kodi | media player]].&lt;br /&gt;
&lt;br /&gt;
==Hardware/Devices==&lt;br /&gt;
[[File:Menu Setup Devices.png|frame]]&lt;br /&gt;
More general details about types of devices you can connect can be found in the following pages: &lt;br /&gt;
&lt;br /&gt;
*[[Hardware Setup]] (menu Setup - Hardware) to add hardware&lt;br /&gt;
**[[Plugins|Python Plugins]] for additional Hardware/devices support&lt;br /&gt;
*[[Setup Devices|Device List]] (menu Setup - Devices)&lt;br /&gt;
**[[Managing Devices|Managing Devices (device navigation and edit)]]&lt;br /&gt;
**[[Dummy for virtual Switches|Dummy for Virtual Switches]]&lt;br /&gt;
*[[Camera Setup]]&lt;br /&gt;
*[[hardware|List of supported devices]]&lt;br /&gt;
*[[Setting up Device sharing|Setting up device sharing]] between Domoticz environments (eg holiday home)&lt;br /&gt;
&lt;br /&gt;
==User Interface==&lt;br /&gt;
After that you can change some settings that are user interface related:&lt;br /&gt;
&lt;br /&gt;
*[[Application Settings]] (Menu &#039;&#039;&#039;Setup - Settings&#039;&#039;&#039;) for central settings of themes, location, dashboard, backup, notifications etc.&lt;br /&gt;
*[[Floorplans]] Make an interactive floorplan of your building.&lt;br /&gt;
*[[Managing Devices#Dashboard|Dashboard]] Collect the most important devices on the first screen based on favourites&lt;br /&gt;
*[[DynamicDashboard|Dynamic Dashboard]] build your own live home overview with energy, weather, and per-phase power widgets&lt;br /&gt;
*[[Custom menu|Custom Menu]] for adding an extra user menu to link to other sites or pages&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Setup, More Options==&lt;br /&gt;
In Menu &#039;&#039;&#039;Setup --&amp;gt; More Options&#039;&#039;&#039; you can set the following options:&lt;br /&gt;
[[File:SetupCamera.png|right]]&lt;br /&gt;
&lt;br /&gt;
*[[Camera Setup|Cameras]] to add and maintain cameras.&lt;br /&gt;
*[[Events]] to add and maintain automation events with DzVents, Lua , Python event scripts. &lt;br /&gt;
*[[Mobile devices]] to contol the mobile devices connected to Domoticz&lt;br /&gt;
*Push data to push Domoticz data to other environments&lt;br /&gt;
**[[HttpLink|Http]](s)&lt;br /&gt;
**[[Influxdb|InfluxDB]]&lt;br /&gt;
**Google PubSub&lt;br /&gt;
**[[FibaroLink]]&lt;br /&gt;
**[[MQTT Push]] (there is also a [[MQTT|MQTT Gateway]] for full MQTT messages integration)&lt;br /&gt;
*[[User variables|User Variables]] used in Event scripts or Hardware gateways&lt;br /&gt;
*Plans&lt;br /&gt;
**[[Floorplans|Roomplans / Floorplans]]&lt;br /&gt;
**[[Timer Plan|Timer plans]]&lt;br /&gt;
*[[User Management|Edit Users]] (also for [[Setting up Device sharing|Device sharing]])&lt;br /&gt;
*[[Custom icons for webinterface|Custom Icons]]&lt;br /&gt;
*[[Software update|Check for Update]]&lt;br /&gt;
*[[Security#Security Panel|Security panel]] to use Domoticz as an [[Alarm Setup|alarm system]].&lt;br /&gt;
*Restart/Shutdown system (= the complete computer, not only Domoticz!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Remote Access==&lt;br /&gt;
To enable remote access from outside your local network there are various options. Please note that remote access will need extra attention for security (see next topic)&lt;br /&gt;
&lt;br /&gt;
*Port forwarding (not secure), consult your network router manual to forwarding/NAT a port to your system.&lt;br /&gt;
*[[Installing a PPTP-VPN server on a Raspberry Pi|VPN]]&lt;br /&gt;
*[[WebServer Proxy|Webserver (Reverse) Proxy]]&lt;br /&gt;
*Secure tunnels like [https://ngrok.com/product ngrok] or [https://www.realvnc.com/en/ RealVNC]&lt;br /&gt;
*By [[Remote Control of Domoticz by Telegram Bot|Telegram Bot]]&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
Once Domoticz is installed and it is accessible from outside your local network it&#039;s a good idea to secure it.  &lt;br /&gt;
&lt;br /&gt;
You can secure your Domoticz installation in numerous ways, from setting a [[Application Settings|password]] to enabling encrypted communication. &lt;br /&gt;
&lt;br /&gt;
As a start read the wiki page [[Security]] &lt;br /&gt;
&lt;br /&gt;
Examples for further security measures are:&lt;br /&gt;
&lt;br /&gt;
*Setup [[User Management|User management]]&lt;br /&gt;
*[[Secure Remote Access]]&lt;br /&gt;
*[[Automated banning of IP that fails to login multiple times]] - Using &#039;fail2ban&#039; to make your system more secure.&lt;br /&gt;
*[[Native HTTPS / SSL support]]&lt;br /&gt;
*[[Native secure access with Lets Encrypt]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Log File&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you experience strange behaviour of Domoticz please check the log file of Domoticz. It can be viewed trough the Domoticz user interface with menu &#039;&#039;&#039;Setup - Log&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can filter on Status and Errors and also on text strings (ie to only view log entries of a specific device). Use &amp;quot;!&amp;quot; to filter out specific terms, eg !ZwaveJS to filter out all log lines with value &amp;quot;ZwaveJS&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The red cross top right after filter field is to clear the web log file.&lt;br /&gt;
&lt;br /&gt;
The log file in the Domoticz window shows max 300 lines. You can enable a local log file on the file system with [[Command line parameters]] to see all logging but be aware that this can become a large file.&lt;br /&gt;
&lt;br /&gt;
On your linux system you can find the log file in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; or as specified in the file &amp;lt;code&amp;gt;/etc/init.d/domoticz.sh&amp;lt;/code&amp;gt; See for instructions wiki page [[Troubleshooting#Activate%20logging%20to%20OS-file%20.28with%20or%20without%20debugging.29|Troubleshooting#Activate logging to OS-file with or without debugging]]&lt;br /&gt;
&lt;br /&gt;
The log level of hardware can be set on the hardware page: [[Hardware Setup#Update Hardware Gateway]]&lt;br /&gt;
&lt;br /&gt;
For more troubleshooting tips see the wiki page [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[File:SetupLog.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lost password&#039;&#039;&#039; If you have forgotten your  password of the website protection follow the procedure [[Lost Username Password|Lost username/password]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more Domoticz troubleshooting hints see page [[Troubleshooting|Troubleshooting.]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Customization| Customization]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Energy_dashboard&amp;diff=19208</id>
		<title>Energy dashboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Energy_dashboard&amp;diff=19208"/>
		<updated>2026-06-04T17:42:01Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;From menu &#039;&#039;&#039;Setup -&amp;gt; Energy Dashboard&#039;&#039;&#039; you are able to view your energy flows in your house.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
To configure the Dashboard, go to menu &#039;&#039;&#039;Setup -&amp;gt; Settings&#039;&#039;&#039;, tab &#039;&#039;&#039;Energy Dashboard&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There you can enable the devices you have available in your house and in Domoticz.&lt;br /&gt;
&lt;br /&gt;
Normally the energy devices should be of type P1 Smart meter or Counter so be sure you have them available in Domoticz. For other Energy dashboard values other device types are also possible (eg Custom Sensor).&lt;br /&gt;
&lt;br /&gt;
The drop down will only show the available devices for the selected value.&lt;br /&gt;
&lt;br /&gt;
Minimum a P1/Grid meter device is needed to show the energy needs in you home. The P1/Grid device should be a Domoticz P1 smart meter device or a Domoticz General kWh device.&lt;br /&gt;
&lt;br /&gt;
There are several options available: &lt;br /&gt;
&lt;br /&gt;
*Display server time&lt;br /&gt;
*the flow line behavior (dashed or dots)&lt;br /&gt;
*Use of custom device icons instead of the default icons&lt;br /&gt;
*Select Custom devices that can be used to show consumption of specific devices (eg water boiler, Electric car,  washing machine). These devices will be connected to your home.&lt;br /&gt;
**Custom Widget: Select the Domoticz device to be used&lt;br /&gt;
**Field: Select the data field of that device to be shown.&lt;br /&gt;
**Icon: Select an Icon to be displayed with this custom device.&lt;br /&gt;
&lt;br /&gt;
[[File:Settings Energy Dashboard.png|none|frame]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For latest information, questions and tips and tricks how to combine for example multiple solar inverters in a script check forum topic https://forum.domoticz.com/viewtopic.php?t=42405&lt;br /&gt;
&lt;br /&gt;
===Real time Cost calculation===&lt;br /&gt;
For real time Energy cost calculations enable the prices in menu Setup -&amp;gt; Settings, tab Meter/Counters, section (Dynamic) Price calculation&lt;br /&gt;
&lt;br /&gt;
See also wiki page [[Application Settings#.28Dynamic.29 Price calculation|Setup Settings]]&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:EnergyDashboard1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19207</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Plugins&amp;diff=19207"/>
		<updated>2026-05-25T09:37:19Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Python Plugins List===&lt;br /&gt;
&lt;br /&gt;
This list in maintained by the community. If you have created a plugin please request a Wiki account by sending a private message (PM) to forum user &#039;&#039;&#039;gizmocuz&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Go to the link for installation and usage instructions. Also go to the Forum, [https://www.domoticz.com/forum/viewforum.php?f=65 section Python] to see more plugins.&lt;br /&gt;
&lt;br /&gt;
Before installing a plugin visit page [[Using_Python_plugins]] for some prerequisites that have to be fullfilled.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is a Python Plugin named as &amp;quot;Python plugin Manager (PP-Manager)&amp;quot; that can be used to install other plugins.&amp;lt;br&amp;gt;Still the plugin prerequisites (if any) should be installed manually. Domoticz restart required after every plugin installation. Most plugins run on all platforms supported by Domoticz but the PP-Manager itself currently is only for Debian Based Installations (Linux,Raspberry Pi). To use a plugin on a non-Debian platform follow the manual install instructions for the individual plugin itself&lt;br /&gt;
*Note 2: A second plugin manager (Domoticz Plugin Manager) is created with an extra User interface to select the plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Plugin Name&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Legacy Plugin Name/Remark&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Forum Link&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Github Link&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Python Plugin Manager(Linux Only)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.domoticz.com wiki Python_Plugin_Manager |https://github.com/ycahome/pp-manager&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Plugin Manager&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/stas-demydiuk/domoticz-plugins-manager&lt;br /&gt;
|-&lt;br /&gt;
|AirPurifier&lt;br /&gt;
|Xiaomi AirPurifier 2/2S and Pro&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-AirPurifier&lt;br /&gt;
|-&lt;br /&gt;
|Airsend&lt;br /&gt;
|for AirSend (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;) devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39590 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-airsend-plugin/&lt;br /&gt;
|-&lt;br /&gt;
|Airzone&lt;br /&gt;
|Manage AirZone system via local REST API (No Cloud)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Elwinmage/AirZone&lt;br /&gt;
|-&lt;br /&gt;
|Alarm System&lt;br /&gt;
|Ccreate an Alarm System in Domoticz&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Beastie971/Domoticz-Alarm&lt;br /&gt;
|-&lt;br /&gt;
|alphaESS Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/AntoineVDH/alphaESS-battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Android TV&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/domo-androidtv&lt;br /&gt;
|-&lt;br /&gt;
|APC UPS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-apc-ups-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Atrea&lt;br /&gt;
|Atrea ventilation with heat recuperation&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/atrea&lt;br /&gt;
|-&lt;br /&gt;
|AWTRIX3&lt;br /&gt;
|AWTRIX3 Smart Pixel Clock&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42930 Link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-AWTRIX3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Balboa Spa&lt;br /&gt;
|Balboa Spa Hot Tub.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/Balboa-Spa-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Battery monitoring for Z-Wave nodes&lt;br /&gt;
|ZWave Devices Battery Monitoring&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/BatteryLevel.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Beacon Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-bt-presence |https://github.com/mrin/domoticz-bt-presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth Presence&lt;br /&gt;
|detect if a given bluetooth MAC address is within reach&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Bluetooth-Presence&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth MAC Ping&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-bluetooth-ping |https://github.com/heggink/domoticz-bluetooth-ping&lt;br /&gt;
|-&lt;br /&gt;
|Bluetti&lt;br /&gt;
|Bluetti power stations via Bluetooth&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?f=65&amp;amp;t=43783 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-Bluetti-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|BMW Connected Drive&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-BMW-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Bosch EasyControl&lt;br /&gt;
|Bosch Easycontrol CT200 Thermostat&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=298944 link]&lt;br /&gt;
|https://github.com/ggraat/domoticz-easycontrol-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Botvac (Neato) Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gilmrt/Domoticz-Botvac-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Brel Home Hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/superjunky/Domoticz-Brel-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink IR Remote&lt;br /&gt;
|Broadlink MP1 / A1 / SP1-2-3 / RM2-3 Pro &amp;amp; mini / RM4 Pro &amp;amp; mini&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=33223 Link]&lt;br /&gt;
|https://github.com/zak-45/Broadlink-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Broadlink Universal IR Remote Controller&lt;br /&gt;
|Broadlink RM2 Pro/Plus, RM Mini3&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Broadlink-RM2-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Buienradar.nl (Weather lookup)&lt;br /&gt;
|Buienradar Weather Lookup&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ffes domoticz-buienradar |https://github.com/ffes/domoticz-buienradar&lt;br /&gt;
|-&lt;br /&gt;
|Climacell Weather and Air quality&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/afer92/domotiz-plugin-climacellV4&lt;br /&gt;
|-&lt;br /&gt;
|Creasol DomBus&lt;br /&gt;
|Modules designed for Domoticz with analog and digital inputs, pulsed counters, NTC temperature inputs, relays outputs, temperature humidity and touch sensors. Also, EVSE module for EV charging and one dual axis sun tracker controller.&lt;br /&gt;
|[https://www.creasol.it/domotics link]&lt;br /&gt;
|https://github.com/CreasolTech/CreasolDomBus&lt;br /&gt;
|-&lt;br /&gt;
|Crow Runner Alarm&lt;br /&gt;
|Crow/AAP Alarm IP Module&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzCrowAlarm |https://github.com/febalci/DomoticzCrowAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Cupra cars&lt;br /&gt;
|Cupra EV cars&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-cupra-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Dahua VTO Dz&lt;br /&gt;
|Dahua VTO doorbell&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/rbrouwer/dahua-vto-dz&lt;br /&gt;
|-&lt;br /&gt;
|Daikin Airconditioning (BRP069A42)&lt;br /&gt;
|Daikin BRP069A42 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;[https: / github.com leejoow domoticz_daikin_BRP069A42 |https://github.com/leejoow/domoticz_daikin_BRP069A42&lt;br /&gt;
|-&lt;br /&gt;
|DDS238 ZN/S energy meter&lt;br /&gt;
|Modbus RTU (serial port): 1 or more devices can be attached to the same RS485 bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-dds238&lt;br /&gt;
|-&lt;br /&gt;
|DDS238-2 ZN/S Modbus over TCP&lt;br /&gt;
|Hikking and compatible&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36335 link]&lt;br /&gt;
|https://github.com/xbeaudouin/domoticz-ds238-modbus-tcp&lt;br /&gt;
|-&lt;br /&gt;
|DTS238-7-modbus&lt;br /&gt;
|DS238-7 3 phase electric power meter with RS485 modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/DDS238-7-modbus&lt;br /&gt;
|-&lt;br /&gt;
|deCONZ bridge (For Conbee,Raspbee)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Smanar Domoticz-deCONZ |https://github.com/Smanar/Domoticz-deCONZ&lt;br /&gt;
|-&lt;br /&gt;
|Denon/Marantz Amplifier&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Denon-Plugin |https://github.com/dnpwwo/Domoticz-Denon-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DevmelAirSend&lt;br /&gt;
|AirSend and Airsend Duo (&amp;lt;nowiki&amp;gt;https://devmel.com/&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ultrasuperpingu/DomoticzDevmelAirsend&lt;br /&gt;
|-&lt;br /&gt;
|Dexcom Share API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/MSe-5-14/Domoticz-Dexcom-API/&lt;br /&gt;
|-&lt;br /&gt;
|Dingtian Relay&lt;br /&gt;
|Dingtian Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dtlzp/Domoticz-Dingtian-Relay-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|domoticz-storm-report (burze.dzis.net)&lt;br /&gt;
|Storm Reporting (Europe)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lrybak domoticz-storm-report |https://github.com/lrybak/domoticz-storm-report&lt;br /&gt;
|-&lt;br /&gt;
|DSC EnvisaLink&lt;br /&gt;
|DSC EnvisaLink Alarm Interface&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-DSCEnvisalink-Plugin |https://github.com/dnpwwo/Domoticz-DSCEnvisalink-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|DWD WeatherAlarm&lt;br /&gt;
|German weather alarm&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-DWDWeatherAlarm&lt;br /&gt;
|-&lt;br /&gt;
|Dyson Pure Link&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JanJaapKo/DysonPureLink&lt;br /&gt;
|-&lt;br /&gt;
|ebusd bridge&lt;br /&gt;
|for  e.g. Vaillant and Saunier-Duval boilers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzEbusd |https://github.com/guillaumezin/DomoticzEbusd&lt;br /&gt;
|-&lt;br /&gt;
|Elprisetjustnu&lt;br /&gt;
|fetch Swedish energy prices from Elpriset just nu.se&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/sweden_energyprice&lt;br /&gt;
|-&lt;br /&gt;
|Emmeti Mirai SMI heat pump&lt;br /&gt;
|Manages main parameter for Emmeti heat pumps&lt;br /&gt;
|[https://www.creasol.it/en/support/domotics-home-automation-and-diy/controlling-heat-pump-to-maximize-power-consumption-from-photovoltaic link]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-emmeti-mirai&lt;br /&gt;
|-&lt;br /&gt;
|EMS bus Wi-Fi Gateway (EMS-ESP/Nefit/Proddy)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bbqkees/ems-esp-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Enigma2&lt;br /&gt;
|to control Enigma2 tuner&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=21047 link]&lt;br /&gt;
|https://github.com/kofec/Domoticz-Enigma2&lt;br /&gt;
|-&lt;br /&gt;
|eQ-3 MAX!&lt;br /&gt;
|ELV/EQ-3 MAX! Python plugin&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvzut/maxcube-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|ESP8266 Milight hub&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etsach/espmilighthub-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|EspNow Serial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-espnowserial-plugin&lt;br /&gt;
|-&lt;br /&gt;
|EVCC-IO&lt;br /&gt;
|monitor and control your EV charging setup via EVCC&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-EVCC-IO-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ewpe Smart Air Conditioners via MQTT&lt;br /&gt;
|(Gree Smart/TOSOT)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-ewpe-smart-mqtt-plugin |https://github.com/stas-demydiuk/domoticz-ewpe-smart-mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Freebox&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com supermat PluginDomoticzFreebox |https://github.com/supermat/PluginDomoticzFreebox&lt;br /&gt;
|-&lt;br /&gt;
|Frisquet-Connect&lt;br /&gt;
|For Frisquet Connect Boiler control&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44201 link]&lt;br /&gt;
|https://github.com/Krakinou/FrisquetConnectDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|Fritz Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/belzetrigger/domoticz-FritzPresence&lt;br /&gt;
|-&lt;br /&gt;
|FroniusHTTP&lt;br /&gt;
|Fronius Solar inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/froniusHttp&lt;br /&gt;
|-&lt;br /&gt;
|Fujitsu-AC&lt;br /&gt;
|Fujitsu Airconditioning&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36402 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Fujitsu-AC&lt;br /&gt;
|-&lt;br /&gt;
|GlobalCache GC-100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/dnpwwo/Domoticz-GlobalCache-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe solar inverter via SEMS API&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dylian94 domoticz-GoodWeSEMS |&amp;lt;s&amp;gt;https://github.com/dylian94/domoticz-GoodWeSEMS&amp;lt;/s&amp;gt;&lt;br /&gt;
https://github.com/janjaapko/domoticz-GoodWeSEMS&lt;br /&gt;
|-&lt;br /&gt;
|GoodWe Modbus UDP&lt;br /&gt;
|GoodWe inverters over LAN or WLAN via UDP that supports Modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/remco-k/domoticz-goodwe-modbusudp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Goodwe RS485&lt;br /&gt;
|Goodwe Solar Inverters via RS485/modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nijmeijer/goodwe_rs485_domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Google Home &amp;amp; Chromecast&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Google-Plugin |https://github.com/dnpwwo/Domoticz-Google-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Google Nest and Protect&lt;br /&gt;
|Nest thermostats and Nest Protect devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-NEST-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Govee&lt;br /&gt;
|Govee lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=39875 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Govee-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Growatt Inverter&lt;br /&gt;
|Growatt Inverter via APP Webservice&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Growatt-Webserver-Plugin |https://github.com/sincze/Domoticz-Growatt-Webserver-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|GPSLogger&lt;br /&gt;
|Location and presence detection&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=42045 link]&lt;br /&gt;
|https://github.com/TurnOfAFriendlyCard/Domoticz-GPSLogger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|H801 LED WiFi controller Plugin&lt;br /&gt;
|H801 LED WiFi controller with Tasmota firmware&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com stas-demydiuk domoticz-h801-tasmota-plugin |https://github.com/stas-demydiuk/domoticz-h801-tasmota-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Hewalex&lt;br /&gt;
|Hewalex heat and solar pumps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-Hewalex&lt;br /&gt;
|-&lt;br /&gt;
|Hive Plugin&lt;br /&gt;
|Hive Active Heating&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com imcfarla2003 domoticz-hive |https://github.com/imcfarla2003/domoticz-hive&lt;br /&gt;
|-&lt;br /&gt;
|Home Connect&lt;br /&gt;
|Bosch/Siemens/Neff/Balay appliances&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/domoticz/home-connect&lt;br /&gt;
|-&lt;br /&gt;
|Homewizard&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com rvdvoorde domoticz-homewizard |https://github.com/rvdvoorde/domoticz-homewizard&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Battery&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/etmmvdp/HomeWizard-Battery-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi P1 Meter&lt;br /&gt;
|HomeWizard Wifi P1 meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-p1-plugin&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Watermeter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Watermeter&lt;br /&gt;
|-&lt;br /&gt;
|HomeWizard Wifi Energy Socket&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Eraser3/HomeWizard-Wifi-Energy-Socket&lt;br /&gt;
|-&lt;br /&gt;
|HomekitInsecureClient&lt;br /&gt;
|control Homekit Insecure Clients from Domoticz&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36148 link]&lt;br /&gt;
|https://github.com/macjl/Domoticz-HomekitInsecureClient&lt;br /&gt;
|-&lt;br /&gt;
|Hosola / Omnik solar inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz tree master plugin hosola |https://github.com/ericstaal/domoticz/tree/master/plugin/hosola&lt;br /&gt;
|-&lt;br /&gt;
|Husqvarna automower&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39624 link]&lt;br /&gt;
|https://github.com/FilipDem/Domoticz-Husqvarna-Automower-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Huawei-Inverter&lt;br /&gt;
|Huawei-Inverter over Modbus TCP&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43064 link]&lt;br /&gt;
|https://github.com/JWGracht/Domoticz-Huawei-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Hyperion&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ericstaal domoticz blob master plugin hyperion |https://github.com/ericstaal/domoticz/blob/master/plugin/hyperion&lt;br /&gt;
|-&lt;br /&gt;
|Hyundai Kia connect&lt;br /&gt;
|Monitor and control connected cars by Hyunday and Kia&lt;br /&gt;
|[[Vehicles Hyundai Kia|link]]&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-hyundai-kia&lt;br /&gt;
|-&lt;br /&gt;
|iCloud device locator&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-icloud |https://github.com/heggink/domoticz-icloud&lt;br /&gt;
|-&lt;br /&gt;
|iDetect Presence detection&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/d-EScape/Domoticz_iDetect&lt;br /&gt;
|-&lt;br /&gt;
|IHC (Intelligent House Control)&lt;br /&gt;
|Schneider / LK IHC (all generations)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=42531 link]&lt;br /&gt;
|https://github.com/kjlisby/domoticz-ihc-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IKEA Tradfri&lt;br /&gt;
|Trådfri Gateway (Ikea)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com moroen IKEA-Tradfri-plugin |https://github.com/moroen/IKEA-Tradfri-plugin&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox / IntesisHome&lt;br /&gt;
|IntesisBox WMP-1 Protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/luismalddonado/IntesishomewithDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|IOplus relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.ioplus&lt;br /&gt;
|-&lt;br /&gt;
|IR Climate Controller&lt;br /&gt;
|Tasmota IR climate controller integration&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43979 link]&lt;br /&gt;
|https://github.com/szelessavalapitvany/domoticz-ir-climate-controller&lt;br /&gt;
|-&lt;br /&gt;
|Itho Wifi&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=35383 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Itho-Wifi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kesser&lt;br /&gt;
|For Clima/ of brand Kesser with WiFi Tuya&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jmichault/kesser&lt;br /&gt;
|-&lt;br /&gt;
|Jablotron SIA Alarm&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/andyboeh/domoticz-jablotron&lt;br /&gt;
|-&lt;br /&gt;
|KinCony KC868 Smart Controller&lt;br /&gt;
|KC868 Wifi Relay Controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/hzkincony/Domoticz-KinCony-KC868-Ethernet-WiFi-Relay-Module-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|KNMI weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-KNMI-Weather-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Kodi Players&lt;br /&gt;
|Kodi&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Kodi-Plugin |https://github.com/dnpwwo/Domoticz-Kodi-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ledenet / Ufolight RGB controller&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ericstaal/domoticz/tree/master/plugin/ledenet&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V1&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/olinek2/LGAC_SmartT&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=26940 link]&lt;br /&gt;
|https://github.com/majki09/domoticz_lg_thinq_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LG Smart AC (SmartThinQ)&lt;br /&gt;
|LG Smart AC devices Api V2 using Personal Access Token (PAT)&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44600 link]&lt;br /&gt;
|https://github.com/avriessen/domoticz_lg_thinqconnect_plugin&lt;br /&gt;
|-&lt;br /&gt;
|LGTV WebOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/GameDevHobby/Domoticz-LGTV-WebOS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence&amp;lt;/s&amp;gt;&lt;br /&gt;
|&amp;lt;s&amp;gt;Life 360 Presence Detection&amp;lt;/s&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzLife360 |No longer available, use GPSLogger plugin&lt;br /&gt;
|-&lt;br /&gt;
|Linky&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com guillaumezin DomoticzLinky |https://github.com/guillaumezin/DomoticzLinky&lt;br /&gt;
|-&lt;br /&gt;
|LinkyStdMode&lt;br /&gt;
|Linky Standard mode&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bnj-04/LinkyStdMode&lt;br /&gt;
|-&lt;br /&gt;
|Link-Tap&lt;br /&gt;
|Link-Tap watering timer&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/DebugBill/Link-Tap&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronic2&lt;br /&gt;
|Heatpump controller (AlphaInnotec)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=282425#p282425 link]&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-luxtronic2&lt;br /&gt;
|-&lt;br /&gt;
|Luxtronik&lt;br /&gt;
|Luxtronik Heat Pump Controller&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44176 link]&lt;br /&gt;
|https://github.com/Rouzax/luxtronik-domoticz-plugin-v2&lt;br /&gt;
|-&lt;br /&gt;
|Lyrion Music Server&lt;br /&gt;
|formaly known as Logitech Media Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329633 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_Lyrion&lt;br /&gt;
|-&lt;br /&gt;
|Mattericz&lt;br /&gt;
|Matter integraion with Open Home Foundation Matter Server&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=332498#p332498 link]&lt;br /&gt;
|https://github.com/fleinze/Mattericz&lt;br /&gt;
|-&lt;br /&gt;
|MBusSerial&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/MBusSerial&lt;br /&gt;
|-&lt;br /&gt;
|MegaIO relay board&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/josefpavlik/domoticz.plugin.megaio&lt;br /&gt;
|-&lt;br /&gt;
|MELCloud&lt;br /&gt;
|Control Mitsubishi AC&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/gysmo38/domoticz-python-melcloud&lt;br /&gt;
|-&lt;br /&gt;
|Meteo Alarm EU RSS Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MeteoAlarmEU |https://github.com/ycahome/MeteoAlarmEU&lt;br /&gt;
|-&lt;br /&gt;
|Midea Dehum&lt;br /&gt;
|Midea Dehumidifier&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/meaninglessvanity/midea_dehum_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mikrotik RouterOS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-routeros-plugin |https://github.com/mrin/domoticz-routeros-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Mitsubishi AC MQTT interface&lt;br /&gt;
|AC control with Swicago&#039;s serial and MQTT interface&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/Masurov/Domoticz-MitsubishiHpMQTT-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Modbus RTU / ASCII / TCP/IP&lt;br /&gt;
|&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=21297 Link]&lt;br /&gt;
|https://github.com/DomoticX/domoticz-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Moon Phases&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome MoonPhases |https://github.com/ycahome/MoonPhases&lt;br /&gt;
|-&lt;br /&gt;
|Moonraker&lt;br /&gt;
|Moonraker/Klipper 3D-printers&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43869 Link]&lt;br /&gt;
|https://github.com/klym-tatarnikov/MoonrakerDomoticz/&lt;br /&gt;
|-&lt;br /&gt;
|Motherboard PSUtil Sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPsutil |https://github.com/febalci/DomoticzPsutil&lt;br /&gt;
|-&lt;br /&gt;
|MQTT discovery&lt;br /&gt;
|MQTT Discovery plugin with Sonoff-Tasmota extensions&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=21918 link]&lt;br /&gt;
| [https: / github.com emontnemery domoticz_mqtt_discovery |https://github.com/emontnemery/domoticz_mqtt_discovery&lt;br /&gt;
|-&lt;br /&gt;
|MQTT Mapper&lt;br /&gt;
|Map MQTT messages to Domoticz devices&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=39279 link]&lt;br /&gt;
|https://github.com/FlyingDomotic/domoticz-mqttmapper-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Myenergi&lt;br /&gt;
|Myenergi Zappi EV charger&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mvdklip/Domoticz-myenergi&lt;br /&gt;
|-&lt;br /&gt;
|NIBE Uplink&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/NIBEUplink-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Niko Home Control&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tnys/nikohomecontrol-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Nissan Leaf&lt;br /&gt;
|EV&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=36634 link]&lt;br /&gt;
|https://github.com/BreizhCat/DomoticzNissanLeaf&lt;br /&gt;
|-&lt;br /&gt;
|NUKI Locks&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com heggink domoticz-nuki |https://github.com/heggink/domoticz-nuki&lt;br /&gt;
|-&lt;br /&gt;
|N8N&lt;br /&gt;
|Integrate N8N workflow AI automations directly into Domoticz.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/galadril/Domoticz-N8N-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OctoPrint&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jneilliii/OctoPrint-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Omnik Inverter Local&lt;br /&gt;
|Omnik Inverter via Local device&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sincze/Domoticz-Omnik-Local-Web-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OM-310 Power Limiter &lt;br /&gt;
|OM-310 Power Limiter (Novatek-Elektro) over Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/tmrealive/OM310-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Onkyo AV Receiver&lt;br /&gt;
|Onkyo receivers&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com jorgh6 domoticz-onkyo-plugin |https://github.com/jorgh6/domoticz-onkyo-plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenAQ&lt;br /&gt;
|Air Quality&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=22092 link]&lt;br /&gt;
|https://github.com/waltervl/Domoticz-OpenAQ-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenEVSEPlugin&lt;br /&gt;
|OpenEVSE mqtt&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ayasystems/OpenEVSEPlugin&lt;br /&gt;
|-&lt;br /&gt;
|OpenDTU&lt;br /&gt;
|collects solar production data from an OpenDTU unit without requiring MQTT&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-OpenDTU-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Ouman-C203-Modbus&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawelmuszynski/domoticz-Ouman-C203-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|IntesisBox-Panasonic&lt;br /&gt;
|IntesisBox Panasonic-Tcap over modbus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/IntesisBox-Panasonic-Tcap-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Panasonic Cloud Comfort&lt;br /&gt;
|Panasonic Cloud Comfort through CZ-TACG1 WiFi adapter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sdamasoc/domoticz_panasonic_CZ-TACG1/&lt;br /&gt;
|-&lt;br /&gt;
|Paradox Alarm PRT3 serial interface&lt;br /&gt;
|Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com Masurov Domoticz-ParadoxPrt3-Plugin |https://github.com/Masurov/Domoticz-ParadoxPrt3-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Parrot Flower Power &amp;amp; Pot plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com tazounet parrot_flower_plugin |https://github.com/tazounet/parrot_flower_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pi Clock Speeds&lt;br /&gt;
|Reimplements clockspeeds (after removal from 2024.1)&lt;br /&gt;
|&lt;br /&gt;
|[https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin https://github.com/akamming/Domoticz_pi_Clockspeeds_Plugin: Domoticz_pi_clockspeeds_plugin]&lt;br /&gt;
|-&lt;br /&gt;
|RPI GPIO&lt;br /&gt;
|Universal GPIO control plugin for Domoticz on Raspberry Pi.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mibeus/Domoticz-GPIO-Debian-13&lt;br /&gt;
|-&lt;br /&gt;
|Pinger (ICMP)&lt;br /&gt;
|Pinger&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-Pinger-Plugin |https://github.com/dnpwwo/Domoticz-Pinger-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Pioneer AVR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com febalci DomoticzPioneerAVR |https://github.com/febalci/DomoticzPioneerAVR&lt;br /&gt;
|-&lt;br /&gt;
|Powerview&lt;br /&gt;
|Hunter Douglas shades&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-powerview-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Powerworld&lt;br /&gt;
|PowerWorld R290 heat pumps by modbus connection&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Mike19700/domoticz-PowerWorld-heat-pump&lt;br /&gt;
|-&lt;br /&gt;
|pyViCare&lt;br /&gt;
|Viessmann API for eg Vitovalor PT2&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/wimmme/pyViCare-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-004T&lt;br /&gt;
|PZEM-004T energy meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mce35/Domoticz-PZEM-004T&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-016&lt;br /&gt;
|PZEM-016, PZEM-014 and PZEM-004T energy meters: supports up to 51 meters on the same bus&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/CreasolTech/domoticz-pzem-016&lt;br /&gt;
|-&lt;br /&gt;
|PZEM-017 Modbus&lt;br /&gt;
|PZEM Energy Monitor&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mar-svo/PZEM-017&lt;br /&gt;
|-&lt;br /&gt;
|RAVEn Zigbee energy monitor&lt;br /&gt;
|RAVEn Power Monitor&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com dnpwwo Domoticz-RAVEn-Plugin |https://github.com/dnpwwo/Domoticz-RAVEn-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Remeha Home&lt;br /&gt;
|Remeha thermostats&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=310952#p310952 link]&lt;br /&gt;
|https://github.com/tuk90/RemehaHome-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Renault EV&lt;br /&gt;
|for the My Renault API&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40788 Link]&lt;br /&gt;
|https://github.com/HomeACcessoryKid/Domoticz-Renault-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Renault-Dacia&lt;br /&gt;
|Renault Dacia Electric Vehicle&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Kask29/Domoticz-Renault-Dacia-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Reolink&lt;br /&gt;
|Reolink Cameras Doorbells&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/j-b-n/domoticz_reolink&lt;br /&gt;
|-&lt;br /&gt;
|Resol-VBUS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/bramvreugd/Domoticz-Resol-VBUS-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|RFSwitches&lt;br /&gt;
|RF 433 Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie 433Switches |https://github.com/flatsiedatsie/433Switches&lt;br /&gt;
|-&lt;br /&gt;
|Rooted Toon&lt;br /&gt;
|rooted Toon thermostat&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=296916#p296916 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_toon&lt;br /&gt;
|-&lt;br /&gt;
|Qlima Wifi airconditioner&lt;br /&gt;
|Midea/Inventor AC Clone&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/awalsum/Qlima&lt;br /&gt;
|-&lt;br /&gt;
|Quatt&lt;br /&gt;
|Quatt Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40463 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Quatt-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SAIC iSmart&lt;br /&gt;
|MG EV Cars&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43909 link]&lt;br /&gt;
|https://github.com/lemassykoi/Domoticz-MG-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Samsung SmartThings Washer&lt;br /&gt;
|Retrieve and display the status of a Samsung washing machine via the SmartThings Cloud API.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/csutihu/Domoticz-plugin-for-samsung-washing-machine&lt;br /&gt;
|-&lt;br /&gt;
|SDM120-Modbus&lt;br /&gt;
|Eastron SDM120-Modbus RTU Single Phase kWh Meter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/simat-git/SDM120-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|SDM630-Modbus&lt;br /&gt;
|Eastron SDM-72 SDM-72v2 SDM-120 SDM-230 SDM-630 kWh meters&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gizmocuz/SDM630-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Sessy Battery&lt;br /&gt;
|&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42865 link]&lt;br /&gt;
|https://github.com/JanJaapKo/SessyBattery&lt;br /&gt;
|-&lt;br /&gt;
|Shelly Cloud&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mario-peters/ShellyCloudPlugin&lt;br /&gt;
|-&lt;br /&gt;
|Shelly MQTT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/enesbcs/Shelly_MQTT&lt;br /&gt;
|-&lt;br /&gt;
|Shelly1 with temp sensors&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Shelly_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|SMA Inverters&lt;br /&gt;
|SMA Solar Inverters using Modbus TCP/IP&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=31457 link]&lt;br /&gt;
|https://github.com/derenback/Domoticz-SMA-Inverter&lt;br /&gt;
|-&lt;br /&gt;
|Smart Virtual Thermostat&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/Smart_Virtual_Thermostat.html]]&lt;br /&gt;
|-&lt;br /&gt;
|SNMP Reader&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome SNMPreader |https://github.com/ycahome/SNMPreader&lt;br /&gt;
|-&lt;br /&gt;
|Snapcast&lt;br /&gt;
|Snapcast integration (control volume/muting of snapcast clients)&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=38724 link]&lt;br /&gt;
|https://github.com/akamming/domoticz-snapcast&lt;br /&gt;
|-&lt;br /&gt;
|SolarEdge Modbus TCP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/addiejanssen/domoticz-solaredge-modbustcp-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Solax Inverter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/syrhus/solax_inverter&lt;br /&gt;
|-&lt;br /&gt;
|Somfy&lt;br /&gt;
|Somfy Tahoma / Connexoon&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=294003#p294003 link]&lt;br /&gt;
|https://github.com/MadPatrick/domoticz_somfy&lt;br /&gt;
|-&lt;br /&gt;
|Sonos&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/gerard33/sonos&lt;br /&gt;
|-&lt;br /&gt;
|Sony Bravia TV (with Kodi remote)&lt;br /&gt;
|Sony Bravia TV&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com gerard33 sony-bravia |https://github.com/gerard33/sony-bravia&lt;br /&gt;
|-&lt;br /&gt;
|SPRSUN-Modbus&lt;br /&gt;
|SPRSUN-Modbus Heat Pump&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=41133 link]&lt;br /&gt;
|https://github.com/Sateetje/SPRSUN-Modbus&lt;br /&gt;
|-&lt;br /&gt;
|Steam status&lt;br /&gt;
|monitor your Steam status &lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=43033 link]&lt;br /&gt;
|https://github.com/galadril/Domoticz-Steam-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Stromer EBikes&lt;br /&gt;
|&lt;br /&gt;
|Link&lt;br /&gt;
|https://github.com/elnkosc/stromer_domoticz_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Synology SurveillanceStation&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lolautruche SurveillanceStationDomoticz |https://github.com/lolautruche/SurveillanceStationDomoticz&lt;br /&gt;
|-&lt;br /&gt;
|SYSFS-Switches&lt;br /&gt;
|GPIO SYSFS Switches&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com flatsiedatsie GPIO-SYSFS-Switches |https://github.com/flatsiedatsie/GPIO-SYSFS-Switches&lt;br /&gt;
|-&lt;br /&gt;
|Tapo TP-Link&lt;br /&gt;
|Tapo P100 and Tapo P110 smart plug&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Chouteau49/Domoticz_Tapo_TP-Link&lt;br /&gt;
|-&lt;br /&gt;
|Tasmoticz&lt;br /&gt;
|autodetecting ESP8266 devices with Tasmota firmware&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=29114 link]&lt;br /&gt;
|https://github.com/joba-1/Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tesy Modeco Boiler&lt;br /&gt;
|Supports local API for Tesy Modeco boilers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/heggink/domoticz-tesy&lt;br /&gt;
|-&lt;br /&gt;
|Thermostat weekly Timer&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ArtBern/Scheduler&lt;br /&gt;
|-&lt;br /&gt;
|Thermostate&lt;br /&gt;
|ESP thermostat with weather dependent heating control&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ThesslaGreen&lt;br /&gt;
|ThesslaGreen recuperators with RS485 modbus interface&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?p=294570 link]&lt;br /&gt;
|https://github.com/voyo/ThesslaGreen-modbus&lt;br /&gt;
|-&lt;br /&gt;
|Tibber&lt;br /&gt;
|Energy prices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/flopp999/Tibber-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|Tile&lt;br /&gt;
|collects the distance from your home to your Tile devices&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/sydspost/Domoticz-Tile-plugin&lt;br /&gt;
|-&lt;br /&gt;
|tinycontrol&lt;br /&gt;
|LAN IOT controller&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/kofec/domoticz-tinycontrol&lt;br /&gt;
|-&lt;br /&gt;
|TinyTUYA-Local&lt;br /&gt;
|Controls TUYA devices on your local network.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TinyTUYA-Local-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ToonMonitor&lt;br /&gt;
|to monitor a Toon Thermostat&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/JackV2020/Domoticz-ToonMonitor&lt;br /&gt;
|-&lt;br /&gt;
|Toyota&lt;br /&gt;
|for a Toyota car with connected services&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/joro75/Domoticz-Toyota-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link-smartplug&lt;br /&gt;
|TP-Link smartplug HS100 / HS110 / HS110v2 (european version)&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com lordzurp domoticz-tplink-smartplug |https://github.com/lordzurp/domoticz-tplink-smartplug&lt;br /&gt;
|-&lt;br /&gt;
|TP-Link Tapo plug&lt;br /&gt;
|Tp-link Tapo P100 plugs, P105 plugs and L510E bulbs (on/off)&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?f=56&amp;amp;t=32774 link]&lt;br /&gt;
|https://github.com/593304/Domoticz-Tapo&lt;br /&gt;
|-&lt;br /&gt;
|Trafikverket API Weather&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Net-time/Domoticz_Trafikverket_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Domoticz Tuya Cloud API Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/lacha07/domoticz-tuya-cloud&lt;br /&gt;
|-&lt;br /&gt;
|Tuya-Powerplug&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com sincze Domoticz-Tuya-SmartPlug-Plugin |https://github.com/sincze/Domoticz-Tuya-SmartPlug-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya Plugin&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Xenomes/Domoticz-TUYA-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Tuya&lt;br /&gt;
|Controls TUYA devices your network (mainly on/off switches and Lights)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/guino/tuyaha&lt;br /&gt;
|-&lt;br /&gt;
|PC321-TY Tuya&lt;br /&gt;
|Plugin for the Wifi version PC321-TY 3 phase power clamp&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/nlovrens/PC321_TY_tuya_local&lt;br /&gt;
|-&lt;br /&gt;
|Unifi Presence&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Wizzard72/Domoticz-Unifi-Presence&lt;br /&gt;
|-&lt;br /&gt;
|UniPi EVOK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/mccwdev/domoticz-unipi&lt;br /&gt;
|-&lt;br /&gt;
|UPS Monitor&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|[[Plugins/NUT_UPS.html]]&lt;br /&gt;
|-&lt;br /&gt;
|Venta&lt;br /&gt;
|for venta device (LPH60 WiFi App Control)&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/ajarzyn/domoticz-venta&lt;br /&gt;
|-&lt;br /&gt;
|Victron Energy&lt;br /&gt;
|Victron Energy GX&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/xbeaudouin/victron-energy-domoticz&lt;br /&gt;
|-&lt;br /&gt;
|VictronMultiplusII&lt;br /&gt;
|Victron Multiplus-II Inverter&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/pawcio50501/domoticz-VictronMultiplusII&lt;br /&gt;
|-&lt;br /&gt;
|VirtualThermostat-PID&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/worops/Domoticz-VirtualThermostat-PID&lt;br /&gt;
|-&lt;br /&gt;
|Volumio&lt;br /&gt;
|control Volumio music player&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/frepkovsky/Domoticz-Volumio-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Volvo&lt;br /&gt;
|All Volvo cars as of model year 2015&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=299165 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_VolvoRecharge_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wallbox&lt;br /&gt;
|Wallbox EV charger&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?t=40203 link]&lt;br /&gt;
|https://github.com/lokonli/domoticz-wallbox&lt;br /&gt;
|-&lt;br /&gt;
|WAN IP Checker&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com ycahome WAN-IP-CHECKER |https://github.com/ycahome/WAN-IP-CHECKER&lt;br /&gt;
|-&lt;br /&gt;
|Watermeter NPN Plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com akamming domoticz-watermeter |https://github.com/akamming/domoticz-watermeter&lt;br /&gt;
|-&lt;br /&gt;
|We-Connect&lt;br /&gt;
|Read Volkswagen ID.3 battery percentage and distance left&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=42840 link]&lt;br /&gt;
|https://github.com/Andreotti100/We-connect&lt;br /&gt;
|-&lt;br /&gt;
|Weather Dependent Heating Control&lt;br /&gt;
|OpenTherm weather dependent heating control&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=275450#p275450 link]&lt;br /&gt;
|https://github.com/akamming/Domoticz_Thermostate_Plugin&lt;br /&gt;
|-&lt;br /&gt;
|WeHeat&lt;br /&gt;
|WeHeat heatpump&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?t=44068 link]&lt;br /&gt;
|https://github.com/Tableflipper9001/weheat-domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wellbeing&lt;br /&gt;
|Electrolux / AEG Wellbeing Air Purifiers&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/jgaalen/domoticz-wellbeing-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Wiz Connected&lt;br /&gt;
|Wiz wifi lights&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=36724 link]&lt;br /&gt;
|https://github.com/sydspost/Domoticz-WiZ-connected-plugin&lt;br /&gt;
|-&lt;br /&gt;
|WU Direct&lt;br /&gt;
|WuDirect interface for Personal Weather Stations&lt;br /&gt;
|[https://domoticz.com/forum/viewtopic.php?p=276040#p276040 link]&lt;br /&gt;
|https://github.com/vaneeten/domoticz-wudirect&lt;br /&gt;
|-&lt;br /&gt;
|WT53R Rain Tank Sensor&lt;br /&gt;
|connects to a WT53R range sensor over Modbus TCP protocol&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/voyo/Domoticz_WT53R_Rain_Tank_Sensor&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Flower Mate&lt;br /&gt;
|Xiaomi Mi Flower Mates and other BT Flower mate or Flower care&lt;br /&gt;
|[https://www.domoticz.com/forum/viewtopic.php?f=65&amp;amp;t=22281 liink]&lt;br /&gt;
| [https: / github.com flatsiedatsie Mi_Flower_mate_plugin |https://github.com/flatsiedatsie/Mi_Flower_mate_plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Mi Robot Vacuum&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com mrin domoticz-mirobot-plugin |https://github.com/mrin/domoticz-mirobot-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi PM2.5 Sensor&lt;br /&gt;
|Xiaomi PM2.5 Air Quality Sensor&lt;br /&gt;
|&lt;br /&gt;
| https: / github.com febalci DomoticzXiaomiPM2.5 |https://github.com/febalci/DomoticzXiaomiPM2.5&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi Universal IR Remote Controller&lt;br /&gt;
|Xiaomi Chuangmi IR&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-Universal-IR-Remote-Controller-Domoticz-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Xiaomi MiJia Philips LED Lamp&lt;br /&gt;
|Xiaomi MiJia Philips Bulb, ZhiRui, ZhiYi, etc. LED lamps&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Whilser/Xiaomi-MiJia-Philips-LED-Lamp&lt;br /&gt;
|-&lt;br /&gt;
|Xtend&lt;br /&gt;
|plugin for collection of data from an Intergas Xtend heatpump unit.&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/WillemD61/XTEND-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Yamaha AV Receiver&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com thomas-villagers domoticz-yamaha |https://github.com/thomas-villagers/domoticz-yamaha&lt;br /&gt;
|-&lt;br /&gt;
|YI-Hack&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / github.com galadril Domoticz-Yi-Hack-Plugin |https://github.com/galadril/Domoticz-Yi-Hack-Plugin&lt;br /&gt;
|-&lt;br /&gt;
|ZigbeeforDomoticz&lt;br /&gt;
|Zigate, Zigpy, TI CC2531, CC13x2, CC26x2, SiliconLabs, deConz (ConBee, raspBee). No need of mqtt or other middleware/broker.&lt;br /&gt;
|[https://www.domoticz.com/forum/viewforum.php?f=68 link]&lt;br /&gt;
| [https: / github.com sasu-drooz Domoticz-Zigate |https://github.com/zigbeefordomoticz/Domoticz-Zigbee&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee MQTT Bridge&lt;br /&gt;
|for Tasmota Zigbee Gateway&lt;br /&gt;
|[https://forum.domoticz.com/viewtopic.php?p=329186#p329186 link]&lt;br /&gt;
|https://github.com/Mibeus/domoticz_zigbee2tasmota&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2MQTT plugin&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [https: / www.zigbee2mqtt.io |https://github.com/stas-demydiuk/domoticz-zigbee2mqtt-plugin&lt;br /&gt;
|-&lt;br /&gt;
|Zigbee2Tasmoticz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/fleinze/Zigbee2Tasmoticz&lt;br /&gt;
|-&lt;br /&gt;
|ZoneMinder&lt;br /&gt;
|video surveillance software system&lt;br /&gt;
|&lt;br /&gt;
|https://github.com/Swedlund/ZoneMinder-plugin-for-Domoticz&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$&#039;&#039;&#039;: Requires some pre-requisites to be installed. Check instructions.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;$$&#039;&#039;&#039;: Cannot be integrated. Requires nested repository pull.&lt;br /&gt;
&lt;br /&gt;
===Related Wiki Links===&lt;br /&gt;
&lt;br /&gt;
Some tips on using plugins: [[Using_Python_plugins]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Creating a Python plugin: [[Developing_a_Python_plugin]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Domoticz not finding Python on Linux: [[Linux#Problems_locating_Python]]&lt;br /&gt;
[[Category:Plugins]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19205</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19205"/>
		<updated>2026-05-18T21:47:21Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js server (https://github.com/matter-js/matterjs-server)  &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Navigate to the docker compose directory (as example) where the matter.js docker-compose.yml file is created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd docker/matterjs-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose logs -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Presence_detection&amp;diff=19204</id>
		<title>Presence detection</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Presence_detection&amp;diff=19204"/>
		<updated>2026-05-18T15:09:05Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This script will turn on a virtual switch when a device is present on your network, and turns the virtual switch off when the device is gone. You can use this to see if a person (which always carries his/her smartphone) is at home or not, and trigger events based on this.&lt;br /&gt;
&lt;br /&gt;
This Python script is available for both Linux and Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; This page originates from 2019. In the meantime the [[System Alive Checker (Ping)]] hardware has been introduced with approximately the same functionality&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Dependencies - hardware / software / operating system=&lt;br /&gt;
==Configure your router to give out static DHCP leases==&lt;br /&gt;
This script needs the device you want to check to have a static IP. You can configure the device to use a static IP, or configure your router to grant a &#039;Static DHCP lease&#039; to the device, based on the MAC-address of the device.&amp;lt;br&amp;gt; &lt;br /&gt;
This last method is the most preferred, because it doesn&#039;t involve making changes on the device, which decreases the risk of errors. Also, by configuring a static IP on your device, you could encounter trouble when connecting to a different network. &amp;lt;br&amp;gt;Read the manual of your router on how to configure a static DHCP lease.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you want to use it with an iPhone, please read this page first.&lt;br /&gt;
&lt;br /&gt;
=Domoticz Setup - creating virtual hardware dummy and virtual switches=&lt;br /&gt;
This script needs a virtual switch for each device you want to keep an eye on.&lt;br /&gt;
&lt;br /&gt;
To create a virtual switch, go to the &#039;Switches&#039; tab. &lt;br /&gt;
&lt;br /&gt;
Click the &#039;Manual Light/Switch&#039; button in the upper left corner. Choose the dummy hardware from the drop-down. Enter a name (&#039;John Doe smartphone&#039;). Switch type &#039;On/off&#039;. Type &#039;X10&#039;. For &#039;House code&#039; and &#039;Unit code&#039;, choose some random, doesn&#039;t really matter.&lt;br /&gt;
&lt;br /&gt;
It is advisable to make the switch &#039;protected&#039;, so the switch can only be operated by the detection script and not by you, by accidentally clicking on it ;)&lt;br /&gt;
&lt;br /&gt;
Now you need to know the ID of the switch. This can be found by going to &#039;Setup&#039; --&amp;gt; &#039;Devices&#039;. Find the switch you created in the list, and remember the IDX.&amp;lt;br&amp;gt;&lt;br /&gt;
If you want multiple devices to be checked (smartphone of your wife) you will need to create a virtual switch for that device also. You will also need to find the id of that device. &amp;lt;br&amp;gt;&lt;br /&gt;
Remember/write down this number, because you will need it later on.&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
If you are using authentication make sure to set the type to &amp;quot;basic-Auth&amp;quot; and not &amp;quot;Login Page&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Linux (Raspberry Pi)=&lt;br /&gt;
This script is available for Linux. To use it, a number of things have to be installed.&lt;br /&gt;
&lt;br /&gt;
==Installing Python==&lt;br /&gt;
The Python scripts needs &#039;python&#039; to be installed. You can install this by running:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install python&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
from the terminal on the Pi.&amp;lt;br&amp;gt;&lt;br /&gt;
If it says that &#039;python&#039; is already installed, you can continue further with this tutorial.&lt;br /&gt;
&lt;br /&gt;
==Installing arping==&lt;br /&gt;
&#039;Ping&#039; is a regular way to detect whether a device is present on a network or not. It is also inherently unreliable as many smartphones (independent of brand) will not respond when the phone is inactive, which leads to a lot of online / offline switching. To circumvent this, we will use &#039;arping&#039; a tool that sends out an &#039;arp-whois&#039;, to which most device &#039;&#039;will&#039;&#039; respond.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install arping&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a small caveat with using arping, as it requires root-privileges to run. We will fix this within the script below.&lt;br /&gt;
&lt;br /&gt;
==Create the Python script==&lt;br /&gt;
User Chopperrob has created a very useful script that will scan for any device you ask it to. &lt;br /&gt;
&lt;br /&gt;
The script needs 4 parameters to run:&lt;br /&gt;
* The IP-address of the device you want to check (In my case &#039;192.168.4.9&#039;)&lt;br /&gt;
* The ID of the virtual switch (In my case &#039;37&#039;)&lt;br /&gt;
* The interval (seconds) on which to check if a device is present or not (In my case &#039;10&#039;, for 10 seconds)&lt;br /&gt;
* The &#039;cool-down&#039; period (seconds). If a device does not respond within this period, the virtual switch is turned off. (In my case &#039;120&#039;, for 120 seconds, or 2 minutes) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a new file in the scripts folder inside your Domoticz folder. On a Raspberry Pi this would probably be at &amp;lt;code&amp;gt;\home\pi\domoticz\scripts\&amp;lt;/code&amp;gt;.  Name the file &amp;lt;code&amp;gt;check_device_online.py&amp;lt;/code&amp;gt;. Copy the contents from the script on this page to the file, and save it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
#   Title: check_device_online.py&lt;br /&gt;
#   Author: Chopper_Rob&lt;br /&gt;
#   Date: 25-02-2015&lt;br /&gt;
#   Info: Checks the presence of the given device on the network and reports back to domoticz&lt;br /&gt;
#   URL : https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz&lt;br /&gt;
#   Version : 1.6.2&lt;br /&gt;
 &lt;br /&gt;
import sys&lt;br /&gt;
import datetime&lt;br /&gt;
import time&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
import urllib2&lt;br /&gt;
import json&lt;br /&gt;
import base64&lt;br /&gt;
 &lt;br /&gt;
# Settings for the domoticz server&lt;br /&gt;
domoticzserver=&amp;quot;192.168.2.1:8080&amp;quot;&lt;br /&gt;
domoticzusername = &amp;quot;admin&amp;quot;&lt;br /&gt;
domoticzpassword = &amp;quot;admin&amp;quot;&lt;br /&gt;
domoticzpasscode = &amp;quot;Light/Switch Protection&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# If enabled. The script will log to the file _.log&lt;br /&gt;
# Logging to file only happens after the check for other instances, before that it only prints to screen.&lt;br /&gt;
log_to_file = False&lt;br /&gt;
 &lt;br /&gt;
# The script supports two types to check if another instance of the script is running.&lt;br /&gt;
# One will use the ps command, but this does not work on all machine (Synology has problems)&lt;br /&gt;
# The other option is to create a pid file named _.pid. The script will update the timestamp&lt;br /&gt;
# every interval. If a new instance of the script spawns it will check the age of the pid file.&lt;br /&gt;
# If the file doesn&#039;t exist or it is older then 3 * Interval it will keep running, otherwise is stops.&lt;br /&gt;
# Please chose the option you want to use &amp;quot;ps&amp;quot; or &amp;quot;pid&amp;quot;, if this option is kept empty it will not check and just run.&lt;br /&gt;
check_for_instances = &amp;quot;pid&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# DO NOT CHANGE BEYOND THIS LINE&lt;br /&gt;
if len(sys.argv) != 5 :&lt;br /&gt;
  print (&amp;quot;Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.&amp;quot;)&lt;br /&gt;
  sys.exit(0)&lt;br /&gt;
 &lt;br /&gt;
device=sys.argv[1]&lt;br /&gt;
switchid=sys.argv[2]&lt;br /&gt;
interval=sys.argv[3]&lt;br /&gt;
cooldownperiod=sys.argv[4]&lt;br /&gt;
previousstate=-1&lt;br /&gt;
lastsuccess=datetime.datetime.now()&lt;br /&gt;
lastreported=-1&lt;br /&gt;
base64string = base64.encodestring(&#039;%s:%s&#039; % (domoticzusername, domoticzpassword)).replace(&#039;\n&#039;, &#039;&#039;)&lt;br /&gt;
domoticzurl = &#039;http://&#039;+domoticzserver+&#039;/json.htm?type=devices&amp;amp;filter=all&amp;amp;used=true&amp;amp;order=Name&#039;&lt;br /&gt;
 &lt;br /&gt;
if check_for_instances.lower() == &amp;quot;pid&amp;quot;:&lt;br /&gt;
  pidfile = sys.argv[0] + &#039;_&#039; + sys.argv[1] + &#039;.pid&#039;&lt;br /&gt;
  if os.path.isfile( pidfile ):&lt;br /&gt;
    print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- pid file exists&amp;quot;&lt;br /&gt;
    if (time.time() - os.path.getmtime(pidfile)) &amp;lt; (float(interval) * 3):&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script seems to be still running, exiting&amp;quot;&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- If this is not correct, please delete file &amp;quot; + pidfile&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
    else:&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- Seems to be an old file, ignoring.&amp;quot;&lt;br /&gt;
  else:&lt;br /&gt;
    open(pidfile, &#039;w&#039;).close() &lt;br /&gt;
 &lt;br /&gt;
if check_for_instances.lower() == &amp;quot;ps&amp;quot;:&lt;br /&gt;
  if int(subprocess.check_output(&#039;ps x | grep \&#039;&#039; + sys.argv[0] + &#039; &#039; + sys.argv[1] + &#039;\&#039; | grep -cv grep&#039;, shell=True)) &amp;gt; 2 :&lt;br /&gt;
    print (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script already running. exiting.&amp;quot;)&lt;br /&gt;
    sys.exit(0)&lt;br /&gt;
 &lt;br /&gt;
def log(message):&lt;br /&gt;
  print message&lt;br /&gt;
  if log_to_file == True:&lt;br /&gt;
    logfile = open(sys.argv[0] + &#039;_&#039; + sys.argv[1] + &#039;.log&#039;, &amp;quot;a&amp;quot;)&lt;br /&gt;
    logfile.write(message + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    logfile.close()&lt;br /&gt;
 &lt;br /&gt;
def domoticzstatus ():&lt;br /&gt;
  json_object = json.loads(domoticzrequest(domoticzurl))&lt;br /&gt;
  status = 0&lt;br /&gt;
  switchfound = False&lt;br /&gt;
  if json_object[&amp;quot;status&amp;quot;] == &amp;quot;OK&amp;quot;:&lt;br /&gt;
    for i, v in enumerate(json_object[&amp;quot;result&amp;quot;]):&lt;br /&gt;
      if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;idx&amp;quot;] == switchid:&lt;br /&gt;
        switchfound = True&lt;br /&gt;
        if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;Status&amp;quot;] == &amp;quot;On&amp;quot;: &lt;br /&gt;
          status = 1&lt;br /&gt;
        if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;Status&amp;quot;] == &amp;quot;Off&amp;quot;: &lt;br /&gt;
          status = 0&lt;br /&gt;
  if switchfound == False: print (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- Error. Could not find switch idx in Domoticz response. Defaulting to switch off.&amp;quot;)&lt;br /&gt;
  return status&lt;br /&gt;
 &lt;br /&gt;
def domoticzrequest (url):&lt;br /&gt;
  request = urllib2.Request(url)&lt;br /&gt;
  request.add_header(&amp;quot;Authorization&amp;quot;, &amp;quot;Basic %s&amp;quot; % base64string)&lt;br /&gt;
  response = urllib2.urlopen(request)&lt;br /&gt;
  return response.read()&lt;br /&gt;
 &lt;br /&gt;
log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script started.&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
lastreported = domoticzstatus()&lt;br /&gt;
if lastreported == 1 :&lt;br /&gt;
  log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- according to domoticz, &amp;quot; + device + &amp;quot; is online&amp;quot;)&lt;br /&gt;
if lastreported == 0 :&lt;br /&gt;
  log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- according to domoticz, &amp;quot; + device + &amp;quot; is offline&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
while 1==1:&lt;br /&gt;
  # currentstate = subprocess.call(&#039;ping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&lt;br /&gt;
  currentstate = subprocess.call(&#039;sudo arping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 0 : lastsuccess=datetime.datetime.now()&lt;br /&gt;
  if currentstate == 0 and currentstate != previousstate and lastreported == 1 : &lt;br /&gt;
    log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, no need to tell domoticz&amp;quot;)&lt;br /&gt;
  if currentstate == 0 and currentstate != previousstate and lastreported != 1 :&lt;br /&gt;
    if domoticzstatus() == 0 :&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, tell domoticz it&#039;s back&amp;quot;)&lt;br /&gt;
      domoticzrequest(&amp;quot;http://&amp;quot; + domoticzserver + &amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot; + switchid + &amp;quot;&amp;amp;switchcmd=On&amp;amp;level=0&amp;quot; + &amp;quot;&amp;amp;passcode=&amp;quot; + domoticzpasscode)&lt;br /&gt;
    else:&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, but domoticz already knew&amp;quot;)&lt;br /&gt;
    lastreported=1&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 1 and currentstate != previousstate :&lt;br /&gt;
    log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, waiting for it to come back&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 1 and (datetime.datetime.now()-lastsuccess).total_seconds() &amp;gt; float(cooldownperiod) and lastreported != 0 :&lt;br /&gt;
    if domoticzstatus() == 1 :&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, tell domoticz it&#039;s gone&amp;quot;)&lt;br /&gt;
      domoticzrequest(&amp;quot;http://&amp;quot; + domoticzserver + &amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot; + switchid + &amp;quot;&amp;amp;switchcmd=Off&amp;amp;level=0&amp;quot; + &amp;quot;&amp;amp;passcode=&amp;quot; + domoticzpasscode)&lt;br /&gt;
    else:&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, but domoticz already knew&amp;quot;)&lt;br /&gt;
    lastreported=0&lt;br /&gt;
 &lt;br /&gt;
  time.sleep (float(interval))&lt;br /&gt;
 &lt;br /&gt;
  previousstate=currentstate&lt;br /&gt;
  if check_for_instances.lower() == &amp;quot;pid&amp;quot;: open(pidfile, &#039;w&#039;).close()  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Source: https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz   &lt;br /&gt;
Many thanks for this good working script Chopper_Rob !&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;This link seems to be down&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Updated version of the script that can run as a systemd service can be found here: https://github.com/ariankoster/onlinechecker&lt;br /&gt;
&lt;br /&gt;
===Cron - scheduling the script===&lt;br /&gt;
In principle the script runs endlessly. But in case something goes wrong, it&#039;s nice to make sure it will get restarted automatically. This can be done by using &#039;cron&#039;, the task scheduler on Linux.&lt;br /&gt;
&lt;br /&gt;
On the terminal, run &amp;lt;nowiki&amp;gt;crontab -e&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
In the screen that opens, add a line for each device you want to check.&lt;br /&gt;
&lt;br /&gt;
My crontab looks like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;*/10 * * * *  /home/pi/domoticz/scripts/check_device_online.py 192.168.4.9 37 10 120&lt;br /&gt;
*/10 * * * *  /home/pi/domoticz/scripts/check_device_online.py 192.168.4.10 36 10 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The first line is for my phone, the second line is for the iPhone of my girlfriend.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;For Raspbmc, a user advised that you need to put &amp;lt;code&amp;gt;sudo python&amp;lt;/code&amp;gt; in front of the command. &amp;lt;/b&amp;gt;So then it will look like this:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;*/10 * * * *  sudo python /home/pi/domoticz/scripts/check_device_online.py 192.168.4.9 37 10 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit the crontab editor by pressing CTRL-O (character &#039;O&#039;, not zero) and hitting Enter. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Optional: make script executable==&lt;br /&gt;
In the terminal, go to cd /home/pi/domoticz/scripts &amp;lt;br&amp;gt;&lt;br /&gt;
Execute the command &#039;&#039;&#039;sudo chmod +x check_device_online.py&#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;I am not sure if executing this command is necessary, but it doesn&#039;t harm anything ;)&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
The same Python script is also available for Windows.&lt;br /&gt;
&lt;br /&gt;
==Install Python==&lt;br /&gt;
You can download and then install Python from the following website:&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.python.org/downloads/windows/]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use version 2.X as the 3.x seems to have issues with some commands in the script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Arping==&lt;br /&gt;
Get arping from the following page:&lt;br /&gt;
[https://github.com/ThomasHabets/arping]&lt;br /&gt;
&lt;br /&gt;
You can just copy and paste the arping into your c:\windows\system32\ folder to make it easier to run the script&lt;br /&gt;
&lt;br /&gt;
==Create the script==&lt;br /&gt;
Create a new file in the &amp;lt;code&amp;gt;c:\scripts folder&amp;lt;/code&amp;gt; (create if this doesn&#039;t exist. Name the file &amp;lt;code&amp;gt;check_device_online.py&amp;lt;/code&amp;gt;. Copy the contents from the script below into the file, and save it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
#   Title: check_device_online.py&lt;br /&gt;
#   Author: Chopper_Rob&lt;br /&gt;
#   Date: 25-02-2015&lt;br /&gt;
#   Info: Checks the presence of the given device on the network and reports back to domoticz&lt;br /&gt;
#   URL : https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz&lt;br /&gt;
#   Version : 1.6.2&lt;br /&gt;
 &lt;br /&gt;
import sys&lt;br /&gt;
import datetime&lt;br /&gt;
import time&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
import urllib2&lt;br /&gt;
import json&lt;br /&gt;
import base64&lt;br /&gt;
 &lt;br /&gt;
# Settings for the domoticz server&lt;br /&gt;
domoticzserver=&amp;quot;***.***.***.***:****&amp;quot;&lt;br /&gt;
domoticzusername = &amp;quot;*******&amp;quot;&lt;br /&gt;
domoticzpassword = &amp;quot;*******&amp;quot;&lt;br /&gt;
domoticzpasscode = &amp;quot;*******&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
# If enabled. The script will log to the file _.log&lt;br /&gt;
# Logging to file only happens after the check for other instances, before that it only prints to screen.&lt;br /&gt;
log_to_file = False&lt;br /&gt;
 &lt;br /&gt;
# The script supports two types to check if another instance of the script is running.&lt;br /&gt;
# One will use the ps command, but this does not work on all machine (Synology has problems)&lt;br /&gt;
# The other option is to create a pid file named _.pid. The script will update the timestamp&lt;br /&gt;
# every interval. If a new instance of the script spawns it will check the age of the pid file.&lt;br /&gt;
# If the file doesn&#039;t exist or it is older then 3 * Interval it will keep running, otherwise is stops.&lt;br /&gt;
# Please chose the option you want to use &amp;quot;ps&amp;quot; or &amp;quot;pid&amp;quot;, if this option is kept empty it will not check and just run.&lt;br /&gt;
check_for_instances = &amp;quot;pid&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# DO NOT CHANGE BEYOND THIS LINE&lt;br /&gt;
if len(sys.argv) != 5 :&lt;br /&gt;
  print (&amp;quot;Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.&amp;quot;)&lt;br /&gt;
  sys.exit(0)&lt;br /&gt;
 &lt;br /&gt;
device=sys.argv[1]&lt;br /&gt;
switchid=sys.argv[2]&lt;br /&gt;
interval=sys.argv[3]&lt;br /&gt;
cooldownperiod=sys.argv[4]&lt;br /&gt;
previousstate=-1&lt;br /&gt;
lastsuccess=datetime.datetime.now()&lt;br /&gt;
lastreported=-1&lt;br /&gt;
base64string = base64.encodestring(&#039;%s:%s&#039; % (domoticzusername, domoticzpassword)).replace(&#039;\n&#039;, &#039;&#039;)&lt;br /&gt;
domoticzurl = &#039;http://&#039;+domoticzserver+&#039;/json.htm?type=devices&amp;amp;filter=all&amp;amp;used=true&amp;amp;order=Name&#039;&lt;br /&gt;
 &lt;br /&gt;
if check_for_instances.lower() == &amp;quot;pid&amp;quot;:&lt;br /&gt;
  pidfile = sys.argv[0] + &#039;_&#039; + sys.argv[1] + &#039;.pid&#039;&lt;br /&gt;
  if os.path.isfile( pidfile ):&lt;br /&gt;
    print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- pid file exists&amp;quot;&lt;br /&gt;
    if (time.time() - os.path.getmtime(pidfile)) &amp;lt; (float(interval) * 3):&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script seems to be still running, exiting&amp;quot;&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- If this is not correct, please delete file &amp;quot; + pidfile&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
    else:&lt;br /&gt;
      print datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- Seems to be an old file, ignoring.&amp;quot;&lt;br /&gt;
  else:&lt;br /&gt;
    open(pidfile, &#039;w&#039;).close() &lt;br /&gt;
 &lt;br /&gt;
if check_for_instances.lower() == &amp;quot;ps&amp;quot;:&lt;br /&gt;
  if int(subprocess.check_output(&#039;ps x | grep \&#039;&#039; + sys.argv[0] + &#039; &#039; + sys.argv[1] + &#039;\&#039; | grep -cv grep&#039;, shell=True)) &amp;gt; 2 :&lt;br /&gt;
    print (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script already running. exiting.&amp;quot;)&lt;br /&gt;
    sys.exit(0)&lt;br /&gt;
 &lt;br /&gt;
def log(message):&lt;br /&gt;
  print message&lt;br /&gt;
  if log_to_file == True:&lt;br /&gt;
    logfile = open(sys.argv[0] + &#039;_&#039; + sys.argv[1] + &#039;.log&#039;, &amp;quot;a&amp;quot;)&lt;br /&gt;
    logfile.write(message + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    logfile.close()&lt;br /&gt;
 &lt;br /&gt;
def domoticzstatus ():&lt;br /&gt;
  json_object = json.loads(domoticzrequest(domoticzurl))&lt;br /&gt;
  status = 0&lt;br /&gt;
  switchfound = False&lt;br /&gt;
  if json_object[&amp;quot;status&amp;quot;] == &amp;quot;OK&amp;quot;:&lt;br /&gt;
    for i, v in enumerate(json_object[&amp;quot;result&amp;quot;]):&lt;br /&gt;
      if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;idx&amp;quot;] == switchid:&lt;br /&gt;
        switchfound = True&lt;br /&gt;
        if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;Status&amp;quot;] == &amp;quot;On&amp;quot;: &lt;br /&gt;
          status = 1&lt;br /&gt;
        if json_object[&amp;quot;result&amp;quot;][i][&amp;quot;Status&amp;quot;] == &amp;quot;Off&amp;quot;: &lt;br /&gt;
          status = 0&lt;br /&gt;
  if switchfound == False: print (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- Error. Could not find switch idx in Domoticz response. Defaulting to switch off.&amp;quot;)&lt;br /&gt;
  return status&lt;br /&gt;
 &lt;br /&gt;
def domoticzrequest (url):&lt;br /&gt;
  request = urllib2.Request(url)&lt;br /&gt;
  request.add_header(&amp;quot;Authorization&amp;quot;, &amp;quot;Basic %s&amp;quot; % base64string)&lt;br /&gt;
  response = urllib2.urlopen(request)&lt;br /&gt;
  return response.read()&lt;br /&gt;
 &lt;br /&gt;
log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- script started.&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
lastreported = domoticzstatus()&lt;br /&gt;
if lastreported == 1 :&lt;br /&gt;
  log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- according to domoticz, &amp;quot; + device + &amp;quot; is online&amp;quot;)&lt;br /&gt;
if lastreported == 0 :&lt;br /&gt;
  log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- according to domoticz, &amp;quot; + device + &amp;quot; is offline&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
while 1==1:&lt;br /&gt;
  # currentstate = subprocess.call(&#039;ping -q -c1 -W 1 &#039;+ device, &amp;gt; /dev/null shell=True)&lt;br /&gt;
  currentstate = subprocess.call(&#039;arping -c &#039;+ device + &#039; &amp;gt; nul&#039;, shell=True)&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 0 : lastsuccess=datetime.datetime.now()&lt;br /&gt;
  if currentstate == 0 and currentstate != previousstate and lastreported == 1 : &lt;br /&gt;
    log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, no need to tell domoticz&amp;quot;)&lt;br /&gt;
  if currentstate == 0 and currentstate != previousstate and lastreported != 1 :&lt;br /&gt;
    if domoticzstatus() == 0 :&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, tell domoticz it&#039;s back&amp;quot;)&lt;br /&gt;
      domoticzrequest(&amp;quot;http://&amp;quot; + domoticzserver + &amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot; + switchid + &amp;quot;&amp;amp;switchcmd=On&amp;amp;level=0&amp;quot; + &amp;quot;&amp;amp;passcode=&amp;quot; + domoticzpasscode)&lt;br /&gt;
    else:&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; online, but domoticz already knew&amp;quot;)&lt;br /&gt;
    lastreported=1&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 1 and currentstate != previousstate :&lt;br /&gt;
    log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, waiting for it to come back&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
  if currentstate == 1 and (datetime.datetime.now()-lastsuccess).total_seconds() &amp;gt; float(cooldownperiod) and lastreported != 0 :&lt;br /&gt;
    if domoticzstatus() == 1 :&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, tell domoticz it&#039;s gone&amp;quot;)&lt;br /&gt;
      domoticzrequest(&amp;quot;http://&amp;quot; + domoticzserver + &amp;quot;/json.htm?type=command&amp;amp;param=switchlight&amp;amp;idx=&amp;quot; + switchid + &amp;quot;&amp;amp;switchcmd=Off&amp;amp;level=0&amp;quot; + &amp;quot;&amp;amp;passcode=&amp;quot; + domoticzpasscode)&lt;br /&gt;
    else:&lt;br /&gt;
      log (datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;) + &amp;quot;- &amp;quot; + device + &amp;quot; offline, but domoticz already knew&amp;quot;)&lt;br /&gt;
    lastreported=0&lt;br /&gt;
 &lt;br /&gt;
  time.sleep (float(interval))&lt;br /&gt;
 &lt;br /&gt;
  previousstate=currentstate&lt;br /&gt;
  if check_for_instances.lower() == &amp;quot;pid&amp;quot;: open(pidfile, &#039;w&#039;).close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Source: https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Scheduling the script in Windows==&amp;lt;br&amp;gt;&lt;br /&gt;
In the task sheduler create a new task to run on computer login if you setup Domoticz as an application&amp;lt;br&amp;gt;&lt;br /&gt;
click create task&amp;lt;br&amp;gt;&lt;br /&gt;
Add your triggers for 12:01am and repeating every 15 minutes for actions add the following &amp;lt;br&amp;gt;&lt;br /&gt;
C:\Python27\python.exe as the program\script (change it to your Python folder)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And for arguments &amp;lt;code&amp;gt;c:\scripts\checkpresence.py 192.168.4.9 37 10 120&amp;lt;/code&amp;gt; (change the parameters to what you need for your situation).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Working with multiple phones=&lt;br /&gt;
I use this script to detect if my girlfriend or I are at home. My Blockly events are based on this, because i can tell to Domoticz if someone is home or not.&amp;lt;br&amp;gt;&lt;br /&gt;
For each phone you want to check you need a line with a call to the script in your crontab. Of course you need to change the parameters in the different crontab lines for every phone accordingly. You also need a virtual switch for each phone.&amp;lt;br&amp;gt;&lt;br /&gt;
To tell Domoticz if there is someone home i use a virtual switch &#039;SomeoneHome&#039;. This virtual switch is triggered by a Blockly event. That event looks like this:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
IF [SomeoneHome = Off] AND [[Phone1 = On] OR [Phone2 = On]]&amp;lt;br&amp;gt;&lt;br /&gt;
DO SET [SomeoneHome = On]&amp;lt;br&amp;gt;&lt;br /&gt;
ELSE IF [SomeoneHome = On] AND [[Phone1 = Off] AND [Phone2 = Off]]&amp;lt;br&amp;gt;&lt;br /&gt;
DO SET [SomeoneHome = Off]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
By using the virtual switch I can turn on the lights when someone comes home and it is dark. Or turn the heating off when there is nobody home.&amp;lt;br&amp;gt;&lt;br /&gt;
Don&#039;t forget to make the switch &#039;SomeoneHome&#039; protected to prevent accidental clicking. You only want the switch to be turned on/off by the event.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
It can happen that the script is not working in your situation.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Try pinging by hand==&lt;br /&gt;
First thing to try is, if you can ping your phone by yourself (&amp;lt;code&amp;gt;ping IP_OF_PHONE&amp;lt;/code&amp;gt;). If you get responses (&amp;lt;code&amp;gt;&amp;quot;XX bytes from NNN&amp;quot;&amp;lt;/code&amp;gt;), we know your phone is replying to pings. Stop the ping commmand by pressing &#039;CTRL-C&#039;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Check if the script works==&lt;br /&gt;
Now we need to check if the script works when we activate it by hand. Go to the scripts directory (&amp;lt;code&amp;gt;cd /home/pi/domoticz/scripts/&amp;lt;/code&amp;gt;) and then activate the script with the correct parameters:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;python check_device_online.py IP_PHONE IDX INTERVAL TIMEOUT&amp;lt;/code&amp;gt;. For testing you can use a interval of 10 seconds and a timeout of 30 seconds, so you don&#039;t have to wait very long to see the switch turn on/off in Domoticz.&amp;lt;br&amp;gt;&lt;br /&gt;
If everything works good, you should see some output like: &amp;lt;code&amp;gt;Script already running, exiting&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Needs more parameters&amp;lt;/code&amp;gt;.&lt;br /&gt;
If you get other errors (unclear errors, that doesn&#039;t seem to be related to the script), maybe you don&#039;t have &#039;python&#039; (not &#039;python3&#039; !!) installed correctly (&amp;lt;code&amp;gt;sudo apt-get install python&amp;lt;/code&amp;gt;), or you made a mistake when you copied the script.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Check if crontab is correct==&lt;br /&gt;
When the script is not yet activated by the crontab (in the setup above it should activate the script every 10 minutes) and you activate it by hand, you should see some output on the screen, like: &amp;lt;code&amp;gt;Device online, tell domoticz it&#039;s back&amp;lt;/code&amp;gt;. You now know the script is working correctly, so the error is probably in your crontab.&lt;br /&gt;
==Check if &#039;cron&#039; service is running==&lt;br /&gt;
A user told me he had difficulties on using this script on Raspbmc. He said the &#039;cron&#039; service was not running by default on his Raspbmc installation.&amp;lt;br&amp;gt;&lt;br /&gt;
You can check if &#039;cron&#039; is active by issueing &amp;lt;code&amp;gt;sudo service cron status&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
If it is running, it should say &amp;lt;code&amp;gt;[ ok ] cron is running.&amp;lt;/code&amp;gt;. If it is not running, you can start it by &amp;lt;code&amp;gt;sudo service cron start&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
To view the log of cron, you can issue &amp;lt;code&amp;gt;grep CRON /var/log/syslog&amp;lt;/code&amp;gt;. You should see some lines of text if cron is active.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
To enable &#039;cron&#039; on Raspbmc, have a look this tutorial: http://www.averagemanvsraspberrypi.com/2014/07/using-cron-with-raspbmc.html&lt;br /&gt;
&lt;br /&gt;
==iPhone trouble==&lt;br /&gt;
&#039;&#039;For an Apple iPhone it is recommended to experiment a bit with the cooldown period. Apple devices turn their WiFi-connection off when the screen turns off. If the cool-down periode you have configured for your iPhone is too small, the script may think you are away while you are not. &amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;I use 2700 sec. (45 minutes) for the iPhone 4S of my girlfriend. Maybe lower will work, but your mileage may vary. For my LG Nexus 5 (the first line in the crontab) i use 2 minutes, because the WiFi of my phone is always on, even with screen off (Android setting).&amp;lt;br&amp;gt;&#039;&#039;&lt;br /&gt;
&#039;&#039;The downside of using a high number for the cool-down period, is that the script will wait the configured time before seeing the device as away. But this is only negative if you want to turn &amp;lt;u&amp;gt;off&amp;lt;/u&amp;gt; something, when the phone is gone. Because the script runs every 10 secs, as soon as the phone is &#039;visible&#039; for the script it turns the virtual switch on. &#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;So turning lights on when the iPhone comes home works fine, but an event which turns the lights off when the iPhone leaves the house can have a delay of 45min.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As an alternative you could use geo-fencing apps like &#039;Pilot: Home Automation&#039; for the iPhone. They work well, but are less privacy friendly, as you will now be updating your location though Google/Apple&#039;s location services.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;ps: invalid option -- &#039;x&#039; &amp;quot; message ==&lt;br /&gt;
If you try to run the script above on a Synology NAS, you will probably get the message &amp;lt;code&amp;gt;ps: invalid option -- &#039;x&#039;&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
To fix this, go to line 66 of the script, and change &amp;lt;b&amp;gt;ps x | grep&amp;lt;/b&amp;gt; into &amp;lt;b&amp;gt;ps | grep&amp;lt;/b&amp;gt;. (remove the &#039;x&#039;).&lt;br /&gt;
&lt;br /&gt;
== Synology arping syntax ==&lt;br /&gt;
On some Synology devices (DSM7+?) the arping command requires you to specify the network interface with the &#039;&#039;&#039;-I&#039;&#039;&#039; parameter. In most cases the interface will be &#039;&#039;&#039;eth0&#039;&#039;&#039;. So the line calling the arping should be changed like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
currentstate = subprocess.call(&#039;sudo arping -q -c1 -w 1 -I eth0 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network limitation of Arping ==&lt;br /&gt;
Arping relies on arp requests. Those will works only for the same subnet. If you intend detect anything outside of it, arping will fails. Ping have to be used for such scenario (by example internet targets or multi-subnet networks). &amp;lt;br&amp;gt;A trick is to replace the arping command with a combination of both:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  # currentstate = subprocess.call(&#039;ping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;  currentstate = subprocess.call(&#039;sudo arping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
should become something like this:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;  currentstateping = subprocess.call(&#039;ping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;  currentstatearp = subprocess.call(&#039;sudo arping -q -c1 -W 1 &#039;+ device + &#039; &amp;gt; /dev/null&#039;, shell=True)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;  currentstate = currentstateping and currentstatearp&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;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:Scripting]]&lt;br /&gt;
[[Category:Python]]&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Customization&amp;diff=19199</id>
		<title>Customization</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Customization&amp;diff=19199"/>
		<updated>2026-05-07T12:29:42Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Skins */ Nightglass added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;New to Domoticz? Have a look at the [[Getting started]] page to connect your first devices, services or gateways.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
There are a number of ways to modify the look and feel of Domoticz, ranging from simple CSS modification, through to complete replacement of the dashboard.&lt;br /&gt;
&lt;br /&gt;
You can find current and popular modification on the Domotiz forum. Some examples are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Built in Themes==&lt;br /&gt;
You can change Domoticz a little bit through built-in themes, which mostly change the colour scheme. Dark themes are useful in case you have a tablet on your wall as an interface, so that it doesn&#039;t give too much light.&lt;br /&gt;
&lt;br /&gt;
Do this by Menu [[Application Settings|Setup - Settings]] select another theme from the pull down list.&lt;br /&gt;
&lt;br /&gt;
For a more information how to change the look of Domoticz go to &lt;br /&gt;
[[How to theme Domoticz]]&lt;br /&gt;
&lt;br /&gt;
===Browser cache===&lt;br /&gt;
The web frontend is set to be cached. This will speed up the application launch time, and is perfect if you create a shortcut on the home screen of an iPhone/iPad/….&lt;br /&gt;
&lt;br /&gt;
When experimenting with themes be sure to refresh and/or [[Browser Cache|clear the browser cache or appcache]] after each change.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Replacing icons==&lt;br /&gt;
You can add [[Custom_icons_for_webinterface|Custom icons]] to the interface. Lots of users have created iconpacks. You can find those in the forum.[https://www.domoticz.com/forum/viewtopic.php?f=8&amp;amp;t=7749 (link])&lt;br /&gt;
&lt;br /&gt;
[https://www.domoticz.com/forum/viewtopic.php?f=8&amp;amp;t=7749 An example]&lt;br /&gt;
&lt;br /&gt;
There is als a French user that has created a online Domoticz Icons Creator: https://domoticz-icon.aurelien-loyer.fr/&lt;br /&gt;
&lt;br /&gt;
==CSS themes==&lt;br /&gt;
You can modify the CSS of Domoticz in two ways. The simple way is to install a browser plugin like Stylebot or Stylish, and let your browser override the style. You can then add the CSS via that plugin.&lt;br /&gt;
&lt;br /&gt;
Another way is to modify a file in your Domoticz installation called &#039;&#039;custom.css&#039;&#039;. Whatever you add there will override the default styling. This will change the look for all browers, even those without plugin capability, like mobile phones.&lt;br /&gt;
&lt;br /&gt;
[https://www.domoticz.com/forum/viewtopic.php?f=8&amp;amp;t=16342 CSS polish]&lt;br /&gt;
&lt;br /&gt;
==Frontpage==&lt;br /&gt;
You also can create your own Front page [[CustomStatusPage|Creating a Custom Status Page]] It can be found on &amp;lt;nowiki&amp;gt;http://IP_OF_YOUR_DOMOTICZ:8080/views/frontpage.html&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.domoticz.com/forum/viewtopic.php?f=8&amp;amp;t=4698 New frontpage forum topic]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Newfrontpage.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins==&lt;br /&gt;
More rigorous modification of the theming system is possible too, where you replace more files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://github.com/galadril/Domoticz-Nightglass-Theme Nightglass theme]&lt;br /&gt;
&lt;br /&gt;
[[File:Nightglass theme.png]]&lt;br /&gt;
&lt;br /&gt;
[http://domoticz.com/forum/viewtopic.php?f=8&amp;amp;t=7863 ThinkTheme skin for Domoticz]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Aurora Theme]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Aurora theme faded 200px.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Machinon Theme]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:MachinonTheme200px.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Alternative dashboards==&lt;br /&gt;
Some users have created complete alternative interfaces and dashboards that circumvent the default web interface completely. &lt;br /&gt;
&lt;br /&gt;
[https://github.com/domoticz/Reacticz Reacticz]  [[File:Reacticz_dashboard.png]]     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://github.com/Dashticz/dashticz Dashticz]  [[File:Dashticzv2 theme faded 200px.png]]   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
Extra functionality can be added with PHP pages.&lt;br /&gt;
&lt;br /&gt;
Domoticz supports serving PHP pages when started with the [[Command line parameters|commandline parameter]] &amp;lt;code&amp;gt;-php_cgi_path  path_to_php_cgi&amp;lt;/code&amp;gt; (default /usr/bin/php-cgi)&lt;br /&gt;
&lt;br /&gt;
Prerequisite is that php-cgi is installed: &amp;lt;code&amp;gt;sudo apt update &amp;amp;&amp;amp; apt install php-cgi&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php file should be placed in folder domoticz\www.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Create the following script in the www folder with name &amp;lt;code&amp;gt;test.php&amp;lt;/code&amp;gt;:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;?php&lt;br /&gt;
 print( $_SERVER[&amp;quot;QUERY_STRING&amp;quot;]);&lt;br /&gt;
 print(&amp;quot;&amp;lt;nowiki&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;quot;);&lt;br /&gt;
 print_r($_GET);&lt;br /&gt;
 exit(0)&lt;br /&gt;
 ?&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Then request:&lt;br /&gt;
 &amp;lt;code&amp;gt;http://&amp;lt;domoticz-ip:port/test.php?test=123&amp;amp;moretexthere&amp;lt;/code&amp;gt;&lt;br /&gt;
This should give output like:&lt;br /&gt;
 &amp;lt;code&amp;gt;test=123&amp;amp;moretexthere&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Array ( [/home/pi/domoticz/www/test_php] =&amp;gt; [test] =&amp;gt; 123 [SERVER_SOFTWARE] =&amp;gt; Domoticz [SERVER_NAME] =&amp;gt; localhost [SERVER_ADDR] =&amp;gt; :: [SERVER_PORT] =&amp;gt; 8080 [REMOTE_ADDR] =&amp;gt; 192.168.178.11 [QUERY_STRING] =&amp;gt; test=123 [moretexthere] =&amp;gt; [HTTP_HOST] =&amp;gt; test.pi.home:8080 [HTTP_CONNECTION] =&amp;gt; keep-alive [HTTP_PRAGMA] =&amp;gt; no-cache [HTTP_CACHE_CONTROL] =&amp;gt; no-cache [HTTP_UPGRADE_INSECURE_REQUESTS] =&amp;gt; 1 [HTTP_USER_AGENT] =&amp;gt; Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 [HTTP_ACCEPT] =&amp;gt; text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 [HTTP_ACCEPT_ENCODING] =&amp;gt; gzip, deflate [HTTP_ACCEPT_LANGUAGE] =&amp;gt; en-NL,en;q=0.9,nl-NL;q=0.8,nl;q=0.7,en-US;q=0.6 [HTTP_COOKIE] =&amp;gt; _ga=GA1.2.846285750.1591806061 )&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Serving is done by fastcgi See github https://github.com/domoticz/domoticz/blob/development/webserver/fastcgi.cpp&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Domoticz]]&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category:Customization]]&lt;br /&gt;
[[Category:Theme]]&lt;br /&gt;
&lt;br /&gt;
==Continue to the next page of the introduction==&lt;br /&gt;
[[Automation| Automation]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=File:Nightglass_theme.png&amp;diff=19198</id>
		<title>File:Nightglass theme.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=File:Nightglass_theme.png&amp;diff=19198"/>
		<updated>2026-05-07T12:28:59Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nightglass theme&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19196</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19196"/>
		<updated>2026-05-01T11:52:34Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Using Matter with Domoticz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Navigate to the docker compose directory (as example) where the matter.js docker-compose.yml file is created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd docker/matterjs-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose logs -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19195</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19195"/>
		<updated>2026-05-01T11:51:25Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: /* Thread Border router */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Navigate to the docker compose directory (as example) where the matter.js docker-compose.yml file is created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd docker/matterjs-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose logs -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1&amp;lt;nowiki/&amp;gt;.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19194</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19194"/>
		<updated>2026-05-01T11:42:02Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Navigate to the docker compose directory (as example) where the matter.js docker-compose.yml file is created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd docker/matterjs-server&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
View logs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose logs -f&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1&amp;lt;nowiki/&amp;gt;.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
	<entry>
		<id>https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19193</id>
		<title>Matter</title>
		<link rel="alternate" type="text/html" href="https://wiki.domoticz.com/index.php?title=Matter&amp;diff=19193"/>
		<updated>2026-05-01T11:34:18Z</updated>

		<summary type="html">&lt;p&gt;Walter vl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is WIP!&lt;br /&gt;
&lt;br /&gt;
From beta 2026.1 domoticz has a Matter integration based on matter.js &lt;br /&gt;
&lt;br /&gt;
=== Matter.js server ===&lt;br /&gt;
For the matter integration to work you need a running matter-js-server (setup with docker: https://github.com/matter-js/matterjs-server/blob/main/docs/docker.md)&lt;br /&gt;
&lt;br /&gt;
docker-compose.yml example:&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  matterjs-server:&lt;br /&gt;
    container_name: matterjs-server&lt;br /&gt;
    image: ghcr.io/matter-js/matterjs-server:latest&lt;br /&gt;
    read_only: true&lt;br /&gt;
    network_mode: host&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./data:/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running with default options the UI should be available on port 5580 of the server eg http://192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Thread Border router ===&lt;br /&gt;
If you want to use the wireless standard thread, that is needed for e.g. the new Ikea devices, you need a Thread-border-router.&lt;br /&gt;
&lt;br /&gt;
There are many thread border routers available.&lt;br /&gt;
&lt;br /&gt;
The commercial ones:&lt;br /&gt;
&lt;br /&gt;
* Apple TV&lt;br /&gt;
* Apple Homepod&lt;br /&gt;
* Google Nest Hub&lt;br /&gt;
* Amazon Echo dot&lt;br /&gt;
* Ikea dirigera (newest version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then there the open source ones:&lt;br /&gt;
&lt;br /&gt;
* Openthread border router (ESP) https://openthread.io/guides/border-router/espressif-esp32&lt;br /&gt;
* Home Assistant ZBT-2&lt;br /&gt;
&lt;br /&gt;
=== Domoticz hardware gateway install ===&lt;br /&gt;
When matter.js is running you can add in Domoticz the Matter Hardware gateway and fill in the IP and port of your matter.js server eg 192.168.1.123:5580&lt;br /&gt;
&lt;br /&gt;
=== Using Matter with Domoticz ===&lt;br /&gt;
Devices paired to the matter server are also being added to Domoticz and can be controlled from Domoticz User interface.&lt;br /&gt;
&lt;br /&gt;
There is a setup button next to the Matter hardware in Domoticz that you can use, and you can also use the native web interface of the matterjs-server docker container (eg http://192.168.1&amp;lt;nowiki/&amp;gt;.123:5580)&lt;br /&gt;
&lt;br /&gt;
=== Discussion: ===&lt;br /&gt;
See forum thread https://forum.domoticz.com/viewtopic.php?t=41424&lt;/div&gt;</summary>
		<author><name>Walter vl</name></author>
	</entry>
</feed>