View a markdown version of this page

Entwickeln AWS IoT TwinMaker Konnektoren für Zeitreihen-Daten - AWS IoT TwinMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Entwickeln AWS IoT TwinMaker Konnektoren für Zeitreihen-Daten

In diesem Abschnitt wird Schritt für Schritt erklärt, wie Sie einen Zeitreihen-Datenkonnektor entwickeln. Darüber hinaus stellen wir ein Beispiel für einen Zeitreihen-Datenkonnektor vor, der auf dem gesamten Cookie Factory-Beispiel basiert und 3D-Modelle, Entitäten, Komponenten, Alarme und Konnektoren umfasst. Die Beispielquelle für die Cookie Factory ist im AWS IoT TwinMaker GitHub Beispiel-Repository verfügbar.

AWS IoT TwinMaker Voraussetzungen für den Time-Series-Datenkonnektor

Bevor Sie Ihren Zeitreihen-Datenkonnektor entwickeln, empfehlen wir Ihnen, die folgenden Aufgaben auszuführen:

Anmerkung

Ein Beispiel für einen vollständig implementierten Connector finden Sie in unserer Beispielimplementierung für eine Cookie Factory.

Time-series Hintergrund des Datenkonnektors

Stellen Sie sich vor, Sie arbeiten mit einer Fabrik zusammen, die über eine Reihe von Keksmischern und einen Wassertank verfügt. Sie möchten AWS IoT TwinMaker digitale Zwillinge dieser physischen Einheiten erstellen, sodass Sie deren Betriebszustand überwachen können, indem Sie verschiedene Zeitreihenmetriken überprüfen.

Sie haben Sensoren vor Ort eingerichtet und streamen bereits Messdaten in eine Timestream-Datenbank. Sie möchten in der Lage sein, die Messdaten AWS IoT TwinMaker mit minimalem Aufwand anzuzeigen und zu organisieren. Sie können diese Aufgabe mithilfe eines Zeitreihen-Datenkonnektors ausführen. Die folgende Abbildung zeigt ein Beispiel für eine Telemetrietabelle, die mithilfe eines Zeitreihenkonnektors gefüllt wird.

Ein Beispiel für Telemetrietabellendaten, die die Asset-ID, den Typ, die Kennzahl, die Zeit und die Werte enthalten.

Die in diesem Screenshot verwendeten Datensätze und die Timestream-Tabelle sind im Beispiel-Repository verfügbar. AWS IoT TwinMaker GitHub Sehen Sie sich auch den Cookie Factory-Beispielkonnektor für die Implementierung an, der das im vorherigen Screenshot gezeigte Ergebnis erzeugt.

Time-series Datenfluss des Datenkonnektors

AWS IoT TwinMaker Ruft bei Abfragen auf Datenebene die entsprechenden Eigenschaften sowohl der Komponenten als auch der Komponententypen aus den Definitionen von Komponenten und Komponententypen ab. AWS IoT TwinMaker leitet Eigenschaften zusammen mit allen API-Abfrageparametern in der Abfrage an AWS Lambda Funktionen weiter.

AWS IoT TwinMaker verwendet Lambda-Funktionen, um auf Abfragen aus Datenquellen zuzugreifen und diese zu lösen und die Ergebnisse dieser Abfragen zurückzugeben. Die Lambda-Funktionen verwenden die Komponenten- und Komponententypeigenschaften der Datenebene, um die ursprüngliche Anfrage zu lösen.

Die Ergebnisse der Lambda-Abfrage werden einer API-Antwort zugeordnet und an Sie zurückgegeben.

AWS IoT TwinMaker definiert die Datenkonnektor-Schnittstelle und verwendet diese für die Interaktion mit Lambda-Funktionen. Mithilfe von Datenkonnektoren können Sie Ihre Datenquelle ohne Datenmigrationsaufwand über die AWS IoT TwinMaker API abfragen. Die folgende Abbildung zeigt den grundlegenden Datenfluss, der in den vorherigen Absätzen beschrieben wurde.

API-Anfragen und -Antworten verwenden 3P Connector-Anfragen und -Antworten, die auf eine Datenquelle zugreifen.

Entwicklung eines Zeitreihen-Datenkonnektors

