Sports Standings and Scores

There you go, just plug in that to your original. I think this:

      {% set cteams = namespace(cteam=[]) %}
      {% for team in state_attr('sensor.ncaaf_rank','rankings')[0]['ranks'] %}
        {% set cteams.cteam = cteams.cteam + [team.team.abbreviation] %}
      {% endfor %}
      {{ cteams.cteam }}

Assuming you got the answers you wanted. I would play with that template and strip the spaces but it may not be required when adding them to the array. You could plug that into the template editor and see if you get an array with many items with each abbr.

Are ESPN API parameters standard or varied? I can pull the information I want from any sport as long as it’s from “/sport/league/scoreboard”. NHL for example, works perfectly for my needs.

https://site.api.espn.com/apis/site/v2/sports/hockey/nhl/scoreboard?seasontype=2&dates=20241008-{{ (now() - timedelta(days=1)).strftime(‘%Y%m%d’) }}

When I try to replicate that for “sport/league/team…/schedule”, I always receive the full season.

As an example, 'd like to view only completed Dallas Stars games. I’ve read all the API sites I can find. I continue to receive the full season almost as if nothging after /schedule/seasontype=*/ responds.

https://site.api.espn.com/apis/site/v2/sports/hockey/nhl/teams/DAL/schedule?seasontype=2&dates=20241008-{{ now().strftime(‘%Y%m%d’) }}

Ok this is embarrassing but I have to come clean so others don’t pull out their hair. I was working on separating the templates and sensors into their own files as I mentioned earlier. I had broken out the sensors and they all work fine. In my configuration.yaml the code is:

sensor: !include_dir_merge_list sensors/

I tried doing the same thing with Templates and no matter what, I couldn’t get them to work. So I went back to the single template.yaml file but like the dummy I am I continued to work on the template.yaml file in the template directory while my config was pointed at the orignal template.yaml in the config.

So the file I was working on was never seen by HA which is why there were no entities.

Now on a positive note my original code works as expected as does @kbrown01 's.

I appreciate the assistance and patience - oh boy

I found the problem, the color code was the problem. Now I wrote the name of the color and it works.

@kbrown01 did the NHL standings resource change? My pre-season worked fine and shows the correct stats and rankings, but regular season is completely blank. There is data at that API endpoint though. Is this because the regular season just started?

If I have the “seasontype=1” I get pre-season (https://site.web.api.espn.com/apis/v2/sports/hockey/nhl/standings?seasontype=1&type=0&level=3)

If I have the “seasontype=2” I get nothing, but there is data. (https://site.web.api.espn.com/apis/v2/sports/hockey/nhl/standings?seasontype=2&type=0&level=3)

I analyzed this and I believe it is a bug in flex-table. I will investigate a workaround and have a temporary solution for now.

The issue comes from the “Last Ten” (L10) field. It contains a displayValue and summary that are like “1-0-0” or “1-0-0, 2 PTS” and for some reason this errors in flex-table.

The quick solution is to just remove that column in the decluttering template for L10:

        - name: <div>DIFF</div>
          data: '[[attribute]]'
          modify: x.stats.find(y=>y["abbreviation"] == 'DIFF').value
          
        - name: <div>L10</div>
          data: '[[attribute]]'
          modify: x.stats.find(y=>y["abbreviation"] == 'L10').displayValue
          
        - name: <div>STRK</div>
          data: '[[attribute]]'
          modify: x.stats.find(y=>y["abbreviation"] == 'STRK').value

Just remove the three lines of L10 for now. Possibly I need to add forcing it to a string or something and I will test, but without L10, this will get you going.

Although … oddly enough HOME and AWAY fields work so possible its the name “L10”

Update, I have no idea why flex-table is throwing the error so I have posted here:

OK. more diagnosis and likely the solution:

It looks like the field L10 is not in the data for any team that has not yet played. This will go away in a few days or you can just remove that and re-add it. Or you can use the same code as CLINCH that ensures the field exists and if it doesn’t display whatever you wish.

For me, I am just removing until Friday.

1 Like

Thanks! I implemented the same fix as for the clinch column and that worked. Now to figure out why the overall or league standings tab is blank.

        - name: <div>L10</div>
          data: '[[attribute]]'
          modify: >-
            if(typeof x.stats.find(y=>y.abbreviation == 'L10') !== 'undefined'
            ){x.stats.find(y=>y["abbreviation"] == 'L10').summary}else{'-'}

I implemented this also, works.
My other tabs also work so you have a different error with them.

Yep, that’s the same code I just added. Also fixed my overall standings tab. I had added some template sensors for pre-season and forgot to exclude the additional sensors in the decluttering card where I used a wildcard entity.

Hello all! Just wondering if anyone has any issues with the NBA tab for scores and the logos/names going off the cards. I think with the scores over 100 the characters are getting moved too much to the right? Wondering if i have something missing in my code. Thanks in advance for the help!

I’m using a PC but this is what my postgame NBA cards looks like right now.

I like having all of the PRE,IN,POST on the same page so if I zoom out this is what the pre games cards show and nothing in live yet.

Also - I am just using the stock game-stats template @kbrown01 created. I change the cards for NCAAF because I like them smaller on the pages. This still is a work in progress but you get the drift.

I am running into the Template exceeding max size error with some of my NCAAF conference sensors now. Is there a way around this or do I just need to limit what I am grabbing?

Specifically the atlantic_coast_conference [1] and the big_ten_conference [3]

image
Here is the api I’m calling:

- platform: rest
  scan_interval: 36000
  name: College Football Standings
  unique_id: sensor.college_football_standings
  resource: https://site.web.api.espn.com/apis/v2/sports/football/college-football/standings?seasontype=2&type=0&level=3
  value_template: "{{ now() }}"
  json_attributes:
    - children     

and here is the code I using to create the sensor. Thanks for any ideas.

- name: big_ten_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[3]['standings']['entries'] }}"

What max size error? You mean the warning that the attributes are too large so they are not in history ?

@kbrown01 I don’t think that that is it. The error that is shown above only appears with the sensors that grab the [1] and [3] child. I get the error shown and the sensor is not populated.

Sensor.big_ten_conference looks like this now:

Where as the big 12 conference is fine:

I have recorder shutting those off to the best of its abilities:

  
recorder:
  exclude:
    entity_globs:
      - sensor.mlb_*
      - sensor.nfl_*
      - sensor.nhl_*
      - sensor.nba_*
      - sensor.wnba_*
      - sensor.ncaaf_*

and I am just grabbing the children for the sensor:

#
## College Football Standings
##
- name: american_athletic_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[0]['standings']['entries'] }}"
- name: atlantic_coast_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[1]['standings']['entries'] }}"
- name: big_12_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[2]['standings']['entries'] }}"
- name: big_ten_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[3]['standings']['entries'] }}"
- name: conference_usa
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[4]['standings']['entries'] }}"
- name: fbs_independents
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[5]['standings']['entries'] }}"
- name: mid_american_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[6]['standings']['entries'] }}"
- name: mountain_west_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[7]['standings']['entries'] }}"
- name: pac12_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[8]['standings']['entries'] }}"
- name: southeastern_conference
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[9]['standings']['entries'] }}"
- name: sun_belt_conference_east
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[10]['children'][0]['standings']['entries'] }}"
- name: sun_belt_conference_west
  state: "{{ now() }}"
  attributes:
    entries: "{{ state_attr('sensor.college_football_standings','children')[10]['children'][1]['standings']['entries'] }}"  

The logs show this specific error on only these 2. But what I don’t understand is that these values are beingin pulled from another sensor (sensor.college_football_standings) which clearly contains the values and doesn’t error out.

homeassistant.exceptions.TemplateError: Template output exceeded maximum size of 262144 characters
2024-10-12 07:09:55.782 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('Template output exceeded maximum size of 262144 characters') while processing template 'Template<template=({{ state_attr('sensor.college_football_standings','children')[1]['standings']['entries'] }}) renders=4>' for attribute 'entries' in entity 'sensor.atlantic_coast_conference'
2024-10-12 07:09:55.892 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template<template=({{ state_attr('sensor.college_football_standings','children')[3]['standings']['entries'] }}) renders=2>
Traceback (most recent call last):

