Sports Standings and Scores

Let me know if I should be pinging @Ildar_Gabdullin in the flex-table but since this kind of crosses figured I would post here first.

I’m still on my quest to build out individual Conference cards as I posted above. The item I am adding now are the team schedules for the rest of the season.

I’m doing this by creating a sensor for each team - which is kind of what the api requires. Here is an example:

- platform: teamtracker
  league_id: "NCAAF"
  team_id: "ASU"
  sport_path: football   
  league_path: "college-football"  
  conference_id: 4
  name: "Arizona State University"
- platform: rest
  scan_interval: 36000
  name: NCAAf Arizona State University Schedule
  unique_id: sensor.ncaaf_arizona_state_university_schedule
  resource: http://site.api.espn.com/apis/site/v2/sports/football/college-football/teams/ASU/schedule
  value_template: "{{ now() }}"
  json_attributes:
      - team
      - events 

The Api includes some of the data in the team section and some in the events section so I pulled both. (Maybe I should just dump the api into a sensor?) Which gets me to my first idea:

  1. I would like to loop through the sensors that make up the conference. Starting with Big 12. Is that possible?
  2. Each card that is created means I need to pull some data from events and some from team - can we passs multiple sensosrs to the Flex-table Card? Specifically I want the Title to be dynamic (which definitely is a Flex-Table question)
  3. For what ever reason I cannot drill down to
- name: Record
          data: '[[events]]'
          x.competitions[0].competitors[0].record[0].displayValue

It won’t return the card.
It looks correct though:

This is the beginning of the card:

This is my template:

ncaa_team_schedules:
    card:
      type: custom:flex-table-card
      title: '[[title]]'
      css:
        table+: 'padding: 0px; width: 1000px;'
        tbody tr td:first-child: 'width: 5%;'
        tbody tr td:nth-child(2): 'width: 5%;'
        tbody tr td:nth-child(3): 'width: 5%;'
        tbody tr td:nth-child(4): 'width: 5%;'
        tbody tr td:nth-child(n+5): 'width: .5%;'
        tbody tr:hover: 'background-color: black!important; color:white!important;'
        tbody tr td:nth-child(7): 'background-color: green; color: white;'
      card_mod:
        style:
          .: |
            ha-card {
              overflow: auto;
              }
          $: |
            .card-header {
               padding-top: 6px!important;
               padding-bottom: 4px!important;
               font-size: 14px!important;
               line-height: 14px!important;
               font-weight: bold!important;
             }
      sort_by: events+
      entities:
        include: '[[entity]]'
        exclude: '[[excluded_entities]]'
      columns:
        - name: Game Time
          data: '[[events]]'
          modify: x.date.split('T')[0]
        - name: Teams
          data: '[[events]]'
          modify: x.shortName
        - name: Home Team
          data: '[[events]]'
          modify: >-
            '<div><img src="' +
            x.competitions[0].competitors[0].team.logos[0].href + '"
            style="height: 20px;vertical-align:middle;">&nbsp;' +
            x.competitions[0].competitors[0].team.displayName + '</div>'
        - name: Away Team
          data: '[[events]]'
          modify: >-
            '<div><img src="' +
            x.competitions[0].competitors[1].team.logos[0].href + '"
            style="height: 20px;vertical-align:middle;">&nbsp;' +
            x.competitions[0].competitors[1].team.displayName + '</div>'

And this is how I am calling it - thanks again to all.

                                      - type: custom:decluttering-card
                                        template: ncaa_team_schedules
                                        variables:
                                          - title: NCAA Big 12 Schedules
                                          - entity: >-
                                              sensor.ncaaf_arizona_state_university_schedule
                                          - events: events
                                          - team: team

I was hoping to pass a group to the FT. replacing sensor.ncaaf_arizona_state_university_schedule with this (eventually flushed out with all teams in the conference)

Big_12_Conference_teams_schedule_group:
    name: "Big 12 Conference Teams Schedule"
    entities:
      - sensor.ncaaf_arizona_state_university_schedule
      - sensor.ncaaf_university_of_arizona_schedule

Hi I hope somebody can help me.

I have this sensor in my configuration.yaml for soccer German 2.Bundesliga


 - platform: rest
   name: team_tracker_bund2_tabelle
   scan_interval: 3600 # 1 Tag // 3600sek = 1 Stunde
   resource: https://site.web.api.espn.com/apis/v2/sports/soccer/ger.2/standings?type=0&level=0
   value_template: "{{ now() }}"
   json_attributes_path: "$['children'][0]['standings']"
   json_attributes:
     - entries
	  

and this to display the standings on the Dashboard

	  type: custom:flex-table-card
entities:
  include: sensor.team_tracker_bund2_tabelle
columns:
  - name: Rang
    data: entries
    modify: x.stats[10].value
  - name: Logo
    data: entries
    modify: '''<img src="'' + x.team.logos[0].href + ''"style="width: 30%">'''
  - name: Mannschaft
    data: entries
    modify: x.team.name
  - name: Sp
    data: entries
    modify: x.stats[0].value
  - name: D
    data: entries
    modify: x.stats[2].value
  - name: Pkt
    data: entries
    modify: x.stats[3].value
	

