Für das lokale Wasser- und Elektrizitätswerk entwickelten wir einen „Strom-Barometer“, welcher den aktuellen Verbrauch der Gemeinde Walenstadt grafisch visualisiert. Ebenfalls ersichtlich ist, woher der Strom stammt, sprich welcher Anteil mit den eignen Wasserkraftwerken (Berschnerbach, Töbeli und Mühle) sowie der Photovoltaik Anlagen abgedeckt werden kann. Aus diesen beiden Angaben lässt sich der Autarkiegrad, also die wirtschaftliche Unabhängigkeit berechnen. Übersteigt die Eigenproduktion den lokalen Bedarf, spricht man von 100 % Autarkie und das WEW liefert den überschüssigen Strom an das vorgelagerte Netz zurück. Dieses kompensiert vice versa die Differenz, wenn die Eigenproduktion nicht ausreicht, weil Produktion und Verbrauch immer ausgeglichen sein müssen. Wird die Maus auf dem Diagramm positioniert, ist der prozentuale Anteil ersichtlich. Mit einem Klick auf den Legendentext kann der entsprechende Diagrammteil aus-/eingeblendet werden.

Funktionsprinzip

Im Minutentakt sendet das SPS-basierte Leitsystem die aktuellen Leistungsdaten an den Azure IoT Hub, welcher die Meldung entgegennimmt und zwischenspeichert. Gleichzeitig löst er einen Event aus und signalisiert dem IoT Hub Service, dass neue Daten eingetroffen sind. Der IoT Hub Service liest die Meldung aus dem Puffer und führt eine Validierung durch. Schlussendlich wird der Messwert via Data Service in der Datenbank gespeichert.

Funktionsprinzip WEW Barometer

Ruft ein Benutzer die URL https://wew-barometer.ch/ im Browser auf, wird die Angular App vom Webserver heruntergeladen und auf dem lokalen PC ausgeführt. Zyklisch fordert die App vom Data Service die aktuellen Leistungswerte an und visualisiert diese in dem Diagramm.

Was passiert hinter den Kulissen?

Für die Entwicklung nutzen wir Azure «DevOps». Der Begriff setzt sich aus «Dev» (Development, dt. Entwicklung) und «Ops» (Operations, dt. Vorgänge) zusammen und vereint Menschen, Prozesse und Technologien, damit Kunden kontinuierlich hochwertige Produkte erhalten. Einfacher gesagt, unterstützt uns DevOps im ganzen Softwarezyklus – von der Planung, Entwicklung, Bereitstellung und Betrieb.

Aufgrund der Planung von Aufgaben wird eine neue Funktionalität entwickelt. Sobald diese abgeschlossen ist, «checkt» der Entwickler die Softwareänderung in die Quellcodeverwaltung ein. Diese Aktion löst im Hintergrund einen Build Prozess aus, welcher den aktualisierten Code automatisiert kompiliert, Tests ausführt und auf einem System bereitstellt.

Der Data Service und der IoT Hub Service wurden auf Basis von .Net Core in C# und die Webseite in Angular entwickelt. Der Azure IoT Hub ist – wie der Name schon verrät – bei der Microsoft Cloud Plattform «Azure» gehostet und dazu ist nur ein gültiges Abo und etwas Konfiguration nötigt.

Alle Softwarekomponenten (inkl. der Datenbank) werden in Docker gehostet. Docker ist eine Containervirtualisierung-Software, um mehrere Instanzen eines Betriebssystems (als sogenannte „Gäste“) isoliert voneinander auf einem Hostsystem zu betreiben. Docker basiert auf dem Konzept von Überlagerungen von Images. Jedes Image baut auf einem anderen Image auf, indem Abhängigkeiten, Pakete, etc. hinzugefügt werden. Letztendlich wird ein Image erstellt, dass die kompilierte Anwendung sowie alles enthält, was für die Ausführung benötigt wird. Dieser «Bauplan» wird im Dockerfile definiert.

Der Sourcecode der einzelnen Softwarekomponenten wurde bewusst in separate Repositories aufgeteilt. Dies ermöglicht kleine und übersichtliche Softwareprodukte und vereinfacht nach GoLive die Wartung. Andererseits wird nur die Software neu kompiliert, welche eine Änderung erfahren hat. Ein weiterer Vorteil ist, dass Abhängigkeiten aufgelöst werden müssen und nur z.B. über NuGet Pakete eingebunden werden können. Somit erzeugt eine (Schnittstellen-) Anpassung in Komponente A keine Nebeneffekte in Komponente B.

Der Build Prozess erstellt auf Basis des Dockerfiles für jedes Repository ein neues Image und lädt dieses in die zentrale Containerregistrierung oder als NuGet Paket auf Azure. Gekennzeichnet wird jedes Image mit der Versionsnummer im Format yyyy.MM.dd.Nr, damit sich dieses für die Bereitstellung identifizieren lässt. In dem Docker Compose File definieren wir den Versionsstand jeder Softwarekomponente. Der nachfolgende und automatisierte Release Prozess führt auf dem Zielsystem ein Skript aus, welches alle erforderlichen Images aus der Containerregistrierung herunterlädt und startet diese. Das ist einer der Hauptgründe, weshalb wir Docker für die Entwicklung und das Deployment einsetzen: Die leichtgewichtigen Images – meist nur einige MB gross – können auf beliebigen Systemen (vorausgesetzt der Docker Host ist installiert) ausgeführt werden!

Für die Bereitstellung einer Software nutzten wir in der Regel folgende 4 Umgebungen:

  1. DEV (Entwicklung): Nachdem der Build Prozess das Kompilieren und Testen erfolgreich abgeschlossen hat, startet der Release Prozess und veröffentlicht immer die aktuellsten Softwarekomponenten selbständig auf dieser Umgebung.
  2. INT (Integration): Bevor wird den aktuellen Softwarestand dem Kunden zur Verfügung stellen, wird dieser ausgiebig getestet. In einem weiteren (Release) Docker Compose File definieren wir den Versionsstand jeder Softwarekomponente, die wir dem Kunden zur Verfügung stellen wollen. Da die Entwicklung gleichzeitig fortschreitet, muss dies nicht zwingend der letzte Versionsstand wie bei der DEV Umgebung sein.
  3. TEST (Test): Funktioniert die Anwendung(en) auf der INT Umgebung wie erwartet, kann per Knopfdruck in Azure DevOps der gleiche Softwarestand auf der Testumgebung beim Kunden installiert werden. Nun kann der Kunde eigenständig die Software prüfen.
  4. PROD (Produktion): Nachdem auch der Kunde grünes Licht gegeben hat, erfolgt die Bereitstellung auf der Produktivumgebung, welche einen Unterbruch von rund 5 min in Anspruch nimmt.

Je nach Abmachung wiederholt sich der Breitstellungsprozess alle 2 bis 4 Wochen – solange, bis die Entwicklung abgeschlossen ist.

Was ist Internet of Things (IoT)

Das Internet der Dinge (englisch Internet of Things, Kurzform: IoT) ist ein Sammelbegriff für Technologien einer globalen Infrastruktur der Informationsgesellschaften, die es ermöglicht, physische und virtuelle Gegenstände miteinander zu vernetzen und sie durch Informations- und Kommunikationstechniken zusammenarbeiten zu lassen. Quelle: Wikipedia