Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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
languagexml
titleAssoicating Multiple Thing Actions
linenumberstrue
<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
languagexml
titleMultiple Thing Actions
linenumberstrue
<!--# 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>
          <Value>State:
           <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':%]</Image>
        </Value>
      </Output>
    </Task>
  </Workflow>
</Action>

Here you can see two actions: SyncPresetAction and SyncImageActon which deal with camera preset and snapshot image respectively. Both also update camera state.

...


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
languagexml
titleESKY Camera Thing Facet
linenumberstrue
#
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=[%:[:AA:].UserName.Value:%][%:amp:%]pwd=[%:[:AA:].Password.Value:%]
  POK:
    Invoke/SetPreset/Message/starts-with(Value, 'ok')
  IOK:
    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", 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: "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.

AttributeAction(s) AssociationAttribute(s) Being Updated By Action
StateSyncImageAction, SyncPresetActionState, Image, Preset
Image
SyncImageActionState, Image
PresetSyncPresetActionState, 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 QueryAction Selected by TQLEngine
ImageSyncImageAction
PresetSyncPresetAction
Image, State
SyncImageAction
State
SyncImageAction (* Note both Rules get applied)