Alarme com Google Home/Alexa e sensores Xiaomi (Sem central de alarme)

Olá! Esses dias me surgiu uma necessidade de criar um alarme utilizando apenas o que eu tinha disponível, Google Assistente(Home/Nest mini), Alexa(Echo show 5), sensores de movimento(Xiaomi RTCGQ01LM), sensores de porta/janela(Xiaomi MCCGQ01LM). Os meus sensores ficam conectados a um CC2531 zigbee2mqtt.

1) Vamos criar o nosso painel do alarme manual.

Abra o seu arquivo configuration.yaml e coloque o seguinte código:

alarm_control_panel:
  - platform: manual
    name: Home Alarm #Atenção nesse ponto, o name vai ser tanto o friendly name, quanto o entity_id
    code: #COLOQUE_AQUI_UMA_SENHA (pode usar !secret também)
    code_arm_required: false
    pending_time: 60
    delay_time: 0
    trigger_time: 120
    disarmed:
      trigger_time: 0
    armed_home:
      pending_time: 0
    armed_night:
      pending_time: 0

Explicando um pouco os parâmetros acima:

* code_arm_required:
Aqui você define como true( que ja é o default) caso queira utilizar o código também para armar o alarme, ou então false, caso queira usar o código somente para desarmar.
* pending_time:
tempo em segundos que irá esperar quando alterar de estado(ex: trocou de disarmed para armed_away), ele vai esperar X segundos antes de armar o alarme, para por exemplo dar tempo de sair de casa depois de clicar para armar.
* delay_time:
Esse já é o valor padrão, poderia deixar sem essa linha, porém, para fins didáticos é bom sabermos o que ela faz, esse é o tempo em segundos em que ele vai esperar antes de disparar o alarme. Esse também é o tempo que você terá para digitar o código no painel quando entrar casa para que ele não dispare.
* trigger_time:
Tempo em segundos que o alarme ficará no estado de “Acionado”, antes de voltar para o estado anterior de armado.
* disarmed:
Totalmente opcional, ao colocar o nome de um estado, e abaixo dele colocar novamente um dos parâmetros acima, fará que ele sobrescreva a informação, ou seja, colocando o “trigger_time: 0” eu substitui o valor “trigger_time: 110”, mas somente para o estado “disarmed”. O mesmo é valido para armed_home e armed_night, porém nesse usei para remover o tempo de pendencia, ou seja, eles armam imediatamente pois deixei o tempo em 0.

2) Agora vamos para as automações !

Abra o seu arquivo automations.yaml, e agora vamos definir os gatilhos para o nosso alarme:

Nesse primeiro bloco de código, foi a forma como defini o acionamento do alarme, nos estados de armed_home e armed_night, pois no meu caso, os gatilhos serão os mesmos para ambas as situações.

Então caso qualquer um dos sensores de porta altere do estado ‘off’(fechado) para ‘on’(aberto) E(condition) o estado do painel de alrme esteja em “armed_home” OU “armed_night”, ele irá executar o serviço alarm_control_panel.alarm_trigger (esse é o cara que faz o alarme disparar)

  - alias: "TriggerAlarmHomeOrNight"
    initial_state: true
    hide_entity: true
    trigger:
      - platform: state
        entity_id: binary_sensor.xiaomi_porta_sala_contact
        from: 'off'
        to: 'on'
      - platform: state
        entity_id: binary_sensor.xiaomi_porta_fundo_contact
        from: 'off'
        to: 'on'
    condition:
      condition: or
      conditions:
        - condition: state
          entity_id: alarm_control_panel.home_alarm
          state: armed_home
        - condition: state
          entity_id: alarm_control_panel.home_alarm
          state: armed_night      
    action:
      - service: alarm_control_panel.alarm_trigger
        entity_id: alarm_control_panel.home_alarm

No bloco abaixo, é como fiz o trigger para caso o alarme esteja armado em: armed_away, então além dos sensores de porta, utilizo os sensores de movimento

  - alias: "TriggerAlarmAway"
    initial_state: true
    hide_entity: false
    trigger:
      - platform: state
        entity_id: binary_sensor.xiaomi_motion_quarto_occupancy
        from: 'off'
        to: 'on'
      - platform: state
        entity_id: binary_sensor.xiaomi_motion_cozinha_occupancy
        from: 'off'
        to: 'on'
      - platform: state
        entity_id: binary_sensor.xiaomi_motion_garagem_occupancy
        from: 'off'
        to: 'on'
        for:
          minutes: 5
      - platform: state
        entity_id: binary_sensor.xiaomi_porta_sala_contact
        from: 'off'
        to: 'on'
      - platform: state
        entity_id: binary_sensor.xiaomi_porta_fundo_contact
        from: 'off'
        to: 'on'
    condition:
      - condition: state
        entity_id: alarm_control_panel.home_alarm
        state: armed_away
    action:
      - service: alarm_control_panel.alarm_trigger
        entity_id: alarm_control_panel.home_alarm

3) ALARME DISPARADO

Após definirmos os gatilhos que irão disparar o nosso alarme, vamos definir o que ele vai fazer quando disparar. Então quando o estado do alarm_panel passar para ‘triggered’, essas são as ações que serão executadas:

  - alias: 'AlarmTriggered'
    trigger:
      - platform: state
        entity_id: alarm_control_panel.home_alarm
        to: 'triggered'
    action:
      - service: light.turn_on
        entity_id: light.sala_canto
        data:
          effect: Alarm
      - service: light.turn_on
        entity_id: light.quarto
        data:
          effect: Alarm
      - service: media_player.play_media
        data:
          entity_id: media_player.casa
          media_content_id: 'https://SEUENDERECO.duckdns.org/local/audio/alarm.mp3'
          media_content_type: 'audio/mp3'
      - service: media_player.volume_set
        data:
          entity_id:
          - media_player.nest_mini_quarto
          - media_player.home_mini_sala
          - media_player.echo_show
          volume_level: '1'
      - service: camera.snapshot
        data:
          entity_id: camera.garagem
          filename: '/config/www/images/snapshot1.jpg'
      - service: notify.telegram
        data:
          message: 'Foto'
          data:
            photo:
              - file: '/config/www/images/snapshot1.jpg'
                caption: '🚨🚨 ALARME ACIONADO 🚨🚨'
            inline_keyboard:
              - 'Desligar:/alarmOff'
      - delay: 115
      - service: light.turn_off
        entity_id: light.quarto
      - service: light.turn_off
        entity_id: light.sala_canto

Explicando esse monte de ações acima: Ao disparar o alarme, algumas yeelights irão acender no efeito Alarm, que fica pulsando vermelho com um efeito similar a aqueles filmes onde tem um submarino sendo atacado. Na sequencia irá começar a reproduzir um arquivo MP3 que está localizado na pasta “\config\www\audio” (esse meu áudio tem 2 minutos de duração), em seguida o volume dos dispositivos serão alterados para o máximo, uma foto da camera da garagem será tirada e enviada via telegram junto com uma mensagem, nessa mensagem envio junto um botão que está vinculado a uma outra automação que desativo as ações do alarme(apaga as luzes e para a reprodução do MP3), caso eu detecte que foi um alarme falso.

Obs.: Não consegui fazer reproduzir o mp3 com o alexa media player. Mas confesso que não insisti muito, mas vou atrás disso e em breve edito o tópico adicionando o recurso!

4) Agora vamos criar o painel

Abra o seu arquivo ui-lovelace.yaml e adicione o seguite código na view que desejar:

cards:
  - type: alarm-panel
    entity: alarm_control_panel.home_alarm
    states:
      - arm_home
      - arm_away
      - arm_night

5) Bônus

Até os itens anteriores, tudo era obrigatório para que o nosso alarme funcione, então neste item, irei disponibilizar algumas automações que interagem com o nosso alarme.

Aqui temos algumas automações que disparam mensagens no telegram de acordo com o estado do alarme:

  - alias: 'NotifyAlarmDisarmed'
    trigger:
      - platform: state
        entity_id: alarm_control_panel.home_alarm
        to: 'disarmed'
    action:
      - service: notify.telegram
        data_template:
          message: "O alarme foi desarmado às {{ states('sensor.time') }}"

  - alias: 'NotifyAlarmArmedHome'
    trigger:
      - platform: state
        entity_id: alarm_control_panel.home_alarm
        to: 'armed_home'
    action:
      - service: notify.telegram
        data_template:
          message: "O alarme foi armado no estado EM CASA às {{ states('sensor.time') }}"

  - alias: 'NotifyAlarmArmedAway'
    trigger:
      - platform: state
        entity_id: alarm_control_panel.home_alarm
        to: 'armed_away'
    action:
      - service: notify.telegram
        data_template:
          message: "O alarme foi armado no estado AUSENTE às {{ states('sensor.time') }}"

  - alias: 'NotifyAlarmArmedNight'
    trigger:
      - platform: state
        entity_id: alarm_control_panel.home_alarm
        to: 'armed_night'
    action:
      - service: notify.telegram
        data_template:
          message: "O alarme está em modo NOTURNO, à partir de agora."

Agora uma automação que arma automaticamente em modo noturno à partir de um determinado horário:

  - alias: 'AlarmNightArmed'
    trigger:
      - platform: time
        at: '23:00:00'
    condition:
      condition: or
      conditions:
        - condition: state
          entity_id: alarm_control_panel.home_alarm
          state: disarmed
        - condition: state
          entity_id: alarm_control_panel.home_alarm
          state: 'off'
    action:
      - service: alarm_control_panel.alarm_arm_night
        entity_id: alarm_control_panel.home_alarm

– “Ah Giovanne, mas eu deixei habilitado o código para armar o alarme, essa automação acima não fez nada!”

