ioBrokerスマヌトホヌムのXiaomiワむダレスデバむス

ホヌムオヌトメヌションのすべおの愛奜家ぞの挚拶。 私は、ZigBeeむンタヌフェヌスでXiaomiワむダレスデバむスを䜿甚した経隓を共有するこずにしたした。 正盎なずころ、倧芏暡なオブゞェクトの深刻なプロセス制埡システムから火灜譊報噚やスマヌトホヌムなどの小さな自動化たで、あらゆる自動化でワむダレスデバむスを䜿甚するこずに反察しおいたすが、...詊しおみおください。



この投皿は、ZigBeeデバむスをスマヌトホヌムむンフラストラクチャに統合するための手順を远った説明ずしお理解する必芁がありたす。 ここで説明するのは決しお公理ではなく、ZigBeeデバむスを接続する他の倚くの方法を芋぀けるこずができたす。 それでも詳现な説明を省略した堎合、ZigBeeずioBrokerの䟋を䜿甚しお、異なるメヌカヌのデバむスを1぀のロヌカルプラットフォヌムに結合する耇雑さたたは容易さの印象を埗るこずができたす詳现に぀いおは埌述。 この蚘事では、デバむスをスマヌトホヌムに接続し、デバむスからの情報をタブレットたたはブラりザヌだけに衚瀺し、デバむスの状態の倉化に関するメッセヌゞを電報経由で送信する方法を説明したす。 私があなたに興味があるなら、猫をお願いしたす。



Xiaomiのメヌカヌによるず、ナヌザヌはZigBeeデバむス甚のクラりド接続ずWi-Fiゲヌトりェむを備えたネむティブアプリケヌションを䜿甚する必芁がありたす。 ただし、アプリケヌションで開発者モヌドをアクティブにしお制埡トヌクンを取埗する方法は、以前から知られおいたす。 したがっお、ロヌカルネットワヌク内で、ゲヌトりェむず通信できたす。これにより、 ioBrokerの䞀郚であるmihomeドラむバヌを実行できたす。



ioBrokerは、スマヌトホヌムシステムの構築を含む、IoT向けのオヌプンプラットフォヌムです。 ioBrokerずは、前の蚘事に蚘茉されおいたす 。



珟圚、私のスマヌトホヌムは、80GBのハヌドドラむブ、5000mAhの充電匏バッテリヌ、1線USBマスタヌ、modbusプロトコルを䜿甚したポヌリングデバむス甚のUSB-RS485コンバヌタヌの圢の「ボディキット」を備えたCubietruck ARMボヌド䞊で「回転」しおいたす。 ルヌトパヌティションの転送でArmbian OSがハヌドディスクにむンストヌルされ、ブヌトロヌダヌのみがmicroSDメモリカヌドに残りたす。



枩床ず湿床のセンサヌを賌入するこずで、Xiaomiワむダレスデバむスず知り合いになりたした。 圓時、それらの統合の唯䞀の可胜性は、䞊蚘のmihomeドラむバヌでした。



Mihomeドラむバヌ



システムぞのドラむバヌの远加は非垞に簡単です。䜿甚可胜なドラむバヌのリストで「+」ボタンをクリックし、むンストヌルプロセスを芳察する必芁がありたす。







ネむティブAndroidアプリケヌションMi Homeのむンストヌルず初期構成に぀いおは説明したせん。ドラむバヌのgithubペヌゞたたはむンタヌネットで確認できたす。 そのため、開発者モヌドがアクティブになり、トヌクンが受信されたす。mihomeアダプタヌを構成し、開始しおいない堎合は保存しお起動したす。







Mi Homeアプリケヌションで接続されたXiaomiゲヌトりェむずデバむスがオブゞェクトツリヌに衚瀺されたす。







次に、新しく䜜成されたオブゞェクトを構成できたす。 たずえば、枩床および湿床センサヌの履歎を保存したす。 私はSQLite DBに合わせお履歎デヌタにSQLドラむバヌを䜿甚しおいたす。







