Herzlich willkommen auf dem Blog der exensio GmbH

exensio ist ein unabhängiges Software-Unternehmen von erfahrenen IT Beratern und Architekten. Zu unseren Kunden zählen namhafte deutsche Großunternehmen.

exensio verbessert das Kommunikations- und Informationsmanagement von Unternehmen. Auf Basis sinnvoller und zweckmäßiger Technologien erarbeiten wir flexible und übergreifende Lösungen für webbasierte Informationssysteme. Abhängig von den Kundenanforderungen realisieren wir Web Applikationen sowie Lösungen auf Basis von Web Content Management- und Portalsystemen. Integrativ, wirtschaftlich und anwenderfreundlich!

Hier gelangen Sie zur exensio GmbH.

Montag, 21. Juli 2014

Automatische Browsertests mit Selenium: Zielvorstellung und Einführung Selenium Builder (Teil 1)

Diese 6-teilige Blogpost-Reihe befasst sich mit dem Thema Test Automatisierung für grafische Benutzeroberflächen von Webanwendungen. Im ersten Teil wird eine kurze Einführung über das Ziel, welches mit den automatischen Tests mit Hilfe des Werkzeug Selenium Builder erreicht wird, gegeben. Des Weiteren wird auf die Installation der Software eingegangen und es erfolgt ein Vergleich mit dem Vorgänger-Tool, der  Selenium IDE, welche häufiger verwendet wird, aber einige Nachteile aufweist. Abschließend wird die Funktionsweise anhand eines kleinen Beispiels dargestellt.

In den weiteren Teilen der Blogpost-Reihe geht es um ein komplizierteres Beispiel mit mehreren Schritten sowie um Tipps und Tricks in Verbindung mit GUI Elementen (z. B. CKEditor, Farben, Tooltips, Menüs und Dialoge). Ebenfalls wird auf ein Client-Server-Szenario mit Selenium Grid im Zusammenspiel mit dem CI Server Jenkins eingegangen.

Warum Selenium Builder?

Ein gängiges und weit verbreitetes Tool für automatisiertes GUI Testing einer Web Applikation und die Aufzeichnung der Testfälle ist das Firefox Add-on Selenium IDE [1]. Die Neuentwicklung Se Builder wird auf GitHub gehostet und unter der Apache 2 Lizenz veröffentlicht. Gegenüber der Selenium IDE bietet Se Builder bisher noch einen geringeren Funktionsumfang [2][3]. Die nachfolgende Tabelle zeigt den vollständigen Funktionsumfang von Se Builder:
Die Funktionsumfänge von Selenium IDE, die noch nicht in Se Builder enthalten sind, werden nachfolgend aufgeführt:
Die aktuellste Liste aller Methoden gibt es auf der Homepage des Projekts bei GitHub [4]. Die verfügbaren Methoden untergliedern sich in die Gruppen:
  • Navigation
  • Input
  • Misc
  • Assertion
  • Verify
  • Wait und
  • Store
Der große Vorteil von Se Builder liegt in der Unterstützung des Browser-Treibers Selenium WebDriver. Damit ist es möglich, fast jeden beliebigen Browser native fernzusteuern. Das bedeutet ihn genauso zu steuern, wie wenn ein menschlicher Anwender den Browser bedienen würde. Es stehen die folgenden Treiber zur Verfügung [5]:
  • AndroidDriver
  • ChromeDriver
  • EventFiringWebDriver
  • FirefoxDriver
  • HtmlUnitDriver
  • InternetExplorerDriver
  • PhantomJSDriver
  • RemoteWebDriver
  • SafariDriver
Außerdem unterstützt Se Builder den Selenium Server mit seiner eingebauten Grid-Funktion [6]. Damit ist es möglich, ein eigenes Grid an Testrechnern zu betreiben und komplette Testreihen auf verteilten Knoten zu fahren. Beispielsweise könnte eine Testreihe die Tests einer Webanwendung mit den Browsern Internet Explorer IE8 bis IE11 vorsehen.

Zielvorstellung

