Home Made Garbage

fauxmoESP で スマートホームデバイス自作

お父ちゃん  2019.9.10 
ホーム
電子工作
Raspberry Pi
IOT
WEB

ずいぶん長いことAmazon Echoを愛用させていただき、esp8266-alexa-wemo-emulator ライブラリで自作のAlexa連携デバイスも使用してきました。

ご覧のようにテレビリビング照明電気スタンドを声でコントロールして家族みんなで便利に使ってきておりました。

しかし急に機能しなくなったのです。。。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ボードを使用しています。

部品

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ライブラリに移行しました。

Amazon Echo と ESP8266 で スマートホーム ―テレビ制御―

Amazon Echo と ESP8266 で スマートホーム ―電気スタンド制御―

 

無事にAmazon Echoによる家電制御生活に戻れてよかったです 🙂 

テレビ制御コード (2019/10/29 追記)

リクエストありましたのでテレビ制御コードも記載いたします。赤外線コードは我が家のテレビの場合ですので適宜 赤外線解析して差し替えてください。

 

TV電源ON/OFF、音量大小、各チャンネル、入力切替、地デジ、BSなどをコントロールできるようにしました。

esp8266-alexa-wemo-emulator の時と同様に音量大小、各チャンネル、入力切替、地デジ、BSの制御にはAlexaアプリの定型アクションを使用しております。

Related Posts

「fauxmoESP で スマートホームデバイス自作」への16件のフィードバック

  1. すみませんメールアドレス忘れたのでもう一度書きます。
    fauxmoESPライブラリを用いた、テレビ制御のコードを教えていただくことは可能でしょうか

    1. コメントありがとうございます。

      テレビ制御用コード追記しておきました。
      ご確認ください。

      1. 素早い対応大変ありがとうございます。助かりました。
        参考にさせていただきます!!

  2. 私もスマートデバイスを作りたく試してみましたがwifiには接続できるのですが、デバイス検索できません原因としては何が考えられますか??

  3. TVはalexaから送信することができました。ありがとうございます。
    現在LEDシーリングライトも上記のコードにIDLEDとして追加し、付けたり消したりしようとしているのですが、プロトコルがUNKNOWNのため、同じようにできません。irsend.sendRawで送信するように設定したのですがうまくできません。よろしければ方法をご教授いただけませんでしょうか?よろしくお願いいたします。

  4. すみません。少しお聞きしたいことがあります。よろしいでしょうか?私は、fauxmoを用いて、自宅の赤外線で扱える機器全てを登録したIOT化に成功しました。ただ、alexaから機器をつけようとすると、機器の制御は出来るものの、”デバイスを検出できませんでした”とalexaが言います。このような現象はそちらでは起きていますでしょうか?

    1. コメントありがとうございます。
      この記事の “Alexaアプリ設定”節に記載している
      デバイスの検出作業は実行できてますでしょうか?

  5. こんばんは
    我が家のIoT化に大変参考にさせていただきました。
    恐縮ですが、2点教えていただけますでしょうか?
    1)USBから通電後、一回目の実行時だけサーボの角度が90度になってしまいます。2度目以降は指定した角度です。なお、USBを差し直す度、同様の動作をします。

    2)コード内に2つのIDを定義できないでしょうか?ESP一つで、オンとオフのサーボを2つ付けるイメージです。

    Arduinoの経験が浅く、ズレた質問でしたらすみません。ご教示の程、お願い致します。。

    1. コメントありがとうございます!

      >1)USBから通電後、一回目の実行時だけサーボの角度が90度になってしまいます。
      私の場合 起動後に90度になってほしいので
      初期角度を
      int servoIni = 90;
      としています。ここを変えるとよいかと思います。

      >2)コード内に2つのIDを定義できないでしょうか?
      ここではON( livingOn() 関数)とOFF(livingOff() 関数)で同じサーボを使っていますが
      違うサーボを指定しても問題なく動くと思います。

  6. ご返信ありがとうございます。
    1)起動後に90度になる件
    すでに0度で初期化しておりますが、ダメなようです。。サーボの問題でしょうか・・

    2)コード内に2つのIDを定義
    ご指摘ありがとうございます。隣のPINを指定したら、無事に動きました。

    1. >すでに0度で初期化しておりますが、ダメなようです。。サーボの問題でしょうか・・

      それでは setup() 内で
      myservo.attach(D8);
      delay(1000);
      myservo.write(servoIni);

      を追加でいかがでしょうか?
      ご確認よろしくお願い致します。

  7. こんばんわ。
    この記事を参考に、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());
    }

    }

  8. コードがぐちゃぐちゃになっていたので
    #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());
    }

    }

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください