Декабрь 1

fang-hacks + webhook HA

и так тут берем мучаемся но все же запускаем мертвую камеру как ip камеру

tut

Далее пробуем настроить детектор движения, ведь лишних датчиков не бывает

вроде тут есть инструкция, но файлы которые можно найти в репозиторием выдавали

snx_isp_ctl Segmentation fault

mosquitto_pub Segmentation fault

единственные файлы которые у меня заработали это файлы с «/media/mmcblk0p2/data/test»

Но mqtt там нет, а wget не хочет работать с post

решение

создаем два файла

vi /media/mmcblk0p2/data/usr/bin/jsonmotion.sh

#!/bin/sh
json=$(cat <<EOF
{
"motion": true
}
EOF
)&&len=${#json}&&echo -e "POST /api/webhook/my-super-secret-webhook-id HTTP/1.1\r\nHost: 192.168.1.88\r\nContent-type: application/json\r\nContent-length: $len\r\nConnection: close \r\n\r\n$json" | nc -i 3 host.ha 8123

chmod 755 /media/mmcblk0p2/data/usr/bin/jsonmotion.sh

vi /media/mmcblk0p2/data/usr/bin/jsonnomotion.sh

#!/bin/sh
json=$(cat <<EOF
{
"motion": false
}
EOF
)&&len=${#json}&&echo -e "POST /api/webhook/my-super-secret-webhook-id HTTP/1.1\r\nHost: 192.168.1.88\r\nContent-type: application/json\r\nContent-length: $len\r\nConnection: close \r\n\r\n$json" | nc -i 3 host.ha 8123

chmod 755 /media/mmcblk0p2/data/usr/bin/jsonnomotion.sh

и меняем vi /media/mmcblk0p2/data/usr/bin/rtsp-md.sh

#!/bin/sh

# Copyright 2018 Vladimir Dronnikov
# GPL
# MQTT added by Johan Leirnes 2018-11-28

snx_isp_ctl --mdset-thre 1000 # YMMV
snx_isp_md 2>&1 | awk '
/^Detected Moving!$/ {
  if (alarm == 0) {
    alarm = 1
    print "+alarm"
    system("/media/mmcblk0p2/data/usr/bin/jsonmotion.sh")
  }
}
/(have no motion status = 0)/{
  if (alarm != 0) {
    alarm = 0
    print "-alarm"
    system("/media/mmcblk0p2/data/usr/bin/jsonnomotion.sh")
  }
}
'

Октябрь 20

Techem Poznań

Итак, показатели счетчиков Techem собираем показания с помощью iM871A-USB | IMST и wmbusmeters

типы наших счетчиком

счетчик тепла

manufacturer: (TCH) Techem Service (0x5068)
type: Heat Cost Allocator (0x08) encrypted
ver: 0x94

и счетчик воды (горячей и холодной)

manufacturer: (TCH) Techem Service (0x5068)
type: Radio converter (meter side) (0x37) encrypted
ver: 0x95

на системе линукс устанавливаем дополнительные библиотеки клонируем репозитариум и устанавливаем программу.

sudo apt install librtlsdr-dev
git clone https://github.com/weetmuts/wmbusmeters.git 
cd wmbusmeters
./configure; make; sudo make install

собираем данные которые можем получить, что

wmbusmeters --debug auto:c1 > ~/txt.txt 2>&1 &

открываем файл

nano ~/txt.txt

и ищем в нем наши счетчик воды

ctrl+w

вписываем номер с счетчика воды

пункт 1 на фото

и создаем файл с (внимание в случае со счетчиками воды номер счетчика и номер, который он передает, разный — потому id с которого будем слушать сообщение это номер 2 на фото)

nano /etc/wmbusmeters.d/woda

name=woda
id=пункт 2 с фото сверху

ctr+o

ctr+x

Y

enter

nano ~/txt.txt

и ищем в нем наши счетчик воды

ctrl+w

вписываем номер с счетчика тепла и находим id который заканчивается нашим номер пункт 2 на фото ниже

и создаем файл с нашими батареями

nano /etc/wmbusmeters.d/vanna

name=vanna
id=пункт 1+2 на фото сверху

проделываем последние шаги со всеми счетчиками

Настаиваем сервис

nano /etc/wmbusmeters.conf

loglevel=normal
# You can use auto:t1 to find the device you have connected to your system.
# But do not use auto here since it will cause unnecessary and slow probing of the serial ports.
device=im871a:t1
# And mbus
logtelegrams=true
format=json
meterfiles=/var/lib/wmbusmeters/meter_readings
meterfilesaction=overwrite
meterfilesnaming=name
meterfilestimestamp=day
logfile=/var/log/wmbusmeters/wmbusmeters.log
alarmtimeout=1h
alarmexpectedactivity=mon-sun(00-23)
ignoreduplicates=true
shell=/usr/bin/mosquitto_pub -h  host -u login -P password  -t wmbusmeters/$METER_ID -m "$METER_JSON"
alarmshell=/usr/bin/mosquitto_pub -h  host -u login -P password -t wmbusmeters_alarm -m "$ALARM_TYPE $ALARM_MESSAGE"

Меняем выделенные значения на свои.

Далее, устанавливаем сервис

sudo systemctl enable wmbusmeters

и запускаем

sudo systemctl start wmbusmeters

Проверьте установлен ли у вас mosquitto_pub ошибок в лога у меня не было

Выполните mosquitto_pub для теста система подскажет команду для установки нужного пакеты

как результат мы получим наши счетчики. Вода

И тепло, с показаниями температуры

Август 1

Настраиваем L2TP VPN-сервер на платформе Linux (Debian / Ubuntu) для подключение роутеров xiaomi

Как я вытягивал камеры с очень серого IP малой кровью

Инструкция

Для работы с IPsec мы будем использовать пакет strongSwan, установим его:

apt install strongswan

Затем откроем файл настроек /etc/ipsec.conf и добавим в его конец следующие две секции:

conn rw-base
fragmentation=yes
dpdaction=clear
dpdtimeout=90s
dpddelay=30s

conn l2tp-vpn
also=rw-base
ike=aes128-sha256-modp3072
esp=aes128-sha256-modp3072
leftsubnet=%dynamic[/1701]
rightsubnet=%dynamic
mark=%unique
leftauth=psk
rightauth=psk
type=transport
auto=add

Первая секция задает общие параметры: включает фрагментацию IKE и настраивает протокол обнаружения мертвых узлов (Dead Peer Detection, DPD), отвечающий за обнаружение неактивных клиентов. Вторая относится уже к L2TP-соединениям, указывая использовать транспортный режим IPsec, аутентификацию по общему ключу и задает используемые шифры. Приведенные значения являются рекомендуемыми и взяты из официальной документации strongSwan.

Общий ключ следует указать в файле /etc/ipsec.secrets, добавив в него следующую строку:

%any %any : PSK "mySharedKey"

Где mySharedKey — общий ключ, так как от него зависит безопасность вашей VPN-сети мы рекомендуем использовать в качестве ключа случайно сгенерированную строку из букв, цифр и спецсимволов. Для этого можно воспользоваться командой:

openssl rand -base64 18

Результатом ее выполнения станет случайная строка длинной в 18 символов.

l2tp-vpn-server-debian-ubuntu-001.pngПосле внесения указанных настроек перезапустим службу:

systemctl restart strongswan

В Ubuntu имя службы несколько иное — strongswan-starter, поэтому команда будет иметь вид:

systemctl restart strongswan-starter

Настраиваем L2TP

Для реализации функций L2TP-сервера предназначен пакет xl2tpd, для его установки выполните:

apt install xl2tpd

Затем откройте файл настроек /etc/xl2tpd/xl2tpd.conf, раскомментируйте и приведите к следующему виду опции:

[global]
port = 1701
auth file = /etc/ppp/chap-secrets
access control = no
ipsec saref = yes
force userspace = yes

[lns default]
exclusive = no
ip range = 10.2.2.100-10.2.2.199
hidden bit = no
local ip = 10.2.2.1
length bit = yes
require authentication = yes
name = l2tp-vpn
pppoptfile = /etc/ppp/options.xl2tpd
flow bit = yes

Большая часть опций относится к настройке протокола L2TP и требует понимания его работы, поэтому мы на них останавливаться не будем. Разберем те опции, которые имеют существенное значение. Параметр auth file указывает на файл с данными для аутентификации, а pppoptfile — набор опций для PPP-соединения, которое используется внутри L2TP-туннеля, name — имя сервера, которое будет использоваться для поиска аутентификационных данных в файле chap-secrets.

Опции local ip и ip range отвечают за локальный адрес сервера в VPN-сети и диапазон адресов для выдачи удаленным клиентам. Здесь можно использовать два подхода: выдавать клиентам адреса из диапазона локальной сети офиса и включить ProxyARP, в этом случае настраивать маршрутизацию на клиентах не требуется, они будут как-бы включены в общую сеть офиса на канальном уровне (L2), либо выдавать адреса из непересекающегося диапазона и использовать маршрутизацию. Автоматизировать создание маршрутов для Windows-клиентов можно с использованием PowerShell.

Для настройки PPP перейдем в /etc/ppp и скопируем стандартный файл настроек:

cd /etc/ppp
cp options options.xl2tpd

Затем открываем файл /etc/ppp/options.xl2tpd на редактирование и приводим к следующему виду. Опции перечислены в порядке их следования, нужно раскомментировать их и указать нужное значение, если опция отсутствует, то ее следует добавить в конце файла.

asyncmap 0
auth
crtscts
lock
hide-password
modem
mtu 1460
lcp-echo-interval 30
lcp-echo-failure 4
noipx
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
multilink
mppe-stateful

Если вы будете использовать ProxyARP то дополнительно раскомментируйте опцию:

proxyarp

Также для Windows-клиентов можно передать настройку DNS-серверов, для этого добавьте опции:

ms-dns 192.168.1.1
ms-dns 192.168.1.2

Это позволит настроить первичный и альтернативный DNS-сервера в системе.

Сохраним все внесенные изменения и перезапустим службу L2TP-сервера:

systemctl restart xl2tpd

Строку со следующим сообщением можно проигнорировать, на работу VPN-сервера она не влияет:

xl2tpd[843]: setsockopt recvref[30]: Protocol not available

Заключительным этапом настройки будет создание учетных записей для удаленных клиентов, для этого откроем файл /etc/ppp/chap-secrets и внесем следующую строку:

ivanov   l2tp-vpn   Pa$$word_1   *

Первым указываем логин, затем имя службы, оно должно совпадать с тем, которое мы указали в опции name в xl2tpd.conf, после него идет пароль и IP-адрес клиента, символ * обозначает что можно присвоить любой адрес из выбранного диапазона. Если же требуется выдать клиенту постоянный адрес, то его следует указать явно, и он не должен входить в динамический диапазон указанный в ip range, например:

petrov   l2tp-vpn   Pa$$word_1   10.2.2.99

Для доступа к L2TP-серверу следует разрешить в брандмауэре входящие подключения к портам 500 UDP, 1701 UDP и 4500 UDP.

И инструкция для переброски портов доступа в интернет клиента VPN через сервер VPN

nano /etc/ppp/ip-up добавляем

iptables -t nat -A POSTROUTING -s $5 -j MASQUERADE
iptables -A FORWARD -s $5 -j ACCEPT

nano /etc/ppp/ip-down добавляем

iptables -t nat -D POSTROUTING -s $5 -j MASQUERADE
iptables -D FORWARD -s $5 -j ACCEPT

добавлено 22.02.2024

все то же самое, но если вы хотите параллельно использовать pptp

apt install pptpd
sudo systemctl enable pptpd
sudo systemctl start pptpd
sudo systemctl status pptpd

/etc/ppp/chap-secrets и внесем следующую строку:

petrov1   pptp   Pa$$word_1   10.2.2.97

https://moron.1side.ru/lokalnye-seti/obedinenie-setej-s-pomoshhyu-vds-i-vpn-pptp.php
Июль 28

Home Assistant Letsencrypt local network SSL

И так мы установили всю систему и установили сертификаты, все бы хорошо, но теперь доступ по локальному адресу должен быть по https://192.168.*.*:8123 конечно с ругательством и.т.п

Изначально было попытка настроить роутер который бы перебрасывал из локальной сети на внутренний адрес по домену этакий /etc/hosts на роутере что вполне возможно на некоторых прошивках например Padawan, но у меня две сети и Home Assistant находится во внутренней 192.168.1.*** и с 192.168.0.*** разделено через wan.

Перенаправление не работает и доступ по домену homeassistant.domaen.ru из локальной сети кидает на вебморду роутера 192.168.0.1

Решение оказалось намного проще.

Создаете себе еще один суб-домен localhomeassistant.domaen.ru и прописываете ему A запись 192.168.1.***

Если получаете сертификат через DNS проблемы заканчиваются, разве если ходите можно создать для главной сети 192.168.0.*** тогда создаете себе имя local1homeassistant.domaen.ru или что-то подобное с A записью 192.168.0.5 (wan) роутера 192.168.1.*** и на него тоже получаете сертификат

Если решились заморочиться с получением сертификатов через http, то сначала всем записям прописываете внешний IP а после получения сертификата на три домена поменяйте IP на локальные.

Декабрь 18

Insert-gt niebeski & co PLUS Rewizor

odksięgowanie

SELECT TOP (1000) [dkpd_IdRoku]
      ,[dkpd_NumerLp]
      ,[dkpd_NumerPozycji]
  FROM [dbo].[dkr_ParametrDziennika]
SELECT TOP (1000) [dkr_Id]
      ,[dkr_Status]
      ,[dkr_Ksiegowal]
      ,[dkr_NrWDzienniku]
  FROM [ITIST].[dbo].[dkr__Dokument] where dkr_Id >469

отменяем проведение документов с id  > 471
UPDATE dbo.dkr__Dokument 
SET 
dkr_Status = 1, 
dkr_Ksiegowal=NULL, 
dkr_NrWDzienniku=NULL 
where dkr_Id >471


записываем следующий номер в дневнике последний+1 
dkr__Dokument.dkr_NrWDzienniku

Update [dbo].[dkr_ParametrDziennika] set dkpd_NumerLp = 115 where dkpd_IdRoku = 3


dkpd_IdRoku = порядковый номер года для обращения к справочнику 
SELECT TOP (1000) [dkr_Id]
      ,[dkr_IdRoku]
      ,[dkr_DataDekretacji]
      ,[dkr_DataDokumentu]
      ,[dkr_DataOperacji]
      ,[dkr_Status]
      ,[dkr_Rejestr]
      ,[dkr_Numer]
      ,[dkr_NrPelny]
      ,[dkr_DokumentZrodlowy]
      ,[dkr_KontrolaBilansowania]
      ,[dkr_Waluta]
      ,[dkr_WalutaWyswietlana]
      ,[dkr_KursDokumentu]
      ,[dkr_LiczbaJednostek]
      ,[dkr_RodzajKursu]
      ,[dkr_DataKursu]
      ,[dkr_IdBanku]
      ,[dkr_Kwota]
      ,[dkr_KwotaWaluta]
      ,[dkr_Uwagi]
      ,[dkr_IdKategorii]
      ,[dkr_Dekretowal]
      ,[dkr_Ksiegowal]
      ,[dkr_TypObiektu]
      ,[dkr_IdObiektu]
      ,[dkr_TypDokImport]
      ,[dkr_IdDokImport]
      ,[dkr_ImportPochodzenie]
      ,[dkr_IdKh]
      ,[dkr_SymbolKh]
      ,[dkr_NrWDzienniku]
      ,[dkr_Podtyp]
      ,[dkr_TrybWprowadzaniaRozrachunkow]
      ,[dkr_WalutaKursWyswietlany]
      ,[dkr_KwotaWn]
      ,[dkr_KwotaMa]
      ,[dkr_KwotaWalutaWn]
      ,[dkr_KwotaWalutaMa]
      ,[dkr_Storno]
      ,[dkr_Opis]
      ,[dkr_RodzajDowodu]
      ,[dkr_IdObiektuVatOss]
  FROM [dbo].[dkr__Dokument]
Ноябрь 10

xmlreader.so php70

ошибка при загрузке модуля

PHP Startup: Unable to load dynamic library '/opt/php70/lib/php/modules/xmlreader.so' - /opt/php70/lib/php/modules/xmlreader.so: undefined symbol: dom_node_class_entry in Unknown on line 0

вызвана сортировкой файлов загружаемых модулей

решается

xmlreader.ini

; configuration for php xml module
; priority=20
;extension=xmlreader.so

и

dom.ini

extension=dom.so
extension=xmlreader.so

Ноябрь 3

Remove listener — NFC plugin

Проблема собственно в следующем, при активации сканера NFC вешается событие на считывание метки, и в примерах я не нашел как его приостановить или изменить полезно когда есть несколько типов считывания, да и просто если нужно приостановить работу сканера

например в примере

scanButton.addEventListener("click", async () => {
  log("User clicked scan button");

  try {
    const ndef = new NDEFReader();
    await ndef.scan();
    log("> Scan started");

    ndef.addEventListener("readingerror", () => {
      log("Argh! Cannot read data from the NFC tag. Try another one?");
    });

    ndef.addEventListener("reading", ({ message, serialNumber }) => {
      log(`> Serial Number: ${serialNumber}`);
      log(`> Records: (${message.records.length})`);
    });
  } catch (error) {
    log("Argh! " + error);
  }
});

writeButton.addEventListener("click", async () => {
  log("User clicked write button");

  try {
    const ndef = new NDEFReader();
    await ndef.write("Hello world!");
    log("> Message written");
  } catch (error) {
    log("Argh! " + error);
  }
});

при повторном (n) срабатывание тригера scanButton сканер будет дублировать (n) раз

log(`> Serial Number: ${serialNumber}`);
log(`> Serial Number: ${serialNumber}`); //* n

и чтоб от этого избавится, нужно вынести активацию сканера из подписчика клика


    let ndef = new NDEFReader();
   
    async function initNFC(){
        try {
            await ndef.scan();
        } catch (error) {
            curlog("Argh! " + error);
        }
    }
    initNFC();

scanButton.addEventListener("click", async () => {
  log("User clicked scan button");

  try {
    const ndef = new NDEFReader();
    await ndef.scan();
    log("> Scan started");

    ndef.addEventListener("readingerror", () => {
      log("Argh! Cannot read data from the NFC tag. Try another one?");
    });

    ndef.addEventListener("reading", ({ message, serialNumber }) => {
      log(`> Serial Number: ${serialNumber}`);
      log(`> Records: (${message.records.length})`);
    });
  } catch (error) {
    log("Argh! " + error);
  }
});

далее выносим безымянную функцию

  let ndef = new NDEFReader();
   
    async function initNFC(){
        try {
            await ndef.scan();
        } catch (error) {
            curlog("Argh! " + error);
        }
    }
    initNFC();
 function readr({ message, serialNumber }){
      log(`> Serial Number: ${serialNumber}`);
      log(`> Records: (${message.records.length})`); 
}

scanButton.addEventListener("click", async () => {
  log("User clicked scan button");

  

    ndef.addEventListener("readingerror", () => {
      log("Argh! Cannot read data from the NFC tag. Try another one?");
    });

    ndef.addEventListener("reading", readr  ({ message, serialNumber }) => {
      log(`> Serial Number: ${serialNumber}`);
      log(`> Records: (${message.records.length})`);
    },true);
});

что позволяет нам отключить функцию readr при необходимости

 let ndef = new NDEFReader();
    async function initNFC(){
        try {
            await ndef.scan();
        } catch (error) {
            curlog("Argh! " + error);
        }
    }

 initNFC();
 function readr({ message, serialNumber }){
      log(`> Serial Number: ${serialNumber}`);
      log(`> Records: (${message.records.length})`); 
}

scanButton.addEventListener("click", async () => {
  log("User clicked scan button");
    ndef.addEventListener("readingerror", () => {
      log("Argh! Cannot read data from the NFC tag. Try another one?");
    });
    ndef.addEventListener("reading", readr, true);
});

disableScanButton.addEventListener("click", () => {
ndef.removeEventListener("reading", readr, false);
});

Июль 15

debian 10 wkhtmltopdf qt

Он запускает Debian Stretch 9.2 64bit, и на 10 тоже

sudo apt update
    sudo apt install xfonts-75dpi xfonts-base gvfs colord glew-utils libvisual-0.4-plugins gstreamer1.0-tools opus-tools qt5-image-formats-plugins qtwayland5 qt5-qmltooling-plugins librsvg2-bin lm-sensors 
    sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb
    sudo dpkg -i wkhtmltox_0.12.5-1.stretch_amd64.deb
    sudo cp /usr/local/bin/wkhtmltopdf /usr/bin/
    sudo cp /usr/local/bin/wkhtmltoimage /usr/bin/
wkhtmltopdf -V
  wkhtmltopdf 0.12.5 (with patched qt)