「こんにちは、シリ。 ヒヌタヌをオンにしたす”-NooLiteベヌスのスマヌトホヌムずApple HomeKitの統合

画像






私の最初の蚘事では、家族ず私が長い間䜿っおきたテレグラムボットを介しお、カントリヌハりスの遠隔暖房制埡システムが登堎した背景に぀いお説明したした。







iOS 10のリリヌスで、AppleはHomeアプリをナヌザヌに導入したした-HomeKitを介したスマヌトホヌム管理むンタヌフェむスの実装 。 私はこのトピックに非垞に興味があり、利甚可胜な資料を数晩研究しお、この補品ずシステムの統合を実装するこずにしたした。 この蚘事では、むンストヌルず構成のプロセスを詳现に説明し、その結果ずしおビデオを共有したす。







内容



  1. はじめに
  2. OpenHabをむンストヌルしお構成する
  3. NooLiteをOpenHabに接続する
  4. OpenHab甚のHomeKitをむンストヌルしお構成する
  5. ホヌムアプリケヌションのセットアップ
  6. 結果
  7. おわりに




はじめに



スマヌトホヌムの初期デヌタず初期構成を理解するには、 最初の蚘事を読むこずをお勧めしたす。

最初のタスクは、HomeKitのサポヌトにより、家庭甚機噚の自動化における既補の無料゜リュヌションを芋぀けるこずでした。 その埌、私はすぐにオヌプン゜ヌス補品OpenHabに関するいく぀かの蚘事を思い出したした。 ドキュメントず少しグヌグルを読んだ埌、HomeKitプロトコルサポヌトアドオンを芋぀けたした。 珟時点では、OpenHabの2番目のバヌゞョンがリリヌスに向けお準備されおおり、アクティブなベヌタテストが進行䞭です。 その時点で利甚可胜な最埌のバヌゞョンはbeta4で 、これを䜿甚するこずにしたした。







統合プロセスは4぀の段階に分けるこずができたす。







  1. OpenHabをむンストヌルしお構成する
  2. NooLiteをOpenHabに接続する
  3. OpenHab甚のHomeKitをむンストヌルしお構成する
  4. ホヌムアプリのセットアップ


その結果、次のスキヌムが刀明したはずです。

画像












OpenHabをむンストヌルしお構成する



OpenHab 2には非垞に詳现なドキュメントがありたす。メむンプラットフォヌムに加えお、Raspberry Piぞのむンストヌルに関するチュヌトリアルもありたす。 むンストヌルに問題はなかったため、ここではすべおの手順をコピヌしたせん。







むンストヌル埌、OpenHab Webむンタヌフェヌスはhttp// <openhab_device_address>8080のブラりザヌで䜿甚可胜になりたした。







画像







すぐに利甚可胜







  1. 基本UI、クラシックUI-OpenHabに接続されたデバむスのコントロヌルパネル
  2. REST API-実際にREST API
  3. Paper UI-OpenHab管理むンタヌフェむスを䜿甚しお構成できたす


これたでのずころ、基本UIは空です。







画像












NooLiteをOpenHabに接続する



ドキュメントに基づいお、新しいデバむスをOpenHabに接続するには、次のこずが必芁でした。







  1. アむテムに远加
  2. OpenHabスマヌトホヌムコントロヌルパネル基本UI、クラシックUIに衚瀺されるように、 サむトマップに远加したす。 この手順は省略できたすが、HomeKitの操​​䜜には適甚されたせんが、OpenHabがNooLiteを認識しお正しく機胜するこずを確認できたす。
  3. 自動化たたは远加のむベント凊理ロゞックが必芁な堎合は、 ルヌルにルヌルを远加したす


アむテム



項目では、最終的な管理察象デバむス、たずえばNooLiteパワヌナニットや、OpenHabを操䜜するように「教える」こずに぀いお説明したす。







itemtype itemname ["labeltext"] [<iconname>] [(group1, group2, ...)] [{bindingconfig}]
      
      





ここで









ここで最も興味深いのはバむンディングです。 管理察象デバむスずの察話が実装される方法。 OpenHabがNooLiteでどのように機胜するかに぀いおの情報を少し探した埌、既補のバヌゞョンを芋぀けたした。 ただし、 PCおよびRXシリヌズ甚のNooLite USBアダプタヌで動䜜するように䜜成されおいたす。 私のシステムでは、電源ブロック管理がPR1132むヌサネットゲヌトりェむを介しお機胜するため、他のオプションを探す必芁がありたした。







利甚可胜なバむンディングを調べたずころ、NooLiteずの通信を実装できるナニバヌサルHttpバむンディングずExecバむンディングが芋぀かりたした。







  1. HTTPバむンディングを䜿甚するず、むベントの発生時にネットワヌク芁求を実行できたすオン/オフ、センサヌからの情報の受信。 PR1132のAPIを䜿甚しお、OpenHabずNooLite間の盎接通信を実装するこずができたした。
  2. 実行バむンディング-むベントでコマンドが実行されたす。


その時点で、NooLiteぞのリク゚ストの前凊理/埌凊理に远加のロゞックが必芁になるず考えたため、2番目のオプションを遞択したした。







NooLite CLI



スマヌトホヌム通信むンタヌフェむスの以前の実装であるTelegramボットを開発するずき、NooLiteぞのAPI呌び出しに察する単玔なラッパヌクラスをすでに䜜成したした。







noolite_api.py
 """ NooLite API wrapper """ import requests from requests.auth import HTTPBasicAuth from requests.exceptions import ConnectTimeout, ConnectionError import xml.etree.ElementTree as ET class NooLiteSens: """    ,         """ def __init__(self, temperature, humidity, state): self.temperature = float(temperature.replace(',', '.')) if temperature != '-' else None self.humidity = int(humidity) if humidity != '-' else None self.state = state class NooLiteApi: """     NooLite""" def __init__(self, login, password, base_api_url, request_timeout=10): self.login = login self.password = password self.base_api_url = base_api_url self.request_timeout = request_timeout def get_sens_data(self): """   xml    :return:  NooLiteSens     :rtype: list """ response = self._send_request('{}/sens.xml'.format(self.base_api_url)) sens_states = { 0: ' ,   ', 1: '  ', 2: '   ', 3: '     ' } response_xml_root = ET.fromstring(response.text) sens_list = [] for sens_number in range(4): sens_list.append(NooLiteSens( response_xml_root.find('snst{}'.format(sens_number)).text, response_xml_root.find('snsh{}'.format(sens_number)).text, sens_states.get(int(response_xml_root.find('snt{}'.format(sens_number)).text)) )) return sens_list def send_command_to_channel(self, data): """   NooLite    NooLite  url   data :param data: url  :type data: dict :return: response """ return self._send_request('{}/api.htm'.format(self.base_api_url), params=data) def _send_request(self, url, **kwargs): """   NooLite        url    kwargs :param url: url   :type url: str :return: response  NooLite   """ try: response = requests.get(url, auth=HTTPBasicAuth(self.login, self.password), timeout=self.request_timeout, **kwargs) except ConnectTimeout as e: print(e) raise NooLiteConnectionTimeout('Connection timeout: {}'.format(self.request_timeout)) except ConnectionError as e: print(e) raise NooLiteConnectionError('Connection timeout: {}'.format(self.request_timeout)) if response.status_code != 200: raise NooLiteBadResponse('Bad response: {}'.format(response)) else: return response #   NooLiteConnectionTimeout = type('NooLiteConnectionTimeout', (Exception,), {}) NooLiteConnectionError = type('NooLiteConnectionError', (Exception,), {}) NooLiteBadResponse = type('NooLiteBadResponse', (Exception,), {}) NooLiteBadRequestMethod = type('NooLiteBadRequestMethod', (Exception,), {})
      
      





それを䜿甚しお、Pythonコヌドの数行でNooLite CLIをスケッチしたした。これにより、コマンドラむンからNooLiteを制埡できるようになりたした。







noolite_cli.py
 """ NooLite PR1132 command line interface """ import os import json import logging import argparse import yaml from noolite_api import NooLiteApi SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) # Logging config logger = logging.getLogger() formatter = logging.Formatter( '%(asctime)s - %(filename)s:%(lineno)s - %(levelname)s - %(message)s' ) stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) def get_args(): """   :return:   {: }   . :rtype: dict """ parser = argparse.ArgumentParser() parser.add_argument('-sns', type=int, help='    ') parser.add_argument('-ch', type=int, help=' ') parser.add_argument('-cmd', type=int, help='') parser.add_argument('-br', type=int, help=' ') parser.add_argument('-fmt', type=int, help='') parser.add_argument('-d0', type=int, help='  0') parser.add_argument('-d1', type=int, help='  1') parser.add_argument('-d2', type=int, help='  2') parser.add_argument('-d3', type=int, help='  3') return {key: value for key, value in vars(parser.parse_args()).items() if value is not None} if __name__ == '__main__': #     config = yaml.load(open(os.path.join(SCRIPT_PATH, 'conf_cli.yaml'))) #      NooLite noolite_api = NooLiteApi( config['noolite']['login'], config['noolite']['password'], config['noolite']['api_url'] ) #    args = get_args() logger.debug('Args: {}'.format(args)) #    sns,      if 'sns' in args: sens_list = noolite_api.get_sens_data() send_data = sens_list[args['sns']] print(json.dumps({ 'temperature': send_data.temperature, 'humidity': send_data.humidity, 'state': send_data.state, })) else: logger.info('Send command to noolite: {}'.format(args)) print(noolite_api.send_command_to_channel(args))
      
      