Zur Steigerung der Softwarequalität unserer Webanwendungen setzen wir auf kontinuierliche Integration. Dafür verwenden wir den Buildserver Jenkins [7]. Dieser Server steuert alle Softwaretests. Neben den Unit- und Integrationstests soll er insbesondere auch die funktionalen Tests steuern und kontrollieren. Außerdem sollen bestimmte Zielplattformen (insbesondere Internet Explorer 8) getestet werden können. Und zuletzt muss das Anlegen von neuen bzw. das Ändern von bestehenden Tests einfach und schnell von der Hand gehen und keine lange Einarbeitungszeit oder umfangreiches Expertenwissen erfordern.

Installation

Die Installation des Se Builders ist sehr einfach. Zuerst lädt man sich das Firefox Add-on aus dem Internet herunter. Der Anbieter Sauce Labs Inc. bietet es als XPI-Datei direkt auf seiner Homepage an unter https://saucelabs.com/builder. Alternativ kann es von GitHub unter https://github.com/sebuilder/se-builder heruntergeladen werden. Beim Download der XPI-Datei erkennt Firefox automatisch, dass es sich um ein Add-on handelt und fragt, ob es gleich installiert werden soll. Andernfalls wird das Add-on nachträglich installiert, durch Selektion der Option „Zahnrad -> Add-on aus Datei installieren“ auf der Seite about:addons.
Die grafische Benutzeroberfläche des Add-ons wird mit der Tastenkombination Strg+Alt+B im Firefox gestartet und erscheint als eigenständiger Dialog.
Ich empfehle die Spracheinstellung auf „en“ zu belassen, da die deutsche Formulierung teilweise nicht so gelungen ist. Mit der englischen Übersetzung hat man zudem gleich die richtigen Suchbegriffe parat, falls man mal Unterstützung benötigt. Nach dem Öffnen des Add-ons gibt es im Wesentlichen die beiden Alternativen:
  • Open a script or suite
  • Start recording at

Beispiel

Wir zeichnen ein kleines Beispiel auf, indem im exensio IT Blog nach dem Begriff „Consulting“ gesucht wird. Dazu wähle ich die Option „Start recording at“. Das zugehörige Textfeld ist entweder schon mit der URL http://blog.exensio.de/ gefüllt (wenn ich vor dem Start des Se Builders im Firefox die entsprechende Seite geöffnet habe). Andernfalls geben Sie im Textfeld die URL bitte an und klicken danach auf den Knopf „Selenium 2“. Wir befinden uns jetzt im Aufnahme-Modus, zu sehen an der drehenden Sanduhr im rechten oberen Eck. Se Builder hat bereits den ersten Schritt der Aufzeichnung eingetragen, nämlich get http://blog.exensio.de/. Jetzt kann man bequem den Fokus zum Firefox Hauptfenster wechseln und dort ins Suchfeld rechts klicken. Alle vorgenommenen Klicks und Eingaben, werden vom Se Builder aufgezeichnet und später in unserem Skript gespeichert. Nach Klick in das Suchfeld geben wir den Text „Consulting“ ein und klicken auf den Knopf „Suchen“. Se Builder hat dafür drei weitere Schritte aufgezeichnet:
  • clickElement css selector : body
  • setElementText locator name: search, text: Consulting
  • clickElement css selector: input.gsc-search-button
Beenden wir unsere Aufnahme vorläufig, indem wir den Fokus wieder auf das Add-on Se Builder wechseln und dort den Knopf „Stopp recording“ drücken. Jetzt sollten wir als erstes das entstandene Skript speichern. Dazu im Se Builder im Menü File den Eintrag Save anklicken und das JSON Skript an beliebiger Stelle abspeichern.

Abspielen

Jetzt ist es an der Zeit, das aufgenommene Skript zu testen. Hierzu wird am besten ein neuer Tab geöffnet. Danach öffnen wir im Se Builder das Menü Run und wählen den Eintrag „Run test locally“ aus. Der Fokus kann dabei beim Add-on Se Builder bleiben; es gibt keinen Grund, das Hauptfenster von Firefox in den Vordergrund zu holen. Schaut man sich das Firefox Hauptfenster dennoch an, sieht man wie von Geisterhand die Webseite des exensio IT Blog geöffnet wird. Danach wird im Suchfeld das Wort „Consulting“ eingegeben und sofort darauf werden die Suchergebnisse angezeigt. Schaut man sich parallel die GUI des Se Builders an, so sieht man, dass jeder unserer 4 Schritte zuerst mit gelber Hintergrundfarbe und gleich danach mit grüner Hintergrundfarbe dargestellt wird. Nachdem das Skript zu Ende durchlaufen wurde, sieht die GUI wie folgt aus.

