見出し画像

Nature remoとラズパイで遊んだ時のメモ

※本記事は1年前くらいの記憶をひねり出してギリギリ書いた代物なので、ふわっとした記載がいくつかあると思います。
また執筆時(24/07)の環境では全く動作確認していないので、参考までに眺めていただければと。


やったこと

Nature Remoとラズパイを接続し、ラズパイ側の照度センサーから取得した情報をもとにNature Remoの操作を分岐させる。
(現状SSH経由なので外から実行不可、改善したいがその前に引っ越ししそう)

Q.Nature Remoの照度センサーでよくね…?

A.ちょっと特殊な状況だった。

状況として

  • 制御したい照明は廊下。

  • 廊下の照明は一応赤外線リモコン制御可能なのでNatureRemo制御可。

  • NatureRemoはリビングに設置=NatureRemoの照度センサーは使用不可

ということで別途で廊下に何かしらの形で照度を計測してNatureRemoのAPIを叩く必要があった。

手順

0. 使用した製品

(照度センサー販売終了してた…)

1.NatureRemo API トークンを取得

これに関しては多分先人がわかりやすく説明してるのでここでは適当に。

https://home.nature.global/

"Generate Access Token"をクリックでトークンが発行可能です。
外部に漏れないよう取り扱いには注意。

2.Pythonでコードを書く。

Pythonで制御します。
一応自力で叩けないことも無いですが、結構めんどいので↓のライブラリを使用するのが丸いです。

下記、コード全文です。

動作としては
①.pyファイルを実行すると照度を5回計測。
②平均を計算し、設定した閾値を基準に動作を分岐。
③閾値以上(明るい)の場合、信号を2回送信(オン→常夜灯→オフ)
 閾値以下(暗い)の場合、信号を1回送信(オフ→オン)

となってます。
特に難しいことはやってません。

import smbus
import time
from remo import NatureRemoAPI

api = NatureRemoAPI('取得したトークン')

#-------------------購入したセンサー付属のコード記述例,丸パクリゾーン-------------------

#照度を計測して数値化

def get_lux_value(ch0):

    #I2C設定
    i2c = smbus.SMBus(1)
    dev_addr = 0x39

    #センサーの設定
    ret = i2c.write_byte_data(dev_addr, 0x80|0x20|0x0F, 0x02)
    ret = i2c.write_byte_data(dev_addr, 0x80|0x20|0x01, 0xF6)
    ret = i2c.write_byte_data(dev_addr, 0x80|0x20|0x00, 0x02|0x01)

	#繰り返し
    while True:
    
        #データ読み込み
        uv = i2c.read_i2c_block_data(dev_addr, 0x80|0x20|0x14, 0x04)
    
        #データ変換
        ch0 = uv[1] << 8 | uv[0]
        ch1 = uv[3] << 8 | uv[2]
    
        #物理量(UV照度)に変換
        ch0 = ch0 / 16 / 19.0
        ch1 = ch1 / 16 / 10.8

        time.sleep(1)

        return ch0

#----------------------------------------------------------------------------------------


#
def ON():
    api.send_signal('signal_id_1')
    time.sleep(1)
    pass


def OFF():
    api.send_signal('signal_id_2')
    time.sleep(1)
    pass


lux_data = []
base = 1 #照度の閾値設定
ch0 = 0

for i in range(0,5,1):
    time.sleep(1)

    lux_value = get_lux_value(ch0)

    if len(lux_data) < 5:
        lux_data.append(lux_value)

    else:
        lux_data.pop(0)
        lux_data.append(lux_value)

    if len(lux_data) == 5:
        average_lux = sum(lux_data) / len(lux_data)

        if average_lux <= base:
            ON()
            print('Turned ON')
        else:
            OFF()
            OFF()
            print('Turned OFF')

取得したトークンには、先ほどのNatureRemoトークンを記入。

今回制御する照明は赤外線の単一信号でオン→常夜灯→オフをループするタイプなので一応別のsiganl idを使用してます。
(別に同一でも問題なく動作すると思う)

signal idの取得に関しては、予めNatureRemoのスマホアプリを使用して、手動で赤外線の設定を済ませた後、GETコマンド等で siganl idを確認します。

↓がわかりやすかったです。


3.コードを実行する

ここまで作っておいて、pyファイルの実行まで考えておらず若干困ったが、iphoneのショートカットアプリに"SSH経由でスクリプトを実行"というお誂え向きな機能があったので、今回はこれを使用。

スクリプト欄 : python "実行するファイルパス"
ホスト : IPアドレス(ifconfigで確認、固定した方が良き)
ポート : ポート番号(弄った記憶がなければ"22")
ユーザー : ユーザー名(Defは"pi")
認証:パスワード→ラズパイログイン時のパス

うまくいけば、照明の切り替え動作が行われ、かつiphone側に測定した照度データが数値で通知されます。

実際の運用としては机下にNFCタグを設置して、オートメーションでショートカットを起動していました。

ちなみにNatureRemo3の赤外線ですが、所詮赤外線なのでドア一枚隔てる程度で信号がかなり不安定になってしまったので、赤外線用のリピーターを無理やり通して使用しています。

線は割と細いんでドア閉じてても隙間からギリ通せてます。

最後に




IoT対応製品を、最初から買おう!!!!!




たかだか照明一個制御するのにいくら使ったんだ…?


この記事が気に入ったらサポートをしてみませんか?