いつもの
いつもの自分の備忘録用デス。外からHomeassistantを操作したいけどポート開けたりするのが面倒だったりできなかったり・・・
そこで思いついたSlackからHomeaAsistantをキーワードで操作できたらよくね?
ということでChatGPTさんにお伺いしたところ割と簡単にできたので記載しときます。
supervised用の内容になってますが、HomeAssistantOSでもできるかは不明。
動かなかったら、どこが悪いかChatGPTさんに聞いてみてください。
1.Slack Appを作成
Slack APIからYourApps→CreateNewApp→Blankappに移動
・SocketmodをONにしてApp-Level Tokenを作成、Scopeに"connections:write"を追加してxapp-...のトークンを保存
・OAuth&Permissions→BotTokenScopesでScopeに"chat:write"と"channels:history"を追加して
・Workspaceにインストールし、xoxb-...のトークンを保存
・EventSubscriptionsをONにしてSubscribetoboteventsに"message.channels"を追加
・SaveChangesで保存した後にslackの任意のチャンネルにBotを招待する。
2. Raspberry Piの準備
ターミナルでつないで下記入力。 HomeAssistant上のターミナルではなく、RaspberrPiOSに接続してください。sudo apt update
sudo apt install -y python3-venv
mkdir ~/slack-ha
cd ~/slack-ha
python3 -m venv venv
source venv/bin/activate
pip install slack-bolt requests python-dotenv
Homeassistantにつないで、左下のアカウント名→セキュリティ→下のほうにある
長期間有効なアクセストークンを作成して保存。
.envに各種トークンとHomeAssistantのIPアドレスを設定。
nano ~/slack-ha/.env
SLACK_BOT_TOKEN=xoxb-xxxxx
SLACK_APP_TOKEN=xapp-xxxxx
HA_URL=http://192.168.1.xxx:8123
HA_TOKEN=HomeAssistantの長期間有効なアクセストークン
トークン関係はほかの人に渡ると操作いろいろされちゃうかもなので扱い注意。
次にメインの実行ファイルを作成します。
HomeAssistantで実行させたいスクリプト番号をメモって下さい。
main.pyのCOMMANDS=の部分にスクリプトを起動させるキーワードと一緒に記載します。
もっとコマンド数増やしたい場合はここの行を追加してあげてください。
IFTTTやwebhookなどのBOTからのメッセージでも起動するようにしているので、
無限ループしないように気を付けてください。
nano ~/slack-ha/main.py
import os
import requests
from dotenv import load_dotenv
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
load_dotenv()
SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"]
SLACK_APP_TOKEN = os.environ["SLACK_APP_TOKEN"]
HA_URL = os.environ["HA_URL"]
HA_TOKEN = os.environ["HA_TOKEN"]
app = App(token=SLACK_BOT_TOKEN)
# Slackの投稿内容 → Home AssistantのScript
COMMANDS = {
"キーワード1": "script.xxxxx",
"キーワード2": "script.xxxxx",
"キーワード3": "script.xxxxx",
}
def run_ha_script(entity_id):
url = f"{HA_URL}/api/services/script/turn_on"
headers = {
"Authorization": f"Bearer {HA_TOKEN}",
"Content-Type": "application/json",
}
data = {
"entity_id": entity_id
}
response = requests.post(
url,
headers=headers,
json=data,
timeout=10
)
response.raise_for_status()
@app.event("message")
def handle_message(body, say, logger):
event = body.get("event", {})
text = event.get("text", "").strip()
if not text and event.get("subtype") == "bot_message":
attachments = event.get("attachments", [])
if attachments:
text = attachments[0].get("pretext", "").strip()
print(f"TEXT: {repr(text)}", flush=True)
print(f"SUBTYPE: {event.get('subtype')}", flush=True)
if text in COMMANDS:
try:
run_ha_script(COMMANDS[text])
say(f"「{text}」を実行しました")
except Exception as e:
print(f"ERROR: {e}", flush=True)
say("Home Assistantの操作に失敗しました")
print("Slack → Home Assistant 起動")
handler = SocketModeHandler(
app,
SLACK_APP_TOKEN
)
handler.start()
自動起動させるのにsystemctlに登録します。
sudo nano /etc/systemd/system/slack-ha.service
[Unit]
Description=Slack to Home Assistant
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=YOUR_USERNAME
WorkingDirectory=/home/YOUR_USERNAME/slack-ha
ExecStart=/home/YOUR_USERNAME/slack-ha/venv/bin/python /home/YOUR_USERNAME/slack-ha/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
YOUR_USERNAMEは環境に合わせてpiとか変更してください。
終わったら下記コマンドで反映させてください。
main.pyを編集した場合もこのコマンドで反映させる必要があります。
sudo systemctl daemon-reload
sudo systemctl enable slack-ha
sudo systemctl start slack-ha
あとはSlackからbotを招待したチャンネルで"キーワード1"のように送信すると、
設定したスクリプトがHomeAssistantで実行されるはずです。
たぶん。