Praxisnahes Anwendungsbeispiel für Industrie 4.0/Logistik 4.0 anhand von iPad-/iPhone-Sensordaten

22.12.2021

Abstract

Im Rahmen des Vorlesungsmoduls Advanced Manufacturing (kurz: AMAN) des Masterstudiengangs Wirtschaftsingenieurwesens an der Hochschule für angewandte Wissenschaften Würzburg-Schweinfurt werden von den Studierenden Blogartikel zu verschiedenen Themen verfasst. In diesem Blog-Post wird ein praxisnahes und ein selbstständig replizierbares Anwendungsbeispiel vorgestellt, welches mögliche Industrie 4.0/Logistik 4.0 Anwendungen wie zum Beispiel Smart Packaging und Maschinenzustandsüberwachung nachbildet. Hierfür werden Sensordaten zweier Applegeräte mittels der SensorLog Applikation (kurz: App) von Thomas (2021) ausgelesen, an eine Datenbank (mongoDB) gesendet und in dieser entsprechend über ein Dashboard visualisiert. Für das Übertragen der Gerätesensordaten (konkret: einmal iPad und einmal iPhone) von der SensorLog App an die mongoDB werden zwei Alternativen vorgestellt. Hierbei handelt es sich um einen Webserver (für HTTP-Requests) und TCP-Server (für TCP-Stream), welche mittels Python aufgesetzt wurden.

Keywords: Anwendungsbeispiel, HTTP, TCP, mongoDB, Cloud, iPhone, iPad, SensorLog, Dashboard, Port-Forwarding

Einleitung

Nahezu genau vor zehn Jahren wurde auf der Hannover Messe der Begriff Industrie 4.0 erstmalig formuliert und eröffnete somit die Diskussion um den vielzitierten Paradigmenwechsel der vierten industriellen Revolution in der Industrie (Kagermann et al. 2011). Nach den drei vorherigen tiefgreifenden Wandlungen der Mechanisierung, der Elektrifizierung sowie der Automatisierung (Kagermann et al. 2013), wurde in Zusammenhang mit dem Internet der Dinge (engl. Internet of Things, kurz: IoT) im industriellen Umfeld damals u.a. von der „digitalen Veredelung von Produktionsanlagen und industriellen Erzeugnissen“ (Kagermann et al. 2011) gesprochen. Im Mittelpunkt standen hierbei zunächst v.a. Maschinen, Betriebsmittel und Lagersysteme, die durch einen eigenständigen Informationsaustausch, das Herbeiführen von Aktionen sowie das selbständige Steuern eine globale Vernetzung in der Produktion bewirken sollten (Kagermann et al. 2013, S. 2).

Trotz der Vorteile, wie zum Beispiel höhere Produktivität, neue Formen der Arbeit, innovative Geschäftsmodelle und geringere CO2-Emmissionen durch Effizienzsteigerungen, stufen sich laut einer aktuellen Studie des Bundesverband Informationswirtschaft, Telekommunikation und Neue Medien e.V (kurz: Bitkom) 66 % der befragten Unternehmen im Hinblick auf das Thema Industrie 4.0 als Nachzügler oder als abgehängt ein (Bitkom 2021).

In diesem Blog-Post wird ein Anwendungsbeispiel vorgestellt, welches mögliche Industrie 4.0/Logistik 4.0 Anwendungen wie zum Beispiel Smart Packaging und Maschinenzustandsüberwachung nachbildet. Konkret handelt es sich hierbei, wie in Abbildung 1 dargestellt, um die Anbindung zweier Apple-Produkte (1) via TCP-Stream und HTTP-Requests über die im Apple Store erhältliche SensorLog App von Thomas (2021) (3) an eine Datenbank (hier: MongoDB)(4) mit anschließender Visulisierung (5) der gesendeten Daten. Zusätzlich wurde ein Port-Forwarding (2) im Local Area Network (kurz: LAN) eingerichtet, um aus dem World Wide Network (kurz: WAN) die Datensendung zu ermöglichen – d.h. auch eine Verbindung außerhalb des Privaten-Netzwerks herstellen zu können. Die Varianten des TCP-Streams bzw. HTTP-Requests werden gewählt, um zwei verschiedene Austauschmöglichkeiten für das angesprochene Smart Packaging und die Maschinenzustandsüberwachung vorzustellen. Die erwähnte SensorLog App kann dabei als Art Programm oder ähnliches, das auf den Maschinen/GPS-Trackern (hier: Apple-Geräte) installiert ist, angesehen werden.

Abbildung 1: Architektur des Anwendungsbeispiels (Quelle: Eigene Darstellung)

Anwendungsbeispiel

In dem folgenden Kapitel wird nun genau beschrieben, wie die einzelnen Teil-Lösungen aus Abbildung 1 erstellt und konfiguriert werden müssen.

Aufsetzen einer mongoDB Atlas in der Cloud

Als erstes wird das Erstellen der Datenbank beschrieben. Diese wird benötigt, um eine Speicherung der gesendeten Daten zu ermöglichen. In diesem Beispiel wurde die mongoDB Atlas gewählt. Dies ist eine nicht-rationale Datenbank[1] (Not only SQL kurz: NoSQL) in der Cloud, sodass ein dezentraler Zugriff gewährleistet ist. Hierzu muss nicht, wie bei einer rationalen Datenbank eine Tabelle mit Spalten angelegt werden, sondern jede Nachricht (in unserem Fall das vollständige JSON-Objekt) kann ohne Veränderung an die Datenbank geschickt und dort in eine sogenannte Collection gespeichert werden. Dies vermindert den Arbeitsaufwand, z.B. für die Datenverarbeitung. Wie diese Datenbank von Anfang an zu Konfigurieren ist, wird nun in einer Bilderanleitung erklärt:

