November 11, 2015

Real time mirroring new Zone Minder event to Box.net cloud

Overview

This is my configuration:
  • Server OS: Ubuntu Server 14.04
  • ZoneMinder:1.28.1

Mounting box.com to local location 

This is how you can mount a box.com directory manually:
sudo mount -t davfs https://dav.box.com/dav /home/sergi/box.com
However it is better to do this via fstab. Information how to mount box.com locally is here. This will be mounted on startup.
If you do not want reboot run: sudo mount ~/box.com

Node installation 

I am using node.js 5.x, however this should work with node.js 0.12.x and above.
Installation information.

Fetching zmwatcher from GIT

Make sure you have installed git (sudo apt-get git)
  1. CD to some location (in my case I used home directory)
  2. Grab sources from github "git clone https://github.com/solvek/zmwatcher.git"

Running mirroring script

The mirroring script is located inside zmwatcher/samples/zmmirror/mirror.js
Open this file and add your config (basing on your hostname, hostname you can see at command prompt).
  • Before running the script you have to install it (its dependencies). Go to "cd ~/zmwatcher/samples/zmmirror"
  • Run "npm install" to install necessary dependencies
  • Run "sudo nodejs mirror.js" (in my case I am running it with root permissions because my regular user does not have permissions to events directory)
  • Modify samples/zmmirror/config.js with your values 
To run script mirroring manually:  sudo nodejs ~/zmwatcher/samples/zmmirror/mirror.js

Running mirroring script on linux startup 

Using systemd

  1. Create service file: sudo nano /etc/systemd/system/zmmirror.service
  2. Copy my systemd script from here
  3. Correct paths to node and index.js script
  4. Save
  5. Enable the service: sudo systemctl enable zmmirror.service
  6. Start the servcie: sudo systemctl start zmmirror.service
  7. Verify it is running: sudo systemctl status zmmirror.service

Using upstart system

A good description how to configure an upstart script.
  1. Create starting service script: sudo nano /etc/init/zmmirror.conf
  2. Copy my upstart script from here (another good script example)
  3. Correct paths to node, zmmirror.js script, output log
  4. Save
  5. Check syntax  sudo init-checkconf /etc/init/zmmirror.conf
  6. Start service: sudo service zmmirror start
  7. Check log: cat ~/zmmirror.log
That's all. This script should be started each time on system boot.
Useful commands:
  • Start service: sudo service zmmirror start
  • Stop service: sudo service zmmirror stop 
  • Restart service: sudo service zmmirror restart

Deletion of old files 

For deletion old content from box.com I am also using node.js script. The script is located here.
Here is how to schedule this script running once a day:
  1. Edit cleanup script: sudo nano ~/zmwatcher/samples/zmmirror/cleanup.js
  2. Specify your actual path.
  3. Run cron: sudo crontab -e
  4. Add line (run cleanup every day at 5 am): 0 5 * * * nodejs /home/sergi/zmwatcher/samples/zmmirror/cleanup.js 
To run cleanup script manually:  sudo nodejs ~/zmwatcher/samples/zmmirror/cleanup.js

April 21, 2015

Увімкнення освітлення в квартирі через інтернет

Вмикатиметься/вимикатиметься LED RGB стрічка. Управління цією стрічкою здійснює інфрачервоний 44-кнопочний пульт (інструкція для пульта). Вмикати і вимикати будемо шляхом емуляції цього пульта.

Як зчитати і земулювати практично будь-який пульт.

Ардуїно Uno в мене вже була. Докупив на радіоринку:

  • IR приймач (38KHz) - 10 грн (0.40 $)
  • IR LED - 3 грн (0.12 $)

 Скетч для зчитування кодів з пульта.

Приймач підключається таким чином:


Приймач випадково спалив, а передавач працював тільки на відстані 10-20 см, купив інший приймач і передавач. Хоч на базарі сказали, що приймач ідентичний попердньому, але методом тику виявилось, що VCC і GND в ньому навпаки ніж у протилежному. Ось під’єднання:


Ще одна стаття про емуляцію пультів.  (З використанянм бібліотеки)



Розшифровки всіх кодів для цього пульта


Коди можна трансформувати в зручний для програми вигляд за допомогою регулярних виразів:

January 9, 2015

