Raspberry pi zero wとhomebridgeとHomeKitの連携その1

だいぶ以前にnodeMcuで4chリレーモジュールのうち、3chを動かし、かつ、物理スイッチからも動かせるようにしました。

gentoolinux.hatenablog.com

しかし、1ヶ月後、WiFiアクセスポイントを増やしたことからなにやら不安定に。

再起動を繰り返す始末。

別なモジュールを買っても同じ。

ESP8266は電源周りがだいぶシビアだそうでして、その影響なのか、exception(29)を吐いてstuckします。

3.3Vのピンに470μFの電解コンデンサをつけたけど、解消されず。

 

そこで、Raspberry Pi zero wに入れ替えた顛末を。

f:id:naoyukinagano:20171121223443j:plain

 

Raspberry piにRaspbian Strechを入れてSSHするところまではいろいろなところに乗っているので割愛。

rootでRaspbian Strechが動かせることを前提に話を進めます。

 

まずは、RaspbianにWebiopiをインストールします。

参考にしたのはこのページ

nw-electric.way-nifty.com

あ、ただ、Python3の有効化をし忘れました(^^ゞ

root@raspberrypi: ~/# mkdir webiopi

root@raspberrypi: ~/# cd webiopi

root@raspberrypi: ~/webiopi# wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz

root@raspberrypi: ~/webiopi# tar xvzf WebIOPi-0.7.1.tar.gz

root@raspberrypi: ~/webiopi# cd WebIOPi-0.7.1

root@raspberrypi: ~/webiopi/WebIOPi-0.7.1# wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch

root@raspberrypi: ~/webiopi/WebIOPi-0.7.1#./setup.sh

んで、Basic認証をハズしました。

root@raspberrypi: ~/# nano /etc/webiopi/config

 /etc/webiopi/configファイルの以下の2箇所をコメントアウト

#passwd-file = /etc/webiopi/passwd

#prompt = "WebIOPi"

で、サービス有効化とスタートです。

root@raspberrypi: ~/# update-rc.d webiopi defaults

root@raspberrypi: ~/#/etc/init.d/webiopi start

 

続いて、PythonでGPIOがGNDに落ちるとトグルスイッチになる(消えてたら付く、付いていたら消える)ようなスクリプトを書きます。

本当ならadd_event_detectを使いたいところなのですが、電位差の検出がシビアすぎて、隣のスイッチまで検出されてコールバックが実行されてしまう始末。

ここはCPUリソースを喰ってでも安定した動作を目指しました。

追記:add_event_detectでは確かに微妙なエッジも検出してしまいますが、検出後のコールバックに"本当に該当スイッチのGPIOが0なのか? を判定するif文を入れれば誤動作を抑止できることがわかりました。詳しくは「その2」へ

 

webiopiからGPIOのピン状況を取得したり、書き込んだりするために、Pythonのrequestsライブラリを利用します。

 root@raspberrypi: ~/# apt-get install python-requests

そして、Rpi.GPIOライブラリ(プリインストール)を活用してスイッチのGPIOがGNDに落ちるのを読み取って、リレーのGPIOの状況を取得し、その状況に応じてGPIOのValueを変化させます。

何度も誤動作しないよう、1度動作したら1秒スリープさせます。

スイッチの読み取りも0.1秒ごとにしました。

プッシュスイッチがGPIO16、リレーがGPIO19で、サインスマートのリレーなので0でON、1でOFFです。

 

追記:これはとても迅速に検出可能ですが、CPUリソースを喰いますのでおすすめしません。

/root/switch/switch1.py

#! /usr/bin/python

import RPi.GPIO as GPIO
import time
import requests
switch = 16
relay = 19
url_front = 'http://localhost:8000/GPIO/'
url_back = '/value'
url_function_out = '/function/out'
url = url_front + str(relay) + url_back
url_function = url_front + str(relay) + url_function_out
url0 = url + '/0'
url1 = url + '/1'

GPIO.setmode(GPIO.BCM)
GPIO.setup(switch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
gpio_function = requests.post(url_function)

try:
   while True:
   if GPIO.input(switch)==0:
     status = requests.get(url)
     if status.text=='1':
       requests.post(url0)
       time.sleep(1)
     else:
       requests.post(url1)
       time.sleep(1)
   time.sleep(0.1)

except KeyboardInterrupt:
   print '\nswitch.py Stopped'
   GPIO.cleanup()

これらのswitch変数とrelay変数の違いで3ch分をswitch1.py,switch2.py,switch3.pyとして作成しました。

起動時に実行するように、/etc/rc.localに記述します。

# switch read

/root/switch/switch1.py &
/root/switch/switch2.py &
/root/switch/switch3.py &

exit 0

これでスイッチとリレーが連動するようになり、リビングのライトが通常通り使えるようになりました。

次は、homebrigeのconfigを書き換えます。