LoginSignup
2
0

More than 3 years have passed since last update.

iphone siriをテストする。windows 編(HAP-python)

Last updated at Posted at 2019-06-17

image.png

Windows 10でLinuxを走るようにする。

WSL(Windows Subsystem for Linux)のインストール。

image.png
Windows Subsystem for Linuxにチェックを入れる。
windows storeからUbuntuをインストールする。
image.png
windows commandの準備
image.png
従来のコンソールを使うのチェックを外す。
image.png
コマンドプロンプトでubuntuを入力する。
image.png

 apt-get update
 apt-get upgrade
 sudo apt-get install libavahi-compat-libdnssd-dev
 mkdir src
 cd src
 clone git://github.com/ikalchev/HAP-python.git
 git clone git://github.com/ikalchev/HAP-python.git
 cd HAP-python
 pip install HAP-python[QRCode]
 pip install -e .[QRCode]

windowsのファイアーウォールのport 51826を開ける。
image.png

root@MainCom:~/src/HAP-python# python3 main.py

実行するとテストプログラムが走ります。

image.png

iphoneのホームのアプリケーションを立ち上げQRCODEを読み込みます。

image.png

image.png
黒下線のように温度が現れれば正常動作

main.py
"""An example of how to setup and start an Accessory.

This is:
1. Create the Accessory object you want.
2. Add it to an AccessoryDriver, which will advertise it on the local network,
    setup a server to answer client queries, etc.
"""
import logging
import signal
import random

from pyhap.accessory import Accessory, Bridge
from pyhap.accessory_driver import AccessoryDriver
import pyhap.loader as loader
from pyhap import camera
from pyhap.const import CATEGORY_SENSOR

logging.basicConfig(level=logging.INFO, format="[%(module)s] %(message)s")


class TemperatureSensor(Accessory):
    """Fake Temperature sensor, measuring every 3 seconds."""

    category = CATEGORY_SENSOR

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        serv_temp = self.add_preload_service('TemperatureSensor')
        self.char_temp = serv_temp.configure_char('CurrentTemperature')

    @Accessory.run_at_interval(3) #温度を表示している値の更新
    async def run(self):
        self.char_temp.set_value(random.randint(18, 26)) # 18℃から26℃


def get_bridge(driver):
    """Call this method to get a Bridge instead of a standalone accessory."""
    bridge = Bridge(driver, 'Bridge')
    temp_sensor = TemperatureSensor(driver, 'Sensor 2')
    temp_sensor2 = TemperatureSensor(driver, 'Sensor 1')
    bridge.add_accessory(temp_sensor)
    bridge.add_accessory(temp_sensor2)

    return bridge


def get_accessory(driver):
    """Call this method to get a standalone Accessory."""
    return TemperatureSensor(driver, 'MyTempSensor')


# Start the accessory on port 51826
driver = AccessoryDriver(port=51826)

# Change `get_accessory` to `get_bridge` if you want to run a Bridge.
driver.add_accessory(accessory=get_accessory(driver))

# We want SIGTERM (terminate) to be handled by the driver itself,
# so that it can gracefully stop the accessory, server and advertising.
signal.signal(signal.SIGTERM, driver.signal_handler)

# Start it!
driver.start()

servicesは、下記のように定義されている。

/root/src/HAP-python/pyhap/resources/services.json
   "TemperatureSensor": {
      "OptionalCharacteristics": [
         "StatusActive",
         "StatusFault",
         "StatusLowBattery",
         "StatusTampered",
         "Name"
      ],
      "RequiredCharacteristics": [
         "CurrentTemperature"
      ],
      "UUID": "0000008A-0000-1000-8000-0026BB765291"
   },

characteristicsは、下記のように定義されている。

/root/src/HAP-python/pyhap/resources/characteristics.json
   "CurrentTemperature": {
      "Format": "float",
      "Permissions": [
         "pr",
         "ev"
      ],
      "UUID": "00000011-0000-1000-8000-0026BB765291",
      "maxValue": 1000,
      "minStep": 0.1,
      "minValue": -273.1,
      "unit": "celsius"
   }

iphoneのSiriに「MyTempSensor」と話しかけると
image.png

では、スウィッチをOn/Offするサンプルを作ってみよう。

home.py
#!/usr/bin/python3
'''
simple switch sample rich.hirata
'''
import logging,signal
from pyhap.accessory import Accessory, Bridge
from pyhap.accessory_driver import AccessoryDriver
from pyhap.const import (CATEGORY_SWITCH)
logging.basicConfig(level=logging.INFO, format="[%(module)s] %(message)s")
class SW(Accessory):
     category = CATEGORY_SWITCH
     def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        serv_tv = self.add_preload_service('Switch')
        self.char_on = serv_tv.configure_char('On', setter_callback=self.sw)
     def sw(self,value):
        logging.info("スウィッチ: %s", value)
def get_bridge(driver):
    bridge = Bridge(driver, 'Bridge')
    bridge.add_accessory(SW(driver, 'スウィッチ'))
    return bridge
driver = AccessoryDriver(port=51826, persist_file='home.state')
driver.add_accessory(accessory=get_bridge(driver))
signal.signal(signal.SIGTERM, driver.signal_handler)
driver.start()

「スイッチオン」いうと

[home] スウィッチ: True
[hap_server] 192.168.1.104 - "PUT /characteristics HTTP/1.1" 204 -

「スイッチオフ」いうと

[home] スウィッチ: False
[hap_server] 192.168.1.104 - "PUT /characteristics HTTP/1.1" 204 -

class SW の def swを書き直すと実際の応用となる。

image.png

デバックするとき再度登録をし直す場合、home.pyのディレクトリにあるhome.stateを削除するとQRCODEの再読み込みから行われる。

次回Raspberry PI編をお楽しみに!

「いいね」してね!

Souce program https://github.com/yutakahirata/HAP-python.git

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0