Digitale tweelingen en hun tweelinggrafiek

In dit artikel wordt beschreven wat digitale tweelingen zijn in de context van Azure Digital Twins en hoe relaties ertussen een tweelinggrafiek kunnen vormen. In een Azure Digital Twins oplossing worden de entiteiten in uw omgeving vertegenwoordigd door digitale tweelingen. Een digitale tweeling is een exemplaar van een van uw aangepaste gedefinieerde modellen. Het kan worden verbonden met andere digitale tweelingen via relaties om een tweelinggrafiek te vormen: deze tweelinggrafiek is de weergave van uw hele omgeving.

Tip

'Azure Digital Twins' verwijst naar deze Azure-service als geheel. 'Digital twin(s)' of gewoon 'twin(s)' verwijst naar afzonderlijke tweelingknooppunten in uw exemplaar van de service.

Digitale tweelingen

Voordat u een digitale tweeling in uw Azure Digital Twins maken, moet u een model uploaden naar de service. Een model beschrijft onder andere de set eigenschappen, telemetrieberichten en relaties die een bepaalde tweeling kan hebben. Zie Aangepaste modellen voor de typen informatie die in een model zijn gedefinieerd.

Nadat u een model hebt gemaakt en geüpload, kan uw client-app een exemplaar van het type maken. Dit exemplaar is een digitale tweeling. Nadat u bijvoorbeeld een model van Floor hebt gemaakt, kunt u een of meer digitale tweelingen maken die gebruikmaken van dit type (zoals een tweeling van het type Floor met de naam Ground Floor Floor, een andere met de naam Floor2, etc.).

Notitie

Digitale tweelingen in Azure Digital Twins verschillen van apparaattweelingen in IoT Hub. IoT Hub apparaattweeling richt zich vaak op het beschrijven van de aspecten en mogelijkheden van een apparaat zelf, terwijl tweelingen in Azure Digital Twins conceptuelere weergaven zijn die door de gebruiker gedefinieerde inzichten over een apparaat of veel gerelateerde apparaten kunnen opslaan.

IoT Hub apparaattweeling kan worden verbonden met Azure Digital Twins als onderdeel van een end-to-end-oplossing die apparaten in verschillende services vertegenwoordigt.

Relaties: een grafiek van digitale tweelingen

Tweelingen zijn via hun relaties verbonden met een tweelinggrafiek. De relaties die een tweeling kan hebben, worden gedefinieerd als onderdeel van het model.

Het model Floor kan bijvoorbeeld een bevatrelatie definiëren die gericht is op tweelingen van het type Room. Met deze definitie kunt Azure Digital Twins u bevatrelaties maken van elke Floor-tweeling naar elke Room-tweeling (inclusief tweelingen die van room-subtypen zijn).

Het resultaat van dit proces is een set knooppunten (de digitale tweelingen) die zijn verbonden via randen (hun relaties) in een grafiek.

Visualisatie

Azure Digital Twins Explorer is een visueel hulpprogramma voor het verkennen van de gegevens in Azure Digital Twins grafiek. U kunt de verkenner gebruiken om uw modellen, tweelingen en relaties weer te geven, op te vragen en te bewerken.

Zie voor meer informatie over Azure Digital Twins Explorer hulpprogramma Azure Digital Twins Explorer. Zie Use Azure Digital Twins Explorer voor gedetailleerde stappen voor het gebruik Azure Digital Twins Explorer.

De visualisatie ziet er als volgende uit:

Schermopname van Azure Digital Twins Explorer met voorbeeldmodellen en tweelingen.

Maken met de API's

In deze sectie ziet u hoe het eruitziet om digitale tweelingen en relaties te maken vanuit een clienttoepassing. Het bevat .NET-codevoorbeelden die gebruikmaken van de DigitalTwins-API'som meer context te bieden over wat er binnen elk van deze concepten gebeurt.

Digitale tweelingen maken

Hieronder vindt u een fragment van clientcode dat gebruikmaakt van de DigitalTwins-API's om een dubbel van het type Room te maken met een die is gedefinieerd tijdens het twinId instantiëring.

