User Tools

Site Tools


projects:bewaesserung:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projects:bewaesserung:start [2022/04/14 08:16]
lukas
projects:bewaesserung:start [2022/04/19 10:25] (current)
lukas
Line 38: Line 38:
 Wetterdaten (und ihre Datentypen): Wetterdaten (und ihre Datentypen):
  
- * timestamp: Integer (PK) +  * timestamp: Integer (PK) 
- * temperature: Float +  * temperature: Float 
- * co2: Integer +  * co2: Integer 
- * humidity: Integer +  * humidity: Integer 
- * noise: Integer +  * noise: Integer 
- * pressure: Float+  * pressure: Float
  
 Sensordaten (und ihre Datentypen): Sensordaten (und ihre Datentypen):
  
- * id: Integer (PK) +   id: Integer (PK) 
- * app_id: Char +   app_id: Char 
- * dev_id: Char +   dev_id: Char 
- * hardware_serial: Char +   hardware_serial: Char 
- * port: Integer +   port: Integer 
- * counter: Integer +   counter: Integer 
- * payload_raw: Char +   payload_raw: Char 
- * electrical_conductivity: Integer +   electrical_conductivity: Integer 
- * moisture: Integer +   moisture: Integer 
- * temperature: Float +   temperature: Float 
- * time: Integer+   time: Integer
    
 +==== Gewählter Bodenfeuchte-Sensor ====
 +Zunächst müssen in der Datei “sensordata.py” die relevanten Daten eingetragen werden. Die dazu benötigte ttn_app_id und der ttn_app_access_key sind auf The Things Network abrufbar.
 +Als Bodenfeuchtigkeitssensor wurde der Dragino LSE01LoRaWAN Soil Moisture & EC Sensor genutzt. Die zum Abruf der Sensordaten benötigte Datei liegt im Ordner:
 +bewaesserung-ip -> graphspage -> sensordata_db_import
 +Um die Sensordaten zu empfangen, muss im Terminal in diesen Ordner navigiert und der Befehl:
 +python3 sensordata.py
 +eingegeben werden. Dieser startet das in der Datei sensordata.py befindliche Python Script. Solange dieses Terminal Fenster geöffnet ist und der Server nicht manuell beendet wird, werden alle ankommenden Sensordaten in die Datenbank geschrieben.
  
 +==== Wetterstation ====
 +
 +Um standortbezogene Wetterdaten zu erhalten wird eine Netatmo Wetterstationen genutzt. Die zum Abruf der Wetterdaten benötigten Dateien liegen im Ordner:
 +
 +bewaesserung-ip -> graphspage -> netatmo_db_import
 +
 +Zunächst müssen in der Datei “netatmofetch.py” die relevanten Daten, Benutzername, Passwort, Client ID und Client Secret eingetragen werden (diese sind auf der Netatmo Plattform abrufbar).
 +Anschließend hat man die Möglichkeit komplett manuell mit den Dateien “netatmofetch.py” und “csv_to_db.py” zu arbeiten (Die letztere verfügt über eine Hilfestellung, wenn man sie mit dem Argument “-h” öffnet). Da das jedoch nur für Entwicklungszwecke nützlich ist, wird in einer Live Umgebung empfohlen mit den Dateien “netatmo_first_import.sh” und “netatmo_import” zu arbeiten. Die erste wird bei der Erstanwendung (oder bei einem Verlust der CSV Datei) genau einmal ausgeführt. Anschließend sollte man den Cronjob mit dem Befehl
 +python3 manage.py crontab add
 +starten. Das zweite Script wird dann alle 15 Minuten ausgeführt und schreibt die neuen Daten in die Datenbank. Um zu überprüfen, ob der Cronjob angelaufen ist, kann man folgenden Befehl nutzen:
 +python3 manage.py crontab show
 +Um es zu stoppen wird folgender Befehl genutzt:
 +python3 manage.py crontab remove
 +
 +==== API ====
 +
 +Damit das Frontend die Netatmo- und Sensordaten für den Graphen von dem Backend, bzw. der Datenbank bekommen kann, musste eine Schnittstelle in Form einer API erstellt werden. Hierfür wurde die Django Library “Django REST Framework” und das npm Module “Axios” verwendet.
 +Mit Hilfe des “Django REST Framework” konnten die zuvor festgelegten Datenstrukturen, relativ schnell und einfach in ein JSON Format umgewandelt und durch bestimmte URLs aufrufbar gemacht werden. Momentan lassen sich alle Datensätze aus einer Datenbanktabelle oder einzelne Datensätze mithilfe des Primary Keys anzeigen. Da noch keine Filter Funktionalität implementiert wurde, kann es bei großen Datenmengen zu langen Ladezeiten bei der Anzeige kommen.
 +
 +“Axios” bietet nun die Möglichkeit die JSON formatierten Datensätze auszulesen und anschließend zu verarbeiten. Hierbei wird ein Verweis auf die entsprechende URL gemacht und anschließend bietet “Axios” die Möglichkeit auf die einzelnen Objekte in dem JSON zuzugreifen und zu verarbeiten.
 +
 +==== Frontend ====
 +
 +Das Frontend wurde mit Hilfe von Vue.js erstellt. Da dies bereits im Projekt eingebunden ist, muss man lediglich einen npm -- install ausführen, um sie zu übertragen. Die Datenbank dahinter ist Node.js, welche jedoch ausschließlich für die Funktionalität von Vue genutzt wird. Um die Kommunikation zwischen Front- und Backend zu ermöglichen, wird Axios eingebunden. Zusätzlich wird Bootstrap genutzt, um das Frontend leichter gestalten zu können. Zur Vereinfachung wurde deswegen direkt zu Beginn BootstrapVue genutzt. Auch dies ist durch den einfachen Befehl npm install Vue bootstrap bootstrap-vue umgesetzt. Der letzte Schritt zur Funktionsfähigkeit, ist das Registrieren von BootstrapVue im “Entry Point” (normalerweise app.js oder main.js). Als Dashboard Framework wird CoreUI benutzt.
 +
 +==== Benutzeroberfläche ====
 +
 +Die graphische Benutzeroberfläche dient der Darstellung der Daten für den Benutzer. Dazu wurde ein Login implementiert, um die Daten vor unberechtigtem Zugriff zu schützen. Die Authentifizierung erfolgt mit Hilfe eines JWT-Tokens. Durch die Eingabe des Benutzernamens und des Passworts, wird eine Anfrage an die API gesendet. Nun wird überprüft, ob sich der Benutzer in der Datenbank befindet. Nach der erfolgreichen Authentifizierung sieht man am linken Bildschirmrand eine Menüleiste mit jeweils einem Verweis zu den Sensor- und Wetterdaten. Sie werden mit Hilfe von Graphen dargestellt, wobei sich einzelne Werte durch hovern einblenden lassen. Für die Wetterdaten gibt es Graphen zur Temperatur und Feuchtigkeit, sowie zum Lärm, Druck und CO2 Gehalt der Luft. Die Graphen der Sensordaten beziehen sich auf die Temperatur, Feuchtigkeit und elektrische Leitfähigkeit des Bodens. Dabei haben Benutzer die Möglichkeit, falls sie mehrere Sensoren besitzen, sich diese innerhalb eines Graphen anzeigen zu lassen, um einzelne Werte besser vergleichen zu können. Außerdem ist ein Datepicker vorhanden, um gezielt einzelne Zeiträume zu betrachten.
 +
 +==== Setup ====
 +
 +=== Installieren / Überprüfen der Packages ===
 +Python3, Venv, Pip Installieren
 +Zunächst ist es eine gute Idee unsere Lokalen Packages mit folgendem Befehl
 +ein Update zu geben:
 +$ sudo apt update
 +Nun müssen wir Python3 installieren (in der Regel ist dies aber bereits vorinstalliert):
 +$ sudo apt install python3
 +Um zu überprüfen ob Python3 erfolgreich installiert wurde, geben wir folgendes ein:
 +$ python3 -V
 +Wenn nun eine Ausgabe mit Python 3.x.x (die x sind variabel) erscheint, ist Python3 auf dem System installiert.
 +Jetzt benötigen wir noch venv und pip. Das wird mit folgenden Befehlen installiert:
 +$ sudo apt install python3-venv
 +und
 +$ sudo apt install python3-pip
 +
 +=== [Optional] Git Installieren ===
 +
 +Um effizient mit diesem Repo arbeiten zu können, empfiehlt es sich Git auf seinem System installiert zu haben. Das machen wir mit folgendem Befehl:
 +
 +$ sudo apt-get install git-all
 +
 +Anschließend können wir es wie folgt überprüfen:
 +
 +$ git version
 +
 +Es sollte dann eine Ausgabe mit git version xx.xx.xx (die x sind variabel) erscheinen.
 +
 +=== Projekt Klonen ===
 +
 +Wir können uns nun einen neuen Ordner für Git Repos erstellen und navigieren dort auch sofort hin (das kann natürlich auch in der GUI passieren):
 +
 +$ mkdir name_für_den_git_repo_ordner
 +
 +$ cd name_für_den_git_repo_ordner
 +
 +Hier können wir dann unser Repo hinzufügen oder (falls Git installiert ist) hinein klonen*:
 +
 +$ git clone Url der git repo
 +
 +*Falls man vorher eine SSH Anbindung zu seinem Git Account gemacht hat, kann man natürlich auch diese Methode verwenden, um das Repo zu klonen.
 +
 +Es sollte nun ein neuer Ordner mit Namen bewaesserung-ip vorhanden sein. Dort gehen wir nun rein:
 +
 +$ cd bewaesserung-ip
 +
 +=== Aufsetzen des Virtual Environment ===
 +
 +Um in unser Virtual Environment zu kommen, wenden wir folgenden Befehl an:
 +
 +$ source bin/activate
 +
 +Falls nun die Eingabeaufforderung ähnlich zu folgendem aussieht, war die Aktivierung Erfolgreich:
 +
 +(django-vue) benutzername@hostname:~/git_projects/bewaesserung-ip$
 +
 +(zum Deaktivieren des Virtual Environment, muss der Befehl deactivate eingegeben werden.)
 +Anschließend installieren wir die benötigten Packages in unser neues Virtual Environment.
 +
 +Hierzu benutzen wir die requirements.txt Datei, welche die Informationen sämtlicher Packages mitsamt der Versionsnummern enthält, die wir brauchen.
 +Wir geben Folgenden Befehl ein:
 +
 +(django-vue)$ pip3 install -r requirements.txt
 +
 +=== Datenbank erstellen und (Node- und Django-) Server starten ===
 +
 +Wir erstellen nun unsere Datenbank (bzw. migrieren mögliche neue Einträge):
 +
 +(django-vue)$ python3 manage.py migrate
 +
 +Damit alles funktioniert müssen wir 2 Server starten. Einen Node Server und einen Django Server.
 +Wir beginnen mit dem Node Server, indem wir in den frontend Ordner hinein gehen:
 +
 +(django-vue)$ cd frontend/
 +
 +Hier wenden wir nun folgenden Befehl an (muss nur einmal gemacht werden):
 +
 +(django-vue)$ npm install
 +
 +Nachdem dieser erfolgreich durchgelaufen ist, starten wir den Server mit:
 +
 +(django-vue)$ npm start
 +
 +Nun sollte der Node Server gestartet und erreichbar sein (in der Regel unter localhost:8080, die Adresse steht aber in der Ausgabe des Terminals)
 +Da dieses Terminalfenster nun belegt ist, müssen wir ein weiteres öffnen und zurück zum Hauptordner navigieren (wichtig: Die Virtual-Environment muss erneut aktiviert werden)
 +
 +Um nun unseren Django Server zu starten, wenden wir folgenden Befehl an:
 +
 +(django-vue)$ python3 manage.py runserver localhost:8000
 +
 +Wenn keine Fehler aufgetreten sind, sollte der Server nun gestartet sein und wir können die Seite im Browser unter http://localhost:8000 aufrufen*
 +
 +*Falls die Seiten einen Fehler anzeigen, weil die Ports 8000 / 8080 nicht freigegeben sind, können diese entweder geändert werden. Oder mit dem Befehl (django-vue)$ sudo ufw allow PORT_DER_FREIGEGEBEN_WERDEN_SOLL von der Firewall freigegeben werden
 +Hat alles funktioniert, können die Server durch ein Beenden des Prozesses im Terminal geschlossen werden (in der Regel mit STRG + C)
 +
 +===== Machine Learning =====
 +
 +{{:projects:bewaesserung:algorythmus_des_machine_learning_prozessses.png?600|}}
 +
 +Schematische Darstellung des machine learning Algorythmus
 +
 +Definition der einzelnen Schritte:
 +
 +  - Weather Dataset - Enthält alle Daten zum Wetter
 +  - Edit Metadata - Wetterdaten editieren und richtige Metadaten eintragen
 +  - Enter Data Manualy - Import der Sensordaten als .csv oder .json
 +  - Join Data - Vereinigung beider Datenquellen
 +  - Select Columns in Dataset - Auswahl der für den Recommender wichtigen Daten zum Lernen (Bodenfeuchte, Temperatur, Niederschlag, etc.)
 +  - Remove Duplicate Rows - Entfernen aller doppelten Datensätze
 +  - Split Data - Daten werden erneut geteilt, um alle doppelten Datensätze zu entfernen (8) und ins Training übertragen (9)
 +  - Score SVD Recommender - Datensätze werden final zusammengefügt und im Recommender verarbeitet
 +
 +===== Fazit =====
 +==== Erreichte Ziele ====
 +
 +Zu Beginn des Projekts wurden verschiedene User Stories definiert, die die Anforderungen an das Projekt widerspiegeln, deren Funktionen im Folgenden aufgelistet werden. Dabei konnten nicht alle Anforderungen in der gegebenen Zeit umgesetzt werden.
 +Login - Der User kann sich einen Account anlegen und sich damit einloggen. Es wird ein Token generiert und lokal gespeichert.
 +Sensordaten auslesen - Nach Eingabe von Sensordaten werden diese Ausgelesen und ins Frontend übertragen
 +Wetterdaten auslesen - Nach Eingabe von Wetterdaten werden diese Ausgelesen und ins Frontend übertragen
 +Frontend mit Dashboard - Mit Hilfe von CoreUi wurde ein simples und aussagekräftiges Dashboard erstellt, was auch zur Darstellung der Graphen und Navigationsmöglichkeit für den Endbenutzer nutzt.
 +Darstellung der Daten in Graphen - Die Graphen werden über das Backend eingelesen und mit Hilfe von Axios und einer API, welche Frameworks umgesetzt wurde, im Frontend über CoreUi dargestellt.
 +Grundfunktion des Machine Learning mit Azure ML Studio - Ein Ablaufplan für vorhandene Daten mit Screenshots für die Abläufe wurde erstellt um mit Hilfe von vorhanden Daten die Grundfunktionalität des Machine Learning testen und nutzen zu können.
 +
 +==== Lessons learned ====
 +Während des Projektverlaufs konnte das Team seine Fähigkeiten in der Programmierung ausbauen. Die Einarbeitung in die verschiedenen Frameworks und Programmiersprachen hat viel Zeit in Anspruch genommen. Hier hätte man eher auf die im Studium vermittelten Sprachen zurückgreifen sollen, um die Einarbeitungszeit zu verkürzen. Demzufolge gab es viele fehlerhafte Ansätze, die erst im späteren Verlauf erkannt wurden. Innerhalb des Teams gab es hin und wieder Kommunikationsschwierigkeiten, wodurch die Aufgabenverteilung erschwert wurde.
 +
 +==== Nächste Schritte ====
 +
 +Die folgenden Punkte sind eine (nicht geordnete) Liste an Features, welche für zukünftige Releases angedacht sind.
 +
 +  - Deployment - In einem echten Umfeld installieren
 +  - Datenbank ersetzen - SQLite mit einer dedizierten Datenbank ersetzen (Da SQLite eher für schnelles Prototyping gedacht ist.
 +  - API verfeinern - Suchfunktionalität, Sortierfunktion, Filterung von Datensätzen
 +  - Machine Learning - Wenn genug Daten gesammelt wurden, erste reale Ergebnisse bekommen
 +  - Umstellung der Token Systematik - Momentan ist es mit Localstorage gelöst, sollte aber beispielsweise auf Cookies umgestellt werden.
 +  - User Management - Frontend Registration, Gruppeneinteilung, Rechteverwaltung
 +  - Push Notifikation - z.B.: Sobald ein Wetterumschwung stattfindet
 +  - Vernetzung verschiedener Instanzen - Was machen die Pflanzen meiner Nachbarn / Arbeitskollegen / Familienmitglieder / etc.
 +  - Anlegen einer eigenen Sensormap - Viele Sensoren gruppieren und ein gemeinsamen Graphen für alle aus der Gruppe anzeigen lassen
 ===== DevOps ===== ===== DevOps =====
  
Line 99: Line 275:
 [[projects:bewaesserung:DokumentationSensoren|DokumentationSensoren]]\\ [[projects:bewaesserung:DokumentationSensoren|DokumentationSensoren]]\\
 [[projects:bewaesserung:installation|Installation]]\\ [[projects:bewaesserung:installation|Installation]]\\
 +
 +===== Förderung =====
 +
 +Das Projekt Cross Innovation Lab Niederrhein wird unterstützt und gefördert durch:
 +
 +{{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:logo-xi-long-high-res-black.png?200|}} {{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:hsrw-logo_rgb_200pxbreite_web_jpeg.jpg?200|}} {{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:agrobusiness_logo.jpg?200|}} 
 +{{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:hrw_col.jpg?200|}} {{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:mccevlogo.gif?200|}} {{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:coduct_logo.jpg?200|}} 
 +
 +{{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:efre_foerderhinweis_deutsch_farbig.jpg?200|}}{{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:ziel2nrw.jpg?200|}}{{:projects:appliedinnovationmanagement2:appliedinnovationmanagement2:nrw_lr_rgb.png?200|}}
projects/bewaesserung/start.1649924185.txt.gz · Last modified: 2022/04/14 08:16 by lukas