<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.webcore.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ady624</id>
		<title>webCoRE Wiki - Web-enabled Community's own Rule Engine - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.webcore.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ady624"/>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/Special:Contributions/ady624"/>
		<updated>2026-04-14T23:50:54Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=646</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=646"/>
				<updated>2017-08-11T20:02:33Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Backup/Restore Pistons to/from local storage (in the works)&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Physical / Programmatic Switch Support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Lock code support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt; Weather support (ughh)&amp;lt;/del&amp;gt; (6/16/2016)&lt;br /&gt;
# &amp;lt;del&amp;gt; Option to set the flash color and brightness level (request from @HDGuy)&amp;lt;/del&amp;gt; (6/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;br /&gt;
# &amp;lt;del&amp;gt;Orientation pseudo-attribute support&amp;lt;/del&amp;gt; (6/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Followed By support&amp;lt;/del&amp;gt; (07/08/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Import from Red Piston Picture&amp;lt;/del&amp;gt; (merged into local storage backup/restore)&lt;br /&gt;
# &amp;lt;del&amp;gt;Set variables with a dialogue versus running a piston to get an initial value&amp;lt;/del&amp;gt; (8/11/2017)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=504</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=504"/>
				<updated>2017-07-11T14:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Backup/Restore Pistons to/from local storage (in the works)&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Physical / Programmatic Switch Support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Lock code support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt; Weather support (ughh)&amp;lt;/del&amp;gt; (6/16/2016)&lt;br /&gt;
# &amp;lt;del&amp;gt; Option to set the flash color and brightness level (request from @HDGuy)&amp;lt;/del&amp;gt; (6/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;br /&gt;
# &amp;lt;del&amp;gt;Orientation pseudo-attribute support&amp;lt;/del&amp;gt; (6/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Followed By support&amp;lt;/del&amp;gt; (07/08/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Import from Red Piston Picture&amp;lt;/del&amp;gt; (merged into local storage backup/restore)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=503</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=503"/>
				<updated>2017-07-11T14:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Backup/Restore Pistons to/from local storage (in the works)&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Physical / Programmatic Switch Support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Lock code support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt; Weather support (ughh)&amp;lt;/del&amp;gt; (6/16/2016)&lt;br /&gt;
# &amp;lt;del&amp;gt; Option to set the flash color and brightness level (request from @HDGuy)&amp;lt;/del&amp;gt; (6/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;br /&gt;
# &amp;lt;del&amp;gt;Orientation pseudo-attribute support&amp;lt;/del&amp;gt; (6/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Followed By support&amp;lt;/del&amp;gt; (07/08/2017)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=494</id>
		<title>GitHub Install</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=494"/>
				<updated>2017-06-22T21:10:34Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Summary=&lt;br /&gt;
These instructions will help you install webCoRE via GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=Installing Source Code into SmartThings Cloud=&lt;br /&gt;
# Login to the [http://ide.smartthings.com SmartThings IDE].&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''Settings''' button at the top of the page.&lt;br /&gt;
#:[[File:Settings.jpg]]&lt;br /&gt;
# Click the '''Add new repository''' link at the bottom of the pop up.&lt;br /&gt;
# Enter &amp;quot;ady624&amp;quot; in the '''Owner''' column.&lt;br /&gt;
# Enter &amp;quot;webCoRE&amp;quot; in the '''Name''' column.&lt;br /&gt;
# Enter &amp;quot;master&amp;quot; in the '''Branch''' column.&lt;br /&gt;
# Click '''Save''' (do not hit the Enter key, it will exit the form without saving).&lt;br /&gt;
#:[[File:Githubrepo.jpg]]&lt;br /&gt;
# Click '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCore.groovy&amp;quot; from the '''New (only in GitHub)''' box. (Do not update both at once.)&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
# Click again on '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCoRE Piston.groovy&amp;quot;, &amp;quot;webCoRE Storage.groovy&amp;quot;and &amp;quot;webCoRE Dashboard.groovy&amp;quot; from the '''New (only in GitHub)''' box.&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
&lt;br /&gt;
Note: The webCoRE source code has only been copied to your SmartThings cloud account. You must continue to the next step of [[Enable webCoRE OAuth]].&lt;br /&gt;
&lt;br /&gt;
==Github Installation Troubleshooting==&lt;br /&gt;
[[File:500error.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
If you receive this error it may be because you installed and published both &amp;quot;webCore.groovy&amp;quot; and &amp;quot;webCore Piston.groovy&amp;quot; at the same time. Please do them individually (one at a time) per the instructions. Be sure to install/publish &amp;quot;webCore.groovy&amp;quot; first then &amp;quot;webCore Piston.groovy&amp;quot; after.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=493</id>
		<title>GitHub Install</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=493"/>
				<updated>2017-06-22T21:10:12Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* Installing Source Code into SmartThings Cloud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Summary=&lt;br /&gt;
These instructions will help you install webCoRE via GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=Installing Source Code into SmartThings Cloud=&lt;br /&gt;
# Login to the [https://ide.smartthings.com SmartThings IDE].&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''Settings''' button at the top of the page.&lt;br /&gt;
#:[[File:Settings.jpg]]&lt;br /&gt;
# Click the '''Add new repository''' link at the bottom of the pop up.&lt;br /&gt;
# Enter &amp;quot;ady624&amp;quot; in the '''Owner''' column.&lt;br /&gt;
# Enter &amp;quot;webCoRE&amp;quot; in the '''Name''' column.&lt;br /&gt;
# Enter &amp;quot;master&amp;quot; in the '''Branch''' column.&lt;br /&gt;
# Click '''Save''' (do not hit the Enter key, it will exit the form without saving).&lt;br /&gt;
#:[[File:Githubrepo.jpg]]&lt;br /&gt;
# Click '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCore.groovy&amp;quot; from the '''New (only in GitHub)''' box. (Do not update both at once.)&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
# Click again on '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCoRE Piston.groovy&amp;quot;, &amp;quot;webCoRE Storage.groovy&amp;quot;and &amp;quot;webCoRE Dashboard.groovy&amp;quot; from the '''New (only in GitHub)''' box.&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
&lt;br /&gt;
Note: The webCoRE source code has only been copied to your SmartThings cloud account. You must continue to the next step of [[Enable webCoRE OAuth]].&lt;br /&gt;
&lt;br /&gt;
==Github Installation Troubleshooting==&lt;br /&gt;
[[File:500error.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
If you receive this error it may be because you installed and published both &amp;quot;webCore.groovy&amp;quot; and &amp;quot;webCore Piston.groovy&amp;quot; at the same time. Please do them individually (one at a time) per the instructions. Be sure to install/publish &amp;quot;webCore.groovy&amp;quot; first then &amp;quot;webCore Piston.groovy&amp;quot; after.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=492</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=492"/>
				<updated>2017-06-21T22:08:22Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
# Orientation pseudo-attribute support&lt;br /&gt;
# Followed By support&lt;br /&gt;
# Backup/Restore Pistons to/from local storage&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Import from Red Piston Picture&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Physical / Programmatic Switch Support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Lock code support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt; Weather support (ughh)&amp;lt;/del&amp;gt; (6/16/2016)&lt;br /&gt;
# &amp;lt;del&amp;gt; Option to set the flash color and brightness level (request from @HDGuy)&amp;lt;/del&amp;gt; (6/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=489</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=489"/>
				<updated>2017-06-16T21:00:54Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
# Import from Red Piston Picture&lt;br /&gt;
# Backup/Restore Pistons to/from local storage&lt;br /&gt;
# Option to set the flash color and brightness level (request from @HDGuy)&lt;br /&gt;
# Weather support (ughh)&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Physical / Programmatic Switch Support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Lock code support&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=488</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=488"/>
				<updated>2017-06-16T18:44:39Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
# Physical / Programmatic Switch Support&lt;br /&gt;
# Lock code support&lt;br /&gt;
# Import from Red Piston Picture&lt;br /&gt;
# Backup/Restore Pistons to/from local storage&lt;br /&gt;
# Option to set the flash color and brightness level (request from @HDGuy)&lt;br /&gt;
# Weather support (ughh)&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Prevent already scheduled tasks from executing during restrictions&amp;lt;/del&amp;gt; (6/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Nickdaria&amp;diff=487</id>
		<title>User talk:Nickdaria</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Nickdaria&amp;diff=487"/>
				<updated>2017-06-14T17:48:58Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 11:48, 14 June 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Nickdaria&amp;diff=486</id>
		<title>User:Nickdaria</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Nickdaria&amp;diff=486"/>
				<updated>2017-06-14T17:48:58Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am a dedicated Home Automation enthusiast who will go way too far to get anything integrated. I specialize in Android development and Java desktop development and have a love of tinkering with DIY electronics such as the ESP8266 and the NTC C.H.I.P.. I also love Tesla, Android, and PC Gaming.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Michelfrancisb&amp;diff=484</id>
		<title>User:Michelfrancisb</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Michelfrancisb&amp;diff=484"/>
				<updated>2017-06-14T17:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am a recent high school grad with college on hold, though I would like to major in Video Production. I have tons of hobbies (SmartHome, Videography/Photography, Programming, Weapon collecting, Robotics, the list goes on) and have been working with computers/electronics as long as I can remember.&lt;br /&gt;
&lt;br /&gt;
/If you can buy it at Best Buy, I've worked on it./&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Michelfrancisb&amp;diff=485</id>
		<title>User talk:Michelfrancisb</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Michelfrancisb&amp;diff=485"/>
				<updated>2017-06-14T17:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 11:48, 14 June 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=483</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=483"/>
				<updated>2017-06-14T17:48:02Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
# Physical / Programmatic Switch Support&lt;br /&gt;
# Lock code support&lt;br /&gt;
# Prevent already scheduled tasks from executing during restrictions&lt;br /&gt;
# Import from Red Piston Picture&lt;br /&gt;
# Backup/Restore Pistons to/from local storage&lt;br /&gt;
# Option to set the flash color and brightness level (request from @HDGuy)&lt;br /&gt;
# Weather support (ughh)&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Command optimizations&amp;lt;/del&amp;gt; (5/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Virtual tasks - add the lot&amp;lt;/del&amp;gt; (6/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Way to identify devices that are selected but not used&amp;lt;/del&amp;gt; (no longer needed)&lt;br /&gt;
# &amp;lt;del&amp;gt;Remove ''(only while )'' when all Mode restrictions are deselected.&amp;lt;/del&amp;gt; (bug that was removed?)&lt;br /&gt;
# &amp;lt;del&amp;gt;That custom function feature you had mentioned in the private thread (@c1arkbar if you cant remember)&amp;lt;/del&amp;gt; (right...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Interpolate the past 10 years of usage based on the most recent 5 hours that would be great. Also would love for it to be able to forecast the next 24 months of data and stock market performance. Also future lottery numbers.&amp;lt;/del&amp;gt; (totally doable...)&lt;br /&gt;
# &amp;lt;del&amp;gt;Reference dynamic devices by names. getDevice(name) or make [variable:attribute] search for a device automatically, if variable is not a device variable&amp;lt;/del&amp;gt; (done, set a device variable to a string)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Destructure00&amp;diff=481</id>
		<title>User:Destructure00</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Destructure00&amp;diff=481"/>
				<updated>2017-06-08T16:23:07Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Destructure00&amp;diff=482</id>
		<title>User talk:Destructure00</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Destructure00&amp;diff=482"/>
				<updated>2017-06-08T16:23:07Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 10:23, 8 June 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Ittnerpm&amp;diff=479</id>
		<title>User:Ittnerpm</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Ittnerpm&amp;diff=479"/>
				<updated>2017-05-30T13:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My background includes a couple of decades in technology as a hobbyist, individual contributor, manager, exec, owner.  I love solving real world problems, and in my free time enjoy learning and helping others with home automation.  Currently reside in Oregon, USA, and am on my fifth personal home automation project.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Ittnerpm&amp;diff=480</id>
		<title>User talk:Ittnerpm</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Ittnerpm&amp;diff=480"/>
				<updated>2017-05-30T13:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 07:20, 30 May 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_Logging&amp;diff=478</id>
		<title>WebCoRE Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_Logging&amp;diff=478"/>
				<updated>2017-05-30T13:19:37Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: ady624 moved page WebCore Logging to WebCoRE Logging without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The logging settings can be found in the dashboard's piston view, under the ''Logs'' section.&lt;br /&gt;
&lt;br /&gt;
{{warning|The log to console task will generate logs regardless of the selected logging level.}}&lt;br /&gt;
&lt;br /&gt;
These settings will impact what logs get written to the SmartThings IDE Live Logging, as well as the built-in Log viewer in the dashboard:&lt;br /&gt;
&lt;br /&gt;
* '''None''' - only error and warning messages will be displayed&lt;br /&gt;
* '''Minimal''' - only error, warning, and info messages will be displayed&lt;br /&gt;
* '''Medium''' - only error, warning, info and trace messages will be displayed&lt;br /&gt;
* '''Full''' - all messages will be displayed (error, warning, info, trace, and debug)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=477</id>
		<title>webCoRE</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=477"/>
				<updated>2017-05-30T13:19:00Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* Other Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General ==&lt;br /&gt;
The ''web Community's own Rule Engine'' (or for short, webCoRE) is a general rule engine for SmartThings. It works by allowing users to create scripts that are interpreted and executed by the SmartThings SmartApp, allowing for complex decisions. webCoRE is currently a work in progress. webCoRE reached the first Beta milestone on April 29, 2017 (version v0.1.097.20170429) Please review the [[webCoRE todo]] list.&lt;br /&gt;
&lt;br /&gt;
== Video Introduction ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube&amp;gt;https://youtu.be/jgXA_rv2-_8&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
A few steps need to be completed before you can use webCoRE. First, webCoRE needs to be installed in your SmartThings account, then automations need to be configured. These are called [[Piston|pistons]] and will be detailed later. So let's start by installing webCoRE, please follow the 5 steps below.&lt;br /&gt;
&lt;br /&gt;
== Installing webCoRE ==&lt;br /&gt;
You must complete all of these steps.&lt;br /&gt;
&lt;br /&gt;
# [[GitHub Install]] or [[Manual Install]] of webCoRE source code into the SmartThings Cloud&lt;br /&gt;
# [[Enable webCoRE OAuth]] in the SmartThings cloud&lt;br /&gt;
# [[Install webCoRE]] in the SmartThings mobile app&lt;br /&gt;
# [[Enabling webCoRE dashboard]]&lt;br /&gt;
# [[Enable webCoRE on Another Device]]&lt;br /&gt;
&lt;br /&gt;
== Understanding the basics ==&lt;br /&gt;
webCoRE is comprised of the three main components listed below.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE child SmartApp (''webCoRE Piston'') ===&lt;br /&gt;
The webCoRE child SmartApp is also known as a [[Piston|piston]]. It is responsible for executing the automation script that the user creates and does the heavy lifting in the whole webCoRE ecosystem. It is directly managed by the webCoRE parent SmartApp, which can create, maintain, and delete a Piston.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE parent SmartApp (''webCoRE'') ===&lt;br /&gt;
The wabCoRE parent SmartApp is the component responsible for managing the child SmartApp instances and their relationship with the Dashboard. It is the middle man that allows adding new Pistons, maintaining them, or deleting them. It is also responsible with the security of the whole ecosystem, allowing password secured access from the Dashboard.&lt;br /&gt;
&lt;br /&gt;
=== The [[Dashboard|dashboard]] ===&lt;br /&gt;
The Dashboard is an [https://en.wikipedia.org/wiki/HTML HTML] interface for webCoRE that allows users to manage their webCoRE installation. It is the central hub to controlling webCoRE, allowing the user to create, modify, test, and delete Pistons.&lt;br /&gt;
&lt;br /&gt;
==Anatomy of a webCoRE Piston==&lt;br /&gt;
::''Main article [[Piston]]''&lt;br /&gt;
A piston is a script that contains a collection of elements, arranged so that the logic and flow of the piston perform tasks in a desired sequence. It is broken down into several sections, each having its own important role.&lt;br /&gt;
&lt;br /&gt;
//todo: most details below need to be moved into the main article&lt;br /&gt;
&lt;br /&gt;
===The ''settings'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show piston settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
These settings allows configuration of how certain aspects of the piston function. &lt;br /&gt;
&lt;br /&gt;
[[file:pistonsettings.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Name''' - Change the name of a piston.&lt;br /&gt;
*'''Description''' - Give a description of what the piston does.&lt;br /&gt;
*'''Automatic piston state''' - Change whether the piston handles it state or make it manual and you can control the piston's state.&lt;br /&gt;
*'''Piston execution parallelism''' - //todo&lt;br /&gt;
*'''Condition traversal optimizations''' - //todo&lt;br /&gt;
*'''Event subscriptions''' - Allow event subscriptions or turn them off if you would like to make the piston a follow up style piston.  If you disable this then you must have some other means for the piston to be fired.&lt;br /&gt;
*'''Command execution delay''' - A delay in milliseconds for commands to be executed piston wide.&lt;br /&gt;
&lt;br /&gt;
===The ''define'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show variables&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
A very powerful feature of webCoRE is the ability to use [[Variable|variables]]. Think of variables as temporary pockets where you can store information and are able to later retrieve and use this information for any purpose. This information can be used either during the current piston run, or at a later time, when another event occurs.&lt;br /&gt;
&lt;br /&gt;
[[file:pistondefine.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Type''' - You can select from the different [[Variable Data Types|Variable_data_types]] for you variable.&lt;br /&gt;
*'''Name''' - This is the empty box next to the type.  Enter a name for your variable.&lt;br /&gt;
*'''Initial value''' - This is defaulted to &amp;lt;code&amp;gt;Nothing selected&amp;lt;/code&amp;gt;.  If you decide to give it an initial value then that value will be used at each piston run regardless of what is stored in later piston runs.&lt;br /&gt;
*'''Description''' - Give a description of what the variable is used for.&lt;br /&gt;
&lt;br /&gt;
===The ''execute'' section===&lt;br /&gt;
This section describes the piston's logic flow. This is the starting point of most executions. Whenever a device event happens, the piston starts its execution here.  To get started click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:executesimple.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are you 3 basic building blocks with their description listed below them.  There are several more options to choose from aside from these three. In order to gain access to these you will again have to visit that trusty options menu in the top right hand corner and select &amp;lt;code&amp;gt;Show advanced statments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you do this and you click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt; you will now have access to all the available statement options.&lt;br /&gt;
&lt;br /&gt;
[[file:executeadvanced.png]]&lt;br /&gt;
&lt;br /&gt;
==Other Details==&lt;br /&gt;
# [[webCoRE Logging]]&lt;br /&gt;
# [[Functions]]&lt;br /&gt;
# [[Expressions]]&lt;br /&gt;
&lt;br /&gt;
== Creating your first piston ==&lt;br /&gt;
&lt;br /&gt;
Once you finished the installation steps above, let's go ahead and create the first piston, the famous [[Hello World!|Hello World]].&lt;br /&gt;
&lt;br /&gt;
==Sample Pistons==&lt;br /&gt;
This section has some user contributed sample pistons.  You can import any of these pistons using the import code displayed at the top of the piston.&lt;br /&gt;
# [[Samples]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo keywords=&amp;quot;webCoRE,dashboard,smart home,automation,SmartThings,rule engine,zigbee,z-wave,smart device&amp;quot; description=&amp;quot;The official wiki for webCoRE, the Web-enabled Community's own Rule Engine SmartApp&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Piston_State&amp;diff=461</id>
		<title>Piston State</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Piston_State&amp;diff=461"/>
				<updated>2017-05-25T13:25:11Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Piston States can be used to show a brief overview of what is happening in a piston &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
e.g.  [[File:piston_State_Example.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To enable this feature you need to disable automatic piston state in the piston settings option. This can be found by clicking the name of your piston in the edit screen&lt;br /&gt;
&lt;br /&gt;
[[File:disablestate.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then set the piston state by adding the task below&lt;br /&gt;
&lt;br /&gt;
[[File:setstate.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The displayed text can be formatted using the following&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[class | text]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The text is separated from the class using a pipe character | . The class is a comma or space separated list of the following&lt;br /&gt;
&lt;br /&gt;
* b &amp;gt;&amp;gt;&amp;gt; bold text&lt;br /&gt;
* i &amp;gt;&amp;gt;&amp;gt; italic text&lt;br /&gt;
* u &amp;gt;&amp;gt;&amp;gt; underlined text&lt;br /&gt;
* s &amp;gt;&amp;gt;&amp;gt; strikethrough&lt;br /&gt;
* pre &amp;gt;&amp;gt;&amp;gt; preformatted text (allows multiple blank characters used for alignment)&lt;br /&gt;
* #XXXXXX &amp;gt;&amp;gt;&amp;gt; hex colour&lt;br /&gt;
* colour name&amp;gt;&amp;gt;&amp;gt; a css colour name e.g. red, orange, blue, violet, lime. A list of CSS colours can be found [https://www.w3schools.com/cssref/css_colors.asp here]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example 1:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Piston_state_bold.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
would give&lt;br /&gt;
&lt;br /&gt;
[[File:bold.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:red_underlined.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
would give&lt;br /&gt;
&lt;br /&gt;
[[File:red_underlined3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Example 3'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:varyesterday.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
would give&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:variablestate.png]]&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=458</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=458"/>
				<updated>2017-05-23T12:57:51Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: left; clear: both; margin-right: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
[[File:Format.pdf|page=1|thumb|256px|A very nice article written by Professor Don Colton, at the Brigham Young University of Hawaii]]&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=457</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=457"/>
				<updated>2017-05-23T12:57:00Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
[[File:Format.pdf|page=1|thumb|256px|A very nice article written by Professor Don Colton, at the Brigham Young University of Hawaii]]&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=456</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=456"/>
				<updated>2017-05-23T12:45:44Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
:More info&lt;br /&gt;
::A very nice article written by Professor Don Colton, at the Brigham Young University of Hawaii:&lt;br /&gt;
[[File:Format.pdf|page=1|600px]]&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=455</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=455"/>
				<updated>2017-05-23T12:37:09Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
:More info&lt;br /&gt;
::A very nice article written by Professor Don Colton, at the Brigham Young University of Hawaii: &amp;lt;code&amp;gt;[[File:Format.pdf Secrets of printf|page=1|Secrets of &amp;quot;printf&amp;quot;]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=454</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=454"/>
				<updated>2017-05-23T12:33:42Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
:More info&lt;br /&gt;
::A very nice article written by Professor Don Colton, at the Brigham Young University of Hawaii&lt;br /&gt;
&lt;br /&gt;
[[File:Format.pdf|page=1|600px]]&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Functions&amp;diff=453</id>
		<title>Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Functions&amp;diff=453"/>
				<updated>2017-05-23T12:31:21Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Functions are extensions to expressions that allow data processing and conversion. Here is a list of all defined functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#String|String]] functions=&lt;br /&gt;
&lt;br /&gt;
==concat==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' concat(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is the concatenation of all the supplied values. This function accepts two or more input values.&lt;br /&gt;
&lt;br /&gt;
==contains==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' contains(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; is found anywhere in the &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==endsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' endsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; ends with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==format==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' format(''string'' formatString[, ''dynamic'' value1[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that is built based on the &amp;lt;code&amp;gt;formatString&amp;lt;/code&amp;gt; with arguments replaced by their corresponding values. Follows the java syntax for &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt;. See a quick reference [https://www.cs.colostate.edu/~cs160/.Summer16/resources/Java_printf_method_quick_reference.pdf here], or a more detailed reference [https://sharkysoft.com/archive/printf/docs/javadocs/lava/clib/stdio/doc-files/specification.htm Reference here].&lt;br /&gt;
::Each % in the format string represents an argument and corresponds to a value (in order of appearance) in the value list. Each argument can have formatting settings, according to the reference provided. &lt;br /&gt;
:Example&lt;br /&gt;
::&amp;lt;code&amp;gt;format('The temperature outside is %.2f degrees Fahrenheit', [Temp sensor:temperature])&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;The temperature outside is 71.26 degrees Fahrenheit&amp;lt;/code&amp;gt;&lt;br /&gt;
::The &amp;lt;code&amp;gt;%.2f&amp;lt;/code&amp;gt; translates to &amp;quot;format as &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;loat and use &amp;lt;code&amp;gt;.2&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
:More info&lt;br /&gt;
::[[File:Format.pdf|page=1|600px|caption|Secrets of printf]]&lt;br /&gt;
&lt;br /&gt;
==indexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' indexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the first occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;indexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lastIndexOf==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' lastIndexOf(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the character index of the last occurrence of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lastIndexOf(&amp;quot;hello world&amp;quot;, 'l')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==left==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' left(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the first &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;left(&amp;quot;hello world&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;he&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lower==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' lower(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all lower case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;hello world&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mid==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' mid(''string'' value, ''integer'' start[, ''integer'' count = remaining])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - provides the 0-based index of the first character to copy. If &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; is negative, the counting starts from the end of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; - provides the number of characters to copy from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. If not provided, all of the remaining characters from &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; are returned, starting with character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is negative, prior characters are returned.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a substring of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; characters long, starting at character number &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Note that the first character in any string has index 0.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2, 3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;llo World&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -5, 2)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Wo&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;mid(&amp;quot;Hello World&amp;quot;, -1, -3)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==random==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' random([''integer'' range | ''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; - an integer number representing a range&lt;br /&gt;
::&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;valueN&amp;lt;/code&amp;gt; - any kind of arguments, one will be randomly returned&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a random decimal number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if no arguments are provided, or a number between &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; (inclusive) if a single argument is provided, or a randomly selected argument if two or more arguments are provided.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;0.483&amp;lt;/code&amp;gt; (random decimal)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(20)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; (random integer)&lt;br /&gt;
::&amp;lt;code&amp;gt;random(&amp;quot;Hello World&amp;quot;, &amp;quot;Good morning&amp;quot;, &amp;quot;Hello&amp;quot;, &amp;quot;Hi&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello&amp;lt;/code&amp;gt; (randomly selected value)&lt;br /&gt;
&lt;br /&gt;
==replace==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' replace(''string'' haystack, ''string'' needle1, ''string'' replacement1[, .., ''string'' needleN, ''string'' replacementN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Replaces all the occurrences of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; with its respective &amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt;. Multiple pairs of &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;replacement&amp;lt;/code&amp;gt; can be provided in one function call.&lt;br /&gt;
:Regular expressions&lt;br /&gt;
::Needles support regular expressions when their value starts and ends with a &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;'/(\s)/'&amp;lt;/code&amp;gt; will match all spaces.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Hello', 'Hi')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hi Earth&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;replace(&amp;quot;Hello World&amp;quot;, 'World', 'Earth', 'Earth', 'Planet')&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello Planet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==right==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' right(''string'' value, ''integer'' length)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the last &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; characters in &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;right(&amp;quot;hello world&amp;quot;, 4)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;orld&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startsWith==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''boolean'' startsWith(''string'' haystack, ''string'' needle)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;haystack&amp;lt;/code&amp;gt; starts with the &amp;lt;code&amp;gt;needle&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==string==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' string(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; as a string.&lt;br /&gt;
&lt;br /&gt;
==substr==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==substring==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;mid()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==title==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' title(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but in its title case format (each word starts with a capitalized letter).&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello there world&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;Hello There World&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==upper==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' upper(''string'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; but with all upper case letters.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;lower(&amp;quot;Hello World&amp;quot;)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;HELLO WORLD&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==text==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;string()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Numeric functions=&lt;br /&gt;
&lt;br /&gt;
==avg==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' avg(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the mean average of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==ceil==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the immediately higher integer, equivalent to rounding the decimal away from zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;ceil(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ceiling==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==decimal==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' decimal(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; into a decimal. Returns &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not numeric.&lt;br /&gt;
&lt;br /&gt;
==float==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==floor==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''integer'' ceil(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the integer part of a decimal, equivalent to rounding the decimal towards zero.&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;floor(-5.6)&amp;lt;/code&amp;gt; outputs &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==max==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' max(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the maximum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==median==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' median(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the median average of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==min==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''dynamic'' min(''dynamic'' value1, ''dynamic'' value2[, .., ''dynamic'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the minimum of all the values provided. Note: this function works with both numbers and strings.&lt;br /&gt;
&lt;br /&gt;
==number==&lt;br /&gt;
:Alias of &amp;lt;code&amp;gt;decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==power==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' power(''decimal'' value, ''decimal'' exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; at the power of &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==round==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' round(''decimal'' value[, ''integer'' precision = 0])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; - the number of decimal places to be retained. If not provided, defaults to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the rounded &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;precision&amp;lt;/code&amp;gt; decimal places.&lt;br /&gt;
&lt;br /&gt;
==sqr==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqr(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the squared &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;, equivalent to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; multiplied by itself.&lt;br /&gt;
&lt;br /&gt;
==sqrt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sqrt(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the square root of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==stdev==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' stdev(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the standard deviation of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==sum==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' sum(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the sum of sum of all the values provided.&lt;br /&gt;
&lt;br /&gt;
==variance==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' variance(''decimal'' value1, ''decimal'' value2[, .., ''decimal'' valueN])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the variance of all the values provided.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Boolean|Boolean]] functions=&lt;br /&gt;
&lt;br /&gt;
==bool==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;bool(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the truth value of the input. Accepts anything as input and will return true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is either a non-zero number, a non-empty string (with some exceptions, see below), a non-empty device list, a non-empty date/time/datetime&lt;br /&gt;
&lt;br /&gt;
==boolean==&lt;br /&gt;
:This is an alias of [[Functions#bool|bool]]&lt;br /&gt;
&lt;br /&gt;
==eq==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;eq(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ge==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;ge(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==gt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;gt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isBetween==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isBetween(''dynamic'' value, ''dynamic'' startValue, ''dynamic'' endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is greater then or equal to &amp;lt;code&amp;gt;startValue&amp;lt;/code&amp;gt; and less than or equal to &amp;lt;code&amp;gt;endValue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isEmpty==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;isEmpty(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not set, an empty string, or zero&lt;br /&gt;
&lt;br /&gt;
==le==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;le(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than or equal to &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==lt==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;lt(''dynamic'' value1, ''dynamic'' value2)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns true if &amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt; is less than &amp;lt;code&amp;gt;value2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==not==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;not(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the negated truth state of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. This is the logical negation of &amp;lt;code&amp;gt;[[Functions#bool|bool]](''dynamic'' value)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=[[Variable_data_types#Date_and_Time|Date and time]] functions=&lt;br /&gt;
&lt;br /&gt;
==addDays==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addDays(''datetime'' value, ''integer'' days)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;days&amp;lt;/code&amp;gt; days before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addHours==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addHours(''datetime'' value, ''integer'' hours)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;hours&amp;lt;/code&amp;gt; hours before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addMinutes==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addMinutes(''datetime'' value, ''integer'' minutes)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;minutes&amp;lt;/code&amp;gt; minutes before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addSeconds==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addSeconds(''datetime'' value, ''integer'' seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;seconds&amp;lt;/code&amp;gt; seconds before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==addWeeks==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;addWeeks(''datetime'' value, ''integer'' weeks)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks after the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. For negative values of &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt;, it returns a datetime that is &amp;lt;code&amp;gt;weeks&amp;lt;/code&amp;gt; weeks before &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==date==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;date(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the date portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off time information.&lt;br /&gt;
&lt;br /&gt;
==datetime==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''datetime'' datetime(''dynamic'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Tries to convert any value into a datetime. Accepts strings in common date/time formats.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==formatDuration==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''string'' formatDuration(''datetime'' value[, ''boolean'' friendly = false[, ''string'' granularity = 's'[, ''boolean'' showAdverbs = false]]])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Arguments&lt;br /&gt;
::&amp;lt;code&amp;gt;friendly&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; makes the output compact, in the form of &amp;lt;code&amp;gt;0d 00:00:00.000&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; makes the output more human friendly, in the form of &amp;lt;code&amp;gt; 0 days, 0 hours, 0 minutes, and 0 seconds&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
::&amp;lt;code&amp;gt;granularity&amp;lt;/code&amp;gt; - represents the smallest time unit to be output. One of &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for days, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; for hours, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; for minutes, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for seconds, or &amp;lt;code&amp;gt;ms&amp;lt;/code&amp;gt; for milliseconds. Any time unit below the selected granularity will not be output. Defaults to &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;showAdverbs&amp;lt;/code&amp;gt; - only affects the friendly output, when &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; the words &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; (for future durations - positive input) or &amp;lt;code&amp;gt;ago&amp;lt;/code&amp;gt; (for past durations - negative input) are prepended or appended respectively to the output&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns a string that represents the duration in a human readable format&lt;br /&gt;
:Examples&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(12029)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:00:12&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;1 minute and 8 seconds&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, false, 'ms')&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;00:01:08&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;formatDuration(68493, true, 'm', true)&amp;lt;/code&amp;gt; will output &amp;lt;code&amp;gt;in 1 minute&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==time==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''time'' time(''datetime'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the time portion of &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; by stripping off date information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Weather related functions=&lt;br /&gt;
&lt;br /&gt;
==celsius==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' celsius(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Fahrenheit to Celsius.&lt;br /&gt;
&lt;br /&gt;
==dewPoint==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' dewPoint(''decimal'' temperature, ''decimal'' relativeHumidity[, ''string'' scale = 'F'])&amp;lt;/code&amp;gt;&lt;br /&gt;
:Parameters&lt;br /&gt;
::&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; - optional, one of &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;, corresponding to the temperature range used for &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;. The result will be provided in the same scale. If no scale is provided, the Fahrenheit scale will be used.&lt;br /&gt;
:Returns&lt;br /&gt;
::Returns the due temperature for a given temperature and relative humidity&lt;br /&gt;
&lt;br /&gt;
==fahrenheit==&lt;br /&gt;
:Syntax&lt;br /&gt;
::&amp;lt;code&amp;gt;''decimal'' fahrenheit(''decimal'' value)&amp;lt;/code&amp;gt;&lt;br /&gt;
:Returns&lt;br /&gt;
::Converts a temperature value from Celsius to Fahrenheit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Dynamic|Dynamic]] =&lt;br /&gt;
;if(condition, valueIfTrue, valueIfFalse)&lt;br /&gt;
:evaluates a boolean and returns value1 if true, or value2 otherwise&lt;br /&gt;
;least(values)&lt;br /&gt;
:returns the value that is least found a series of numeric values&lt;br /&gt;
;most(values)&lt;br /&gt;
:returns the value that is most found a series of numeric values&lt;br /&gt;
;previousValue([device;attribute])&lt;br /&gt;
:returns the previous value of the attribute&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Number_.28Integer.29|Integers]] =&lt;br /&gt;
;age([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the current value&lt;br /&gt;
;count(values)&lt;br /&gt;
:calculates the number of true/non-zero/non-empty items in a series of numeric values&lt;br /&gt;
;int()&lt;br /&gt;
://todo&lt;br /&gt;
;integer(decimal or string)&lt;br /&gt;
:converts a decimal value to it's integer value&lt;br /&gt;
;newer([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for less than the specified number of milliseconds&lt;br /&gt;
;older([device﹕attribute],[...], [device﹕attribute], threshold)&lt;br /&gt;
:returns the number of devices whose attribute had the current value for more than the specified number of milliseconds&lt;br /&gt;
;previousAge([device﹕attribute])&lt;br /&gt;
:returns the number of milliseconds an attribute had the previous value&lt;br /&gt;
&lt;br /&gt;
= [[Variable_data_types#Time|Time]] =&lt;br /&gt;
;time(value)&lt;br /&gt;
:returns the value as a time type&lt;br /&gt;
;addSeconds(dateTime, seconds)&lt;br /&gt;
:adds seconds to time, returns the value as a time type&lt;br /&gt;
;addMinutes(dateTime, minutes)&lt;br /&gt;
:adds minutes to time, returns the value as a time type&lt;br /&gt;
;addHours(dateTime, hours)&lt;br /&gt;
:adds hours to time, returns the value as a time type&lt;br /&gt;
;addDays(dateTime, days)&lt;br /&gt;
:adds days to time, returns the value as a time type&lt;br /&gt;
;addWeeks(dateTime, weeks)&lt;br /&gt;
:adds weeks to time, returns the value as a time type&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=File:Format.pdf&amp;diff=452</id>
		<title>File:Format.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=File:Format.pdf&amp;diff=452"/>
				<updated>2017-05-23T12:22:19Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Langtind&amp;diff=365</id>
		<title>User:Langtind</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Langtind&amp;diff=365"/>
				<updated>2017-05-14T18:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New to automation. Thing Webcore looks really cool and look forward to test it. I am from Norway and live in a house with a lot of automation possibilities. Lights, locks, heating are stuff that I hope to automate with the Samsung Smartthings. Hopefully I also get a lot of inspiration from the forum.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Langtind&amp;diff=366</id>
		<title>User talk:Langtind</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Langtind&amp;diff=366"/>
				<updated>2017-05-14T18:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 12:27, 14 May 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User:Dumb_Thing&amp;diff=359</id>
		<title>User:Dumb Thing</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User:Dumb_Thing&amp;diff=359"/>
				<updated>2017-05-12T20:59:53Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am based in the United Kingdom and am very new to the world SmartThings.  &lt;br /&gt;
I am a retired Science teacher with a curiosity about the world around me and about how things work.  &lt;br /&gt;
In order to try to keep my brain active I would like to try some coding so please be patient when total ignorance is displayed.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=User_talk:Dumb_Thing&amp;diff=360</id>
		<title>User talk:Dumb Thing</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=User_talk:Dumb_Thing&amp;diff=360"/>
				<updated>2017-05-12T20:59:53Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''webCoRE Wiki - Web-enabled Community's own Rule Engine''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:ady624|ady624]] ([[User talk:ady624|talk]]) 14:59, 12 May 2017 (MDT)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Manual_Install&amp;diff=356</id>
		<title>Manual Install</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Manual_Install&amp;diff=356"/>
				<updated>2017-05-09T23:44:32Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* webCoRE StorageSmart App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Summary=&lt;br /&gt;
These instructions will help you manually install webCoRE. It is recommended to do [[GitHub Install]], however these steps will also work.&lt;br /&gt;
&lt;br /&gt;
=Installing Source Code into SmartThings Cloud=&lt;br /&gt;
&lt;br /&gt;
You must create both the webCoRE and webCoRE Piston smart apps.  '''Follow all the steps below!'''&lt;br /&gt;
&lt;br /&gt;
== webCoRE Smart App ==&lt;br /&gt;
&lt;br /&gt;
# Login to the [http://developer.smartthings.com SmartThings web UI].&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore.src/webcore.groovy webCore.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save'''.&lt;br /&gt;
# Click '''Publish'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
== webCoRE Piston Smart App  ==&lt;br /&gt;
&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore-piston.src/webcore-piston.groovy webCoRE-piston.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save''' and wait for the loading circle to disappear.&lt;br /&gt;
# Click '''Publish''' and choose '''For Me'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
== webCoRE Storage Smart App ==&lt;br /&gt;
&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore-storage.src/webcore-storage.groovy webCoRE-storage.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save''' and wait for the loading circle to disappear.&lt;br /&gt;
# Click '''Publish''' and choose '''For Me'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
Note: The webCoRE source code has only been copied to your SmartThings cloud account. You must continue to the next step of [[Enable webCoRE OAuth]].&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Manual_Install&amp;diff=355</id>
		<title>Manual Install</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Manual_Install&amp;diff=355"/>
				<updated>2017-05-09T23:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* webCoRE Piston Smart App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Summary=&lt;br /&gt;
These instructions will help you manually install webCoRE. It is recommended to do [[GitHub Install]], however these steps will also work.&lt;br /&gt;
&lt;br /&gt;
=Installing Source Code into SmartThings Cloud=&lt;br /&gt;
&lt;br /&gt;
You must create both the webCoRE and webCoRE Piston smart apps.  '''Follow all the steps below!'''&lt;br /&gt;
&lt;br /&gt;
== webCoRE Smart App ==&lt;br /&gt;
&lt;br /&gt;
# Login to the [http://developer.smartthings.com SmartThings web UI].&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore.src/webcore.groovy webCore.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save'''.&lt;br /&gt;
# Click '''Publish'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
== webCoRE Piston Smart App  ==&lt;br /&gt;
&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore-piston.src/webcore-piston.groovy webCoRE-piston.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save''' and wait for the loading circle to disappear.&lt;br /&gt;
# Click '''Publish''' and choose '''For Me'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
== webCoRE StorageSmart App  ==&lt;br /&gt;
&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''New SmartApp''' button.&lt;br /&gt;
#:[[File:Newsmartapp.jpg]]&lt;br /&gt;
# Select the '''From Code''' tab.&lt;br /&gt;
#:[[File:Fromcode.jpg]]&lt;br /&gt;
# Copy all of the code from the [https://raw.githubusercontent.com/ady624/webCoRE/master/smartapps/ady624/webcore-storage.src/webcore-storage.groovy webCoRE-storage.groovy] file into the box.&lt;br /&gt;
# Click '''Create'''.&lt;br /&gt;
#:[[File:Createcode.jpg]]&lt;br /&gt;
# Click '''Save''' and wait for the loading circle to disappear.&lt;br /&gt;
# Click '''Publish''' and choose '''For Me'''.&lt;br /&gt;
#:[[File:Savepublish.jpg]]&lt;br /&gt;
&lt;br /&gt;
Note: The webCoRE source code has only been copied to your SmartThings cloud account. You must continue to the next step of [[Enable webCoRE OAuth]].&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=354</id>
		<title>GitHub Install</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=GitHub_Install&amp;diff=354"/>
				<updated>2017-05-09T23:42:59Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Summary=&lt;br /&gt;
These instructions will help you install webCoRE via GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=Installing Source Code into SmartThings Cloud=&lt;br /&gt;
# Login to the [http://developer.smartthings.com SmartThings web UI].&lt;br /&gt;
# Click on '''My SmartApps'''.&lt;br /&gt;
#:[[File:Mysmartapps.jpg]]&lt;br /&gt;
# Click the '''Settings''' button at the top of the page.&lt;br /&gt;
#:[[File:Settings.jpg]]&lt;br /&gt;
# Click the '''Add new repository''' link at the bottom of the pop up.&lt;br /&gt;
# Enter &amp;quot;ady624&amp;quot; in the '''Owner''' column.&lt;br /&gt;
# Enter &amp;quot;webCoRE&amp;quot; in the '''Name''' column.&lt;br /&gt;
# Enter &amp;quot;master&amp;quot; in the '''Branch''' column.&lt;br /&gt;
# Click '''Save''' (do not hit the Enter key, it will exit the form without saving).&lt;br /&gt;
#:[[File:Githubrepo.jpg]]&lt;br /&gt;
# Click '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCore.groovy&amp;quot; from the '''New (only in GitHub)''' box. (Do not update both at once.)&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
# Click again on '''Update From Repo'''.&lt;br /&gt;
# Select '''webCoRE (master)''' from the list.&lt;br /&gt;
#:[[File:Update.jpg]]&lt;br /&gt;
# Check &amp;quot;webCoRE Piston.groovy&amp;quot; and &amp;quot;webCoRE Storage.groovy&amp;quot; from the '''New (only in GitHub)''' box.&lt;br /&gt;
# Check the '''Publish''' checkbox at the bottom of the pop up.&lt;br /&gt;
# Click the '''Execute Update''' button.&lt;br /&gt;
&lt;br /&gt;
Note: The webCoRE source code has only been copied to your SmartThings cloud account. You must continue to the next step of [[Enable webCoRE OAuth]].&lt;br /&gt;
&lt;br /&gt;
==Github Installation Troubleshooting==&lt;br /&gt;
[[File:500error.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
If you receive this error it may be because you installed and published both &amp;quot;webCore.groovy&amp;quot; and &amp;quot;webCore Piston.groovy&amp;quot; at the same time. Please do them individually (one at a time) per the instructions. Be sure to install/publish &amp;quot;webCore.groovy&amp;quot; first then &amp;quot;webCore Piston.groovy&amp;quot; after.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=353</id>
		<title>WebCoRE todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_todo&amp;diff=353"/>
				<updated>2017-05-09T22:41:33Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|Just because a feature is on this list, doesn't mean that [https://community.smartthings.com/users/ady624/summary ady624] will implement it.}}&lt;br /&gt;
{{warning|This list may not be complete. If you find something that is not on the list that has not been implemented don't complain, add it!}}&lt;br /&gt;
&lt;br /&gt;
The following is a list of missing features or known issues (in a somewhat priority order):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Virtual tasks - add the lot (in progress)&lt;br /&gt;
# Superglobal variables publication to other locations&lt;br /&gt;
# AskAlexa Message Queue integration&lt;br /&gt;
# Twilio integration&lt;br /&gt;
# NFL integration&lt;br /&gt;
# Physical / Programmatic Switch Support&lt;br /&gt;
# Lock code support&lt;br /&gt;
# Prevent already scheduled tasks from executing during restrictions&lt;br /&gt;
# Command optimizations&lt;br /&gt;
# Way to identify devices that are selected but not used&lt;br /&gt;
# Import from Red Piston Picture&lt;br /&gt;
# Backup/Restore Pistons to/from local storage&lt;br /&gt;
&lt;br /&gt;
Resolved (or believed to be resolved) issues:&lt;br /&gt;
# &amp;lt;del&amp;gt;Smart Home Monitor&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Location Mode&amp;lt;/del&amp;gt; (3/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time Triggers (every x minutes/hours/days/etc do)&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Color support&amp;lt;/del&amp;gt; (4/12/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Cancellation Policy|TCP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;[[Task Execution Policy|TEP]]&amp;lt;/del&amp;gt; (4/13/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute other pistons&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Wait until &amp;amp;lt;time&amp;amp;gt;&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Execute Routines&amp;lt;/del&amp;gt; (4/15/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Multiple choice conditions (any of, not any of)&amp;lt;/del&amp;gt; (4/16/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Web service calls with location (needs clarification)&amp;lt;/del&amp;gt; (4/17/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Task mode restrictions&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time conditions/restrictions (time is before/between/after)&amp;lt;/del&amp;gt; (4/18/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Date conditions/restrictions (date is before/between/after)&amp;lt;/del&amp;gt; (4/19/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed conditions (changed, was / were)&amp;lt;/del&amp;gt; (4/20/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Masking phone numbers while sharing pistons&amp;lt;/del&amp;gt; (4/21/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Superglobal variables&amp;lt;/del&amp;gt; (4/22/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Global/superglobal variables triggers on change&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers (stays/stay)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Time condition offsets&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Use of variables inside conditions and restrictions (same as they can be used in actions)&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Store condition matching/non-matching device list to variable&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Subscribe to Routines Events&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;AskAlexa integration&amp;lt;/del&amp;gt; (4/24/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Custom commands with parameters&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Copy&amp;amp;Paste support inside piston editor&amp;lt;/del&amp;gt; (4/25/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration(value, friendly, granularity, showAdverbs)&amp;lt;/del&amp;gt; (4/23/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Contact support for notifications&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Timed triggers with multiple devices and Any aggregation&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;IFTTT event arguments parsing&amp;lt;/del&amp;gt; (4/26/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;formatDuration( )&amp;lt;/del&amp;gt; (5/3/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Power Cut Detection&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to Random State&amp;lt;/del&amp;gt; (5/8/2017)&lt;br /&gt;
# &amp;lt;del&amp;gt;Turn X switch to {variable} State&amp;lt;/del&amp;gt; (5/8/2017)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=352</id>
		<title>webCoRE</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=352"/>
				<updated>2017-05-08T16:57:05Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General ==&lt;br /&gt;
The ''web Community's own Rule Engine'' (or for short, webCoRE) is a general rule engine for SmartThings. It works by allowing users to create scripts that are interpreted and executed by the SmartThings SmartApp, allowing for complex decisions. webCoRE is currently a work in progress. webCoRE reached the first Beta milestone on April 29, 2017 (version v0.1.097.20170429) Please review the [[webCoRE todo]] list.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
A few steps need to be completed before you can use webCoRE. First, webCoRE needs to be installed in your SmartThings account, then automations need to be configured. These are called [[Piston|pistons]] and will be detailed later. So let's start by installing webCoRE, please follow the 5 steps below.&lt;br /&gt;
&lt;br /&gt;
== Installing webCoRE ==&lt;br /&gt;
You must complete all of these steps.&lt;br /&gt;
&lt;br /&gt;
# [[GitHub Install]] or [[Manual Install]] of webCoRE source code into the SmartThings Cloud&lt;br /&gt;
# [[Enable webCoRE OAuth]] in the SmartThings cloud&lt;br /&gt;
# [[Install webCoRE]] in the SmartThings mobile app&lt;br /&gt;
# [[Enabling webCoRE dashboard]]&lt;br /&gt;
# [[Enable webCoRE on Another Device]]&lt;br /&gt;
&lt;br /&gt;
== Understanding the basics ==&lt;br /&gt;
webCoRE is comprised of the three main components listed below.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE child SmartApp (''webCoRE Piston'') ===&lt;br /&gt;
The webCoRE child SmartApp is also known as a [[Piston|piston]]. It is responsible for executing the automation script that the user creates and does the heavy lifting in the whole webCoRE ecosystem. It is directly managed by the webCoRE parent SmartApp, which can create, maintain, and delete a Piston.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE parent SmartApp (''webCoRE'') ===&lt;br /&gt;
The wabCoRE parent SmartApp is the component responsible for managing the child SmartApp instances and their relationship with the Dashboard. It is the middle man that allows adding new Pistons, maintaining them, or deleting them. It is also responsible with the security of the whole ecosystem, allowing password secured access from the Dashboard.&lt;br /&gt;
&lt;br /&gt;
=== The [[Dashboard|dashboard]] ===&lt;br /&gt;
The Dashboard is an [https://en.wikipedia.org/wiki/HTML HTML] interface for webCoRE that allows users to manage their webCoRE installation. It is the central hub to controlling webCoRE, allowing the user to create, modify, test, and delete Pistons.&lt;br /&gt;
&lt;br /&gt;
==Anatomy of a webCoRE Piston==&lt;br /&gt;
::''Main article [[Piston]]''&lt;br /&gt;
A piston is a script that contains a collection of elements, arranged so that the logic and flow of the piston perform tasks in a desired sequence. It is broken down into several sections, each having its own important role.&lt;br /&gt;
&lt;br /&gt;
//todo: most details below need to be moved into the main article&lt;br /&gt;
&lt;br /&gt;
===The ''settings'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show piston settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
These settings allows configuration of how certain aspects of the piston function. &lt;br /&gt;
&lt;br /&gt;
[[file:pistonsettings.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Name''' - Change the name of a piston.&lt;br /&gt;
*'''Description''' - Give a description of what the piston does.&lt;br /&gt;
*'''Automatic piston state''' - Change whether the piston handles it state or make it manual and you can control the piston's state.&lt;br /&gt;
*'''Piston execution parallelism''' - //todo&lt;br /&gt;
*'''Condition traversal optimizations''' - //todo&lt;br /&gt;
*'''Event subscriptions''' - Allow event subscriptions or turn them off if you would like to make the piston a follow up style piston.  If you disable this then you must have some other means for the piston to be fired.&lt;br /&gt;
*'''Command execution delay''' - A delay in milliseconds for commands to be executed piston wide.&lt;br /&gt;
&lt;br /&gt;
===The ''define'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show variables&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
A very powerful feature of webCoRE is the ability to use [[Variable|variables]]. Think of variables as temporary pockets where you can store information and are able to later retrieve and use this information for any purpose. This information can be used either during the current piston run, or at a later time, when another event occurs.&lt;br /&gt;
&lt;br /&gt;
[[file:pistondefine.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Type''' - You can select from the different [[Variable Data Types|Variable_data_types]] for you variable.&lt;br /&gt;
*'''Name''' - This is the empty box next to the type.  Enter a name for your variable.&lt;br /&gt;
*'''Initial value''' - This is defaulted to &amp;lt;code&amp;gt;Nothing selected&amp;lt;/code&amp;gt;.  If you decide to give it an initial value then that value will be used at each piston run regardless of what is stored in later piston runs.&lt;br /&gt;
*'''Description''' - Give a description of what the variable is used for.&lt;br /&gt;
&lt;br /&gt;
===The ''execute'' section===&lt;br /&gt;
This section describes the piston's logic flow. This is the starting point of most executions. Whenever a device event happens, the piston starts its execution here.  To get started click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:executesimple.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are you 3 basic building blocks with their description listed below them.  There are several more options to choose from aside from these three. In order to gain access to these you will again have to visit that trusty options menu in the top right hand corner and select &amp;lt;code&amp;gt;Show advanced statments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you do this and you click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt; you will now have access to all the available statement options.&lt;br /&gt;
&lt;br /&gt;
[[file:executeadvanced.png]]&lt;br /&gt;
&lt;br /&gt;
==Other Details==&lt;br /&gt;
# [[webCore Logging]]&lt;br /&gt;
# [[Functions]]&lt;br /&gt;
&lt;br /&gt;
== Creating your first piston ==&lt;br /&gt;
&lt;br /&gt;
Once you finished the installation steps above, let's go ahead and create the first piston, the famous [[Hello World!|Hello World]].&lt;br /&gt;
&lt;br /&gt;
==Sample Pistons==&lt;br /&gt;
This section has some user contributed sample pistons.  You can import any of these pistons using the import code displayed at the top of the piston.&lt;br /&gt;
# [[Samples]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo keywords=&amp;quot;webCoRE,dashboard,smart home,automation,SmartThings,rule engine,zigbee,z-wave,smart device&amp;quot; description=&amp;quot;The official wiki for webCoRE, the Web-enabled Community's own Rule Engine SmartApp&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=351</id>
		<title>webCoRE</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=351"/>
				<updated>2017-05-08T16:50:46Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General ==&lt;br /&gt;
The ''web Community's own Rule Engine'' (or for short, webCoRE) is a general rule engine for SmartThings. It works by allowing users to create scripts that are interpreted and executed by the SmartThings SmartApp, allowing for complex decisions. webCoRE is currently a work in progress. webCoRE reached the first Beta milestone on April 29, 2017 (version v0.1.097.20170429) Please review the [[webCoRE todo]] list.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
A few steps need to be completed before you can use webCoRE. First, webCoRE needs to be installed in your SmartThings account, then automations need to be configured. These are called [[Piston|pistons]] and will be detailed later. So let's start by installing webCoRE, please follow the 5 steps below.&lt;br /&gt;
&lt;br /&gt;
== Installing webCoRE ==&lt;br /&gt;
You must complete all of these steps.&lt;br /&gt;
&lt;br /&gt;
# [[GitHub Install]] or [[Manual Install]] of webCoRE source code into the SmartThings Cloud&lt;br /&gt;
# [[Enable webCoRE OAuth]] in the SmartThings cloud&lt;br /&gt;
# [[Install webCoRE]] in the SmartThings mobile app&lt;br /&gt;
# [[Enabling webCoRE dashboard]]&lt;br /&gt;
# [[Enable webCoRE on Another Device]]&lt;br /&gt;
&lt;br /&gt;
== Understanding the basics ==&lt;br /&gt;
webCoRE is comprised of the three main components listed below.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE child SmartApp (''webCoRE Piston'') ===&lt;br /&gt;
The webCoRE child SmartApp is also known as a [[Piston|piston]]. It is responsible for executing the automation script that the user creates and does the heavy lifting in the whole webCoRE ecosystem. It is directly managed by the webCoRE parent SmartApp, which can create, maintain, and delete a Piston.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE parent SmartApp (''webCoRE'') ===&lt;br /&gt;
The wabCoRE parent SmartApp is the component responsible for managing the child SmartApp instances and their relationship with the Dashboard. It is the middle man that allows adding new Pistons, maintaining them, or deleting them. It is also responsible with the security of the whole ecosystem, allowing password secured access from the Dashboard.&lt;br /&gt;
&lt;br /&gt;
=== The [[Dashboard|dashboard]] ===&lt;br /&gt;
The Dashboard is an [https://en.wikipedia.org/wiki/HTML HTML] interface for webCoRE that allows users to manage their webCoRE installation. It is the central hub to controlling webCoRE, allowing the user to create, modify, test, and delete Pistons.&lt;br /&gt;
&lt;br /&gt;
==Anatomy of a webCoRE Piston==&lt;br /&gt;
::''Main article [[Piston]]''&lt;br /&gt;
A piston is a script that contains a collection of elements, arranged so that the logic and flow of the piston perform tasks in a desired sequence. It is broken down into several sections, each having its own important role.&lt;br /&gt;
&lt;br /&gt;
//todo: most details below need to be moved into the main article&lt;br /&gt;
&lt;br /&gt;
===The ''settings'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show piston settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
These settings allows configuration of how certain aspects of the piston function. &lt;br /&gt;
&lt;br /&gt;
[[file:pistonsettings.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Name''' - Change the name of a piston.&lt;br /&gt;
*'''Description''' - Give a description of what the piston does.&lt;br /&gt;
*'''Automatic piston state''' - Change whether the piston handles it state or make it manual and you can control the piston's state.&lt;br /&gt;
*'''Piston execution parallelism''' - //todo&lt;br /&gt;
*'''Condition traversal optimizations''' - //todo&lt;br /&gt;
*'''Event subscriptions''' - Allow event subscriptions or turn them off if you would like to make the piston a follow up style piston.  If you disable this then you must have some other means for the piston to be fired.&lt;br /&gt;
*'''Command execution delay''' - A delay in milliseconds for commands to be executed piston wide.&lt;br /&gt;
&lt;br /&gt;
===The ''define'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show variables&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
A very powerful feature of webCoRE is the ability to use [[Variable|variables]]. Think of variables as temporary pockets where you can store information and are able to later retrieve and use this information for any purpose. This information can be used either during the current piston run, or at a later time, when another event occurs.&lt;br /&gt;
&lt;br /&gt;
[[file:pistondefine.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Type''' - You can select from the different [[Variable Data Types|Variable_data_types]] for you variable.&lt;br /&gt;
*'''Name''' - This is the empty box next to the type.  Enter a name for your variable.&lt;br /&gt;
*'''Initial value''' - This is defaulted to &amp;lt;code&amp;gt;Nothing selected&amp;lt;/code&amp;gt;.  If you decide to give it an initial value then that value will be used at each piston run regardless of what is stored in later piston runs.&lt;br /&gt;
*'''Description''' - Give a description of what the variable is used for.&lt;br /&gt;
&lt;br /&gt;
===The ''execute'' section===&lt;br /&gt;
This section describes the piston's logic flow. This is the starting point of most executions. Whenever a device event happens, the piston starts its execution here.  To get started click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:executesimple.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are you 3 basic building blocks with their description listed below them.  There are several more options to choose from aside from these three. In order to gain access to these you will again have to visit that trusty options menu in the top right hand corner and select &amp;lt;code&amp;gt;Show advanced statments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you do this and you click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt; you will now have access to all the available statement options.&lt;br /&gt;
&lt;br /&gt;
[[file:executeadvanced.png]]&lt;br /&gt;
&lt;br /&gt;
==Other Details==&lt;br /&gt;
# [[webCore Logging]]&lt;br /&gt;
# [[Functions]]&lt;br /&gt;
&lt;br /&gt;
== Creating your first piston ==&lt;br /&gt;
&lt;br /&gt;
Once you finished the installation steps above, let's go ahead and create the first piston, the famous [[Hello World!|Hello World]].&lt;br /&gt;
&lt;br /&gt;
==Sample Pistons==&lt;br /&gt;
This section has some user contributed sample pistons.  You can import any of these pistons using the import code displayed at the top of the piston.&lt;br /&gt;
# [[Samples]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo keywords=&amp;quot;webCoRE,dashboard,smart home,automation,SmartThings,rule engine,piston,zigbee,z-wave,smart device&amp;quot; description=&amp;quot;The official wiki for webCoRE, the Web-enabled Community's own Rule Engine SmartApp&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=350</id>
		<title>MediaWiki:Lastmodifiedat</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=350"/>
				<updated>2017-05-08T16:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align: center&amp;quot; id=&amp;quot;chitikaAdBlock-1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
This page was last modified on $1, at $2.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=349</id>
		<title>MediaWiki:Lastmodifiedat</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=349"/>
				<updated>2017-05-08T16:29:42Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;nowiki&amp;gt;&amp;lt;iframe src=&amp;quot;//rcm-na.amazon-adsystem.com/e/cm?o=1&amp;amp;p=48&amp;amp;l=ur1&amp;amp;category=electronics&amp;amp;f=ifr&amp;amp;linkID=e9d2899a521a73a6c345119e912ff7fa&amp;amp;t=ady624-20&amp;amp;tracking_id=ady624-20&amp;quot; width=&amp;quot;728&amp;quot; height=&amp;quot;90&amp;quot; scrolling=&amp;quot;no&amp;quot; border=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot; style=&amp;quot;border:none;&amp;quot; frameborder=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center&amp;quot; id=&amp;quot;chitikaAdBlock-1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
This page was last modified on $1, at $2.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=348</id>
		<title>MediaWiki:Lastmodifiedat</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Lastmodifiedat&amp;diff=348"/>
				<updated>2017-05-08T16:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;iframe src=&amp;quot;//rcm-na.amazon-adsystem.com/e/cm?o=1&amp;amp;p=48&amp;amp;l=ur1&amp;amp;category=electronics&amp;amp;f=ifr&amp;amp;linkID=e9d2899a521a73a6c345119e912ff7fa&amp;amp;t=ady624-20&amp;amp;tracking_id=ady624-20&amp;quot; width=&amp;quot;728&amp;quot; height=&amp;quot;90&amp;quot; scrolling=&amp;quot;no&amp;quot; border=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot; style=&amp;quot;border:none;&amp;quot; frameborder=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center&amp;quot; id=&amp;quot;chitikaAdBlock-1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
This page was last modified on $1, at $2.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=347</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=347"/>
				<updated>2017-05-08T16:19:43Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
window.CHITIKA = { 'units' : [&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:160,&amp;quot;height&amp;quot;:600,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;},&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:728,&amp;quot;height&amp;quot;:90,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;}&lt;br /&gt;
] };&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//cdn.chitika.net/getads.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
&lt;br /&gt;
var infolinks_pid = 2996624;&lt;br /&gt;
var infolinks_wsid = 0;&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//resources.infolinks.com/js/infolinks_main.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US&amp;amp;adInstanceId=1c018b1f-0af0-4396-a510-867f9bdae50d';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
*/&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=346</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=346"/>
				<updated>2017-05-08T16:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
window.CHITIKA = { 'units' : [&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:160,&amp;quot;height&amp;quot;:600,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;},&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:728,&amp;quot;height&amp;quot;:90,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;}&lt;br /&gt;
] };&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//cdn.chitika.net/getads.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
&lt;br /&gt;
var infolinks_pid = 2996624;&lt;br /&gt;
var infolinks_wsid = 0;&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//resources.infolinks.com/js/infolinks_main.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US&amp;amp;adInstanceId=1c018b1f-0af0-4396-a510-867f9bdae50d';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=345</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=345"/>
				<updated>2017-05-08T14:51:19Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
window.CHITIKA = { 'units' : [&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:160,&amp;quot;height&amp;quot;:600,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;},&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:728,&amp;quot;height&amp;quot;:90,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;}&lt;br /&gt;
] };&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//cdn.chitika.net/getads.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
&lt;br /&gt;
var infolinks_pid = 2996624;&lt;br /&gt;
var infolinks_wsid = 0;&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//resources.infolinks.com/js/infolinks_main.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;br /&gt;
*/&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=344</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=MediaWiki:Common.js&amp;diff=344"/>
				<updated>2017-05-08T14:26:19Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
window.CHITIKA = { 'units' : [&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:160,&amp;quot;height&amp;quot;:600,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;},&lt;br /&gt;
   {&amp;quot;calltype&amp;quot;:&amp;quot;async[2]&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;ady624&amp;quot;,&amp;quot;width&amp;quot;:728,&amp;quot;height&amp;quot;:90,&amp;quot;sid&amp;quot;:&amp;quot;Chitika Default&amp;quot;}&lt;br /&gt;
] };&lt;br /&gt;
&lt;br /&gt;
var script = document.createElement('script');&lt;br /&gt;
script.type = 'text/javascript';&lt;br /&gt;
script.src = '//cdn.chitika.net/getads.js';&lt;br /&gt;
script.async = true;&lt;br /&gt;
document.head.appendChild(script);&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Piston&amp;diff=338</id>
		<title>Piston</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Piston&amp;diff=338"/>
				<updated>2017-05-07T14:08:19Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* Decisional statements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Pistons are the constituent block of webCoRE. You can create as many pistons as you need and each will follow their script to implement the automation you need. In essence, a piston is an organized collection of basic elements, each element having its own role in the structure. The basic elements that work together are described below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anatomy==&lt;br /&gt;
===Section===&lt;br /&gt;
A section groups together elements that share a role together. There are four types of sections in a piston:&lt;br /&gt;
* The ''settings'' section&lt;br /&gt;
* The ''define'' section &lt;br /&gt;
* The ''function'' section &lt;br /&gt;
* The ''execute'' section&lt;br /&gt;
&lt;br /&gt;
===Statement===&lt;br /&gt;
A statement is the main building block of a piston script. There are two kinds of statements: ''executive'' and ''decisional''.&lt;br /&gt;
&lt;br /&gt;
====Executive statements====&lt;br /&gt;
Executive statements are the statements that ''execute'' things, they can turn lights on, they can control devices in general.&lt;br /&gt;
* [[Action]] - Construct for executing an action&lt;br /&gt;
* [[Do]] - Construct for grouping other statements together&lt;br /&gt;
&lt;br /&gt;
====Decisional statements====&lt;br /&gt;
In contrast with the executive statements, the ''decisional'' statements cannot control devices, but can decide and alter the execution path based on input from devices by controlling the logical flow of the execution.&lt;br /&gt;
&lt;br /&gt;
* [[If Block]] - Simple statement for checking conditions.&lt;br /&gt;
* [[Timer]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[On]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Switch]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Each Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[While Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Repeat]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Break]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Exit]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Condition===&lt;br /&gt;
Most decisional statements rely on ''conditions'' to alter the execution logical flow. A condition is a collection of one or more comparisons (described below). It returns a boolean (true/false) value that is then used by the statement to direct the flow.&lt;br /&gt;
&lt;br /&gt;
===Condition Group===&lt;br /&gt;
A condition group is a collection of conditions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Restriction===&lt;br /&gt;
Effectively a downsized condition, not able to subscribe to events or execute statements on true/false evaluations (an advanced feature of conditions)&lt;br /&gt;
&lt;br /&gt;
===Restriction Group===&lt;br /&gt;
A restriction group is a collection of restrictions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Comparison===&lt;br /&gt;
A comparison is a logical operation that involves one operator and one to three operands. The operator is applied to the operands and the result is returned as a boolean (true/false) value. It is the core evaluation block of webCoRE. When a comparison is performed, all the operands are evaluated and then compared using the operator.&lt;br /&gt;
&lt;br /&gt;
===Operator===&lt;br /&gt;
An operator is a mathematical symbol or conditional construction that determines the type of operation to be performed. Some mathematical operators are ''+'' (addition), ''-'' (subtraction), ''%'' (modulus), ''&amp;amp;'' (logical AND), ''|'' (logical OR), etc. Some logical operators include ''is''/''is equal'' (equality), ''is less than'', ''is greater than'', ''is different than'', etc. &lt;br /&gt;
&lt;br /&gt;
===Operand===&lt;br /&gt;
An operand is a generic term for a value that is used in a comparison. webCoRE defines several types of operands:&lt;br /&gt;
* Physical Device&lt;br /&gt;
:A physical device operand represents one or more devices paired with an attribute. When evaluated, the attribute of the selected device is returned&lt;br /&gt;
* Virtual Device&lt;br /&gt;
:A virtual device operand represents the current state/value of a virtual device. Generally, virtual devices are entities that do not exist physically. Examples of virtual devices are Time, Location Mode, Smart Home Status, IFTTT, AskAlexa macros, EchoSistant profiles, etc.&lt;br /&gt;
* Variable&lt;br /&gt;
:A variable operand points to a variable whose value is then returned as part of the evaluation.&lt;br /&gt;
* Value&lt;br /&gt;
:A value operand is the most basic of operands, usually consisting of a constant string, integer, time, depending on the operand data type. Values are capable of containing expressions, simply include them inside curly brackets { }. Examples of values are 'on', 'Away', 'Everybody left', 77.0, 'The location mode is {$locationMode}'&lt;br /&gt;
* [[Expression]]&lt;br /&gt;
:An expression operand is the most advanced of operands, allowing for more complicated calculations to be performed. They allow mathematical operations, logical operations, functions, concatenation, etc. Some examples of expressions are ''1 + 2'', ''$hour * 60 + $minute'', ''[$currentEventDevice:switch]''.&lt;br /&gt;
* Argument&lt;br /&gt;
:An argument operand is a way of retrieving data that has been passed to the piston through the various execution channels. For example, an IFTTT trigger can pass data to a piston, and that data can be read via the argument operands.&lt;br /&gt;
&lt;br /&gt;
===Expression===&lt;br /&gt;
:''Main article: [[Expression]]''&lt;br /&gt;
&lt;br /&gt;
An [[Expression|expression]] is a complex mathematical construction that allows more advanced use of resources available to pistons. You can use an expression to calculate data based on input, such as finding out the dew point, or the average of a set of values, or the minimum value, or write a string in a desired format, etc.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Piston&amp;diff=337</id>
		<title>Piston</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Piston&amp;diff=337"/>
				<updated>2017-05-07T14:07:58Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* Executive statements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Pistons are the constituent block of webCoRE. You can create as many pistons as you need and each will follow their script to implement the automation you need. In essence, a piston is an organized collection of basic elements, each element having its own role in the structure. The basic elements that work together are described below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anatomy==&lt;br /&gt;
===Section===&lt;br /&gt;
A section groups together elements that share a role together. There are four types of sections in a piston:&lt;br /&gt;
* The ''settings'' section&lt;br /&gt;
* The ''define'' section &lt;br /&gt;
* The ''function'' section &lt;br /&gt;
* The ''execute'' section&lt;br /&gt;
&lt;br /&gt;
===Statement===&lt;br /&gt;
A statement is the main building block of a piston script. There are two kinds of statements: ''executive'' and ''decisional''.&lt;br /&gt;
&lt;br /&gt;
====Executive statements====&lt;br /&gt;
Executive statements are the statements that ''execute'' things, they can turn lights on, they can control devices in general.&lt;br /&gt;
* [[Action]] - Construct for executing an action&lt;br /&gt;
* [[Do]] - Construct for grouping other statements together&lt;br /&gt;
&lt;br /&gt;
====Decisional statements====&lt;br /&gt;
In contrast with the executive statements, the ''decisional'' statements cannot control devices, but can decide and alter the execution path based on input from devices by controlling the logical flow of the execution.&lt;br /&gt;
&lt;br /&gt;
* [[If Block]] - Simple statement for checking conditions.&lt;br /&gt;
* [[Timer]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Switch]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Each Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[While Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Repeat]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Break]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Exit]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Condition===&lt;br /&gt;
Most decisional statements rely on ''conditions'' to alter the execution logical flow. A condition is a collection of one or more comparisons (described below). It returns a boolean (true/false) value that is then used by the statement to direct the flow.&lt;br /&gt;
&lt;br /&gt;
===Condition Group===&lt;br /&gt;
A condition group is a collection of conditions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Restriction===&lt;br /&gt;
Effectively a downsized condition, not able to subscribe to events or execute statements on true/false evaluations (an advanced feature of conditions)&lt;br /&gt;
&lt;br /&gt;
===Restriction Group===&lt;br /&gt;
A restriction group is a collection of restrictions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Comparison===&lt;br /&gt;
A comparison is a logical operation that involves one operator and one to three operands. The operator is applied to the operands and the result is returned as a boolean (true/false) value. It is the core evaluation block of webCoRE. When a comparison is performed, all the operands are evaluated and then compared using the operator.&lt;br /&gt;
&lt;br /&gt;
===Operator===&lt;br /&gt;
An operator is a mathematical symbol or conditional construction that determines the type of operation to be performed. Some mathematical operators are ''+'' (addition), ''-'' (subtraction), ''%'' (modulus), ''&amp;amp;'' (logical AND), ''|'' (logical OR), etc. Some logical operators include ''is''/''is equal'' (equality), ''is less than'', ''is greater than'', ''is different than'', etc. &lt;br /&gt;
&lt;br /&gt;
===Operand===&lt;br /&gt;
An operand is a generic term for a value that is used in a comparison. webCoRE defines several types of operands:&lt;br /&gt;
* Physical Device&lt;br /&gt;
:A physical device operand represents one or more devices paired with an attribute. When evaluated, the attribute of the selected device is returned&lt;br /&gt;
* Virtual Device&lt;br /&gt;
:A virtual device operand represents the current state/value of a virtual device. Generally, virtual devices are entities that do not exist physically. Examples of virtual devices are Time, Location Mode, Smart Home Status, IFTTT, AskAlexa macros, EchoSistant profiles, etc.&lt;br /&gt;
* Variable&lt;br /&gt;
:A variable operand points to a variable whose value is then returned as part of the evaluation.&lt;br /&gt;
* Value&lt;br /&gt;
:A value operand is the most basic of operands, usually consisting of a constant string, integer, time, depending on the operand data type. Values are capable of containing expressions, simply include them inside curly brackets { }. Examples of values are 'on', 'Away', 'Everybody left', 77.0, 'The location mode is {$locationMode}'&lt;br /&gt;
* [[Expression]]&lt;br /&gt;
:An expression operand is the most advanced of operands, allowing for more complicated calculations to be performed. They allow mathematical operations, logical operations, functions, concatenation, etc. Some examples of expressions are ''1 + 2'', ''$hour * 60 + $minute'', ''[$currentEventDevice:switch]''.&lt;br /&gt;
* Argument&lt;br /&gt;
:An argument operand is a way of retrieving data that has been passed to the piston through the various execution channels. For example, an IFTTT trigger can pass data to a piston, and that data can be read via the argument operands.&lt;br /&gt;
&lt;br /&gt;
===Expression===&lt;br /&gt;
:''Main article: [[Expression]]''&lt;br /&gt;
&lt;br /&gt;
An [[Expression|expression]] is a complex mathematical construction that allows more advanced use of resources available to pistons. You can use an expression to calculate data based on input, such as finding out the dew point, or the average of a set of values, or the minimum value, or write a string in a desired format, etc.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Piston&amp;diff=336</id>
		<title>Piston</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Piston&amp;diff=336"/>
				<updated>2017-05-07T14:06:47Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: both; margin-left: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Pistons are the constituent block of webCoRE. You can create as many pistons as you need and each will follow their script to implement the automation you need. In essence, a piston is an organized collection of basic elements, each element having its own role in the structure. The basic elements that work together are described below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anatomy==&lt;br /&gt;
===Section===&lt;br /&gt;
A section groups together elements that share a role together. There are four types of sections in a piston:&lt;br /&gt;
* The ''settings'' section&lt;br /&gt;
* The ''define'' section &lt;br /&gt;
* The ''function'' section &lt;br /&gt;
* The ''execute'' section&lt;br /&gt;
&lt;br /&gt;
===Statement===&lt;br /&gt;
A statement is the main building block of a piston script. There are two kinds of statements: ''executive'' and ''decisional''.&lt;br /&gt;
&lt;br /&gt;
====Executive statements====&lt;br /&gt;
Executive statements are the statements that ''execute'' things, they can turn lights on, they can control devices in general.&lt;br /&gt;
* [[Action]] - Construct for executing an action&lt;br /&gt;
&lt;br /&gt;
====Decisional statements====&lt;br /&gt;
In contrast with the executive statements, the ''decisional'' statements cannot control devices, but can decide and alter the execution path based on input from devices by controlling the logical flow of the execution.&lt;br /&gt;
&lt;br /&gt;
* [[If Block]] - Simple statement for checking conditions.&lt;br /&gt;
* [[Timer]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Switch]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Each Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[While Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Repeat]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Break]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Exit]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Condition===&lt;br /&gt;
Most decisional statements rely on ''conditions'' to alter the execution logical flow. A condition is a collection of one or more comparisons (described below). It returns a boolean (true/false) value that is then used by the statement to direct the flow.&lt;br /&gt;
&lt;br /&gt;
===Condition Group===&lt;br /&gt;
A condition group is a collection of conditions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Restriction===&lt;br /&gt;
Effectively a downsized condition, not able to subscribe to events or execute statements on true/false evaluations (an advanced feature of conditions)&lt;br /&gt;
&lt;br /&gt;
===Restriction Group===&lt;br /&gt;
A restriction group is a collection of restrictions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Comparison===&lt;br /&gt;
A comparison is a logical operation that involves one operator and one to three operands. The operator is applied to the operands and the result is returned as a boolean (true/false) value. It is the core evaluation block of webCoRE. When a comparison is performed, all the operands are evaluated and then compared using the operator.&lt;br /&gt;
&lt;br /&gt;
===Operator===&lt;br /&gt;
An operator is a mathematical symbol or conditional construction that determines the type of operation to be performed. Some mathematical operators are ''+'' (addition), ''-'' (subtraction), ''%'' (modulus), ''&amp;amp;'' (logical AND), ''|'' (logical OR), etc. Some logical operators include ''is''/''is equal'' (equality), ''is less than'', ''is greater than'', ''is different than'', etc. &lt;br /&gt;
&lt;br /&gt;
===Operand===&lt;br /&gt;
An operand is a generic term for a value that is used in a comparison. webCoRE defines several types of operands:&lt;br /&gt;
* Physical Device&lt;br /&gt;
:A physical device operand represents one or more devices paired with an attribute. When evaluated, the attribute of the selected device is returned&lt;br /&gt;
* Virtual Device&lt;br /&gt;
:A virtual device operand represents the current state/value of a virtual device. Generally, virtual devices are entities that do not exist physically. Examples of virtual devices are Time, Location Mode, Smart Home Status, IFTTT, AskAlexa macros, EchoSistant profiles, etc.&lt;br /&gt;
* Variable&lt;br /&gt;
:A variable operand points to a variable whose value is then returned as part of the evaluation.&lt;br /&gt;
* Value&lt;br /&gt;
:A value operand is the most basic of operands, usually consisting of a constant string, integer, time, depending on the operand data type. Values are capable of containing expressions, simply include them inside curly brackets { }. Examples of values are 'on', 'Away', 'Everybody left', 77.0, 'The location mode is {$locationMode}'&lt;br /&gt;
* [[Expression]]&lt;br /&gt;
:An expression operand is the most advanced of operands, allowing for more complicated calculations to be performed. They allow mathematical operations, logical operations, functions, concatenation, etc. Some examples of expressions are ''1 + 2'', ''$hour * 60 + $minute'', ''[$currentEventDevice:switch]''.&lt;br /&gt;
* Argument&lt;br /&gt;
:An argument operand is a way of retrieving data that has been passed to the piston through the various execution channels. For example, an IFTTT trigger can pass data to a piston, and that data can be read via the argument operands.&lt;br /&gt;
&lt;br /&gt;
===Expression===&lt;br /&gt;
:''Main article: [[Expression]]''&lt;br /&gt;
&lt;br /&gt;
An [[Expression|expression]] is a complex mathematical construction that allows more advanced use of resources available to pistons. You can use an expression to calculate data based on input, such as finding out the dew point, or the average of a set of values, or the minimum value, or write a string in a desired format, etc.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=Piston&amp;diff=335</id>
		<title>Piston</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=Piston&amp;diff=335"/>
				<updated>2017-05-07T14:06:16Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: left; clear: both; margin-right: 1em; margin-bottom: 1em;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
Pistons are the constituent block of webCoRE. You can create as many pistons as you need and each will follow their script to implement the automation you need. In essence, a piston is an organized collection of basic elements, each element having its own role in the structure. The basic elements that work together are described below:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anatomy==&lt;br /&gt;
===Section===&lt;br /&gt;
A section groups together elements that share a role together. There are four types of sections in a piston:&lt;br /&gt;
* The ''settings'' section&lt;br /&gt;
* The ''define'' section &lt;br /&gt;
* The ''function'' section &lt;br /&gt;
* The ''execute'' section&lt;br /&gt;
&lt;br /&gt;
===Statement===&lt;br /&gt;
A statement is the main building block of a piston script. There are two kinds of statements: ''executive'' and ''decisional''.&lt;br /&gt;
&lt;br /&gt;
====Executive statements====&lt;br /&gt;
Executive statements are the statements that ''execute'' things, they can turn lights on, they can control devices in general.&lt;br /&gt;
* [[Action]] - Construct for executing an action&lt;br /&gt;
&lt;br /&gt;
====Decisional statements====&lt;br /&gt;
In contrast with the executive statements, the ''decisional'' statements cannot control devices, but can decide and alter the execution path based on input from devices by controlling the logical flow of the execution.&lt;br /&gt;
&lt;br /&gt;
* [[If Block]] - Simple statement for checking conditions.&lt;br /&gt;
* [[Timer]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Switch]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[For Each Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[While Loop]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Repeat]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Break]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
* [[Exit]] - &amp;lt;Todo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Condition===&lt;br /&gt;
Most decisional statements rely on ''conditions'' to alter the execution logical flow. A condition is a collection of one or more comparisons (described below). It returns a boolean (true/false) value that is then used by the statement to direct the flow.&lt;br /&gt;
&lt;br /&gt;
===Condition Group===&lt;br /&gt;
A condition group is a collection of conditions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Restriction===&lt;br /&gt;
Effectively a downsized condition, not able to subscribe to events or execute statements on true/false evaluations (an advanced feature of conditions)&lt;br /&gt;
&lt;br /&gt;
===Restriction Group===&lt;br /&gt;
A restriction group is a collection of restrictions, grouped together with a logical operator (and, or, xor, etc.)&lt;br /&gt;
&lt;br /&gt;
===Comparison===&lt;br /&gt;
A comparison is a logical operation that involves one operator and one to three operands. The operator is applied to the operands and the result is returned as a boolean (true/false) value. It is the core evaluation block of webCoRE. When a comparison is performed, all the operands are evaluated and then compared using the operator.&lt;br /&gt;
&lt;br /&gt;
===Operator===&lt;br /&gt;
An operator is a mathematical symbol or conditional construction that determines the type of operation to be performed. Some mathematical operators are ''+'' (addition), ''-'' (subtraction), ''%'' (modulus), ''&amp;amp;'' (logical AND), ''|'' (logical OR), etc. Some logical operators include ''is''/''is equal'' (equality), ''is less than'', ''is greater than'', ''is different than'', etc. &lt;br /&gt;
&lt;br /&gt;
===Operand===&lt;br /&gt;
An operand is a generic term for a value that is used in a comparison. webCoRE defines several types of operands:&lt;br /&gt;
* Physical Device&lt;br /&gt;
:A physical device operand represents one or more devices paired with an attribute. When evaluated, the attribute of the selected device is returned&lt;br /&gt;
* Virtual Device&lt;br /&gt;
:A virtual device operand represents the current state/value of a virtual device. Generally, virtual devices are entities that do not exist physically. Examples of virtual devices are Time, Location Mode, Smart Home Status, IFTTT, AskAlexa macros, EchoSistant profiles, etc.&lt;br /&gt;
* Variable&lt;br /&gt;
:A variable operand points to a variable whose value is then returned as part of the evaluation.&lt;br /&gt;
* Value&lt;br /&gt;
:A value operand is the most basic of operands, usually consisting of a constant string, integer, time, depending on the operand data type. Values are capable of containing expressions, simply include them inside curly brackets { }. Examples of values are 'on', 'Away', 'Everybody left', 77.0, 'The location mode is {$locationMode}'&lt;br /&gt;
* [[Expression]]&lt;br /&gt;
:An expression operand is the most advanced of operands, allowing for more complicated calculations to be performed. They allow mathematical operations, logical operations, functions, concatenation, etc. Some examples of expressions are ''1 + 2'', ''$hour * 60 + $minute'', ''[$currentEventDevice:switch]''.&lt;br /&gt;
* Argument&lt;br /&gt;
:An argument operand is a way of retrieving data that has been passed to the piston through the various execution channels. For example, an IFTTT trigger can pass data to a piston, and that data can be read via the argument operands.&lt;br /&gt;
&lt;br /&gt;
===Expression===&lt;br /&gt;
:''Main article: [[Expression]]''&lt;br /&gt;
&lt;br /&gt;
An [[Expression|expression]] is a complex mathematical construction that allows more advanced use of resources available to pistons. You can use an expression to calculate data based on input, such as finding out the dew point, or the average of a set of values, or the minimum value, or write a string in a desired format, etc.&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=WebCoRE_Logging&amp;diff=334</id>
		<title>WebCoRE Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=WebCoRE_Logging&amp;diff=334"/>
				<updated>2017-05-07T14:05:00Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The logging settings can be found in the dashboard's piston view, under the ''Logs'' section.&lt;br /&gt;
&lt;br /&gt;
{{warning|The log to console task will generate logs regardless of the selected logging level.}}&lt;br /&gt;
&lt;br /&gt;
These settings will impact what logs get written to the SmartThings IDE Live Logging, as well as the built-in Log viewer in the dashboard:&lt;br /&gt;
&lt;br /&gt;
* '''None''' - only error and warning messages will be displayed&lt;br /&gt;
* '''Minimal''' - only error, warning, and info messages will be displayed&lt;br /&gt;
* '''Medium''' - only error, warning, info and trace messages will be displayed&lt;br /&gt;
* '''Full''' - all messages will be displayed (error, warning, info, trace, and debug)&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	<entry>
		<id>https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=333</id>
		<title>webCoRE</title>
		<link rel="alternate" type="text/html" href="https://wiki.webcore.co/index.php?title=webCoRE&amp;diff=333"/>
				<updated>2017-05-07T14:02:52Z</updated>
		
		<summary type="html">&lt;p&gt;ady624: /* Anatomy of a webCoRE Piston */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General ==&lt;br /&gt;
The ''web Community's own Rule Engine'' (or for short, webCoRE) is a general rule engine for SmartThings. It works by allowing users to create scripts that are interpreted and executed by the SmartThings SmartApp, allowing for complex decisions. webCoRE is currently a work in progress. webCoRE reached the first Beta milestone on April 29, 2017 (version v0.1.097.20170429) Please review the [[webCoRE todo]] list.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
A few steps need to be completed before you can use webCoRE. First, webCoRE needs to be installed in your SmartThings account, then automations need to be configured. These are called [[Piston|pistons]] and will be detailed later. So let's start by installing webCoRE, please follow the 5 steps below.&lt;br /&gt;
&lt;br /&gt;
== Installing webCoRE ==&lt;br /&gt;
You must complete all of these steps.&lt;br /&gt;
&lt;br /&gt;
# [[GitHub Install]] or [[Manual Install]] of webCoRE source code into the SmartThings Cloud&lt;br /&gt;
# [[Enable webCoRE OAuth]] in the SmartThings cloud&lt;br /&gt;
# [[Install webCoRE]] in the SmartThings mobile app&lt;br /&gt;
# [[Enabling webCoRE dashboard]]&lt;br /&gt;
# [[Enable webCoRE on Another Device]]&lt;br /&gt;
&lt;br /&gt;
== Understanding the basics ==&lt;br /&gt;
webCoRE is comprised of the three main components listed below.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE child SmartApp (''webCoRE Piston'') ===&lt;br /&gt;
The webCoRE child SmartApp is also known as a [[Piston|piston]]. It is responsible for executing the automation script that the user creates and does the heavy lifting in the whole webCoRE ecosystem. It is directly managed by the webCoRE parent SmartApp, which can create, maintain, and delete a Piston.&lt;br /&gt;
&lt;br /&gt;
=== The webCoRE parent SmartApp (''webCoRE'') ===&lt;br /&gt;
The wabCoRE parent SmartApp is the component responsible for managing the child SmartApp instances and their relationship with the Dashboard. It is the middle man that allows adding new Pistons, maintaining them, or deleting them. It is also responsible with the security of the whole ecosystem, allowing password secured access from the Dashboard.&lt;br /&gt;
&lt;br /&gt;
=== The [[Dashboard|dashboard]] ===&lt;br /&gt;
The Dashboard is an [https://en.wikipedia.org/wiki/HTML HTML] interface for webCoRE that allows users to manage their webCoRE installation. It is the central hub to controlling webCoRE, allowing the user to create, modify, test, and delete Pistons.&lt;br /&gt;
&lt;br /&gt;
==Anatomy of a webCoRE Piston==&lt;br /&gt;
::''Main article [[Piston]]''&lt;br /&gt;
A piston is a script that contains a collection of elements, arranged so that the logic and flow of the piston perform tasks in a desired sequence. It is broken down into several sections, each having its own important role.&lt;br /&gt;
&lt;br /&gt;
//todo: most details below need to be moved into the main article&lt;br /&gt;
&lt;br /&gt;
===The ''settings'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show piston settings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
These settings allows configuration of how certain aspects of the piston function. &lt;br /&gt;
&lt;br /&gt;
[[file:pistonsettings.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Name''' - Change the name of a piston.&lt;br /&gt;
*'''Description''' - Give a description of what the piston does.&lt;br /&gt;
*'''Automatic piston state''' - Change whether the piston handles it state or make it manual and you can control the piston's state.&lt;br /&gt;
*'''Piston execution parallelism''' - //todo&lt;br /&gt;
*'''Condition traversal optimizations''' - //todo&lt;br /&gt;
*'''Event subscriptions''' - Allow event subscriptions or turn them off if you would like to make the piston a follow up style piston.  If you disable this then you must have some other means for the piston to be fired.&lt;br /&gt;
*'''Command execution delay''' - A delay in milliseconds for commands to be executed piston wide.&lt;br /&gt;
&lt;br /&gt;
===The ''define'' section===&lt;br /&gt;
This menu is accessed from the piston editor.  In the upper right hand corner select options and then enable &amp;lt;code&amp;gt;Show variables&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
A very powerful feature of webCoRE is the ability to use [[Variable|variables]]. Think of variables as temporary pockets where you can store information and are able to later retrieve and use this information for any purpose. This information can be used either during the current piston run, or at a later time, when another event occurs.&lt;br /&gt;
&lt;br /&gt;
[[file:pistondefine.png]]&lt;br /&gt;
&lt;br /&gt;
*'''Type''' - You can select from the different [[Variable Data Types|Variable_data_types]] for you variable.&lt;br /&gt;
*'''Name''' - This is the empty box next to the type.  Enter a name for your variable.&lt;br /&gt;
*'''Initial value''' - This is defaulted to &amp;lt;code&amp;gt;Nothing selected&amp;lt;/code&amp;gt;.  If you decide to give it an initial value then that value will be used at each piston run regardless of what is stored in later piston runs.&lt;br /&gt;
*'''Description''' - Give a description of what the variable is used for.&lt;br /&gt;
&lt;br /&gt;
===The ''execute'' section===&lt;br /&gt;
This section describes the piston's logic flow. This is the starting point of most executions. Whenever a device event happens, the piston starts its execution here.  To get started click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:executesimple.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are you 3 basic building blocks with their description listed below them.  There are several more options to choose from aside from these three. In order to gain access to these you will again have to visit that trusty options menu in the top right hand corner and select &amp;lt;code&amp;gt;Show advanced statments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:pistonoptions.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you do this and you click on &amp;lt;code&amp;gt;Add a new statement&amp;lt;/code&amp;gt; you will now have access to all the available statement options.&lt;br /&gt;
&lt;br /&gt;
[[file:executeadvanced.png]]&lt;br /&gt;
&lt;br /&gt;
==Other Details==&lt;br /&gt;
# [[webCore Logging]]&lt;br /&gt;
# [[Functions]]&lt;br /&gt;
&lt;br /&gt;
== Creating your first piston ==&lt;br /&gt;
&lt;br /&gt;
Once you finished the installation steps above, let's go ahead and create the first piston, the famous [[Hello World!|Hello World]].&lt;br /&gt;
&lt;br /&gt;
==Sample Pistons==&lt;br /&gt;
This section has some user contributed sample pistons.  You can import any of these pistons using the import code displayed at the top of the piston.&lt;br /&gt;
# [[Samples]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;seo keywords=&amp;quot;webCoRE,dashboard,smart home,automation,SmartThings,rule engine,piston&amp;quot; description=&amp;quot;The official wiki for webCoRE, the Web-enabled Community's own Rule Engine SmartApp&amp;quot;&amp;gt;&amp;lt;/seo&amp;gt;&lt;/div&gt;</summary>
		<author><name>ady624</name></author>	</entry>

	</feed>