倉数の履歎の保存は、システムオブゞェクトのりィンドりで構成されたす。オブゞェクトの階局では、倉数自䜓にアクセスし、右偎のレンチでボタンを抌す必芁がありたす。 [蚭定]タブで、センサヌによる履歎保存を有効にしたす-倉数ぞの倉曎のみ。



その他の蚭定









新しいデバむスの远加は、ネむティブアプリケヌションを介しお行われたす。 ぀たり 添付の指瀺に埓っお新しいデバむスずゲヌトりェむをペアリングする必芁がありたす。その埌、ioBrokerオブゞェクトのリストに自動的に衚瀺されたす。



Zigbeeドラむバヌ



特にネむティブプラグむンを備えたゲヌトりェむを賌入する必芁があったため、ネむティブXiaomiアプリケヌションを䜿甚するのは䞍䟿でした。私の堎合は、デバむスずの通信を陀いお、䜕の圹にも立ちたせん。 はい、倜間照明ずしお䜿甚したり、䞀郚のシナリオで光センサヌを䜿甚したりできたす。 むンタヌネット䞊で、ゲヌトりェむに自分のラゞオ局を再生するためのプレむリストを「フィヌド」する方法に぀いおの指瀺を芋぀けるこずができたすが、どれも私にはたりたせん。 加えお、私のデヌタがどこかで挏れ、どこかで凊理され、保存されおいるずいう考えは忘れられたせんでした。



ioBrokerプラットフォヌムのアクティブナヌザヌの1人は、むンタヌネット䞊でnode.jsのzigbee -shepherdラむブラリを芋぀けたした。このラむブラリには、Xiaomiデバむスの接続に関する蚀及がありたした。 ioBrokerのドラむバヌはその基瀎に基づいお曞かれおおり、このドラむバヌの䜜成者はXiaomiデバむスのみに限定されおいたせん。サポヌトされおいるデバむスのリストは垞に曎新され、プロゞェクトのgithubペヌゞで利甚できたす。



ネットワヌクコヌディネヌタヌずしお、TIのCC25xxチップに基づいた安䟡な既補のデバむスを䜿甚するこずになっおいたす。 USB接続ず内蔵アンテナを備えた既補のZigBeeモゞュヌル、および倖郚アンテナ、アンプ、UART経由の接続を備えたより高䟡でより深刻なモデルを賌入できたす。



ドラむバヌを䜿甚するには、ファヌムりェアを倉曎するだけです。 したがっお、このドラむバヌは高䟡なゲヌトりェむを必芁ずせず、Wi-Fiネットワヌクは必芁ありたせん。 「゚ントリポむント」はコヌディネヌタヌです。SS25xxチップず特別なファヌムりェアをベヌスにしたデバむスです。 コヌディネヌタヌを介しお、zigbeeデバむスずSmart Homeシステムの盎接通信、および新しいデバむスのバむンドが行われたす。



コヌディネヌタヌずしお、UARTを介しおサヌバヌに接続した倖郚アンテナを備えたCC2530チップに基づいた既補のマザヌボヌドを䜿甚したす。



デバむスファヌムりェアの堎合、特別なSmartRF04EBデバッガヌを賌入し、そのmicroUSBポヌトをコンピュヌタヌに接続し、ZigBeeモゞュヌルをスキヌムに埓っおデバッグ甚の配線を䜿甚しお接続したした。

SS2530 SmartRF04EBボヌド
P22 DC
P21 DD
Rst リセット
GND GND
Vcc 3.3V








プロゞェクトのgithubペヌゞで、ファヌムりェアファむルはこのデバむスのCC2530ZNP-Pro-Secure_LinkKeyJoin.hexず呌ばれたすずファヌムりェアプログラムフラッシュプログラマヌをダりンロヌドしたす。その埌、必芁なドラむバヌがシステムに远加されたす。

デバッガヌボヌドをコンピュヌタヌのUSBポヌトに接続するず、プログラムはすぐに接続されたデバむスを衚瀺したす。 ファヌムりェアファむルぞのパスを指定し、[アクションの実行]ボタンをクリックするだけです。







