Broadlink + Google Home + IFTTT/Webhooks = "Ok Google, Channel 269" or "Ok Google, change to my favourite channel" or "Ok Google, change to Cartoon Network"


(Manuel Barbosa) #1

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

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 :slight_smile:

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) :slight_smile:

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) :slight_smile:

⋅⋅⋅

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 :slight_smile: 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 :slight_smile:


Alguém já mexeu com a rest API do HASSIO?
(jpm) #2

Será que podes explicar o teu post um pouco melhor?


(Manuel Barbosa) #3

Logo quando tiver mais tempo completo o tutorial


(Rodolfo) #4

@ManuelBarbosa vais dar continuedade ao tutorial?


(Manuel Barbosa) #5

Sim hoje à noite já o termino


(Manuel Barbosa) #6

Done :slight_smile: espero não me ter esquecido de nada


(Luís Garcia) #7

O serviço da Amazon não permite criar os triggers “Say a phrase with a number” ou “Say a phrase with a text ingredient”, coisa que a Google permite. Existem alguma forma de ultrapassar este problema?


(Manuel Barbosa) #8

Eu vi que tem um trigger de custom phrase, se os parametros passados ao API forem a frase toda, pode ser que dê usando esse trigger. Eu não tenho uma Alexa, apenas em teoria isto devia resultar.


(Diego Pereira dos Santos) #9

É, infelizmente a Alexa para este tipo de automação fica limitada. Para usar este mesmo procedimento deve ser dito “Alexa, trigger ‘função a ser executada’”. Sem contar que ela sempre responde “Ok”.


(Tiago Marques) #10

@ManuelBarbosa
Olá eu segui o teu tutorial e o google home aceita e responde aos comandos, no ifttt vejo o contador das receitas a passar por isso home->ifttt tudo ok. No entanto não chega nada ao broadlink.

eu estou a usar o rm mini que acende uma luz branca cada vez que emite um comando, e quando mando alterar via google a luz não acende. do broadlink não será, no teu script só alterei os códigos ir (para meo). Tenho acesso https do exterior portanto a api tb está visível.

Alguma sugestão de como fazer debug a isto para ver onde está a falhar?


(Rodolfo) #11

@tmarquespt que puseste no type?


(Tiago Marques) #12

não alterei. já lá tinha o broadlink configurado como switch para outras coisas


(Tiago Marques) #13

Respondo a mim próprio de modo a evitar dores de cabeça a outros que cometam o mesmo erro que eu.

Ao alterar o ip do broadlink na linha 61, o cérebro manda que os ips sejam separados por pontos e não por underscore.

conclusão coloquei broadlink_send_packet_10.10.10.17 em vez de broadlink_send_packet_10_10_10_17 :slight_smile:

@ManuelBarbosa Parabéns por isto. Está muito bom!


(Manuel Barbosa) #14

Tenho estado de férias esta semanaaAinda não tive mt tempo no PC ainda bem que já conseguiste resolver. E obrigado :slight_smile:


(Osmar Tavares Junior) #15

Belo tutorial.
ainda não tenho um google home, mas já está na lista!

uma pergunta, eu tenho 2 Broadlink, tem como eu usar o mesmo google home para controlar 2 Tvs por exemplo?

Obrigado


(Manuel Barbosa) #16

Penso que terás de criar um script para casa uma das televisões e adicionar alguma coisa a frase do IFTTT que diferencie o comando, senão ele vai enviar o mesmo comando para todos os broadlinks. Ex: “change living Room channel to Disney junior”


(PTbeer) #17

o IFTTT para a Alexa não funciona da mesma forma pois não?
Pergunto isto porque não me está a permitir a utilização dos campos “numberfield” e “textfield”…

Esta é a descrição do “Say a specific phrase” ao criar o applet com Alexa no IFTTT: This trigger fires every time you say “Alexa trigger” + the phrase that you have defined. For instance, if you set “party time” as the phrase, you can say “Alexa trigger party time” to have your lights loop colors. Please use lower-case only.

Conseguiram?


(Manuel Barbosa) #18

Infelizmente isto não é possível com Alexa por causa disso, o IFTT só permite frases para ON e OFF não permite parâmetros no comando. Eu precisava de ver o que o HA recebe do Alexa quando se passa uma frase dessas para perceber se dá para transformar a frase em um comando. Se alguém me conseguir fazer parse do comando lido pelo HA eu talvez consiga criar um script que funcione com a Alexa.


(PTbeer) #19

Como tenho a Alexa, posso-te passar isso se me explicares melhor o que pretendes :slight_smile: (desde que o consiga :D)
obrigado


(PTbeer) #20

Segundo a descrição no IFTTT:
Say a specific phrase
This trigger fires every time you say “Alexa trigger” + the phrase that you have defined. For instance, if you set “party time” as the phrase, you can say “Alexa trigger party time” to have your lights loop colors. Please use lower-case only.

Ou seja, não me parece permitir listas e somente nome a nome correto? (secaaaa)