How2Homebridge_Mqttthing
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[How2Homebridge]]
** はじめに [#m4bb9e15]
HomeKitのデバイスを、他のコンピュータのコマンドラインから...
Homebridge, Mosquittoを使います。
Raspberry Piの上に、Homebridge, Mosquittoが動いていて、
Appleのホーム.appのにHomebridgeが接続されていて、
パソコン(Mac)の上にMosquittoのクライアント機能がインス...
以下のページを見てください。
[[How2Homebridge]]
[[How2MQTT]]
** MQTT Thingプラグインをインストールする [#h2247cfe]
Homebridgeのコントロールページから、プラグインを選び、検...
#ref(mqttt2.png);
これをインストールします。
インストールが終わると設定画面が出ます。これはいつでも設...
とりあえず、Stateless Programmable Switchを選んでみます。
また、名前をSwitch1とし、MQTTのタイプ名も適当に入れておき...
タイプ名は、mqtttで始まるようにしました。MQTTTプラグイン...
#ref(mqttt3.png);
これで保存して、Homebridgeを再起動します(右上方の電源ス...
再起動後に、アクセサリのタブを見ると、押しボタンスイッチ...
stateless programmable switchは、テレビのリモコンみたいに...
#ref(mqttt5.png);
コンフィグボタンを押すと、Homebridgeの全体の設定が見えま...
#ref(mqttt4.png);
このうち、
"accessories": [
{
"type": "statelessProgrammableSwitch",
"name": "Switch1",
"topics": {
"getOnline": "mqttt/online",
"getSwitch": "mqttt/switch"
},
"accessory": "mqttthing"
}
],
の部分がMQTT Thingの部分です。このプラグインのページに詳...
https://github.com/arachnetech/homebridge-mqttthing#readme
変更したり書き換えたりする場合は、このコンフィグファイル...
テレビのリモコンのように、多数の押しボタンスイッチをまと...
LEDの調光器リモコンのように、on/off/明るさ/色合いなどのス...
これ以外にも多くの特性を持つデバイスが用意されています。
** MQTT Thingで使えるデバイス [#o5b0db87]
ここではstateless programmable switchを使いましたが、他に...
stateless programmable switchは、(HomeKitから見て)入力...
Switchは入出力に対応しています。
設定して、mosquitto_subコマンドでモニターすると動きがわか...
これを使えば、HomeKitからのon/offを受け取ってLEDを光らせ...
** ホーム.appで設定する [#d858e51d]
HomebridgeがHomeKit環境に登録してあれば、ここで定義したSw...
#ref(mqttt6.png);
このアイコンを右クリックして、「設定」を選ぶと動作をして...
#ref(mqttt7.png);
1回押し、2回押し(ダブルクリック)、長押しの選択がありま...
#ref(mqttt8.png);
** MQTTへの出版で電球をonにする [#w8a7e69d]
今までの設定で、
- MQTTサーバのアドレスは192.168.0.134
- Switch1のトピックは mqttt/switch
でした。Switch1には、1回押し、2回押し(ダブルクリック)、...
これは設定ファイルで変更することも可能ですが、1,2,Lがデフ...
なので、MQTTの出版をすれば、IKEAの電球をonにできます。パ...
% mosquitto_pub -h 192.168.0.134 -t mqttt/switch -m 1
とすれば良いです。他のターミナルのウィンドウから、
% mosquitto_sub -h 192.168.0.134 -t # -v
として、メッセージをモニターしておくとデバッグに役立ちま...
** 電球をon/offとトグルする [#q51cebb9]
電球をoffにしたい場合は、2回押しや長押しに電球offを割り当...
また、1回押しのたびに反転することもできます。
1回押しに実行されるショートカットを以下のように記述すれば...
#ref(mqttt9.png);
これで、
% mosquitto_pub -h 192.168.0.134 -t mqttt/switch -m 1
とするたびに、電球がon/offします。
** PythonからMQTTブローカにアクセスする [#k0790222]
pahoというライブラリを使いました。
https://www.eclipse.org/paho/index.php?page=clients/pytho...
以下のプログラムでHomeKitで設定された灯を点滅させることが...
#!/Library/Frameworks/Python.framework/Versions/3.9/bin/...
import paho.mqtt.client as mqtt # import MQTT lib.
broker_address="192.168.0.134"
client = mqtt.Client() #create new instance
client.connect(broker_address) #connect to broker
client.publish("mqttt/switch","1") #publish
** ArduinoからMQTTブローカにアクセスする [#i3acb8a3]
同じくArduinoからの例です。
https://github.com/knolleary/pubsubclient
にある、pubsubclientライブラリを使ってます。
上のページにあるサンプルを参考にしたプログラムが以下です。
ここでは、13番に接続したスイッチが押された時に、MQTTに1を...
元のサンプルは、送受信に対応していたので、subscribeの部分...
HomeKitからの指示でArduinoでLEDを点灯させるなどの場合には...
WiFiの設定もしているので、長いですが、多分これで動きます。
#include <WiFi.h>
#include <PubSubClient.h>
//input & output ping
const int PUSHSW=13; //external push switch
//WiFi
const char SSID[] = "siiolab408_2G";
const char PASSWORD[] = "xxxxxxx";
//PubSubClient (MQTT)
const char mqttbroker[] = "192.168.0.134"; //MQTT broker...
const int mqttport=1883; //MQTT port
const char subtopic[] = "mqttthing/sub"; //mqtt topic to...
const char pubtopic[] = "mqttthing/switch"; //mqtt topic...
char clientID[] = "ESP32_xx:xx:xx:xx:xx:xx"; //MAC addre...
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
//購読の結果が返ってきたら呼び出される関数
void callback(char* topic, byte* payload, unsigned int l...
Serial.print("Message arrived [");Serial.print(topic);...
String msg = String((char*) payload);
Serial.println(msg);
//必要ならばこの後に、得られたメッセージに従った処理を書く
//payload[length]='\0'; //メッセージの最後を0にしてC言語...
//String msg = String((char*) payload); //それをStringイ...
//if(msg.compareTo("true")==0) {
// digitalWrite(xxxx, LOW);//メッセージに従った処理を...
// }
}
//connecting MQTT
void connectMQTT() {
mqttClient.setServer(mqttbroker, mqttport);
mqttClient.setCallback(callback);
Serial.println("Attempting MQTT connection. ");
// Loop until we're reconnected
while (! mqttClient.connected() ) {
// Attempt to connect
if (mqttClient.connect(clientID)) {
Serial.println("Connected. ");
// Once connected, publish an announcement...
mqttClient.publish(pubtopic,"Arduino is ready.");
// ... and subscribe
mqttClient.subscribe(subtopic);
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(", try again in 5 seconds. ");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
//connecting WiFi
void connectWiFi() {
WiFi.begin(SSID, PASSWORD);
Serial.print("Attempting WiFi connection. SSID: "); Se...
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.print("\nWiFi connected. Assigned address is: ");
Serial.println(WiFi.localIP());
}
void setup() {
pinMode(PUSHSW, INPUT_PULLUP);
Serial.begin(115200); // ESP standard speed 11...
while (!Serial) ; // wait for serial port ...
String wifiMACString = WiFi.macAddress(); //WiFi MAC a...
wifiMACString.toCharArray(&clientID[6], 18, 0); //"EPS...
Serial.print("\nMQTT clientID: ");Serial.println(clien...
connectWiFi();
connectMQTT();
}
//last state of the PUSHSW
int lastSWstate;
void loop() {
if( WiFi.status() == WL_DISCONNECTED)
connectWiFi();
if (! mqttClient.connected())
connectMQTT();
mqttClient.loop();
int newSWstate=digitalRead(PUSHSW);
if(lastSWstate!=newSWstate) { //update only when SW ch...
if(newSWstate==LOW) mqttClient.publish(pubtopic,"1");
}
lastSWstate=newSWstate;
delay(500);
}
終了行:
[[How2Homebridge]]
** はじめに [#m4bb9e15]
HomeKitのデバイスを、他のコンピュータのコマンドラインから...
Homebridge, Mosquittoを使います。
Raspberry Piの上に、Homebridge, Mosquittoが動いていて、
Appleのホーム.appのにHomebridgeが接続されていて、
パソコン(Mac)の上にMosquittoのクライアント機能がインス...
以下のページを見てください。
[[How2Homebridge]]
[[How2MQTT]]
** MQTT Thingプラグインをインストールする [#h2247cfe]
Homebridgeのコントロールページから、プラグインを選び、検...
#ref(mqttt2.png);
これをインストールします。
インストールが終わると設定画面が出ます。これはいつでも設...
とりあえず、Stateless Programmable Switchを選んでみます。
また、名前をSwitch1とし、MQTTのタイプ名も適当に入れておき...
タイプ名は、mqtttで始まるようにしました。MQTTTプラグイン...
#ref(mqttt3.png);
これで保存して、Homebridgeを再起動します(右上方の電源ス...
再起動後に、アクセサリのタブを見ると、押しボタンスイッチ...
stateless programmable switchは、テレビのリモコンみたいに...
#ref(mqttt5.png);
コンフィグボタンを押すと、Homebridgeの全体の設定が見えま...
#ref(mqttt4.png);
このうち、
"accessories": [
{
"type": "statelessProgrammableSwitch",
"name": "Switch1",
"topics": {
"getOnline": "mqttt/online",
"getSwitch": "mqttt/switch"
},
"accessory": "mqttthing"
}
],
の部分がMQTT Thingの部分です。このプラグインのページに詳...
https://github.com/arachnetech/homebridge-mqttthing#readme
変更したり書き換えたりする場合は、このコンフィグファイル...
テレビのリモコンのように、多数の押しボタンスイッチをまと...
LEDの調光器リモコンのように、on/off/明るさ/色合いなどのス...
これ以外にも多くの特性を持つデバイスが用意されています。
** MQTT Thingで使えるデバイス [#o5b0db87]
ここではstateless programmable switchを使いましたが、他に...
stateless programmable switchは、(HomeKitから見て)入力...
Switchは入出力に対応しています。
設定して、mosquitto_subコマンドでモニターすると動きがわか...
これを使えば、HomeKitからのon/offを受け取ってLEDを光らせ...
** ホーム.appで設定する [#d858e51d]
HomebridgeがHomeKit環境に登録してあれば、ここで定義したSw...
#ref(mqttt6.png);
このアイコンを右クリックして、「設定」を選ぶと動作をして...
#ref(mqttt7.png);
1回押し、2回押し(ダブルクリック)、長押しの選択がありま...
#ref(mqttt8.png);
** MQTTへの出版で電球をonにする [#w8a7e69d]
今までの設定で、
- MQTTサーバのアドレスは192.168.0.134
- Switch1のトピックは mqttt/switch
でした。Switch1には、1回押し、2回押し(ダブルクリック)、...
これは設定ファイルで変更することも可能ですが、1,2,Lがデフ...
なので、MQTTの出版をすれば、IKEAの電球をonにできます。パ...
% mosquitto_pub -h 192.168.0.134 -t mqttt/switch -m 1
とすれば良いです。他のターミナルのウィンドウから、
% mosquitto_sub -h 192.168.0.134 -t # -v
として、メッセージをモニターしておくとデバッグに役立ちま...
** 電球をon/offとトグルする [#q51cebb9]
電球をoffにしたい場合は、2回押しや長押しに電球offを割り当...
また、1回押しのたびに反転することもできます。
1回押しに実行されるショートカットを以下のように記述すれば...
#ref(mqttt9.png);
これで、
% mosquitto_pub -h 192.168.0.134 -t mqttt/switch -m 1
とするたびに、電球がon/offします。
** PythonからMQTTブローカにアクセスする [#k0790222]
pahoというライブラリを使いました。
https://www.eclipse.org/paho/index.php?page=clients/pytho...
以下のプログラムでHomeKitで設定された灯を点滅させることが...
#!/Library/Frameworks/Python.framework/Versions/3.9/bin/...
import paho.mqtt.client as mqtt # import MQTT lib.
broker_address="192.168.0.134"
client = mqtt.Client() #create new instance
client.connect(broker_address) #connect to broker
client.publish("mqttt/switch","1") #publish
** ArduinoからMQTTブローカにアクセスする [#i3acb8a3]
同じくArduinoからの例です。
https://github.com/knolleary/pubsubclient
にある、pubsubclientライブラリを使ってます。
上のページにあるサンプルを参考にしたプログラムが以下です。
ここでは、13番に接続したスイッチが押された時に、MQTTに1を...
元のサンプルは、送受信に対応していたので、subscribeの部分...
HomeKitからの指示でArduinoでLEDを点灯させるなどの場合には...
WiFiの設定もしているので、長いですが、多分これで動きます。
#include <WiFi.h>
#include <PubSubClient.h>
//input & output ping
const int PUSHSW=13; //external push switch
//WiFi
const char SSID[] = "siiolab408_2G";
const char PASSWORD[] = "xxxxxxx";
//PubSubClient (MQTT)
const char mqttbroker[] = "192.168.0.134"; //MQTT broker...
const int mqttport=1883; //MQTT port
const char subtopic[] = "mqttthing/sub"; //mqtt topic to...
const char pubtopic[] = "mqttthing/switch"; //mqtt topic...
char clientID[] = "ESP32_xx:xx:xx:xx:xx:xx"; //MAC addre...
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
//購読の結果が返ってきたら呼び出される関数
void callback(char* topic, byte* payload, unsigned int l...
Serial.print("Message arrived [");Serial.print(topic);...
String msg = String((char*) payload);
Serial.println(msg);
//必要ならばこの後に、得られたメッセージに従った処理を書く
//payload[length]='\0'; //メッセージの最後を0にしてC言語...
//String msg = String((char*) payload); //それをStringイ...
//if(msg.compareTo("true")==0) {
// digitalWrite(xxxx, LOW);//メッセージに従った処理を...
// }
}
//connecting MQTT
void connectMQTT() {
mqttClient.setServer(mqttbroker, mqttport);
mqttClient.setCallback(callback);
Serial.println("Attempting MQTT connection. ");
// Loop until we're reconnected
while (! mqttClient.connected() ) {
// Attempt to connect
if (mqttClient.connect(clientID)) {
Serial.println("Connected. ");
// Once connected, publish an announcement...
mqttClient.publish(pubtopic,"Arduino is ready.");
// ... and subscribe
mqttClient.subscribe(subtopic);
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(", try again in 5 seconds. ");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
//connecting WiFi
void connectWiFi() {
WiFi.begin(SSID, PASSWORD);
Serial.print("Attempting WiFi connection. SSID: "); Se...
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.print("\nWiFi connected. Assigned address is: ");
Serial.println(WiFi.localIP());
}
void setup() {
pinMode(PUSHSW, INPUT_PULLUP);
Serial.begin(115200); // ESP standard speed 11...
while (!Serial) ; // wait for serial port ...
String wifiMACString = WiFi.macAddress(); //WiFi MAC a...
wifiMACString.toCharArray(&clientID[6], 18, 0); //"EPS...
Serial.print("\nMQTT clientID: ");Serial.println(clien...
connectWiFi();
connectMQTT();
}
//last state of the PUSHSW
int lastSWstate;
void loop() {
if( WiFi.status() == WL_DISCONNECTED)
connectWiFi();
if (! mqttClient.connected())
connectMQTT();
mqttClient.loop();
int newSWstate=digitalRead(PUSHSW);
if(lastSWstate!=newSWstate) { //update only when SW ch...
if(newSWstate==LOW) mqttClient.publish(pubtopic,"1");
}
lastSWstate=newSWstate;
delay(500);
}
ページ名: