1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FireTVの視聴時間をHomeAssistantで可視化してみた

Posted at

はじめに

最近、FireTVを使っていると、「今日はどれくらい観たんだろう?」「深夜まで観すぎてないかな?」と気になるようになってきました。
そこで、HomeAssistantを使って、FireTVの視聴時間を自動記録し、可視化する仕組みを作ってみました。

本記事では、

  • Fire TVの視聴時間をどのように取得するのか?
  • Home Assistant でどのようにデータを保存・可視化するのか?
  • 実際に作ってみて苦労した点

をまとめました。

やりたいこと(要件整理)

まず、どんな情報を記録・可視化したいのかを整理しました。

記録したい情報

  • 1時間ごとの視聴時間
  • 1日ごとの視聴時間
  • どのアプリ(Amazon Video / YouTube など)をどれくらい見たか

最終的にやりたいこと

  • リアルタイムで「今日の視聴時間」を表示する
  • 1時間ごとの視聴時間を棒グラフで可視化する
  • 1週間単位で視聴時間の推移を表示する
  • アプリごとの使用割合を円グラフで表示する(←今後実装予定)

完成イメージ

こんな感じでダッシュボードにFireTVの視聴時間が確認できるようにします。

image.png

HomeAssistantの構成イメージ

ざっくりと構成をまとめるとこんな感じになります。

image.png

FireTV の状態を取得できるようにする

FireTVの状態(playing, paused, idleなど)を取得するために、HomeAssistantにmedia_player.fire_tvエンティティを用意して、そこからFireTVの状態を取得するようにします。

FireTVを開発者モードを有効にする

設定 → マイFireTV → 開発者オプション → ADBデバッグ をオンにします。

image.png

image.png

image.png

設定 → マイFireTV → バージョン情報 → ネットワーク で表示されるIPアドレス(wifi)を確認します。

IPアドレスでFireTVを指定しますので、手動でIPアドレスを設定するか、Wi-FiルーターでIP予約してFireTVのIPアドレスが変わらないようにしてください。

image.png

HomeAssistantにFireTVデバイスを追加

HomeAssistantの設定 → デバイスとサービス → 統合を追加 を選択

image.png

「ブランド名で検索」に「Amazon」を入力して選択

image.png

「Amazon Fire TV」を選択

image.png

確認メッセージが表示されたら「OK」を選択

image.png

Android Debug Bridgeで以下を入力

image.png

項目 設定値
ホスト FireTVのIPアドレス
デバイスの種類 firetv
ポート 5555(デフォルト)
ADBキーファイルへのパス 空白
ADBサーバーのIPアドレス 空白
ADBサーバーのポート 5037(デフォルト)

「送信」をクリックしてしばらくするとFireTV側に「USBデバッグを許可しますか?」の確認画面が表示されます。
「このコンピューターを常に許可」にチェックを入れて、OKボタンを押します。

image.png

image.png

正常にデバイスの追加ができたら「完了」を押します。

image.png

エンティティIDはmedia_player.fire_tvのように、わかりやすいIDに変更してください。(以降は、media_player.fire_tvのエンティティ名で進めていきます。)

FireTVの現在の状態を表示するエンティティを作成

configuration.yamlに以下のエンティティを追加して、現在のmedia_player.fire_tvの状態を表示するエンティティを用意します。

✅ FireTV視聴履歴(input_text.fire_tv_watch_history

FireTV視聴中のアプリ名を記録します。

configuration.yaml
input_text:
  fire_tv_watch_history:
    name: Fire TV 視聴履歴
    max: 255

✅ FireTV視聴中フラグ(input_boolean.fire_tv_watching

FireTV視聴中の間、ステータスをONにします。

configuration.yaml
input_boolean:
  fire_tv_watching:
    name: Fire TV 視聴中フラグ
    initial: off

このエンティティの状態を history_statsutility_meter を使って集計していきます。

視聴時間の記録方法

✅ 短期間のデータ取得(1時間ごとの視聴時間)

  • history_statsセンサーを使用
  • input_booleanを利用し、00分00秒〜59分59秒の間でhistory_statsセンサーがONの時間を集計
configuration.yaml
sensor:
  - platform: history_stats
    name: Fire TV 1時間ごとの視聴時間
    entity_id: input_boolean.fire_tv_watching
    state: "on"
    type: time
    start: "{{ now().replace(minute=0, second=0) }}"
    end: "{{ now().replace(minute=59, second=59) }}"

✅ 長期間のデータ保存(1日ごとの視聴時間)

  • utility_meterを使用し、1日ごとの視聴時間を蓄積
  • 1時間ごとの視聴時間を集計するhistory_statsセンサーを利用
configuration.yaml
utility_meter:
  fire_tv_daily_watch_time:
    source: sensor.fire_tv_hourly_watch_time
    cycle: daily

✅ 当日の視聴時間を「〇〇時間〇〇分」で表示

  • templeteを使用し、当日の試聴時間を「〇〇時間〇〇分」のフォーマットに変換
  • 1日ごとの試聴時間を蓄積するutility_meterを使用
configuration.yaml
sensor:
  - platform: template
    sensors:
      fire_tv_total_daily_watch_time_human:
        unique_id: fire_tv_total_daily_watch_time_human
        friendly_name: "Fire TV 本日の視聴時間"
        value_template: >-
          {% set total_minutes = (states('sensor.fire_tv_daily_watch_time') | float(0) * 60) | int %}
          {% set hours = total_minutes // 60 %}
          {% set minutes = total_minutes % 60 %}
          本日の視聴時間 {{ hours }}時間{{ minutes }}分

オートメーション設定

FireTVの視聴時間を記録するためのオートメーションを設定します。

✅ 視聴開始したら視聴中フラグをONにしてアプリ名を記録する

以下の条件がすべて一致した場合、input_boolean.fire_tv_watchingのフラグをON(true)にして、input_text.fire_tv_watch_historyに視聴中のアプリ名を記録する。

【条件】

  • media_player.fire_tvの状態がplayingに変化する
  • input_text.fire_tv_watch_historyの値とFireTVのsource(アプリ名)の値が一致しない
automations.yaml
- id: fire_tv_start_time_log
  alias: Fire TV 視聴中フラグONと視聴中アプリを記録
  trigger:
  - platform: state
    entity_id: media_player.fire_tv
    to: playing
  condition:
  - condition: template
    value_template: '{{ states(''input_text.fire_tv_watch_history'') != state_attr(''media_player.fire_tv'',
      ''source'') }}'
  action:
  - service: input_text.set_value
    target:
      entity_id: input_text.fire_tv_watch_history
    data:
      value: '{{ state_attr(''media_player.fire_tv'', ''source'') }}'
  - service: input_boolean.turn_on
    target:
      entity_id: input_boolean.fire_tv_watching

