[分享] "地牛Wake Up!"地震預報連動HA自動化

寫在前面,本文如果有漏掉感謝的智友or文章or公司,懇請回文提醒,過程中google了很多資料,很有可能使用到了您的智慧與心血,望請見諒。

**如果您的自動化只是想要LINE通知,不用特別花時間把地牛整合進HA,直接從這邊:
https://wakeup.sgod.me/ 將您的LINE帳號跟地牛系統作連動就可以了。

近來地震頻仍,每次都喚起20幾年前921的恐怖經驗,恰巧最近發現一套非常棒的軟體:“地牛Wake Up!”,在消化"惟家"與"HomeKit"兩智能群群友的集思廣益之後,小弟在此簡單分享一下自己接入HA做自動化的方式。

在群裡看到的分享,都是透過UBUNTU+NodeRed做的,恰巧我不熟Linux也不會NR,所以我用的是Window10+HA內建的自動化,敬此說明。

步驟:

一. 安裝python(官網請點我),我安裝的版本是3.10,現在已經到3.11了,稍後會有批次檔,大家各自安裝的路徑要記錄一下(我的安裝路徑是C:\Python\Python310)

二. 安裝地牛Wake Up!(官網請點我),我安裝的版本是x64,如果您的Windows是32位元,請下載相應的安裝包。

三. 打開"地牛Wake Up!"並設定之,大家看圖照樣設定為自家地區&等下要放置批次檔的路徑檔案即可。


螢幕擷取畫面 2022-11-01 193800

四. 進HA裡面建立一個token (左下角你的名字上面點一下,然後拉到最下面,新增權杖),等下批次檔會用到。

五. 在HA裡面建立兩個sensor,要讓"地牛Wake Up!"用的
(註1: HA的API非常透明完整,可以藉之做很多運用,真的要給辛苦的HA開發團隊無數個大大大的讚,他們真的是太了不起了。)
(註2: 建立sensor可以有更加多元的應用,但也可以不建,直接從批次擋去call HA裡面的自動化,範例由洋蔥大提供,將寫於步驟六)

(舊格式,個人習慣拆分configuration.yaml )
sensor: !include_dir_merge_list /config/entities/sensor/

- platform: template
  sensors:
    earthquake_level:
      value_template: 0
    earthquake_level2:
      friendly_name: "預估地震規模"
      value_template: >-
        {{ (states.sensor.earthquake_level.state)[0]|int }}
    earthquake_sec:
      value_template: 0        
    earthquake_sec2:
      friendly_name: "預估幾秒後地震"
      value_template: >-
        {{ (states.sensor.earthquake_sec.state)|int - 2 }}

(新格式,個人習慣拆分configuration.yaml )
template: !include_dir_merge_list /config/entities/templates/

- sensor:
  - name: earthquake_level
    state: 0
  - name: earthquake_level2
    #friendly_name: "預估地震規模"
    state: > 
      {{ (states.sensor.earthquake_level.state)[0]|int }}

  - name: earthquake_sec
    state: 0        
  - name: earthquake_sec2
    #friendly_name: "預估幾秒後地震"
    state: >-
      {{ (states.sensor.earthquake_sec.state)|int - 2 }}

(補充: 最後一個 -2,是我修正了好幾次,地牛發布警報跟我實際聽到TTS語音的時間差,非必須,請依需求自行修改之。)(上一版甚至是-7,後來發現是執行服務的順序所致,已修正。)

六. 批次檔eew.bat的內容
1.步驟五有建sensor的版本:

@echo off

set DST={你在內網連HA的IP:PORT}  #致敬二樓洋蔥大神的寫法,更簡潔也更適合分享
set TOKEN={步驟4所記錄下來的token} #致敬二樓洋蔥大神的寫法,更簡潔也更適合分享

cd C:\Python\Python310\
start /MIN python earthquake.py %1 %2

curl.exe -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" %DST%/api/states/sensor.earthquake_level -d "{\"state\": \"%1\"}"

curl.exe -X POST -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" %DST%/api/states/sensor.earthquake_sec -d "{\"state\": \"%2\"}"

註: {步驟4所記錄下來的token}跟{你HA內網的IP}這兩個變數,打的時候不用加引號"{“與”}"

2.步驟五沒有建sensor的版本: 請看二樓回文,洋蔥大師親自蒞臨指導分享完整代碼,感謝。
(註: 分享者"洋蔥",是一個非常厲害的高手,尤其米家相關設備,以下出賣他的GitHub,歡迎利用XD

七. 自動化參考, 請按照貴府實際有的設備&裝置去改動ˇ,我的想法很單純: 強震常常是深夜發生,就寢時間大家就算聽到LINE提醒也不見得會起床開手機,更何況大多數人應該會設定"深夜勿擾"吧,所以我的警報大部分是用聽的,直接從手機&音箱裝置念出告警的內容,並開啟預設躲避路線的所有照明,只要不是熟睡到沒聽見,至少還能有幾秒鐘的時間緊急應變。

alias: APP強震TTS警報
description: ""
trigger:
  - platform: numeric_state
    entity_id: sensor.earthquake_level2
    above: 4.9
condition: []
action:
  - parallel:
      - service: notify.mobile_app_baba_x3
        data:
          message: TTS
          data:
            tts_text: 強震來襲,強震來襲,迅速躲避。
            media_stream: alarm_stream_max
      - service: notify.mobile_app_dima_oppo
        data:
          message: TTS
          data:
            tts_text: 強震來襲,強震來襲,迅速躲避。
            media_stream: alarm_stream_max
      - data_template:
          language: zh-CN-XiaoxiaoNeural
          message: >-
            強震來襲,{{ (states.sensor.earthquake_level2.state) }}級地震{{
            (states.sensor.earthquake_sec2.state) }}秒後抵達。
        entity_id: media_player.indoor_speakers
        service: tts.edge_tts_say
      - service: switch.turn_on
        data: {}
        target:
          entity_id:
            - switch.ks811_master_3
            - switch.ks811_second_2
            - switch.ks811_livingroom_2
            - switch.ks811_3f_2
            - switch.ks811_stair3_3
  - service: media_player.turn_on
    data: {}
    target:
      entity_id: media_player.denon_avr_x3700h
  - service: media_player.clear_playlist
    data: {}
    target:
      entity_id: media_player.denon_avr_x3700h
  - service: media_player.volume_set
    data:
      volume_level: 0.8
    target:
      entity_id: media_player.indoor_speakers
  - data_template:
      language: zh-CN-XiaoxiaoNeural
      message: >-
        強震來襲,{{ (states.sensor.earthquake_level2.state) }}級地震{{
        (states.sensor.earthquake_sec2.state) }}秒後抵達。
    entity_id: media_player.denon_avr_x3700h_2
    service: tts.edge_tts_say
mode: single

以上簡單分享,若有錯漏之處,亦請反饋以便修正,謝謝。

3個讚

修正一下
上面的 linux 的用法, 下面是完整範例,

#!/bin/bash

DST=https://10.0.1.168:8123
TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ0.eyJpc3MiOiJhYWMxN2FjMGIwNjA0NTA8ODVhYjcwM6ZkMjRkYTIwMyIsImlhdCI6MTU4MTkwMzk4NCwiZXhwIjoxODk3MjYzOTg0fQ.nltnRJwM68uBV798Kvu6W6dvDlTwnbveoW0IkpA8ltE

curl -s -k -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"\
  -d "{\"message\": \"有地震, 芮氏規模 $1 , 再 $2 秒抵逹\"}" \
  $DST/api/services/notify/line_notification_family

curl -s -k -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"\
  -d "{\"entity_id\": \"media_player.ke_ting_2\", \"volume_level\": \"0.5\"}" \
  $DST/api/services/media_player/volume_set

curl -s -k -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json"\
  -d "{\"entity_id\": \"media_player.ke_ting_2\", \"message\": \"有地震, 芮氏規模 $1 , 再 $2 秒抵逹\"}" \
  $DST/api/services/tts/edge_tts_say

下面是 Windows 的範例

@echo off

set DST=https://10.0.1.168:8123
set TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ0.eyJpc3MiOiJhYWMxN2FjMGIwNjA0NTA8ODVhYjcwM6ZkMjRkYTIwMyIsImlhdCI6MTU4MTkwMzk4NCwiZXhwIjoxODk3MjYzOTg0fQ.nltnRJwM68uBV798Kvu6W6dvDlTwnbveoW0IkpA8ltE

curl -X POST -H "Authorization: Bearer %TOKEN%" ^
  -H "Content-Type: application/json" ^
  -d "{\"message\": \"有地震, 芮氏規模 %1 , 再 %2 秒抵逹\"}" ^
  %DST%/api/services/notify/line_notification_family

curl -X POST -H "Authorization: Bearer %TOKEN%" ^
  -H "Content-Type: application/json" ^
  -d "{\"entity_id\": \"media_player.ke_ting_2\", \"volume_level\": \"0.5\"}" ^
  %DST%/api/services/media_player/volume_set

curl -X POST -H "Authorization: Bearer %TOKEN%" ^
  -H "Content-Type: application/json" ^
  -d "{\"entity_id\": \"media_player.ke_ting_2\", \"message\": \"有地震, 芮氏規模 %1 , 再 %2 秒抵逹\"}" ^
  %DST%/api/services/tts/edge_tts_say

歡迎大師蒞臨…

那個…, token要不要改一下,以免知道大師domain的仰慕者…^^

哈, 那個 token 是假的, 就算用了真的, 也沒用, 沒有 ip.

1個讚

蔥大,
趁著補充步驟五template sensor的新舊寫法,
也在步驟六把您批次檔設定變數的寫法給"致(co)敬(py)"上去了,哈哈哈。

我還沒搞懂, 為什麼要裝 Python , 執行. earthquick.py

請教,能否讓 地牛 在 Synology NAS 上面跑? 不想 24hr 開著一台電腦。
要再另開一個 VM 嗎? 還是有沒有更簡單的方法?

一定可以的, 只不過我餐廳剛好有一台HTPC是一直開著的所以拿來利用而已, 現在這個方法是有限能力的自己覺得最簡單的了^^

1個讚