CCU.IO это программа, написанная на Node.js и служащая для автоматизации различного домашнего (и не очень) оборудования. При помощи встроенного веб-сервера CCU.IO выступает платформой для визуализации и позволяет отображать события с использованием Socket.IO библиотеки. Нет постоянных запросов к серверу (no-polling), а сервер сам говорит, когда нужно обновить графический элемент. Ресурсоёмкий процесс постоянных запросов отпадает и таким образом уменьшается время реакции на события. Дополнительно CCU.IO выступает, как прокси между визуализацией и приборами. Не важно, сколько запущено копий визуализации, нагрузка на приборы всегда низкая.
Можно подключать новое оборудование через, так называемые, драйверы. На данный момент существуют драйвера для Philips Hue, Sonos, IRTrans, подключение к базе данных MySQL, а также различных веб-сервисов (Погода, валюта, почта, pushover). Некоторые новые драйвера находятся в разработке или запланированы на ближайшее будущее.
Интегрированный в CCU.IO механизм скриптов позволяет автоматизировать системы при помощи языка JavaScript. Все возможности среды Node.JS можно использовать и в скриптах (например доступ к дисковой системе, сетевые функции и т.д.) Также можно использовать огромное количество готовых библиотек через npm.
CCU.IO это открытое программное обеспечение.
Требования: для платформы нужен работающий бинарный файл Node.js с версией больше 0.10. Скачать можно либо с официального сайта http://nodejs.org/download/ или здесь.
Войти в консоль raspberry под именем "pi" и для инсталляции Node.js и CCU.IO выполнить:
wget http://ccu.io.mainskater.de/nodejs_0.10.22-1_armhf.deb
wget http://ccu.io.mainskater.de/ccu.io_1.0.29.deb
sudo dpkg -i nodejs_0.10.22-1_armhf.deb
sudo dpkg -i ccu.io_1.0.29.deb
Из конфигурационной страницы CCU.IO можно установить и обновить все другие дополнения:
[IMAGE]
Не советуется новичкам начинать с установки на редкие системы (как QNAP, Synology или My Cloud). Потренируйтесь сначала под Windows или RaspberryPi, а потом можно систему перенести на другую платформу.
Настройка CCU.IO происходит через веб-интерфейс по адресу http://ip_address:8080/ccu.io/ или http://localhost:8080/ccu.io/ , если CCU.IO установлена на локальной системе.
На закладке "CCU.IO -> Настройки" можно настроить базовые параметры системы. На закладке "Драйвера" можно настроить каждый драйвер в отдельности.
После изменения настроек (как CCU.IO, так и драйверов) необходимо перезапустить систему.
CCU.IO IP адрес (не путать с просто адресом CCU)
Адрес хоста на котором запущена сама CCU.IO (не путать с просто адресом CCU)
Для некоторых драйверов необходимо знать собственный IP адрес.
Если активировано, то каждые пол-часа в логах будет появляться статистическая информация о пакетах и сообщениях
Если эта опция активирована, то все события и изменения переменных будут записываться в протокол и их впоследствии можно просмотреть с EventList или построить графики с Highcharts.
Интервал говорит о том, как часто протокол из оперативной памяти будет сбрасываться на диск.
Активирует механизм пользовательских скриптов. Все скрипты в папке ccu.io/scripts будут выполняться при старте системы.
Используются для вычисления восхода и захода солнца для скриптов.
Здесь можно настроить параметры для веб-сервера. Включить или выключить веб сервер по защищенному протоколу, установить пароли или порт. Не советуется отключать оба сервера, т.к. потом нет возможности активировать их через веб интерфейс.
используются для настройки HomeMatic - система автоматизации дома. Необходимо соответствующее оборудование.
Перед каждым обновлением рекомендуется сделать резервную копию системы, хотя все настройки и папки log, scripts, www останутся неизменными.
CCU.IO можно обновить с главной страницы настроек. Просто нажать кнопку проверить и если есть новая версия программы, повторно нажать кнопку. Эта процедура может занять на слабом оборудовании или медленном интернет соединении длительное время.
Changelog можно посмотреть на Github. https://github.com/hobbyquaker/ccu.io
todo.
Дополнительно к Socket.IO интерфейсу существует возможность использовать основанный на HTTP-GET-Requests интерфейс. Данные возвращаются в виде текста или в виде JSON объекта.
Можно использовать следующие команды:
Опросить состояние объекта. Возвращает данные в JSON формате. Пример Опросить объект по ID
http://ccu-io-host:ccu.io-port/api/get/950
Опросить объект по имени
http://ccu-io-host:ccu.io-port/api/get/ЕстьКтоДома
Опросить объект по имени канала и атрибуту
http://ccu-io-host:ccu.io-port/api/get/Свет-Кухня/LEVEL
Опросить объект по адресу
http://ccu-io-host:ccu.io-port/api/get/FEQ1234567:1/LEVEL
Опросить объект по адресу
http://ccu-io-host:ccu.io-port/api/get/BidCos-RF.FEQ1234567:1.LEVEL
Опросить состояние объекта. Возвращает данные как обычный текст. Можно использовать виды опроса, как с get методом. Эту функцию можно применять только к данным и переменным. Опросить все атрибуты канала с этой функцией не получиться:
http://ccu-io-host:ccu.io-port/api/getPlainValue/950
Установить значение данных или переменной. Можно использовать все возможности адресации, как get, но можно применять только к данным и переменным.
http://ccu-io-host:ccu.io-port/api/set/BidCos-RF.FEQ1234567:1.LEVEL/?value=0.7
http://ccu-io-host:ccu.io-port/api/set/Свет-Кухня/LEVEL/?value=0.7
http://ccu-io-host:ccu.io-port/api/set/ЕстьКтоДома/?value=0
http://ccu-io-host:ccu.io-port/api/set/950/?value=1
Установить значения сразу нескольких переменных или данных.
Можно использовать POST запросы. В зависимости от Content-Type Header данные будут интепретированы, как JSON или как просто текст.
http://ccu-io-host:ccu.io-port/api/setBulk/?BidCos-RF.FEQ1234567:1.LEVEL=0.7&Свет-Кухня/LEVEL=0.7&ЕстьКтоДома=0&950=1
Возвращает, как JSON все объекты из CCU.IO
http://ccu-io-host:ccu.io-port/api/getObjects
http://ccu-io-host:ccu.io-port/api/getIndex
Возвращает, как JSON все значения объектов из CCU.IO
http://ccu-io-host:ccu.io-port/api/getDatapoints
Собственные скрипты можно просто разместить в папке scripts и они автоматически запустятся при старте Script-Engine. При добавлении новых скриптов или при изменении старых необходимо перезапустить CCU.IO или Script-Engine.
Это можно сделать через Web Интерфейс CCU.IO -> Контроль
Следующие модули Node.js уже загружены в Script-Engine и их не нужно дополнительно подгружать:
Следующие функции можно использовать в собственных скриптах:
Записать что-нибудь в ccu.io/log/ccu.io.log
Возвращает значение переменной или данных.
var val = getState(950);
var val = getState("ЕстьКтоДома");
var val = getState("Свет-Кухня", "LEVEL")
var val = getState("BidCos-RF.FEQ12345678.LEVEL");
Устанавливает значение переменной или данных устройства. Можно использовать ID, имя или адрес.
Создать переменную в CCU.IO
setObject(100015, {
Name: "ЕстьКтоДома",
TypeName: "VARDP"
}, function () {
setState(100015, 0); // Установить значение, после создания переменной
});
Послать WakeOnLan пакет к устройству с заданным MAC адресом.
wol.wake("20:DE:20:DE:20:DE");
wol.wake("20-DE-20-DE-20-DE");
wol.wake("20DE20DE20DE");
Выполняет HTTP-GET запрос и возвращает содержание ответа.
request("http://user:pass@webservice.example.com/api/set/1");
_
var url = "http://user:pass@webservice.example.com/api/get";
request(url, function (error, response, body) {
log("webservice-запрос " + url + " возвращает: " + body);
});
Основан на пакете request для Node.js. Можно посмотреть и здесь
Отсылает электронное письмо.
email({
to: "ernie@sesamestreet.com",
subject: "ccu.io",
text: "Вода в подвале!!!"
});
Эта функция нуждается в сконфигурированном email драйвере.
Отсылает сообщение через pushover сервис. pushover({ message:"Окно в ванной надо закрыть." }); Эта функция нуждается в сконфигурированном pushover драйвере.
Подписаться на событие. Объект pattern поддерживает следующее:
logic string логические операторы "and" и "or" можно использовать для нескольких правил (default: "and")
id integer ID объекта равно
name string Имя объекта равно
RegExp Имя объекта удовлетворяет регулярному выражению
change string "eq", "ne", "gt", "ge", "lt", "le"
"eq" Значение объекта не изменилось (val == oldval)
"ne" Значение объекта изменилось (val != oldval)
"gt" Значение объекта увеличилось (val > oldval)
"ge" Значение объекта увеличилось или не изменилось (val >= oldval)
"lt" Значение объекта уменьшилось (val < oldval)
"le" Значение объекта уменьшилось или не изменилось (val <= oldval)
val mixed Значение объекта равно заданному значению.
valNe mixed Значение объекта не равно заданному значению.
valGt mixed Значение объекта больше заданного значения.
valGe mixed Значение объекта больше или равно заданного значения.
valLt mixed Значение объекта меньше заданного значения.
valLe mixed Значение объекта меньше или равно заданного значения.
ack bool Значение объекта от драйвера, а не от пользователя
oldVal mixed Старое значение объекта равно заданному значению.
oldValNe mixed Старое значение объекта не равно заданному значению.
oldValGt mixed Старое значение объекта больше заданного значения.
oldValGe mixed Старое значение объекта больше или равно заданного значения.
oldValLt mixed Старое значение объекта меньше заданного значения.
oldValLe mixed Старое значение объекта меньше или равно заданного значения.
oldAck bool Старое значение объекта от драйвера, а не от пользователя
ts string Время события не изменилось
tsGt string Время события увеличилось
tsGe string Время события увеличилось или равно
tsLt string Время события уменьшилось
tsLe string Время события уменьшилось или равно
oldTs string Старое время события не изменилось
oldTsGt string Старое время события увеличилось
oldTsGe string Старое время события увеличилось или равно
oldTsLt string Старое время события уменьшилось
oldTsLe string Старое время события уменьшилось или равно
lc string Время последнего изменения не изменилось
lcGt string Время последнего изменения увеличилось
lcGe string Время последнего изменения увеличилось или равно
lcLt string Время последнего изменения уменьшилось
lcLe string Время последнего изменения уменьшилось или равно
oldLc string Предыдущее время последнего изменения не изменилось
oldLcGt string Предыдущее время последнего изменения увеличилось
oldLcGe string Предыдущее время последнего изменения увеличилось или равн
oldLcLt string Предыдущее время последнего изменения уменьшилось
oldLcLe string Предыдущее время последнего изменения уменьшилось или равно
room integer ID комнаты равен заданному значению
string Имя комнаты равно заданному значению
RegExp Имя комнаты удовлетворяет заданному регулярному выражению
func integer ID роли равен заданному значению
string Имя роли равно заданному значению
RegExp Имя роли удовлетворяет заданному регулярному выражению
channel integer ID канала равен заданному значению
string Имя канала равно заданному значению
RegExp Имя канала удовлетворяет заданному регулярному выражению
device integer ID устройства равен заданному значению
string Имя устройства равно заданному значению
RegExp Имя устройства удовлетворяет заданному регулярному выражению
channelType string Тип канала (HssType) равен заданному значению
RegExp Тип канала (HssType) удовлетворяет заданному регулярному выражению
deviceType string Тип устройства (HssType) равен заданному значению
RegExp Тип устройства (HssType) удовлетворяет заданному регулярному выражению
Callback функция возвращает JavaScript объект со следующим содержанием:
{
id,
name,
newState: {
value,
timestamp,
ack,
lastchange
},
oldState: {
value,
timestamp,
ack,
lastchange
},
channel: {
id,
name,
type,
funcIds,
roomIds,
funcNames,
roomNames
},
device: {
id,
name,
type
}
}
funcIds, roomIds, funcNames и roomNames являются массивами Arrays (func = Роли)
Этот скрипт считает сколько раз бросили почту в почтовый ящик. "id: 11928" и change:"ne" подписываются на изменения значения объекта. Использованный в примере ID 11928 это ID состояния датчика на дверце почтового ящика. При помощи таймера отсеиваются срабатывания чаще, чем 30 секунд. Количество срабатываний записывается в переменную 100015, созданную здесь же при помощи setObject. Сразу после создания переменная будет обнулена.
var postboxTimer;
subscribe({id:11928, change:"ne"}, function (obj) { // можно использовать короткую форму on(11928, function(obj {...});
if (!postboxTimer) {
postboxTimer= true;
setTimeout(function () {
postboxTimer = undefined;
}, 30000);
setState(100015, 1 + getState(100015));
}
});
setObject(100015, {
Name: "Postbox",
TypeName: "VARDP"
}, function () {
setState(100015, 0);
});
Временные события с астро-функцией. Паттерн может быть текстом с Cron-синтаксисом http://ru.wikipedia.org/wiki/Cron
schedule("*/2 * * * *", function () {
log("Выполняется каждые две минуты!");
});
Паттерн может быть также объектом (можно задавать с секундной точностью)
schedule({second: [20, 25]}, function () {
log("Исполняется каждые xx:xx:20 и xx:xx:25 !");
});
schedule({hour: 12, minute: 30}, function () {
log("Выполнено в 12:30!");
});
Паттерн может быть JavaScript-Date объектом. В этом случае вызов будет только один раз.
С атрибутом astro можно использовать астро-функцию:
schedule({astro:"sunrise"}, function () {
log("Восход!");
});
schedule({astro:"sunset", shift:10}, function () {
log("10 минут после заката солнца!");
});
Атрибут shift - это сдвиг в минутах. Может быть так же отрицательным, что бы описать события перед закатом или восходом.
Следующие значения можно использовать для атрибута astro:
Socket.IO можно использовать не только для коммуникации через Web- Браузер. Есть библиотеки для многих языков.
Sockrt.IO интерфейс используется драйверами для общения с CCU.IO.
Следующие методы использовать:
При каждом изменении переменной или состояния устройства CCU.IO генерирует событие event. Как параметр передается массив со следующим содержанием: [id, val, timestamp, ack, lastchange]
Взять значение всех объектов и переменных из CCU.IO
Взять описание всех объектов из CCU.IO
Взять взаимосвязи всех объектов из CCU.IO
Установить значение объекта. Как параметр используется массив со следующим содержанием:[id, value, timestamp, ack, lastchange]
. Можно использовать и просто [id, value]
Перезапустить Script-Engine. Необходимо для вступления в силу изменений сделанных в пользовательских скриптах.
Выполнить системную команду. Callback возвращает 3 параметра: error, stdout, stderr
Вернуть список файлов и папок в конкретной папке. Результат возвращается в виде массива.
Конвертирует object в json и сохраняет значение в файле, находящимся в папке datastore
Считывает содержимое файла в папке datastore, конвертирует из JSON в javascript объект и возвращает значение, как параметр в callback функции
Считывает содержимое любого файла (имя файла может содержать путь к файлу) и возвращает как текст в callback функции. Путь можно задавать относительно ccu.io - папки
Считывает JSON содержимое любого файла (имя файла может содержать путь к файлу) и возвращает как javascript объект в callback функции. Путь можно задавать относительно ccu.io - папки
Возвращает ответ на HTTP-GET запрос. В параметре callback функции содержится Body документа.
Возвращает объект с настройками CCU.IO
Создаёт объект в CCU.IO
socket.emit("setObject", 100015, {
Name: "Postbox",
TypeName: "VARDP"
}, function() {log("Переменная создана");});