Status und Farben

Se Builder stellt beim Abspielen die einzelnen Schritte mit unterschiedlichen Hintergrundfarben dar. Jede Farbe hat eine andere Bedeutung:

Weiß: Schritt befindet sich noch in der Warteschlange beim Abspielen

Gelb: Schritt wird gerade im Moment abgespielt

Rosa: Verify-Schritt ist fehlgeschlagen

Rot: Assert-Schritt ist fehlgeschlagen

Grün: Schritt war erfolgreich


Skript bearbeiten

Jetzt möchten wir das Skript noch um weitere Schritte ergänzen. Falls Se Builder zuvor beendet wurde, kann man jetzt nach dem Start die Option „Open a script or suite“ auswählen und das Beispielskript öffnen. Falls immer noch die vier Schritte mit grüner Hintergrundfarbe angezeigt werden, bitte den Knopf „Clear Results“ drücken. Wir wollen das Skript dahingehend bearbeiten, dass es nach dem Begriff „Consulting“ sucht und danach den Blogpost mit dem Titel „ClaretPortal wird mobil (Teil 3) - Fokus: Endless/Infinite Scrolling mit jQuery Mobile“ öffnet.

Anders als zuvor wollen wir dieses Mal die Abfolge von Klicks und Eingaben nicht aufzeichnen, sondern Schritt für Schritt eingeben. Dafür bewege ich meinen Mauszeiger über den letzten Schritt im Se Builder (clickElement css selector: input.gsc-search-button). Sogleich erscheint auf der linken Seite ein Menü welches mir diverse Möglichkeiten zur Verfügung stellt.
Ich wähle die Option „new step below“. Beim Ablegen eines neuen Schritts wird immer clickElement id: angelegt. Benötigt man eine andere Funktion, klickt man einfach auf den Funktionsnamen (hier: clickElement) und wählt dann die gewünschte Funktion aus.
Ich möchte den Fall absichern, dass sich die Darstellung der Suchergebnisse evtl. verzögert (z. B. falls der Server ausgelastet ist). Deshalb möchte ich zunächst die Funktion waitForTextPresent ausführen. Man findet sie im Abschnitt Wait. Als Argument erwartet die Funktion einen Text. Ich verwende dafür einen Teil des Titels des Blogposts, nämlich „(Teil 3) - Fokus". Anschließend füge ich noch einen Schritt unterhalb ein (erneut „new step below“ anklicken). Dieses Mal passt die vorausgewählte Funktion clickElement. Als Argument erwartet die Funktion eine ID oder eine andere Zielangabe. Klickt man auf das Wort „id“, hat man die Möglichkeit, eine ID als Freitext einzugeben.
Wesentlich bequemer ist, die Zielauswahl mit der Maus vorzunehmen. Dazu klickt man den Text „Find a different target“ an. Daraufhin springt der Fokus ins Hauptfenster von Firefox und befindet sich nun im Element-Auswahl-Modus. Jedes Element, das sich unter dem Mauszeiger befindet, wird jetzt automatisch fokussiert. Der Fokus ist an der Umrandung des Elements zu erkennen. In diesem Modus lässt sich das Wunsch-Element leicht erkennen und von anderen Elementen unterscheiden. Im Folgenden wird das Suchergebnis genau untersucht und fünf zugehörige Elemente identifiziert.