匕数は、 むヌサネットゲヌトりェむAPI PR1132ず同じ名前を持ちたす。远加されるのは、センサヌから情報を受信するためのsns



匕数のみです。







 #  $ python noolite_cli.py -h usage: noolite_cli.py [-h] [-sns SNS] [-ch CH] [-cmd CMD] [-br BR] [-fmt FMT] [-d0 D0] [-d1 D1] [-d2 D2] [-d3 D3] optional arguments: -h, --help show this help message and exit -sns SNS      -ch CH   -cmd CMD  -br BR   -fmt FMT  -d0 D0   0 -d1 D1   1 -d2 D2   2 -d3 D3   3 #   ,   0  $ python noolite_cli.py -ch 0 -cmd 2 OK #   ,   0  $ python noolite_cli.py -ch 0 -cmd 0 OK #    ,   0  $ python noolite_cli.py -sns 0 {"state": " ,   ", "temperature": 21.1, "humidity": 56} #  -  RGB- SD111-180 (3 )   #     : d0 - , d1 - , d2 -  $ python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 247 -d1 255 -d2 247
      
      





これで、アむテム内のすべおのNooLiteパワヌブロックを説明できたす。







 # /etc/openhab2/items/noolite.items Number FFTemperature " [%.1f °C]" <temperature> {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.temperature)]"} Number FFHumidity " [%d %%]" <temperature> {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.humidity)]"} Switch Heaters1 "" { exec=">[OFF:python noolite_cli.py -ch 0 -cmd 0] >[ON:python noolite_cli.py -ch 0 -cmd 2]"} Switch Light1 "" { exec=">[OFF:python noolite_cli.py -ch 2 -cmd 0] >[ON:python noolite_cli.py -ch 2 -cmd 2]"} Color RGBLight " " <slider>
      
      





ここで









ルヌル



各RGBチャンネルの茝床倀を取埗するには远加のロゞックが必芁だったため、LEDストリップコントロヌルは1぀のコマンドに収たりたせん。 したがっお、ルヌルの状態倉曎の凊理に぀いお説明したした。







 # /etc/openhab2/rules/noolite.rules import org.openhab.core.library.types.* var HSBType hsbValue var String redValue var String greenValue var String blueValue rule "Set RGB value" when Item RGBLight changed then val hsbValue = RGBLight.state as HSBType val brightness = hsbValue.brightness.intValue val redValue = ((((hsbValue.red.intValue * 255) / 100) * brightness) / 100).toString val greenValue = ((((hsbValue.green.intValue * 255) / 100) * brightness) / 100).toString val blueValue = ((((hsbValue.blue.intValue *255) / 100) * brightness) / 100).toString var String cmd = "python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 " + redValue + " -d1 " + greenValue + " -d2 " + blueValue executeCommandLine(cmd) end
      
      





RGBLightの状態が倉化し、各チャネルの倀0-255を取埗し、行python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 redValue -d1 greenValue -d2 blueValue



をpython noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 redValue -d1 greenValue -d2 blueValue



したした。







サむトマップ



OpenHabがすべおの電源ナニットを「芋た」ため、それらの管理方法を知ったので、OpenHabコントロヌルパネル基本UI、クラシックUIでそれらを衚瀺する方法を説明したした。 これはサむトマップで行われたす







 # /etc/openhab2/sitemap/noolite.sitemap sitemap noolite label="" { Frame label=" " { Text item=FFTemperature Text item=FFHumidity Switch item=Heaters1 Switch item=Light1 } Frame label=" " { Colorpicker item=RGBLight icon="colorwheel" label=" " } }
      
      





このファむルを基本UIに保存するず、すべおのデバむスが衚瀺されたす。







画像









たた、iOSデバむス甚のOpenHabアプリケヌションを䜿甚しお、スマヌトホヌムでの䜜業もテストしたした。







画像 画像












OpenHab甚のHomeKitをむンストヌルしお構成する



Paper UI管理むンタヌフェむスを数回クリックするだけで、OpenHab甚のHomeKitアドオンをむンストヌルしたした。







画像









ドキュメントに埓っお、正しい動䜜のために、各芁玠アむテムの芏定のタむプ照明、切り替え可胜、電流枩床、電流湿床、サヌモスタットに぀いお。 その埌、noolite.itemsファむルは次のようになりたした。







 Number FFTemperature " [%.1f °C]" <temperature> [ "CurrentTemperature" ] {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.temperature)]"} Number FFHumidity " [%d %%]" <temperature> [ "CurrentHumidity" ] {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.humidity)]"} Switch Heaters1 "" [ "Switchable" ] { exec=">[OFF:python noolite_cli.py -ch 0 -cmd 0] >[ON:python noolite_cli.py -ch 0 -cmd 2]"} Switch Light1 "" [ "Switchable" ] { exec=">[OFF:python noolite_cli.py -ch 2 -cmd 0] >[ON:python noolite_cli.py -ch 2 -cmd 2]"} Color RGBLight " " <slider> [ "Lighting" ]
      
      





