1. Inhaltsverzeichnis
2. Allgemein
2.1 Geräte
Die Darstellung der Geräte wird durch ihre eindeutigen Seriennummern identifiziert. Diese Datenobjekte enthalten eine Untergruppe von Informationen sowie eine Liste von SensorIds für Datensenken, die Messdaten enthalten. Mit dem angegebenen API-Schlüssel werden der Benutzer und die verknüpften Geräte identifiziert.
2.2 Sensoren
Sensoren stellen eine Datensenke dar, in der die Daten eines Laufs gespeichert werden. Jeder Sensor hat ein Start- und Enddatum. Seine Sensor-ID ist eindeutig und mit Messungen, Geolocation und Ereignisdaten verknüpft.
Sobald das Gerät neu gestartet wird, wird eine neue Sensordatensenke mit einer neuen ID erstellt.
2.3 Wortlaut
Physikalisches Gerät
Ein physisches Gerät wird durch eine Seriennummer identifiziert und hat 1 bis n Kanäle.
Jeder Kanal kann unabhängig konfiguriert werden (z.B. eigenes Messintervall) und hat einen oder mehrere Sensoren, die 1 bis m verschiedene Sensorwerte liefern können.
Zum Beispiel;
ein Wert: Temperatur (für einen Temperatursensor)
zwei Tupel von: relative Feuchte und Temperatur (für einen rH-Sensor)
Drei-Tupel von: status, #changes, relative on (für einen DI-Sensor)
Virtuelle Darstellung mit alarmierender
In elproCLOUD haben wir eine Eins-zu-Eins-Zuordnung von Gerät und Kanal.
Für die Werte eines Sensors haben wir eine eins-zu-n-Zuordnung zu virtuellen Sensoren.
Ein virtueller Sensor wird für jede Konfiguration eines realen Sensors erstellt und dient dazu, verschiedene Arten von Alarmen mit demselben Sensorwert zu verbinden.
2.4 Datenformat
Beachten Sie, dass jedes von der API akzeptierte und zurückgegebene JSON dem JSON-Standard entsprechen muss, wie er in der ECMA-404 Standard mit den folgenden Änderungen.
JSON-Eigenschaftsnamen sind unabhängig von der Groß-/Kleinschreibung und es kann keine Garantie für die Groß-/Kleinschreibung von Namen gegeben werden, die von der API zurückgegeben werden. Das bedeutet, dass kein Unterschied zwischen Groß- und Kleinbuchstaben in Eigenschaftsnamen gemacht wird.
Die relative Reihenfolge der JSON-Namen in Antworten kann nicht garantiert werden. Das bedeutet, dass Sie sich beim Parsen und Verarbeiten von Antworten nicht auf die Reihenfolge der Eigenschaften in den Antworten verlassen sollten.
3. REST-API
Der Client kann über die REST-API Informationen von elproCLOUD anfordern. Die Kommunikation läuft typischerweise in der folgenden Reihenfolge ab:
Das Gerät sendet seine Daten und Vorkommnisse in einem festgelegten Zeitintervall an die elproCLOUD.
Es gibt Mechanismen, bei denen das Gerät seine Daten direkt an die elproCLOUD sendet und nicht auf das nächste Kommunikationsintervall wartet.
Die Kunden-App fordert die Daten von elproCLOUD über die REST-API bei Bedarf oder in einem selbst definierten Intervall an. Dieses Intervall sollte auf der Grundlage einer Risikoeinschätzung festgelegt werden.
Bitte beachten Sie, dass einige Abfrageergebnisse eingeschränkt sind
Spezifikation:
Der Endpunkt REST API URL https://apibridge.elpro.cloud
Das API-Token wird von ELPRO bereitgestellt
Für Entwickler die technische Spezifikation von OpenAPI als Swagger UI https://apibridge.elpro.cloud/swagger
3.1 Datensätze und allgemeines Abfrageschema
Der Kunde kann verschiedene Datensätze anfordern, darunter
Messungen
Geodaten
Vorkommen
Abweichung
3.1.1 Art des Sicherheitssystems
Zunächst richtet ELPRO einen API-Schlüssel für einen bestimmten Benutzer einer Organisation ein.
Geben Sie Ihren API-Autorisierungscode im Anfrage-Header als Schlüssel und Wert an:
EAPI-ELCLV2 | 123a45b67_SAMPLE_f12345ab6c789d0 |
Im Falle eines Fehlens oder einer Nichtübereinstimmung wird eine Fehlermeldung mit dem HTTP-Status 401 "Nicht autorisiert" zurückgegeben.
3.1.2 Benutzerumfang
Die abgerufenen Daten fallen in den Bereich der Organisation des authentifizierten API-Benutzers. Sie werden mit dem HTTP-Statuscode 200 (Erfolg) zurückgegeben.
3.1.3 Http-Fehler-Codes
400 Schlechte Anfrage | z.B. fehlender obligatorischer Parameter |
401 Nicht autorisiert | Ungültiger oder fehlender API-Schlüssel |
404 Ressource nicht gefunden | Ungültige Seriennummer oder ID |
406 Nicht akzeptabel | Accept Header sollte nur application/json lauten |
410 Lizenz erschöpft | Anzahl der verbrauchten Abfragen oder Datentransfers |
500 Server-Fehler | Unerwartete interne Ausnahme |
503 Dienst vorübergehend nicht verfügbar | Dienst aufgrund von Wartung oder Update nicht verfügbar |
3.2 Version der REST-API
Für die REST-API ist ein Versionierungsmechanismus implementiert.
Die Versionierung umfasst eine Major- und eine Minor-Nummer.
Major-Nummern stellen eine Schnittstelle zur elproCLOUD zur Verfügung und werden erhöht, wenn die Funktionalität der Schnittstelle drastisch verändert wird. Minor-Nummern werden erhöht, wenn der zurückgegebenen Datenstruktur Informationen hinzugefügt werden.
Die wichtigsten REST-API-Versionen werden weiterhin über die URL verfügbar sein.
elprocloud_request_url/api/v1/... (für v1 der REST-API)
elprocloud_request_url/api/v2/... (für v2 der REST-API)
Major.Minor Versionierung wird in der zurückgegebenen JSON-Antwort enthalten sein.
{ "version": "<Major.Minor>", }
4. Nachrichten-Warteschlange (AMQP)
Es wird eine "Kunden-Warteschlange" mit dem AMQ-Protokoll bereitgestellt, die erreichbar ist unter amqp.elpro.cloud.
Die Warteschlangen-Name ist der Name der explizit bereitgestellten RabbitMQ-Warteschlange. Warteschlange und Benutzer werden von ELPRO verwaltet.
Außerdem eine einzigartige Benutzername und Passwort für jeden Kunden bereitgestellt wird. Unten in diesem Dokument finden Sie ein Beispiel für eine Implementierung.
Jeder Kunde kann einen AMQP-Client seiner Wahl zum Lesen und Bestätigen auf dem Liste der Nachrichtentypen.
Die Verbindung ist TLS nur (Port 443)
In Produktion die Zeit zu leben (TTL) der Warteschlangendaten wird auf drei Tage festgelegt.
4.1 Nachrichtenmodelle
Die Warteschlangen-Nachrichten haben folgende grundlegende Nutzdaten im JSON-Format:
Feldname | Typ | Beschreibung |
Typ | String | Mögliche Nachrichtentypen:
|
Daten | JSON-Objekt | Innere JSON-Darstellung einer Info-Nachricht, siehe Info-Datenmodelle weiter unten in diesem Dokument |
4.2 Nachrichtentyp
Jeder Typ repräsentiert eine spezielle JSON-Nutzlast innerhalb des Data JSON-Objekts. So weiß ein Verbraucher, welches Datenmodell verwendet wird.
eapi_measurement_new
eapi_geodata_new
eapi_Ereignis_neu
eapi_deviation_enter
eapi_deviation_leave
4.3 Datenmodelle
Die Daten-Nutzdaten sind für jeden Typ unterschiedlich.
4.3.1 Messung
Feldname | Typ | Beschreibung |
sensorId | Int64 | Id für die Sensordaten, die eine Datensenke darstellen. |
deviceId | String | Kennung des Geräts |
Wert | Dezimal | Numerischer Wert der Maßnahme
|
Zeitstempel | DateTimeOffset | DateTime der Messung als Zeitzone utc |
Einheit | String | Einheit Token Mögliche Werte: K,°C,°F, % |
unitType | String | Typ der Einheit als Text:
|
4.3.1.1 Beispiel-Messungen
Daten mit Typ: "eapi_measurement_new"
{ "type": "eapi_measurement_new", "data": { "timeStamp": "2022-10-11T16:21:27+00:00", "value": 24.6, "unit": "°C", "unitType": “temperature", "deviceId": "951FF00000340", "sensorId": "5368" } }
4.3.2 GeoDaten
Feldname | Typ | Beschreibung |
sensorId | Int64 | Id für die Sensordaten, die eine Datensenke darstellen. |
deviceId | String | Kennung des Geräts |
Breitengrad | Doppelter | Breitengrad mit 8 Ziffern Genauigkeit |
Längengrad | Doppelter | Längengrad mit 8 Ziffern Genauigkeit |
Zeitstempel | DateTimeOffset | datetime in der Zeitzone utc |
Genauigkeit | Dezimal | Genauigkeit in Metern |
4.3.2.1 Beispiel GeoDaten
Daten mit Typ: "eapi_geodata_new"
{ "type": "eapi_geodata_new", "data": { "timeStamp": "2022-10-11T15:21:24+00:00", "latitude": 47.19999075, "longitude": 9.50875282, "accuracy": 2316, "deviceId": "951FF00000340", "sensorId": "5369" } }
4.3.3 Vorkommen
Feldname | Typ | Beschreibung |
sensorId | Int64 | Id für die Sensordaten, die eine Datensenke darstellen. |
deviceId | String | Kennung des Geräts |
Zeitstempel | DateTime | DatumZeitpunkt des Auftretens als Zeitzone utc |
typeName | String | "LoggerStatusÄnderung" |
previousState | String | Mögliche Werte: "Undefined", "Init", "Shelflife", "Pairing", "Start", "LogDelayed", "LogTransit", LogPaused", "LogArrived", "StopStopped", "StopSleep", "Calibration", "EmergencyReadOut", "FatalError", "ProductionCalibration" |
neuerStatus | String |
4.3.3.1 Beispielvorkommen
Daten mit dem Typ "eapi_occurrence_new"
{ "type": "eapi_occurrence_new", "data": { "timeStamp": "2022-10-11T15:21:24+00:00", "typeName": "LoggerStatusChange", "previousState": "Start", "newState": "LogDelayed", "deviceId": "951FF00000340", "sensorId": "5369" } }
4.3.4 Abweichung
Feldname | Typ | Beschreibung |
sensorId | Int64 | Id für die Sensordaten, die eine Datensenke darstellen. |
deviceId | String | Kennung des Geräts |
Zeitstempel | DateTimeOffset | DateTime der Abweichung als Zeitzone utc |
historyType | String | Typ der Abweichung beschreibt den Beginn oder das Ende der Abweichung. Mögliche Werte: "eingeben" |
deviationType | String | Abweichungstyp, mögliche Werte: "Batterie", |
Grund | String | Abweichung Erklärung Code |
limitzone | String (opt.) | Grenzwert Zonencode für eine Grenzwertabweichung Mögliche Werte: L1,L2,L3, H1,H2,H3... |
4.3.4.1 Beispiel Abweichung eingeben
Daten mit dem Typ "eapi_deviation_enter"
{ "type": "eapi_deviation_enter", "data": { "deviceId": "951FF00000340", "sensorId": 5763, "timeStamp": "2022-10-26T17:00:22+00:00", "historyType": "enter", "deviationType": "limit", "reason": "upper_limit_alarm" } }
4.3.4.2 Beispiel Abweichung Urlaub
Daten mit dem Typ "eapi_deviation_leave"
{ "type": "eapi_deviation_leave", "data": { "deviceId": "951FF00000340", "sensorId": 5763, "timeStamp": "2022-10-26T18:00:22+00:00", "historyType": "leave", "deviationType": "limit", "reason": "upper_limit_alarm" } }
4.4 AMQP-Nachrichten verbrauchen
4.4.1 Beispiel-Client-Code mit RabbitMQ in C#
Beispielcode für die Verbindung zu einer Warteschlange mit .NET und der Nuget-Bibliothek RabbitMQ:
public ObservableCollection<MessageModel> Messages { get; private set; } public static IConnection connection; public static IModel channel; public static EventingBasicConsumer consumer; public void Read() { var serverName = "amqp.elpro.cloud" var queueName = "398ab9ae90efce88dcf623cc49e302e1"; bool autoACK = true; try { // Prepare var factory = new ConnectionFactory() { HostName = serverName, UserName = "user", Password = "password", Port = 443, Ssl = new SslOption() { Enabled = true, ServerName = serverName } }; connection = factory.CreateConnection(); channel = connection.CreateModel(); var routingKey = $"*.eapi_*"; //*.eapi_measurement_new e.g. Console.WriteLine(" [*] Waiting for msgs."); // Consumer consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var messageText = Encoding.UTF8.GetString(body); var message = new MessageModel(ea.RoutingKey, messageText); Dispatcher.Dispatch(() => Messages.Add(message)); }; // Subscribe channel.BasicConsume(queue: queueName, autoAck: autoACK, consumer: consumer); } catch (Exception ex) { Console.WriteLine($"Error at RabbitMQ.Test: {ex.Message}"); } }
5. Anschlussdetails und technische Spezifikation
Endpunkt REST API URL https://apibridge.elpro.cloud
AMQP-Server: amqp.elpro.cloud
Für Entwickler die technische Spezifikation von OpenAPI als Swagger UI https://apibridge.elpro.cloud/swagger