Voorkom kantoorduizelingen met Azure analytics services

Auteur: Robert Bakker

In deze blog wordt beschreven waarom en hoe we kwamen tot een Azure Stream Analytics oplossing die waarschuwingen afgeeft als het CO2 niveau in een vergaderruimte tot een ongezond hoog niveau dreigt op te lopen. Het gaat ons hierbij vooral om het illustreren van de mogelijkheden van Azure Stream Analytics Service.

Er waren twee belangrijke pijlers onder dit project:

  • Er was al een complete Internet Of Things opstelling met sensoren1 opgebouwd;
  • We hadden een getalenteerde Data Science stagiaire.

IOT OPSTELLING

Macaw investeerde recent in een IOT-oplossing om in een aantal ruimten temperatuur, CO2-niveau, licht, beweging e.d. te meten met behulp van sensoren. Het viel op dat de hoeveelheid CO2 vaak ongezonde niveaus bereikte. De door ons gekozen grenswaarde van 800 ppm werd af en toe bereikt, vooral tijdens grote bijeenkomsten.

Azure Analytics Services

DATA SCIENCE

In januari 2017 werkte één van onze stagairs in het Data Science Team aan een Machine Learning model dat de CO2 waarde voorspelt die over 15 minuten wordt bereikt. Haar bevindingen voor de beste voorspellende factoren waren:

  1. Welk gebruik van de ruimte wordt verwacht?
    Is er een bijeenkomst gepland, en zoja: Hoeveel mensen nemen daar naar verwachting aan deel? Deze data werd betrokken uit Outlook (ruimte reserveringen)
  2. CO2 niveau
    Gebruik hiervoor de trend in het voorafgaande uur, specifiek de gemiddelde waarden van de afgelopen 15 minuten op 60 (t-4), 30 (t-2) en 15 (t-1) minuten voorafgaande aan het te voorspellen moment (t0)
    Gebruik en voorafgaand CO2-niveau zijn uiteraard goede voorspellers. Heel belangrijk bleek ook de volgende:
  3. Temperatuur

Hier was het afdoende om de gemiddelde waarde van 15 minuten op 30 minuten voorafgaande aan het te voorspellen moment te nemen (t-2).
Het feit dat de temperatuur ook een belangrijke voorspeller is, kwam als een verrassing. Een paar observaties later vonden we de reden: Soms doen mensen een raam open als de ruimte te muf wordt. CO2-niveau en temperatuur gaan dan samen hard naar beneden (winter)!

Onze stagiaire verkreeg de beste resultaten met een standaard regressie-algoritme.

AZURE INTEGRATIE

Alle ingrediënten zijn nu aanwezig om de mogelijkheden van Microsoft Azure Services te gaan verkennen. Want het bouwen van een real-time analytische toepassing komt neer op de compositie van specifieke Azure services:

  • Azure IOT Hub die de sensordata opslaat2
  • Azure Stream Analytics die de gegevens analyseert en de juiste waarden doorgeeft aan een
  • Azure Machine Learning model dat de eerstvolgende, verwachte CO2 waarde voorspelt

Het resultaat wordt voortdurend doorgestuurd naar een Power BI Streaming dashboard. Zo kunnen de resultaten direct bekeken worden. Misschien nog belangrijker: Met Power BI kan het systeem opgewaardeerd worden tot een actieve oplossing door een alarmsignaal af te geven: ‘Als het CO2 niveau door een bepaalde grens heen dreigt te gaan, stuur dan een melding aan de juiste collega om het raam open te zetten.

Azure Analytics services

De figuur hierboven laat de opstelling zien.

Wat kostte de meeste tijd en wat hebben we geleerd?

Het onderling aanroepen van services in Azure is prima te doen: De onderlinge verbindingen worden eenvoudig gelegd en zijn goed gedocumenteerd. De uitdagingen zaten hem vooral in de volgende onderwerpen:

  • Hoe maak ik een statistisch goed te onderbouwen Machine Learning model? Dit is buiten scope van deze blog, wat in dit kader interessant is vind je hierboven onder ‘Data Science’)
  • Hoe genereer ik gebeurtenissen in het juiste ritme? (IOT Ritme, zie hieronder)
  • Welke query moet ik in Stream Analytics (SA) schrijven om alles aan elkaar te knopen?

IOT Ritme

Om een idee te geven: Op 9 februari hadden we een bijeenkomst met veel aanwezigen in één van onze vergaderruimten. We wisten dat de vergadering zou beginnen om 18:00 uur en dat er minstens 10 personen aan zouden deelnemen. De eerste piek in bovenstaande figuur laat zien wat er op CO2 gebied gebeurde vanaf het begin van die bijeenkomst.
In het begin gaven de sensoren elke 10 minuten een nieuwe waarde af, die elke 5 minuten op de Azure IOT Hub werd geplaatst. Dat leverde een structurele afwijking3 op:
We moesten daarom onze data-acquisitie aanpassen zodat nieuwe sensor meetwaarden direct werden doorgestuurd naar de hub.

