本帖最后由 chinyaolin 于 2017-11-24 22:33 编辑
求權限 抱歉用繁體字發文
這次使用到的設備有
- 內建 Android 功能的 50吋電視一台
- Broadlink RM Pro
- 在 FreeNAS 的 jail 中安裝好 Home Assistant 0.58
已經有前輩有同樣的想法了 -> https://bbs.hassbian.com/thread-797-1-1.html
最原始的思路是, 我有可能使用電視機的紅外遙控器將電視打開。
而 HA 與 Broadlink 連動之後, 紅外的 Switch 並不能反應出實際的狀況, 因此想透過 input_boolean 來完成
另外一個問題是, 電視機的遙控開關使用的是同一個訊號,
- 用遙控器將電視打開, 電視狀態顯示上線, input_boolean 開關狀態顯示打開 (反之也要成立)
- 用 input_boolean 開關時, 需要隨時的知道目前電視機的情況, 不能隨意送出紅外訊號
先完成以下的準備工作
- 將 Broadlink 接入 HA, 學習好電視遙控的開關
switch:
- platform: broadlink
host: 1.1.1.1
mac: 'aa:bb:cc:dd:ee:ff'
timeout: 15
switches:
tv_switch_power:
friendly_name: "TV remote Power"
command_on: 'JgBgAAABKpwANBQAAAAAAAAAA'
command_off: 'JgBgAAABKpwANBQAAAAAAAAAA'
- 參考站上前輩的建議, 不使用內建的 ping 功能, 而用自製的 ping_TV.sh, 執行效率會比較好
(當然大家也可以使用內建的功能)(這裡的指令參數適用於 FreeNAS, 其他 OS 需再自行修改)
#! /bin/sh
ping -W 5 -c 3 -t 1 1.1.1.2 > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "on"
else
echo "off"
fi
- 透過上頭的指令, 於 HA 內完成電視機狀態的監測
binary_sensor:
# 用 PING 結果判斷家裡的電視有沒有開機 (TV內建盒子功能, 所以可以 ping 得到)
- platform: command_line
name: ping_TV
command: '/xxxx/.homeassistant/ping_TV.sh'
scan_interval: 30
payload_on: "on"
payload_off: "off"
- 建立一個新的虛擬開關, 待會要透過自動化指令完成聯動
input_boolean:
my_tv:
name: '客廳電視'
initial: off
接下來思考各個元件之間的邏輯相關性- 同時間只會有一個狀態變化 (所以可能是電視狀態變化 或是 虛擬開關狀態變化)(6,7 & 10,11 不會發生)
- 若兩種狀態都沒有變化則不需要處理 (1,4,13,16 不需處理)
- 電視狀態變化, 而虛擬開關已經是變化後的狀態 (8,9 狀態是對的, 不需要處理)
- 虛擬開關狀態變化, 但因為開關本來就與電視狀態相反, 所以不用作處理(3,14 只做開關狀態變化就行, 不用做其他處理)
- 遙控器開與關是同一個紅外訊號, 所以必需確保在正確的狀態下送出 (只有 2 & 15 需要送訊號)
- 最後的 2 個情形類似, 可能是因為外在輸入使得電視改變, 這時需正確檢查虛擬開關的情形才能做動作 (5,12 要讓虛擬開關反應)
- 總結, 我們需要四個 automation, 分別依照 tigger & condition 來決定 action
開始設計 automations 內容
#################################################################################################
##
## TV 客廳電視
##
#################################################################################################
#
# 依照 客廳電視的實際上線狀態來改變 input_boolean.squeeze_boom 按鈕的狀態
# 註: 電視實際狀態則是由 binary_sensor.ping_tv 的結果決定
# 註: binary_sensor 是呼叫外部寫好的 xxx.sh 指令中執行 ping 指令結果得知機器是不是活著
#
# 電視狀態 OFF->ON (關機->開機)
# 虛擬按鈕若是 OFF-OFF, 那麼就把 input_boolean.jvc_tv 這顆虛擬開關切到 ON
# 其他的狀態不處理
- alias: "TV status goes on"
trigger:
platform: state
entity_id: binary_sensor.ping_tv
from: 'off'
to: 'on'
condition:
- condition: state
entity_id: 'input_boolean.my_tv'
state: 'off'
action:
- service: input_boolean.turn_on
entity_id: input_boolean.my_tv
# 電視狀態 ON->OFF (開機->關機)
# 虛擬按鈕若是 ON-ON, 那麼就把 input_boolean.jvc_tv 這顆虛擬開關切到 OFF
# 其他的狀態不處理
- alias: "TV status goes off"
trigger:
platform: state
entity_id: binary_sensor.ping_tv
from: 'on'
to: 'off'
condition:
- condition: state
entity_id: 'input_boolean.my_tv'
state: 'on'
action:
- service: input_boolean.turn_off
entity_id: input_boolean.my_tv
# 虛擬按鈕狀態 OFF->ON (主動按下或是被動變化狀態)
# 電視實際狀態若是 OFF-OFF, 那麼就要送出紅外開機/關機(同一顆按鈕)
# 其他狀態可以不用管
- alias: "input_boolean.jvc_tv turn on"
trigger:
platform: state
entity_id: input_boolean.my_tv
from: 'off'
to: 'on'
condition:
- condition: state
entity_id: 'binary_sensor.ping_tv'
state: 'off'
action:
service: switch.turn_on
entity_id: switch.tv_switch_power
# 虛擬按鈕狀態 ON->OFF (主動按下或是被動變化狀態)
# 電視實際狀態若是 ON-ON, 那麼就要送出紅外開機/關機(同一顆按鈕)
# 其他狀態可以不用管
- alias: "input_boolean.jvc_tv turn off"
trigger:
platform: state
entity_id: input_boolean.jvc_tv
from: 'on'
to: 'off'
condition:
- condition: state
entity_id: 'binary_sensor.ping_tv'
state: 'on'
action:
service: switch.turn_off
entity_id: switch.tv_switch_power
在這樣的思路下 input_boolean.my_tv 與 binary_sensor.ping_TV 會聯動保持一致 但 switch.tv_switch_power 就沒辦法了, 反正我們不用它了
|