Androidのメモとか

ポキオの日記です。今日も遅延してない。

ESP8266向けのIFTTTライブラリを更新しました:値の送信に対応

晦日ですね。

ESP8266IFTTT

ライブラリを更新しました

github.com

公開中のESP8266IFTTTですが、今回v1.1をリリースしました。今回の更新により、値の送信が可能になりました。

いままでは、

IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY);

こんな感じで、IFTTT Webhooksに対して、Triggerを打つだけの仕様でしたが、これに加えて、

IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY, value1, value2, value3);

こんな感じで、値をIFTTT Webhooksに対して送信できるようにしました。

  • 値は最大3つまで。
  • 値はすべてString。
  • これらの値は、全てIFTTTのレシピ上で使うことができます。

ご査収ください。

Raspberry Pi用の7インチタッチパネルを買ったのでメモ

むしゃくしゃして買ったパティーン。

RASPBERRY PI TOUCH DISPLAY

これ買いました

特に意味はなかったんだけど、Raspberry Pi純正(?)のタッチパネルを購入。ディスプレイがむき出しになるのは嫌だったので、ケースも購入。

以下、メモ

ディスプレイとRaspberry Piとの接続

公式ブログの記事が神がかってるから、これを見れば良いんだけど。

www.raspberrypi.org

Raspberry Pi⇒ディスプレイへの映像の出力方法はフレキシブル基板しかない。ディスプレイ側にもRaspberry Piと同じくらいの大きさの基板があって、それとRaspberry Piフレキシブル基板で繋ぐんだけど、フレキシブル基板を刺す方向が間違うと全く通信されないので注意。

一方でディスプレイの電源のとり方は数パターンあるけど、今回の用にケースに入れてしまうことを考えると、Raspberry PiのGPIOから5Vをディスプレイに供給する方法がスマートそうだった。ジャンパワイヤでRaspberry Pi GPIOの5VとGNDから、ディスプレイ側の5V、GNDにそれぞれ繋ぐ。こうすると、Raspberry Piにシールド(ハット)がつかなくなるかもしれないので注意。特にシールドを使わない人は、これで全く問題ない。

ディスプレイの設定

公式のディスプレイということもあって(?)、電源とフレキシブル基板の接続さえできていれば、Raspberry Piの電源をつければ映像が表示される。ただし上下反転していた。

ディスプレイの上下反転を直すには、/boot/config.txtの内容を書き換える必要がある。viとかnanoとかで、

sudo nano /boot/config.txt

こんな感じで須藤さんで開いてあげて、lcd_rotate=2という文字列を入れて保存。その後、

sudo reboot

で再起動してあげれば、これ以降の起動時は、すべて上下反転されて(=ナチュラルな方向で)出力されます。

rotatelocaleを打ち間違えてて、10分ほど格闘したのはナイショ

ディスプレイの使い勝手

公式のドキュメントによれば、

800 x 480 RGB LCD display
24-bit colour
Industrial quality: 140-degree viewing angle horizontal, 130-degree viewing angle vertical
10-point multi-touch touchscreen
PWM backlight control and power control over I2C interface
Metal-framed back with mounting points for Raspberry Pi display conversion board and Raspberry Pi
Backlight lifetime: 20000 hours
Operating temperature: -20 to +70 degrees centigrade
Storage temperature: -30 to +80 degrees centigrade
Contrast ratio: 500
Average brightness: 250 cd/m2
Viewing angle (degrees):
Top - 50
Bottom - 70
Left - 70
Right - 70

解像度はそれほど高くないし、あまり視野角も広くない。使っていてもそれを非常に感じる。Raspberry Piの設定画面ですら、ダイアログが途中で切れちゃったりするので、使用用途が限定されそう。

というわけで

むしゃくしゃして買ってしまったけど、これから使い方を考えます。RaspbianもStrech(Debian 9)になって、起動が爆速になったように感じられます。なにかGUIを作ってあそぼうかしら。

IBM CloudのWatson IoT Platformを使ってNode-REDとESP8266でPub/Subしてみた

PubったりSubったり。

いままでの話

relativelayout.hatenablog.com

