Este tutorial, vai te ensinar a com um comando de voz, mudar o canal da vodafone / meo / nos / nowo / etc. Vamos fazer isso através de IFTTT. Para quem não conhece, IFTTT (if then that) permite com um trigger despoletar acções em outros serviços, nomeadamente no Home Assistant via Webhooks atravez do API do HA.
Requesitos
- Broadlink qualquer modelo IR
- saber ler os packets de IR do Broadlink
- homeassistant exposto a internet (com password claro) para usar o seu API
Resumo
- criação de um serviço em python para receber a ordem de mudar o canal
- configuração do HA para usar esse serviço
- criação de dois applets IFTTT pessoais para chamar esse serviço no HA (por numero de canal e por frase chave)
Resultado
- user: “Ok google, Channel 269”
- google: “Ok, changing to channel 269”
- broadlink: emite packets 2, 6 e 9 em intervalos de 0.5 segundos
- tv: muda o canal para 269
ou
- user: “Ok google, change to Cartoon Network”
- google: “Ok, changing to channel Cartoon Network”
- broadlink: emite packets 5 e 3 em intervalos de 0.5 segundos
- tv: muda o canal para 53 (Cartoon Network)
ou
- user: “Ok google, change to wife’s favourite channel”
- google: “Ok, changing to wife’s favourite channel”
- broadlink: emite packets 1 e 1 em intervalos de 0.5 segundos
- tv: muda o canal para 11 (Sic Mulher)
⋅⋅⋅
Parte 1.1 - Configuração Home Assistant
Primeiro vamos ter de adicionar o seguinte componente ao nosso HA no configuration.yaml:
python_script:
http:
api_password: [API_PASSWORD]
Isto vai permitir criar novos serviços em Python para o nosso HA que vamos chamar mais tarde via API e adicionar uma password ao nosso HA para usar nesse mesmo API.
⋅⋅⋅
Parte 1.2 - Configuração Broadlink
Para o nosso broadlink funcionar, também vamos ter de o adicionar ao nosso configuration.yaml como um switch:
switch:
- platform: broadlink
host: 192.168.0.16
mac: 'XX:XX:XX:XX:XX:XX'
timeout: 60
friendly_name: Broadlink Home Plus
type: rm2_home_plus
Não são precisos switch no componente do broadlink porque vamos chamar o Broadlink directamente pelo serviço.
⋅⋅⋅
Parte 1.3 - Python Script
Na pasta das configurações do nosso HA vamos criar a pasta python_scripts e vamos adicionar o ficheiro mudar_canal.py com o seguinte código:
channel = data.get('channel')
vodafone_channels = {
'rtp1': '1',
'rtp2': '2',
'sic': '3',
'sick': '3',
'tvi': '4',
'sic news': '5',
'sick news': '5',
'rtp 3': '6',
'tvi 24': '7',
'cmtv': '8',
'sport tv plus': '9',
'tv globe basic': '10',
'sic woman': '11',
'sick woman': '11',
"wife ' s favorite channel": '11',
'oporto hd': '12',
'sic faces': '14',
'sick faces': '14',
'sic radical': '15',
'sick radical': '15',
'rtp memory': '17',
'twenty four kitchen': '18',
'disney channel': '50',
"baby ' s favorite channel": '51',
'disney junior': '51',
'cartoon network': '53',
'panda': '54',
'panda bigs': '55',
'panda biggs': '55',
'baby tv': '56',
'sic kids': '57',
'sick kids': '57',
'boomerang': '58',
'jim jam': '59',
'hollywood': '80',
'hollywood hd': '81',
'cineworld': '82',
'cineworld sd': '83',
'fox movies hd': '84',
'fox movies': '85',
'fox hd': '86',
'fox': '87'
}
def switch_channel_number(hass, channel):
vodafone_packets = {
'1': 'JgBUAAwTFhQVFBYIDBQWEwwIDAgNCAwJDAgXEwwAC1kMExYUFhMWCA0TFhMMCAwIDQgNCAwIFxQLAAtaDBMWExYUFQkMExYUCwgNCA0IDAgNCBcTDAANBQAAAAA=',
'2': 'JgBOAAwTFhMWExYKCxMWFAsKCwoKCgsKFRMWAAtkDBMWExYTFgkMExYUCwkMCAwLCgoVExYAC2QNEhYTFhQWCgoUFhMLCwoKCQsLCxQUFgANBQAAAAAAAAAAAAA=',
'3': 'JgBUAAwTFhMWExYIDRMWFAsIDQgMCQwIFwgNEwwAC1kMExYUFhMWCA0TFhMMCAwIDQgNCBgGDRQLAAtaDBMWExYUFggMFBYTCwkMCA0IDAkWCA0TDAANBQAAAAA=',
'4': 'JgBOAAwTFhMXExYIDBQWEwsJDAgNCBcTDAgXAAtkCxQWExYTFggNExYUCwgNCAwJFhQLCBcAC2ULExYUFhMWCA0TFhMMCA0IDAgXFAsIFwANBQAAAAAAAAAAAAA=',
'5': 'JgBOAAwTFhMWFBYIDBQWEwsJDAgNCBcTFhMMAAtZDBMWFBYTFggNExYTDAgNCAwIFxMWFAsAC1oMExcTFhMWCAwUFhMMCAwIDQgYEhcTCwANBQAAAAAAAAAAAAA=',
'6': 'JgBOAAwTFhMWExYKCxMWFAsKCwoKCgsKFRMWAAtkDBMWExYTFgkMExYUCwkMCAwLCgoVExYAC2QNEhYTFhQWCgoUFhMLCwoKCQsLCxQUFgANBQAAAAAAAAAAAAA=',
'7': 'JgBOAAkWExYUFRQLChUUFQoLCgsJCxQLChUUAAtmCRYUFRQVFAsKFRQWCQsKCwkLFAsKFRQAC2YKFRQWFBUUCwoVFBUKCwoLCQsUCwoVFAANBQAAAAAAAAAAAAA=',
'8': 'JgBOAAsUFhMWExYIDRMWFAsIDQgXEwwIDAkWAAtlChQWFBYTFggNExYTDAgMCRYUCwkMCBcAC2QMExYTFhQWCAwUFhMLCQwIFxMMCA0IFwANBQAAAAAAAAAAAAA=',
'9': 'JgBOAAwTFhMWExYIDRMWFAsJDAgXEwwIFxMMAAtZDBMWExYTFgkMExYUCwkMCBcTDAgXEwwAC1kMExYUFhMWCA0TFhMMCA0IFxMLCRYUCwANBQAAAAAAAAAAAAA=',
'0': 'JgBIAAwTFhQVFBYIDBQWEwwIDAgXFBYTFgALZAsUFhMWExYIDRMWEwwIDQgXExYTFgALZAwTFhQWExYIDRMWEwwIDAkWFBYTFgANBQ=='
}
def send_packet(packet):
service_data = { 'packet': packet }
hass.services.call('switch','broadlink_send_packet_192_168_0_16', service_data, False)
for n in channel:
if n in vodafone_packets:
send_packet(vodafone_packets[n])
time.sleep(1)
channel_lower = channel.lower()
if channel_lower in vodafone_channels:
dic_channel = vodafone_channels[channel_lower]
switch_channel_number(hass, dic_channel)
else:
switch_channel_number(hass, channel)
NOTA: É necessário alterar algumas coisas neste código para os vossos setups:
-
linha 63:
broadlink_send_packet_192_168_0_16
deve ser alterado para o vosso switch broadlink, normalmente é o nome broardlink_send_packet_[IP_DO_DEVICE]. -
linha 3-44: adicionar ao dicionário no formato
'frase chave' : 'canal'
todos os canais que se quiser ou frases que se queira dizer, não esquecer que todas as frases devem ser em inglês e podemos adicionar várias maneiras de dizer o mesmo canal como podem ver na linha 15-16. - linha 49-58: estes são os packets do comando da vodafone da box mais pequena, alterem os valores para as vossas boxes. Para isto funcionar são só precisos os dígitos de 0 a 9.
⋅⋅⋅
Parte 2.1 - IFTTT configuração
1º Applet por número:
Criamos o nosso 1º apple de IFTTT por número neste link
-
Carregar em +this
-
Service
- Google Assistant / Alexa
-
Trigger
- Say a phrase with a number
-
What do you want to say?
- channel #
-
What’s another way to say it? (optional)
- change to #
-
And another way? (optional)
- change channel to #
-
What do you want the Assistant to say in response?
- Ok, changing channel to #
-
Language
- English
-
Carregar em +that
-
Action service
- Webhooks
-
Choose Action
- Make a web request
-
Url
- [URL_EXTERNO_DO_HA]/api/services/python_script/mudar_canal?api_password=[PASSWORD_HA]
-
Method
- POST
-
Content Type
- application/json
-
Body
{"channel":"{{NumberField}}"}
-
Title
- Change vodafone channel by number
⋅⋅⋅
2º Applet por texto:
… e o segundo por texto neste link
-
Carregar em +this
-
Service
- Google Assistant / Alexa
-
Trigger
- Say a phrase with a text ingredient
-
What do you want to say?
- channel $
-
What’s another way to say it? (optional)
- change to $
-
And another way? (optional)
- change channel to $
-
What do you want the Assistant to say in response?
- Ok, changing channel to $
-
Language
- English
-
Carregar em +that
-
Action service
- Webhooks
-
Choose Action
- Make a web request
-
Url
- [URL_EXTERNO_DO_HA]/api/services/python_script/mudar_canal?api_password=[PASSWORD_HA]
-
Method
- POST
-
Content Type
- application/json
-
Body
{"channel":"{{TextField}}"}
-
Title
- Change vodafone channel by name
⋅⋅⋅
Se tudo tiver corrido bem já podem dizer a vossa Alexa / Google Home para mudar os canais da vossa box.
Aqui é que está a verdadeira versatilidade deste tutorial, neste caso especifico estamos a chamar o serviço do broadlink de emitir sinais com base num valor passado pelo nosso google home:
hass.services.call('switch','broadlink_send_packet_192_168_0_16', service_data, False)
Mas por exemplo podemos criar um script de python para mudar a temperatura de uma divisão usando um número também por exemplo:
# python_scripts/temperatura_por_voz.py
temperature = data.get('temperature')
service_data = { entity_id: "climate.kitchen", temperature: temperature}
hass.services.call('climate','set_temperature', service_data, False)
No IFTTT seria um trigger com os seguintes settings:
Applet por numero:
criamos mais um applet para a temperatura
-
Carregar em +this
-
Service
- Google Assistant / Alexa
-
Trigger
- Say a phrase with a number
-
What do you want to say?
- Set kitchen temperature to # degrees
-
What’s another way to say it? (optional)
- Change kitchen temperature to # degrees
-
And another way? (optional)
- Set kitchen temperature to #
-
What do you want the Assistant to say in response?
- Ok, changing kitchen temperature to #
-
Language
- English
-
Carregar em +that
-
Action service
- Webhooks
-
Choose Action
- Make a web request
-
Url
- [URL_EXTERNO_DO_HA]/api/services/python_script/temperatura_por_voz?api_password=[PASSWORD_HA]
-
Method
- POST
-
Content Type
- application/json
-
Body
{"temperature":"{{NumberField}}"}
-
Title
- Change kitchen temperature by number
Resultado
“Ok, google, Set kitchen temperature to 22 degrees”
Espero que isto vos ajude, boas automatizações