LoginSignup
14
11

More than 5 years have passed since last update.

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

Posted at

はじめに

おうちハック 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_.png

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

設定は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

結果がこちら。

ws.png

おわりに

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

以上です。

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11