Azure IoT Schwimmbadsteuerung: Smarte Sensoren & Fernüberwachung
Komponenten und Materialien
| DS18B20 wasserdichter digitaler Temperatursensor | × | 2 |
| IoT Power Relay | × | 1 |
| Widerstand 4,75 kOhm (1/4W, 5%) | × | 2 |
| Raspberry Pi 2 Model B | × | 1 |
| Arduino UNO R3 | × | 1 |
Apps und Online-Dienste
- Microsoft Azure
- Windows 10 IoT Core
- Arduino IDE
- Microsoft Visual Studio 2015
- Azure IoT Hub Device Explorer
- Fritzing
- Power BI
Projektübersicht
Ziel dieses Projekts ist die Steuerung und Überwachung eines Schwimmbeckens mittels Temperatursensoren, Relais und Microsoft Azure. Auslöser war die Notwendigkeit, den Kinderpool (Intex 15' × 48", ca. 19.000 Liter) fernzusteuern. Das Becken ist mit Sandfilter/Pumpe, 11-kW-Heizung und Salzwasseranlage ausgestattet. Ziel: Wassertemperatur, Außentemperatur überwachen und Pumpe, Heizung sowie Salzanlage so steuern, dass das Wasser warm genug für die Kinder ist, ohne unnötig Energie zu verschwenden.
Raspberry Pi, Arduino, IoT Power Relay und Breadboard sind in einem wasserdichten Kunststoffbehälter mit Kabeldurchführungen und Belüftung untergebracht.
Sensoren
Zwei wasserdichte DS18B20-Sensoren (Poolwasser und Außenluft) sind an einen Arduino Uno R3 über die Dallas Controls Library und OneWire Library angeschlossen. Die Temperaturdaten (in °C) werden jede Sekunde über I2C an den Raspberry Pi gesendet, wobei die beiden Werte durch ein "|" getrennt sind.
temperatureData = padRight(String(poolSensor.getTempCByIndex(0)) + "|" + String(outsideSensor.getTempCByIndex(0)), I2C_BUFFER_LEN);
Anschluss der DS18B20-Sensoren:
- Rot → 3,3V/5V
- Blau/Schwarz → GND
- Gelb/Weiß → Daten
Für den Wassersensor wurde günstige 20-adrige Klingeldraht zur Verlängerung verwendet; der Sensor wird direkt ins Wasser getaucht. Der zweite Sensor für die Außentemperatur ist außen am Gehäuse befestigt.
Relais
Der Raspberry Pi steuert über den 3,3V-Pin einen IoT Power Relay, an dem Pumpe und Salzwasseranlage (110V) angeschlossen sind. Das Relais schaltet ein Paar 110V-Steckdosen (standardmäßig aus).
Die Heizung (220V/60A) benötigt kein separates Relais, da sie über einen eingebauten Durchflusssensor verfügt und nur bei Wasserfluss heizt. Ein passendes Relais für 220V/60A bei 3,3V/5V Steuerspannung war nicht verfügbar. Zukünftig sollen Stromverbrauchssensoren für 110V- und 220V-Kreise hinzugefügt werden.
Raspberry Pi
Der Raspberry Pi läuft unter Windows IoT Core (Build 10.0.10586.0) und führt folgende Aufgaben aus:
- Führt die Hintergrundanwendung IoTPoolRaspiBackgroundApp aus
- Fungiert als IoT Field Gateway
- Versorgt den Arduino Uno über USB (5V)
- Empfängt Pool- und Außentemperatur (°C) vom Arduino über I2C
- Steuert den IoT Power Relay über einen 3,3V-Pin
- Sendet alle 1 Minute Pooldaten (Name, Wassertemperatur, Außentemperatur, Relaisstatus, UTC-Zeitstempel) an Azure IoT Hub
Die IoTPoolRaspiBackgroundApp ist eine kopflose C#-Anwendung, erstellt mit dem Visual Studio 2015 Template "Background Application (IoT)".
JSON-Payload an Azure IoT Hub (alle 1 Minute via AMQP):
{ "PoolName": "iotpool", "PoolWaterTempC": 30, "OutsideAirTempC": 27, "IsPoolPowerOn": false, "SampleDateTime": "2016-07-05T23:35:58.0882185Z" }
Der Raspberry Pi wird als Gerät im Azure IoT Hub registriert (am einfachsten mit Device Explorer). Dieses Tool eignet sich auch zum Überwachen von D2C-Nachrichten und Testen von C2D-Nachrichten.
In StartupTask.cs müssen folgende Werte angepasst werden:
static string iotPoolConnString = "HostName=<iothubname>.azure-devices.net;DeviceId=iotpool;SharedAccessKey=<key>";
static string deviceName = "iotpool";
Arduino Uno
Der Arduino Uno R3 liest zwei DS18B20-Sensoren (Dallas Controls Library, OneWire Library), wird vom Raspberry Pi über USB (5V) versorgt und sendet die Temperaturwerte über I2C (SDA/SCL) an den Pi. Das Fritzing-Diagramm zeigt den Schaltplan.
Verwendeter Code: Two-DS18B20-I2C.ino
Azure-Komponenten
Alle Azure-Ressourcen wurden in der Region "West US" erstellt, um Egress-Kosten zu minimieren.
Azure IoT Hub
Verwendete Free-Edition: 8.000 Nachrichten/Tag à 500 Bytes. Die App sendet 1.440 D2C-Nachrichten/Tag à 158 Bytes – ausreichend Spielraum für C2D-Nachrichten. Geräteregistrierung und Connection String über Device Explorer.
Azure Stream Analytics
ASA-Job verbindet IoT Hub Input mit Azure SQL Database Output:
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Jede D2C-Nachricht (1/Minute) wird in die Tabelle "Pools" geschrieben. Zukünftig könnten Aggregationen für Alerts ergänzt werden (z. B. Durchschnittstemperatur > 35°C).
Azure SQL Database
S0 Standard (10 DTUs) für minimalen Kostenbedarf. Einzeltabelle "Pools" für alle D2C-Nachrichten.
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 (ASP.NET Web API) mit API-Key-Authentifizierung im HTTP-Header:
api-key: {your API key}
API-Key wird in IoTPoolAPI\Controllers\PoolControllers.cs definiert. Mobile App und Web App nutzen diesen Key.
Zukünftig: Azure API Management, Azure Active Directory Authentifizierung.
Azure Web App
ASP.NET Web Forms Anwendung (IoTPoolWebApp) zur Interaktion mit der API.
Auch mobilfreundliche Version vorhanden. In default.aspx.cs müssen API-Key und Endpunkte angepasst werden. Integration mit Azure Active Directory (AAD) für Benutzerauthentifizierung. Registrierung der Web App im AAD-Tenant erforderlich, Client ID in web.config eintragen.
Mobile App
Xamarin Forms, kompiliert für Windows Phone und Windows 10 (kreuzkompilierbar für iOS/Android).
In Core.cs, DataService.cs und PoolPage.xaml.cs müssen API-Endpunkte und API-Key eingetragen werden.
Power BI
Kostenlose Power BI Desktop Version für Echtzeit-Dashboard. Verbindung zu Azure SQL DB (DirectQuery), Berichte erstellen, als .pbix auf PowerBI.com veröffentlichen, an Dashboard pinnen. Zukünftig: Power BI Embedded für direkte Einbindung in Web App. Aktuell über PowerBI.com oder mobile Power BI App abrufbar.
Referenzen
- Windows IoT Blinky Sample
- Arduino Pool Controller
- Azure IoT Hub C# Get Started
- Azure IoT Hub C2D
- ASP.NET Web API mit SQL
- Xamarin Forms Azure Mobile Apps
- I2C auf Windows IoT
- Arduino Windows Guide
- OneWire Library
- Dallas Temperature Control Library
- I2C Tutorial
Besonderer Dank an Miles Burton (Dallas Library) und Mike Mackes (Arduino/I2C/DS18B20 Code & Inspiration).
Code
JSON Payload Format (D2C)
{ "PoolName": "IoTPool", "PoolWaterTempC": 30, "OutsideAirTempC": 27, "IsPoolPowerOn": false, "SampleDateTime": "2016-07-05T23:35:58.0882185Z" }
Hinweis: "IsPoolPowerOn" – 0 = aus, 1 = ein
SQL Tabellenschema "Pools"
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)
);
GitHub Repository
Gesamter Quellcode: https://github.com/khilscher/iotpool
Schaltpläne
- Raspberry Pi zu Arduino über I2C mit 2 DS18B20 Sensoren (
RaspiArduinoTwoDS18B20.fzz) - Gesamtarchitekturdiagramm
Herstellungsprozess
- Umfassender Leitfaden: Design und Bau von Einbau- und Aufstellpools
- Arduino launcht Portenta H7: Industrial-Grade IoT Board Debutiert auf CES
- Azure RTOS erweitert Support über führende Embedded-Plattformen mit neuen Development Kits
- Azure vs. AWS: Welche Cloud-Plattform gewinnt für IoT?
- GPS-Datenlogger mit räumlicher Analyse auf Azure IoT Hub
- IoT- & KI-gestützte Wasserqualitätsüberwachung schützt Wasserleben
- Echtzeit-IoT-Herzfrequenzmonitor mit Arduino & MAX30100
- Fernsteuerung eines Roboterarms per IoT: Eigenbau mit Arduino MKR1000
- Smart IoT-Glas bauen: Füllstand überwachen mit ESP8266, Arduino & Ultraschall
- IoT-Solartracker: Intelligentes Energiemanagement mit Arduino Mega