Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
wiki:software:beuthbot:berichte:ss2020:abschluss [22.07.2020 21:48] Jan Fromme |
wiki:software:beuthbot:berichte:ss2020:abschluss [23.07.2020 16:11] (aktuell) Jan Fromme |
||
---|---|---|---|
Zeile 4: | Zeile 4: | ||
- [[[[wiki: | - [[[[wiki: | ||
- [[[[wiki: | - [[[[wiki: | ||
- | - [[[[wiki: | + | - [[[[wiki: |
- [[[[wiki: | - [[[[wiki: | ||
- [[[[wiki: | - [[[[wiki: | ||
- | - [[[[wiki: | + | - [[[[wiki: |
- | - [[[[wiki: | + | - [[[[wiki: |
- [[[[wiki: | - [[[[wiki: | ||
- | - [[[[wiki: | + | - [[[[wiki: |
+ | - [[[[wiki: | ||
==== Abstract ==== | ==== Abstract ==== | ||
- | ==== Uebersicht / Inbetriebnahme ==== | + | ==== Uebersicht |
+ | Die folgende Liste zeigt die Erweiterungen, | ||
+ | * BeuthBot Master Repository erstellt um die Organisation des Projektes zu vereinfachen. | ||
+ | * Dokumentation des Master Repository, Erweiterung der bestehenden Dokumentation. | ||
+ | * Ersetzen des Deconcentrators durch Deconcentrator-JS. | ||
+ | * Einbauen einer Persistenz: | ||
+ | * Realisierung eines passenden Models für die Persistierung der Daten. | ||
+ | * Implementierung des Database-Controllers welcher eine MongoDB nutzt um die User Daten zu speichern. | ||
+ | * Implementierung des Database-Microservice welcher Datenbank-Anfragen auflöst und sie durchsetzt. | ||
+ | * Einbau Cache in Registry. | ||
+ | * Umbau / Verbesserung des Weather-Microservice: | ||
+ | * Formatierung der Antworten | ||
+ | * Refactoring des bestehenden Codes | ||
+ | * Einbau von zeitbezogenen Daten | ||
+ | * Einbau von ortsbezogenen Daten | ||
+ | |||
+ | ==== BeuthBot Master Repository ==== | ||
+ | |||
+ | Wie dem Zwischenbericht entnommen werden kann, hatten wir am Anfang ziemliche Schwierigkeiten das gesamte Projekt in Betrieb zu nehmen. Jedes Repository musste einzeln gecloned werden und danach jede Komponente einzeln gestartet werden. Aus dieser Not haben wir ein Master-Repository erstellt, welches die einzelnen Module als Git-Submodules beinhaltet. So ist es nun möglich mit einem einzigen Befehl das gesamte Projekt zu laden. Das Projekt kann unter dem Link https:// | ||
+ | |||
+ | === Inbetriebnahme === | ||
+ | |||
+ | < | ||
+ | # clone project | ||
+ | $ git clone --recursive https:// | ||
+ | |||
+ | # or with ssh | ||
+ | $ git clone --recursive git@github.com: | ||
+ | |||
+ | # change into directory | ||
+ | $ cd beuthbot | ||
+ | |||
+ | # edit environment file | ||
+ | $ cp .env.sample .env && vim .env | ||
+ | |||
+ | # create docker network | ||
+ | $ docker network create beuthbot_network | ||
+ | |||
+ | # start BeuthBot | ||
+ | $ docker-compose up -d | ||
+ | |||
+ | # check whether the gateway is running on port 3000 | ||
+ | $ curl http:// | ||
+ | </ | ||
+ | |||
+ | === Komponenten des BeuthBot === | ||
+ | |||
+ | < | ||
+ | @startuml | ||
+ | actor " | ||
+ | rectangle " | ||
+ | package " | ||
+ | rectangle " | ||
+ | rectangle " | ||
+ | database " | ||
+ | package " | ||
+ | rectangle " | ||
+ | rectangle " | ||
+ | } | ||
+ | package " | ||
+ | rectangle " | ||
+ | rectangle " | ||
+ | rectangle " | ||
+ | } | ||
+ | package " | ||
+ | rectangle " | ||
+ | database " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | U -down-> TGB | ||
+ | |||
+ | GW -left-> TGB | ||
+ | TGB -right-> GW | ||
+ | |||
+ | GW -left-> DC | ||
+ | DC -right-> GW | ||
+ | |||
+ | GW -down-> RE | ||
+ | RE -up-> GW | ||
+ | |||
+ | DC -right-> RA | ||
+ | RA -left-> DC | ||
+ | |||
+ | DBC -right-> MDB | ||
+ | MDB -left-> DBC | ||
+ | |||
+ | GW -left-> DBC | ||
+ | DBC -right-> GW | ||
+ | |||
+ | RE -left-> CA | ||
+ | CA -right-> RE | ||
+ | |||
+ | RE -up-> MS | ||
+ | MS -down-> RE | ||
+ | |||
+ | RE -up-> WS | ||
+ | WS -down-> RE | ||
+ | |||
+ | RE -up-> DBMS | ||
+ | DBMS -down-> RE | ||
+ | |||
+ | DBMS -down-> DBC | ||
+ | DBC -up-> DBMS | ||
+ | @enduml | ||
+ | </ | ||
==== Deconcentrator-JS ==== | ==== Deconcentrator-JS ==== | ||
Zeile 20: | Zeile 126: | ||
Der [[https:// | Der [[https:// | ||
==== Database ==== | ==== Database ==== | ||
+ | {{page>: | ||
==== Database Microservice ==== | ==== Database Microservice ==== | ||
+ | {{page>: | ||
==== RASA Trainieren ==== | ==== RASA Trainieren ==== | ||
Zeile 33: | Zeile 140: | ||
==== Update Wetter Microservice ==== | ==== Update Wetter Microservice ==== | ||
- | ==== Geoservice Erweiterung des Wetter Microservices | + | ===Beschreibung=== |
+ | |||
+ | Der Wetterservice ist ein Dienst, welche aktuell über den Telegram Client angesprochen wird. Dabei kann der Service per Chat einfach angesprochen werden ohne das der User im Vorfeld etwas einrichten muss. Dieser Dienst antwortet dabei auf Fragen, welche das Wetter im Allgemeinen, | ||
+ | |||
+ | ===Verwendete Technologien=== | ||
+ | |||
+ | Node.js( https:// | ||
+ | Express.js( https:// | ||
+ | Axios.js( https:// | ||
+ | OpenWeatherMap( https:// | ||
+ | |||
+ | ===Open Weather Api=== | ||
+ | |||
+ | Open Weather Map ist eine Api, welche einem die Möglichkeit bietet Wettervorhersagen abzurufen. Dabei bietet sie 4 verschiedene Arten von Calls: | ||
+ | /weather -> Aktuellen Wettervorhersage | ||
+ | /onecall -> Aktuellen Wettervorhersage, | ||
+ | /forecast -> Wettervorhersage bis zu 5 Tage in die Zukunft | ||
+ | /history -> Wettervorhersage bis zu 5 Tage in die Vergangenheit | ||
+ | In dieses Service wurden /onecall und /history verwendet, da /forecast nur 5 Tage in die Zukunft geht und auch nur in 3 Stunden abständen. Ebenso wurde /weather nicht genommen, das nur das aktuelle Wetter zurückgibt, | ||
+ | |||
+ | === Geoservice Erweiterung des Wetter Microservices === | ||
{{page>: | {{page>: | ||
+ | |||
+ | ===weather.js=== | ||
+ | |||
+ | Hier wird die Request vom Service registry aufgenommen und eine Response erstellt und gesendet. Als erstes wird die Request in message und Ort aufgeteilt. Daraufhin wird der Ort, welcher in der Request mitgesendet wurde in Längen.- und Breitengrad via eines Geoservices umgerechnet und wieder gegeben. Dies muss passieren, da die OpenWeatherMap Api bei einigen Anfragen nicht die Ortschaft selbst, sondern nur die Latitude und longitude nimmt. Ist kein Ort in der Request vorhanden wird standardmäßig Berlin oder der durch die Persistenz abgespeicherte Wohnungsort genommen. Daraufhin wird geprüft, ob die Request eine Uhrzeit enthält, um festzustellen ob eine allgemeine oder eine zeitspezifische Anfrage gestellt wurde. Bevor die Bearbeitung anfängt, wird vorher festgestellt, | ||
+ | |||
+ | ===weatherService.js=== | ||
+ | |||
+ | Diese Datei besitzt zwei Methoden, welche jeweils mit axios einen Api call an OpenWeatherMap machen und diesen zurückgeben. Beide Funktionen benötigen jeweils die Koordinaten des gefragten Bereiches. Die Methode getForecast gibt ein JSON zurück in welchem das aktuelle, das stündliche und das tägliche Wetter befindet, welche dann später in generatedMessage.js wiederverwertet werden. Die Funktion getHistory hingegen benötigt noch die spezifische Zeit als long Wert und gibt ebenfalls ein JSON zurück, allerdings nur mit dem exakt gefragten Moment, sowie ein Objekt mit den Stündlichen vergangenen Wetterdaten. | ||
+ | |||
+ | ===generatedMessage.js=== | ||
+ | |||
+ | Diese ist die zuletzt aufgerufene Datei, in welcher drei Methoden existieren, welche den Response Text für Telegram zusammenstellen. Jede Funktion benötigt die Parameter weather( Response vom weatherService.js api call ), date( Datum ) und city( Stadtname ). Es müssen diverse Zeitformate erstellt, bzw. angepasst werden, welche dann in der Response eingefügt werden. Ebenso befindet sich in der Response von OpenWeatherMap ein Icon String, welches dann in folgende Text Icons umgewandelt wird: ☀️, ⛅, ☁️, 🌧️, 🌦️, 🌩️, ❄️, 🌫️. Diese ganzen umgewandelten Daten werden daraufhin in einen fest definierten String integriert und als messageText zurückgegeben. | ||
+ | |||
+ | ===Telegram Weather Request and Response=== | ||
+ | |||
+ | ==Allgemeine Wetteranfrage== | ||
+ | |||
+ | Dies ist eine Chatanfrage ohne dabei einen spezifischen Ort zu nennen. Wenn keine Ort genannt wird, wird standardmäßig der Sitzt der Beuth Hochschule, also Berlin genommen oder aber der User hat seinen Wohnort gesetzt, dann wird dieser genommen, es seiden die Geo Api kenn diesen nicht. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==Mit spezifischer Uhrzeit== | ||
+ | |||
+ | Bei dieser Chatanfrage wurde zusätzlich die Uhrzeit mit angegeben. Wenn es sich um die nächsten 47 Stunden handelt, dann wird dementsprechend ein Response mit der Uhrzeit gesendet. Überschreitet das Datum allerdings 47 Stunde, so wird es wie eine allgemeine Anfrage gehandhabt. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==Ort ohne Uhrzeit== | ||
+ | |||
+ | Wir ein Ort, allerdings keine Uhrzeit mit geschickt, so handhabt der Bot die Anfrage wir im ersten Bild, nur das er denn mitgesendeten Ort nimmt, es seiden die Geo Api kennt diesen nicht, dann wir standardmäßig Berlin genommen. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==Ort mit Uhrzeit== | ||
+ | |||
+ | Wird neben der Uhrzeit noch ein Ort gesendet und überschreitet es nicht 47 Stunden in die Zukunft, kann der Bot da Wetter an dem Ort mit der spezifisch mitgesendeten Uhrzeit zurückgeben, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Complete Sequence Diagram === | ||
+ | <uml> | ||
+ | @startuml | ||
+ | participant registry | ||
+ | box " | ||
+ | participant " | ||
+ | participant " | ||
+ | participant " | ||
+ | participant " | ||
+ | end box | ||
+ | participant " | ||
+ | participant " | ||
+ | |||
+ | registry -> " | ||
+ | activate " | ||
+ | " | ||
+ | activate " | ||
+ | " | ||
+ | activate " | ||
+ | return API Response | ||
+ | return Coordinates Result | ||
+ | " | ||
+ | activate " | ||
+ | " | ||
+ | activate " | ||
+ | return API Response | ||
+ | return Weather Result | ||
+ | " | ||
+ | activate " | ||
+ | return Response Message | ||
+ | return Final Response | ||
+ | @enduml | ||
+ | </ |