Зчитування даних за допомогою Arduino та Processing. Обробка їх у R

Сьогодні хочу зробити невеличкий огляд того, як можна використовувати Arduino та Processing для збирання статистичних даних, а після цього обробляти ці дані за допомогою R.
Для демонстрації збирання статистики я за допомогою ультразвукового датчика HC-SR04 фіксую, коли колеги проходят перед моїм робочим столом. Додаткову корисну інформацію про те, як схрестити Arduino, Processing та R я взяв звідси.

Arduino


Ось схема для Arduino Uno
image

Якщо хтось проходить перед столом спрацьовує спікер (і лампочка).

Скетч для Arduino знаходиться тут.

Тут необхідно врахувати кілька моментів

  1. Використовується бібліотека NewPing, її потрібно проінсталювати до вашого Arduino середовища і перезапустити IDE
  2. Щоб мінімізувати хибні спрацювання, я перевіряю наявність сигналу кілька разів поспіль. Див. функцію pingConfirms. Треба сказати, що надійність спрацювання ще далека від ідеалу: то сигнал спрацьовує по декілька разів за один прохід, то пропускає проходи. Проте для наших наочних цілей це не дуже суттєво
  3. Зверніть увагу на константу MAX_DISTANCE, вона задає максимальу відстань до якої датчик буде спрацьовувати.
  4. Найважливіший момент: дані до комп’ютера передаються через серійний порт. Щоб відрізнити дебажний вивід перед даними я вивожу "$data:", цей текст я сприймаю як маркер даних, які будуть додаватись до CSV файлу, тому якщо даних більше одного, можна їх розділяти комою
  5. В нашому випадку в якості даних передається відстань в сантиметрах, але рельно нас це значення не буде цікавити, ми будемо просто групуваи дані за кількістю

Processing


В цьому проекті Processing 2 я буду використовувати вийнятково для зчитування даних з серійного порта (USB) і дописування їх до CSV файлу. Ви можете також вискористовувати Processing для візуализації своїх даних, проте тут графики я малюватиму за допомогою R.
Середовище Processing дуже схоже на середовище Arduino, але мова Java-подібна. Універсальний скетч для зчитування данных з Arduino тут.
Спочатку вам потрібно запустити скетч, він виведе в консоль список всіх доступних серіальних портів, знайдіть порт, на якому працює Arduino, візьміть його порядковий номер (нумерація починається з нуля) і пропишіть його в константу mySerialPort, після цього скетч потрібно перезапустити і він почне збирати дані. Зверніть також увагу на шлях до файлу у скетчі, куди записуються дані

String filePath = sketchPath("../../data/data.csv");


Функція sketchPath створить шлях відносно папки в якій знаходиться скетч. Якщо файлу нема - він створиться, якщо вже є - до нього будуть додаватись рядки. Автоматично першим елементом в кожному рядку CSV файлу буде timestamp (кількість мілісекунд після 1970-01-01).

R


Для обробки даних і відображення графіків я використовую статистичний пакет R.
Після інсталяції R системм можна увійти в інтерактивний режим за допомогою однобуквенної команди R. (Щоб вийти з інтеактивного режиму введіть q().
Я написав невеличкий скрипт, який

  1. Зчитує дані з CSV файлу в пам’ять.
  2. Вирізає дані потрібного часового інтервалу: для цього підправте змінні startDate і endDate
  3. Підрховує число проходжень у кожнмоу з 10-хвилининх інтервалів. Можна інтервал зменити, він заданий у змінній period, це значення в секундах
  4. Малює стовпчиковий графік.

image
Для запуска всього цього зробіть таке:
  1. З консолі запустить команду R
  2. Задайте шлях до каталога, в якому знаходиться ваш data.csv файл:
    setwd("/home/solvek/projects/electronics/counter/data")
    

  3. Запустіть R скрипт:
    source("../plotchart.R")
    

    Тут шлях до скрипта вказаний відносно вищезаданого каталогоа даних

Святковий бонус


Можливо ви вже звернули увагу на те, що спікер видає сигнал з тональністю, котра залежить від відстані, на якій проходять повз датчик. Таким чином з Arduino можна зробити примітивний музичний інструмент:

Ось перероблений для цього скетч. Схемку змінювати не потрібно.