Sports Standings and Scores

                    - attributes:
                        label: SOS
                        icon: mdi:calendar-blank
                      card:
                        type: custom:decluttering-card
                        template: sos_settings
                        variables:
                          - title: NHL Strength of Schedule
                          - entity: sensor.hockey_strength_of_schedule
                          - attribute: sos.dataRows

If you have the same sensor, the ā€œattributeā€ variable is ā€œsos.dataRowsā€ not just ā€œsosā€

ā€œsos.dataRowsā€ is the table parent. You iterate over teams inside that structure. Keep in mind that the SOS Schedule and the Starting Goalies are siurced from different sites so that do not necessarily have the same structure as ESPN.

Oh friend, that was my mistake, it works now. Sorry for that silly error

No problem! Enjoy.
Over the holidays I may work on some other stats related to fantasy

Hi Bob,

I put the x’s in the ip address in order the shield my ip address for this. I’ve also tried the DNS address with the same results.

Lou

http or https???

that’s fine - 192.x.x.x are IP’s are private so no way really to get to yours but good practice to think about it any way.

So in my example: `### NCAAF Bowl Games

This example Sensor is then pointing to cfb_regular_bowls.json in the Home Assistant /config/www directory.

Here is what I see:
image

In your example you should see somefile.json in your /config/www directory. Do you have that?

If you do then move on to the next step - go into settings->entities and search for your sensor. What do you see?

If it is there go onto the next step - click on the sensor and then cogwheel. What do you see? I see this

If you have been playing around (like I do all the time) sometimes this get changed with an extra extension - change it if needed)

Post your data and I will absolutely try to help.

When I go to the settings → entities and enter ncaaf_regular_bowl_games I get No data is the response. I just tried https://mydomain.duckdns.org:8123/local/cfb_regular_bowls.json, https://192.168.xxx.xxx:8123/local/cfb_regular_bowls.json and nothing.

Hopefully this will help, agsain, I haven’t been able to find a fix for it in any discussions. Error connecting https://192.168.1.114:8123/local/cfb_championship.json failed with Cannot connect to host 192.168.1.114:8123 ssl:True [SSLCertVerificationError: (1, ā€œ[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: IP address mismatch, certificate is not valid for ā€˜192.168.1.114’. (_ssl.c:1032)ā€)]

After sleeping on this, I finally got it to work, https://nabu.caca.link/local/somefile.json, although I have no idea why this approach worked and not the http://192.168.x.xxx:8123/local/somefile.json.

Nice. Are things populating now?

As far as why, My guess is that the HTTPS certificate is tied to the DNS name but not the IP address or maybe a router/NAT problem? So it I’m not sure. It would interesting to test it with http vs https.

I keep everything in HA within my household and don’t open up to real world, so I leave the configs and access simple.

It is populating.

RIght now I’m looking at it from a remote location so it could be my link back home that’s slow.

Thank you very much for your help in this.

Cool let me know. I am playing around with updating another option for the card as well.

This one has scrolling text and scores by quarter. I have added it to github and you will need to change the calls to this: sports_playoffsv5_withsquarterscores. Here is an example:

 type: custom:decluttering-card
                                            template: sports_playoffsv5_withsquarterscores
                                            variables:
                                              - title: All Bowl Games 
                                              - color: '#003087'
                                              - entity: sensor.ncaaf_all_bowl_games
                                              - news_sensor: sensor.ncaaf_latest_news
                                              - news_articles: articles
                                              - events: events
                                              - show_rankings: true
                                              - show_series: false
                                              - show_broadcast: true

bowlswithgrid

I need to see how it works with tomorrow’s Salute to Veterans Bowl - but its a work in progress. I haven’t seen it through a live game yet.

One more important point - this design is paying respect to @vasqued2 team-tracker design. What he has done is amazing.

This is what tomorrow’s bowl looks like right now.

Feel free to fix, update, change or lambast :wink:

Admittedly, since it’s a lot of copy/paste, I used AI to clean up this YAML code. However, I can’t seem to get it to only show the home game instead of showing home and away team, duplicating the card. What am I missing, any suggestions? Code and screenshot below.

type: horizontal-stack
cards:
  - type: vertical-stack
    cards:
      - type: markdown
        content: |
          ## šŸ’ Atlantic Division šŸ„…šŸšØ
      - type: custom:teamtracker-card
        entity: sensor.bos_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.buf_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.det_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.fla_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.mtl_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.ott_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.tbl_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.tor_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
  - type: vertical-stack
    cards:
      - type: markdown
        content: |
          ## šŸ’ Metropolitan Division šŸ„…šŸšØ
      - type: custom:teamtracker-card
        entity: sensor.car_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.cbj_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.njd_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.nyi_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.nyr_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.phi_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.pit_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.wsh_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
  - type: vertical-stack
    cards:
      - type: markdown
        content: |
          ## šŸ’ Central Division šŸ„…šŸšØ
      - type: custom:teamtracker-card
        entity: sensor.ari_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.chi_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.col_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.dal_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.min_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.nsh_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.stl_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.wpg_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
  - type: vertical-stack
    cards:
      - type: markdown
        content: |
          ## šŸ’ Pacific Division šŸ„…šŸšØ
      - type: custom:teamtracker-card
        entity: sensor.ana_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.cgy_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.edm_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.lak_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.sjs_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.sea_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.van_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
      - type: custom:teamtracker-card
        entity: sensor.vgk_team_tracker
        can_interval: 1
        filter:
          - attribute: team_homeaway
            value: home
grid_options:
  columns: 48
  rows: auto

You may want to ask this in the team_tracker_card community but I don’t think you can filter the card like that - @vasqued2 wrote the card and is awesome he may be watching - but I think you would need to filter it first before it is displayed.

I don’t really follow NHL so I don’t have any active sensors but tested with NFL and it does what you are looking for. Put this in your decluttering template:

  game_stats_nhl_division:
    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: >
          {%- set team = '[[sensor]]' -%}


          {%- if states(team) != 'unknown' and state_attr(team, 'team_homeaway')
          == 'home' -%}
               {{{"type": "custom:teamtracker-card","entity": team,  "home_side": "right"}}},
          {%- endif -%}

and then call it like this

                              - type: markdown
                                content: |
                                  <h1>Testing</h1>
                              - type: custom:decluttering-card
                                template: game_stats_nhl_division
                                variables:
                                  - sensor: sensor.ana_team_tracker

Top top part, filtering the cards for home is how it was always done in the original code. What you use to display is your choice. My decluttering template is:

  game_stats:
    card:
      type: custom:auto-entities
      unique: true
      show_empty: false
      card:
        type: custom:layout-card
        layout_type: masonry
        width: 300px
        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" -%}
            {%- if team in state_attr('sensor.nfl_red_zone','teams') -%}
              {{{"type": "custom:teamtracker-card",
                "entity": team,
                "card_mod": {"style": "ha-card {\n\n    color:  black; \n    background-color:  #ffcccc; \n    box-shadow: 0 0 10px 5px red;\n}\n"},
                "home_side": "right"}}},
            {%- else -%}
              {{{"type": "custom:teamtracker-card",
                "entity": team, 
                "home_side": "right"}}},
            {%- endif -%}
            {%- endif -%}
            {%- endif -%}
            {%- endif -%}
          {%- endfor -%}
        exclude:
          - entity_id: '*team_tracker*'
      sort:
        method: attribute
        attribute: date

You will note that you exclude all away teams (because they are playing someone else at home) with:

{%- if state_attr(team, "team_homeaway") == "home" -%}

Also note: do NOT just copy/paste that. Understand it. Like for instance you do not have ā€œred zoneā€ for football implemented. That would fail because there would be no ā€œred_zoneā€ entity.

Hi Bob, didn’t mean to ghost you on this. It’s pulling the data, but sporadically. I wasn’t happy with the Nabu Casa connection and changed it back to DuckDNS, which caused my data pull to crash. Took over a week and a lot of changes to get it back to working again.

As for the scrolling , I’m not exactly sure where to make the change. Is it in the dashboard and do I overwrite that section, or just add it to it?

Lou

ha - no worries and I didn’t figure you ghosted me. Sometimes we get busy with life/work and it takes a bit for all of us to get back.

Are you seeing errors in the home-assistant.log? Are the json files being updated sporadically as well? This may be as simple as adjusting the automation. Let me know. btw My bowl automation looks like this:

alias: NCCAF College Bowl Games
description: ""
triggers:
  - minutes: /3
    trigger: time_pattern
conditions:
  - condition: time
    after: "00:00:00"
    before: "23:59:59"
  - condition: template
    value_template: >
      {{ now().date() >= as_datetime('2025-11-10').date() and now().date() <=
      as_datetime('2026-02-02').date() }}
actions:
  - data: {}
    action: shell_command.get_college_bowls
mode: single

As for scrolling are you talking about the scrolling text under the score after the game has completed? If so the code is in the sports_playoffsv5_withsquarterscores decluttering template. I was using it more to play around with to see if it is updated during the game (respectfully copying Vasqued TT card layout), it is not. You can see the code by calling it like this:

- type: custom:decluttering-card
                                            template: sports_playoffsv5_withsquarterscores
                                            variables:
                                              - title: All Bowl Games
                                              - color: '#003087'
                                              - entity: sensor.ncaaf_all_bowl_games
                                              - news_sensor: sensor.ncaaf_latest_news
                                              - news_articles: articles
                                              - events: events
                                              - show_rankings: true
                                              - show_series: false
                                              - show_broadcast: true

Also, if you do play with the sports_playoffsv5_withsquarterscores template I just updated it on github, along with the new python changes to support what I wanted to add. Conferences,etc. More cosmetic than anything else.

Love what you are doing w/ the bowls. To answer your question about filtering out away games, the approach @bburwell outlined is how I do it too.

Happy New Year to All.

For those using my Playoff dashboards a couple updates to NFL All changes are on my github page.

Post Season is populating and you will need to change the sensor to pull the data. Template still filters the events just like last year. Here is the date resource update in the nfl_sensors.yaml file:

######################### Post Season Playoffs Superbowl
- platform: rest
  scan_interval: 604800
  name: NFL Playoffs Superbowl
  unique_id: sensor.nfl_playoffs_superbowl
  #2025 resource: https://site.api.espn.com/apis/site/v2/sports/football/nfl/scoreboard?dates=20250111-20250215
  resource: https://site.api.espn.com/apis/site/v2/sports/football/nfl/scoreboard?dates=20260103-20260208
  value_template: "{{ now() }}"
  json_attributes:
      - leagues
      - events

I have also added the new format from the CFP-College Bowls as an NFL tab to the Sports_US_Professional Dashboard. You can see the new decluttering section - sports_playoffsv5_withsquarterscores.

I haven’t tested it out on the previous year but will adjust this weekend. Older format is still there.

Here is the old NFL Playoffs to Superbowl tab:

and here is the new one:

Hi everyone — I’m looking for a reliable API/data source for Olympic ice hockey (Milano-Cortina 2026), ideally both men’s and women’s tournaments.

I need full match data: schedule/fixtures, live scores/status, boxscores, play-by-play (if available), rosters, team/player stats, standings, and playoff bracket progression. Historical access (past Olympics / previous seasons) would be a plus.

Does ESPN expose Olympics hockey via the same endpoints pattern (e.g., something like hockey/mens-olympic-hockey and hockey/womens-olympic-hockey)? If so, what are the best working endpoints for:

  • scoreboard by date range
  • game summary/boxscore by event/gameId
  • team rosters and team schedules
  • tournament standings/bracket

If ESPN isn’t stable for this, what alternative official sources are best for programmatic access (IOC/Olympics, IIHF, etc.)?

Any pointers, working examples, or known limitations (rate limits, delays, reliability) would help.