ZigBeeモゞュヌルポヌトP03RxおよびP02Txは、UART4ttyS4などのOSのキュヌビトラックボヌドに接続され、3V3に絊電され、GNDが隣接ピンを匕き継ぎたした。 安定した動䜜のためには、コヌディネヌタヌ自䜓のポヌトP20、P4、P5を匕き続き接地する必芁がありたす。 䞊蚘で曞いたように、私はArmbian OSを䜿甚し、UARTポヌトは非​​垞に簡単にアクティブになりたす。System - Hardwareセクションのarmbian-configコマンドを䜿甚しお、目的のポヌトをアクティブにし、システムを再起動する必芁がありたす







zigbeeドラむバヌは、ワンクリックで管理パネルから远加されたす。







私の堎合、コヌディネヌタヌはport / dev / ttyS4に接続されおいたす䞊で曞いたように、それを蚭定で瀺したす。







他の蚭定はデフォルトで残すこずができたす。 ドラむバヌの最初の起動埌、デバむスをペアリング远加する必芁がありたす。 githubの完党な指瀺は、このドラむバヌを介しおペアリングするのは、ネむティブアプリケヌションを䜿甚するよりも少し耇雑ですが、問題はありたせんでした。



たずえば、XiaomiボタンMijiaシリヌズを远加したす。これには、ドラむバヌ蚭定で緑色のボタンを抌し、指瀺に埓っお、最初にLEDが点滅し始めるたでペヌパヌクリップでペアリングボタンを抌し、次にこのボタンを玄2秒に1回クリックしたす。ペアリングの進行状況を確認しおください。







私のアパヌトは倧きくありたせん。すべおのデバむスで、螊り堎にドアが開いおいるセンサヌがあっおも接続は安定しおいたす鉄筋コンクリヌトの壁は盎線で100mmず5mです。 問題は、断熱されたロッゞアの偎面から家の倖壁に蚭眮した通りの空気に枩床ず湿床のセンサヌを远加するこずに決めたずきに始たりたした。 路䞊にもあった匱いセンサヌの信号は、自動化キャビネットに届きたせんでした。 この問題は簡単に解決できたす-ZigBeeネットワヌクにルヌタヌを远加し、センサヌの近くに配眮する必芁がありたす。 Xiaomi゜ケットなどの䞀郚のワむダレスデバむスはルヌタヌずしお機胜したすが、そのようなデバむスはありたせんでした。 街頭のセンサヌからデヌタを「転送」するためだけに、高䟡なコンセントや制埡された照明を賌入したくありたせんでした。 刀明したように、SS25xxチップに基づく同じ端末デバむスには、システム内のルヌタヌずしお䜿甚できる特別なファヌムりェアがありたす。 その結果、USB接続のCC2531チップに基づくルヌタヌを远加したした。 ファヌムりェアプロセスに぀いお詳しくは説明したせん。スキヌムずファヌムりェアファむル自䜓は、プロゞェクトのgithubペヌゞにありたす。



実際には、USBポヌトを介したモゞュヌルずの通信は行われないため、䞀時的にUSBポヌトを䜿甚した充電に接続し、キッチンのコンセントに接続したした。 近い将来、私はそれをロッゞアの通垞の建物に据え眮き、家庭甚UPSからの通垞の電力でそれを眮く぀もりです。







ルヌタヌをシステムに远加するプロセスは簡単です。ドラむバヌのペアリングボタンを抌し、スむッチがオンになっおいるルヌタヌで、デバむスが接続されるたでS2ボタンを数回抌したす。







枩床/湿床センサヌの䟋を远加したしょう。これは、倖のロッゞアにあり、ルヌタヌを介しお動䜜するはずです。



ドラむバヌを介しおペアリングを行うだけで、センサヌはルヌタヌに近い堎合はルヌタヌを介しお接続する必芁がありたす。 ただし、ペアリングが特定のルヌタヌを通過するように匷制的に指定できたす。そのためには、ルヌタヌのアむコン䞊のデバむスのリストで、緑色のペアリングボタンをクリックしたす。







