• Siriでシャッター開閉

    長年Amazon Echoを使ってきましたが、試しに触ってみたHomebridgeの使い勝手がAlexaとは雲泥の差だったので、Siri+Homekit+Homebridgeに乗り換えることにしました。プラグインで対応デバイスを増やせる上に、プラグイン開発が盛んなのが良いですね。

    で、我が家のガレージの電動シャッター(文化シヤッター製)には、USB経由で給電されている間はシャッター開放の信号を送り続け、給電が止まったりシャッターから離れたりして信号が届かなくなるとシャッターが閉まる、という仕組みの「セレクルーズII」というリモコンが付属していたんですが、これを使ってHomebridge経由でシャッターを開閉出来ないかな?と。

    まずUSB給電のオンオフですが、どこのご家庭にも一つか二つか三つは転がっているRaspberry PiってUSBバスパワーのオンオフが可能なので、これを使おうと。USBポートひとつひとつを制御するのはちょっと面倒なんですが、ポート全体なら以下のコマンドでオンオフ出来ます。

    # オフにする時:
    echo -n "1-1" > /sys/bus/usb/drivers/usb/unbind
    
    # オンにする時:
    echo -n "1-1" > /sys/bus/usb/drivers/usb/bind

    で、せっかくなので同じRasPi上でHomebridgeも動かしちゃいます。HomebridgeにはRasPi用のイメージもあるので楽チンです。あとはHomebridgeがインストールされたマシン上でコマンドを実行できるCMD4というプラグインがあるので、このプラグインの仕様に合わせてバスパワーをオンオフするシェルスクリプトを書いて登録すれば完成です。

    今回はCMD4を使用。Homebridgeの設定からJSON Configを開き、GarageDoorOpenerというデバイスを直書きで追加します。

        "platforms": [
            {
                "name": "Config",
                "port": 8581,
                "platform": "config"
            },
            {
                "platform": "Cmd4",
                "name": "Cmd4",
                "debug": true,
                "accessories": [
                    {
                        "type": "GarageDoorOpener",
                        "displayName": "Shutter",
                        "currentDoorState": "OPEN",
                        "targetDoorState": "OPEN",
                        "obstructionDetected": "FALSE",
                        "lockCurrentState": "UNSECURED",
                        "lockTargetState": "UNSECURED",
                        "name": "Shutter",
                        "manufacturer": "Bunka Shutter",
                        "model": "Anything",
                        "serialNumber": "12345",
                        "stateChangeResponseTime": 30,
                        "state_cmd": "/home/pi/bin/shopen.sh",
                        "polling": [
                            {
                                "characteristic": "targetDoorState",
                                "interval": 60,
                                "timeout": 8000
                            },
                            {
                                "characteristic": "currentDoorState",
                                "interval": 60,
                                "timeout": 8000
                            }
                        ]
                    }
                ]
            }
        ]
    

    そしてCMD4から実行されるシェルスクリプトを作成。こちらはCMD4の Extras/Cmd4Scripts/Examples/ExampleShellScript_template.sh をほぼそのまま使っています。ざっくり説明するとシェルスクリプトは「Get/Set」「デバイス名」「特性」「true/false」の4つの引数付きで実行され、Getは現在の状態を取得、Setは状態を変更する場合(ドアの開閉)に用いられます。

    #!/bin/bash

    set -e

    length=$#
    device=""
    io=""
    characteristic=""
    option=""

    if [ $length -le 1 ]; then
    printf "Usage: $0 Get \n"
    printf "Usage: $0 Set \n"
    exit -1
    fi


    if [ $length -ge 1 ]; then
    io=$1
    # printf "io=$io\n" # debug
    fi
    if [ $length -ge 2 ]; then
    device=$2
    # printf "device = ${device}\n" # debug
    fi
    if [ $length -ge 3 ]; then
    characteristic=$3
    # printf "Characteristic = ${characteristic}\n" # debug
    fi
    if [ $length -ge 4 ]; then
    option=$4
    # printf "option = ${option}\n" # debug
    fi


    if [ "${io}" == 'Get' ]; then
    case $characteristic in
    'CurrentDoorState')
    PSTATUS=$(lsusb | wc -l)
    if [ $PSTATUS -gt 2 ]; then
    printf "0\n"
    else
    printf "1\n"
    fi
    exit 0
    ;;
    'TargetDoorState')
    printf "0\n"
    exit 0
    ;;
    'ObstructionDetected')
    printf "0\n"
    exit 0
    ;;
    'LockCurrentState')
    printf "0\n"
    exit 0
    *)
    printf "UnHandled Get ${device} Characteristic ${characteristic}\n"
    exit -1
    ;;
    esac
    fi

    if [ "${io}" == 'Set' ]; then
    case $characteristic in
    'CurrentDoorState')
    exit 0
    ;;
    'TargetDoorState')
    if [ $option -eq 0 ]; then
    sudo sh -c "echo -n \"1-1\" > /sys/bus/usb/drivers/usb/bind"
    else
    sudo sh -c "echo -n \"1-1\" > /sys/bus/usb/drivers/usb/unbind"
    fi
    exit 0
    ;;
    'ObstructionDetected')
    exit 0
    ;;
    'LockCurrentState')
    exit 0
    ;;
    *)
    printf "UnHandled Set GarageDoorOpenner Characteristic ${characteristic}"
    exit -1
    ;;
    esac
    fi

    printf "Unknown io command ${io}\n"
    exit -1

     あとはHomekitにHomebrigeを追加して「Siri、シャッターを開けて」「シャッターを閉めて」みたいな感じで操作します。

    使ってみた感想ですが、「開放の電波が途絶えるとシャッターを下ろす」というセレクルーズの仕様上、セレクルーズは「閉」の状態&通常のリモコンで開けた状態で「シャッターを閉めて」と言っても閉まらないのは、動作として正しいのだけど使い勝手としてはイマイチだなあと。やはり指ロボットでリモコンを操作するのが正しいのか……

  • ACC→OBD2

    タコメータの無いTwingoでも回転数見たい……というわけでOBD2取り付けたスキャナの情報をAndroid端滅で拾ってTorque Proに表示させていたんですが、うっかりスキャナをつけっぱなしにしてしまい、バッテリーがあがってしまいました。

    ブースターケーブルやジャンプスターターを持っていなかったのでJAFのお世話になったんですが、来てくれた方が昔Renault 5やFIAT 500に乗っていて滅茶苦茶話が面白かったのはさておき、バッテリーあがりは何とかしないとなあ……というわけで前々から「いつかはやろう」と思っていたスキャナのアクセサリ電源化に挑戦。

    といっても、ヒューズボックスのアクセサリ電源(Twingoだと28番)から電源を取り出し(エーモンのE512ミニ平型ヒューズ電源を使用)、電源ラインを置き換え可能なOBD2延長ケーブル(自作しようと思っていたので助かりました)につなげるだけです。

    どちらも電源ケーブルは30cmほどしか出ていないので、運転席の右端にあるヒューズボックスから助手席左端のOBD2までは届きません。1m弱の電源ケーブル(両端がギボシ端子のオスとメス)を作ってセンターコンソールの裏側を通しました。これは助手席足下のタイヤ修理キットを外すと作業しやすいと思います。

    電源ケーブル、使っているのはダブルコードの片方(赤)のみですが、今後のために赤黒両方残しておきました。あと裏を通す部分は念のためにコルゲートチューブで保護しています。

  • 猫扉

    ようやく玄関に脱走防止扉を設置したので、ニコさんがリビング・ダイニング以外にも行けるようになりました。

    脱走防止扉の製作で豊富な実績をもつ建具屋さんにお願いしたので、すごく立派な三方枠の扉が出来ました。簡単に取り外せるので大きな家具等を搬入時も安心です。

    さて脱走防止扉も設置したのでニコさんに全館開放したところ、その日の夜から私たちの寝室で一緒に寝るようになったのですが、ここでひとつ困ったことが。12月で寒かったこともあり毎晩寝室のドアを閉めて寝ていたのですが、夜中にトイレや遊びに行きたくなったニコさんがドアをあけて出て行くのは良いものの、当然自分で閉める訳もなく……

    というわけで寝室や居間のドアに急遽猫扉を設置しました。Amazon等を見ると安い猫扉がたくさん売られているので自分で設置することも考えましたが、その猫扉が壊れた際に扉にあけた穴にぴったりのサイズのものが手に入るか不安だったこと、また猫扉自身の耐久性自体にも不安を感じたので、脱走扉をお願いした建具屋さんに相談して実績品(アトムリビングテック「ペットくぐ〜る2・中サイズ」)を設置してもらいました。こちらかなり壊れにくく、壊れやすいフラップ部も単品で売っているので安心感があります。

    この猫扉、設置直後から人間がフラップを持ち上げてあげると通り抜けるのですが、なかなかニコさんひとりで通り抜けてくれませんでした。原因を探ると、まずドア開閉時などにフラップがバタつかないように半固定している磁石が結構強いので、なかなか開かない&開けても勢い良く戻ってしまうこと、またフラップが開く際に樹脂同士のこすれあう音が苦手なようだったので、

    まず磁石を取り外しました。こちらは爪で押さえているだけなので簡単に取り外せます。

    フラップの作動音はヒンジ部に潤滑剤をスプレーして抑えました。こちらは万が一ニコさんが舐めてしまっても大丈夫なように、食品加工機械などでも使われるフードシリコンスプレーを使いました。

    マグネットを取り外し、潤滑剤で動きもスムーズになった途端、ニコさんはまるで以前からそうであったように自由に猫扉を通り抜けるようになりました。マグネットがないのでドア開閉時に多少バタつきますが、使用に支障はないので当分このままで使ってみようと思います。

  • ActivityPub

    このブログ(さくらインターネットのレンタルサーバで動かしています)をActivityPubに対応させました。Mastodon等から @hibikiw@adelies.jp を検索してみてください。

    ちなみに手順はこんな感じでした。

    1. ActivityPubプラグインを追加
    2. web公開ディレクトリのルートに .well-known/webfinger ファイルを作成して所定の内容を記入
    3. WordPressのユーザプロファイルと同じメールアドレスでGravatarアカウントを作成してアイコンを設定

    Mastodon側には本文と画像が投稿されます。

  • 謹賀新年

    本年もよろしくお願いいたします。