I want to modify the custom:flex-table-card to display the up and down prior to previous standing like this

but I have no idea to do that

If I understand correctly, you would like to add a new column with an up and down graphic illustrating rank change? If this is correct, you can modify ’ x. ’ to meet your needs. You can also change the minus, arrow-down or arrow-up to other mdi icons if you wish. I removed the NR (not ranked) response as I don’t beleive you’ll want it.

        - name: <div style="text-align:center;">TREND</div>
          data: '[[attribute]]'
          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 {
              '';
            } ```

The challenge I see with your API is that it doesn’t have a previous rank value like we are using in the Top 25 Polls. Now it does have something called rankChange but it looks like every team is 0. Maybe nothing has happened over the past week. Maybe watch that one. I just can’t tell what rankchange does though.

If it doesn’t do anything to get what you want you would have to store the rank each week (like pushing the teams data into a db)

You can see that we are putting the previous rank in a column and then calculating on the current position to see if they are up/down. @ehcah and I use different methods but we are doing the same thing you can see here:

columns:
        - name: Rank
          data: '[[attribute]]'
          modify: x.current
        - name: Up-Down
          data: '[[attribute]]'
          modify: |-
            if (x.current == x.previous)
              '<ha-icon icon="mdi:minus" >'
            else if (x.current =="0")
              '<ha-icon icon="mdi:bomb" style="color:red;" >'
            else if (x.previous == "0")
              '<div><ha-icon icon="mdi:hand-clap" style="color:blue;"></ha-icon>&nbsp;' +  "New " + '</div>';
            else if (x.current > x.previous)
              '<div><ha-icon icon="mdi:arrow-down" style="color:red;"></ha-icon>&nbsp;' +  "Dn "+ (x.current - x.previous) + '</div>';
            else if (x.current < x.previous)
              '<div><ha-icon icon="mdi:arrow-up" style="color:green;"></ha-icon>&nbsp;' + "Up "+ (x.previous - x.current) + '</div>';

The API has the previous rank you can see here:
soccer

There is a rank section which you would sort on and then if rankChange shows the move up or down use that for arrows. There is updated code above that adds UP/DN, dropout-bomb and handclap for that column (snippet shown above, full code up in the thread)

I would recommend grabbing the rank and rankChange as columns and watch rankChange.

Ranks is here:
soccer3
rankChange is here:
soccer4

Anyone have an idea on why I can’t get the score from schedules?

Here is what I am testing:

I know that the scores are in score.displayValue or value as seen here:

I am testing it in the template editor with this code but if i put in .score.value or .score.[‘value’] I get an error that says
score2

but if I just use .score I get this - what am I doing wrong? I want to be able to have the home score and away score so i can calculate winner/loser.

{% set teams = state_attr('group.big_12_conference_teams_schedule_group', 'entity_id') %}
{% if teams %}
  {% for team in teams %}
    {% set events = state_attr(team, 'events') %}
    {% if events and events is not string %}
      {% for event in events %}
        Game Date: {{ event.date.split('T') }}
        Teams: {{ event.shortName }}
        Away Team: {{ '<div><img src="' + event.competitions[0].competitors[0].team.logos[0].href + '" style="height: 20px;vertical-align:middle;">&nbsp;' + event.competitions[0].competitors[0].team.displayName + '</div>' }}
        Home Score: {{ event.competitions[0].competitors[0].score }}
        Away Team: {{ '<div><img src="' + event.competitions[0].competitors[1].team.logos[0].href + '" style="height: 20px;vertical-align:middle;">&nbsp;' + event.competitions[0].competitors[1].team.displayName + '</div>' }}
        Attendence: {{ event.competitions[0].attendance }}
        Away Score: {{ event.competitions[0].competitors[1].score }}
  {% endfor %}
    {% else %}
      No events found for {{ team }}
    {% endif %}
  {% endfor %}
{% else %}
  No teams found
{% endif %}

@bburwell The API response is different when chosing a score value from schedule or scoreboard. What I can’t explain is why x.x.x.score offers a response when x.x.x.score.displayValue requires further definitiion as per below?

- name: CollegeFootballScoreboard
  data: '[[attribute]]'
  modify: x.competitions[0].competitors[0].score

vs.

- name: CollegeFootballTeamSchedule
  data: '[[attribute]]'
  modify: |-
    if (typeof x.competitions[0].competitors[0].score !== 'undefined') {
      x.competitions[0].competitors[0].score.displayValue;
    } else {
      '';
    } 

Hi there, I have not so much experince with HA but step by step I get this to work but there is one thing that i can’t figure out at the moment and I hope somebody can me explain hoe to solve this.

I get this Error in the Dashboard and I think there something missig but I have no idea.

See the declutterinig-card documentation to see how to install it.

At the bottom of this link GitHub - custom-cards/decluttering-card: :broom: Declutter your lovelace configuration with the help of this card

Thanks for that, you are my hero.

I thought i already installed that, but I didn’t. I’ve installed it and now it works!

1 Like

After a lot of try and error and many readings I have it running with the modifications to my needs. I’ve integrated the German ‘1.Bundesliga’ and ‘2.Bundesliga’.

Now my Question is : Is it possible to colorize the fields that i marked in the above picture?
The first 4 cells are qualified for CL the next 2 cells are for EL and the last cells are going down to second league.

My card :

decluttering_templates:
  nhl_settings:
    card:
      type: custom:flex-table-card
      entities:
        include: sensor.team_tracker_bund2_tabelle
      columns:
        - name: '#'
          data: entries
          modify: x.stats[10].value
        - name: Mannschaft
          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
        - name: S
          data: entries
          modify: x.stats[7].value
        - name: U
          data: entries
          modify: x.stats[6].value
        - name: 'N'
          data: entries
          modify: x.stats[1].value
        - name: Tore
          data: entries
          modify: |-
            {
              x.stats[5].value +
              " : " +
              x.stats[4].value
            }
        - name: D
          data: entries
          modify: |-
            {
              x.stats[5].value -
              x.stats[4].value
            }
        - name: Pkt
          data: entries
          modify: x.stats[3].value
      strict: true
      css:
        tbody td:nth-child(8)+: 'width: 40px;'
        tbody tr td:nth-child(9): 'background-color: green; color: white;'	  

any ideas?

Perfect thanks @ehcah

Guessing you could just do an if else else on that ‘#’ column - similar to the rankings up and down code. If ‘#’<=4 do this, if 5-6 do this and if =>16 do this. And the do this is something @kbrown01 worked on last year on the flex-table card here:https://community.home-assistant.io/t/flex-table-card/461173/53

Thanks @kbrown01 that was my error. Moving them around 1 of the files didn’t have sensor: at the top - that fixed it.

I figured it out . I think it’s not the perfect solution but for my needs it’s enough.

type: custom:flex-table-card
entities:
  include: sensor.team_tracker_bund_tabelle
columns:
  - name: Rank
    data: entries
    modify: |-
      if (x.stats[10].value >=16 )
         '<div style="background-color: #ff2c0a;">' + x.stats[10].value + '</div>';
      else if (x.stats[10].value >=5 )
         '<div style="background-color: #202124;">' + x.stats[10].value + '</div>';
      else if (x.stats[10].value <=4 )
         '<div style="background-color: #ea8109;">' + x.stats[10].value + '</div>';         
    align: center
  - name: Logo
    data: entries

Not sure if you were able to add lines to your template per @bburwell 's share? This is what I do. Add more lines, change them, change the color - your choice. I only define the top 4 (nth-child 4) and bottom 2 (nth-child 16).

  bundesliga_settings:
    card:
      type: custom:flex-table-card
      title: '[[title]]'
      css:
        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: 9%;'
        tbody tr td:nth-child(n+3): 'width: 3%;'
        tbody tr:hover: 'background-color: dimgrey!important; color:white!important;'
        tbody tr:nth-child(4): 'border-bottom: 1px solid dodgerblue!important;'
        tbody tr:nth-child(16): 'border-bottom: 1px solid crimson!important;'
      card_mod:
        style:
          .: |
            ha-card {
              overflow: auto;
              }
          $: |
            .card-header {
               padding-top: 6px!important;
               padding-bottom: 4px!important;
               font-size: 14px!important;
               line-height: 14px!important;
               font-weight: bold!important;
             }

@ehcah nice. Do you have a github page? I was going to start building out MLS and UEFA but it looks like you already have that built. Would love to copy those files, sensors, templates, etc. and pay you with heaps of Kudos :wink:

Thanks and nicely done!!!

@bburwell No github or pastebin. I’m sure I could figure something out though. Happy to share anything I have.

One challenge I’ve run into. With 570 + various sensors for sports alone, my HA server has been slowing down. As a result, I’ve start hashing out some sensors that aren’t required today. As mentioned above, I did update all my multiscrape sensors to rest or template.

Multiscrape: 1
Template: 69
Rest: 148
TeamTracker: 352

I actually pulled all sensors off my server and added them onto a fresh HA install on proxmox where I keep a few machines spun up for other purposes. I thought a dedicated HA Sports Dashboard machine would be the answer. This works well for a few days and then slows. My intention is to add it back as a webpage dashboard on my server.

Yeah I have been noticing the slowdown as well. That was why I asked the question earlier about splitting up the sensors and templates. I plan on streamlining the dashboards and looking to maybe create a seasonal rotation for sports I kind of follow and then keep the main ones year around. I am also going to play around at some point with polling.

Funny thing is that I originally started looking at this because I wanted to have a scrolling marquee that I send updates to a bunch of Hub75’s. Right now I’m just sending Padres updates to a couple WS2812B’s.

Because of @kbrown01 great work this has kind of turned into something akin to eating potato chips - you think you can stop after a couple but there is always another tempting option to chose

2 Likes

Do we have any MLB playoff views yet?

I was looking at what @mandolin did last year but I haven’t tried the code yet. Maybe give it a try - https://community.home-assistant.io/t/sports-standings-and-scores/547094/443

1 Like