Im ersten Schritt (vgl. Abbildung 2) muss nach aufrufen des Links mongoDB Atlas ein Account für eine entsprechende mongoDB angelegt werden. Dies ist bis zu einem Speicherplatz von 512 MB kostenlos möglich.

Abbildung 2: Anlage eines Accounts bei mongoDB (Quelle: Eigene Darstellung)

Nun kann auf den erstellten Account und die mongoDB-Umgebung zugegriffen werden (vgl. Abbildung 3). In diesem Zusammenhang liefert mongoDB eine Hilfestellung für die ersten Schritte, welche im linken unteren Bildschirmbereich angezeigt wird (Hinweis: In Abbildung 3 ist diese nicht zu sehen).

Abbildung 3: mongoDB-Umgebung (Quelle: Eigene Darstellung)

Anschließend kann durch Anklicken des in Abbildung 4 markierten Buttons eine Datenbank angelegt werden.

Abbildung 4: Anlage einer Datenbank (Quelle: Eigene Darstellung)

Im darauffolgenden Fenster können die Bereitstellungsoptionen sowie ein Name des Clusters[2], welches in diesem Zuge ebenfalls angelegt wird, gewählt werden. Die entsprechende Abbildung 5 und Abbildung 6 zeigen beispielsweise die Auswahl der kostenfreien und über AWS in Frankfurt gehosteten Variante (grundsätzlich werden noch weitere Public Clouds, wie z.B. Azure, unterstützt). Nach Anklicken der entsprechenden Buttons kann durch geringfügiges Scrollen nach unten eine Clustername eingegeben werden (vgl. Abbildung 7). Über den Button Create Cluster werden die Eingaben bestätigt.

Abbildung 5: Einstellung der Bereitstellungsoptionen – Teil 1 (Quelle: Eigene Darstellung)


Abbildung 6: Einstellung der Bereitstellungsoptionen – Teil 2 (Quelle: Eigene Darstellung)


Abbildung 7: Eingabe Clustername (Quelle: Eigene Darstellung)

Im Folgenden können durch Auswahl des Button Quickstart die Authentifizierungs-/Verbindungseinstellungen hinterlegt werden (vgl. Abbildung 8). Die Authentifizierung kann entweder durch die Vergabe eines Benutzernamens und eines Passworts oder durch ein entsprechendes Zertifikat eingestellt werden. Im vorliegenden Beispiel wurde die Variante Benutzername und Passwort verwendet und anschließend mit dem Button Create User bestätigt.

Bzgl. den Verbindungseinstellungen kann entweder die lokale oder die Cloud-Umgebung angewählt werden (im Beispiel wurde die lokale Umgebung verwendet), welche im weiteren Verlauf zur Anbindung des HTTP-/TCP-Servers benötigt werden. Im Feld IP Address kann dann anschließend entweder die IP-Adresse eines bestimmten Gerätes oder die 0.0.0.0/0 eingegeben werden. Durch Eingabe von 0.0.0.0/0 ist eine unbestimmte Verbindung bzw. eine Verbindung über sämtlichen IP-Adressen möglich. Über das Eingabefeld Description kann die Verbindung benannt werden. Durch Klick auf Add Entry werden die Daten hinterlegt. Im vorliegenden Fall wurde die Adresse 0.0.0.0/0 eingegeben.

Abbildung 9 fasst die im vorliegenden Beispiel verwendeten Eingaben noch einmal zusammen. Anschließend kann auf Finish and Close geklickt werden.

Abbildung 8: Authentifizierungs-/Verbindungseinstellungen (Quelle: Eigene Darstellung)


Abbildung 9: Beispiel für Authentifizierungs-/Verbindungseinstellungen (Quelle: Eigene Darstellung)

Nun wird im Hintergrund die Datenbank erstellt. Dies kann einige Minuten in Anspruch nehmen.

In der Cluster-Übersicht, die unter dem Navigationspunkt Databases (vgl. linker Navigationsbaum) zu finden ist, kann nun durch Auswahl des Buttons Browse Collection eine Collection angelegt werden (vgl. Abbildung 10).

Abbildung 10: Anlage Collection (Quelle: Eigene Darstellung)

Im darauffolgenden Fenster kann über die Auswahl des Buttons Collections und Create Database (vgl. Abbildung 11) das Fenster, welches in Abbildung 12 zu sehen ist, geöffnet werden. In diesem Fenster kann ein Datenbank- sowie ein Collectionname eingefügt werden. Die Eingaben können über den Button Create bestätigt werden. Wie aus Abbildung 11 zu entnehmen ist, wurde im vorliegenden Beispiel der Datebankname AMAN_Blogpost bzw. der Collectionname Device_data gewählt.

Abbildung 11: Aufruf des Fensters Create Database (Quelle: Eigene Darstellung)


Abbildung 12: Fenster für Eingabe des Datenbank-/Collectionnamens (Quelle: Eigene Darstellung)

Nun kann der im späteren Verlauf noch notwendige Connection String generiert werden. Hierfür ist zunächst unter dem Navigationspunkt Databases (vgl. linker Navigationsbaum) im zuvor definierten Cluster (hier: AMANBLOG) der Button Connect anzuwählen (vgl. Abbildung 13).

Abbildung 13: Generierung Connection String – Teil 1 (Quelle: Eigene Darstellung)

Anschließend kann im sich öffnenden Fenster die Auswahl Connect your application getroffen werden.

Abbildung 14: Generierung Connection String – Teil 2 (Quelle: Eigene Darstellung)

Nun kann die entsprechend verwendete Programmiersprache (hier: PythonVersion 3.11 or later) ausgewählt werden. Anschließend wird der angesprochene Connection String in der unteren Hälfte des Fensters angezeigt (vgl. Abbildung 15).

Abbildung 15: Generierung Connection String – Teil 3 (Quelle: Eigene Darstellung)