Ich entscheide mich für das zuerst ausgewählte Element (nur der Titel) und klicke dieses Element an. Der Fokus springt dann automatisch wieder zurück zum Se Builder. Außerdem wechselt der Locator-Typ von „id“ auf „link text“. Ferner wird folgender Linktext automatisch in das freie Textfeld eingetragen: „exensio it blog: ClaretPortal wird mobil (Teil 3) - Fokus ...“. Se Builder schlägt außerdem alternative Locators vor. Es liegt im Ermessen des Anwenders hier den geeigneten Locator auszuwählen. Das fertige Skript enthält danach die folgenden 6 Schritte:
Führt man das Skript nun aus, so wird die „exensio IT Blog“-Seite geöffnet, nach dem Begriff „Consulting“ gesucht, gewartet bis das Blogpost mit dem Text „(Teil 3) - Fokus" angezeigt wird und schließlich das Blogpost mit dem Titel „exensio it blog: ClaretPortal wird mobil (Teil 3) - Fokus ...“ angezeigt.

Im nächsten Teil dieser Reihe erstelle ich eine Test-Suite, also eine Abfolge von Tests mit mehreren Skripten.

Links

[1] http://docs.seleniumhq.org/projects/ide
[2] https://github.com/sebuilder/se-builder/wiki/Selenium-2-Step-Support-Table
[3] http://blog.trident-qa.com/en/selenium-builder-vs-ide-list
[4] https://github.com/admc/se-builder/blob/master/seleniumbuilder/chrome/content/html/js/builder/selenium2/selenium2.js#L27
[5] http://docs.seleniumhq.org/projects/webdriver
[6] https://code.google.com/p/selenium/wiki/Grid2
[7] http://jenkins-ci.org

Freitag, 18. Juli 2014

Warum exensio ein unabhängiges Beratungshaus ist?

Neulich erst habe ich wieder die Situation erlebt, dass eine Agentur einem Kunden angeboten hat, zu einer potentiellen Softwarelösung eine Evaluation / Auswahlberatung durchzuführen. Beim Blick auf die Homepage der Agentur konnte man leicht feststellen, dass die für die Analyse ins Auge genommenen Produkte / Hersteller als Partner der Agentur aufgelistet sind. Ist in der Konstellation eine unabhängige Beratung möglich?

exensio ist ein unabhängiges Beratungshaus. Was bedeutet das nun für uns und unsere Kunden?

  • Wir beraten unabhängig, sind unabhängig von Software-Produkt-Herstellern
  • Wir verkaufen keine Lizenzen und profitieren nicht von Lizenzverkäufen von Partnern
  • Wir führen Auswahlberatungen / Evaluationen mit einer nachvollziehbaren Methodik durch
  • Für Auswahlberatungen erstellen wir einen auf die Kunden-Bedürfnisse fokussierten Kriterienkatalog mit durch den Kunden festgelegten Gewichtungsfaktoren
  • Wir führen unabhängige Analysen des Marktes nach geeigneten Software Produkt Kandidaten durch

Mit einem strukturierten und methodischen Vorgehen schaffen wir die Basis, für eine fundierte Entscheidung. Die Entscheidung fällen natürlich die Kunden – und sie bestimmen auch den Einfluss der weichen und politischen Faktoren…

Nun werden sicher einige sofort auf die exensio Webseite schauen und feststellen, dass auch wir Partner haben - das ist richtig. Allerdings handelt es sich hierbei um Partner, mit denen exensio zusammenarbeitet, um das Dienstleistungsspektrum zu erweitern (beispielsweise für Design und Marketing oder Lean Management Beratung) oder Zugang zu tieferem Technologie Know How (beispielsweise Know How Databases von Oracle) zu erhalten.


Montag, 7. Juli 2014

SOA - und wie integriere ich ein Drittsystem mittels Web-Interface?

In einem aktuellen Kundenprojekt hatten wir eine interessante Fragestellung zu lösen. Im Kontext des Foreign Corrupt Practices Act (FCPA), des FSA Kodex der forschenden Arzneimittelhersteller sowie kommender gesetzlicher Anti-Korruptions-Anforderungen müssen Pharmaunternehmen an Fachkreise (Health Care Professionals) gewährte geldwerte Vorteile ausweisen können. Bei unserem Pharma-Kunden existiert ein FCPA-Tool, für das es außer einem Web-Interface leider keine Schnittstelle (wie Java, SOAP oder RESTful) gibt. Aber wie integriert man nun so ein System?

