Открытая платформа для создания заботливой квартиры

Это датчик, который принимает два состояния: включено или выключено, в результате обнаружения теплового излучения в его поле зрения. С использованием такого сенсора можно организовать сценарий, который будет отслеживать появление людей в комнате или управлять автоматическим включением и отключением света.

Итак, вам потребуются следующие компоненты:

Название Назначение Цена, руб.
BLE CC41A Радиомодуль Bluetooth LE 140
HC-SR505 Мини-датчик движения инфракрасный 75
Digispark ATTiny85 Микроконтроллер для снятия показаний датчика движения 80

Помимо того, что датчик интегрирован с инфраструктурой умного дома, его преимущества еще и в том, что он в три раза дешевле китайского датчика движения, его не нужно прикреплять к потолку или стене, его можно разместить в любом удобном месте, ведь он работает от батареек.

Умный датчик движения

Располагайте датчик движения с учетом того, что он отслеживает движение на расстоянии 4-5 метров. В режиме ожидания датчик потребляет около 1мА, так что батареек должно хватить на продолжительную работу устройства. Питание 5В необходимо для устойчивой работы датчика движения. Иначе можно было бы обойтись 2-мя элементами питания.

Программирование

Подготовьте рабочее место для работы с DigiSpark ATTiny85 по этой инструкции и запрограммируйте микроконтроллер с использованием этого кода:

#include <avr/sleep.h>      
#include <avr/power.h>    
#include <avr/wdt.h>         
#include <avr/io.h>
#include <avr/interrupt.h>
#include <cc41a.h>

#define adc_disable() (ADCSRA &= ~_BV(ADEN))
#define adc_enable()  (ADCSRA |=  _BV(ADEN))

#define SWITCH_PIN PB2
#define TX_DELAY 200

int wasState = LOW;
int secondsToWait = 0;
CC41A ble(PB1, PB3, PB0); // RX, TX, Reset

void setup() 
{
  setupPins();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  initializeWatchdogTimer(WDTO_1S);
  ble.configure("Motion-1");
}

void loop() 
{
  setupPins();
  power_all_disable();
  adc_disable();
  sleep_mode();

  if ( secondsToWait > 0 ) {
    secondsToWait--;
    return;
  }

  int nowState = digitalRead(SWITCH_PIN);
  if ( nowState == wasState) return;

  power_all_enable();
  ble.major(nowState == HIGH ? 1 : 0);
  wasState = nowState;
  secondsToWait = 10;
}

void initializeWatchdogTimer(byte sleep_time)
{
  wdt_reset();
  wdt_enable(sleep_time);
  WDTCR |= _BV(WDIE);
}

ISR(WDT_vect) {
  WDTCR |= _BV(WDIE);
}

void setupPins()
{
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
  pinMode(0, INPUT);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  pinMode(1, INPUT);
  pinMode(A1,INPUT);
  analogWrite(A1, 0);
  pinMode(A2,INPUT);
  analogWrite(A2, 0);
  pinMode(A3,INPUT);
  analogWrite(A3, 0);
}

Схема устройства

схема

Настройка HASS

Файл: /config/configuration.yaml

binary_sensor:
  - platform: cutecare
    name: Motion detector
    mac: 3c:a3:08:c6:82:10

Файл: /config/customize.yaml

binary_sensor.motion_detector:
  friendly_name: Движение

Файл: /config/groups.yaml

default_view:
  view: yes
  icon: mdi:home
  entities:
    - group.hall
    - group.kitchen
    - group.bedroom

kitchen:
  name: Кухня
  entities:
    - binary_sensor.motion_detector

В приложении вы сможете отслеживать изменение состояния датчика:

Автоматизация

Здесь приведен достаточно простой пример автоматизации, который включает свет на кухне при обнаружении движения и отключает его через 10 минут после последнего обнаруженного движения. Конечно, более реалистичный сценарий потребует некоторого усложнения.

Файл: /config/automations.yaml

- alias: Включить свет на кухне, если обнаружено движение
  trigger:
    platform: state
    entity_id: binary_sensor.motion_detector
    to: 'on'
  action:
    service: homeassistant.turn_on
    entity_id: light.kitchen_light

- alias: Выключить свет на кухне через 10 минут после последнего движения
  trigger:
    platform: state
    entity_id: binary_sensor.motion_detector
    to: 'off'
    for:
      minutes: 10
  action:
    service: homeassistant.turn_off
    entity_id: light.kitchen_light