LoginSignup
0
1

More than 1 year has passed since last update.

SwitchBotの指を定期的(指定した時間)に実行するプログラムを作った

Last updated at Posted at 2023-03-30

背景

SwitchBotの指を使って加湿器を二時間おきに強風にしたかった。

しかしAlexaでは実行する時間を一つしか設定できない。
また、それを、定期的に毎日、実行することはできるが、1時、2時のように1日の内に複数の時間を指定して実行することはできない。

そこで、SwitchBotのAPIを利用して、指定した時間に指を実行するプログラムを作ることにした。

やったことと注意

時間(今回はHourのみ)を指定し繰り返し実行するプログラムをpythonで書いた。

コードと詳しい説明はこちらから。

最初の一回だけプログラムを実行した際に指が起動します。それ以降は指定した時間になると実行されます。

.env.exampleを.envファイルとしてmain.pyと同じ階層にコピーし、TOKEN等をよしなに変更しておいてください。

関連パッケージとpythonはシステムに入れておいてください。

最後に

これで湿度が保たれQOLが上がりそうです。

備考

いいねもらえると励みになります。
仕様について改良案があればコメントいただけると幸いです。

プログラム

main.py
import requests
import json
from dotenv import load_dotenv
import os
import datetime
import numpy as np
import time

load_dotenv()

TOKEN = os.environ["TOKEN"]
API_HOST = os.environ["API_HOST"]
DEBIVELIST_URL = f"{API_HOST}/v1.0/devices"
DEVICE_ID = os.environ["DEVICE_ID"]

HEADERS = {
  'Authorization': TOKEN,
  'Content-Type': 'application/json; charset=utf8'
}

def _get_request(url):
  res = requests.get(url, headers=HEADERS)
  data = res.json()
  if data['message'] == 'success':
      return res.json()
  return {}

def _post_request(url, params):
  res = requests.post(url, data=json.dumps(params), headers=HEADERS) 
  data = res.json()
  if data['message'] == 'success':
      return res.json()
  return {}

def get_device_list():
  try:
    a=_get_request(DEBIVELIST_URL)["body"]['deviceList']
    print(a)
    return a
  except:
    return

def send_button(deviceId=DEVICE_ID,):
  url = f"{API_HOST}/v1.0/devices/{deviceId}/commands"
  params = {
      "command": "turnOn",
      "parameter": "default",
      "commandType": "command"
  }
  res = _post_request(url, params)
  if res['message'] == 'success':
      return res
  return {}

schedule=[0,2,4,6,8,10,12,14,16,18,20,22] # 時間を指定
schedule=sorted(schedule)
schedule=np.array(schedule)
def run():
  while 1:
    now = datetime.datetime.now()
    next = now
    future_is=schedule[schedule>now.hour]
    if sum(future_is)==0:
      next=datetime.timedelta(days=1)+next
      next=next.replace(hour=schedule[0],minute=0,second=0,microsecond=0)
    else:
      next=next.replace(hour=schedule[future_is][0])
    send_button()
    s=datetime.datetime.now().timestamp()
    e=next.timestamp()
    print(f"now: {now}, next: {next}, sleep: {(e-s)/60} [min]")
    time.sleep(e-s)
   
if "__main__" == __name__:
  # data = get_device_list()
  run()
0
1
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
0
1