This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
projects:bewaesserung:start [2022/04/14 07:23] lukas [Vorlesungen] |
projects:bewaesserung:start [2022/04/19 10:25] lukas [Dokumentation] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Oasis ===== | + | ===== Oasis // Bewässerungswirtschaft 4.0 ===== |
- | ==== Open and Smart Irrigation System ==== | + | ==== Einleitung |
{{: | {{: | ||
**de:** Beim Projekt Bewässerungswirtschaft werden Daten von Bodenfeuchtesensoren und Wetterstationen/ | **de:** Beim Projekt Bewässerungswirtschaft werden Daten von Bodenfeuchtesensoren und Wetterstationen/ | ||
Line 7: | Line 7: | ||
Die genutzten Bodenfeuchtesensoren laufen über das LoraWan Netz, ein Netzwerk, was bedeutend weniger Energie benötigt als beispielsweise WLAN um betrieben zu werden. Dadurch können die Sensoren länger im Boden bleiben, bevor man ihre Akkus tauschen muss. Das ist speziell, dann von Vorteil wenn man Sensoren an verschiedenen Orten draußen auf größerer Fläche verteilt anbringt.\\ | Die genutzten Bodenfeuchtesensoren laufen über das LoraWan Netz, ein Netzwerk, was bedeutend weniger Energie benötigt als beispielsweise WLAN um betrieben zu werden. Dadurch können die Sensoren länger im Boden bleiben, bevor man ihre Akkus tauschen muss. Das ist speziell, dann von Vorteil wenn man Sensoren an verschiedenen Orten draußen auf größerer Fläche verteilt anbringt.\\ | ||
- | **en:** In the irrigation management project, data from soil moisture sensors | + | Die folgende Dokumentation dient der Zusammenfassung des Interdisziplinären Projekts „Bewässerungswirtschaft 4.0“. Daran waren insgesamt fünf Studenten der Hochschule Rhein-Waal aus den Studiengängen E-Government, Environment |
- | This website then processes the data from both sources to provide the user with information that allows them to draw conclusions about the water needs of their plants. Meanwhile, the website can also generate recommended actions for the user based on the given data. Thus, he/she can optimize the water management of the plants.\\ | + | |
- | So far, the project is tailored to private gardens and small nurseries.\\ | + | |
- | The soil moisture sensors used run over the LoraWan network, a network that requires significantly less energy to operate than, for example, WLAN. This allows the sensors to stay in the ground longer before having to replace their batteries. This is especially advantageous when sensors are placed in different locations outdoors over a larger area.\\ | + | |
+ | ==== Pfad hin zur Ideenfindung ==== | ||
+ | Generiert wurde die Idee über einen Workshop, den das Team aus dem XI Lab organisiert hat. Dort wurde mit Hilfe der Innovationsmethodik " | ||
- | ===== Meetings ===== | + | {{:projects:bewaesserung:ideenquartett.png?200|}} |
- | Montags, 18:45: [[https://hsrw.webex.com/ | + | |
- | Mittwochs, 16:00: [[https:// | + | |
- | Freitags, 11:15: [[https:// | + | |
+ | Vorgegangen wurde dabei nach folgendem Schema: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Mit folgendem Ergebnis: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Konkrete Ideen dabei, aus denen die Idee Bewässerungswirtschaft 4.0 entstand waren folgende: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ===== Technische Umsetzung ===== | ||
+ | |||
+ | ==== Backend ==== | ||
+ | Für das Speichern und Bereitstellen der benötigten Daten ist ein Django Webserver und eine SQLite Datenbank implementiert worden. Dabei werden Wetterdaten über Netatmo und Sensordaten über The Things Network abgerufen und anschließend in der Datenbank gespeichert. In den folgenden Abschnitten wird auf die unterschiedlichen Komponenten und ihre jeweilige Funktion eingegangen. Im letzten Abschnitt wird dann erklärt, wie die Anwendung bei der ersten Inbetriebnahme initialisiert wird und welche Einstellungen in den einzelnen Komponenten dafür nötig sind. | ||
+ | |||
+ | ==== Datenmodelle ==== | ||
+ | Alle Wetter- und Sensordaten haben in der Datenbank jeweils ein einheitliches Datenmodell. Dies ermöglicht die Darstellung der Graphen und bildet die Grundlage für das Machine Learning, da die dazu benötigten Datenmengen erst erfasst werden müssen. Die Datenbank ist unter | ||
+ | bewaesserung-ip -> db.sqlite3 | ||
+ | gespeichert und die Datensätze können über den DB Browser for SQLite eingesehen werden. | ||
+ | Wetterdaten (und ihre Datentypen): | ||
+ | |||
+ | * timestamp: Integer (PK) | ||
+ | * temperature: | ||
+ | * co2: Integer | ||
+ | * humidity: Integer | ||
+ | * noise: Integer | ||
+ | * pressure: Float | ||
+ | |||
+ | Sensordaten (und ihre Datentypen): | ||
+ | |||
+ | * id: Integer (PK) | ||
+ | * app_id: Char | ||
+ | * dev_id: Char | ||
+ | * hardware_serial: | ||
+ | * port: Integer | ||
+ | * counter: Integer | ||
+ | * payload_raw: | ||
+ | * electrical_conductivity: | ||
+ | * moisture: Integer | ||
+ | * temperature: | ||
+ | * 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, | ||
+ | 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, | ||
+ | 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, | ||
+ | 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, | ||
+ | |||
+ | “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, | ||
+ | |||
+ | ==== Benutzeroberfläche ==== | ||
+ | |||
+ | Die graphische Benutzeroberfläche dient der Darstellung der Daten für den Benutzer. Dazu wurde ein Login implementiert, | ||
+ | |||
+ | ==== 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/ | ||
+ | |||
+ | Falls nun die Eingabeaufforderung ähnlich zu folgendem aussieht, war die Aktivierung Erfolgreich: | ||
+ | |||
+ | (django-vue) benutzername@hostname: | ||
+ | |||
+ | (zum Deaktivieren des Virtual Environment, | ||
+ | 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: | ||
+ | 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: | ||
+ | |||
+ | Wenn keine Fehler aufgetreten sind, sollte der Server nun gestartet sein und wir können die Seite im Browser unter http:// | ||
+ | |||
+ | *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, | ||
+ | |||
+ | ===== Machine Learning ===== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 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, | ||
+ | - 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, | ||
+ | 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, | ||
+ | |||
+ | ==== 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, | ||
+ | - 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, | ||
+ | - 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 ===== | ||
+ | |||
+ | Unser Planungs- und Kommunikationstool: | ||
+ | |||
https:// | https:// | ||
- | ===== Gitlab ===== | + | |
- | https:// | + | |
- | https:// | + | |
Line 31: | Line 249: | ||
https:// | https:// | ||
https:// | https:// | ||
- | https:// | + | https:// |
- | https:// | + | |
https:// | https:// | ||
Line 47: | Line 264: | ||
| 7 | 1 | LSE01 Lorawan soil sensor | | 7 | 1 | LSE01 Lorawan soil sensor | ||
- | [[ https:// | + | |
https:// | https:// | ||
Line 58: | Line 275: | ||
[[projects: | [[projects: | ||
[[projects: | [[projects: | ||
+ | |||
+ | ===== Referenzen ===== | ||
+ | |||
+ | Das Projekt Cross Innovation Lab Niederrhein wird unterstützt und gefördert durch: | ||
+ | |||
+ | {{: | ||
+ | {{: | ||
+ | |||
+ | {{: |