Das folgende Verfahren skizziert ein Entwicklungsmodell, das schrittweise zu einem funktionalen Zeitreihen-Datenkonnektor aufgebaut wird. Die grundlegenden Schritte sind wie folgt:

  1. Erstellen Sie einen gültigen Basiskomponententyp

    In einem Komponententyp definieren Sie gemeinsame Eigenschaften, die allen Komponenten gemeinsam sind. Weitere Informationen zum Definieren von Komponententypen finden Sie unter Komponententypen verwenden und erstellen.

    AWS IoT TwinMaker verwendet ein Modellierungsmuster für Entitätskomponenten, sodass jede Komponente einer Entität zugeordnet ist. Wir empfehlen, dass Sie jedes physische Objekt als Einheit modellieren und verschiedene Datenquellen mit ihren eigenen Komponententypen modellieren.

    Das folgende Beispiel zeigt einen Timestream-Vorlagenkomponententyp mit einer Eigenschaft:

    {"componentTypeId": "com.example.timestream-telemetry", "workspaceId": "MyWorkspace", "functions": { "dataReader": { "implementedBy": { "lambda": { "arn": "lambdaArn" } } } }, "propertyDefinitions": { "telemetryType": { "dataType": { "type": "STRING" }, "isExternalId": false, "isStoredExternally": false, "isTimeSeries": false, "isRequiredInEntity": true }, "telemetryId": { "dataType": { "type": "STRING" }, "isExternalId": true, "isStoredExternally": false, "isTimeSeries": false, "isRequiredInEntity": true }, "Temperature": { "dataType": { "type": "DOUBLE" }, "isExternalId": false, "isTimeSeries": true, "isStoredExternally": true, "isRequiredInEntity": false } } }

    Die wichtigsten Elemente des Komponententyps sind die folgenden:

    • Die telemetryId Eigenschaft identifiziert den eindeutigen Schlüssel des physischen Elements in der entsprechenden Datenquelle. Der Datenkonnektor verwendet diese Eigenschaft als Filterbedingung, um nur Werte abzufragen, die dem angegebenen Element zugeordnet sind. Wenn Sie außerdem den telemetryId Eigenschaftswert in die API-Antwort der Datenebene aufnehmen, verwendet die Clientseite die ID und kann bei Bedarf eine umgekehrte Suche durchführen.

    • Das lambdaArn Feld identifiziert die Lambda-Funktion, mit der der Komponententyp interagiert.

    • Das isRequiredInEntity Flag erzwingt die ID-Erstellung. Dieses Flag ist erforderlich, damit bei der Erstellung der Komponente auch die ID des Elements instanziiert wird.

    • Die TelemetryId wird dem Komponententyp als externe ID hinzugefügt, sodass das Element in der Timestream-Tabelle identifiziert werden kann.

  2. Erstellen Sie eine Komponente mit dem Komponententyp

    Um den von Ihnen erstellten Komponententyp zu verwenden, müssen Sie eine Komponente erstellen und sie an die Entität anhängen, von der Sie Daten abrufen möchten. In den folgenden Schritten wird der Prozess der Erstellung dieser Komponente detailliert beschrieben:

    1. Navigieren Sie zur AWS IoT TwinMaker -Konsole.

    2. Wählen Sie denselben Arbeitsbereich aus, in dem Sie die Komponententypen erstellt haben, und öffnen Sie ihn.

    3. Navigieren Sie zur Entitätsseite.

    4. Erstellen Sie eine neue Entität oder wählen Sie eine vorhandene Entität aus der Tabelle aus.

    5. Nachdem Sie die Entität ausgewählt haben, die Sie verwenden möchten, wählen Sie Komponente hinzufügen, um die Seite Komponente hinzufügen zu öffnen.

    6. Geben Sie der Komponente einen Namen und wählen Sie als Typ den Komponententyp aus, den Sie mit der Vorlage in 1 erstellt haben. Erstellen Sie einen gültigen Basiskomponententyp.

  3. Rufen Sie für Ihren Komponententyp einen Lambda-Connector auf

    Der Lambda-Connector muss auf die Datenquelle zugreifen und die Abfrageanweisung auf der Grundlage der Eingabe generieren und an die Datenquelle weiterleiten. Das folgende Beispiel zeigt eine JSON-Anforderungsvorlage, die dies tut.

    { "workspaceId": "MyWorkspace", "entityId": "MyEntity", "componentName": "TelemetryData", "selectedProperties": ["Temperature"], "startTime": "2022-08-25T00:00:00Z", "endTime": "2022-08-25T00:00:05Z", "maxResults": 3, "orderByTime": "ASCENDING", "properties": { "telemetryType": { "definition": { "dataType": { "type": "STRING" }, "isExternalId": false, "isFinal": false, "isImported": false, "isInherited": false, "isRequiredInEntity": false, "isStoredExternally": false, "isTimeSeries": false }, "value": { "stringValue": "Mixer" } }, "telemetryId": { "definition": { "dataType": { "type": "STRING" }, "isExternalId": true, "isFinal": true, "isImported": false, "isInherited": false, "isRequiredInEntity": true, "isStoredExternally": false, "isTimeSeries": false }, "value": { "stringValue": "item_A001" } }, "Temperature": { "definition": { "dataType": { "type": "DOUBLE", }, "isExternalId": false, "isFinal": false, "isImported": true, "isInherited": false, "isRequiredInEntity": false, "isStoredExternally": false, "isTimeSeries": true } } } }

    Die wichtigsten Elemente der Anfrage:

    • Die selectedProperties ist eine Liste, die Sie mit den Eigenschaften füllen, für die Sie Timestream-Messungen wünschen.

    • Die endTime Felder startDateTimestartTime,EndDateTime, und geben einen Zeitraum für die Anfrage an. Dies bestimmt den Probenbereich für die zurückgegebenen Messungen.

    • Das entityId ist der Name der Entität, von der aus Sie Daten abfragen.

    • Das componentName ist der Name der Komponente, von der aus Sie Daten abfragen.

    • Verwenden Sie das orderByTime Feld, um die Reihenfolge zu organisieren, in der die Ergebnisse angezeigt werden.

    In der vorherigen Beispielanfrage würden wir erwarten, dass wir innerhalb des angegebenen Zeitfensters für das angegebene Element eine Reihe von Stichproben für die ausgewählten Eigenschaften in der ausgewählten Zeitreihenfolge erhalten. Die Antwortanweisung kann wie folgt zusammengefasst werden:

    { "propertyValues": [ { "entityPropertyReference": { "entityId": "MyEntity", "componentName": "TelemetryData", "propertyName": "Temperature" }, "values": [ { "time": "2022-08-25T00:00:00Z", "value": { "doubleValue": 588.168 } }, { "time": "2022-08-25T00:00:01Z", "value": { "doubleValue": 592.4224 } }, { "time": "2022-08-25T00:00:02Z", "value": { "doubleValue": 594.9383 } } ] } ], "nextToken": "..." }
  4. Aktualisieren Sie Ihren Komponententyp, sodass er über zwei Eigenschaften verfügt

    Die folgende JSON-Vorlage zeigt einen gültigen Komponententyp mit zwei Eigenschaften:

    { "componentTypeId": "com.example.timestream-telemetry", "workspaceId": "MyWorkspace", "functions": { "dataReader": { "implementedBy": { "lambda": { "arn": "lambdaArn" } } } }, "propertyDefinitions": { "telemetryType": { "dataType": { "type": "STRING" }, "isExternalId": false, "isStoredExternally": false, "isTimeSeries": false, "isRequiredInEntity": true }, "telemetryId": { "dataType": { "type": "STRING" }, "isExternalId": true, "isStoredExternally": false, "isTimeSeries": false, "isRequiredInEntity": true }, "Temperature": { "dataType": { "type": "DOUBLE" }, "isExternalId": false, "isTimeSeries": true, "isStoredExternally": true, "isRequiredInEntity": false }, "RPM": { "dataType": { "type": "DOUBLE" }, "isExternalId": false, "isTimeSeries": true, "isStoredExternally": true, "isRequiredInEntity": false } } }
  5. Aktualisieren Sie den Lambda-Connector, um die zweite Eigenschaft zu verarbeiten

    Die AWS IoT TwinMaker Datenebenen-API unterstützt das Abfragen mehrerer Eigenschaften in einer einzigen Anfrage und AWS IoT TwinMaker folgt einer einzelnen Anfrage an einen Connector, indem sie eine Liste von bereitstellt. selectedProperties

    Die folgende JSON-Anfrage zeigt eine geänderte Vorlage, die jetzt eine Anforderung für zwei Eigenschaften unterstützt.

    { "workspaceId": "MyWorkspace", "entityId": "MyEntity", "componentName": "TelemetryData", "selectedProperties": ["Temperature", "RPM"], "startTime": "2022-08-25T00:00:00Z", "endTime": "2022-08-25T00:00:05Z", "maxResults": 3, "orderByTime": "ASCENDING", "properties": { "telemetryType": { "definition": { "dataType": { "type": "STRING" }, "isExternalId": false, "isFinal": false, "isImported": false, "isInherited": false, "isRequiredInEntity": false, "isStoredExternally": false, "isTimeSeries": false }, "value": { "stringValue": "Mixer" } }, "telemetryId": { "definition": { "dataType": { "type": "STRING" }, "isExternalId": true, "isFinal": true, "isImported": false, "isInherited": false, "isRequiredInEntity": true, "isStoredExternally": false, "isTimeSeries": false }, "value": { "stringValue": "item_A001" } }, "Temperature": { "definition": { "dataType": { "type": "DOUBLE" }, "isExternalId": false, "isFinal": false, "isImported": true, "isInherited": false, "isRequiredInEntity": false, "isStoredExternally": false, "isTimeSeries": true } }, "RPM": { "definition": { "dataType": { "type": "DOUBLE" }, "isExternalId": false, "isFinal": false, "isImported": true, "isInherited": false, "isRequiredInEntity": false, "isStoredExternally": false, "isTimeSeries": true } } } }

    In ähnlicher Weise wird auch die entsprechende Antwort aktualisiert, wie im folgenden Beispiel gezeigt:

    { "propertyValues": [ { "entityPropertyReference": { "entityId": "MyEntity", "componentName": "TelemetryData", "propertyName": "Temperature" }, "values": [ { "time": "2022-08-25T00:00:00Z", "value": { "doubleValue": 588.168 } }, { "time": "2022-08-25T00:00:01Z", "value": { "doubleValue": 592.4224 } }, { "time": "2022-08-25T00:00:02Z", "value": { "doubleValue": 594.9383 } } ] }, { "entityPropertyReference": { "entityId": "MyEntity", "componentName": "TelemetryData", "propertyName": "RPM" }, "values": [ { "time": "2022-08-25T00:00:00Z", "value": { "doubleValue": 59 } }, { "time": "2022-08-25T00:00:01Z", "value": { "doubleValue": 60 } }, { "time": "2022-08-25T00:00:02Z", "value": { "doubleValue": 60 } } ] } ], "nextToken": "..." }
    Anmerkung

    In Bezug auf die Paginierung in diesem Fall gilt die Seitengröße in der Anfrage für alle Eigenschaften. Das heißt, bei fünf Eigenschaften in der Abfrage und einer Seitengröße von 100 sollten Sie, wenn genügend Datenpunkte in der Quelle vorhanden sind, mit 100 Datenpunkten pro Eigenschaft rechnen, also insgesamt 500 Datenpunkte.

    Eine Beispielimplementierung finden Sie unter Snowflake-Connector-Beispiel unter. GitHub

Verbessern Sie Ihren Datenkonnektor

Umgang mit Ausnahmen

Es ist sicher, dass der Lambda-Connector Ausnahmen auslöst. Beim API-Aufruf der Datenebene wartet der AWS IoT TwinMaker Dienst darauf, dass die Lambda-Funktion eine Antwort zurückgibt. Wenn die Connector-Implementierung eine Ausnahme auslöst, AWS IoT TwinMaker übersetzt sie den Ausnahmetyp in den Typ B und macht den API-Client darauf aufmerksamConnectorFailure, dass ein Problem innerhalb des Connectors aufgetreten ist.

Umgang mit der Paginierung

Im Beispiel bietet Timestream eine Hilfsfunktion, mit der die Paginierung nativ unterstützt werden kann. Bei einigen anderen Abfrageschnittstellen, wie z. B. SQL, ist jedoch möglicherweise zusätzlicher Aufwand erforderlich, um einen effizienten Paginierungsalgorithmus zu implementieren. Es gibt ein Beispiel für einen https://github.com/aws-samples/aws-iot-twinmaker-samples-snowflake/blob/main/src/modules/snowflake/data-connector/lambda_connectors/data_reader_by_entity.py Snowflake-Connector, der die Paginierung in einer SQL-Schnittstelle verarbeitet.

