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

# はじめに

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

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

をまとめました。


# やりたいこと（要件整理）
まず、どんな情報を記録・可視化したいのかを整理しました。

✅ **記録したい情報**
- 1時間ごとの視聴時間
- 1日ごとの視聴時間
- どのアプリ（Amazon Video / YouTube など）をどれくらい見たか

✅ **最終的にやりたいこと**
- リアルタイムで「今日の視聴時間」を表示する
- 1時間ごとの視聴時間を棒グラフで可視化する
- 1週間単位で視聴時間の推移を表示する
- アプリごとの使用割合を円グラフで表示する（←今後実装予定）


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/872d56cf-5001-4ce9-b3d8-48c425e6b857.png)


# HomeAssistantの構成イメージ

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/fd4f5959-c414-48ad-9802-d3e4981ee39c.png)


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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/ccc9ddc4-8eba-4f6c-aa3a-d144f222395c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/2de7ee63-18c3-4e6c-949a-e2745d8fdba2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/3b9a045f-326c-4fc6-aa74-bd6f4a333ff3.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/07640935-1093-4cda-ad1f-19334c57e926.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/667a792a-4538-4d8d-b9eb-f91616e48904.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/5d428e66-c7e7-4d61-8782-6fc5ee3a680e.png)

「Amazon Fire TV」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/9662b759-1668-4f48-843d-160c9a0d31f5.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/0223995b-d4dc-42e9-b39d-47ce850d1ffc.png)

Android Debug Bridgeで以下を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/572752cc-33f7-4ff0-afa4-2526c2b29724.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/db17ac64-4877-4a78-a21d-0b5385a57c9a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/5ddf1b61-fbd3-417c-b58d-e87454283771.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4016885/653faa0d-cde1-4b46-895b-a70003504a9c.png)

:::note info
エンティティ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視聴中のアプリ名を記録します。
```yaml:configuration.yaml
input_text:
  fire_tv_watch_history:
    name: Fire TV 視聴履歴
    max: 255
```

### ✅ FireTV視聴中フラグ（`input_boolean.fire_tv_watching`）
FireTV視聴中の間、ステータスをONにします。

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

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


# 視聴時間の記録方法

### ✅ 短期間のデータ取得（1時間ごとの視聴時間）
- `history_stats`センサーを使用
- `input_boolean`を利用し、00分00秒〜59分59秒の間で`history_stats`センサーがONの時間を集計

```yaml: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`センサーを利用

```yaml:configuration.yaml
utility_meter:
  fire_tv_daily_watch_time:
    source: sensor.fire_tv_hourly_watch_time
    cycle: daily
```

### ✅ 当日の視聴時間を「〇〇時間〇〇分」で表示
- `templete`を使用し、当日の試聴時間を「〇〇時間〇〇分」のフォーマットに変換
- 1日ごとの試聴時間を蓄積する`utility_meter`を使用

```yaml: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`（アプリ名）の値が一致しない

```yaml: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"以外

```yaml: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分ちょうどで集計データをリセットする。

```yaml: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-card`や`mushroom`のカスタムカードを使用しました。
どちらもHACSからインストールできます。

### ✅ 1時間ごとの視聴時間を棒グラフにする（ApexCharts）
```yaml
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週間分の視聴時間を棒グラフで可視化
```yaml
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
```

### ✅ 当日の視聴時間を「〇〇時間〇〇分」のフォーマットで可視化
```yaml
type: custom:mushroom-title-card
title: "{{ states('sensor.fire_tv_total_daily_watch_time_human') }}"
```


# 苦労したこと

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


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

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

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