relativelayout.hatenablog.com

今回はMQTT

IBM Cloud上のNode-REDとESP8266をMQTTで双方向通信をしてみようと思います。

www.ibm.com

所謂HTTPな通信に比べて軽量なデータなのでIoTに向いていると言われています。ただ、実際は送受信をする際に、データを送る側(Publisher)と受ける側(Subscriber)の間に仲介をする役目(Broker)が必要になってくるわけですが、このBrokerの機能を無料で提供しているサービスがあまり少なく、ウィークエンドプログラマーには厳しいものがあります。

mosquitto.org

Mosquittoという痒くなりそうな名前のオープンソースなBrokerもあって、これをローカルのマシンに入れれば、同じネットワーク内ではMQTT通信が可能ですが・・・やっぱり、サクッとNATを超えていい感じに通信したい。そこで、IBM CloudのWatson IoT Platformなわけです。

internetofthings.ibmcloud.com

これ、IBM Cloudのライト・アカウントでも無料で使えるんですね・・・(多分200MB/月まで)。IBMは本当に神ですね・・・。ドキュメントも充実しているところも、流石IBMという感じ。IBM様ですね。

developer.ibm.com

ちょうどいい記事があったので、これを参考に実装してみようと思います。

Watson IoT Platformを使ってみる

前置きが長くなりましたが。

IBM Cloud Node-RED MQTT ESP8266

IBM CloudでInternet of Things Platformを有効にします。

IBM Cloud Node-RED MQTT ESP8266

Watson IoT Platformのダッシュボードのメニュー>Devicesから、デバイスの登録をしていきます。最初にDevice Typeを新規登録します。ここでは一旦、MQTTDeviceとしました。

IBM Cloud Node-RED MQTT ESP8266

次にDeviceの新規登録。先程作ったMQTTDeviceDevice Typeとして、新規登録します。Device IDは多分ユニークな値なら良いはず・・・(震え声)テキトーに設定していきます。

セキュリティの設定は甘くしておきます・・・

IBM Cloud Node-RED MQTT ESP8266

Watson IoT Platformのダッシュボードのメニュー>SECURITY>Connection Securityで、接続時に必要とされるセキュアさが設定できるのですが、TLS Optionalにしておきます。これは後々使うESP8266のライブラリのためです・・・。

次にNode−REDをいじります

IBM Cloud Node-RED MQTT ESP8266

今回は、とりあえず動かしてみるくらいのモチベーションなので「ESP8266からMQTTを受け取ったらLog出力」「Node-REDからESP8266にMQTT送信」の2つのフローを作ってみました。Watson IoTのノードはそれぞれこんな感じに設定しました。

IBM Cloud Node-RED MQTT ESP8266

まず、MQTTを受け取る側は、Watson IoT Platformで受け取ったすべてのDevice Eventを受けるようにしておきます。なので、すべてのAllにチェックを入れておきます。

IBM Cloud Node-RED MQTT ESP8266

一方、MQTTを送信する側はこんな感じで設定します。先程設定したDevice IDやらDevice Typeなどを設定していきます。

最後にESP8266の実装

今回は、このライブラリを使ってMQTTしていきます。

github.com

大まかに言うと、以下のことを実装します。

  • Wi-Fi接続
  • Brokerに接続
  • Brokerに対してSubscribe登録
  • MQTT受信した時の挙動を指定
  • Brokerに対してPublishする実装

実際のコードはこんな感じです。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define SSID "xxxxx" // アクセスポイントのSSID
#define PASSWORD "xxxxx" // アクセスポイントのパスワード

#define ORG "xxxxx" // Watson IoT Platformで割り振られているID(My Organization)
#define DEVICE_TYPE "MQTTDevice" // Device Type
#define DEVICE_ID "xxxxx" // Device ID
#define TOKEN "xxxxx" // Deviceを登録した時に発行されるトークン

char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; // Brokerのサーバーはこんな感じに決まる
char subTopic[] = "iot-2/cmd/notify/fmt/json"; // Subscribeするトピックの設定(Node-REDのノードで設定したコマンド名)
char pubTopic[] = "iot-2/evt/request/fmt/json"; // Publishするトピックの設定(Node-REDのノードで設定したイベント名)
char authMethod[] = "use-token-auth"; // トークンを使って認証をしていくというお気持ち表明
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;