Zuerst dachten wir, dass wir mit dem Apache HttpClient - den wir in verschiedenen Projekten bereits erfolgreich eingesetzt haben - hier weiterkommen würden. Da die Web-Seite massiv Javascript einsetzt, kamen wir jedoch mit dem HttpClient nicht voran. Auch HtmlUnit - obwohl es besser Javascript unterstützt - half nicht spürbar weiter.
Eine weitere betrachtete Option war die Nutzung von Selenium, mit dem wir normalerweise Tests von Web-Applikationen über die Oberfläche durchführen. Hiermit konnten wir leider keine Dateien an das Formular anhängen.

Integration mit Kapow 

Schließlich haben wir die professionelle Lösung von Kapow benutzt. Bei Kapow wird mithilfe einer IDE interaktiv (ohne Programmierung, siehe Bild links) ein Robot zusammengesetzt. Diesen kann man sich wie einen virtuellen User vorstellen, der sich durch die Web-Maske hindurchklickt und ebenfalls Werte per Variablen setzen kann. Gleichermaßen wird Javascript äußerst umfänglich unterstützt. Des Weiteren kann der Robot über eine Java bzw. REST Schnittstelle, die automatisch erzeugt wird - befüllt werden (siehe Bild rechts unten).

Als ergänzende Szenarien für die Verwendung von Kapow wären die Content-Migration - bei der Content mittels eines Robotos migriert wird - oder die Datenbank-Migration bei einem Alt-System zu erwähnen.

Fazit

Mit Hilfe von Kapow konnten wir zeitnah das existierende System per Web-Frontend einbinden. Es ist auch möglich, JavaScript durch eigene Code-Snippets zu beeinflussen. Dies war nötig, da das FCPA-Tool massiv Javascript benutzt. Kapow ist unserer Meinung nach eine elegante Lösung, um bestehende Systeme, die über keine Schnittstelle - außer einem Web-Frontend - verfügen, einzubinden.

Freitag, 4. Juli 2014

Das neue WebDAV Modul in Claretportal sorgt für bessere Integration mit MS Office Programmen

Im Unternehmensumfeld zählen MS Office Programme wie Word, Excel und Powerpoint nach wie vor zu den häufigst verwendeten Software-Lösungen. In Claretportal werden Office Dokumente von den Usern in das Dokumenten-Center hochgeladen und damit für Benutzer in ausgewählten Zielgruppen bereitgestellt.

Doch jedes mal wenn ein Dokument aktualisiert werden soll, muss dieses im System gesucht, heruntergeladen, bearbeitet und danach wieder manuell hochgeladen werden. Eine unnötige Routinearbeit, die immer wiederholt werden muss. Aus diesem Grund haben wir uns überlegt, wie wir diesen Vorgang optimieren können.

WebDAV und die Nutzung in Claretportal


WebDAV (Distributed Authoring and Versioning) erweitert das HTTP-Protokoll um weitere Methoden. Es ermöglicht ein kollaboratives Bearbeiten von Dateien über Server-Grenzen hinweg.

Hierzu bekommen die Nutzer in der Admin-Konsole von Claretportal einen Edit-Link für MS-Office Dokumente angezeigt. Wird auf diesen geklickt, so öffnet sich das Dokument zur Bearbeitung bspw. direkt in Word. Speichert er seine Änderungen, so wird dieses direkt serverseitig mittels WebDAV gespeichert und zusätzlich versioniert.

Um den genannten Anforderungen gerecht zu werden, haben wir in Claretportal ein Java-Servlet eingebaut, das das WebDAV-Protokoll implementiert, Requests entgegennimmt und abarbeitet. Zusätzlich wurde ein Javascript Plug-In für die Generierung von Cross-Browser-Links erstellt.

Wie sieht das WebDAV-Protokoll im oben geschilderten Szenario aus?

Nachdem der Nutzer einen Edit-Link im Browser geklickt hat, findet eine ganze Reihe von Aktionen zwischen dem MS-Office (Client) und dem WebDAV-Servlet (Server) statt:
  1. Zuerst spricht der Client den Server mit einem OPTIONS-Request für die WebDAV Resource an. Der Server antwortet anschließend mit einer Auflistung der erlaubten Methoden. Beispielweise kann der Server die Methoden "OPTIONS, GET, HEAD, PROPFIND, PUT, LOCK, UNLOCK" zulassen.
    Damit ein Dokument mit MS-Office zum Bearbeiten geöffnet werden kann, muss der Server die beiden Methoden "LOCK" und "UNLOCK" (WebDAV Level-2) unterstützen. Sonst kann das Dokument nur lesend geöffnet werden.
  2. Der Client sendet anschließend einen LOCK-Request für das Dokument, um dieses auf dem Server für sich zu sperren. Danach können andere Clients das Dokument nur noch lesend öffnen. MS-Office zeigt beim Öffnen auch eine entsprechende Meldung an.
  3. Als nächstes ladet der Client mit einem GET-Request den Inhalt des Dokumentes herunter.
  4. Zum Schluss wird per PROPFIND-Methode die Atribute des Dokumentes gelesen.
Nach Durchführung der oben gelisteten Aktionen ist das Dokument vollständig im Microsoft-Office Programm geladen. Der Nutzer kann anfangen, das Dokument zu bearbeiten. Während diesem Vorgang findet keine Interaktion zwischen dem Client und Server statt.
Speichert der Nutzer das Dokument, wird ein PUT-Request an den Servern gesendet. Änderungen werden zum Server übertragen. Als allerletzte Aktion wird einen UNLOCK-Request gesendet. Der Server entsperrt in diesem Fall die Resource wieder. Was der Server danach mit den geänderten Daten macht, kann frei programmiert werden. Wir legen bei Claretportal bspw. eine neue Version des Dokuments in der Datenbank an - vergleichbar mit dem Upload eines Dokuments mittels Web-Browser.

Browser Integration

Aber wie erstellt man Browser-Links, um Webdav-Dokumente direkt in Office zu öffnen bzw. zu editieren?
Für den Internet-Explorer wird hierzu ein ActiveXObject [1] verwendet. Bei anderen Browsern wie Chrome, Firefox und Safari gibt es das NPAPI (Application Programming Interface Plug-In) FFWinPlugin [2]. Auf dieser Basis haben wir ein Javascript Plug-In geschrieben. Für diejenigen, die sich dafür interessieren, haben wir das Plug-In auf Github frei zugänglich gemacht [3].

Fazit:


"Alte Techniken" wie WebDAV finden durchaus valide Anwendungsszenarien in modernen Web-Applikationen.
Das FFWinPlugin wird auf einem PC standardmäßig mitinstalliert, sofern eine MS-Office Installation vorhanden ist. Dies gilt nicht nur für MS Windows PCs, sondern auch auf Apple Rechnern. Die Browser-Integration funktioniert auch auf Macs sehr gut.

Links:

Dienstag, 1. Juli 2014

Szenarien für den Einsatz von IoT und BigData: Ablage und Verwaltung von Sensordaten mit Elasticsearch (Teil 4)

Nachdem in den beiden vorhergehenden Teilen dieser Blog-Post-Serie auf die Erfassung der Messwerte im Außen- und Innen-Bereich eingegangen wurde, beschäftigt sich dieser Artikel mit der Abfrage und Ablage der Sensor-Daten.

Die nachfolgende Abbildung zeigt den Aufbau, der hierfür relevanten Infrastruktur. In einem Elasticsearch-Cluster mit zwei Knoten werden die Daten für Auswertungen und zur Anzeige vorgehalten. Befüllt wird der Cluster durch eine vorgelagerte Springboot-Applikation, die wiederum die Daten von den einzelnen Raspberry’s abruft.

Zwischen-Pufferung

Für die Persistierung kommt ein zweistufiger Ansatz zum Tragen. Im ersten Schritt erfolgt auf jedem Raspberry zunächst die Speicherung der Daten. Dies übernimmt jeweils eine kleine SpringBoot-Applikation, die alle 2 Sekunden die Innen-Sensoren abfrägt. Die Daten der außenstehenden Wetterstation werden nur dreiminütlich gesendet und abgelegt. Beide Sensor-Typen speichern ihre Ergebnisse in einer H2-Datenbank in derselben Datenbank-Tabelle. Die Bereitstellung der Daten erfolgt über einen Rest-Service, der JSON-Daten ausliefert.