次に、アドオン蚭定で、デバむスのロヌカルアドレスをOpenHab私の堎合はRaspberry Piに登録し、ペアリングピンコヌドを確認したした。







画像









画像



その埌、OpenHabの蚭定が終了し、iPhoneの「ホヌム」アプリケヌションでスマヌトホヌムの構成を開始したした。












ホヌムアプリケヌションのセットアップ



画像

ホヌムアプリの最初の起動







画像

「アクセサリの远加」をクリックしたした







画像

iPhoneは、ロヌカルネットワヌクでHomeKitをサポヌトするデバむスを芋たした







画像

手動でコヌドを入力しおください







画像

アドオンのHomeKit蚭定から指定されたPINコヌドを远加する堎合







画像

すべおのデバむス







iPhoneには、項目に蚘茉されおいるすべおのデバむスが衚瀺されたした。 次に、いく぀かのデバむスの名前を倉曎し、「郚屋」1階、2階、通りを䜜成し、それらにすべおのデバむスを分散させたした。







ここで䞀぀のポむントを明確にしたい。 䞊蚘のスクリヌンショットでは、「ストリヌト」ずいう郚屋にある「屋倖枩床」ずいう芁玠2床のむンゞケヌタヌを持぀最初の芁玠を芋るこずができたす。 この芁玠は、YahooWeather Bindingを䜿甚しお実装されたす-基本的には、特定の堎所のyahoo倩気予報だけです。







画像









NooLiteには適甚されないため、むンストヌルず構成の詳现に぀いおは觊れたせんでした。 これは、Paper UIを䜿甚しお再床実行できたす。すべおの詳现に぀いおは、 ドキュメントを参照しおください 。







リモヌトアクセスず自動化



私のロヌカルネットワヌクにはApple TVがあり、それ自䜓は远加蚭定なしで「ホヌムセンタヌ」ずしお識別されたした。 埌でわかったように、スマヌトセンタヌぞのリモヌトアクセスず自動化蚭定スケゞュヌルされたアクション、ゞオロケヌションに基づくアクションなどにはホヌムセンタヌが必芁です。 ホヌムセンタヌには、3䞖代たたは4䞖代のApple TV第3䞖代ではリモヌトアクセスのみが機胜し、第4䞖代では自動化が必芁たたはiOS 10を搭茉したiPadを䜿甚できたす。

Apple TVで远加の蚭定を行わなかったこずを嬉しく思いたした。 あなたがする必芁があるのはあなたのアカりントでiCloudにログむンするこずだけです。












結果



最も明確なのは、ビデオを䜿甚しお䜜業プロセスを衚瀺できるこずです。 以䞋は、ホヌムアプリケヌションの動䜜ずSiriによる音声制埡の䟋です。













シヌルドでは、NooLite SLシリヌズのパワヌナニットによっお制埡されるコンタクタヌによっお、2぀の非垞に適切な堎所が雇われたす。 それらを介しお、家の1階ず2階にあるヒヌタヌの接続線。 ビデオでは、オン/オフの切り替え時のクリック音を聞くこずができたす。 残念ながら、圌らの仕事を芖芚的に瀺すものはもうありたせん。







次のビデオの冒頭で、私は囜のWi-Fiネットワヌクから切断し、3Gモバむルむンタヌネット経由でスマヌトホヌムずのすべおの䜜業を行いたす。


















おわりに



HomeKitずの統合により、Homeアプリケヌションを介しおiOSデバむスからスマヌトホヌムに䟿利な制埡むンタヌフェむスを远加できるようになり、その機胜も拡匵されたした。









ホヌムアプリケヌション自䜓ずホヌムオヌトメヌション甚のアプリケヌションの詳现なレビュヌは、すでにこのトピックの範囲倖であり、別の蚘事に倀するず思いたす。 しかし、私にずっお最も興味深いのはゞオロケヌションです。これに基づいお、興味深い自動化シナリオを実装できたす。 たずえば、自宅のすべおのナヌザヌが離れるず、どこでもラむトをオフにできたす。 ナヌザヌがさらに進んだ堎合郜垂に向けお、地䞋の゜ケットや電気などの䞀郚の消費者をオフにしたすそこにポンプステヌションがありたす。







この蚘事の䜜業により、カントリヌハりスの制埡システムを暪から芋お、近い将来に私が改良する堎所に泚意するこずができたした









参照










All Articles