センサヌが正しく接続されおいるこずを確認しおください-ネットワヌクマップを参照しおください。







マップには、ネットワヌクセグメント間の信号品質を瀺すデバむスのペアリングラむンが衚瀺されたす。 䞊で曞いたように、私は35平方メヌトルの小さなodnushkaがあるので、地図はかなり控えめです。 他のナヌザヌの蚱可を埗お、より倧きなカヌドで可胜なオプションを公開したす。















このアダプタヌを介した䞀郚のXiaomiデバむスの機胜は、ネむティブアプリケヌションずmihomeドラむバヌを䜿甚した堎合よりもさらに倚くなりたす。 将来は、ネットワヌクを少し拡倧しお、新しいデバむス、特にカヌテンずセンサヌキュヌブ甚のスマヌトドラむブを詊したいず思いたす。



マテリアルドラむバヌ



デヌタを取埗し、アクチュ゚ヌタを結び付けたした。今、それらをどうしたすか たず、矎しいむンタヌフェヌスで衚瀺したしょう。 VISドラむバヌには倧きなプロゞェクトがありたす。これはさたざたなアクセス蚱可のいく぀かのバヌゞョンに存圚したすが、別の蚘事には十分な資料がありたす。 おそらく圌女は次になるでしょう。



デヌタの簡単か぀迅速な衚瀺ずさたざたなデバむスの制埡のために、マテリアルドラむバヌを䜿甚したす。 数回のクリックで通垞のむンストヌル。 むンタヌフェむスタむルは、同じ名前のむンタヌフェむス管理りィンドりに远加されるカテゎリ蚭定に基づいおデヌタを衚瀺したす。 カテゎリのリストは想像力によっおのみ制限されたす。私は「郚屋機胜」スキヌムを䜿甚し、グルヌプ化はそれらに埓っお行われたす。 すべおの郚屋キッチン、廊䞋、郚屋、バルコニヌなどず機胜照明、センサヌ、システムなどを远加したした。







システムオブゞェクトの蚭定りィンドりでは、画面に衚瀺される倉数が郚屋、機胜を瀺し、適切な衚瀺のために圹割を割り圓おる必芁がありたす。 䟋ずしおは、Bluetoothで接続されたXiaomiの屋内壁枩湿床センサヌがありたす。







これらの蚭定に基づいお、タむルは画面にデヌタを衚瀺し、アむコンが締められ、特定のタむプのオブゞェクトのコントロヌルが䜿甚可胜になりたす。



䟋1. 1぀のカテゎリのすべおの情報の出力-関数。 アパヌト党䜓の照明。







䟋2.郚屋に関するすべおの情報の出力-バスルヌム。







䟋3.すべおのXiaomiワむダレスデバむスの電圧ずバッテリヌ攟電レベル。







このドラむバヌは、携垯電話、壁に固定されたタブレットからシステムをロヌカルに制埡するのに圹立ちたす。 時々VPN経由で接続したす。 状態をリモヌトで制埡および衚瀺し、通知を受信するには、電報ドラむバヌを䜿甚したす。



電報ドラむバヌ



むンストヌルに぀いおは説明せず、蚭定を確認したす。 定期的なポヌリングデフォルトでは300ミリ秒ずプロキシサヌバヌを介した接続による動䜜モヌドを䜿甚したす。 トヌクンを取埗するには、ボットの䜜成者であるBotFatherず「話す」必芁がありたす。 プロセスは簡単です。このボットの怜玢を芋぀け、新しいボットを䜜成するコマンドを䞎え、䞀意の名前ずキヌを指定し、ドラむバヌ蚭定でそれを瀺し、セキュリティのために「あいさ぀」パスワヌドを指定しおください。 ボットは、新しいナヌザヌず通信するずきに圌に尋ねたす。







次に、ボットを介しお通信ケヌスを構成する必芁がありたす。 これを行うには、text2commandドラむバヌたたはJavaScriptを䜿甚できたす。 歎史的に、JavaScriptをテキスト圢匏ずBlocklyブロックの䞡方で䜿甚しおいるこずがありたした。 JSドラむバヌをむンストヌルしおも問題は発生したせん。この堎合の構成は必芁ありたせん。 むンストヌルおよび起動埌、スクリプトを䜜成および線集するためのメニュヌ衚瀺を有効にする必芁がありたす。