Wenn das neue Token AWS IoT TwinMaker über die Connector-Antwortschnittstelle zurückgegeben wird, wird das Token verschlüsselt, bevor es an den API-Client zurückgegeben wird. Wenn das Token in einer anderen Anfrage enthalten ist, wird es AWS IoT TwinMaker entschlüsselt, bevor es an den Lambda-Connector weitergeleitet wird. Wir empfehlen, dass Sie vermeiden, dem Token vertrauliche Informationen hinzuzufügen.

Testen Sie Ihren Connector

Sie können die Implementierung zwar immer noch aktualisieren, nachdem Sie den Connector mit dem Komponententyp verknüpft haben, wir empfehlen jedoch dringend, den Lambda-Connector zu überprüfen, bevor Sie ihn integrieren AWS IoT TwinMaker.

Es gibt mehrere Möglichkeiten, Ihren Lambda-Connector zu testen: Sie können den Lambda-Connector in der Lambda-Konsole oder lokal in der testen. AWS CDK

Weitere Informationen zum Testen Ihrer Lambda-Funktionen finden Sie unter Testen von Lambda-Funktionen und Lokales Testen von Anwendungen. AWS CDK

Sicherheit

Eine Dokumentation zu den bewährten Sicherheitsmethoden mit Timestream finden Sie unter Sicherheit in Timestream.

