Azure IoT Zwembadbeheersysteem: Slimme Sensoren & Remote Monitoring
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| DS18B20 Waterdichte Digitale Temperatuursensor | 2 |
| IoT Power Relay | 1 |
| Weerstand 4.75k ohm (1/4W, 5%) | 2 |
| Raspberry Pi 2 Model B | 1 |
| Arduino UNO R3 | 1 |
Apps en online diensten
- Microsoft Azure
- Microsoft Windows 10 IoT Core
- Arduino IDE
- Microsoft Visual Studio 2015
- Azure IoT Hub Device Explorer
- Fritzing
- Power BI
Over dit project
Overzicht
Het doel van dit project is het beheren en monitoren van een zwembad met temperatuursensoren, relais en Microsoft Azure. De inspiratie kwam uit de behoefte om het zwembad van onze kinderen (Intex 15' x 48", ~5000 gallon) op afstand te bedienen. Het zwembad is aangesloten op een zandfilter/pomp, een 11kW verwarmingsketel en een zoutwatersysteem. Doel: water- en luchttemperatuur monitoren, pomp, verwarming en zoutwatersysteem besturen om het water warm genoeg te houden zonder overmatig gebruik.
De Raspberry Pi, Arduino, IoT Power Relay en breadboard zijn met kabelbinders in een kunststof opslagbox gemonteerd, afgedicht tegen vocht. Gaten zijn geboord voor kabels en ventilatie.
Sensoren
Monitoring van zwembadwatertemperatuur en luchttemperatuur gebeurt met twee DS18B20 waterdichte temperatuursensors, aangesloten op een Arduino Uno R3 via de Dallas Controls Library en OneWire Library. De temperatuurdata (in Celsius) wordt elke seconde via I2C naar de Raspberry Pi gestuurd. De twee waarden worden gescheiden door een "|".
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);
Aansluiting DS18B20:
- Rood: 3V/5V
- Blauw/Zwart: Ground
- Geel/Wit: Data
Voor de watersensor werd goedkope 20-gauge beldraad gebruikt om de bereik uit te breiden. Deze sensor is ondergedompeld in het zwembad.
De tweede sensor voor luchttemperatuur is aan de buitenkant van de behuizing geplakt.
Relais
De Raspberry Pi stuurt een IoT Power Relay stekkerblok aan waarmee de pomp en het zoutwatersysteem op 110V zijn aangesloten. Dit gebeurt via de 3V-pin op de Pi. Het wisselen van de 3V-pin schakelt een paar 110V stopcontacten op de IoT Power Relay in/uit (standaard uit). Zie schema later.
Geen relais voor de verwarming nodig: deze heeft een ingebouwde flowsensor en stopt/start op basis van waterstroom. Daarnaast was geen relais te vinden voor 220V/60A via 3V/5V. Toekomst: sensoren voor elektriciteitsverbruik 110V en 220V circuits.
Raspberry Pi
De Raspberry Pi draait Windows IoT Core Build 10.0.10586.0 en voert uit:
- Draait de IoTPoolRaspiBackgroundApp achtergrondapplicatie
- Funziona als IoT field gateway (opaque)
- Voedt Arduino Uno via USB (5V)
- Ontvangt zwembad- en luchttemperatuur (in °C) van Arduino via I2C
- Bestuurt IoT Power Relay via 3V-pin
- Verstuurt elke minuut: zwembadnaam, watertemperatuur, luchttemperatuur, relaisstatus, timestamp (UTC) naar Azure IoT Hub
De IoTPoolRaspiBackgroundApp is een headless C# applicatie, gebouwd met de Background Application (IoT) sjabloon in Visual Studio 2015 Update 3.
Elke minuut wordt volgende JSON-payload via AMQP naar Azure IoT Hub gestuurd (kan gewijzigd worden naar HTTPS of MQTT):
{ "PoolName" : "iotpool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
De Raspberry Pi is geregistreerd als apparaat in Azure IoT Hub. Registratie en connection string verkrijgen via Device Explorer. Dit hulpmiddel is ook handig voor monitoring D2C-berichten en testen C2D-berichten.
Wijzig in StartupTask.cs om verbinding te maken met uw IoT Hub:
static string iotPoolConnString = "HostName=<iothubname>.azure-devices.net;DeviceId=iotpool;SharedAccessKey=<key>";
static string deviceName = "iotpool";
Arduino Uno
De Arduino Uno R3 is verbonden met twee DS18B20 sensoren via Dallas Controls Library en OneWire Library. Hij wordt gevoed door de Raspberry Pi via USB (5V) en stuurt de temperatuurwaarden via I2C (SDA/SCL pinnen) naar de Pi. Zie Fritzing-schema.
Gebruik de code Two-DS18B20-I2C.ino voor de Arduino.
Azure
Alle Azure-componenten zijn in dezelfde regio (West US) aangemaakt om egress-kosten te minimaliseren.
Azure IoT Hub
Gratis editie gebruikt: 8.000 berichten/dag van 500 bytes. De app stuurt 1.440 berichten/dag van 158 bytes. Voldoende marge voor C2D-berichten.
Registreer apparaat met Device Explorer. Haal connection string op via Device Explorer.
Azure Streaming Analytics
ASA-job verbindt IoT Hub input met Azure SQL Database output via query:
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Elk D2C JSON-bericht (1 per minuut) wordt geschreven naar tabel Pools in Azure SQL Database. Toekomstige verbetering: aggregatiefuncties voor alerting (bijv. gemiddelde watertemp > 35°C).
Azure SQL Database
Kostenminimalisatie: S0 Standard (10 DTUs). Eén database met één tabel voor alle D2C-berichten.
CREATE TABLE [dbo].[Pools] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[PoolName] NVARCHAR (MAX) NULL,
[PoolWaterTempC] FLOAT (53) NOT NULL,
[OutsideAirTempC] FLOAT (53) NOT NULL,
[IsPoolPowerOn] INT NOT NULL,
[SampleDateTime] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.Pools] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Azure API App
RESTful API gebouwd met ASP.NET Web API. Authenticatie via API-key in HTTP-header:
api-key : {uw API key}
API-key gedefinieerd in IoTPoolAPI\Controllers\PoolControllers.cs. Mobiele app en webapp gebruiken deze key.
Ondersteunde REST-methoden:
Toekomst: achter Azure API Management plaatsen, Azure AD authenticatie toevoegen.
Azure Web App
IoTPoolWebApp bevat ASP.NET Web Forms applicatie om met API te communiceren.
Ook mobiele versie beschikbaar. Wijzig in default.aspx.cs:
private static string apiKey = "";
HttpRequestMessage requestMessage = ...."https://<yourwebsite>.azurewebsites.net/api/pool/poweroff");
HttpRequestMessage requestMessage = ...."https://<yourwebsite>.azurewebsites.net/api/pool/poweron");
HttpRequestMessage requestMessage = ...."https://<yourwebsite>.azurewebsites.net/api/pool/getlatest");
Web app geïntegreerd met Azure Active Directory (AAD) voor authenticatie. Alle gebruikers moeten via AAD inloggen.
Registreer web app bij uw AAD-tenant (bijv. tenant_name.onmicrosoft.com) via Azure Portal of Visual Studio. Kopieer Client ID uit Azure Portal. Wijzig AAD-domein in web.config:
<appSettings>
<add key="ida:ClientId" value="<AAD client ID>" />
<add key="ida:AADInstance" value="https://login.microsoftonline.com/" />
</appSettings>
Mobiele App
Geschreven in Xamarin Forms. Gecompileerd voor Windows Phone en Windows 10, zou cross-compileren naar iOS en Android.
Wijzig in Core.cs:
string queryString = "https://<yourwebsite>azurewebsites.net/api/pool/getlatest"
Wijzig in DataService.cs:
private static string apiKey = "";
Wijzig in PoolPage.xaml.cs:
private static string apiKey = "";
HttpRequestMessage requestMessage = ...."https://<yourwebsite>.azurewebsites.net/api/pool/poweroff");
HttpRequestMessage requestMessage = ...."https://<yourwebsite>.azurewebsites.net/api/pool/poweron");
Power BI
Power BI (gratis) gebruikt voor realtime dashboard met IoT zwembadgegevens.
Proces: Power BI Desktop downloaden, verbinden met Azure SQL DB (DirectQuery), rapporten maken met visuals, .pbix publiceren naar PowerBI.com, rapport pinnen aan dashboard. Toekomst: Power BI Embedded voor integratie in webapp. Nu bekijkbaar via PowerBI.com of gratis Power BI mobiele app.
Referenties
- Windows IoT Blinky sample
- Arduino Pool Controller project
- Azure IoT Hub C# getting started
- Azure IoT Hub C2D
- ASP.NET REST API met SQL Database
- Xamarin Forms met Azure
- I2C op Arduino
- Arduino Windows gids
- OneWire library
- Dallas Temperature Control Library
- I2C tutorial
Speciale dank aan Miles Burton voor Dallas Controls Library en Mike Mackes voor Arduino/I2C/DS18B20 voorbeeldcode en inspiratie.
Code
JSON Message Payload Formaat (D2C)
Let op: "IsPoolPowerOn" - 0 = uit, 1 = aan
{ "PoolName" : "IoTPool", "PoolWaterTempC" : 30, "OutsideAirTempC" : 27, "IsPoolPowerOn" : false, "SampleDateTime" : "2016-07-05T23:35:58.0882185Z" }
SQL Database "Pools" Tabel Schema
CREATE TABLE [dbo].[Pools] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[PoolName] NVARCHAR (MAX) NULL,
[PoolWaterTempC] FLOAT (53) NOT NULL,
[OutsideAirTempC] FLOAT (53) NOT NULL,
[IsPoolPowerOn] INT NOT NULL,
[SampleDateTime] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.Pools] PRIMARY KEY CLUSTERED ([Id] ASC)
);
IoT Pool GitHub Repository
Alle broncode: https://github.com/khilscher/iotpool
Schema's
Raspberry Pi naar Arduino via I2C met 2 DS18B20 sensoren: RaspiArduinoTwoDS18B20.fzz
Algemeen architectuurdiagram:
Productieproces
- Uitgebreide Gids voor In-grond en Bovengrond Zwembad Ontwerp & Constructie
- Bouw een GPS-datalogger met ruimtelijke analyse op Azure IoT Hub
- IoT & AI-gestuurde Waterkwaliteitsmonitoring Beschermt Aquatisch Leven
- Real-time IoT hartslagmonitor met Arduino en MAX30100
- Externe IoT-besturing van een zelfgebouwde robotarm
- Bouw een Slimme IoT Pot met ESP8266, Arduino & Ultrasonische Sensor – Real-time Monitoring
- IoT-zonnesturing: Slimme energiemanagement met Arduino
- Web-IoT Meter Bouwen met Arduino, Yaler en IFTTT
- Arduino lanceert Portenta H7: Industriële IoT-board debuteert op CES
- Azure RTOS breidt uit over grote embedded platforms met nieuwe ontwikkelkits
- Azure vs AWS: Welk cloudplatform wint voor IoT?