
fauxmoESP で スマートホームデバイス自作
ずいぶん長いことAmazon Echoを愛用させていただき、esp8266-alexa-wemo-emulator ライブラリで自作のAlexa連携デバイスも使用してきました。
What an IoT!!#AmazonEcho #Alexa #ESP8266 #messy pic.twitter.com/STYYOVFgst
— HomeMadeGarbage (@H0meMadeGarbage) October 5, 2018
ご覧のようにテレビやリビング照明や電気スタンドを声でコントロールして家族みんなで便利に使ってきておりました。
しかし急に機能しなくなったのです。。。alexa-wemo-emulatorライブラリはもう何年も更新されておらず、使用できないとの噂もチラホラ入ってきており遂に来たか。。という感じでございました。
もうすでにAmazon Echoによるテレビや電気のコントロールは生活に浸透しており、無いと成り立たない状況です。
そこで以下の記事を参考にさせていただき、fauxmoESPというライブラリへの移行を実施いたしました。
目次
fauxmoESPライブラリ
今回採用するfauxmoESPはalexa-wemo-emulatorライブラリと同様にWiFi搭載マイコンのESP8266やESP32を疑似的にAlexa対応ホームデバイスにしてくれるライブラリです。本当にありがたいライブラリでございます。感謝
Arduino用ライブラリは以下よりダウンロードできます。
https://bitbucket.org/xoseperez/fauxmoesp/src/master/
ダウンロードしたzipファイルを所定のArduinoライブラリフォルダに展開します。
2019/9/10現在の最新のライブラリバージョンは3.1.0でした。
今回はESP8266を使用しますので以下のライブラリも追加します。
https://github.com/me-no-dev/ESPAsyncTCP
壁スイッチ ON/OFF
まずはリビングの照明をON/OFFするスイッチをfauxmoESPに変更します。
構成
Amazon EchoでデバイスをON/OFFしてサーボモータを動かして壁スイッチを押します。安物のESP8266ボードを使用しています。
部品
- サーボモータ SG90
- WiFi搭載マイコン HiLetgo ESP8266
Arduinoコード
サンプルコード fauxmoESP_Basic.ino を参考にコード作成しました。
ESP8266のArduino用パッケージはESP8266 Community ver. 2.5.2を使用しています。安物ESP8266ボードの設定は以下のとおりです。
デバイス名を”リビング”としAmazon Echoで「リビングつけて」、「リビング消して」と発話してonSetState()コールバックでstateとして状態変化を検出します。
onSetState()コールバックではGPIOピンのHigh/Low設定などの簡単なことしかできないので、ここではstateの変化を変数flagで検出してloop()内でサーボを動かしています。
ちなみに「リビングを30にて」などと数字と共に発話するとonSetState()コールバックのvalueで受信されます。
発話の数字:0~100 [%] → Value:8bit値 0~255 に変換されます。
照明やLEDの調光に使えそうですね。
Alexaアプリ設定
スマホのAlexaアプリで”リビング”デバイスをホームデバイスとして追加します。
- アプリの”デバイス”をクリック
- ⊕をクリック
- “デバイス追加”をクリック
- “その他”をクリック
- “デバイスを検出”をクリック
しばらく待つと
“リビング”がホームデバイスとして検出されます。
動作
fauxmoESPに変更しました。#Alexa #ESP8266 pic.twitter.com/njXwHr5WUk
— HomeMadeGarbage (@H0meMadeGarbage) September 9, 2019
よし!なおった!
おわりに
テレビと電気スタンドも同様にfauxmoESPライブラリに移行しました。
無事にAmazon Echoによる家電制御生活に戻れてよかったです
No Alexa, No life#金魚 pic.twitter.com/8kBgUCjziM
— HomeMadeGarbage (@H0meMadeGarbage) September 10, 2019
テレビ制御コード (2019/10/29 追記)
リクエストありましたのでテレビ制御コードも記載いたします。赤外線コードは我が家のテレビの場合ですので適宜 赤外線解析して差し替えてください。
TV電源ON/OFF、音量大小、各チャンネル、入力切替、地デジ、BSなどをコントロールできるようにしました。
esp8266-alexa-wemo-emulator の時と同様に音量大小、各チャンネル、入力切替、地デジ、BSの制御にはAlexaアプリの定型アクションを使用しております。
コード修正 (2021/6/24 追記)
2021/6/20ころからリビングのスイッチをON/OFFするデバイスが動かなくなった。
コード修正で解決。
念のためFauxmoESPのバージョンも更新しておいた (3.1.0 -> 3.4.0)。
どうやら fauxmoESPでIDに日本語つかうと
Alexaが認識できなくなったっぽいIDを英語でつけなおして
定型文で日本語にして解決— HomeMadeGarbage (@H0meMadeGarbage) June 24, 2021
すみませんメールアドレス忘れたのでもう一度書きます。
fauxmoESPライブラリを用いた、テレビ制御のコードを教えていただくことは可能でしょうか
コメントありがとうございます。
テレビ制御用コード追記しておきました。
ご確認ください。
素早い対応大変ありがとうございます。助かりました。
参考にさせていただきます!!
私もスマートデバイスを作りたく試してみましたがwifiには接続できるのですが、デバイス検索できません原因としては何が考えられますか??
横からすみません。私もそこで詰まっていて探してみたところ
https://bitbucket.org/xoseperez/fauxmoesp/issues/94/cannot-create-more-than-3-devices
ここの通りにやったところつながるようになりました!
ここで一緒に言ってしまって申し訳ないですが、サイト主のお父ちゃん様のおかげでスマートホーム化できました!ありがとうございます!
TVはalexaから送信することができました。ありがとうございます。
現在LEDシーリングライトも上記のコードにIDLEDとして追加し、付けたり消したりしようとしているのですが、プロトコルがUNKNOWNのため、同じようにできません。irsend.sendRawで送信するように設定したのですがうまくできません。よろしければ方法をご教授いただけませんでしょうか?よろしくお願いいたします。
以下のサンプルコードのように、赤外線生データをirsend.sendRawしかないと思うのですが。
https://github.com/crankyoldgit/IRremoteESP8266/blob/master/examples/IRsendDemo/IRsendDemo.ino
ちょっと不明ですね。申し訳ございません。
すみません。少しお聞きしたいことがあります。よろしいでしょうか?私は、fauxmoを用いて、自宅の赤外線で扱える機器全てを登録したIOT化に成功しました。ただ、alexaから機器をつけようとすると、機器の制御は出来るものの、”デバイスを検出できませんでした”とalexaが言います。このような現象はそちらでは起きていますでしょうか?
コメントありがとうございます。
この記事の “Alexaアプリ設定”節に記載している
デバイスの検出作業は実行できてますでしょうか?
こんばんは
我が家のIoT化に大変参考にさせていただきました。
恐縮ですが、2点教えていただけますでしょうか?
1)USBから通電後、一回目の実行時だけサーボの角度が90度になってしまいます。2度目以降は指定した角度です。なお、USBを差し直す度、同様の動作をします。
2)コード内に2つのIDを定義できないでしょうか?ESP一つで、オンとオフのサーボを2つ付けるイメージです。
Arduinoの経験が浅く、ズレた質問でしたらすみません。ご教示の程、お願い致します。。
コメントありがとうございます!
>1)USBから通電後、一回目の実行時だけサーボの角度が90度になってしまいます。
私の場合 起動後に90度になってほしいので
初期角度を
int servoIni = 90;
としています。ここを変えるとよいかと思います。
>2)コード内に2つのIDを定義できないでしょうか?
ここではON( livingOn() 関数)とOFF(livingOff() 関数)で同じサーボを使っていますが
違うサーボを指定しても問題なく動くと思います。
ご返信ありがとうございます。
1)起動後に90度になる件
すでに0度で初期化しておりますが、ダメなようです。。サーボの問題でしょうか・・
2)コード内に2つのIDを定義
ご指摘ありがとうございます。隣のPINを指定したら、無事に動きました。
>すでに0度で初期化しておりますが、ダメなようです。。サーボの問題でしょうか・・
それでは setup() 内で
myservo.attach(D8);
delay(1000);
myservo.write(servoIni);
を追加でいかがでしょうか?
ご確認よろしくお願い致します。
こんばんわ。
この記事を参考に、LEDをオンにする単純なプログラムを作成しました。2か月ほど前までは正常に動作していたのですが、ESP32やその他回路を入れるケースを作りいざ実装と思い、2日ほど前に動作確認した所、使えなくなっていました
Wifiには、正常に接続しているのですが、AlexaがEsp32を検出してくれません。
環境はesp32FauxmoESPver3.1.1とEchodot 3でesp32,Echodot共に同じwifi(24Ghz)に接続しています。
これはAlexaソフトウェアのアップデートが原因とかですかね….?主さんの以前組んだFauxmoを用いたデバイスは今でも正常に動作しておりますか?
何か解決方法や、思い当たる伏があれば教えて頂けませんでしょうか。ご迷惑おかけしますがよろしくお願いいたします。
これが私が書いたコードです。↓
#include
#include
#include “fauxmoESP.h”
fauxmoESP fauxmo;
#define SERIAL_BAUDRATE 115200
#define light 13
#define id “light”
char ssid[] = “BCW720J-3115E-G”;
char password[] = “35cf47a7c7474”;
void wifiSetup() {
// Set WIFI module to STA mode
WiFi.mode(WIFI_STA);
// Connect
Serial.printf(“[WIFI] Connecting to %s “,ssid);
WiFi.begin(ssid, password);
// Wait
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“.”);
delay(100);
}
Serial.println();
// Connected!
Serial.printf(“Wifi[SSID: %s, IP address: %s]につながりました。\n”, WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}
void setup() {
// Init serial port and clean garbage
Serial.begin(SERIAL_BAUDRATE);
// Wifi
wifiSetup();
// LED
pinMode(light, OUTPUT);
digitalWrite(light,HIGH);
//fauxmoESP
fauxmo.createServer(true);
fauxmo.setPort(80);
fauxmo.enable(true);
fauxmo.addDevice(id);
fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
Serial.printf(“[MAIN] Device #%d (%s) state: %s value: %d\n”, device_id, device_name, state ? “ON” : “OFF”, value);
if (strcmp(device_name, id)==0) {
digitalWrite(light, state ? HIGH : LOW);
}
});
}
void loop(){
fauxmo.handle();
static unsigned long last = millis();
if (millis() – last > 5000) {
last = millis();
Serial.printf(“[MAIN] Free heap: %d bytes\n”, ESP.getFreeHeap());
}
}
コードがぐちゃぐちゃになっていたので
#include
#include
#include “fauxmoESP.h”
fauxmoESP fauxmo;
#define SERIAL_BAUDRATE 115200
#define light 13
#define id “light”
char ssid[] = “my ssid”;
char password[] = “my password”;
void wifiSetup() {
// Set WIFI module to STA mode
WiFi.mode(WIFI_STA);
// Connect
Serial.printf(“[WIFI] Connecting to %s “,ssid);
WiFi.begin(ssid, password);
// Wait
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“.”);
delay(100);
}
Serial.println();
// Connected!
Serial.printf(“Wifi[SSID: %s, IP address: %s]につながりました。\n”, WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}
void setup() {
// Init serial port and clean garbage
Serial.begin(SERIAL_BAUDRATE);
// Wifi
wifiSetup();
// LED
pinMode(light, OUTPUT);
digitalWrite(light,HIGH);
//fauxmoESP
fauxmo.createServer(true);
fauxmo.setPort(80);
fauxmo.enable(true);
fauxmo.addDevice(id);
fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) {
Serial.printf(“[MAIN] Device #%d (%s) state: %s value: %d\n”, device_id, device_name, state ? “ON” : “OFF”, value);
if (strcmp(device_name, id)==0) {
digitalWrite(light, state ? HIGH : LOW);
}
});
}
void loop(){
fauxmo.handle();
static unsigned long last = millis();
if (millis() – last > 5000) {
last = millis();
Serial.printf(“[MAIN] Free heap: %d bytes\n”, ESP.getFreeHeap());
}
}