Ну типа умный дом в сотый раз

Jan 09, 2013 03:30

Короче, я всячески читал литературу и понял, что это капец и засада - делать умный дом. Народ что только не придумал. Я почитал-почитал и решил так.

Разделяем все на три логические сети:
  • Чувствительная сеть - это чисто сенсоры
  • Ахтунговая сеть - это оповестительные разные механизмы и передача медиа-контента
  • Управленческая сеть - это когда нужно чем-нибудь управлять
В дальнейшем собираюсь выделить из чувствительной и ахтунговой сети выделить отдельный сегмент, который будет исполнять функции безопастности и только ее. Скорее всего построю ее на более примитивном и надежном железе (STM32 или подобное) с более примитивным транспортом. Сейчас на это заморачиваться нет сил и знаний накопилось еще слишком мало.

Итак, вариантов физической реализации самой сети реального много всяких - 1-wire, CAN, I2C, Ethernet и прочие всякие извращения. В принципе, самый простой и в лоб - это 1-wire:


Все как бы круто, но гарантии, что это будет работать на больших расстояниях и большом количестве датчиков (у меня выходит больше ста) особой нет. Зато реально дешево, можно даже адаптер не покупать никакой, а все завязать на GPIO. Короче, как бы халява. Но есть такая штука - если головное устройство померло, то все. Сеть тоже померла. Ну и все сенсоры могут работать только в пассивном режиме. Ну и выбор сенсоров не очень велик, потому как перед каждым должен быть чип с уникальным ID.

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

Тогда типа CAN - экономим провода и до кучи получаем хорошую надежность и устойчивость супротив всяких там помех:



Тут все круто, но есть засада. Распайки под CAN есть на большом количестве STM32 чипах и даже более старых всяких 8битных уродах. А вот под Raspberry можно например через USB это дело пускать - но денег стоит прилично.

А с другой стороны, нахрена вообще CAN, если сеть под него физически такая же как и под LAN? tcp-ip оно как-то проще писать и здоровее и вообще.

Короче, нахрен CAN, даешь Ethernet.

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

Короче, я думал и все такое и получилось так:

Всякие там C-программируемые контроллеры - это круто и надежно. Но во-первых, заколебешься писать на них код под С. Ну реально, читал некоторые исходники, там угрохаешься писать упражнение типа "мигни светодиодом два раза". Но надежно капец и недорого. А потом к этому всему нужно будет самому подбирать датчики и отлаживаться. Это уже более грустно - на эмуляторе не поотлаживаешься, нужно JTAG и прочее извращение подключать, а это как жопой чай пить - прикольно, но смысла особого нет - денег экономится не так уж и пропорционально много. А времени уходит куда больше.

Всякие ардуино идут сразу лесом из-за ценников. Удивительно, как хороший пиар может делать адскую цену. Гемора с отладкой и все такое несколько меньше - там просто комьюнити большое и уже адское количество проектов, на которых можно поучиться.

А еще есть Raspberry PI, я как раз себе купил парочку и баловался и они хорошие и не дорогие. С проводами тоже гемор. Но дебажить легче - писать можно на чем хочешь, хоть и дебаг выходит не такой глубокий как на голеньких микроконтроллерах, ну да и хрен с ним (убрал про жопу) :)

Есть еще один плюс у малинки ПИ - она адски расширяется - хочешь RTOS/RT Linux core, хочешь - через усб что-нибудь подключи и все такое.

Короче, херачим на малине.

Дальше так - сеть будет без головного устройства. Она будет читать показания сенсоров и бродкастить их в сеть - кому надо - прочитают и примут меры. Головное устройство может следить за всем этим (и будет) и внимательно все записывать. Но его смерть на работоспособоность сети никак не повлияет. Это хорошо.

То есть, как бы вот картинка традиционного и моего нового супер-инновационного (ггг) подходов:






Я закажу несколько сенсоров и макеток, чтобы начинать все это собирать вместе (сенсоров будет огого - температура, влажность, газы, свет, движение, детектор дыма, влага/вода, возможно ультразвуковые датчики, пока не знаю, геморные они какие-то).

А пока все это едет на поезде из Китая, я решил немного попрограммировать и задать вопрос.

Короче, пишем небольшой сервер, который будет слушать порт:

import config
from socket import *
def udp_listener():
    address = (config.UDP_BIND_ADDRESS,config.UDP_BROADCAST_PORT)
    server_socket = socket(AF_INET, SOCK_DGRAM)
    server_socket.bind(address)
    print('Listening on port %s' % config.UDP_BROADCAST_PORT)
    while 1:
        rec_data, rec_adr = server_socket.recvfrom(128)
        print 'Got data from %s: > %s' % rec_adr, rec_data

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

from socket import *
from utils import generate_random_token
def broadcast(number_of_messages = 10):
    BROADCAST_PORT = 9010
    for x in range(number_of_messages):
        try:
            random_token = generate_random_token(6)
            print('sending network message: %s' % random_token)
            broadcast_socket = socket(AF_INET,SOCK_DGRAM)
            broadcast_socket.bind(('',0))
            broadcast_socket.setsockopt(SOL_SOCKET,SO_BROADCAST,1)
            broadcast_socket.sendto(random_token,('
',BROADCAST_PORT))
        except Exception as e:
            print 'Failed to send network message: %s' % e

Оно работает и все весело, но я что подумал (внимание вопрос, типа): есть ли смысл просто перекидываться строками (я понятно их отформачу, типа "[sensor_id][sample_time][sensor_class][sensor_value]") или таки использовать какой-нибудь например более формальный протокол, чтобы было как-то структурнее или веселее?

Ну и да - если тут есть всякие там умные инженеры и все такое, вы говорите/критикуйте, ну?

умный дом, наш дом, сделай сам

Previous post Next post
Up