#!/usr/bin/env python
# coding: utf-8
# オリジナルの作成:2015/11/01
# # 0P-WiFiからIFTTTを使ってみる
# ## IFTTTについて
# Makerが提供するIFTTT(イフトと発音するらしい)サービスを使うと ESP-WROOM-02モジュールからのデータを簡単にサーバに送り、 様々な処理を施すことができます。
#
# 詳しくは、スイッチサイエンスさんの
# [IFTTTにMaker Channelができました](http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/)
# を参照してください。
#
# MakerのIFTTTに登録するとユーザIDにシークレットKEYが割り当てられます。 このKEYとイベントでIFTTTに情報を送ります。
#
# ### iPhoneアプリIF by IFTTT
# iPhoneでMakerのIFTTTで作ったイベントを受け取るには、iPhoneアプリIF by IFTTTをインストールします。 詳しくは以下を参照してください。
#
# - [IF by IFTTT](https://itunes.apple.com/jp/app/if-by-ifttt/id660944635?mt=8)
#
# ### Maker Channel画面
# 登録が終わり、http://ifttt.com/makerに行くと以下の様な画面になります。 Reconnect Channelを押すとKeyが再割り当てされますので、注意しましょう。
#
#
#
# ### トリガーイベントの作成
# 新しくイベントを作るには、Receive a web requestをクリックし、 Receive a web requestの「Create a new Recipe」ボタンを押すとレシピの作成画面に移動します。
#
#
#
# 「this」をクリックし、Search ChannelsでMakerと入力し、 Makerのアイコンを選択します。
#
#
#
# Choose a Trigger画面が表示され、Receive a web requestをクリックします。
#
# 以下の様なComplete Trigger Fields画面になりますので、ここでEvent Name を入力します。ここではLM35と入力しました。
#
#
#
# 以下の画面でthatを選択します。
#
#
#
# Choose Action Channelが表示されるので、iPhoneと入力し、iPhoneのIF Notificationを選択します。
#
#
#
# Choose an Action画面がでるので、Send a notificationをクリックします。
#
# Complete Action Fields画面がでるので、Notificationに出すメッセージを入力します。 以下の様にキーワードを{{ }}で括って入力し、Create Actionボタンを押します。
#
# ```
# 温度センサLM35からイベント{{EventName}}と値{{Value1}}を受け取りました。
# ```
#
#
#
# 以下の最終確認でますので、Create Recipeボタンをクリックします。
#
#
# ## レシピの確認
# MakerのIFTTTで作ったイベントは、普通のHTTPプロトコルで送ることができるので、 ブラウザーからイベントのテストができます。
#
# 先ほど作ったLM35レシピを確認してみましょう。
#
# ここではシークレットキーをSECRET_KEYで説明しますので、適宜置き替えてください。
#
# - イベント名: LM35
# - KEY: SECRET_KEY
#
# ブラウザーから以下の様に入力します。
#
# ```
# http://maker.ifttt.com/trigger/LM35/with/key/SECRET_KEY?value1=21.0
# ```
#
# iPhoneに以下の様なNotificationが表示されます。
#
#
#
#
# ### IFTTTの受け付けるHTTP GET要求
# MakerのIFTTTサーバは、
# Arduino勉強会/0N-WiFiモジュールその1
# で試したようなGET要求だけではエラーになることが分かりました。
#
# 調べたところ、以下の様にHTTPヘッダにHostとAcceptを追加すると上手くいきました。
#
# ```bash
# $ telnet 54.235.148.87 80
# GET /trigger/test/with/key/SECRET_KEY HTTP/1.1
# Host: maker.ifttt.com
# Accept: */*
# ```
#
# ## ArduinoからLM35イベントを送る
# スイッチサイエンスからESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 が届いたので、 これを使って温度センサLM35から取得した温度をIFTTTイベントとして送ってみます。
#
#
#
# ### ピッチ変換モジュールのハンダ付け
# ESP-WROOM-02をピッチ変換モジュールにハンダ付けします。 裏面のジャンパーは、SJ1とSJ2をハンダでショートします。
#
#
#
# ### ブレッドボードの組み立て
# ブレッドボードにESP-WROOM-02とArduino Pro Mini(3.3V)とLM35を以下の様に配置します。 抵抗は10KΩを使いました。
#
#
#
#
# ### スケッチ
# Arduino勉強会/0O-WiFiモジュールその2
# で作ったEspClientのatCipSendを 以下の様に修正し、シリアルもSoftwareシリアルでESP-WROOM-02で接続することに しました。この結果シリアルモニタの出力は文字化けしますが、この方が開発が簡単になります。
#
# ```C++
# int EspClient::atCipSend(char *uri, char *host) {
# sprintf(buf, "GET %s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\n%s", uri, host, CRLF2);
# int len = strlen(buf);
# char tmp[32];
# sprintf(tmp, "AT+CIPSEND=%d%s", len, CRLF);
# // uriを送る
# atCommand(tmp, 1000);
# esp.print(buf);
# // 応答を待つ
# waitForResponse();
# }
# ```
#
# LM35の温度を送るテスト用スケッチは、以下の通りです。
# ```C++
# #include "EspClient.h"
# #include
#
# #define ST_SSID "take-iPhone5s"
# #define ST_PASSWD "jpb67k42hgq5z"
#
# #define SERVER_ADDR "54.235.148.87" // maker.ifttt.comのIPアドレス
# #define SERVER_PORT 80
#
# #define EVENT "LM35"
# #define SECRET_KEY "ここにSECRET_KEYを入れてください"
#
# int sw_pin = 10;
# int sTx_pin = 12;
# int sRx_pin = 11;
# int lm35_pin = A0;
# int lm35_value;
#
# char buf[128];
# EspClient esp(sRx_pin, sTx_pin);
#
# void setup() {
# pinMode(sw_pin, INPUT);
# esp.begin(9600);
# esp.println("ESP8266IF3tTest");
# esp.atCwMode(STATION_MODE);
# esp.atCwJap(ST_SSID, ST_PASSWD);
# }
#
# void loop() {
# if (digitalRead(sw_pin) == LOW) {
# esp.println("SW pressed");
# // チャタリング防止
# delay(500);
# lm35_value = analogRead(lm35_pin); // LM35から値を読み取る
# int temp10 = (int)((lm35_value*3.3)/1023.0*1000); // 温度を0.1度までの整数に変換
# sprintf(buf, "temp=%d.%df", temp10/10, temp10%10);
# esp.println(buf);
# esp.atCipStart(SERVER_ADDR, SERVER_PORT);
# sprintf(buf, "/trigger/%s/with/key/%s?value1=%d.%d", EVENT, SECRET_KEY, temp10/10, temp10%10);
# esp.atCipSend(buf, "maker.ifttt.com");
# }
# }
# ```
#
# ### 動作確認
# 起動後に、ボタンを押してイベントをIFTTTサーバに送ります。 シリアルモニタは以下の様に文字化けしますが、イベントはきちんと送られています。
#
# ```
# ESP8266IF3tTest
# AT+CWMODE=1
#
# OK
# AT+CWJAP="take-iPhone5s","jpb67k42hgq5z"
#
# WIFI DISCONNECT
# WIFDo wait onece
# WIFI GOT IP
#
# OK
# SW pressed
# temp=25.4f
# AT+CIPSTART="TCP","54.235.148.87",80CONNECT
#
# OK
# AT+CIPSEND=112
#
# busy p...
#
# OK
# > GE@½ÑÉ¥½cªz½[½¹©Q]©Íå¥aY©-Ùµ±ý±
# ±ÕÅëªr¢BBEõ(rjõkÑéj
# ɹKÑÑѹ½µ5
# ÁÑéRzRjÔÔ¨HHTÖ,¤¦L&H¬_]Y®Cá
# SEND OK
# ```
#
#
#
# ### スケッチのダウンロード
# スケッチを以下からダウンロードできます。
#
# - [ESPClientスケッチ EspIFTClient.zip](data/EspIFTClient.zip)
# ## 温度を記録する
# つぎにGoogleのスプレッドシートに温度とイベントが発生時刻を記録してみましょう。
#
# ### IFTTTの定義
# 以下の様にActionでspreadsheetに行を追加するRecordLM35イベントを作成します。
#
#
#
# ### ブラウザーでテスト
# 以下のURLをブラウザー入力します。
#
# ```
# http://maker.ifttt.com/trigger/RecordLM35/with/key/<<ここにSECRET_KEYを入れる>>?value1=18.0
# ```
#
# Googleドライブにアクセスすると、IFTTT/Maker/RecordLM35のディレクトリが作られ
# IFTTT_MakerRecordLM35スプレッドシートに以下のような記録が作成されます。
#
#
# In[ ]: