Netatmo ウェザーステーション を IFTTTとPHPで Slack に通知してみた


はじめに

おうちハック Advent Calendar 2015の記事を見て、
素敵すぎる!と興奮した勢いで、
Netatmo ウェザーステーションを買いました。

目標

自分のなかで実現したかったことは、以下です。

  1. 湿度とCO2が規定値を下回ったり超えたりしたときにアラートを受け取りたい。
  2. 毎時の部屋の気温、湿度、CO2を受け取りたい。
  3. どちらも通知はSlack上で受け取りたい。

結論からいうと2つの方法をつかって実現しました。
・IFTTTを使ってSlack投稿
・Netatmo のAPIでデータを取得してSlack投稿

実現方法

1. IFTTTを使ってSlack投稿

湿度とCO2など規定値を下回ったり超えたりしたときの通知は、
IFTTTというサービスを使うと簡単でした。

if -> Netatmo Weather Station
then -> Slack

上記はデフォルトのメッセージで通知してみた結果です。

設定はIFTTTのページに行けば分かると思います。
なんとなーくで設定できました。

2. Netatmo のAPIからデータを取得してSlack投稿

毎時にXXのデータが欲しい!ということは
IFTTTでさくっと出来ないようなので、
・Netatmoで提供されているAPIからデータを取得
・SlackのIncoming WebHooks機能で通知
という方法で実現しました。

準備

(1) Netatmo APIの認証設定をします。

https://dev.netatmo.com/
「Create an application」がそうです。すぐ登録完了できるはず。

(3) Slack のIncoming WebHooksを設定します。

URL
https://チーム名.slack.com/apps/build/custom-integration

このリンクで見つけられなかったら・・・
ここから https://slack.com/apps
たどり着くまでのキーワード
・Build your own
・Custom Integration
・Something just for my team

一からカスタマイズする設定をしてやるんだという心持ちで
ページを見つけて下さい(笑)

ページを見つけられたら後はすぐ登録できます。

実行プログラム

PHPで書きます。楽をしたいので、ライブラリを使いました。

https://github.com/Netatmo/Netatmo-API-PHP
Exampleもついてて素敵。

WsNotification.php

<?php
define("__ROOT__", dirname(__FILE__));

//ライブラリの読み込み
require_once __ROOT__ . "/src/Clients/NAWSApiClient.php";

//Netatmoの接続情報
$scope = NAScopes::SCOPE_READ_STATION;
$config = array(
    "client_id" => "Netatmo APIのClient id",
    "client_secret" => "Netatmo APIのClient secret",
    "username" => "管理ページログインするときのメールアドレス",
    "password" => "管理ページログインするときのパスワード"
);

//WSに接続して情報を取得しメッセージ文を作る
$client = new NAWSApiClient($config);
$data = $client->getData();
$message = "";
foreach ($data["devices"] as $device) {
    //場所・気温・湿度・C02
    $message .= sprintf(
        "%s : %s°C, %s%%, %sppm" . PHP_EOL
        , $device["station_name"]
        , $device["dashboard_data"]["Temperature"]
        , $device["dashboard_data"]["Humidity"]
        , $device["dashboard_data"]["CO2"]
    );

    //屋外モジュールなど
    foreach ($device["modules"] as $module) {
        //モジュール名・気温・湿度
        $message .= sprintf(
            "%s : %s°C, %s%% " . PHP_EOL
            , $module["module_name"]
            , $module["dashboard_data"]["Temperature"]
            , $module["dashboard_data"]["Humidity"]
        );
    }

    //Slackへ通知
    sendMessageAtSlack($message);
}

//Slackで通知
function sendMessageAtSlack($message) {
    $url = "投稿先のURL";
    $json = array(
        "channel" => "#つき投稿したいチャネル名",
        "username" => "投稿者名 なんでもOKっぽい",
        "text" => $message,
        "icon_emoji" => ":four_leaf_clover:"
    );
    //POST値は、payload=json型式のパラメータ
    $data = http_build_query(array("payload" => json_encode($json)), "", "&");

    $header = array(
        "Content-Type: application/x-www-form-urlencoded",
        "Content-Length: " . strlen($data)
    );

    $options = array(
        "http" => array(
            "method" => "POST",
            "header" => implode("\r\n", $header),
            "content" => $data,
        )
    );
    //SlackへPost送信
    file_get_contents($url, FALSE, stream_context_create($options));
}

これをcronで定期実行するだけ。

cron.d/ws
#平日 8~20時の間毎時実行
0 8-20 * * 1-5 root php /usr/local/share/ws/WsNotification.php > /dev/null 2>&1

結果がこちら。

おわりに

このくらいなら本当に簡単!でした。
IFTTTの設定で出来ることだけでもいい感じに運用できると思います。
Netatmo APIからもらえるデータはもっとたくさんあるので、
カスタマイズした試した方はぜひ教えて下さい。

以上です。