Es stellt sich die Frage, warum die Messwerte nicht direkt von den Sensoren an Elasticsearch geschickt werden. Im Gegensatz zu den Raspberry's werden alle Server bei exensio und damit auch der Elasticsearch-Cluster jeden Abend im Sinne von Green-IT automatisiert heruntergefahren. Ohne Zwischenspeicherung würden die Werte in der Nacht und an den Wochenenden verloren gehen.

Abfrage der Daten

Für die Abfrage der Daten von den Raspberry's wird, wie oben schon erwähnt, ebenfalls eine Springboot-Applikation eingesetzt. Diese läuft auf dem Elasticsearch-Server und frägt im 2 Sekunden-Rythmus alle Raspberry's an. Für diesen Zweck wird an jeden Raspberry ein Request mit zwei Parametern geschickt:
http://ex-raspberry-03/sensor?created=1401196929960&max=1000
Der erste Parameter gibt den Zeitstempel des letzten in Elasticsearch abgelegten Wertes für den Sensor an. Mit der zweiten Kenngröße (max) wird die Menge der maximal zu liefernden Datensätze definiert. Aus Performancegründen werden die Abfragen asynchron mit Hilfe der @Async-Annotation von Spring vollzogen.
Die Lieferung der Daten erfolgt über den oben genannten Rest-Service, wobei nach Zeitstempel aufsteigend geliefert wird.

Nutzung von Elasticsearch

Beim Einsatz von Springboot ist die Nutzung von Spring Data naheliegend, da hierfür auch ein Elasticsearch-Provider existiert. Die abgefragen JSON-Daten befüttern das nachfolgend dargestellte POJO, das außer Annotationen keine Abhängigkeiten zu Elasticsearch besitzt.
@Getter
@Setter
@Document(indexName = "sensorraspberry")
public class IndexDocRaspberry {
    private String id;
    private String device;
    private String type;
    private Float temperature;
    @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis)
    private Date created;
    private Float humidity;
    private Float windspeed;
    private Float rainfall;
    private Float cpuTemperature;
    private Boolean valid;
}

Aus dem POJO ergibt sich automatisch die Struktur des Index für Elasticsearch, die nachfolgend dargestellt ist. Die einzelnen Attribute sind selbsterklärend. Wichtig für die spätere Darstellung ist neben den eigentlichen Nutzwerten, die Ablage des Sensor-Typs ("indoor" oder "outdoor"), sowie das Gerät von dem der Meßwert kommt. Damit lässt sich auswerten, wo der Messwert aufgezeichnet wurde (in welchem Bürozimmer).
"sensorraspberry": {
   "mappings": {
      "indexdocraspberry": {
         "properties": {
            "id": {
               "type": "string"},
            "cpuTemperature": {
               "type": "float"},
            "created": {
               "type": "date",
               "format": "dateOptionalTime"},
            "device": {
               "type": "string",
               "index": "not_analyzed"},
            "humidity": {
               "type": "float"},
            "rainfall": {
               "type": "float"},
            "temperature": {
               "type": "float"},
            "type": {
               "type": "string",
               "index": "not_analyzed"},
            "valid": {
               "type": "boolean"},
            "windspeed": {
               "type": "float"}
         }
      }
   }
}

Die nachfolgende Abbildung zeigt einen statistischen Ausschnitt des Index mit Marvel an einem Nachmittag. Hier ist rechts oben zu sehen, dass Elasticsearch mit ca. 2 Messwerten pro Sekunde gefüttert wird. Wird der Server morgens gestartet, so ist diese Indexierungsrate weit höher und liegt bei ca. 1000 Messwerten pro Sekunde. Dies ist darauf zurückzuführen, dass sämtliche gemessenen Werte von der Nacht nachgefahren werden müssen.



Fazit zum gewählten Ansatz

Bei dem genutzten Ansatz mit der Zwischenspeicherung von Daten, entstand für die Umsetzung etwas mehr Arbeit. Allerdings steht im Gegensatz dazu, der Vorteil, dass tagsüber die Wetter-Daten in Echtzeit zur Verfügung stehen und Nachts bzw. an den Wochenenden keine Server unnötig laufen. Das Nachfahren der Messwerte nach einem verlängerten Wochenende ist innerhalb weniger Minuten erledigt.