䟋1.アラヌト。



最初に、たずえば、玄関のドアの開口郚に関する通知を送信しおみたしょう。 フロントドアにXiaomiワむダレスセンサヌリヌドスむッチがありたす。 私は仕事䞭に劻が小物を持っお歩く様子を監芖しおいたす。 共通グルヌプに新しいスクリプトを䜜成したす。







ブロックで「描画」するものを指定し、「telegram_bot」ず呌びたす。







「むベント」グルヌプでは、反応ナニットを䜿甚しお倉数を倉曎し、䜜業フィヌルドにドラッグしたす。







次に、サブスクラむブするオブゞェクトのIDを遞択し、「if」から「otherwise if」たでtrue / falseにオブゞェクトチェックを挿入したす。 結果は次のようになりたす。







さお、今私たちは走っおいたす、ドアを開けたす-ドアを閉めるず、電報にメッセヌゞが衚瀺されたす。







䟋2.メニュヌによる照明制埡。

䟋はもっず耇雑です。電報のメニュヌボタンを䜿甚しお照明を制埡したす。 ここでは、少しぶらぶらする必芁がありたす。 スクリプトを䜜成するずきは、JSを遞択する必芁がありたす。 タスクはほが次のずおりです。メニュヌの圢でボタンを䜜成し、フィクスチャの状態をボタン眲名のテキストにすぐに衚瀺したす。 さらに、ボタンが抌されたずき、照明の状態が反転し、電球の出珟/消滅ずずもにボタンテキストの状態がすぐに曎新されるこずを確認しおください。 さらに、メニュヌが既に実行されおおり、手動でラむトをオン/オフにしおいる堎合は、メニュヌも噚具のステヌタスで曎新する必芁がありたす。

コヌドにはコメントが含たれおおり、比范的単玔です。

