『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 10707|回复: 16

自找麻煩的電視狀態與開關狀態聯動

[复制链接]

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

发表于 2017-11-21 12:07:10 | 显示全部楼层 |阅读模式
本帖最后由 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
HASS.png
開始設計 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 就沒辦法了, 反正我們不用它了


评分

参与人数 4金钱 +34 收起 理由
neoyang + 2
25989406 + 10 细致的分享,图文并茂!!赞一个.
lidicn + 12 666!
Roger + 10 666!

查看全部评分

回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16412
金钱
11666
HASS币
45
发表于 2017-11-21 14:30:52 | 显示全部楼层
不是自找麻烦啊,很有必要啊谢谢分享
回复

使用道具 举报

0

主题

151

帖子

532

积分

高级会员

Rank: 4

积分
532
金钱
381
HASS币
0
发表于 2017-11-21 19:31:39 | 显示全部楼层
棒棒棒棒
回复

使用道具 举报

4

主题

134

帖子

672

积分

高级会员

Rank: 4

积分
672
金钱
538
HASS币
0
发表于 2017-11-22 19:19:57 | 显示全部楼层
感谢分享!期待您的更多作品
回复

使用道具 举报

1

主题

84

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
金钱
184
HASS币
0
发表于 2017-11-24 17:56:55 来自手机 | 显示全部楼层
一直在想这个问题,还真有人做了
回复

使用道具 举报

0

主题

41

帖子

273

积分

中级会员

Rank: 3Rank: 3

积分
273
金钱
232
HASS币
0
发表于 2017-11-30 23:18:17 | 显示全部楼层
一直在想办法用device_tracker来做电视状态联动,一直都搞不成功。现在楼主给了一个新思路,可以试试
回复

使用道具 举报

6

主题

43

帖子

140

积分

注册会员

Rank: 2

积分
140
金钱
97
HASS币
0
发表于 2017-12-5 04:43:51 | 显示全部楼层
很厲害但不太明白有甚麼用
回复

使用道具 举报

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

 楼主| 发表于 2017-12-5 11:27:57 | 显示全部楼层
hioasjgo3 发表于 2017-12-5 04:43
很厲害但不太明白有甚麼用

HASS_3.png
  • 如果你使用原來的電視遙控器將電視打開, (狀態) 會偵測到電視打開, (開關) 會切換為開的狀態
  • 反之, 用遙控器將電視關閉, (狀態)&(開關) 也會正確反應出實際的情況
  • 當然也可以用 HASS 的網頁開關將電視打開或是關上


回复

使用道具 举报

27

主题

1292

帖子

5877

积分

元老级技术达人

积分
5877
金钱
4560
HASS币
100
发表于 2017-12-12 19:21:22 | 显示全部楼层
这个分享很赞,理论上可以用到任意一个可以联网,又用红外控制的设备
回复

使用道具 举报

2

主题

18

帖子

128

积分

注册会员

Rank: 2

积分
128
金钱
110
HASS币
0
发表于 2017-12-19 21:08:54 | 显示全部楼层
自带的ping指令也用了,楼主的ping.sh也用了,putty里正常反馈的,ha里ping不成功,没反馈。
log里显示2017-12-19 20:52:50 ERROR (SyncWorker_9) [homeassistant.components.sensor.command_line] Command failed: /home/homeassistant/.homeassistant/ping_140.sh
2017-12-19 20:53:21 ERROR (SyncWorker_11) [homeassistant.components.sensor.command_line] Command failed: /home/homeassistant/.homeassistant/ping_140.sh
2017-12-19 20:53:52 ERROR (SyncWorker_7) [homeassistant.components.sensor.command_line] Command failed: /home/homeassistant/.homeassistant/ping_140.sh
2017-12-19 20:54:23 ERROR (SyncWorker_9) [homeassistant.components.sensor.command_line] Command failed: /home/homeassistant/.homeassistant/ping_140.sh
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-26 14:58 , Processed in 1.071996 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表