Teil 1: Szenarien für den Einsatz von IoT und BigData: Der Überblick (Teil 1)
Teil 2: Szenarien für den Einsatz von IoT und BigData: Die Wetterstation (Teil 2)
Teil 3: Szenarien für den Einsatz von IoT und BigData: Luftfeuchtigkeits- und Temperatursensor (Teil 3)

Montag, 23. Juni 2014

Hybride Mobile App für Claretportal

In unserer Blog-Serie "ClaretPortal wird mobil" haben wir gezeigt, wie eine Portal-Seite mit jQuery Mobile für mobile Endgeräte aufbereitet werden kann. Eine mobile App bietet einen weiteren komfortablen Zugang zu einer Anwendung. Die App kommuniziert dabei z.B. über eine JSON Schnittstelle mit der Anwendung, so dass immer überall die gleichen Daten vorliegen. Da Claretportal seit kurzem eine JSON Schnittstelle bietet, haben wir eine App für das iPad geschrieben, die diese Schnittstelle nutzt.
Eine solche App kann auf mehrere Arten umgesetzt werden. Neben dem "normalen" Weg eine iOS App mit Objectiv-C in Xcode zu erstellen, kann eine hybride App in Betracht gezogen werden. Als "hybride" werden Apps bezeichnet, die sich verhalten als wären sie eine echte native iOS App, aber nicht in Objektiv-C, sondern in HTML, JavaScript und CSS geschrieben sind. Das Framework Phonegap, dass auf Apache Cordova basiert, ermöglicht es gerätespezifische Funktionen wie Kamera, Neigungssensoren oder ähnliches mit JavaScript anzusteuern. So kann der Eindruck entstehen, es handle sich um eine ganz normale iOS App. Es ist von Anwendungsfall zu Anwendungsfall unterschiedlich wie gut eine Umsetzung als hybride App funktionieren kann. Grundsätzlich kann man sagen, je mehr auf die Hardware des Gerätes zugegriffen wird, desto eher sollte die App nativ umgesetzt werden. Der Vorteil hybrider Apps ist, dass ein Teil des Codes auf verschiedenen Plattformen wie iOS und Android verwendet werden kann. So kann Entwicklungsarbeit und Budget gespart werden.
Die App für Claretportal wurde als hybride App mit dem Framework Ionic umgesetzt. Ionic basiert auf Phonegap und AngularJS. Es ist ein sehr junges Open-Source Project, das bei Github aber schon sehr viele Mitentwickler gefunden hat.

See the Pen Side Menu and Navigation: 1.0.0-beta.6 by Florian Mutter (@elm) on CodePen.
Das eingebundene Beispiel zeigt, wie man mit dem Ionic-Framework ein Seitenmenü umsetzen kann. Weitere Beispiele gibt es bei Codepen. Ionic bringt bereits viele Teile mit, die zum Bauen einer App benötigt werden, wie z.B. eigene Cordova-Plugins um die native Tastatur richtig einzubinden, Unterstützung für Listen mit mehreren Tausend Einträgen, verschiedene Knöpfe, Checkboxen und Toggles oder Tabs.
Die Demo-App, die wir erstellt haben, setzt zum großen Teil ein eigenes Design ein. Die folgenden drei Screenshots zeigen die App.
Haupmenü
Neuigkeiten
Dokumentensuche
Durch den Einsatz von Ionic mit AngularJS konnte die App mit nur etwas mehr als 500 Zeilen Javascript-Code erstellt werden. Dabei sind alle Menüs und Kontrollelemente, die auf den Screenshots zu sehen sind, vollständig funktionsfähig. Die Suche wird von Claret auf dem Server ausgeführt und das Ergebnis angezeigt, sobald etwas in das Suchfeld getippt wird. Auch die Zahl der Dokumente die zu einem bestimmten Tag (links im Bild) verfügbar sind, aktualisiert sich sofort.

Da die App auf Cordova basiert, kann sie ohne Probleme auf iOS und Android eingesetzt werden. Die Unterstützung für Windows Phone soll in Ionic im Laufe des Sommers veröffentlicht werden.