みなさん、こんにちは。
普段、私はAlexaの音声コマンドをトリガーにして、「AWS Lambda → MQTT → ローカルPythonスクリプト」という流れで自作のスマートホームプログラムを運用しています。
長年、MQTTブローカーとして「beebotte」を愛用してきたのですが、最近ちょっと挙動が不安定になることが増えてきました……。先日も丸一日つながらない事態が発生し、「これはそろそろ潮時かな」ということで、より信頼性の高い EMQX Cloud へ移行することにしました!
実際に移行してみると、いくつか「MQTTの作法」的な部分で勘違いしやすいポイントがあったので、今回はその備忘録を兼ねて移行手順をまとめてみます。
今回のシステム構成
構成はシンプルですが、送信側(Node.js)と受信側(Python)の両方を修正する必要がありました。
- トリガー: Alexa音声コマンド
- 送信側: AWS Lambda (Node.js / REST API)
- ブローカー: EMQX Cloud (Serverlessプラン)
- 受信側: ローカルPCで常駐しているPythonスクリプト (MQTT)
まず最初に知っておきたい!3つの「勘違いポイント」
beebotteに慣れていると、EMQX Cloud(というか標準的なMQTT)の仕様に少し戸惑うかもしれません。
ポイント① – トピックを「作成」するという概念がない
BeeBotteでは、GUIから「Channel」や「Resource」を事前に作成していましたよね。
でも、EMQX(MQTT)の世界では、「publish(送信)したりsubscribe(受信)した瞬間に、そのトピックが存在する」という扱いになります。事前準備はいりません。
- BeeBotteの場合: トピック用の
Channel: user/Resource: topicを登録する
- EMQXの場合: beebotteからの移行ならトピック名はそのまま
user/topicが使える(スラッシュでつなぐだけ!)。事前登録なくコードに直接記載するだけ。
ポイント② – APIキーはMQTT接続には使えない
ここが一番混乱しました。EMQX Cloudには2種類の認証があります。
- REST API用: App ID / App Secret(Lambdaから送信する時に使う)

- MQTT用: Username / Password(Pythonスクリプトで常駐接続する時に使う) 「APIキーがあるからこれで全部いけるでしょ!」と思いきや、使い分けが必要なんです。

ポイント③ – ポート番号が完全に別物
BeeBotteではあまり意識しなかったかもしれませんが、EMQX Cloudでは通信プロトコルごとにポートをしっかり使い分けます。
- REST API(HTTPS):
8443 - MQTT(TLS):
8883
移行の手順
ステップ1 – EMQX Cloudの準備
- デプロイメント作成
EMQX Cloudにサインアップしたら、まずは新規プロジェクトを作成します。
その後、EMQX Brokersの新規デプロイメントをクリックし、「Serverless」プランでデプロイメントを作成しましょう。
作成後に表示される接続先(xxxx.emqxsl.com)を控えておきます。
- 認証情報の設定
- MQTT接続用: メニューからアクセス制御 > 認証 と進み、追加ボタンを押してユーザー名とパスワードを適当に作成します。
- REST API用: デプロイメント概要画面から「新規APIキー」を押して、App ID と App Secret を取得します。
ステップ2 – AWS Lambda(Node.js)の修正
BeeBotteのAPIを叩いていた部分を、EMQX Cloudの /api/v5/publish に書き換えます。ポイントはBasic認証を使う点です。
JavaScript例
// EMQX Cloud設定
const HOSTNAME = '<接続先>';
const APP_ID = '<App ID>';
const APP_SECRET = '<App Secret>';
const TOPIC = 'user/topic'; // スラッシュ区切りで指定
async function requestEmqxCloud(payload) {
const auth = Buffer.from(`${APP_ID}:${APP_SECRET}`).toString('base64');
const body = JSON.stringify({
topic: TOPIC,
qos: 1,
payload: JSON.stringify(payload)
});
const options = {
hostname: HOSTNAME,
port: 8443, // ポートは8443!
path: '/api/v5/publish', // V5 APIのパス
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${auth}`
}
};
// あとは https.request で送信するだけ!(詳細は割愛)
}
ステップ3 – ローカルPythonスクリプトの修正
受信側のPythonスクリプトでは、TLS(暗号化)設定が必須になるのがBeeBotte時代との大きな違いです。
Python例
import paho.mqtt.client as mqtt
import ssl
HOSTNAME = '<接続先>'
PORT = 8883
USERNAME = '<MQTT用ユーザー名>'
PASSWORD = '<MQTT用パスワード>'
TOPIC = 'user/topic'
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected!")
client.subscribe(TOPIC)
# --- クライアントの設定 ---
client = mqtt.Client()
client.username_pw_set(USERNAME, PASSWORD)
# TLS設定(ここが重要!)
client.tls_set(cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2)
# 環境によっては以下が必要な場合もあります
client.tls_insecure_set(True)
client.on_connect = on_connect
client.connect(HOSTNAME, port=PORT)
client.loop_forever()
よくあるトラブル例
- 接続が拒否される(Connection Refused)
- ポート番号を間違えていませんか?MQTTは
8883、REST APIは8443です!
- ポート番号を間違えていませんか?MQTTは
- 401 Unauthorizedが出る
- 認証情報の「あべこべ」をチェック!APIには App ID を、MQTTにはユーザー名を使っていますか?
- TLSエラーでつながらない
- Pythonの
tls_setが正しく設定されているか確認してみてください。
- Pythonの
まとめ
BeeBotteからEMQX Cloudへの移行は、「トピックの考え方」と「認証・ポートの使い分け」さえ押さえれば、比較的スムーズに移行できます。
- トピックは作成不要(スラッシュ区切りで書くだけ)
- API用とMQTT用の2つの認証を使い分ける
- ポート番号(8443 / 8883)を間違えない
これで、今まで以上に安定したスマートホーム環境が手に入りますよ!移行を検討している方の参考になれば幸いです。
本日も最後までお読みいただきありがとうございました。
それでは、よいIoTライフを!



