LINUX.ORG.RU
ФорумTalks

Накопились вопросы по «умному дому»

 


3

1

Вразнобой, так сказать, как буду вспоминать.

Первое, самое актуальное. Скриптовая логика. Я так пока и не пришёл к единому подходу, как возвращать и анализировать логические значения. Был бы какой-нибудь «Forth командной строки», нормально взаимодействующий с Linux-окружением, было бы проще. Но приходится работать в контексте bash'а.

Например, статус «допустима ли концентрация CO2». Очевидное решение — возвращать после проверки «0» или «1»:

#!/bin/bash

[ $(hall_co2) -ge 1100 ] && echo 1 || echo 0


И проверять соответствующим образом:
#!/bin/bash

. $(dirname $0)/../init

if [ "$(is_hall_co2_notice)" == "0" ]; then
    exit
fi

once_per 10 check-co2-hall-notice send-to-telegram "В зале душно: $(hall_co2) PPM."


Можно возвращать пустое значение и проверять по -z/-n, но тогда теряется единообразие с командами, возвращающими целые значения. Жаль, что bash не считает «0» за false.

Но, с другой стороны, если возвращать статус, то можно было бы писать короче и логичнее, например:

is_hall_co2_notice || exit


Я пока, как в примере выше, вывожу «0» или «1», но не считаю этот вариант удобным :-/

★★★★★

Второй вопрос — инициализация подсистемы. Bash не позволяет вызывать команды по относительным путям к каталогам в PATH. У меня много команд для получения значения сенсоров, для оценки этих параметров и для условий. Можно, конечно, тупо собрать всё в один каталог и прописать его в PATH при загрузке системы, но как-то грязно получается :-/ За пределами «умного дома» это всё не нужно и все команды в куче мешают при разработке. Пока они раскиданы по подкаталогам и эти подкаталоги дописываются в PATH в init-скрипте, который приходится вызывать из каждого скрипта. Тоже как-то криво получается...

KRoN73 ★★★★★
() автор топика

Вопрос не совсем в тему. А можно где-нибудь почитать о процессе создания этого «умного дома», какие решения и почему использовались и т.д.?

Deleted
()

Третий вопрос чисто технический. Данные у меня передаются между узлами по MQTT с атрибутом retained. Linux-скрипты забирают нужные данные через mosquitto_sub:

mosquitto_sub -h 192.168.1.3 -V mqttv311 -t /neron/sensors/mhz19 -C 1 2>/dev/null | tr -d '\n\r'


Проблема в том, что при этом получается почему-то задержка ровно в одну секунду.

Забавно, что само значение mosquitto_sub возвращает мгновенно, но секунду потом ждёт при дисконнекте:
┌─( ✔ 07:52:27 +00:00:00.248):/var/sync/Linux-Tools/smart-home/sensors
└balancer@home-server─> mosquitto_sub -h 192.168.1.3 -V mqttv311 -t /mhz19/co2 -C 1 -d
Client mosqsub/15675-home-serv sending CONNECT
Client mosqsub/15675-home-serv received CONNACK
Client mosqsub/15675-home-serv sending SUBSCRIBE (Mid: 1, Topic: /mhz19/co2, QoS: 0)
Client mosqsub/15675-home-serv received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/15675-home-serv received PUBLISH (d0, q0, r1, m0, '/mhz19/co2', ... (3 bytes))
828
Client mosqsub/15675-home-serv sending DISCONNECT


Вот тут задержка возникает после последней строчки.

Когда проверок значений много, система начинает реагировать очень медленно. Не знаю, что с этим делать :)

KRoN73 ★★★★★
() автор топика
Последнее исправление: KRoN73 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Вопрос не совсем в тему. А можно где-нибудь почитать о процессе создания этого «умного дома», какие решения и почему использовались и т.д.?

В виде какой-то готовой статьи — нет. Либо на ЛОРе в комментариях, либо у меня на форуме: http://www.balancer.ru/tech/forum/viewforum.php?id=55

Есть немного в блоге в ZeroNet: http://127.0.0.1:43110/1ApsfuUfnyJm19qZguDzzqj7se41Ggxzrt/

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

А можно где-нибудь почитать о процессе создания этого «умного дома»