Nach Erstellung des Connection Strings ist das Aufsetzen der mongoDB abgeschlossen.

Port-Forwarding (Optional)

Sofern ein Austausch von Sensordaten des iPhones/iPads außerhalb des lokalen Netzwerks und somit eine externe Verbindung zu lokalen IP-Adressen (z.B. der im Beispiel verwendete HTTP-/TCP-Server) gewünscht ist, kann hierfür das sogenannte Port-Forwarding am hauseigenen Router freigeschaltet werden. Falls dies nicht erwünscht ist, sondern lediglich eine Verwendung im Heimnetz (kurz: LAN), kann dieses Teilkapitel übersprungen werden.

Im Folgenden wird diesbezüglich ein entsprechendes Beispiel zu einem Vodafone-Router gegeben.

Nach dem Einloggen auf der Weboberfläche des Routers, kann unter Internet à Port-Forwarding das +, welches ebenfalls unter Port-Forwarding zu finden ist, angeklickt werden. Im Anschluss hierauf öffnet sich die unter Abbildung 16 gezeigte Eingabemaske. In diesem Fenster sind folgende Eingaben zu tätigen:

  1. Dienstname: Hier kann ein beliebiger Name eingegeben werden.
  2. Gerät: Hier ist das Gerät, welches als HTTP-/TCP-Server dient, auszuwählen. Im vorliegenden Beispiel ist dies der Computer, auf dem der gezeigte Python-Code läuft. Nach Auswahl des Gerätes wird die LAN-IP-Adresse automatisch befüllt.
  3. Protokoll: Hier ist das Protokoll TCP zu wählen.
  4. – 6. Port: Hier kann entweder ein fester Port oder ein Port-Bereich definiert werden. Im vorliegenden Beispiel wird ein fester Port, z.B. WAN Port = 5000 und LAN Port = 5001, hinterlegt.

Abbildung 16: Eingabemaske Vodafone-Router (Quelle: Eigene Darstellung)

Für die Fritzbox kann die ähnliche Einstellung nach Einloggen auf der Weboberfläche des Routers unter

Internet -> Freigaben -> Reiter: Portfreigaben -> Gerät für Freigaben hinzufügen -> Gerät einfügen -> unten: neue Freigabe -> Portfreigabe hinterlegt werden.

Eine weiter Hilfestellung hierzu bietet dieser Link.

Aufsetzen eines Webservers für HTTP-Requests und Verbindung mit der mongoDB

In diesem Kapitel wird beschrieben, wie ein HTTP-Webserver aufgesetzt und eine Verbindung zur mongoDB bereitgestellt werden kann. Dieser Webserver wird mittels Python und Anlehnung an Full Stack Python (o. J.) erstellt. Zum Nachvollziehen dieser Schritte werden zwei Python-Programme vorgestellt ConnectionmongoDb.py und Flask_Webserver.py. Entsprechende Erläuterungen sind als Kommentar direkt im Code zu finden.

ConnectionmongoDB.py

#Importieren der Bibliothek, um folgende Funktionen zu ermöglichen: (a) zur Verbindungsherstellung mit der mongoDB als Client
from pymongo import MongoClient #(a)
#Funktion für den Verbindungsaufbau mit der mongoDB atlas
class Connect(object):
    def __init__(self) -> None:
        super().__init__()
        self.mongo_connection = self.get_connection()
    @staticmethod  
#Hinterlegen des Connection-String, welcher für eine Verbindung zur mongoDB atlas notwendig ist (siehe Abbildung 15 "Aufsetzen einer mongoDB Atlas in der Cloud")
#Achtung: Zuerst muss der zuvor angelegte User und das zugehörige Passwort (siehe Abbildung 9 in Kapitel "Aufsetzen einer mongoDb Atlas in der Cloud) in dem String ersetzt werden!
#Connection-String: 'mongodb+srv://:@amanblog.zzwag.mongodb.net/?retryWrites=true&w=majority'  
    def get_connection():
        return MongoClient("mongodb+srv://dbuser:@amanblog.zzwag.mongodb.net/AMAN_Blogpost?retryWrites=true&w=majority")
#Funktion um in die Collection 'Device_data' zu schrieben in der Datenbank 'AMAN_Blogpost'. Hierbei ist zudem wichtig,
#hat die Variable 'object_to_insert' ein JSON als Inhalt ist insert_one zu wählen.
    def inser_dict(self, object_to_insert):
        self.mongo_connection['AMAN_Blogpost']['Device_data'].insert_one(object_to_insert)

Flask_Webserver.py

#Importieren von verschiedenen Bibliotheken, um folgende Funktionen zu ermöglichen: (a) Erstellen eines Webservers via Flask; (b) Verarbeiten von Antworten,

#die der Flask-Webserver bekommt; (c) Verbindungsherstellung mit der mongoDB; (d) Arbeiten mit JSON-Objekten
from flask import Flask         #(a)
from flask import request       #(b)
from mongodb import Connect     #(c)
import json                     #(d)
#Funktion, um die empfangene Nachricht vom iPad an die Datenbank zuschicken. Hierbei bedient sich die Funktion aus dem Python-Programm mongodb.py,
#um die Funktionen zur Verbindungsherstellung aufzurufen
def mongo_insert(object_dict, connection):
    object_dict = json.loads(object_dict)
    print(object_dict)
#Hilfestellung zum Überprüfen, ob die richtigen Daten ankommen, d.h. ist deviceID  in dem JSON-Objekt enthalten, dann wird das JSON-Objekt weiter geleitet.
    if 'deviceID' in object_dict.keys():
        connection.inser_dict(object_dict)
