É preciso mapear todos os nossos canais que costumam dar jogos. Assim não falha.
Sim eu sei, mas não me dei ao trabalho de ver quais os canais que poderiam transmitir jogos. E no meu caso, como não vejo futebol nesses canais, nem me preocupei com isso. Mas posso adicionar mais canais se necessário.
Edit: Estive a ver e vou deixar aqui esta nota para mim, faltam os seguintes canais:
- Eleven Extra 1
- Eleven Extra 2
- Eleven Extra 3
- Eleven Extra 4
- Sport TV +
- RTP 1
- SIC
- TVI
De onde estás a ler a info dos próximos jogos do Sporting e da selecção?
Estou fora de casa, mas mal chegue digo-te.
Usei este post do Marco A., como base.
Depois criei calendários para a seleção e equipa preferida e criei estes sensores
# Próximo adversário Sporting
- platform: template
sensors:
sporting_opponent:
friendly_name: Sporting Next Opponent
value_template: >-
{{ states.calendar.sporting_portugal.attributes.message }}
# Próximo jogo Sporting
- platform: template
sensors:
sporting_date:
friendly_name: Sporting next game
value_template: >-
{% if is_state('calendar.sporting_portugal', 'on') %}
Playing Now
{% else %}
{% set st = state_attr('calendar.sporting_portugal', 'start_time') %}
{% if st != None %}
{{ as_timestamp(st) | timestamp_custom("%a, %b %d at %-H:%M") }}
{% else %}
No games scheduled
{% endif %}
{% endif %}
# Próximo adversário Portugal
- platform: template
sensors:
portugal_opponent:
friendly_name: Portugal Next Opponent
value_template: >-
{{ states.calendar.portugal.attributes.message }}
# Próximo jogo Portugal
- platform: template
sensors:
portugal_date:
friendly_name: Portugal next game
value_template: >-
{% if is_state('calendar.portugal', 'on') %}
Playing Now
{% else %}
{% set st = state_attr('calendar.portugal', 'start_time') %}
{% if st != None %}
{{ as_timestamp(st) | timestamp_custom("%a, %b %d at %-H:%M") }}
{% else %}
No games scheduled
{% endif %}
{% endif %}
Para o card instalei do hacs o custom:multiple-entity-row e criei este card:
type: vertical-stack
cards:
- type: entities
entities:
- type: custom:multiple-entity-row
entity: sensor.sporting_date
image: /local/scp_badge.png
name: Sporting C.P.
secondary_info:
entity: sensor.sporting_opponent
name: false
- type: divider
- type: custom:multiple-entity-row
entity: sensor.portugal_date
image: /local/icons/portugal_badge.png
name: Portugal
secondary_info:
entity: sensor.portugal_opponent
name: false
title: Próximos Jogos
Já agora, partilho um extra que tenho andado a usar: Team Tracker
Exemplo de cards:
É interessante porque apresenta dados em tempo real. E isso permite criar algumas automatizações que transformam tal numa ação não-passiva.
Um bom exemplo disso é ter uma automatização que vai anunciando os golos marcados e o resultado final; quando por alguma razão se está a trabalhar, ou a fazer comida, etc., sem ter de se estar a ver os jogos.
Aqui deixo duas automatizações que me vão relatando os jogos - para os google nest, se estiver em casa, ou para o telemóvel se estiver fora - e o resultado final.
alias: Team - Score
description: ""
trigger:
- platform: state
entity_id:
- sensor.team
attribute: team_score
- platform: state
entity_id:
- sensor.team
attribute: opponent_score
enabled: true
condition:
- condition: or
conditions:
- condition: template
value_template: >-
{{ trigger.to_state.attributes.team_score | int(0) >
(trigger.from_state.attributes.team_score | int(0) ) }}
- condition: template
value_template: >-
{{ trigger.to_state.attributes.opponent_score | int(0) >
(trigger.from_state.attributes.opponent_score | int(0) ) }}
action:
- service: tts.google_translate_say
data:
entity_id: media_player.XXX
message: >-
"There was a goal! {{ state_attr('sensor.team', 'team_abbr') }} {{
state_attr('sensor.team', 'team_score') }} - {{
state_attr('sensor.team', 'opponent_abbr') }} {{
state_attr('sensor.team', 'opponent_score') }}"
enabled: true
- if:
- condition: state
entity_id: person.XXX
state: not_home
then:
- service: notify.mobile_app_XXX
data:
message: >-
"There was a goal!! {{ state_attr('sensor.team', 'team_abbr')
}} {{ state_attr('sensor.team', 'team_score') }} - {{
state_attr('sensor.team', 'opponent_score') }} {{
state_attr('sensor.team', 'opponent_abbr') }}"
Com esses templates a mensagem vem no seguinte formato, para o tlm: “There was a goal! EquipaX 1-0 AdversárioX” & para os google nest: “There was a goal! EquipaX 1 - AdversárioX 0”
alias: Team - Game Over
description: ""
trigger:
- platform: state
entity_id:
- sensor.team
to: POST
from: IN
condition:
- condition: template
value_template: "{{ trigger.to_state.state | int(0)> (trigger.from_state.state | int(0)) }}"
enabled: false
action:
- service: tts.google_translate_say
data:
entity_id: media_player.XXX
message: >-
"The game is over! {{ state_attr('sensor.team', 'team_abbr') }} {{
state_attr('sensor.team', 'team_score') }} - {{
state_attr('sensor.team', 'opponent_abbr') }} {{
state_attr('sensor.team', 'opponent_score') }}"
- if:
- condition: state
entity_id: person.XXX
state: not_home
then:
- service: notify.mobile_app_XXX
data:
message: >-
"The game is over. {{ state_attr('sensor.team', 'team_abbr') }}
{{ state_attr('sensor.team', 'team_score') }} - {{
state_attr('sensor.team', 'opponent_score') }} {{
state_attr('sensor.team', 'opponent_abbr') }}"
enabled: true
mode: single
Ps. Uma boa idea é criar um input boolean, como condição, para activar ou não, as automatizações, se estiverem a ver os jogos.
Também utilizo esse, mas acho que n tenho os templates tão avançados.
Para completar essa info, só falta mostrar o canal da transmissão e o nome da competição. A ideia de alertar o golo pelo speaker está porreira!
Por acaso n vi se a APi da espn tinha essa info da liga, visto que temos que atribuir o league_id como XXX
.
# Custom Integration -
- platform: teamtracker
league_id: XXX
team_id: SCP
sport_path: soccer
league_path: por.1
name: sporting_cp`
Os atributos do sensor, não têm referencia ao nome da liga:
attribution: Data provided by ESPN
sport: soccer
league: XXX
league_logo: https://a.espncdn.com/i/leaguelogos/soccer/500/14.png
team_abbr: SCP
opponent_abbr: null
event_name: null
date: null
kickoff_in: null
venue: null
location: null
tv_network: null
odds: null
overunder: null
team_name: null
team_id: null
team_record: null
team_rank: null
team_homeaway: null
team_logo: null
team_colors: null
team_score: null
team_win_probability: null
team_timeouts: null
opponent_name: null
opponent_id: null
opponent_record: null
opponent_rank: null
opponent_homeaway: null
opponent_logo: null
opponent_colors: null
opponent_score: null
opponent_win_probability: null
opponent_timeouts: null
quarter: null
clock: null
possession: null
last_play: null
down_distance_text: null
outs: null
balls: null
strikes: null
on_first: null
on_second: null
on_third: null
team_shots_on_target: null
team_total_shots: null
opponent_shots_on_target: null
opponent_total_shots: null
team_sets_won: null
opponent_sets_won: null
last_update: 2023-01-23 09:15:12-01:00
api_message: No competition scheduled for 'SCP' between 2023-01-22T00:00Z and 2023-01-28T00:00Z
icon: mdi:soccer
friendly_name: sporting_cp
Editei o código para o caso de não ter o logo do canal, meter o texto.
type: markdown
content: >
Futebol na TV: {{state_attr('sensor.today_footbal_games','date') }}
<font size="1">Atualizado a: {{state_attr('sensor.today_footbal_games','updatedon') }} </font>
<hr>
{% for game in state_attr('sensor.today_footbal_games','games') %}
{% if game.channel == "SPORT.TV1" %}
{% set tv = "/local/sport-tv1.png" %}
{% elif game.channel == "SPORT.TV2" %}
{% set tv = "/local/sport-tv2.png" %}
{% elif game.channel == "SPORT.TV3" %}
{% set tv = "/local/sport-tv3.png" %}
{% elif game.channel == "SPORT.TV4" %}
{% set tv = "/local/sport-tv4.png" %}
{% elif game.channel == "SPORT.TV5" %}
{% set tv = "/local/sport-tv5.png" %}
{% elif game.channel == "SPORT.TV6" %}
{% set tv = "/local/sport-tv6.png" %}
{% elif game.channel == "ELEVEN 1" %}
{% set tv = "/local/eleven-1.png" %}
{% elif game.channel == "ELEVEN 2" %}
{% set tv = "/local/eleven-2.png" %}
{% elif game.channel == "ELEVEN 3" %}
{% set tv = "/local/eleven-3.png" %}
{% elif game.channel == "ELEVEN 4" %}
{% set tv = "/local/eleven-4.png" %}
{% elif game.channel == "ELEVEN 5" %}
{% set tv = "/local/eleven-5.png" %}
{% elif game.channel == "ELEVEN 6" %}
{% set tv = "/local/eleven-6.png" %}
{% elif game.channel == "BENFICA TV" %}
{% set tv = "/local/btv-hd.png" %}
{% elif game.channel == "CANAL 11" %}
{% set tv = "/local/c-11.png" %}
{% else %}
{% set tv = "null" %}
{% endif %}
{%- if game.homeTeam == "Sporting" or game.homeTeam == "Sporting S23" or
game.homeTeam == "Sporting S17" %}
{% if tv == "null" %}
{{game.channel}} **<font color = '#04b46b'>{{game.homeTeam}}</font> vs {{game.awayTeam}} [{{game.time}}]**
{% else %}
<img src="{{ tv }}" height="10"></img> **<font color = '#04b46b'>{{game.homeTeam}}</font> vs {{game.awayTeam}} [{{game.time}}]**
{% endif %}
{%- elif game.awayTeam == "Sporting" or game.awayTeam == "Sporting S23" or
game.awayTeam == "Sporting S17" %}
{% if tv == "null" %}
{{game.channel}} **{{game.homeTeam}} vs <font color = '#04b46b'>{{game.awayTeam}}</font> [{{game.time}}]**
{% else %}
<img src="{{ tv }}" height="10"></img> **{{game.homeTeam}} vs <font color = '#04b46b'>{{game.awayTeam}}</font> [{{game.time}}]**
{% endif %}
{% else %} {% if tv == "null" %}
{{game.channel}} {{game.homeTeam}} vs {{game.awayTeam}} [{{game.time}}]
{% else %}
<img src="{{ tv }}" height="10"></img> {{game.homeTeam}} vs {{game.awayTeam}} [{{game.time}}]
{% endif %}
{%- endif %}
{% endfor %}
PS: Estou-me a passar com essa identação maluca, mas sempre que corrijo isso, ele perde o aspeto visual
boas,
como conseguem identificar a liga? só tenho a funcionar a liga dos campeões a portuguesa quer ponha por.1 quer xxx nao da nada . . .
# Custom Integration -
- platform: teamtracker
league_id: XXX
team_id: SCP
sport_path: soccer
league_path: por.1
name: sporting_cp
Eu tenho assim no teamtracker
obrigado.
copiei igual e da sempre not_found.
onde se mete o código? no cartão teamtracker-card? ou no configuration.yaml?
Boas,
Como posso criar só um scrape sem usar o nodred só com a informação do canal onde vai dar o próximo jogo do Porto. A ideia é ter um sensor onde o estado aparece o canal.
Obrigado
Terás de encontrar um site que mostre esses mesmo jogos e em que canal é transmitido o próximo jogo.
O exemplo inicial é baseado nos resultados (diários) encontrados em: https://www.futebol365.pt/jogos-na-tv/
Dando uma vista de olhos pela net encontrei um site que é capaz de funcionar.
- Vais a integrações e adicionas integração: “Scrape”
- Em “Resource:”, adicionas: “https://www.futebolnatv.pt/equipe/oporto”
- Next
- Em “Name:”, põe o que quiseres, exemplo: “FC Porto”
- Em “Select*”, adiciona: “div#utcRelativeContent table:nth-child(2) > tbody > tr:nth-child(2) > td.canales > ul > li > a”
- Submeter.
Dará algo assim:
Era mesmo isto muito obrigado
Esqueci-me de mencionar a atualização do Scrape’s sensor…
Não sei qual é o ratio de atualizações que tem de forma inicial/standard mas é boa prática desabilitar a actualização automática, indo à integração “Scrape”, e à direita do sensor carregar nos 3 pontos. Aí tens as opções:
- Reload
- Rename
- System options
- Disable
- Delete
Vais a “System options” e desabilitas a segunda opção: “Enable polling for updates.”
A forma ideal é através de uma automatização:
alias: Scrape - Automation
description: ""
trigger:
- platform: time_pattern
hours: /12 #mete o número de horas,dias, etc., que desejares a actualização
condition: []
action:
- service: homeassistant.update_entity
data: {}
target:
entity_id:
- sensor.fcporto #exemplo - altera para o que tens
mode: single
Boas, penso que o website teve uma atualização no dia 21/02/2024, deixou de funcionar no meu, não sei se mais alguém teve a mesma situação. Tive a ver se conseguia perceber onde estava o erro, mas não encontrei. Alguém encontrou e tem solução? Isto dá mesmo muito jeito
Bem, teve 3 anos a funcionar, alguma coisa devem ter mudado no site. Diariamente recebo a lista de jogos no telegram e deixei de receber. Nesta fase estou demasiado ocupado para fazer debugger e perceber o que mudou no site mas basicamente é preciso ver no nodered o que está a sair em cada nó para perceber onde houve a quebra e depois corrigir esse node. Conto resolver em breve.