Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в  ZoneMinder

Сколько не искал как настроить ZM, чтобы он сам удалял старые записи, так и не смог найти. Пришлось сделать свой костыль на PHP. Скрипт писался исключительно для себя, и не претендует на правильность.

<?php
$servername = ""; // IP адрес MySQL сервера
$database = "zm"; // Имя БД
$username = ""; // Имя пользователя БД
$password = ""; // Пароль пользователя БД
$path = ""; // Путь к папке с записями
$interval = "7"; // Удалять записи старше N дней

// Создаем соединение
$mysqli = new mysqli($servername, $username, $password, $database);

// Получаем записи старше N дней
$result = $mysqli->query('SELECT * FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');
$rows = $result->fetch_all(MYSQLI_ASSOC);

// Форматируем дату
$arrDates = array();
foreach($rows as $row) {
    $date = explode(' ', $row['StartDateTime'])[0];
    array_push($arrDates, $date);
}
// Удаляем дубликаты дат
$arrDates = array_unique($arrDates);

// Удаляем папки старше N дней
foreach($arrDates as $date) {
    // Удаление для каждого монитора отдельно
    exec('rm -R '.$path.'5/'.$date);
    exec('rm -R '.$path.'6/'.$date);
}

// Удаляем записи старше N дней
$mysqli->query('DELETE FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');

// Закрываем соединение
$mysqli->close();

Скрипт запускается командой php script.php из консоли и может быть добавлен в cron.


Датчик протечки или система Анти-кот в Home Assistant

Датчик протечки или система Анти-кот в Home Assistant

Кот повадился гадить на входной коврик, да так метко, что иногда не замечаешь, вся лужа под ковриком! Что бы не портился ламинат от влаги, пришлось быстро собрать на коленке систему анти-кот которая будет оповещать о совершенном котом преступлении. Для этого понадобилось:

  • Макетная плата
  • NodeMCU или Wemos
  • Резистор 10кОм
  • Пару проводов
  • Пару полосок фольги
  • Припой
  • Паяльник
  • Блок питания MicroUSB 5V

Схема выглядит так

Схема системы анти-кот

Конфиг ESPHome для прошивки:

esphome:
  name: leak-detector
  platform: ESP8266
  board: nodemcuv2

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: ""

wifi:
  ssid: ""
  password: ""

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Leak-Detector Fallback Hotspot"
    password: ""

captive_portal:

sensor:
  - platform: wifi_signal
    name: "Leak Sensor WiFi Signal"
    update_interval: 15s
    filters:
      - sliding_window_moving_average:
          window_size: 15
          send_every: 15
          send_first_at: 15
    icon: mdi:wifi
    
  - platform: adc
    pin: A0
    icon: mdi:lightning-bolt
    name: "Leak Voltage"
    update_interval: 1s
    filters:
      - multiply: 3.3
    
  - platform: adc
    pin: A0
    icon: mdi:water-alert
    name: "Sink Leak"
    id: sink_leak
    update_interval: 1s
    filters:
      - multiply: 3.3
    internal: true
          
binary_sensor:
  - platform: template
    name: "Leak Status"
    lambda: |-
         float analog = id(sink_leak).state;
         return analog < 2.5; 

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

Контакты из фольги

В Home Assistant это выглядит так:

Анти-кот в Home Assistant

Система относительно простая, но рабочая. Из минусов — необходимо подводить питание. Если нету рядом розетки, то это немного проблематично. Можно также использовать и как датчик протечки воды.

Подвох с интеграцией Xiaomi Mi LED Desk Lamp в Home Assistant

Подвох с интеграцией Xiaomi Mi LED Desk Lamp в Home Assistant

Xiaomi Mi LED Desk Lamp(MJTD01YL)

Купили пару настольных ламп от Xiaomi заранее посмотрев список поддерживающихся устройств.

Модель в списке поддерживающихся
Модель в списке поддерживающихся

Но тут я столкнулся с проблемой — отсутствует пункт включения локального управления лампой! Соответственно добавить лампу через интеграцию Yeelight не получится.

Отсутствует пункт включения управления по LAN

После гугления проблемы оказалось, что после очередного обновления приложения Yeelight зачем-то убрали этот пункт. Решение — откатить приложение Yeelight и включить локальное управление, а затем можно обновиться до последней версии.

В старой версии приложения есть пункт включения LAN режима

После включения режима лампа без проблем добавляется в Home Assistant через стандартную интеграцию.

Лампа в Home Assistant

Возвращаем rc.local в Ubuntu

Возвращаем rc.local в Ubuntu