#Definieren des Webservers
app = Flask(__name__)
#Definieren der API, durch das Wählen der Backslash. Damit sieht die API folgendermaßen aus http://:, um den Webserver zu erreichen.
#Zudem wird die Methode POST definiert, um Nachrichten an den Webserver schicken zu können
@app.route('/', methods = ['POST'])
def update_text():
    mongo_insert(request.data, mongo_connector)
    return ""
#HTTP-Server konfigurieren, in dem eine IP-Adresse und ein Port gewählt wird. Wird die IP-Adresse 0.0.0.0 gewählt, wird beim Start des Webservers automatisch,
#die IP-Adresse des Rechners verwendet
if __name__ == "__main__":
    mongo_connector = Connect()
    app.run(debug=True, host='0.0.0.0', port=5001)
.

Aufsetzen eines TCP-Servers für die Stream-Funktion und Verbindung mit der mongoDB

In diesem Kapitel wird die Stream-Funktion der SensorLog-App (via TCP) vorgestellt. Hierzu wird ein TCP-Server (inkl. Socket[3]) aufgesetzt, über den die Sensordaten des Applegeräts in JSON-Format abgefragt und in die mongoDB weitergeleitet werden. Der diesbezügliche Python-Code, welcher in Anlehnung an Blissett (2021) und MongoDB (2021b) entwickelt wurde, stellt sich wie folgt dar (entsprechende Erläuterungen sind als Kommentar direkt im Code zu finden):

#Importieren von verschiedenen Bibliotheken, um folgende Funktionen zu ermöglichen: (a) Generieren eines Sockets;
#(b) Arbeiten mit JSON-Objekten; (c) Verbindungsherstellung mit der mongoDB
import socket   #(a)
import json     #(b)
import pymongo  #(c)
from pymongo import MongoClient #(c)
#Erstellen eines Sockets
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Stellt sicher, dass Server schnell neugestartet werden kann, wenn er ausfällt
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#Festlegen des client socket TCP Ports in der Variable "well-known port"
#Bei Port-Forwarding: Hier den Port eingeben, der auch im Router angegeben wurde
well_known_port = 65296
sock.bind(('', well_known_port))
#Legt die Anzahl der auf eine Verbindung wartenden Clients fest, die in eine Warteschlange gestellt werden können
sock.listen(5)
#Schleife, die auf Verbindungen wartet (mit Ctrl-C beenden)
try:
    while 1:
        newSocket, address = sock.accept(  )
        print ("Connected from", address)
        #Schleife für Erfassung des neuen Clients
        while 1:
            receivedData = newSocket.recv(1024)
            #receiveData enthält die Sensordaten des Geräts
            if not receivedData: break
            #Echo der Daten, die gerade empfangen wurden
            newSocket.send(receivedData)
            #Konvertieren der Sensordaten aus receivedData in ein JSON-Objekt und Speichern der Daten
            #in die Variable data
            data = json.loads(receivedData)
            #Hilfestellung zum Überprüfen, ob die richtigen Daten ankommen, d.h. ist deviceID in dem
            #JSON-Objekt enthalten, dann wird das JSON-Objekt weitergeleitet
            if "deviceID" in data.keys():
                def get_database():
                    #Hinterlegen des Connection-Strings, welcher für eine Verbindung zur mongDB atlas notwendig ist
                    #(siehe Abbildung 15 in Kapitel "Aufsetzen einer mongoDB Atlas in der Cloud")
                    #Achtung: Zuerst muss der zuvor angelegte User und das zugehörige Passwort (siehe Abbildung 9
                    #in Kapitel "Aufsetzen einer mongoDb Atlas in der Cloud) in dem String ersetzt werden!
                    #Connection-String: 'mongodb+srv://dbuser:@amanblog.zzwag.mongodb.net/
                    #AMAN_Blogpost?retryWrites=true&w=majority'
                    CONNECTION_STRING = "mongodb+srv://dbuser:@amanblog.zzwag.mongodb.net/AMAN" \
                                        "_Blogpost?retryWrites=true&w=majority"
                    #Erstellen einer Verbindung mit MongoClient
                    client = MongoClient(CONNECTION_STRING)
                    #Hier den Datenbanknamen einfügen
                    return client['AMAN_Blogpost']
                #Dies wurde hinzugefügt, damit viele Dateien die Funktion get_database() wiederverwenden können.
                if __name__ == "__main__":
                    # Abrufen der Datenbank
                    dbname = get_database()
                #Hier den Collectionnamen einfügen
                collection_name = dbname["Device_data"]
                collection_name.insert_one(data)
            #Zeigt die an die Datenbank gesendeten Daten an
            print("Gesendete Daten:", data)
        newSocket.close(  )
        print ("Disconnected from", address)
finally:
    sock.close(  )
.

Konfiguration der SensorLog App

Im nächsten Schritt sind die Konfigurationseinstellungen in der SensorLog App vorzunehmen. Die App ist hierbei für das Auslesen sowie das standardisierte Bereitstellen der Sensordaten zuständig. Nachfolgend werden in Abbildung 17 die entsprechenden App-Einstellungen aufgezeigt. Dabei gelten die orangemarkierten Einstellungen sowohl für die HTTP-Requests als auch den TCP-Stream, die blaumarkierten nur für den TCP-Stream und die grünmarkierten nur für die HTTP-Requests.

Abbildung 17: Konfiguration der SensorLog App – Teil 1 (Quelle: Eigene Darstellung)

Allgemeine Einstellungen (orange)

Zunächst kann in den General Logging Settings die logging rate (1) eingestellt werden. Im vorliegenden Beispiel wurde diese auf 30 s gesetzt, sodass alle 30 Sekunden eine Nachricht gesendet wird. Anschließend kann das log format (2 – hier: JSON-Format) festgelegt werden. Durch die Bestätigung des Auswahlfelds JSON pretty print (3) wird das JSON-Objekt im späteren Verlauf lesbarer und attraktiver dargestellt. Über fill missing data with previous data (4) kann, wie der Name bereits verrät, eingestellt werden, dass in dem JSON-Objekt die fehlenden Daten mit vorherigen Daten ergänzt werden. Im vorliegenden Beispiel wurden (3) und (4) ebenfalls angewählt. Unter device ID (5) kann noch ein Name des Gerätes hinterlegt werden. Im Beispiel wurde hier my_iOS_ipad bzw. my_iOS_iPhone verwendet.

