homeserver

спешу поделиться находкой - Pushover

Mon, 30/06/2014 - 17:29 -- observer

В рамках своего "академического" проекта homeserver была у меня необходимость как-то сваливать уведомленя от моих систем мониторинга на мобильное устройство. В случаях острой необхоимости  я йспользую свой SMS сервер на базе SIM900, но както сообщения INFO по sms слать не очень..

main_tags: 

Хранение состояний датчиков на RabbitMQ

Wed, 13/03/2013 - 13:07 -- observer

Раньше я уже писал об использовании в проекте HomeServer - сервера сообщений RabbitMQ. Рано или поздно должна была возникнуть задача хранения различных текущих данных системы. Т.е. это какието показатели, состояния датчиков, статусы подсистем и т.п.

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

Задача - хранить текущие данные температуры, влажности, освещенности, состояния триггеров, состояния систем и т.п.. Доступ к этим данным должен быть максимально простым из всевозможных служб. Желательно использовать теже каналы и методы доступа что и в других модулях.

Решил всетаки хранить показания в отдельных очередях сервера сообщений RabbitMQ. Причем хранить только крайнее значение. Такой вариант полезен еще и тем, что позволяет любому сервису подписаться на определенную очередь и получать все обновления (если они есть) автоматически. Другой плюс в том, что за данными можно приходить только иногда, когда это необходимо. Можно подписать сервис видения логов на все очереди сразу, можно накапливать показания, если это необходимо - третьими сервисами. Возмностей и схем на самом деле много. Система получается очень гибкая и легкомасштабируемая.

Единственное что требуется от отправителя и получателя сообщений - умение отправлять и получать AMQP сообщения. Ну и что немаловажно - мое умение это все написать )) Так как я уже немного освоил эту технологию на Python, Java и PHP - задача по добавлению этого функционала в скрипты и программы упрощается.

Таким образом показания датчиков представляют собой сообщение следующего формата:

название параметра; значение параметра; метка времени; дополнительная информация

Код отправителя написан один раз и его дальнейшее использование это лишь добавление одной команды. Код приемника тоже не сложен - получает сообщения из очередей по подписке и парсит данные, временную метку и комментарий в разные переменные. Метка времени полезна, чтобы понять свежие данные или нет, а дополнительная информация может быть использована для чего угодно - пригодится ))

Вот вобщемто и все. Ничего особенного, но на самом деле решена большая задача. Большая часть данных будет хранится именно в таком виде. Очень гибко, просто и легкомасштабируемо.

main_tags: 

Arduino + GSM/GPRS модуль SIM900

Sat, 29/12/2012 - 11:48 -- observer

Ну вот система обрела долгожданный модуль, дополнительную степень свободы - GSM/GPRS связь. Для начала я планирую попробовать его для отправки оповещений по SMS, а также для управления с помощью тех же SMS.

Ардуино - работа в качестве ИК пульта

Wed, 05/09/2012 - 21:40 -- observer

Решил добавить еще одну функцию к своему HomeServer  Это управление устройствами по ИК. То есть всеми домашними устройствами у которых есть пульты дистанционного управления. Радиопульты я уже освоил, теперь остался ИК диапазон. И вот это время пришло.

Arduino IR remote

Обмен сообщениями между скриптами, программами, сервисами и Arduino

Thu, 02/02/2012 - 16:09 -- observer

Новая схема взаимодействия подсистем между собой - система обмена сообщениями на базе RabbitMQ сервера.

RabbitMQ and Arduino

socket server и многопоточность

Mon, 16/01/2012 - 15:36 -- observer

ну вот началось ....

После того как был сделан модуль для общения с COM портом и Ардуиной, возник вопрос как этот модуль будет  получать данные от других программ. То есть выполнять вторую свою функцию.

Есть несколько вариантов. Это может быть socket server, который будет ждать подключения на каком-то порту и принимать/передавать данные. RPC сервер, который будет так же ждать подключения на каком-то порту и выполнять команды. Ну и чтобы пострелять из пушки по воробьям - вариант посложнее и как мне кажется, поинтереснее  это использование очередей сообщений, протокола AMQP и RabbitMQ сервера.

Но остановлюсь пока на socket сервере. Остальное, возможно позже...

Не буду объяснять сам принцип, просто отправлю на пост которым я пользовался сам http://www.demoriz.ru/post-19/  Там все предельно ясно описано, да и поднять отдельный soсket сервер на питоне оказалось не так уж сложно, если без извращений конечно.

Главная проблема, которая сразу возникает при добавлении сервера в уже существующую программу, это остановка основного цикла программы, так как добавленный сервер ждет соединения и держит весь цикл.  Для решения этой проблемы существуют потоки и многопоточность. Чтобы не рыть интернет, а информации по этой теме много и она в основном рассчитана на более подготовленных.  Можно воспользоваться тем что нашел я: http://www.uchi-it.ru/9/11/11.html  http://keysolutions.ru/articles/osnovy-raboty-s-potokami-v-python  Очень внятно написано и понятно начинающим.

Arduino COM port - прием и разбор данных

Sun, 15/01/2012 - 17:13 -- observer

Этот небольшой пост как продолжение темы работы с COM портом, затронутой в посте http://podrugomu.com/node/981. Там я описывал запись данных Ардуиной в порт и разбор их Питоном на стороне компьютера. Теперь же стоит обратная задача - передача данных Ардуине и разбор их на команды.

Задача на первый взгляд не сложная, да и кода не много. Но, что программеру шара, то чайнику - смерть.

Первое это чтение данных из порта функцией Serial.read  в буфер

Второе это разбор буфера на адреса, команды и данные. Я придумал себе такой протокол - unitID,command,data - где unitID - номер устройства, command - команда которая должна быть выполнена этим устройством и data - пакет данных для этой программы, если это необходимо.

Ну и третий этап это обработка команды. Т.е. выполнение ее на плате - например передача на определенный выход каких-то данных (из data) или как показано ниже - включение светодиода.

Arduino - COM port - Python

Mon, 09/01/2012 - 17:24 -- observer

Если не считать мелких опытов с Arduino - мигание светодиодом и тому подобное. Первым, что я решил сделать это подружить Arduino UNO с Python. Чтобы далее управлять платой из своих программ, написанных на Питоне. Сделать это проще всего через COM порт. Небольшой опыт работы с PySerial - питоновской библиотекой для связи с последовательными портами, у меня есть. Ну очень небольшой...

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

Чтобы не следить за тем занят порт или нет и не упустить данные решил сделать посредника, который со стороны компьютера будет брать данные из порта и распределять их между программами. Он же будет принимать данные от программ и укладывать их в порт. Со стороны Arduino аналогичная программа получает данные от устройств, готовит и укладывает их в порт, параллельно возможно делая какие-то прямые выводы из этих данных и управляя другими устройствами. Она же получает данные и команды из порта и раздает их нужным устройствам.

Напрашивается какой-то протокол обмена. Стоит конечно поискать что-то стандартное, но пока необходимо отработать лишь общую схему.