WiFiClient wifiClient;
PubSubClient client(wifiClient);

void setup() {
  Serial.begin(115200);
  Serial.println("");

  // 最初にWi-Fi接続
  connectWifi();

  // MQTTクライアントの初期化
  client.setServer(server, 1883);
  client.setCallback(callback);
}

void loop() {
  // MQTTクライアントが未接続だったら・・・
  if (!client.connected()) {
    // 接続して、Subscribe登録して、一発Publishする
    connectMqtt();
    subscribeMqtt();
    publishMqtt();
  }

  client.loop();
}

// Subscribeしてるトピックに対して、なにかMQTTを受け取ったときの挙動を記述(ただLog表示するだけ)
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// Wi-Fi接続
void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
    //    Blink.softly(&pixels, NUMLED, 255, 255, 255);
  }

  Serial.println("connected!");
}

// Brokerに接続
void connectMqtt() {
  if (!!!client.connected()) {
    Serial.print("Reconnecting client to ");
    Serial.println(server);
    while (!!!client.connect(clientId, authMethod, token)) {
      Serial.print(".");
      delay(500);
    }
    Serial.println();
  }
}

// Brokerに対してSubscribe
void subscribeMqtt() {
  Serial.print("subscribe to "); Serial.print(subTopic);
  if (client.subscribe(subTopic)) {
    Serial.println(" OK");
  } else {
    Serial.println(" FAILED");
  }
}

// Brokerに対してPublish
void publishMqtt() {
  Serial.print("publish to "); Serial.print(pubTopic);
  if (client.publish(pubTopic, "{\"d\":\"request\"}")) {
    Serial.println(" OK");
  } else {
    Serial.println(" FAILED");
  }
}

ここで、Watson IoT Platformのセキュリティ設定を変更したのは、このPubSubClientでAPI Keyを使った認証がうまくいかなかったので、トークンだけで認証ができるようにしたかったからです。(ちょっとセキュリティがアレかもしれないですが・・・)

動作させてみます!

ESP8266が起動すると、スグにPublishしてきますが・・・

IBM Cloud Node-RED MQTT ESP8266

Node-RED上のLog出力にもちゃんと表示されていますね。

IBM Cloud Node-RED MQTT ESP8266

また、Node-REDからPublishしてやると、ESP8266のログ出力にも表示されてます。いい感じに双方向通信できてますねー。

いやー、IBMはドキュメントが豊富で助かりますね。というわけで、MQTTをESP8266で触ってみた話でした!

折角なのでRaspberry Pi上のNode-REDを(SSHから)動かしてみた

IBM Cloudもいいけどね!

Node-RED Raspberry Pi

前回は、IBM Cloud上でNode-REDを動かしました

relativelayout.hatenablog.com

@1ft_seabassさんや色んな人に、Raspberry Piでも動くよと言われたので、動かしてみました。たしかに、メニュー上に合ったような気がしたけど、起動したことなかったな。

というわけで、今回はRaspberry Pi上のNode-REDを動かしてみます。

SSHRaspberry Piにアクセスして、Node-REDを動かす

ちょっと前に@masciiさんが言っていた、一切ディスプレイを繋ぐこと無くRaspberry Piをセットアップする方法に感化されて、最近はもっぱらSSHでしかアクセスしなくなってるので、今回もSSHから色々やってみます。

公式サイトを見ると、非常にやさしく書いてありましたが、備忘録のためにメモっておきます。

NodeとNode-REDのアップデート

update-nodejs-and-nodered

びっくりするくらい素直な名前のコマンドを叩くだけでうまいことやってくれます。

Node-REDのスタート

node-red-start

これだけ。

Node-RED Raspberry Pi

もりもりNode-REDが動き出します。表示されるアドレスにアクセスすると、Flow Editorにたどり着きます。

Node-RED Raspberry Pi

ここまでくれば、楽勝ですね。流石Raspberry Pi、NodeにはGPIO関連のものも揃っています。

IBM Cloudライト・アカウントを使ってNode-REDを使ってみたんだけどすごみしかなかった

LISAおかえり!こんにちはポキオです。

不純な動機からIBM Cloudライト・アカウントをつくる

アドベントカレンダーも一段落したので、なにかやりたくて震えてた。

http://special.nikkeibp.co.jp/atclh/ITP/17/ibm1027/special.nikkeibp.co.jp

そういえば最近IBMからビシビシメールが来てたし、IBM Cloudの無料プランがパワーアップしたらしい。で、ページを見てたら、いけあやさんが載ってたってわけ。可愛すぎて、ついIBM Cloudのアカウントを作った。

そうだ、Node-REDやろう

IBM Cloudのアカウントを作ったものの、いきなり色んなAPIやらを使えてもちょっとなにしていいのかわからなかったので、とりあえずNode-REDを始めてみた。

Node-RED

Node-RED日本ユーザ会

Node-RED、なんとなく聞いたことあったし、「あーNODEをつないでポンってやるやつね」くらいの認識しかなかった。でも、いざ触ってみると、かなりポテンシャルを感じるツールだなぁと驚かされた。

とりあえず始める

IBM Cloudのダッシュボード。アカウント作りたてなので、まだリソースがない状態。

IBM Cloud Bluemix Node-RED

Create ResourcesからNode-REDをさがす。

IBM Cloud Bluemix Node-RED

あったあった。無料で使えます。で、もろもろの処理を進めていくと・・・

IBM Cloud Bluemix Node-RED

Ta-dah! あっという間に、クラウド上にNode-REDが動いたサーバーが出来上がり。さっそくアクセスしてみると・・・

IBM Cloud Bluemix Node-RED

Node-REDの設定が始まります!

IBM Cloud Bluemix Node-RED

IDやパスワードを設定すると、Node-REDのトップページに到着。ここまでで10分位。Go to your Node-RED flow editorを押して、Node-REDの世界に飛び込んでいきます。

手始めに、簡単なWebページを作ってみる

flow editorを開くとこんな感じ。

IBM Cloud Bluemix Node-RED

ついに始まった感。Node-REDは色んなトリガーや、アクション、レスポンスなどの処理の小さい塊(Node)を並べて線でつなぐことによってプログラミングできる。

IBM Cloud Bluemix Node-RED

Nodeをならべて、これをこうして、こうじゃ。

IBM Cloud Bluemix Node-RED

つなぐだけ。簡単すぎる。とりあえず手始めに、HTTP-GETされたら、適当なHTMLを作って、それをレスポンスとして返す、簡単なWebページを作ってみる。これ、非常に簡単で、HTTP-GETされたら適当なHTMLを作ってそれをレスポンスとして返すという3つの処理がそれぞれNodeになっていて、それらを線で繋ぐだけ。ポキオでもできる。

ちなみに、HTMLはこんな感じにしました。

<html>
    <body>
            <h1>私がポキオだ!</h1>    
            あなたは{{payload.name}}だ!
    </body>
</html>

雑・・・(笑)とりあえず、URLパラメータを受け取ってHTMLに反映させています。これをデプロイして、name=pokioとすると・・・

IBM Cloud Bluemix Node-RED

私がポキオだ! あなたはpokioだ!

全くもって意味を成さないですが、とりあえずWebページ作成完了。すっげー簡単。

Nodeが充実してて、もう無理、尊い、つらい・・・

なにが良いって、Nodeが兎に角充実してるんですよね。

IBM Cloud Bluemix Node-RED

HTTPなINPUT/OUTPUTはもちろん、SocialなNodeやWatsonなNodeも色々準備されているので夢が広がる。広がりすぎてツラい。

そういうことです。 というわけで、まだまだ初心者ですが、今まで培ったIoTのクソガジェット制作スキルと組み合わせて、何かできないか模索していくことにします。

今年のアドベントカレンダーを一通り書き終えたので休憩

気づけば師走。

pokiiio advent calendar 2017

今年はアドベントカレンダーに参加しました