TCP-Stream Einstellungen (blau)

In den Streaming Settings kann zunächst der mode (1) ausgewählt werden. Da im vorliegenden Beispiel das iPhone/iPad als Client und das Gerät, auf dem der oben beschriebene Python-Code ausgeführt wird, als Server verwendet wird, wurde an dieser Stelle das Client-Auswahlfeld bestätigt. Anschließend kann das verwendete protocol (2 – hier: TCP) ausgewählt werden. Abschließend ist bei ip und port (3) zudem noch die IP-Adresse und der Port anzugeben, welche(r) im Router angezeigt bzw. eingegeben wurde. Falls kein Port-Forwarding verwendet wird, ist hier die IP-Adresse des Geräts, auf dem der oben beschriebene Code ausgeführt wird, sowie der entsprechend im Code gewählte Port anzugeben.

HTTP-Requests Einstellungen (grün)

In den HTTP-Settings sind zunächst die IP-Adresse und der Port (1) anzugeben, welche(r) im Router angezeigt bzw. eingegeben wurde. Auch hier gilt, falls kein Port-Forwarding verwendet wird, dass an dieser Stelle die IP-Adresse des Geräts, auf dem der oben beschriebene Code ausgeführt wird, sowie der entsprechend im Code gewählte Port anzugeben ist. Anschließend ist bei HTTP method (2) die POST-Variante anzuwählen, da von Seiten des Apple-Geräts Daten gesendet werden. Analog zum oben erwähnten log format und der logging rate ist im nächsten Schritt bei payload coding (3) das JSON-Format sowie bei upload (4) 30 Sekunden auszuwählen, damit im späteren Verlauf bei den HTTP-Requests dieses Format verwendet wird und die Requests in einem Rhythmus von 30 Sekunden ausgeführt werden. Abschließend ist noch der additional HTTP header (5) abzuwählen, da im vorliegenden Beispiel keine allgemeinen/zusätzlichen Informationen von Relevanz sind.

Nachdem nun je nach Verwendung der Variante des HTTP-Requests oder des TCP-Streams die entsprechenden Einstellungen vorgenommen wurden, können im nächsten Schritt die Sensoren und Daten an-/abgewählt werden, die gesendet werden sollen. Wie aus Abbildung 18 und Abbildung 19 unter (6) und (7) zu sehen ist, wurde im vorliegenden Beispiel altitude, (relative), pressure, battery, coordinates, speed, altitude, course, device orientation und device ID ausgewählt.

Die übrigen Sensor-Konfigurationen können, wie in Abbildung 19 angezeigt, unverändert übernommen werden.

Abbildung 18: Konfiguration der SensorLog App – Teil 2 (Quelle: Eigene Darstellung)


Abbildung 19: Konfiguration der SensorLog App – Teil 3 (Quelle: Eigene Darstellung)

Starten der HTTP-Request

Nachdem nun die entsprechenden Einstellungen für die HTTP-Requests vorgenommen wurden, können die Requests in der SensorLog App gestartet werden, indem das Feld send http requests angewählt wird (vgl. Abbildung 20). Damit die gesendeten Nachrichten der App auch wirklich ankommen, muss zuvor sichergestellt werden, dass in einer Entwicklungsumgebung (kann beliebig gewählt werden, in diesem Beispiel wurde Visual Studio Code verwendet) der Python-Code Flask_Webserver.py gestartet wurde. Dies kann im Terminal der entsprechenden Entwicklungsumgebung anhand der in Abbildung 21 dargestellten Ausgabe überprüft werden.

Abbildung 20: HTTP-Request in der SensorLog App starten (Quelle: Eigene Darstellung)


Abbildung 21: Webserver starten (Quelle: Eigene Darstellung)

Starten des TCP-Streams

Nachdem nun der Python-Code (vgl. Kapitel Aufsetzen eines TCP-Servers und Verbindung mit der MongoDB) die verschiedenen Einstellungen in der SensorLog App (vgl. Kapitel Konfiguration der SensorLog App) vorbereitet wurden, kann der TCP-Stream gestartet werden.

Hierzu ist zunächst der Code in der entsprechenden Entwicklungsumgebung (hier z.B. PyCharm) auszuführen. Anschließend kann, wie in Abbildung 22 angedeutet, in der SensorLog App das Feld log to stream (1) aktiviert werden.

Abbildung 22: Starten des TCP-Streams – Teil 1 (Quelle Eigene Darstellung)