В новых версиях Ubuntu убрали rc.local. Но так как я уже привык к нему, а через crontab не очень удобно, то я решил вернуть его обратно.
Создаем файл rc.local:

nano /etc/rc.local

Добавляем в rc.local содержимое:

#!/bin/sh -e 

exit 0 

Даем права на исполение:

chmod +x /etc/rc.local

Создаем rc-local.service:

nano /etc/systemd/system/rc-local.service

И добавляем следующее:

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

Включаем автозагрузку и запускаем сервис:

systemctl enable rc-local.service
systemctl start rc-local.service

Проверяем, все-ли впорядке:

systemctl status rc-local.service

В случае успеха вывод будет таким:

rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (exited) since Mon 2021-04-26 21:27:57 UTC; 24min ago
      Tasks: 0 (limit: 4232)
     Memory: 0B
     CGroup: /system.slice/rc-local.service

Альтернативная интеграции потолочной лампы Yeelight в Home Assistant

Альтернативная интеграции потолочной лампы Yeelight в Home Assistant

Yeelight — Каталог товаров — Яндекс.Маркет

Так как меня изрядно задолбало видеть «unavailable» и идти перещелкивать автомат на свет, то я начал искать выход из положения. Нашел интеграцию через MIIO https://github.com/al-one/hass-miio-yeelink.
Интеграция ставится либо вручную в папку custom_components, либо через HACS.

Для добавления понадобиться токен устройства, который можно посмотреть через шлюз, либо через модифицированный Mi Home от vevs.

После добавления появится 1 объект(по крайней мере для моей модели ceiling20) light без ночного режима и RGB подсветки. Для добавления ночника необходимо создать кнопку и написать автоматизацию.

configuration.yaml:

input_boolean:
  yeelink_nightlight:
    name: nightlight
    icon: mdi:lightbulb

automations.yaml:

- alias: Nightlight Off
  trigger:
  - platform: state
    entity_id: input_boolean.yeelink_nightlight
    to: "off"
  action:
    - service: miio_yeelink.send_command
      data:
        entity_id: light.xiaomi_yeelink
        method: set_ps
        params:
        - nightlight
        - 'off'

- alias: Nightlight On
  trigger:
  - platform: state
    entity_id: input_boolean.yeelink_nightlight
    to: "on"
  action:
    - service: miio_yeelink.send_command
      data:
        entity_id: light.xiaomi_yeelink
        method: set_ps
        params:
        - nightlight
        - 'on'

Получим результат:

Да, пока нету поддержки RGB подсветки, но думаю в будущем автор ее добавит. Мне же не особо важна подсветка, а в крайнем случае ей можно управлять через приложение Yeelight. Самое главное, что теперь моя лампа не отваливается несколько раз в сутки, и не приходится бегать дергать автомат, что бы можно было включать с Яндекс.Станции.

Как дать права юзеру на папку в Linux

Как дать права юзеру на папку в Linux

Для начала необходимо создать группу, и добавить в нее нашего юзера.

sudo groupadd dev
sudo usermod -aG dev boris

Далее надо изменить группу для нашей папки

sudo chown -R root:dev /var/www

И соответственно выставить на папку права для группы

sudo chmod -R 755 /var/www

Теперь пользователь boris имеет право чтение/запись файлов в директории /var/www. Что бы дать еще одному пользователю доступ, достаточно будет просто добавить его в группу.


Интеграция GyverLamp в Home Assistant

Интеграция GyverLamp в Home Assistant

Лампа Гайвера декоративный светильник | Festima.Ru - Мониторинг объявлений

Шьем свою ESP прошивкой с MQTT отсюда. В Home Assistant в configuration.yaml добавляем:

input_number:
  gl_brightness:
    name: Brightness
    initial: 10
    min: 1
    max: 255
    step: 1
    icon: mdi:brightness-6
  gl_speed:
    name: Speed
    initial: 30
    min: 0
    max: 255
    step: 1
    icon: mdi:speedometer

  gl_scale:
    name: Scale
    initial: 30
    min: 1
    max: 100
    step: 1
    icon: mdi:ruler
    
input_select:
  gl_effect:
    name: Effects
    options:
      - "Конфетти"
      - "Огонь"
      - "Радуга верт."
      - "Радуга гориз."
      - "Смена цвета"
      - "Безумие 3D"
      - "Облака 3D"
      - "Лава 3D"
      - "Плазма 3D"
      - "Радуга 3D"
      - "Павлин 3D"
      - "Зебра 3D"
      - "Лес 3D"
      - "Океан 3D"
      - "Цвет"
      - "Снегопад"
      - "Матрица"
      - "Светлячки"
      - "Аквариум"
      - "Звездопад"
      - "Пейнтбол"
      - "Спираль"
      - "Теплый свет"
      - "Маятник"
      - "Мерцание"
      - "Полицейская сирена"
      - "Дрейф"
      - "Стая"
      - "Мотыльки в банке"
      - "Демо"
    initial: "Демо"
    icon: mdi:panda