Если коротко, то, что я делаю, скорее называют «глупым домом» — это информационная система, которая сама почти ничего не делает :) Обычно под «умным домом» называют решение, где есть какое-то управление процессами — вентиляторы всякие, системы отопления и кондиционирования и т.п. У меня традиционно с механикой проблемы криворукости, да и на съёмной квартире особо не развернёшься. Так что в основном система выполняет функции контроля и подсказок. Что сейчас есть:

Технически — несколько более-менее автономных узлов/нод:

- Датчики на ESP8266 (концентрация углекислого газ в двух комнатах, концентрация природного газа на кухне, температура, влажность, давление, освещение в комнате, присутствие людей)

- Узел на OrangePi для синтеза речи через Яндекс. Использует собственные колонки, так что никогда не заглушается. На нём же частично висит cron-логика.

- Домашний Linux-сервер, который исполняет функции MQTT-брокера и тоже частью cron-логика.

Программно:

- Синтез речи через Яндекс. Управляется, как и всё, через MQTT. Любой узел кидает запрос say с параметром — текстом, нода на OrangePi принимает запрос, шлёт текст Яндекс API, проигрывает полученный MP3. По утрам зачитывается прогноз погоды на день, расписание уроков в школе у дочки, выводятся предупреждения о высокой концентрации газа на кухне или повышенной концентрации CO2 и необходимости проветривания.

- Отсылка предупреждений в Telegram. Также бот в телеграмме имеет некоторые зачатки управления — можно запросить параметры сенсоров, зачитать текст через синтезатор (дочка и жена сейчас часто балуются в дороге, отсылая таким образом голосовые сообщения мелкому пацану — тот всерьёз считает, что он общается с роботом :D), отправить из Телеграма домой на OrangePi для воспроизведения голосовое сообщение (т.е. в смысле запись своим голосом). А, ещё из Телеграма можно управлять немного эффектами светодиодной ленты :)

В процессе частичной готовности:

- RGB-матрица 64x32 для вывода всякой информации в коридоре. Типа предупреждения о непогашенном на кухне газе, прогноз погоды, какие-то напоминания. Сейчас матрица выводит только тексты и подключена по проводу, хочу допилить вывод картинок и автономность по Wi-Fi через ESP8266.

- «Голова робота»: http://www.balancer.ru/g/p5762349

Давно чешу репу на счёт управления приоткрытием/закрытием окна, но тут уже требуется механика, у меня с этим грустно :) Так что пока не решил как делать.

...

Ещё у аквариума с черепахой свет выключается/включается по расписанию через Sonoff, но это пока по сути отдельное решение вне моего «умного дома».

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

По программной части ещё хочу сделать забор данных календарей с Gmail, чтобы «робот» (синтезатор речи на OrangePi) зачитывал напоминания о предстоящих делах.

Ну и, конечно, распознавание речи. Я пока баловался с PocketSphinx и простыми фиксированными командами, но то ли микрофон на OrangePi фиговый, то ли PocketSphinx я не допилил, то ли мешает фоновый шум — но очень высок процент ложных срабатываний.

Сейчас подумываю об использовании внешнего распознавания от Google или Яндекс. Но надо решить вопросы активации по ключевому слову, отсылки данных и т.п. Ещё не брался.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Да нет, ПЛК мне пока нафиг не сдались с моими задачами :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от eR

и потом это всё внезапно поумнеет и взорвёт хату.

Для этого оно должно не только поумнеть, но и, во-первых, впасть в депрессию и прийти к выводу о необходимости прекращения существования, во-вторых, убедить меня приделать к нему исполнительные устройства, способные взорвать хату :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

само значение mosquitto_sub возвращает мгновенно, но секунду потом ждёт при дисконнекте

Это не связано с Keep-Alive?

RabbitMQ слишком жирный для твоей системы?

/var/sync/

Папочку синкаешь по unison?

pacify ★★★★★
()
Ответ на: комментарий от pacify

Это не связано с Keep-Alive?

Да нет, там же подцепился, забрал значение, отцепился.

RabbitMQ слишком жирный для твоей системы?

Да смысла нет, Москит отлично справляется. Только почему-то консольный клиент на дисконнекте ровно секунду ждёт :)

Папочку синкаешь по unison?

Нет, обычно по syncthing, но некоторые вещи по rslsync (бывший btsync)

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.