private async Task UpdateDigitalTwinComponentPropertyAsync() { // Choose a random value to assign to the targetTemperature property in thermostat1 component int desiredTargetTemperature = Random.Next(0, 100); const string targetTemperaturePropertyName = "targetTemperature"; var updateOperation = new UpdateOperationsUtility(); // First let's take a look at when the property was updated and what was it set to. HttpOperationResponse <TemperatureControllerTwin, DigitalTwinGetHeaders> getDigitalTwinResponse = await _digitalTwinClient .GetDigitalTwinAsync <TemperatureControllerTwin>(_digitalTwinId); ThermostatTwin thermostat1 = getDigitalTwinResponse.Body.Thermostat1; if (thermostat1 != null) { // Thermostat1 is present in the TemperatureController twin. We can add/replace the component-level property "targetTemperature" double?currentComponentTargetTemperature = getDigitalTwinResponse.Body.Thermostat1.TargetTemperature; if (currentComponentTargetTemperature != null) { DateTimeOffset targetTemperatureDesiredLastUpdateTime = getDigitalTwinResponse.Body.Thermostat1.Metadata.TargetTemperature.LastUpdateTime; _logger.LogDebug($"The property {targetTemperaturePropertyName} under component {Thermostat1Component} was last updated on `" + $"{targetTemperatureDesiredLastUpdateTime.ToLocalTime()} `" + $" with a value of {getDigitalTwinResponse.Body.Thermostat1.Metadata.TargetTemperature.DesiredValue}."); // The property path to be replaced should be prepended with a '/' updateOperation.AppendReplacePropertyOp($"/{Thermostat1Component}/{targetTemperaturePropertyName}", desiredTargetTemperature); } else { _logger.LogDebug($"The property {targetTemperaturePropertyName} under component {Thermostat1Component} `" + $"was never set on the {_digitalTwinId} digital twin."); // The property path to be added should be prepended with a '/' updateOperation.AppendAddPropertyOp($"/{Thermostat1Component}/{targetTemperaturePropertyName}", desiredTargetTemperature); } } else { // Thermostat1 is not present in the TemperatureController twin. We will add the component var componentProperty = new Dictionary <string, object> { { targetTemperaturePropertyName, desiredTargetTemperature }, { "$metadata", new object() } }; _logger.LogDebug($"The component {Thermostat1Component} does not exist on the {_digitalTwinId} digital twin."); // The property path to be replaced should be prepended with a '/' updateOperation.AppendAddComponentOp($"/{Thermostat1Component}", componentProperty); } _logger.LogDebug($"Update the {targetTemperaturePropertyName} property under component {Thermostat1Component} on the {_digitalTwinId} `" + $"digital twin to {desiredTargetTemperature}."); HttpOperationHeaderResponse <DigitalTwinUpdateHeaders> updateDigitalTwinResponse = await _digitalTwinClient .UpdateDigitalTwinAsync(_digitalTwinId, updateOperation.Serialize()); _logger.LogDebug($"Update {_digitalTwinId} digital twin response: {updateDigitalTwinResponse.Response.StatusCode}."); // Print the TemperatureController digital twin await GetAndPrintDigitalTwinAsync <TemperatureControllerTwin>(); }
private async Task UpdateTargetTemperaturePropertyAsync() { const string targetTemperaturePropertyName = "targetTemperature"; var updateOperation = new UpdateOperationsUtility(); // Choose a random value to assign to the targetTemperature property int desiredTargetTemperature = Random.Next(0, 100); // First let's take a look at when the property was updated and what was it set to. HttpOperationResponse <ThermostatTwin, DigitalTwinGetHeaders> getDigitalTwinResponse = await _digitalTwinClient .GetDigitalTwinAsync <ThermostatTwin>(_digitalTwinId); double?currentTargetTemperature = getDigitalTwinResponse.Body.TargetTemperature; if (currentTargetTemperature != null) { DateTimeOffset targetTemperatureDesiredLastUpdateTime = getDigitalTwinResponse.Body.Metadata.TargetTemperature.LastUpdateTime; _logger.LogDebug($"The property {targetTemperaturePropertyName} was last updated on " + $"{targetTemperatureDesiredLastUpdateTime.ToLocalTime()} `" + $" with a value of {getDigitalTwinResponse.Body.Metadata.TargetTemperature.DesiredValue}."); // The property path to be replaced should be prepended with a '/' updateOperation.AppendReplacePropertyOp($"/{targetTemperaturePropertyName}", desiredTargetTemperature); } else { _logger.LogDebug($"The property {targetTemperaturePropertyName} was never set on the ${_digitalTwinId} digital twin."); // The property path to be added should be prepended with a '/' updateOperation.AppendAddPropertyOp($"/{targetTemperaturePropertyName}", desiredTargetTemperature); } _logger.LogDebug($"Update the {targetTemperaturePropertyName} property on the " + $"{_digitalTwinId} digital twin to {desiredTargetTemperature}."); HttpOperationHeaderResponse <DigitalTwinUpdateHeaders> updateDigitalTwinResponse = await _digitalTwinClient .UpdateDigitalTwinAsync(_digitalTwinId, updateOperation.Serialize()); _logger.LogDebug($"Update {_digitalTwinId} digital twin response: {updateDigitalTwinResponse.Response.StatusCode}."); // Print the Thermostat digital twin await GetAndPrintDigitalTwinAsync <ThermostatTwin>(); }