✅ 視聴終了したら視聴中フラグをOFFにしてアプリ名をクリアする

以下の条件がすべて一致した場合、input_boolean.fire_tv_watchingのフラグをOFF(false)にして、input_text.fire_tv_watch_historyに"None"を記録する。

【条件】

  • FireTVの状態が以下のいずれかに変化する
     idle
     standby
     off
  • 現在のinput_text.fire_tv_watch_historyの値が"None"以外
automations.yaml
- id: fire_tv_watch_history_log
  alias: Fire TV 視聴中フラグOFFと視聴中アプリ名をクリア
  trigger:
  - platform: state
    entity_id: media_player.fire_tv
    to: idle
  - platform: state
    entity_id: media_player.fire_tv
    to: standby
  - platform: state
    entity_id: media_player.fire_tv
    to: 'off'
  condition:
  - condition: template
    value_template: '{{ states(''input_text.fire_tv_watch_history'') != ''None'' }}'
  action:
  - service: input_text.set_value
    target:
      entity_id: input_text.fire_tv_watch_history
    data:
      value: None
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.fire_tv_watching

✅ 00分になったら各センサーの状態を更新する

00分ちょうどにセンサーの情報を更新しないと、前の時間帯の最大値が今回の時間帯に含まれてしまい、正しい時間が集計できなくなるため、00分ちょうどで集計データをリセットする。

automations.yaml
- id: fire_tv_reflesh_1hour_log
  alias: Fire TV 1時間ごとの視聴時間を更新
  trigger:
  - platform: time_pattern
    minutes: "0"
  actions:
  - target:
      entity_id: sensor.fire_tv_hourly_watch_time
    action: homeassistant.update_entity
    data: {}

グラフで視聴時間を見える化する

視聴時間をグラフ化するために、apexcharts-cardmushroomのカスタムカードを使用しました。
どちらもHACSからインストールできます。

✅ 1時間ごとの視聴時間を棒グラフにする(ApexCharts)

type: custom:apexcharts-card
header:
  title: Fire TV 本日の視聴時間
  show: true
graph_span: 24h
series:
  - entity: sensor.fire_tv_hourly_watch_time
    type: column
    name: 1時間ごとの視聴時間
    group_by:
      func: max
      duration: 1h

✅ 1週間分の視聴時間を棒グラフで可視化

type: custom:apexcharts-card
header:
  title: Fire TV 直近7日間の視聴時間
  show: true
graph_span: 7d
series:
  - entity: sensor.fire_tv_daily_watch_time
    type: column
    name: 1日ごとの視聴時間
    group_by:
      func: max
      duration: 1d

✅ 当日の視聴時間を「〇〇時間〇〇分」のフォーマットで可視化

type: custom:mushroom-title-card
title: "{{ states('sensor.fire_tv_total_daily_watch_time_human') }}"

苦労したこと

  • データの集計方法の選定
    • history_statsutility_meterなど、どの方法で記録するかを決めるのに時間がかかった
    • 後から「1日ごとの視聴時間」も集計したくなり、構成を変更することになった
  • ApexChartsの設定調整
    • statistics-graphでは希望する表示ができず、apexcharts-cardに変更した
  • HomeAssistantの再起動とキャッシュの問題
    • HACSでapexcharts-cardをインストールしたが、ダッシュボードに表示されなかった
    • リソースの再読込」「ブラウザのキャッシュ削除」などを試して解決

まとめ

今回、HomeAssistantを使ってFireTVの視聴時間を記録し、可視化する仕組みを作りました。

データの記録方法をしっかり設計しないと、後から変更が大変になるということも実感しました。
特に、後でこのデータをどう使うか?を考えておくことが重要だと感じました。

今後は、アプリごとの使用時間を円グラフで可視化する機能 も追加していきたいと考えています。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?