Versions Compared

Key

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

...

  • Check if HTTP code is 200 else log the error message
  • Convert the temperature value from Kelvin to Centigrade.

    Code Block
    languagexml
    titleHandleResponse to GET
    <Invoke Name="HandleResponse">
      <FacetScript>
        <If Condition="/'[%:Invoke.ReadValues.Status:%]' eq '200'">
          <Then>
            <Log Message="Response Status is 200"/>
            <If Condition="/'[%:Invoke.ReadValues.Message.Value.current.temperature.unit:%]' eq 'kelvin'">
             <Then>
               <Log Message="Temperature Unit is Kelvin.."/>
                <SetContextData Key="CelTemp" Value="[%:/number([%:Invoke.ReadValues.Message.Value.current.temperature.value:%]-273):%]"/>
                <Log Message="Temperature Value in Centigrade is.. [:$ContextData.CelTemp:]"/>
              </Then>
              <Else>
                <SetContextData Key="CelTemp" Value="[%:Invoke.ReadValues.Message.Value.current.temperature.value:%]"/>
              </Else>
            </If>
          </Then>
          <Else>
            <Log Message="Non-200 Response Status. Send Alert to DevOps"/>
          </Else>
        </If>
      </FacetScript>
    </Invoke>
    TagResolution
    "/'[%:Invoke.ReadValues.Message.Value.current.temperature.unit:%]' eq 'kelvin'"
    This is an XPath Expression to compare string. Example: "/<StringValue>' eq 'StringValue2'
    SetContextData
    This is a temporary key/value storage provided by TQLEngine as part of FacetScript. Here Key is CelTemp, Value is converted value to Centigrade to Original Value (if original value is not in Kelvin).
    [%:/number([%:Invoke.ReadValues.Message.Value.current.temperature.value:%]-273):]
    This is XPath Expression to perform Subtraction.

...

Source Code

Import into TQLStudio

ProjectNameImport Link
Device CloudDeviceCloudAccess

Complete Source Code