В automations.yaml:

- alias: Gyver Speed
  trigger:
    platform: state
    entity_id: input_number.gl_speed
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/speed/set
        payload_template: "{{ trigger.to_state.state | int }}"
    
- alias: Gyver Scale
  trigger:
    platform: state
    entity_id: input_number.gl_scale
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/scale/set
        payload_template: "{{ trigger.to_state.state | int }}"
        
- alias: Gyver Brightness
  trigger:
    platform: state
    entity_id: input_number.gl_brightness
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/brightness/set
        payload_template: "{{ trigger.to_state.state | int }}"
        
- alias: Gyver Effect
  trigger:
    - platform: state
      entity_id: input_select.gl_effect
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/set
        retain: true
        payload: "{{ states('input_select.gl_effect') }}"

Радуемся:

Настройка sendmail + opendkim на Ubuntu

Настройка sendmail + opendkim на Ubuntu

настройка sendmail opendkim ubuntu

Для начала необходимо установить сам sendmail.

apt install sendmail

Редактируем hosts

nano /etc/hosts

и добавляем туда строку

127.0.0.1 localhost domain.com

Обратите внимание! Везде где указан domain.com — меняем на свой реальный домен.

Ставим opendkim и opendkim-toolsе

apt-get install opendkim opendkim-tools

Создаем папку где будут храниться ключи

mkdir -p /etc/opendkim/keys/domain.com

Генерируем ключи

opendkim-genkey -D /etc/opendkim/keys/domain.com -d domain.com -s mail

После выполнения команды в папке /etc/opendkim/keys/domain.com появятся два файла mail.txt и mail.private
Для них необходимо назначить права доступа

chown -R opendkim:opendkim /etc/opendkim/keys/domain.com
chmod 640 /etc/opendkim/keys/domain.com/mail.private
chmod 644 /etc/opendkim/keys/domain.com/mail.txt

Редактируем конфигурацию opendkim

nano /etc/opendkim.conf

Удаляем все и вставляем данную конфигурацию.

AutoRestart Yes
AutoRestartRate 10/1h
UMask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:8891@127.0.0.1
Domain domain.com
Selector mail

Создаем три файла и добавляем в них необходимую конфигурацию

nano /etc/opendkim/KeyTable
mail._domainkey.domain.com domain.com:mail:/etc/opendkim/keys/domain.com/mail.private
nano /etc/opendkim/SigningTable
*@domain.com mail._domainkey.domain.com
nano /etc/opendkim/TrustedHosts
127.0.0.1
localhost
domain.com

Открываем конфиг sendmail

nano /etc/mail/sendmail.mc

и добавляем в конец

INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@127.0.0.1')

Открываем конфиг opendkim

nano /etc/default/opendkim

и расскоментируем строку SOCKET=»inet:8891@localhost«
Если ее нету, то просто добавляем в конец.

Пересобирем конфиг opendkim и перезапускаем службы

sendmailconfig
systemctl restart sendmail
systemctl restart opendkim

Теперь необходимо добавить TXT запись домена.
Субдомен указываем mail._domainkey, а значение берем из файла /etc/opendkim/keys/domain.com/mail.txt
Пример:

v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1hrOt283HUPBskuF2f6Dij9BDxxx+Gz09lGUu7dp8lL8S7it3SI2HQRqgM/HlsNoRihNxxx/Edgs8FFoaru4N7b8QXJirXxpe7yJRbnUhYacFVxxxGuFJPpRr6LNSVWhWh8d4Z2e2af2n2VJVbb5ByP3b6MxxxKYw8gj1oVyHVq+kM7jLzOvA8zu9NyPaPhKcF68ZVCnkrON4lgUzQwLwJHo3I5YF7zwAK5jDRZlriI8aXkzxxxSYlyzMFyd6E/5s9TwO40UyhfEl3WooLRaB27ty5MBdg4pJtch4IiM4FhslxRDf1d7juuDktL81YdDosD4RDBgphl6lZoOynOe9wIDAQAB

На этом настройка sendmail + dkim завершена. Проверить работоспособность dkim можно на https://www.mail-tester.com/