AzureIoTスイミングプール
コンポーネントと消耗品
| × | 2 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
| ||||
| ||||
| ||||
| ||||
| ||||
|
このプロジェクトについて
概要
このプロジェクトの目的は、温度センサー、リレー、およびMicrosoftAzureを使用してスイミングプールを制御および監視することです。
このプロジェクトのインスピレーションは、Intex 15'x48 "ラウンドプールである子供用プールをリモートで操作および監視する必要があることです。プールには約5000ガロンの水があります。サンドフィルター/ポンプに接続されています。 11KWヒーター、および塩水システム。目標は、プールの水温、気温を監視し、ポンプ、ヒーター、および塩水システムを制御して、プールがオーバーランすることなく、子供たちが十分に暖かくなるようにすることでした。
この5分間のビデオでは、プール、センサー、回路基板、リレーがどのように接続されているかを示しています。
次のアーキテクチャ図は、ソリューションのすべての主要コンポーネントを示しています。
<図>Raspberry Pi、Arduino、IoT Power Relay、ブレッドボードは、水や湿気を防ぐためにプラスチック製の保管容器にジッパーで固定されています。ケーブルと換気のために穴が開けられました。
<図>
センサー
プールの水温と気温の監視は、Dallas ControlsLibraryとOneWireLibraryを使用してArduinoUnoR3に接続されたDS18B20防水温度センサーのペアを使用して行われます。温度データ(摂氏)は、I2Cを介して1秒ごとにRaspberryPiに送信されます。 2つの温度値は「|」で区切られます。
temperatureData =padRight(String(poolSensor.getTempCByIndex(0))+ "|" + String(outsideSensor.getTempCByIndex(0))、I2C_BUFFER_LEN);
DS18B20防水温度センサーは、次のように事前に配線されています。
- 赤は3v / 5vに接続します
- 青/黒はアースに接続します
- 黄色/白はデータです
水温を読み取るDS18B20の到達距離を伸ばすために、安価な20ゲージのベルワイヤー(ドアベルワイヤー)を使用しました。このDS18B20はプールに沈んでいます。
<図>2番目のDS18B20センサーの読み取り空気温度は、プラスチック製の保管容器の外側にテープで固定されています。
リレー
Raspberry Piは、110vを使用してポンプと塩水システムが接続されているIoTパワーリレーパワーバーを制御します。これは、Piの3vピンを使用して行われます。 3vピンを切り替えると、IoTパワーリレーの110vコンセントのペアが有効/無効になります(コンセントのペアはデフォルトでオフになっています)。回路図については、後の図を参照してください。
<図>ヒーターには流量センサーが内蔵されており、水流の有無により加熱を停止・開始しますので、リレーを接続する必要はありませんでした。さらに、3vまたは5vを使用してヒーターに必要な220v / 60amp回路を制御するためのリレーを簡単に見つけることができませんでした。
将来的には、110vおよび220v回路の電気的使用を測定するためのセンサーを取り付ける予定です。誰かが推薦してくれるなら、ありがたいです。
ラズベリーパイ
RaspberryPiはWindowsIoT Core Build 10.0.10586.0を実行し、以下を実行します。
- IoTPoolRaspiBackgroundApp を実行します バックグラウンドアプリケーション;
- IoTフィールドゲートウェイとして機能します(不透明)。
- USB(5v)を介してArduinoUnoに電力を供給します。
- I2Cを介してArduinoUnoからプールと気温(C)を受け取ります;
- 3vピンを使用してIoTパワーリレーを制御します。および
- プール名、プール温度、気温、IoTパワーリレーのオン/オフステータス、およびタイムスタンプ(UTC)を1分ごとにAzure IoTHubに送信します。
IoTPoolRaspiBackgroundAppは、バックグラウンドアプリケーション(IoT)を使用して構築されたヘッドレスC#アプリケーションです。 Visual Studio 2015、Update3のプロジェクトテンプレート。
IoTPoolRaspiBackgroundAppは、AMQPを使用して1分ごとに次のJSONペイロードをAzure IoT Hubに送信します(これは、ソースコードでHTTPSまたはMQTTに変更できます)。
{"PoolName": "iotpool"、 "PoolWaterTempC":30、 "OutsideAirTempC":27、 "IsPoolPowerOn":false、 "SampleDateTime": "2016-07-05T23:35:58.0882185Z"}
Raspberry Piは、Azure IoTHubにデバイスとして登録されています。 Azure IoT Hubにデバイスを登録する最も簡単な方法は、デバイスエクスプローラーを使用することです。このツールは、デバイスの接続文字列を取得し、D2C(デバイスからクラウド)メッセージを監視し、C2D(クラウドからデバイス)メッセージの送信をテストするための優れた方法でもあります。
StartupTask.csで以下を編集して、IoTPoolRaspiBackgroundAppをIoTハブに接続します。
static string iotPoolConnString ="HostName = .azure-devices.net; DeviceId =iotpool; SharedAccessKey ="; static string deviceName ="iotpool";
Arduino Uno
Arduino Uno R3は、Dallas ControlsLibraryとOneWireLibraryを使用して2つのDS18B20温度センサーに接続されています。これは、USB(5v)を介したRaspberry Piから電力を供給され、SDAピンとSLCピンを使用してI2Cを介してRaspberryPiに温度測定値のペアを送信します。回路図については、フリッツの図を参照してください。
<図>Two-DS18B20-I2C.inoコードを使用してArduinoを実行します。
Azure
すべてのAzureコンポーネントは、出力トラフィックに関連するコストを最小限に抑えるために、同じAzureリージョン(米国西部)で作成されました。
AzureIoTハブ
このプロジェクトでは、Azure IoTHubの無料版が使用されました。それぞれ500バイトで1日あたり8,000メッセージに制限されています。 IoTPoolRaspiBackgroundAppは、D2Cメッセージを1分あたり1回、つまり1日あたり1,440バイトでそれぞれ158バイトで送信します。これにより、C2Dメッセージに十分な余裕ができます。
まず、デバイスをAzure IoTHubに登録する必要があります。最も簡単な方法は、デバイスエクスプローラーを使用することです。登録すると、デバイスエクスプローラーを使用してデバイス接続文字列を取得できます。
<図>
Azure Streaming Analytics
Azure Streaming Analytics(ASA)ジョブは、次の単純なASAクエリを使用して、IoTHub入力をAzureSQLデータベース出力に接続します。
SELECT PoolName、PoolWaterTempC、OutsideAirTempC、IsPoolPowerOn、SampleDateTimeINTO sqlFROM iothub
このクエリは、各Device to Cloud(D2C)JSONメッセージ(1分あたり1つ)をAzureSQLデータベースのPoolsという名前のテーブルに書き込みます。
このクエリの将来の改善には、アラートを目的としたいくつかの集計関数が含まれる可能性があります(たとえば、平均PoolWaterTempC> 35は、プールが暖かくなりすぎていることを示します)。
AzureSQLデータベース
コストを最小限に抑えるため、またデータベースのパフォーマンス要件が最小限であるため、データベースはS0標準(10 DTU)です。
すべてのD2Cメッセージを格納するために、単一のテーブルを持つ単一のデータベースが作成されました。
スキーマ:
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));
AzureAPIアプリ
APIは、ASP.NET WebAPIを使用して構築されたRESTfulAPIです。
APIクライアントは、HTTPヘッダーで指定されたAPIキーを使用して認証する必要があります。
api-key:{あなたのAPIキー}
APIキーは、 IoTPoolAPI \ Controllers \ PoolControllers.cs で定義されています 。モバイルアプリとウェブアプリは、APIと通信するためにこのAPIキーを使用する必要があります。
REST APIは、次のメソッドをサポートしています。
<図>APIの将来の改善には、Azure API Managementの背後に配置することや、Azure ActiveDirectoryなどの他の認証オプションをAPIに追加することが含まれる可能性があります。
AzureWebアプリ
IoTPoolWebAppには、APIと対話するためのASP.NETWebフォームアプリケーションが含まれています。
<図>モバイルフレンドリーバージョンのウェブアプリもあります。
default.aspx.csを編集し、以下を変更します。
private static string apiKey =""; ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweron"); ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / getlatest ");
Webアプリは、認証のためにAzure Active Directory(AAD)と統合されています。 Webアプリでは、すべてのユーザーがAADを使用して認証する必要があります。
まず、WebアプリをAADテナント(例:tenant_name.onmicrosoft.com)に登録する必要があります。これは、AzurePortalまたはVisualStudioを介して実行できます。登録したら、AzureポータルからクライアントIDをコピーします。
次に、web.configの
モバイルアプリ
モバイルアプリはXamarinフォームを使用して作成されています。 WindowsPhoneとWindows10で実行するようにコンパイルしただけですが、iOSとAndroidでクロスコンパイルする必要があります。
<図>Core.csを編集し、以下を変更します。
string queryString ="http:// azurewebsites.net/api/pool/getlatest
DataService.csを編集し、以下を変更します。
private static string apiKey ="";
PoolPage.xaml.csを編集し、以下を変更します:
private static string apiKey =""; ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http:// .azurewebsites.net / api / pool / poweron");
Power BI
Power BI(無料版)を使用して、IoTプールデータを表示するリアルタイムダッシュボードを作成および公開しました。
<図>このプロセスには、Power BI Desktopのダウンロード、Azure SQL DBへの接続(DirectQueryを使用)、ビジュアルを使用したレポートの作成、および.pbixのPowerBI.comへの公開が含まれていました。次に、レポートをダッシュボードに固定しました。
将来的には、Power BI Embeddedを使用して、ダッシュボードをWebアプリに直接埋め込む可能性があります。
今のところ、Powerbi.comまたは無料のPowerBIモバイルアプリからダッシュボードを表示できます。
参照
このソリューションの構築に使用したリソースのリストは次のとおりです。
- https://developer.microsoft.com/en-us/windows/iot/win10/samples/blinky
- https://create.arduino.cc/projecthub/mmackes/pool-controller-8dfa69?ref=tag&ref_id=relays&offset=0
- https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-getstarted/
- https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-c2d/
- https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-rest-service-aspnet-api-sql-database/
- https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started/
- https://msdn.microsoft.com/en-us/library/hh975357.aspx
- https://www.arduino.cc/en/Guide/Windows
- http://playground.arduino.cc/Learning/OneWire
- http://milesburton.com/Dallas_Temperature_Control_Library
- https://learn.sparkfun.com/tutorials/i2c
Dallas ControlsLibraryのMilesBurtonとArduino / I2C / DS18B20サンプルコードのMikeMackes、およびこのプロジェクトの全体的なインスピレーションに特に感謝します。
コード
- デバイスからクラウド(D2C)メッセージ用のJSONメッセージペイロード形式
- SQLデータベースの「プール」テーブルスキーマ
デバイスからクラウド(D2C)メッセージ用のJSONメッセージペイロード形式 JSON
注:「IsPoolPowerOn」-0は電源がオフであることを示します。 1は電源オンを示します{"PoolName": "IoTPool"、 "PoolWaterTempC":30、 "OutsideAirTempC":27、 "IsPoolPowerOn":false、 "SampleDateTime": "2016-07-05T23:35:58.0882185Z" }
SQLデータベースの「プール」テーブルスキーマ SQL
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プールGitHubリポジトリ
すべてのソースコードhttps://github.com/khilscher/iotpool 回路図
2つのDS18B20センサーを接続するI2Cを介したRaspberryPiからArduinoへ製造プロセス