Nach Aktivierung des Feldes log to stream sollte nun eine Hinweismeldung in der App erscheinen (vgl. Abbildung 23, die die Verbindung zwischen Client und Server bestätigt. In der Entwicklungsumgebung, in der der Code ausgeführt wird, erscheint weiterhin die Ausgabe Connected from :. Die hier angezeigte IP-Adresse entspricht dabei der Adresse des Applegeräts. Der angezeigte Port kann jedoch von dem eingegebenen Port abweichen.

Abbildung 23: Starten des TCP-Stream – Teil 2 (Quelle: Eigene Darstellung)

Zu guter Letzt kann nach dem Bestätigen der Hinweismeldung aus Abbildung 23 (2) das Konfigurationsmenü über den kleinen Pfeil im oberen linken Eck in Abbildung 23 verlassen werden (3) und der Stream über den Play-Button ((4) – vgl. Abbildung 24) gestartet werden.

Je nach gewählter logging rate werden nun die Daten in die hinterlegte Datenbank gesendet. Eine entsprechende Meldung ist auch in der Entwicklungsumgebung ersichtlich.

Abbildung 24: Starten des TCP-Streams – Teil 3 (Quelle: Eigene Darstellung)

Visualisierung der Daten in der mongoDB

In diesem Kapitel wird nun beschrieben, wie direkt in der mongoDB die Daten visualisiert werden können. Diese direkte und intuitive Visualisierung ist ein wesentlicher Vorteil von mongoDB. Diesbezüglich wird nachfolgend Schritt für Schritt erklärt, welche Einstellungen vorgenommen werden müssen. Außerdem werden zwei Beispielcharts (Visualisierung des Batteriestatus und der Standortdaten (vgl. Abbildung 36 und Abbildung 37)) vorgestellt.

Um die Umgebung zur Visualisierung in der mongoDB zu erreichen, muss der Button Charts ausgewählt werden (vgl. Abbildung 25).

Abbildung 25: Erreichen der Visualsierungsumgebung in der mongoDB (Quelle: Eigene Darstellung)

Im nächsten Schritt muss die richtige Datenquelle angebunden werden. Diese Einstellung wird unter Data Source (vgl. Abbildung 26) vorgenommen.

Abbildung 26: Verküpfen der benötigten Datenquelle– Teil 1 (Quelle: Eigene Darstellung)

Durch das Klicken auf Add Data Source (vgl. Abbildung 27) öffnet sich ein Pop-Up Fenster (vgl. Abbildung 28) in dem im ersten Schritt das entsprechende Cluster ausgewählt werden muss. In unserem Fall ist dies das Cluster AMANBLOG. Im zweiten Schritt (vgl. Abbildung 29) muss nun die richtige Datenbank mit der zugehörigen Collection gewählt werden, im vorliegenden Fall ist die Datenbank = AMAN_Blogpost und Collection = Device_data. Mit Klicken auf Finish wird diese Eingabe bestätigt.

Abbildung 27: Verküpfen der benötigten Datenquelle– Teil 2 (Quelle: Eigene Darstellung)


Abbildung 28: Verküpfen der benötigten Datenquelle– Teil 3 (Quelle: Eigene Darstellung)


Abbildung 29: Verküpfen der benötigten Datenquelle– Teil 4 (Quelle: Eigene Darstellung)

Nun kann mit dem Dashboard begonnen werden. Durch das Klicken auf Add Dashboard (vgl. Abbildung 30). Daraufhin öffnet sich ein Pop-Up Fenster (vgl. Abbildung 31) in dem ein Name und eine Beschreibung für das Dashboard gewählt werden kann.

Abbildung 30: Erstellen eines Dashboard – Teil 1 (Quelle: Eigene Darstellung)


Abbildung 31: Erstellen eines Dashboard – Teil 2 (Quelle: Eigene Darstellung)

Um nun die Daten aus der Datenbank in einem Chart visualisieren zu können, muss ein Chart hinzugefügt werden. Dies erfolgt durch Klicken auf den Button Add Chart (vgl. Abbildung 32).

Abbildung 32: Erstellen eines Charts (Quelle: Eigene Darstellung)

In dem erstellten Chart muss nun als erstes die Datenquelle gewählt werden. Dies erfolgt durch Auswahl des Dropdown-Menüs Choose a Data Source (vgl. Abbildung 33). Hierbei öffnet sich ein Menü mit allen verknüpften Datenquellen. In diesem Fall wurde die Datenquelle AMAN_Blogpost.Device_data gewählt.

Abbildung 33: Chart mit Datenquelle verknüpfen (Quelle: Eigene Darstellung)

Nun tauchen auf der linken Seite des Browsers (vgl. Abbildung 34) die Datenfelder auf. Mit den entsprechenden Feldern kann nun eine Datentransformation vorgenommen werden. Hierbei muss bei dem einzelnen Feld auf die drei Punkte und dann auf Convert type geklickt werden (vgl. Abbildung 34). Daraufhin kann das gewünschte Datenformat gewählt werden (z. B. string, number, date, etc.). In Abbildung 35 ist zu sehen, dass dies für alle Felder, die für unsere Beispiel Visualisierung benötigt werden, bereits erledigt wurde.

Abbildung 34 Formatieren der einzelnen Felder (Quelle: Eigene Darstellung)


Abbildung 35: Beispiel aller Konvertierten Felder für das Anwendungsbeispiel (Quelle: Eigene Darstellung)

Nach der Transformation können nun zum Beispiel die gesendeten Batteriedaten (batterylevel) in ein Liniendiagramm überführt werden. Hierzu können der Abbildung 36 die entsprechenden Einstellungen (vgl. orangefarbene Umrandung) entnommen werden, um einen Verlauf über die Zeit des Akkuzustands der Applegeräte darzustellen. Dabei lassen sich die benötigten Felder (auf der linken Seite des Browsers) mittels Drag & Drop in die entsprechenden Zielboxen ziehen. Mit Klicken auf den Button Save kann das generierte Chart gespeichert werden.

Wie in der Einleitung beschrieben, könnte so, sinnbildlich, eine Maschinenüberwachung nachempfunden werden.

Abbildung 36: Chart Batteriestatus der Applegeräte (Quelle: Eigene Darstellung)

Als nächstes können die gesendeten Longitude-/Lattitude-Daten dazu verwendet werden, die Bewegungsdaten der Apple-Geräte in einer Karte zu visualisieren. Im Sinne des in der Einleitung erwähnten Smart Packagings oder Logistik 4.0 könnte so, im übertragenen Sinne, z.B. die Bewegung eines Pakets oder eines LKWs nachgezeichnet werden.

Hierzu sind erneut (analog zu Abbildung 35) die Typen der Felder, wie z.B. deviceID, locationLattitude, locationLongitude, etc., in die benötigten Datentypen zu konvertieren. Anschließend können die konvertierten Felder sowie die weiteren Einstellungen, wie in Abbildung 37 orangefarben umrandet, hinterlegt werden. Im rechten Teil des Bildschirms (vgl. Abbildung 37) werden dann die Bewegungsdaten der beiden Geräte (iPhone und iPad) entsprechend über einen Scatterplot in einer Karte visualisiert. Es ist zu sehen, dass sich das iPhone vorwiegend zwischen Würzburg und Schweinfurt bewegt hat, wohingegen das iPad zunächst in Würzburg und anschließend in Hammelburg unterwegs war. Aus Abbildung 37 ist weiterhin zu erkennen, dass das Funksignal des iPads zwischen Würzburg und Hammelburg verloren gegangen ist, sodass in diesem Zusammenhang keine Daten gesendet werden konnten.

Abbildung 37: Chart Standortdaten der Applegeräte (Quelle: Eigene Darstellung)

Bei näherer Betrachtung der visualisierten Bewegungsdaten (vgl. Abbildung 38 und Abbildung 39) wird anhand der versetzten Punkte nochmals der 30 sekündliche Rhythmus deutlich, in dem die Daten des iPhones/iPads gesendet wurden. Außerdem ist anhand Farbstärke zu erkennen, wo das iPhone/iPad stehen geblieben ist. Im übertragenen Sinne bzw. im Beispiel des beschriebenen Smart Packagings bzw. Logistik 4.0 könnte an dieser Stelle beispielsweise ein Lkw entladen worden sein.

Abbildung 38: Nähere Betrachtung des Charts Standortdaten der Applegeräte – Teil 1 (Quelle: Eigene Darstellung)


Abbildung 39: Nähere Betrachtung des Charts Standortdaten der Applegeräte – Teil 2 (Quelle: Eigene Darstellung)

Abschließend können die beiden Charts, die in Abbildung 36 (Batteriestatus der Applegeräte) und Abbildung 37 (Standortdaten der Applegeräte) erstellt wurden, in einem Dashboard zusammengefasst werden. Hierzu ist lediglich der Save-Button (vgl. Abbildung 37 im oberen rechten Eck) zu betätigen. Die Größe und Anordnung beiden erstellten Charts kann dann nach Belieben verändert und somit das Dashboard fertiggestellt werden.

Abbildung 40: Dashboard mit beiden Charts (Quelle: Eigene Darstellung)

Zu guter Letzt kann das Dashboard anschließend über den Button Share freigeben werden. Hierbei ist es möglich, einzelnen Personen eine Zugangsberechtigung zu dem Dashboard zu erteilen. Alternativ kann auch ein öffentlicher Link erstellt werden, der entsprechend weitergeleitet werden kann. Im vorliegenden Beispiel wurde ein Link generiert:

Dashboard der Datenbank AMAN_Blogpost[4]

Über den Button Force Refresh, der über den Drei-Punkte-Button erreicht werden kann, können die Daten bedarfsorientiert aktualisiert werden.

Nachlesen von ergänzenden Informationen zu einzelnen Sensoren

Wie aus der Visualisierung bzgl. des Batteriestatus (vgl. Abbildung 36) ersichtlich ist, werden im Hinblick auf die Batteriedaten des iPads zum Teil Werte von -1 gesendet. Dies wirkt zunächst so, als würde hier ein Fehler vorliegen. Allerding hängt dies mit den im Rahmen von Abbildung 37 angesprochenen Signalverlust zusammen. An dieser Stelle bietet die SensorLog Applikation jedoch auch durch Anklicken der Informationsbuttons in den Einstellungen (vgl. z.B. die Markierung in Abbildung 41) verschiedene Verweise auf die Apple-Developer Internetseite, die entsprechende Erläuterungen der diversen Sensordaten liefert.

Abbildung 41: Weitere Informationen zu den gesendeten Daten (Quelle: Eigene Darstellung)

In Zusammenhang mit der battery kann hier z.B. unter Discussion (vgl. Abbildung 42) nachgelesen werden, dass der in der Visualisierung angezeigte Wert von -1 offensichtlich dann verwendet wird, wenn der Batteriestatus unbekannt ist.

Abbildung 42: Beschreibung zu Battery level/Battery state (Quelle: Eigene Darstellung in Anlehnung an Apple Inc. (2021))

Somit sind sämtliche Teil-Lösungen aus Abbildung 1 erstellt, konfiguriert und können als Gesamtanwendung umgesetzt werden.

Fazit

Im vorliegenden Blog-Beitrag wurde ein Anwendungsbeispiel aufgezeigt, welches praxisnah und mit verhältnismäßig einfachen sowie kostengünstigen Mitteln Themen wie Industrie 4.0/Logistik 4.0 nachempfindet. Konkret wurden diesbezüglich, wie in der Architektur in Abbildung 1 skizziert, die Sensordaten zweier Applegeräte über die im App-Store erhältliche SensorLog App ausgelesen und visualisiert. Hierfür wurde zunächst eine cloudbasierte mongoDB aufgesetzt. Des Weiteren wurde ein Webserver sowie ein TCP-Server (inkl. Socket) in Python programmiert. Diese ermöglichen das Übertragen von Sensordaten im Sinne des Request-Response-Prinzips bzw. der synchronen Kommunikation[5] via HTTP-Requests oder TCP-Stream in die mongoDB. Um die Sensordaten der Applegeräte auch außerhalb des Heimnetzwerks auslesen zu können, wurde weiterhin ergänzend eine Anleitung für das sogenannte Port Forwarding vorgestellt. Anschließend wurde ein Beispiel aufgezeigt, wie die in der Datenbank hinterlegten Sensordaten direkt in der mongoDB über ein Dashboard mit entsprechenden Charts dargestellt werden können. Dieses Dashboard kann mit einem in der Industrie bzw. Logistik verwendeten Dashboard verglichen werden. Die darin enthaltenen Batteriedaten der Applegeräte können beispielsweise analog zu Maschinenzustandsdaten, wie z.B. die Drehzahl einer Fräsmaschine, angesehen werden. Ebenso verhält es sich mit den visualisierten Ortungsdaten. Diese können in Anlehnung an Logistik 4.0 bzw. Smart Packaging wie das Verfolgen von Produkten oder Fahrzeugen über GPS-Koordinaten betrachtet werden. Die Ausgestaltung dieser beiden Industrie 4.0/Logistik 4.0 Annäherungen kann je nach Ausgestaltung als Cloud-, Fog- oder Edge-Computing realisiert werden. Im vorliegenden Fall handelt es sich um ein Anwendungsbeispiel, welches aufgrund der cloudbasierten mongoDB verstärkt dem Cloud-Computing zuzuordnen ist.[6]

[1] Im Vergleich zu relationalen Datenbanken, welche Tabellen mit Spalten und Zeilen nutzen, verwenden NoSQL Datenbanken beispielsweise Objekte, Wertepaare, Dokumente oder Listen und Reihen für die Daten Organisation (Luber und Litzel 2017).

[2] Der Zweck eines Clusters besteht u.a. darin, Sicherheit im Sinne einer hohen Verfügbarkeit der Daten zu gewährleisten. Hierfür erfolgt eine horizontale Skalierung der Server. Nähere Informationen zu dieser Thematik können unter diesem Link nachgelesen werden.

[3] Bei einem Socket handelt es sich um einen Kommunikationsendpunkt, der zum Austausch von Meldungen und Daten dient. In Zusammenhang mit Client-Server-Architekturen sind Sockets ein Standardhilfsmittel mit denen Server beliebige Services an eine Vielzahl von Clients verteilen. (Lipinski et al. 2021)

[4] Alternativ: https://charts.mongodb.com/charts-project-0-vlrql/public/dashboards/b1120b86-5164-4827-b93f-68ce5d16f9cd

[5] Für eine Einführung in die Thematik der synchronen und asynchronen Kommunikationskonzepte siehe: Einführung in synchrone und asynchrone Kommunikationskonzepte (Alternativ: http://kabasumo.de/wordpress/iotstarter/einfuehrung-in-synchrone-und-asynchrone-kommunikationskonzepte/)

[6] Für eine detailliertere Einführung in die Themen Cloud-, Fog-, und Edge-Computing kann auf folgenden Beitrag verwiesen werden: Einführung in Cloud-, Folg- und Edge-Computing (Alternativ: http://kabasumo.de/wordpress/iotstarter/einfuehrung-in-cloud-fog-und-edge-computing/)

Literaturverzeichnis

Apple Inc. (2021): batteryLevel. Discussion. Online verfügbar unter https://developer.apple.com/documentation/uikit/uidevice/1620042-batterylevel?language=objc#discussion, zuletzt geprüft am 17.12.2021.

Bitkom (2021): 10 Jahre Industrie 4.0. Online verfügbar unter https://www.bitkom.org/sites/default/files/2021-08/20210820_bitkom-positionspapier_-10-jahre-industrie-4.0-.pdf, zuletzt aktualisiert am 13.08.2021, zuletzt geprüft am 03.12.2021.

Blissett, Luther (2021): Writing a TCP Server. Hg. v. O’Reilly. Online verfügbar unter https://www.oreilly.com/library/view/python-cookbook/0596001673/ch10s03.html, zuletzt geprüft am 17.12.2021.

Full Stack Python (o. J.): Flask. Online verfügbar unter https://www.fullstackpython.com/flask.html, zuletzt geprüft am 16.12.2021.

Kagermann, Henning; Wahlster, Wolfgang; Helbig, Johannes (2013): Umsetzungsempfehlungen für das Zukunftsprojekt Industrie 4.0. Online verfügbar unter https://www.acatech.de/wp-content/uploads/2018/03/Abschlussbericht_Industrie4.0_barrierefrei.pdf, zuletzt geprüft am 03.12.2021.

Kagermann, Henning; Wolf-Dieter, Lukas; Wahlster, Wolfgang (2011): Industrie 4.0: Mit dem Internet der Dinge auf dem Weg zur 4. industriellen Revolution. In: VDI nachrichten (13), S. 2.

Lipinski, Klaus; Lackner, Hans; Laué, Oliver P.; Kafka, Gerhard; Niemann, Alexander; Raasch, Eberhard et al. (2021): Socket. Online verfügbar unter https://www.itwissen.info/Socket-socket.html, zuletzt aktualisiert am 16.02.2021, zuletzt geprüft am 22.12.2021.

Luber, Stefan; Litzel, Nico (2017): Was ist NoSQL? Hg. v. Vogel IT-Medien GmbH. Online verfügbar unter https://www.bigdata-insider.de/was-ist-nosql-a-615718/, zuletzt geprüft am 10.12.2021.

MongoDB, Inc. (2021a): Database. Deploy a multi-cloud database. Online verfügbar unter https://www.mongodb.com/atlas/database, zuletzt geprüft am 17.12.2021.

MongoDB, Inc. (2021b): How to Use Python with MongoDB. Online verfügbar unter https://www.mongodb.com/languages/python, zuletzt geprüft am 17.12.2021.

Thomas, Bernd (2021): SensorLog. Version 4.0 (b007). Online verfügbar unter http://sensorlog.berndthomas.net/, zuletzt geprüft am 11.12.2021.

Stefan Füller

Stefan Füller

Student
  • Student im Masterstudiengang Wirtschaftsingenieurwesen
Moritz Rauber

Moritz Rauber

Student
  • Student im Masterstudiengang Wirtschaftsingenieurwesen