Code Block
languagexml
titleCloud Service Model
linenumberstrue
collapsetrue
<Namespace Name="DeviceCloudProvider">
  <Domain Name="CloudThings">
    <Def Name="EnvInfo">
      <Double Name="Temperature"/>
      <Double Name="Humidity"/>
      <Double Name="Light"/>
      <Double Name="Pressure"/>
      <String Name="LastUpdatedByProvider"/>
    </Def>

    <ThingFacet Name="ExternalEnvFacet">
      <String Name="DCBaseURL"/>
      <String Name="DCAPIKey"/>
      <String Name="OutputFormat"/>
      <String Name="DCQueryParam"/>
      <Integer Name="SensingInterval"/>
      <String Name="EmulateSensing" KnownBy="EmulateSensingAction"/>
      <EnvInfo Name="EnvDetails" KnownBy="EnvInfoAction"/>
      <Action Name="EnvInfoAction" Documentation="Action to interact with Device Cloud API">
        <Workflow Limit="1" Live="1" Timeout="0">
          <Task Name="GetEnvInfo" While="true">
            <Event Name="Argument" As="ActionArgument"/>
            <Invoke Name="ReadValues" WaitFor="Argument" Documentation="Invoke HTTP GET"
              Get="[%:Event.Argument.DCBaseURL.Value:%]?q=[%:Event.Argument.DCQueryParam.Value:%]&amp;mode=[%:Event.Argument.OutputFormat.Value:%]&amp;APPID=[%:Event.Argument.DCAPIKey.Value:%]"/>
            <Log Message="Output value from openweathermap url invoke ====[%:Invoke.ReadValues:%]"/>
            <Invoke Name="HandleResponse">
              <FacetScript>
                <If Condition="/'[%:Invoke.ReadValues.Status:%]' eq '200'">
                  <Then>
                    <Log Message="Response Status is 200"/>
                    <If Condition="/'[%:Invoke.ReadValues.Message.Value.current.temperature.unit:%]' eq 'kelvin'">
                      <Then>
                        <Log Message="Temperature Unit is Kelvin.."/>
                        <SetContextData Key="CelTemp" Value="[%:/number([%:Invoke.ReadValues.Message.Value.current.temperature.value:%]-273):]"/>
                        <Log Message="Temperature Value in Centigrade is.. [:$ContextData.CelTemp:]"/>
                      </Then>
                      <Else>
                        <SetContextData Key="CelTemp" Value="[%:Invoke.ReadValues.Message.Value.current.temperature.value:%]"/>
                      </Else>
                    </If>
                  </Then>
                  <Else>
                    <Log Message="Non-200 Response Status. Send Alert to DevOps"/>
                  </Else>
                </If>
              </FacetScript>

            </Invoke>
            <Output Name="Result" As="ActionResult">
              <Value>
                <EnvDetails>
                  <Temperature>[:$ContextData.CelTemp:]</Temperature>
                  <Humidity>[%:Invoke.ReadValues.Message.Value.current.humidity.value:%]</Humidity>
                  <!-- <Light>[%:Invoke.ReadValues.Message.Value.current.visibility.value:%]</Light> -->
                  <Pressure>[%:Invoke.ReadValues.Message.Value.current.pressure.value:%]</Pressure>
                  <LastUpdatedByProvider>[%:Invoke.ReadValues.Message.Value.current.lastupdate.value:%]</LastUpdatedByProvider>
                </EnvDetails>
              </Value>
            </Output>
          </Task>
        </Workflow>
      </Action>

      <Action Name="EmulateSensingAction">
        <Workflow Limit="1" Live="1" Timeout="0">
          <Task Name="GetEnvInfo" While="true">
            <Event Name="Argument" As="ActionArgument"/>
            <Invoke Name="ToggleSchedule" WaitFor="Argument">
              <FacetScript>
                <If condition="/'[%:Event.Argument.EmulateSensing.Value:%]' eq 'true'">
                  <then>
                    <ScheduleJob>
                      <Name>UpdateEnvDetails</Name>
                      <ScheduleInterval>[%:Event.Argument.SensingInterval.Value:%]sec</ScheduleInterval>
                      <ActionCode>
                        <ResetEnvInfo>
                          <ExternalEnvId>[%:Event.Argument.ExtEnvId:%]</ExternalEnvId>
                        </ResetEnvInfo>
                      </ActionCode>
                    </ScheduleJob>
                  </then>
                  <else>
                    <Log Message="Inside DeleteScheduleJob else condition ======= "/>
                    <DeleteScheduleJob>
                      <JobName>UpdateEnvDetails</JobName>
                    </DeleteScheduleJob>
                  </else>
                </If>
              </FacetScript>
            </Invoke>
            <Output Name="Result" As="ActionResult">
              <Value>
                <EmulateSensing>[%:Event.Argument.EmulateSensing.Value:%]</EmulateSensing>
              </Value>
            </Output>
          </Task>
        </Workflow>
      </Action>
    </ThingFacet>

    <ThingModel Name="ExternalEnv" Combines="ExternalEnvFacet">
      <Sid Name="ExtEnvId"/>
    </ThingModel>

    <Macro Name="ScheduleJob">
      <Argument>
        <ScheduleInterval>
        </ScheduleInterval>
        <StartTime>0</StartTime>
        <EndTime>
        </EndTime>
        <ActionCode>
        </ActionCode>
        <Name>
        </Name>
      </Argument>
      <Result>
        <Log Message="Inside ScheduleJob macro"/>
        <DoRequest target="[:RuntimeParams.SequenceFacetIDName:]">
          <Process>
            <Message>
              <Value>
                <Execute eid="[:$Macro.Argument.Name:]" schedule="[[:$Macro.Argument.StartTime:]..[:$Macro.Argument.EndTime:]/[:$Macro.Argument.ScheduleInterval:]]">
                  <Action>
                    <ExecuteQuery>
                      <QueryString>[:$Macro.Argument.ActionCode:]</QueryString>
                    </ExecuteQuery>
                  </Action>
                </Execute>
              </Value>
            </Message>
          </Process>
        </DoRequest>
      </Result>
    </Macro>

    <Macro Name="DeleteScheduleJob">
      <Argument>
        <JobName/>
      </Argument>
      <Result>
        <DoRequest target="[:RuntimeParams.SequenceFacetIDName:]">
          <Process>
            <Message type="xml">
              <Value>
                <Remove eid="[:$Macro.Argument.JobName:]"/>
              </Value>
            </Message>
          </Process>
        </DoRequest>
      </Result>
    </Macro>
    
  <Macro Name="ExecuteQuery">
      <Argument>
        <QueryString>
          <Query/>
        </QueryString>
      </Argument>
      <Result>
        <OnRequest Target="[:RuntimeParams.FacetIDName:]" Disable="CMD_SERVER">
          <Process Return="CMD_NOP">
            <Message>
              <Value>[:$Macro.Argument.QueryString:]</Value>
            </Message>
          </Process>
        </OnRequest>
      </Result>
    </Macro>
    <Macro Name="ResetEnvInfo">
      <Argument>
        <ExternalEnvId/>
      </Argument>
      <Result>
        <Log Message="Resetting External Env: [:$Macro.Argument.ExternalEnvId:]"/>
        <ExecuteQuery>
          <QueryString>
            <Query>
              <Find Format="all">
                <ExternalEnv>
                  <ExtEnvId>[:$Macro.Argument.ExternalEnvId:]</ExtEnvId>
                </ExternalEnv>
              </Find>
              <SetResponseData>
                <Key>Message.Value.Find.Result.ExternalEnv.EnvDetails.Temperature.Value</Key>
                <Value>$Null()</Value>
              </SetResponseData>
              <SetResponseData>
                <Key>Message.Value.Find.Result.ExternalEnv.EnvDetails.Humidity.Value</Key>
                <Value>$Null()</Value>
              </SetResponseData>
              <SetResponseData>
                <Key>Message.Value.Find.Result.ExternalEnv.EnvDetails.Pressure.Value</Key>
                <Value>$Null()</Value>
              </SetResponseData>
              <SetResponseData>
                <Key>Message.Value.Find.Result.ExternalEnv.EnvDetails.LastUpdatedByProvider.Value</Key>
                <Value>$Null()</Value>
              </SetResponseData>
              <Update>
                <From>Result</From>
                <Include>$Response.Message.Value.Find</Include>
              </Update>
            </Query>
          </QueryString>
        </ExecuteQuery>
      </Result>
    </Macro>
  </Domain>
</Namespace>