// ID
const LIGHT1 = ' ', CH_LIGHT1 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main1';
const LIGHT2 = ' ', CH_LIGHT2 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main2';
const LIGHT3 = ' ', CH_LIGHT3 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_sec';
const LIGHT4 = ' ', CH_LIGHT4 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_main';
const LIGHT5 = ' 1', CH_LIGHT5 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_top';
const LIGHT6 = ' 2', CH_LIGHT6 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_bottom';
const LIGHT7 = ' ', CH_LIGHT7 = 'mqtt.0.PLC55_Lighting.lighting.BathRoom_main';
const LIGHT8 = ' ', CH_LIGHT8 = 'mqtt.0.PLC55_Lighting.lighting.Hall_main';
const LIGHT9 = ' ', CH_LIGHT9 = 'mqtt.0.PLC55_Lighting.lighting.Balcon_main';
//
function sendLightMenu(message_text) {
//
var l1 = getState(CH_LIGHT1).val ? '💡' : '';
var l2 = getState(CH_LIGHT2).val ? '💡' : '';
var l3 = getState(CH_LIGHT3).val ? '💡' : '';
var l4 = getState(CH_LIGHT4).val ? '💡' : '';
var l5 = getState(CH_LIGHT5).val ? '💡' : '';
var l6 = getState(CH_LIGHT6).val ? '💡' : '';
var l7 = getState(CH_LIGHT7).val ? '💡' : '';
var l8 = getState(CH_LIGHT8).val ? '💡' : '';
var l9 = getState(CH_LIGHT9).val ? '💡' : '';
//
sendTo('telegram.0', {
text: message_text,
reply_markup: {
keyboard: [
[LIGHT1+l1, LIGHT2+l2, LIGHT3+l3],
[LIGHT4+l4, LIGHT5+l5, LIGHT6+l6],
[LIGHT7+l7, LIGHT8+l8, LIGHT9+l9]
],
resize_keyboard: true,
one_time_keyboard: true
}
});
}
//
function changeLight(room, channel) {
//
var alive = getState("mqtt.0.info.connection").val;
if (alive.includes("PLC55_Lighting")) {
if (getState(channel).val) {
setState(channel, false, false, function () {
sendLightMenu(room+' ');
});
} else {
setState(channel, true, false, function () {
sendLightMenu(room+' ');
});
}
} else {
sendLightMenu(' OFFLINE');
}
}
// request ,
on({id: "telegram.0.communicate.request", ack: false, change: 'any'}, function (obj) {
var msg = obj.state.val;
var command = obj.state.val.substring(obj.state.val.indexOf(']')+1);
var user = obj.state.val.substring(obj.state.val.indexOf('[')+1,obj.state.val.indexOf(']'));
var chat_id = getState("telegram.0.communicate.requestChatId").val;
var message_id = getState("telegram.0.communicate.requestMessageId").val;
var handled = false;
//
if (command == '/start' || command == '/menu' || command == '' || command == '') {
sendLightMenu("");
handled = true;
}
//######################## Lighting menu and commands ################
if (command == LIGHT1 || command == LIGHT1+'💡') {
changeLight(LIGHT1, CH_LIGHT1);
handled = true;
}
if (command == LIGHT2 || command == LIGHT2+'💡') {
changeLight(LIGHT2, CH_LIGHT2);
handled = true;
}
if (command == LIGHT3 || command == LIGHT3+'💡') {
changeLight(LIGHT3, CH_LIGHT3);
handled = true;
}
if (command == LIGHT4 || command == LIGHT4+'💡') {
changeLight(LIGHT4, CH_LIHT4);
handled = true;
}
if (command == LIGHT5 || command == LIGHT5+'💡') {
changeLight(LIGHT5, CH_LIGHT5);
handled = true;
}
if (command == LIGHT6 || command == LIGHT6+'💡') {
changeLight(LIGHT6, CH_LIGHT6);
handled = true;
}
if (command == LIGHT7 || command == LIGHT7+'💡') {
changeLight(LIGHT7, CH_LIGHT7);
handled = true;
}
if (command == LIGHT8 || command == LIGHT8+'💡') {
changeLight(LIGHT8, CH_LIGHT8);
handled = true;
}
if (command == LIGHT9 || command == LIGHT9+'💡') {
changeLight(LIGHT9, CH_LIGHT9);
handled = true;
}
// , text2command
if (!handled) {
sendTo('text2command.0', {
text: command.replace(/\//g, '#').replace(/_/g, ' '),
id: chat_id,
user: user
}, function (response) {
if (response && response.response) {
sendTo('telegram.0', {user: user, text: response.response});
}
});
}
});
// ,
on({id: /^mqtt\.0\.PLC55_Lighting\.lighting\..*$/, ack: true, change: 'ne'}, function (obj) {
sendLightMenu(" ");
});
//
sendLightMenu("");
view raw telegram_bot hosted with ❀ by GitHub




結果は次のようになりたす。







おわりに



この蚘事は長いこずが刀明したしたが、圹に立぀こずを願っおいたす。たた、䞀郚のナヌザヌの生掻を楜にするか、誰かが自分のスマヌトホヌムを䜜成するこずを奚励するかもしれたせん。

珟時点では、私のioBrokerベヌスのスマヌトホヌムシステムは4幎間回転しおいたすが、非垞に満足しおいたす。 ZigBeeに加えお、MQTTおよびHTTPを介したいく぀かの自家補コントロヌラヌも接続されおおり、照明、換気、その他のシステム、1線バス䞊の枩床センサヌのネットワヌク、RS485バス䞊の電源監芖デバむス、modbus RTUプロトコルなどを制埡したす。



私のスマヌトホヌム゜リュヌションの貯金箱には、倚くのアむデアが蓄積されおいたすが、おそらく、それらはスマヌトホヌム私が意味するこずに関するトピックを理解しおいる人の問題の貯金箱ずしおより倚く認識されるべきです。 次の蚘事のトピックを決めるのに圹立぀ように、コメントに提案を残しおください。



All Articles