– Caaalma que tudo tem jeito! Basta trocar a ação para:

action:
      - service: alarm_control_panel.alarm_arm_night
        data: {"entity_id":"alarm_control_panel.home_alarm","code":"SEUCODIGOAQUI"}

Caso queira uma automação que desarme o alarme noturno automaticamente em determinado horário basta fazer algo similar a isso: (o trigger também poderia ser um movimento detectado internamente entre horários determinados)

  - alias: 'DisarmAlarmNight'
    trigger:
      - platform: time
        at: '06:00:00'
    condition:
      - condition: state
        entity_id: alarm_control_panel.home_alarm
        state: armed_night
    action:
      - service: alarm_control_panel.alarm_disarm
        data: {"entity_id":"alarm_control_panel.home_alarm","code":"SEUCODIGOAQUI"}

– “Aaah mas e aquela automação que você falou lá em cima do botão que é enviado no telegram quando alarme é disparado?”

- alias: AlarmOff
        initial_state: true
        hide_entity: true
        trigger:
          platform: event
          event_type: telegram_callback
          event_data:
            data: '/alarmOff'
        action:
          - service: notify.telegram
            data:
              message: 'Ok, alarme desativado.'
          - service: light.turn_off
            entity_id: light.quarto
          - service: light.turn_off
            entity_id: light.sala_canto
          - service: media_player.turn_off
            entity_id: media_player.casa

Obs.: O media_player.casa, é um grupo de google home/nest mini que criei pelo app Google Home, e de alguma forma foram parar dentro do HA como um media_player.

– “Fiz do jeito que você falou mas recebi a seguinte mensagem no telegram: O alarme foi desarmado às unknown”. Não deveria aparecer a hora?

Com certeza! Caso aconteça isso, basta ir em sensors.yaml e adicione o seguite sensor:

- platform: time_date
    display_options:
      - 'time'
      - 'date'
      - 'date_time'
      - 'date_time_iso'
      - 'time_date'
      - 'time_utc'
      - 'beat'

– “Ok, mas agora eu percebi que o seu alarme só toca por 2 minutos e para, MAS TEM GENTE NA SUA CASA DOIDO!”

Calma que ainda não fiquei maluco, lembra que definimos láá em cima o trigger_time de 120 segundos? Assim que toda a ação terminar (já que o meu audio toca por 120s, mas eu interrompo ele com 115s). O alarme voltará para o estado anterior, então se de novo algum triger for acionado, vai repetir tudo de novo, e vai criar um looping, até que o invasor já tenha levado as Google home/nest e os meus sensores embora :rofl:!

Bom galera, por favor deixem abaixo as suas críticas e sugestões, assim juntos podemos ir melhorando esse sistema de alarme. Fiz esse meio na correria para poder passar as festas de final de ano mais tranquilo fora de casa, então ainda faltam algumas coisas, e com certeza tem muito a ser melhorado!

10 curtidas

Show meu amigo!! :clap:t2::clap:t2::clap:t2::clap:t2::clap:t2:

1 curtida

Show! Tô para integrar o meu alarme no HA já vou aproveitar seu tutorial! :grinning:

1 curtida

Amigo, parabéns pelo seu tutorial. Foi além do básico, deu varias dicas e enriqueceu com suas experiencias. Valeu mesmo. Gde abraço.

Gostei bastante, eu fiz meu alarme de outro modo, porém você usa mais tecnologia e códigos atualizados, preciso melhorar o meu. Agradeço contribuição

Show de bola. Precisamos de mais pessoas assim, muito bom. :clap: :clap: :clap:

Eu tenho algo parecido, mas faço algumas condições, só desarma o alarme se tem alguém em casa por exemplo. Não tem sentido desarmar automaticamente se estou de viagem ou coisa parecido.

Também fiz um loop de piscar a as lâmpadas e de acionar os media players até que o alarme seja desativado.

Agora tenho que fazer umas correções, pois o alarme ativa para armado em casa todos os dias caso tenha alguém em casa âs 23h. Mas esses dias eu cheguei 1h da manhã, e fomos dormir sem o alarme estar ativado, mas tem opções para resolver. hehe

1 curtida

Show de bola ! Gostei muito ! Existirá alguma maneira de enviar mensagem ou ligar pro celular quando estiver fora de casa e o alarme for disparado ? Alguém já tendeu isso ?

Ali no item 3, se você rolar um pouco para baixo, tem a configuração de aviso pelo telegram, nesse caso ele tira uma foto da câmera da garagem (entrada) e envia via Telegram informando que o alarme foi disparado:

  - service: notify.telegram
    data:
      message: 'Foto'
      data:
        photo:
          - file: '/config/www/images/snapshot1.jpg'
            caption: '🚨🚨 ALARME ACIONADO 🚨🚨'
        inline_keyboard:
          - 'Desligar:/alarmOff'