Hello @ehcah, I need help with your code. I added it to my code and I get an error message

type: custom:flex-table-card
entities:
  include: sensor.bundesliga_tabelle
  exclude: zwave.unknown_node*
columns:
  - name: Platz
    data: entries
    modify: |-
      if (x.stats[10].value >=17 )
         '<div style="background-color: red;">' + x.stats[10].value + '</div>' ;
      else if (x.stats[10].value >=16 )
         '<div style="background-color: orange;">' + x.stats[10].value + '</div>';
      else if (x.stats[10].value >=7 )
         '<div style="background-color: black;">' + x.stats[10].value + '</div>';
      else if (x.stats[10].value <=4 )
         '<div style="background-color: green;">' + x.stats[10].value + '</div>';         
      else if (x.stats[10].value <=6 )
         '<div style="background-color: blue;">' + x.stats[10].value + '</div>';         
    align: center
  - name: <div style="text-align:center;">TREND</div>
    data: "[[entries]]"
    modify: >-
      if (typeof x !== 'undefined' && typeof x.current !== 'undefined' && typeof
      x.previous !== 'undefined') {
        let content = '';
        let icon = '';
        let text = '';

        if (x.current === x.previous) {
          icon = '<ha-icon icon="mdi:minus" style="fill:white;"></ha-icon>';
        } else {
          let difference = x.current - x.previous;
          if (difference > 0) {
            icon = '<ha-icon icon="mdi:arrow-down" style="color:red;"></ha-icon>';
            text = '<div style="font-size:14px;color:red;">' + difference + '</div>';
          } else if (difference < 0) {
            icon = '<ha-icon icon="mdi:arrow-up" style="color:green;"></ha-icon>';
            text = '<div style="font-size:14px;color:green;">' + Math.abs(difference) + '</div>';
          }
        }

        content = '<div style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;">' +
                  icon + 
                  (icon && text ? '<div style="margin-left:5px;">' + text + '</div>' : text) +
                  '</div>';
        content;
      } else {
        '';
      } ```
  - name: Team
    data: entries
    modify: |-
      if (typeof x.team.logos !== 'undefined')
        '<div><img src="' + x.team.logos[0].href + '" style="height:20px;vertical-align:middle;">&nbsp;' + x.team.displayName + '</div>'
      else
        '<div><span style="display: inline-block;width: 20px;"></span>&nbsp;' + x.team.displayName + '</div>'
  - name: Sp
    data: entries
    modify: x.stats[0].value
    align: center
  - name: S
    data: entries
    modify: x.stats[7].value
    align: center
  - name: U
    data: entries
    modify: x.stats[6].value
    align: center
  - name: "N"
    data: entries
    modify: x.stats[1].value
    align: center
  - name: Tor- Verhältniss
    data: entries
    modify: |-
      {
        x.stats[5].value +
            " : " +
        x.stats[4].value
      }
    align: center
  - name: Differenz
    data: entries
    modify: x.stats[2].value
    align: center
  - name: Pkt.
    data: entries
    modify: x.stats[3].value
    align: center
strict: false
css:
  tbody td:nth-child(0)+: "width: 250px;"
  tbody tr td:nth-child(10): "background-color: green; color: white;"
  tbody tr td:nth-child(5): "color: green;"
  tbody tr td:nth-child(6): "color: yellow;"
  tbody tr td:nth-child(7): "color: red;"
  table+: "padding: 0px; width: 100%; border-collapse: collapse; margin-top:12px;"
  tbody tr td:first-child: "width: 1%;"
  tbody tr td:nth-child(2): "width: 1%;"
  tbody tr td:nth-child(3): "width: 20%;"
  tbody tr td:nth-child(n+4): "width: 1%;"
  tbody tr:hover: "background-color: dimgrey!important; color:white!important;"
  tbody tr:nth-child(4): "border-bottom: 2px solid green!important;"
  tbody tr:nth-child(5): "border-bottom: 2px solid dodgerblue!important;"
  tbody tr:nth-child(6): "border-bottom: 2px solid dodgerblue!important;"
  tbody tr:nth-child(16): "border-bottom: 2px solid crimson!important;"
  tbody tr:nth-child(15): "border-bottom: 2px solid yellow!important;"
card_mod:
  style:
    .: |
      ha-card {
        overflow: auto;
        }
    $: |
      .card-header {
         padding-top: 6px!important;
         padding-bottom: 4px!important;
         font-size: 20px!important;
         line-height: 14px!important;
         font-weight: bold!important;
       }

Hello @23Phantom08. I am by no means the expert in efficient coding, but I’ll help however I can.

When looking at your code, you haven’t definded the cards or style you’re want to present. Using the basics of what @kbrown01 has shared previously and using as much of your code as possible, you’ll see the results in images below.

Also, have a look at your CSS values to ensure they are displaying what you’d like to see. 3rd child 20% width is a huge space on a laptop screen (I used 3% for the example). Also, some of the coloring, like “dimgrey” highlighting and “white” background are for my eyes as I use dark mode on just about everything.

The “Trend” column refers to x.current and x.previous. If you are pulling from the same ESPN API as I am, Rank “R” is offered, but Rank Change “RC” remains zero’s. I do not see Previous or Current values anywhere. Lastly, on the final row of the trend code snippet, you have extra characters after the closing " } " that is likely why you are not seeing any return on your screen.

Please note - These images are on my laptop with the browser window manually narrowed.


decluttering_templates:
  bundesliga_settings:
    card:
      type: custom:flex-table-card
      strict: false
      css:
        table+: 'padding: 0px; width: 100%; border-collapse: collapse; margin-top:12px;'
        tbody td:nth-child(0)+: 'width: 250px;'
        tbody tr td:nth-child(5): 'color: green;'
        tbody tr td:nth-child(6): 'color: yellow;'
        tbody tr td:nth-child(7): 'color: red;'
        tbody tr td:nth-child(10): 'background-color: green; color: white;'
        tbody tr td:first-child: 'width: 1%;'        
        tbody tr td:nth-child(2): 'width: 1%;'
        tbody tr td:nth-child(3): 'width: 3%;'
        tbody tr td:nth-child(n+4): 'width: 1%;'
        tbody tr:hover: 'background-color: dimgrey!important; color:white!important;'
        tbody tr:nth-child(4): 'border-bottom: 2px solid green!important;'
        tbody tr:nth-child(5): 'border-bottom: 2px solid dodgerblue!important;'
        tbody tr:nth-child(6): 'border-bottom: 2px solid dodgerblue!important;'
        tbody tr:nth-child(15): 'border-bottom: 2px solid yellow!important;'
        tbody tr:nth-child(16): 'border-bottom: 2px solid crimson!important;'
      card_mod:
        style:
          .: |
            ha-card {
              overflow: auto;
              }
          $: |
            .card-header {
               padding-top: 6px!important;
               padding-bottom: 4px!important;
               font-size: 20px!important;
               line-height: 14px!important;
               font-weight: bold!important;
             }
      entities:
        include: sensor.german_bundesliga
      sort_by: entries-
      columns:
        - name: Platz
          data: entries
          modify: |-
            if (x.stats[10].value >=17 )
               '<div style="background-color: red;">' + x.stats[10].value + '</div>';
            else if (x.stats[10].value >=16 )
               '<div style="background-color: orange;">' + x.stats[10].value + '</div>';
            else if (x.stats[10].value >=7 )
               '<div style="background-color: black;">' + x.stats[10].value + '</div>';
            else if (x.stats[10].value <=4 )
               '<div style="background-color: green;">' + x.stats[10].value + '</div>';         
            else if (x.stats[10].value <=6 )
               '<div style="background-color: blue;">' + x.stats[10].value + '</div>';         
          align: center
        - name: <div style="text-align:center;">TREND</div>
          data: "[[entries]]"
          modify: >-
            if (typeof x !== 'undefined' && typeof x.current !== 'undefined' && typeof
            x.previous !== 'undefined') {
              let content = '';
              let icon = '';
              let text = '';
      
              if (x.current === x.previous) {
                icon = '<ha-icon icon="mdi:minus" style="fill:white;"></ha-icon>';
              } else {
                let difference = x.current - x.previous;
                if (difference > 0) {
                  icon = '<ha-icon icon="mdi:arrow-down" style="color:red;"></ha-icon>';
                  text = '<div style="font-size:14px;color:red;">' + difference + '</div>';
                } else if (difference < 0) {
                  icon = '<ha-icon icon="mdi:arrow-up" style="color:green;"></ha-icon>';
                  text = '<div style="font-size:14px;color:green;">' + Math.abs(difference) + '</div>';
                }
              }
      
              content = '<div style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;">' +
                        icon + 
                        (icon && text ? '<div style="margin-left:5px;">' + text + '</div>' : text) +
                        '</div>';
              content;
            } else {
              '';
            }
        - name: Team
          data: entries
          modify: |-
            if (typeof x.team.logos !== 'undefined')
              '<div><img src="' + x.team.logos[0].href + '" style="height:20px;vertical-align:middle;">&nbsp;' + x.team.displayName + '</div>'
            else
              '<div><span style="display: inline-block;width: 20px;"></span>&nbsp;' + x.team.displayName + '</div>'
        - name: Sp
          data: entries
          modify: x.stats[0].value
          align: center
        - name: S
          data: entries
          modify: x.stats[7].value
          align: center
        - name: U
          data: entries
          modify: x.stats[6].value
          align: center
        - name: "N"
          data: entries
          modify: x.stats[1].value
          align: center
        - name: Tor- Verhältniss
          data: entries
          modify: |-
            {
              x.stats[5].value +
                  " : " +
              x.stats[4].value
            }
          align: center
        - name: Differenz
          data: entries
          modify: x.stats[2].value
          align: center
        - name: Pkt.
          data: entries
          modify: x.stats[3].value
          align: center
  game_stats:
    card:
      type: custom:auto-entities
      unique: true
      show_empty: false
      card:
        type: custom:layout-card
        layout_type: masonry
        width: 200px
        max-columns: 5
      card_param: cards
      filter:
        template: |
          {%- for team in integration_entities("teamtracker") -%}
            {%- if state_attr(team, "league") == "[[sport]]" -%}
            {%- if states(team) == "[[status]]" -%}
            {%- if state_attr(team, "team_homeaway") == "home" -%}
              {{{"type": "custom:teamtracker-card",
                "entity": team, 
                "home_side": "right"}}},
            {%- endif -%}
            {%- endif -%}
            {%- endif -%}
          {%- endfor -%}
        exclude:
          - entity_id: '*team_tracker*'
      sort:
        method: attribute
        attribute: date
views:
  - theme: Backend-selected
    title: Sports
    type: panel
    icon: mdi:strategy
    badges: []
    cards:
      - type: custom:mod-card
        card_mod:
          style:
            tabbed-card $: |
              mwc-tab {
                background: var(--ha-card-background, var(--card-background-color, white) );
                border-color: black;
                border-width: 2.5px;
                border-top-left-radius: 20px;
                border-top-right-radius: 20px;
                border-style: solid;
                overflow: hidden;
                width: 12%;
              }
              mwc-tab[active] {
                background: silver !important;
              }
        card:
          type: custom:tabbed-card
          styles:
            '--mdc-theme-primary': black
            '--mdc-tab-text-label-color-default': silver
            '--mdc-typography-button-font-size': 12px
          tabs:
            - attributes:
                label: Bundesliga
                icon: mdi:soccer
              card:
                type: custom:mod-card
                card_mod:
                  style:
                    tabbed-card $: |
                      mwc-tab {
                        background: var(--ha-card-background, var(--card-background-color, white) );
                        border-color: black;
                        border-width: 2.5px;
                        border-top-left-radius: 20px;
                        border-top-right-radius: 20px;
                        border-style: solid;
                        overflow: hidden;
                        width: 16%;
                      }
                      mwc-tab[active] {
                        background: #d20515 !important;
                      }
                card:
                  type: custom:tabbed-card
                  styles:
                    '--mdc-theme-primary': white
                    '--mdc-tab-text-label-color-default': silver
                    '--mdc-typography-button-font-size': 12px
                  tabs:
                    - attributes:
                        label: Table
                        icon: mdi:ballot
                      card:
                        type: custom:decluttering-card
                        template: bundesliga_settings
                        variables:
                          - title: League
                          - entity: null
                          - attribute: entries
                          - sort: x.stats.find(y=>y.shortDisplayName == 'PTS').value
                    - attributes:
                        label: Pre-Match
                        icon: mdi:soccer-field
                      card:
                        type: custom:decluttering-card
                        template: game_stats
                        variables:
                          - sport: BUND
                          - status: PRE
                    - attributes:
                        label: Live
                        icon: mdi:soccer
                      card:
                        type: custom:decluttering-card
                        template: game_stats
                        variables:
                          - sport: BUND
                          - status: IN
                    - attributes:
                        label: Post-Match
                        icon: mdi:blood-bag
                      card:
                        type: custom:decluttering-card
                        template: game_stats
                        variables:
                          - sport: BUND
                          - status: POST

Thanks for your answer @ehcah. Could it be that I’m missing a value to retrieve in my config.yaml or that I haven’t configured the decluttering card correctly?I don’t know much about it either, so I’m asking.:blush:

Hello @23Phantom08 For troubleshooting, there are a number of things you should validate. These are in no particular order, but will all help ensure your code will display correctly.

In your configuration.yaml file. Make sure you include the sensor.yaml and template.yaml lines. A standard install would inlude the following, at minimum.

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
template: !include template.yaml
sensor: !include sensor.yaml

Within your sensor.yaml

##
##  German Bundesliga
##
- platform: rest
  scan_interval: 14400
  name: german_bundesliga_standings
  unique_id: sensor.german_bundesliga_standings
  resource: https://site.web.api.espn.com/apis/v2/sports/soccer/ger.1/standings
  value_template: "{{ now() }}"
  json_attributes:
    - children

Within our template.yaml

  ##
  ##  German Bundesliga Table
  ##
  - name: german_bundesliga
    unique_id: sensor.german_bundesliga
    state: "{{ now() }}"
    attributes:
      entries: >-
        {{ state_attr('sensor.german_bundesliga_standings','children')[0]['standings']['entries'] }}

Install all necessary cards from HACS.

Teamtracker - GitHub - vasqued2/ha-teamtracker: Home Assistant integration that provides real-time scores in multiple professional (NBA, NFL, NHL, MLB, MLS, and more), college (NCAA), and international (soccer, golf, tennis, mma, racing) sports using ESPN APIs.
Flex-Table - GitHub - custom-cards/flex-table-card: Highly Flexible Lovelace Card - arbitrary contents/columns/rows, regex matched, perfect to show appdaemon created content and anything breaking out of the entity_id + attributes concept
Layout - GitHub - thomasloven/lovelace-layout-card: 🔹 Get more control over the placement of lovelace cards.
Mod - GitHub - thomasloven/lovelace-card-mod: 🔹 Add CSS styles to (almost) any lovelace card
Tabbed - GitHub - kinghat/tabbed-card: a custom card for home assistant that utilizes tabs to segregate individual cards.
Stack-in - GitHub - custom-cards/stack-in-card: 🛠 group multiple cards into one card without the borders
Decluttering - GitHub - custom-cards/decluttering-card: 🧹 Declutter your lovelace configuration with the help of this card
*Multiscrape if you use @kbrown01 's NHL schedule

Assuming you replaced my sensor name with yours, in the code I shared above and you still aren’t seeing anyting. Use the HA Developer Tools to check the state of your sensor " sensor.bundesliga_tabelle ". You should be seeing something come back like this:

  • A note on my reference of “German” with Bundesliga. I used “english” for EFL, “french” for Ligue 1 etc… There is no intent behind my naming other than pointing towards a country or region for my own reference. I hope it’s obvious, but I don’t know who is reading and want to be clear.

Thanks @ehcah for the detailed answer, now I have more understanding. Great job,big thanks.:+1:t2::partying_face::partying_face::partying_face:

@23Phantom08 If this was helpful at all, I am happy!