U kunt de eigenschappen van een tweeling initialiseren wanneer deze wordt gemaakt of later instellen. Als u een tweeling met geitialiseerde eigenschappen wilt maken, maakt u een JSON-document met de benodigde initialisatiewaarden.

// Define a custom model type for the twin to be created

internal class CustomDigitalTwin
{
    [JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinId)]
    public string Id { get; set; }

    [JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinETag)]
    public string ETag { get; set; }

    [JsonPropertyName(DigitalTwinsJsonPropertyNames.DigitalTwinMetadata)]
    public MyCustomDigitalTwinMetadata Metadata { get; set; } = new MyCustomDigitalTwinMetadata();

    [JsonPropertyName("temperature")]
    public double Temperature { get; set; }

    [JsonPropertyName("humidity")]
    public double Humidity{ get; set; }
}

internal class MyCustomDigitalTwinMetadata
{
    [JsonPropertyName(DigitalTwinsJsonPropertyNames.MetadataModel)]
    public string ModelId { get; set; }

    [JsonPropertyName("temperature")]
    public DigitalTwinPropertyMetadata Temperature { get; set; }

    [JsonPropertyName("humidity")]
    public DigitalTwinPropertyMetadata Humidity { get; set; }
}

// Initialize properties and create the twin
public class TwinOperationsCreateTwin
{
    public async Task CreateTwinAsync(DigitalTwinsClient client)
    {
        // Initialize the twin properties
        var myTwin = new CustomDigitalTwin
        {
            Metadata = { ModelId = "dtmi:example:Room;1" },
            Temperature = 25.0,
            Humidity = 50.0,
        };

        // Create the twin
        const string twinId = "<twin-ID>";
        Response<CustomDigitalTwin> response = await client.CreateOrReplaceDigitalTwinAsync(twinId, myTwin);
        Console.WriteLine($"Temperature last updated on {response.Value.Metadata.Temperature.LastUpdatedOn}");
    }
}

U kunt ook een helperklasse met de naam gebruiken om eigenschapsvelden rechtstreekser op te slaan in een dubbelobject, als alternatief voor het BasicDigitalTwin gebruik van een woordenlijst. Zie de sectie Een digitale tweeling maken van How-to: Manage digital twins(Een digitale tweeling maken: digitale tweelingen beheren) voor meer informatie over de helperklasse en voorbeelden van het gebruik ervan.

Notitie

Dubbele eigenschappen worden behandeld als optioneel en hoeven dus niet te worden initialiseren, maar onderdelen op de dubbel moeten wel worden ingesteld wanneer de tweeling wordt gemaakt. Dit kunnen lege objecten zijn, maar de onderdelen zelf moeten bestaan.

Relaties maken

Hier volgen enkele voorbeeldclientcodes die gebruikmaakt van de DigitalTwins-API's om een relatie te bouwen van de ene digitale tweeling (de 'bron'-tweeling) naar een andere digitale tweeling (de 'doel'-tweeling).

var rel = new BasicRelationship
{
    TargetId = "myTargetTwin",
    Name = "contains", // a relationship with this name must be defined in the model
    // Initialize properties
    Properties =
    {
        { "active", true },
    },
};
await client.CreateOrReplaceRelationshipAsync("mySourceTwin", "rel001", rel);

JSON-weergaven van grafiekelementen

Gegevens van digitale tweelingen en relatiegegevens worden beide opgeslagen in JSON-indeling, wat betekent dat wanneer u een query uitvoert op de tweelinggrafiek in uw Azure Digital Twins-exemplaar, het resultaat een JSON-weergave is van digitale tweelingen en relaties die u hebt gemaakt.

JSON-indeling van digitale tweeling

Wanneer een digitale tweeling wordt weergegeven als een JSON-object, worden de volgende velden weergegeven:

Veldnaam Beschrijving
$dtId Een door de gebruiker opgegeven tekenreeks die de id van de digitale tweeling vertegenwoordigt
$etag Standaard HTTP-veld dat is toegewezen door de webserver
$conformance Een enum met de conformiteitsstatus van deze digitale tweeling (conformant, niet-conform, onbekend)
<property-name> De waarde van een eigenschap in JSON ( string , getaltype of object)
$relationships De URL van het pad naar de verzameling relaties. Dit veld is niet aanwezig als de digitale tweeling geen uitgaande relatieranden heeft.
$metadata.$model [Optioneel] De id van de modelinterface die deze digitale tweeling typeert
$metadata.<property-name>.desiredValue [Alleen voor beschrijfbare eigenschappen] De gewenste waarde van de opgegeven eigenschap
$metadata.<property-name>.desiredVersion [Alleen voor beschrijfbare eigenschappen] De versie van de gewenste waarde
$metadata.<property-name>.ackVersion De versie die is bevestigd door de apparaat-app die de digitale tweeling implementeert
$metadata.<property-name>.ackCode [Alleen voor beschrijfbare eigenschappen] De ack code die wordt geretourneerd door de apparaat-app die de digitale tweeling implementeert
$metadata.<property-name>.ackDescription [Alleen voor beschrijfbare eigenschappen] De ack beschrijving die wordt geretourneerd door de apparaat-app die de digitale tweeling implementeert
<component-name> Een JSON-object met de eigenschapswaarden en metagegevens van het onderdeel, vergelijkbaar met die van het hoofdobject. Dit object bestaat zelfs als het onderdeel geen eigenschappen heeft.
<component-name>.<property-name> De waarde van de eigenschap van het onderdeel in JSON ( string , getaltype of object)
<component-name>.$metadata De metagegevens voor het onderdeel, vergelijkbaar met het hoofdniveau $metadata

Hier is een voorbeeld van een digitale tweeling die is opgemaakt als een JSON-object:

{
  "$dtId": "Cafe",
  "$etag": "W/\"e59ce8f5-03c0-4356-aea9-249ecbdc07f9\"",
  "Temperature": 72,
  "Location": {
    "x": 101,
    "y": 33
  },
  "component": {
    "TableOccupancy": 1,
    "$metadata": {
      "TableOccupancy": {
        "desiredValue": 1,
        "desiredVersion": 3,
        "ackVersion": 2,
        "ackCode": 200,
        "ackDescription": "OK"
      }
    }
  },
  "$metadata": {
    "$model": "dtmi:com:contoso:Room;1",
    "Temperature": {
      "desiredValue": 72,
      "desiredVersion": 5,
      "ackVersion": 4,
      "ackCode": 200,
      "ackDescription": "OK"
    },
    "Location": {
      "desiredValue": {
        "x": 101,
        "y": 33,
      },
      "desiredVersion": 8,
      "ackVersion": 8,
      "ackCode": 200,
      "ackDescription": "OK"
    }
  }
}

JSON-indeling relatie

Wanneer een relatie van een digitale tweeling wordt weergegeven als een JSON-object, worden de volgende velden weergegeven:

Veldnaam Beschrijving
$relationshipId Een door de gebruiker opgegeven tekenreeks die de id van deze relatie vertegenwoordigt. Deze tekenreeks is uniek in de context van de digitale bron dubbel, wat ook betekent dat uniek is in de sourceId + relationshipId context van het Azure Digital Twins exemplaar.
$etag Standaard HTTP-veld dat is toegewezen door de webserver
$sourceId De id van de digitale bron dubbel
$targetId De id van de digitale doel dubbel
$relationshipName De naam van de relatie
<property-name> [Optioneel] De waarde van een eigenschap van deze relatie, in JSON ( string , getaltype of object)

Hier is een voorbeeld van een relatie die is opgemaakt als een JSON-object:

{
  "$relationshipId": "relationship-01",
  "$etag": "W/\"506e8391-2b21-4ac9-bca3-53e6620f6a90\"",
  "$sourceId": "GroundFloor",
  "$targetId": "Cafe",
  "$relationshipName": "contains",
  "startDate": "2020-02-04"
}

Volgende stappen

Zie grafiekelementen beheren met Azure Digital Twin-API's:

Of meer informatie over het uitvoeren van query's op Azure Digital Twins tweelinggrafiek voor informatie: