One can associate multiple thing actions to a Thingfacet Attribute. You can do this by providing comma separated list of Action names. For example,:
Code Block |
---|
language | xml |
---|
title | Assoicating Multiple Thing Actions |
---|
linenumbers | true |
---|
|
<String#
String(name=: "State", KnownBy=: "SyncImageAction,SyncPresetAction"/>) |
Here you can see two actions: SyncPresetAction and SyncImageActon which deal with camera preset and snapshot image respectively. Both the actions update the "State" attribute of a Camera Facet.
Code Block |
---|
language | xml |
---|
title | Multiple Thing Actions |
---|
linenumbers | true |
---|
|
<!--# Actions
-->
<Action Name=Action(Name: "SyncPresetAction", Documentation=: "Synchronize camera state and preset">):
<Workflow Workflow(Limit=: "1", Live=: "1", Timeout=: "PT20S">):
<Task Task(Name=: "Main", While=: "true">):
<Event Event(Name=: "Argument", As=: "ActionArgument"/>)
<Invoke Name=Invoke(Name: "SetPreset", waitFor=: "Argument", skip-if=: "[%:[:AA:].Preset/no-value(Value):%]", delayAfter=: "PT5S"
get=: "[%:[:AA:].URL.Value:%]/cgi-bin/decoder_control.cgi?[:UP:][%:amp:%]command=15[%:amp:%]sit=[%:[:AA:].Preset.Value:%]"/>)
<Output name=Output(Name: "Result", as=: "ActionResult">):
Value>
State:
<Value> <State> [%:[%:@Output:%]/if([:POK:]) then 'ON' else 'OFF':%]</State>
Preset:
<Preset>[%:[%:@Output:%]/if([:POK:]) then '[%:[:AA:].Preset.Value:%]' else null():%]</Preset>
</Value>
</Output>
</Task>
</Workflow>
</Action>
<Action name=
Action(Name: "SyncImageAction", documentation=: "Synchronize camera state and snapshot image">):
<WorkflowWorkflow Limit=: "1", Live=: "1", Timeout=: "PT10S">):
<Task name=Task(Name: "Main", while=: "true">):
<Event name=Event(Name: "Argument", as=: "ActionArgument"/>)
<Invoke name=Invoke(Name: "GetImage", waitFor=: "Argument", delay=: "PT1S", get=: "[%:[:AA:].URL.Value:%]/cgi-bin/video_snapshot.cgi?[:UP:]"/>)
<Output name=Output(Name: "Result", as=: "ActionResult">):
Value>
State:
<Value> <State>[%:[%:@Output:%]/if([:IOK:]) then 'ON' else 'OFF':%]</State>
Image:
<Image>[%:[%:@Output:%]/if([:IOK:]) then Invoke/GetImage/Message/Value/text() else '/img/no-image.jpg':%] |
Rules for Selecting an Action:
TQLEngine Rules for selecting an Action are as follows. Please note that an Action is Triggered whenever there is a change detected between "Value" and "Known" values of a ThingFacet Attribute. A change is notified by Applications using TQL Update Query.
- Order of Action Names specified in KnownBy - The first Action Name gets first preference, second gets second preference and so on.
- Minimum number of Action (s) that satisfy the update criteria. This rule is used in conjunction with previous order of preference rule.
Code Block |
---|
language | xml |
---|
title | ESKY Camera Thing Facet |
---|
linenumbers | true |
---|
|
#
ThingFacet(Name: "Esky"):
Sid(Name: "CameraId")
String(Name: "URL")
String(Name: "UserName")
String(Name: "Password")
String(Name: "State", KnownBy: "SyncImageAction,SyncPresetAction")
String(Name: "Image", KnownBy: "SyncImageAction")
String(Name: "Preset", KnownBy: "SyncPresetAction")
Unique(Name: "Camera", value: "URL")
# Helpers
AA:
[:#o#Event.Argument:]
UP:
user=[%]</Image>
:[:AA:].UserName.Value:%][%:amp:%]pwd=[%:[:AA:].Password.Value:%]
POK:
Invoke/SetPreset/Message/starts-with(Value, 'ok')
IOK:
</Value>Invoke/GetImage/Message/starts-with(Value, 'data')
#Actions
Action(Name: "SyncPresetAction", documentation: "Synchronize camera state and preset"):
Workflow Limit: "1", Live: "1", Timeout: "PT20S"):
Task(Name: "Main", while: "true"):
Event(Name: "Argument", as: "ActionArgument")
Invoke(Name: "SetPreset", </Output>waitFor: "Argument", skip-if: "[%:[:AA:].Preset/no-value(Value):%]", delayAfter: "PT5S"
</Task>
</Workflow>
</Action> |
Here you can see two actions: SyncPresetAction and SyncImageActon which deal with camera preset and snapshot image respectively. Both as a result update the camera state.
...
Jira Legacy |
---|
showSummary | false |
---|
server | JIRA (mqidentity.atlassian.net) |
---|
serverId | 77fb3325-4051-36d9-bcc7-761f62050707 |
---|
key | DOCS-34 |
---|
|
...
get: "[%:[:AA:].URL.Value:%]/cgi-bin/decoder_control.cgi?[:UP:][%:amp:%]command=15[%:amp:%]sit=[%:[:AA:].Preset.Value:%]")
Output(Name: "Result", as: "ActionResult"):
Value:
State:
[%:[%:@Output:%]/if([:POK:]) then 'ON' else 'OFF':%]
Preset:
[%:[%:@Output:%]/if([:POK:]) then '[%:[:AA:].Preset.Value:%]' else null():%]
Action(Name: "SyncImageAction", documentation: "Synchronize camera state and snapshot image"):
Workflow Limit: "1", Live: "1", Timeout: "PT10S"):
Task(Name: "Main", while: "true"):
Event(Name: "Argument", as: "ActionArgument")
Invoke(Name: "GetImage", waitFor: "Argument", delay: "PT1S", get: "[%:[:AA:].URL.Value:%]/cgi-bin/video_snapshot.cgi?[:UP:]")
Output(Name: "Result", as: "ActionResult"):
Value:
State:
[%:[%:@Output:%]/if([:IOK:]) then 'ON' else 'OFF':%]
Image:
[%:[%:@Output:%]/if([:IOK:]) then Invoke/GetImage/Message/Value/text() else '/img/no-image.jpg':%] |
For example in case of ESKY Camera Facet - here is the list the table of Attribute, Action Association and Attributes that get affected by Actions.
Attribute | Action(s) Association | Attribute(s) Being Updated By Action |
---|
State | SyncImageAction, SyncPresetAction | State, Image, Preset |
Image | SyncImageAction | State, Image |
Preset | SyncPresetAction | State, Preset |
Based on the above Action Association and Rules applied by the TQLEngine, table below gives possibilities:
User's (Applications) Desire to update using TQL Update Query | Action Selected by TQLEngine |
---|
Image | SyncImageAction |
Preset | SyncPresetAction |
Image, State | SyncImageAction |
State | SyncImageAction (* Note both Rules get applied) |