337 lines
11 KiB
YAML
337 lines
11 KiB
YAML
|
|
homeassistant:
|
|
customize:
|
|
package.node_anchors:
|
|
package_name: &package_name "md"
|
|
common_attrs: &common_attrs
|
|
package: *package_name
|
|
templated: true
|
|
|
|
sensor.md_audio_owntone_now_playing:
|
|
friendly_name: "audio_owntone_now_playing.md"
|
|
<<: *common_attrs
|
|
|
|
sensor.md_audio_sonos_favs:
|
|
friendly_name: "audio_sonos_favs.md"
|
|
source_id_s1: "sensor.sonos_favorites_s1"
|
|
source_id_s2: "sensor.sonos_favorites_s2"
|
|
<<: *common_attrs
|
|
|
|
sensor.md_audio_owntone_media_players:
|
|
friendly_name: "audio_owntone_media_players.md"
|
|
<<: *common_attrs
|
|
|
|
sensor.md_packages:
|
|
friendly_name: "packages.md"
|
|
<<: *common_attrs
|
|
|
|
sensor.md_wwwsudois:
|
|
friendly_name: "wwwsudois.md"
|
|
<<: *common_attrs
|
|
|
|
sensor.template_md_testing_media_players:
|
|
friendly_name: "testing_media_players.md"
|
|
owntone_server: "owntone_server"
|
|
<<: *common_attrs
|
|
|
|
|
|
template:
|
|
- unique_id: md_audio
|
|
sensor:
|
|
- unique_id: owntone_now_playing
|
|
name: md_audio_owntone_now_playing
|
|
icon: |
|
|
mdi:cast-audio-variant
|
|
state: |
|
|
audio_owntone_now_playing.md
|
|
attributes:
|
|
md: |
|
|
{% set title = state_attr("media_player.owntone_server", "media_title") %}
|
|
{% set name = state_attr("media_player.owntone_server", "media_album_name") %}
|
|
{% set artist = state_attr("media_player.owntone_server", "media_artist") %}
|
|
{% set mediatype = state_attr("media_player.owntone_server", "media_content_type") %}
|
|
[{{ mediatype | capitalize }}] {{ name }} - {{ title }} | {{ artist }}
|
|
title: |
|
|
{% if state_attr("media_player.owntone_server", "media_content_type") =="podcast" %}
|
|
Playing podcast
|
|
{% else %}
|
|
Now playing
|
|
{% endif %}
|
|
|
|
- unique_id: sonos_favs
|
|
name: md_audio_sonos_favs
|
|
icon: |
|
|
mdi:star
|
|
availability: |
|
|
{{
|
|
has_value(this.attributes.get("source_id_s1"))
|
|
and has_value(this.attributes.get("source_id_s2"))
|
|
}}
|
|
state: |
|
|
{{ state_attr(this.entity_id, "friendly_name") }}
|
|
attributes:
|
|
md: |
|
|
{% set s1 = state_attr(this.attributes.get("source_id_s1"), "items") %}
|
|
{% set s2 = state_attr(this.attributes.get("source_id_s2"), "items") %}
|
|
{% set sonos = [
|
|
{"name": "S1", "favs": s1},
|
|
{"name": "S2", "favs": s2},
|
|
] -%}
|
|
# Sonos favorites
|
|
|
|
{% for item in sonos -%}
|
|
## {{ item.name }}
|
|
|
|
{% if item.favs|length > 0 -%}
|
|
| Name | Value |
|
|
|:-----------|:--------|
|
|
{% for k, v in item.favs.items() -%}
|
|
| `{{ k }}` | {{ v }} |
|
|
{% endfor %}
|
|
{% endif %}
|
|
|
|
{% endfor %}
|
|
|
|
#"source",
|
|
- unique_id: owntone_media_players
|
|
name: md_audio_owntone_media_players
|
|
icon: |
|
|
mdi:cast-audio-variant
|
|
state: |
|
|
audio_owntone_media_player.md
|
|
attributes:
|
|
md: |
|
|
# `media_player` attrs
|
|
|
|
- [OwnTone stream](https://hass.sudo.is/_media/owntone)
|
|
|
|
{%
|
|
set player_id = [
|
|
"apple_tv",
|
|
"owntone_mpd",
|
|
"owntone_server",
|
|
"esphome_muse",
|
|
"sonos_livingroom",
|
|
"vlcd",
|
|
"sonos_bedroom",
|
|
"dlna_bedroom",
|
|
"owntone_output_bedroom",
|
|
"bedroom",
|
|
"owntone_output_fifo",
|
|
] | map("regex_replace", "^", "media_player.")
|
|
-%}{%
|
|
set skip_attrs = [
|
|
"friendly_name",
|
|
"source_list",
|
|
"media_position",
|
|
"media_duration",
|
|
"media_track",
|
|
"media_title",
|
|
"media_artist",
|
|
"media_album_name",
|
|
"media_album_artist",
|
|
"media_content_type",
|
|
"media_content_id",
|
|
"media_position_updated_at",
|
|
"entity_picture",
|
|
"shuffle",
|
|
"repeat",
|
|
"supported_features",
|
|
"device_class",
|
|
]
|
|
-%}{%
|
|
set n = 15
|
|
-%}
|
|
|
|
{% for item in player_id -%}
|
|
{% set attrs = states[item].attributes -%}
|
|
{% set friendly_name = attrs.get("friendly_name", item.entity_id) -%}
|
|
{% set title = attrs.get("media_title", "missing metadata").replace(" | ", " - ").split("?authSig=")[0] -%}
|
|
{% set pos = attrs.get("media_position", 0.0)|round(1) / attrs.get("media_duration", 1.0)|round(1) * 100 -%}
|
|
{% set img = attrs.get("entity_picture") -%}
|
|
{% set s = states(item) -%}
|
|
## {{ friendly_name }}
|
|
|
|
State: `{{ states(item) }}` at {{ pos|round(0) }}%
|
|
|
|
{# /local/images/menu/play-16.png -#}
|
|
<ha-icon icon="mdi:{% if s == "playing" %}play{% else %}pause{% endif %}"></ha-icon> _{{ title }}_
|
|
<ha-icon icon="mdi:cast-audio-variant"></ha-icon> {{ attrs.get("media_content_type", "Audio item").capitalize() }} _{{ attrs.get("media_album_name") }}_ by _{{ attrs.get("media_artist") }}_.
|
|
<ha-icon icon="mdi:file"></ha-icon> `{{ attrs.get("media_content_id") }}`
|
|
|
|
{% if img -%}
|
|
<div style="text-align: center; margin-right: auto">
|
|
<img src="{{ img }}" {% if img.endswith(".svg") %}width="20%"{% endif %}>
|
|
<p>
|
|
<a href="https://hass.sudo.is{{ img }}">
|
|
<code>
|
|
{{ img.split("?")[0] }}
|
|
</code>
|
|
</a>
|
|
</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if attrs|length > 0 -%}
|
|
> | Attribute | Value |
|
|
> |----------:|----------:|
|
|
{% for k, v_ in attrs|items -%}
|
|
{% if k not in skip_attrs or attrs.get("media_title") is none -%}
|
|
{% set v = v_ | string -%}
|
|
> | `{{ k }}` | `{% if v|length>n %}...{% endif %}{{ v[-n:].strip() }}`
|
|
{% endif -%}
|
|
{% endfor %}
|
|
{% endif %}
|
|
|
|
{% if attrs.get("media_title") is none -%}
|
|
_All available attributes are shown for this `media_player` entity, due to missing metadata._
|
|
{% endif %}
|
|
|
|
{% if attrs.get("source_list", [])|length > 0 -%}
|
|
{% set sl = attrs.get("source_list") -%}
|
|
### Source
|
|
|
|
{% if attrs.get("source") -%}
|
|
**Source**:
|
|
|
|
```text
|
|
{{ attrs.get("source") }}
|
|
```
|
|
{% endif -%}
|
|
|
|
|
|
**Source list**: {{ sl|length }} items
|
|
|
|
{% for srcitem in sl[:3] -%}
|
|
- `{{ srcitem }}`
|
|
{% endfor %}
|
|
{% endif -%}
|
|
|
|
{% endfor %}
|
|
|
|
- sensor:
|
|
- unique_id: md_packages
|
|
name: md_packages
|
|
icon: |
|
|
mdi:package
|
|
state: |
|
|
packages.md
|
|
attributes:
|
|
md: |
|
|
{%
|
|
set in_transit = states("sensor.seventeentrack_packages_in_transit")
|
|
| int(0)
|
|
%}{%
|
|
set delivered = states("sensor.seventeentrack_packages_delivered")
|
|
| int(0)
|
|
%}{%
|
|
set expired = states("sensor.seventeentrack_packages_expired")
|
|
| int(0)
|
|
%}{%
|
|
set not_found = states("sensor.seventeentrack_packages_not_found")
|
|
| int(0)
|
|
%}{%
|
|
set pick_up = states("sensor.seventeentrack_packages_ready_to_be_picked_up")
|
|
| int(0)
|
|
%}{%
|
|
set returned = states("sensor.seventeentrack_packages_returned")
|
|
| int(0)
|
|
%}{%
|
|
set undelivered = states("sensor.seventeentrack_packages_undelivered")
|
|
| int(0)
|
|
%}{%
|
|
set total_pkgs = [
|
|
in_transit, delivered, expired, not_found, pick_up, returned, undelivered
|
|
] | sum
|
|
%}
|
|
|
|
# Packages
|
|
|
|
## Overview
|
|
|
|
{% if total_pkgs > 0 %}
|
|
| Status | Number of packages |
|
|
|:------------------|-----------------------------------:|
|
|
{% if not_found > 0 -%}
|
|
| **Not found** | {{ not_found }} pkgs |
|
|
{% endif -%}
|
|
{% if in_transit > 0 -%}
|
|
| In transit | {{ in_transit }} pkgs |
|
|
{% endif -%}
|
|
{% if delivered > 0 -%}
|
|
| Delivered | {{ delivered }} pkgs |
|
|
{% endif %}
|
|
{% else %}
|
|
> _Currently no tracked packages_.
|
|
{% endif %}
|
|
|
|
## In Transit
|
|
|
|
{% if in_transit > 0 -%}
|
|
{% for package in states.sensor.seventeentrack_packages_in_transit.attributes.packages %}
|
|
|
|
1. **{{ package.friendly_name }}** ( `{{ package.tracking_number }}` )
|
|
{{ package.info_text }}
|
|
|
|
{% endfor %}
|
|
{% else %}
|
|
> _No tracked packages in transit._
|
|
{% endif %}
|
|
|
|
- unique_id: md_wwwsudois
|
|
name: md_wwwsudois
|
|
icon: |
|
|
mdi:git
|
|
state: |
|
|
wwwsudois.md
|
|
attributes:
|
|
md: |
|
|
# ![](https://www.sudo.is/favicon.ico)
|
|
|
|
| Name | [`wwwsudois`](https://git.sudo.is/ben/wwwsudois)
|
|
|:--------------------|----:
|
|
| Production released | {{states("sensor.sudo_is_version_date")}}
|
|
| Version | `{{states("sensor.sudo_is_version")}}`
|
|
| URL | [`www.sudo.is`](https://www.sudo.is)
|
|
| Build status | ![](https://www.sudo.is/api/buildstatus.png)
|
|
|
|
![](https://www.sudo.is/avatar/green_fade.png)
|
|
|
|
|
|
- unique_id: md_testing
|
|
sensor:
|
|
- unique_id: media_players
|
|
icon: |
|
|
mdi:cast-audio-variant
|
|
#picture: |
|
|
# {% set ot_server = this.attributes.get("owntone_server", "").strip() -%}
|
|
# {% if ot_server|length>0 -%}
|
|
# /api/media_player_proxy/media_player.{{ ot_server }}
|
|
# {% endif %}
|
|
availability: |
|
|
{{ true }}
|
|
state: |
|
|
testing_media_players.yaml
|
|
attributes:
|
|
md: |
|
|
# OwnTone `media_player`
|
|
|
|
**NOTE**: this is a test card.
|
|
|
|
This sensor return a Markdown document
|
|
with info about audio `media_player`
|
|
entities, mostly for OwnTone.
|
|
|
|
To render this document in Home Assistant,
|
|
create a Markdown card, and template this
|
|
entity:
|
|
|
|
```python
|
|
state_attr("sensor.template_md_testing_media_players", "md")
|
|
```
|
|
|
|
This way, the template is rendered on the
|
|
backend instead of on the client. And it
|
|
is also kept in source control.
|
|
|