Ein Beispiel für den Schutz vor SQL-Injection finden Sie im folgenden Python-Skript im AWS IoT TwinMaker Samples GitHub Repository.

Erstellen AWS IoT TwinMaker Ressourcen

Sobald Sie die Lambda-Funktion implementiert haben, können Sie AWS IoT TwinMaker Ressourcen wie Komponententypen, Entitäten und Komponenten über die AWS IoT TwinMaker Konsole oder API erstellen.

Anmerkung

Wenn Sie die Einrichtungsanweisungen im GitHub Beispiel befolgen, sind alle AWS IoT TwinMaker Ressourcen automatisch verfügbar. Sie können die Definitionen der Komponententypen im AWS IoT TwinMaker GitHub Beispiel überprüfen. Sobald der Komponententyp von einer Komponente verwendet wird, können die Eigenschaftsdefinitionen und Funktionen des Komponententyps nicht mehr aktualisiert werden.

Integrationstests

Wir empfehlen, einen integrierten Test durchzuführen, AWS IoT TwinMaker um zu überprüfen, ob die Datenebenenabfrage durchgängig funktioniert. Sie können dies über die GetPropertyValueHistory API oder einfach in der AWS IoT TwinMaker Konsole durchführen.

Auf einer Konsolenseite mit TwinMaker Komponenteninformationen werden Name, Typ, Status usw. der Komponente angezeigt.

Gehen Sie in der AWS IoT TwinMaker Konsole zu den Komponentendetails, und dann werden Sie unter Test sehen, dass alle Eigenschaften der Komponente dort aufgelistet sind. Im Testbereich der Konsole können Sie sowohl Eigenschaften von Zeitreihen als auch Eigenschaften testen, die keine Zeitreihen sind. Für Zeitreiheneigenschaften können Sie auch die API verwenden und für Eigenschaften, die keine Zeitreihen sind, die GetPropertyValueHistory API. GetPropertyValue Wenn Ihr Lambda-Connector mehrere Eigenschaftsabfragen unterstützt, können Sie mehr als eine Eigenschaft auswählen.

Ein Teil einer Konsolenseite mit TwinMaker Komponenteninformationen, auf dem der Test einer Komponente angezeigt wird.

Was kommt als Nächstes

Sie können jetzt ein AWS IoT TwinMaker Grafana-Dashboard einrichten, um Metriken zu visualisieren. Sie können auch andere Beispiele für Datenkonnektoren im AWS IoT TwinMaker GitHub Beispiel-Repository untersuchen, um festzustellen, ob sie zu Ihrem Anwendungsfall passen.