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 !
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!