いままでROMってたんですが、今年は書いてみました。Qiitaは変なことを書くとすぐにマサカリが飛んでくる印象があって、微妙なことは書けないなと思ってたんですが、いままで大したIoT工作をしたことないので、ネタに走った記事を書いてみました。しかも3つ。

qiita.com

qiita.com

qiita.com

相変わらずな京急ネタです。自作ライブラリをフル活用した内容になっております。

嫁や子どもたちが寝てから作業をしていたので、なかなか進捗が芳しくなかったですが、なんとか期日までに間に合いました。

ライブラリ化は楽しい

先述の通り、いままでやってきたことを、一度ライブラリ化してGitHubで公開をしています。

pokiiio.github.io

公開して間もないですが、色んな人に使ってもらえてフィードバックを頂けていて非常に嬉しいですね。クソコードですが、誰かの助けになれれば幸いです。直近の課題としては、

  • IFTTTのライブラリで、valueが渡せていないので渡せるようにしたい
  • NeoPixelのライブラリで、光が流れるような光らせ方ができるようにしたい
  • Google Apps Scriptの便利ライブラリをつくりたい(HTTPリダイレクトの部分も標準の関数だけでやりきりたい)

このあたりをやっていきたいなぁと。

冬休みどうしよう

いろいろやりたいことがたくさんあるんだけど・・・

  • Dash Buttonの面白い使い方
  • Google Homeの活用
  • フロントエンドエンジニアになりたい
  • また基板を作りたい

このあたりをじっくりやりたい。

というお気持ち表明。

自作ライブラリを使ってクリスマスツリーのイルミネーションを作った

パパは頑張った。

arduino adafruit neopixel christmas tree

娘との約束

私「早く寝れたら、クリスマスツリーが光るよ」
娘「わかった」

最近、夜の寝かしつけに苦労している娘との約束。「光るよ」というパワーワードにヤラれたのか、その日は素直に寝てくれたので、父は頑張りました。

というわけで、今回は、以前作ったAdafruit Neopixel向けの制御ライブラリに、クリスマス用の関数を追加して、クリスマスツリーのイルミネーションを作ってみました。

EmotionalBlink

github.com

relativelayout.hatenablog.com

ライブラリはすでに公開済みでしたが、今回以下の関数を追加。

void likeHolidaySeason(Adafruit_NeoPixel *neopixel, int numLed, int durationMsec);

PCに配慮して、ホリデーシーズンという単語を用いました。

任意の数のNeoPixelなLEDが数珠つなぎになったLEDテープに対して、それぞれのLEDをランダムな色で光らせます。色は1秒おきに変わるので、クリスマスのイルミネーションにぜひ使ってみて下さい。

使い方はこんな感じです。

#include <Adafruit_NeoPixel.h>
#include <EmotionalBlink.h>

#define PIN 3
#define NUMLED 30
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800); //おまじない

void setup() {
  pixels.begin();
}

void loop() {
  Blink.likeHolidaySeason(&pixels, NUMLED, 1000);
}

これだけ。Blink.likeHolidaySeason!!!!と叫ぶだけです。

ハードウェアの構成

構成と言うまでもないですが。

arduino adafruit neopixel christmas tree

とりあえす、フルカラーのLEDテープをAmazonで買います。

Arduino用ではないですが、どう見てもNeoPixelっぽい感じなのでこれを購入。

arduino adafruit neopixel christmas tree

LEDテープの5V、DI、GNDを、それぞれArduinoの5V、D3、GNDにぶっ刺すだけ。簡単でしょ。

いざ、クリスマスツリーにインストール

3COINSで買ってきた、味気ないクリスマスツリーですが、LEDテープを付けてBlink Like Holiday Seasonするだけで、こんな感じに華やかになりました。

arduino adafruit neopixel christmas tree

近くで見ると、「あ、Adafruit・・・」ってなりますが、引きで見ればそれなりにいい感じです。

自作ライブラリでクリスマスツリーを光らせた! #arduino #adafruit #neopixel

A post shared by pokio (@pokiiiiio) on

まだ、娘に光っているところを見せてないので、ちょっとリアクションが楽しみです・・・。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。