Windows 10でLinuxを走るようにする。
WSL(Windows Subsystem for Linux)のインストール。
Windows Subsystem for Linuxにチェックを入れる。
windows storeからUbuntuをインストールする。
windows commandの準備
従来のコンソールを使うのチェックを外す。
コマンドプロンプトでubuntuを入力する。
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を開ける。
root@MainCom:~/src/HAP-python# python3 main.py
実行するとテストプログラムが走ります。
iphoneのホームのアプリケーションを立ち上げQRCODEを読み込みます。
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」と話しかけると
iphone Homekit制作中 pic.twitter.com/Xi40UKEKPk
— utaca.rich (@RichUtaka) June 16, 2019
では、スウィッチを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 -