Ein Highlight der Vertiefungsvorlesung „Digital Services: Foundations“ am KIT ist und bleibt der Cloud-Services-Workshop. Mit Unterstützung von IBM schaffen Kleingruppen von Studenten mit Node RED, bereitgestellt durch die IBM Academic Initiative, Prototypen für ein vorgegebenes Szenario.
Das Szenario
Das KIT plant mit der Stadt ein Impfzentrum auf dem Campus Süd. Für einen möglichen Einsatz von IBM Cloud Services sind Lösungen zu finden und zu einem Proof-of-Concept-Niveau hin zu entwickeln.
Dabei können und sollen besonders bisherige Erfahrungen und Probleme mit der existierenden Impfkampagne und dem Ablauf bisheriger Imfpungen einfließen.
Überlegungen
Im Workshop wurde uns das Thema vorgestellt, und wir erhielten die Möglichkeit, in den Arbeitsgruppen unsere Pläne zu besprechen und bei Bedarf Unterstützung von drei sehr engagierten IBM-Mitarbeitern in Anspruch zu nehmen.
In der Gruppe diskutierten wir bisherige Erfahrungen mit dem Impfangebot in Deutschland. Besonders die umständliche, Lotto-artige Terminvergabe und mangelhafte Information über freigewordene Termine und übrige Impfdosen sahen wir als Hauptpunkte, die wir optimieren könnten.
Im Vorfeld hatten wir das vom Vorlesungsteam bereitgestellte Tutorial durchgearbeitet, in dem zum Schluss besonders auf die Möglichkeit, mit Node RED auf eine Telegram- und eine Twitter-API zuzugreifen, hingewiesen wurde. Dies nahmen wir als Anstoß, ein Informationssystem zu bauen, mit dem ein Impf-Team über einen Telegram-Bot KIT-Angehörige über freie Impfdosen und -termine informieren könnte.
Hätten wir das implementiert, so könnten wir zusätzliche Funktionalitäten implementieren, was wir später dann auch taten.
Das System
Das System besteht im Kern aus einer Node-RED-Instanz und einem Telegram Bot. Um den Flow in Node RED umzusetzen, wurden neben den Standard-Paketen noch die Pakete Dashboard, boolean logic ultimate, telegram und IBM Watson installiert, wobei IBM Watson im Abgabestand nicht mehr zum Einsatz kam, jedoch von anderen Gruppen vielfältig eingesetzt wurde. Mit dem System kann über drei Schnittstellen, dem Bot, dem Dashboard, und dem Kanal interagiert werden.
Die Entwicklung
Der wichtigste Schritt, nach der Kreierung eines Telegram Bots und dessen Einbindung in Node RED, war zu verstehen, wie man die Nachrichtenobjekte, die über die API abgerufen werden, auslesen und manipulieren kann, um dann ein neues Objekt über die API an den Bot zu geben, der dieses als Telegram-Nachricht dann an Telegram-Nutzer versendet, die im Kontakt mit dem Bot stehen.
Nachdem dies geschafft wurde, stand die „Belebung“ des Bots im Vordergrund. Es wurden bestimmte Befehle definiert, die die Ausgabe bestimmter Informationen veranlassten.
Das fertige System
Chat Bot
Enthält eine Nachricht keinen forward slash, der in Telegram einen Befehl initiiert, so wertet ein selbstgeschriebener Algorithmus die Nachricht aus, und gibt entsprechende Nachrichten zurück.
Behandelt werden Fragen im Bezug auf:
- Verfügbarkeit von Terminen
- Ort und Ablauf der Impfungen
- Möglichkeiten, Termine zu buchen
- Möglichkeiten Termine abzusagen
- Zeitpunkt der Impfung
- Notwendige Unterlagen
- Aus- und Nebenwirkungen
Dabei prüft der Algorithmus das Vorhandensein verschiedener Stichworte in Groß- und Kleinschreibung und ordnet die Nachricht entsprechenden Kategorien zu. Kann die Nachricht nicht zugeordnet werden, meldet der Bot dies dem Nutzer.
Der Bot kann unter t.me/dsVacBot erreicht werden.
Dashboard
Weiter wurde ein Dashboard entwickelt, das im Einsatz dem Impfteam zur Verfügung steht, und dem Team ermöglicht, über den Bot mit Impfinteressierten zu kommunizieren.
Vorhandensein von Impfterminen
Sind Impftermine vorhanden, wird im Node RED eine Art „Schalter“ umgelegt, der beeinflusst, welche Antwort ein Nutzer erhält, wenn er über den /frei
-Befehl die Verfügbarkeit freier Termine abfragt, und erhält je nach Verfügbarkeit eine positive oder eine negative Rückmeldung. Bei Betätigen der Termin-Schaltflächen wird auch eine entsprechende Meldung über den später vorgestellten Kanal versendet.
Restliche Impfdosen
Gibt das Imfpteam eine Restliche-Impfdosen-Meldung ab, so wird über den Telegramkanal eine Benachrichtigung versendet, den Impfinteressierte abonnieren können. Sind die restlichen Impfdosen aufgebraucht, so kann erneut eine Meldung losgeschickt werden, die, wie weiter unten dargestellt, ebenfalls in den Kanal geht, um zu verhindern, dass Impfwillige sich unnötig auf den Weg machen.
Telegram-Kanal
Ein Telegram-Kanal funktioniert ähnlich wie eine Gruppe. Jeder Telegramnutzer kann beitreten, jedoch können nur die Administratoren Nachrichten versenden und die Teilnehmer sehen. So ist sichergestellt, dass lediglich wichtige Informationen verschickt werden, und Impfwillige können sich informieren, ohne dass dies von Außenstehenden gesehen werden kann. Geht nun eine Termin- oder Restdosenmeldung raus, erhalten Impfwillige eine Benachrichtigung, ohne eine spezielle Impfapp oder Ähnliches installieren zu müssen.
Der Kanal ist unter https://t.me/KITVacInfo zu erreichen.
Der Flow und die Technik dahinter
Den Flow ausführlich zu beschreiben würde wahrscheinlich den Rahmen dieses Blog-Eintrags sprengen und wäre auch besser in einem Demo-Video gemacht, jedoch will ich hier einen kurzen Überblick über den Flow geben.
Begrüßungsnachricht und Restdosenmeldungen
Die Begrüßungsnachricht wird bei Aufruf der Befehle /help
oder /start
, wobei Letzter immer gegeben wird, wenn man per Telegram den Kontakt mit einem Bot initiiert. Dies triggert die Erstellung einer Nachricht im function-Node, welches das Objekt dann an den sender-Node übergibt und an den Telegram-Nutzer zurückgibt. Dabei wird die benötigte Chat-ID mit dem Befehl übermittelt und in die neue Nachricht integriert, so dass der richtige Nutzer die richtige Antwort erhält.
Die Restdosenmeldungen werden durch die Buttons des Dashboards getriggert, die hier mit einer stupsenden Hand symbolisiert sind. In diesen ist die ID des Kanals „gehardcoded“, so dass diese direkt an den Kanal, und damit dessen Abonnenten gehen. Falls sie msg.payload
nicht kennen: dies ist ein Debug-Node, das die eingehenden Nachrichten protokolliert, aber für die Funktion des Systems nicht weiter von Relevanz ist.
Nachrichtenalgorithmus
Der Nachrichtenalgorithmus ist sicher nicht komplex und erst recht nicht Turing-Test-tauglich, aber demonstriert sehr schön, wie man einen simplen Chatbot aufbauen kann.
Die Attribute des Nachrichtenobjekts werden ausgelesen, und der Nachrichteninhalt auf verschiedene Stichwörter geprüft, für die eine passende Antwort vorliegt. Daraus wird dann am Ende ein neues Nachrichtenobjekt zusammengesetzt und wieder zurückgegeben.
var oldChatId = msg.payload.chatId;
var oldMessageId = msg.payload.messageId;
var OldContent = msg.payload.content;
var OldDate = msg.payload.date;
var message = "";
if (msg.payload.content.includes("/")) {
return false;
}
if (msg.payload.content.includes("frei") || msg.payload.content.includes("Frei") || msg.payload.content.includes("verfügbar") || msg.payload.content.includes("Verfügbar")) {
message = "Für Infos über freie Termine geben Sie bitte den Befehl /frei ein";
} else if (msg.payload.content.includes("Wo") || msg.payload.content.includes("wo")) {
message = "Das Impfen findet im Zelt vorm Audimax statt";
} else if (msg.payload.content.includes("kann nicht")
|| msg.payload.content.includes("Kann nicht")
|| msg.payload.content.includes("Stornieren")
|| msg.payload.content.includes("stornieren")
|| msg.payload.content.includes("Absagen")
|| msg.payload.content.includes("Abmelden")
|| msg.payload.content.includes("absagen")
|| msg.payload.content.includes("abmelden")) {
message = "Wenn Sie die Impfung nicht wahrnehmen können, stornieren sie bitte den Termin unter https://campus.studium.kit.edu/";
} else if (msg.payload.content.includes("Wann") ||msg.payload.content.includes("wann")) {
message = "Wenn Sie einen Termin haben, finden Sie diesen Im Campus-System unter https://campus.studium.kit.edu/";
} else if (msg.payload.content.includes("Wie") ||msg.payload.content.includes("wie")) {
message = "Alle Infos über den Ablauf der Impfung finden Sie auf https://impfung.kit.edu";
} else if (msg.payload.content.includes("mitbringen")
|| msg.payload.content.includes("Formulare")
|| msg.payload.content.includes("formulare")
|| msg.payload.content.includes("unterlagen")
|| msg.payload.content.includes("Unterlagen")
|| msg.payload.content.includes("Pass")
|| msg.payload.content.includes("pass")
|| msg.payload.content.includes("perso")
|| msg.payload.content.includes("Perso")) {
message = "Für die Imfpung müssen sie Ihren Personalausweis und ihre KITCard dabei haben, sowie Ihren Impfpass. Haben SIe diesen nicht dabei, erhalten Sie eine Bescheinigung.";
} else if (msg.payload.content.includes("Nebenwirkungen")
|| msg.payload.content.includes("nebenwirkungen")
|| msg.payload.content.includes("folgen")
|| msg.payload.content.includes("Folgen")
|| msg.payload.content.includes("Passieren")
|| msg.payload.content.includes("Auswirkungen")
|| msg.payload.content.includes("auswirkungen")
|| msg.payload.content.includes("passieren")) {
message = "Infos über Nebenwirkungen und Risiken finden sie z.B. unter https://www.deutschlandfunk.de/corona-impfstoffe-und-ihre-nebenwirkungen-impfrisiken-im.2897.de.html?dram:article_id=487827";
} else {
message = "Ihre Frage konnte leider nicht verstanden werden.";
}
var pload = {type: "message", content: message, chatId: oldChatId};
var newMsg = {payload: pload}
return newMsg;
Terminverfügbarkeit
Im unteren Flow-Segment wird die Termin-Meldung und Verfügbarkeitsabfrage bearbeitet. In Rot haben wir eine „Informationsweiche“, bestehend aus zwei Nodes, die eine Nachricht durchlassen oder blockieren, je nach Konfiguration oder true
– bzw. false
-Meldung, die durch die Dashboard-Buttons getriggert werden. EIn Invert-Element sorgt dafür, dass die zwei Block-Nodes nicht den gleichen Status haben, so dass je nach Status bei einkommendem /frei
-Befehl entweder eine positive oder negative Rückmeldung kommt. Oben im Bild sieht man noch die Funktionen, die jeweils bei Änderung der Verfügbarkeit eine Nachricht an den Kanal schicken.
Ausbau-Potential
Das System, dass ich hier vorgestellt habe, ist, wie erwähnt, nicht als einsatzfähiges System gedacht, sondern als Demo für eine Vorlesungsübung. Zweck dieser Übung ist, den Studenten das Konzept von Digital Services und deren Einbindung anschaulich zu vermitteln, was meines Erachtens nach auch sehr gut gelingt.
Sollte man nun darüber nachdenken, auf Basis der hier vorgestellten Ideen ein komplettes System zu entwickeln und einzusetzen, so gibt es noch mehrere Möglichkeiten, dieses System weiter auszubauen, wo auch IBM Watson eine wichtige Rolle spielen könnte.
Nur ein kleiner Ausschnitt der Möglichkeiten sind:
- Terminbuchung integrieren
- Ersetzen des Nachrichten-Algorithmus durch den Watson Assistent
- Automatische Spracherkennung und -übersetzung
- Sprachaus- und Eingabe für Menschen mit akustischen Einschränkungen
- Anbindung eines Twitteraccounts, auf dem die Kanal-Meldungen zusätzlich veröffentlicht werden.
Fazit
Der Workshop ist eine angenehme Abwechslung in einem sehr theorielastigen Studium und Node RED ist ein tolles Werkzeug, dass ich auch schon privat im Einsatz erlebt habe. Auch Menschen ohne Programmiervorerfahrung ist ein intuitiver Einstieg möglich, aber dank der Function-Blöcke sind auch fortgeschrittenere Dinge umsetzbar.
Besonders hervorzuheben ist die Unterstützung durch IBM, die materiell und auch personell mit Rat und Tat zur Seite stehen, wofür ich auch gerne Danke sage.