...
- Check if HTTP code is 200 else log the error message
Convert the temperature value from Kelvin to Centigrade.
Code Block language xml title HandleResponse 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>
Tag Resolution "/'[%: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
ProjectName | Import Link |
---|---|
Device Cloud | DeviceCloudAccess |
Complete Source Code
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<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:%]&mode=[%:Event.Argument.OutputFormat.Value:%]&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> |