STREAM ANALYTICS (SA)

We ontdekten dat SA een leercurve heeft:

  1. De taal zelf lijkt erg op Transact SQL, maar het testen is lastiger.
    Bij het testen moet je een sample-periode voor je data aangeven. Pas als die dataset compleet ‘binnen’ is, kun je de query uitvoeren en het resultaat bekijken. Dat kan nogal veel tijd kosten. Sinds begin vorig jaar is de tool ‘Azure Stream Analytics voor Visual Studio’ beschikbaar gekomen. Die werkt als een emulator. Hiermee bespaar je sample-tijd omdat de gesamplede intervallen beschikbaar blijven en niet telkens opnieuw hoeven te worden afgewacht. Andere belangrijke eigenschappen van deze tool: Het is mogelijk de query-code zichtbaar te maken in een diagram en je kunt je code in Visual Studio projecten opnemen. Door de mogelijkheid van source control wordt Stream Analytics geschikt voor professionele toepassingen.
  2. Het concept van timing vereist een wat andere instelling.
    Allereerst houd je rekening met een reeks gebeurtenissen, die allemaal jouw query zouden kunnen laten afgaan. Je moet daarom uitspraken doen over tijdperiodes, zoals: ‘Het gaat me om de gemiddelde waarde in de afgelopen 15 minuten’ en die moet je zelf een sample-tijdstip meegeven. Als je datasets aan elkaar wil joinen, doe je dat in SA met joins op datetime waarden en BETWEEN clausules (zie hieronder)
  3. Bij sensoren kun je niet uitgaan van de aanwezigheid van nieuwe waarden in alle tijdperioden.
    Dit probleem zul je in de query moeten oplossen omdat het Azure Machine Learning model wel altijd alle parameters nodig heeft om te kunnen voorspellen. Wij kozen ervoor om de laatst bekende waarde uit de voorafgaande periode van een volledig uur als uitgangspunt te nemen. Deze waarde zal er zeker zijn, omdat het uitvoeren van de query zelf door minstens één van de gebeurtenissen is gestart waarin die waarden werden aangeleverd.

Hoe schrijf je een query met Stream Analytics?

Hieronder zie je de gestyleerde weergave van onze query waarin we de bovengenoemde aspecten laten zien:

Azure Analytics services

Het Tumbling Window dat je terugvindt in PeriodicCO2_BG11 is één van de 3 Windowingfunctie mogelijkheden die SA biedt. Het gaat dan om een reeks van vaste, niet overlappende en aaneengesloten tijdsintervallen. In ons geval worden gedurende 15 minuten gemiddelden genomen en begint daarna meteen het volgende window.

In de hoofd-join in de query zorgt de DATEDIFF met de BETWEEN tussen 0 en 15 ervoor dat het window werkt over de 15 aan de huidige gebeurtenis voorafgaande minuten.

Nu moeten we het nog hebben over de mogelijkheid dat gebeurtenissen uitblijven. We hebben dat opgevangen door ervoor te zorgen dat een goede benadering altijd aanwezig is door de LAST(Value) en die joinen we verplicht mee (INNER JOIN) met de IOT stream ON DATEDIFF()

De periodieke waarden zelf worden optioneel gejoined (LEFT JOIN), zodat de query ook uitvoer levert als er geen waarden in de IOT stream zitten, en de CASE WHEN zorgt er dan voor dat geschakeld wordt tussen wel en niet aanwezige periodieke data.
Let op: In Transact SQL zouden we COALESCE() of ISNULL() toepassen, maar die taalelementen bestaan niet in SA.

RESULTAAT

De volgende grafiek laat zien hoe de voorspelde waarde (oranje) vrij nauwkeurig 15 minuten eerder aangeeft wat de daadwerkelijke waarde (zwart) zal zijn.
Weergave van voorspelling en meetwaarden in één grafiek.

Azure Analytics services

CONCLUSIE

Met Microsoft Azure Services komt het bouwen van een real-time analytische toepassing neer op de compositie van uitgekozen Azure services. In het bijzonder biedt Azure Stream Analytics groot gemak om oplossingen te bouwen waarin het aankomt op het afgeven van voorspellingen op basis ban een continue stroom van gegevens. De inspanning zit hem niet zozeer in het met elkaar integreren van die componenten, maar meer in het correct functioneel modelleren en daarna het formuleren van de juiste SA query die juist is en die tegen een stootje kan.

Voetnoten:

  1. Dit is een door Microsoft beschreven experiment dat je zelf kunt nadoen. Je vindt de beschrijving terug op deze pagina. Zelf hebben we hier een Azure IOT Hub aan toegevoegd om de metingen veilig op te kunnen slaan en naar extra outputs te kunnen sturen.
  2. Om sensordata te combineren met Outlook afspraken, worden die laatste ook in gebeurtenissen voor de Hub omgezet.
  3. In bovenvermeld voorbeeld wordt elke 15 minuten de ene waarde dubbel meegenomen, de andere enkel.