неділя, 29 січня 2017 р.

Raspberry Pi, Pi Camera и отправка email

Вот уже как пару дней, я пользуюсь своим детектором движений на малине. Основной принцип работы, я описал в первом абзаце этого поста. Фото и видео делает Pi Camera Module. Вот статья, в которой описаны основные моменты. Питанием для всей системы я выбрал Xiaomi Mi Power Bank 16000mAh. Реальная емкость где-то на уровне 12000 мАч. Непрерывной работы от одной полной зарядки банки хватает на 24-25 часов. Значит система потребляет где-то 500мА в час.
Корпусом для мини-пк я выбрал коробку от смартфона. Прорезал в ней отверстия под питание, usb-выход и кабеля для датчика движений. В итоге, в собранном виде все это дело выглядит вот так:
На Raspberry был установлен TeamViewer и, перед каждым уходом на работу, я подключаюсь и запускаю скрипт. Для того что бы камера не фиксировала меня когда я ухожу, я поставил задержку в 1 минуту.
Привожу полный код скрипта, который сейчас благополучно работает у меня:
import picamera
import time
import RPi.GPIO as GPIO
from datetime import datetime
import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
#send e-mail via gmail
def send_mail(send_from, password, send_to, send_to_hidden, subject, file_name):
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = send_to
msg['Subject'] = subject
with open(file_name, "rb") as fil:
part = MIMEApplication(
fil.read(),
Name=basename(file_name)
)
part['Content-Disposition'] = 'attachment; filename="%s"' % basename(file_name)
msg.attach(part)
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.starttls()
smtp.login(send_from, password)
smtp.sendmail(send_from, [send_to] + [send_to_hidden], msg.as_string())
smtp.quit()
### main block ###
#number of GPIO on board
sensor = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN)
delay_sec = 60
mark_time = time.time()
cur_state = 0
while True:
time.sleep(1)
cur_state = GPIO.input(sensor)
print(cur_state)
if cur_state == 1:
if time.time() - mark_time > delay_sec:
delay_sec = 10
msg = "Some movement. Time: {0}".format(str(datetime.now())[:-7])
print(msg)
mark_time = time.time()
with picamera.PiCamera() as camera:
#photo
camera.resolution = (1280, 720)
time.sleep(1)
filename = '/home/pi/Desktop/Pictures/%s.jpg' % str(datetime.now())
camera.capture(filename)
#send email
send_mail('my_email@gmail.com',
'mypass',
'first_email@gmail.com',
'second_email@gmail.com',
str(datetime.now()),
filename)
#video
# filename = '/home/pi/Desktop/Pictures/%s.h264' % str(datetime.now())
# camera.start_recording(filename)
# time.sleep(5)
# camera.stop_recording()
view raw camera hosted with ❤ by GitHub

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

В итоге, хочу сказать спасибо людям, которые делились (и делятся) своими знаниями в Интернете касательно Raspberry Pi и всего, что его окружает. 

пʼятниця, 27 січня 2017 р.

CLOB через DBLink

Есть 2 базы, надо передавать CLOB с одной в другую. Сначала сделали процедуру, которая принимала на вход CLOB, но:
PLS-00564: lob arguments are not permitted in calls to remote server

Решили, что будем передавать CLOB в удаленную таблицу, а на той стороне обрабатывать. Написали инсерт и:
Error: PL/SQL: ORA-22992: cannot use LOB locators selected from remote tables


Решение проблемы:
Сделали у себя темповую таблицу:
create global temporary table TBL_TMP_CLOB
(
  c_clob CLOB
)


Делаем Insert From Select в удаленную таблицу:
INSERT INTO schema.remote_table@dblink(rem_clob) SELECT * FROM TBL_TMP_CLOB;





вівторок, 24 січня 2017 р.

Проблемы с Task Scheduler в Windows 10

Продолжаю допиливать свою raspberry pi-"систему видеонаблюдения". Для себя решил, что она должна работать по принципу: датчик фиксирует движение, камера делает снимок и отправляет мне на рабочую почту письмо, на работе у меня запущен шедуллер, который мониторит определенную папку в outlook и если там поменялось количество писем, то будет вызвана процедура по отправке смс мне на телефон. 
Столкнулся с проблемой простого создания задания, которое будет выполняться по расписанию.
Сразу приведу текст батника:
python webScrap1.py

Создал задание в Task Scheduler на запуск батника по расписанию в Windows 10. Жду... Ничего не запускается :(. Запускаю вручную - тоже ничего. Погуглил и нашел, что проблема может заключатся в положении переключателя "Run only when user is logged on". 
Изначально я поставил его в положение "Run whether user is logged on or not". Поменял, запустил вручную и увидел cmd-окно.
Но, хоть окно и мигнуло на секунду - ничего не произошло, смс не пришла. Поставил паузу в батнике - ошибка "не могу найти файл webScrap1.py". Прописал полный путь к файлу - cmd запускается и висит. Попробовал другие варианты - зависает пустое окно.
Методом "научного тыка" пришел к выводу, что просто указать название батника в поле с файлом, который будет запускаться не получится. Пришлось, как мне кажется, извратиться и запускать python.exe, а в аргументах указать путь к скрипту. Также надо указать папку, где лежит скрипт. Пример:

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

неділя, 15 січня 2017 р.

Futurama на дверях

Предыстория: у меня в квартире входные двери с обратной стороны белого цвета. Моя жена решила нарисовать на них картинку с космосом. Нарисовала, а потом через несколько дней все стерла, сказала, что ей не нравится. Я подумал и предложил нарисовать героев мультсериала Футурама. Поискал в интернете подходящую картинку и остановился на этой:
Решил, что нарисую только героев и только до линии плеч. Начал срисовывать. Сначала карандашом нарисовал все линии (может быть плохо видно, надо увеличить картинку):



После очертания контуров работа встала, потому что нужных красок и кисточки в доме не оказалось. Прошло пару недель пока я не купил в магазине матовые акриловые краски и кисточку. Для раскрашивания я выделил 6 цветов: красный, оранжевый, серый металлический, сиреневый, черный и телесный.
Подготовка к работе:

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

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

Дальше перешел к Фраю и Лиле:

Делаю черный контур:
Итог работы:
Конечно, я понимаю, что можно было сделать лучше: Фрай получился меньше остальных (будем думать, что он стоит дальше всех), обведение черным неровное и местами чересчур жирное (в следующий раз куплю тонкую кисточку), где-то краска выходит за контуры (буду говорить, что так и было задумано). Но так как подобным я занимаюсь первый раз, я остался доволен проделанной работой.
Всем добра и творческих успехов =)

пʼятниця, 13 січня 2017 р.

Ремонт воздухоувлажнителя Delfa или первая пайка

История начинается с того, что у меня перестал работать воздухоувлажнитель Delfa DH-404: вроде гудит, а пар не идет. Гугл выдал, что при такой проблеме надо заменить мембрану излучателя и, желательно, транзистор BU406.
Купил детали, а также паяльник, флюс и припой. Проблема только в том, что до этого, я ни разу не паял. Но подумав, что воздухоувлажнитель не такая дорогая вещь, решил, что буду учится на нем.
Дальше пойдут фотки процесса и мои комментарии:
Детали на замену:

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





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