CCU.IO + DashUI

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 03 окт 2014, 09:51

Подскажите, как настроить окружение WebStorm для отладки адаптера ccu.io?

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 04 окт 2014, 17:31

Вот короткое описание отладки: http://forum.iobroker.org/viewtopic.php?f=6&t=230

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 09 окт 2014, 15:05

Bluefox писал(а):Вот короткое описание отладки: http://forum.iobroker.org/viewtopic.php?f=6&t=230
Спасибо. Заработало.
А еще подскажите, как правильно сохранить настройки в datastore

Код: Выделить всё

var settings = require(__dirname + '/../../settings.js');
 
if (!settings.adapters.home32bit || !settings.adapters.home32bit.enabled) {
    process.exit();
}
 
var home32bitSettings = settings.adapters.home32bit.settings;

home32bitSettings .ids = {par1: '1', par2:'2'};

//Save home32bitSettings ?????

ArtSamovar
Сообщения: 184
Зарегистрирован: 07 ноя 2011, 08:45
Откуда: Ступино МО

Re: CCU.IO + DashUI

Сообщение ArtSamovar » 09 окт 2014, 17:23

В архиве есть settings.json... Я в своей реализации (php) отказался от него, когда писал управление к Меге.
Могу объяснить. У меня несколько Мег, одна из которых ещё на 3.02 прошивке крутится. А там нет выбора модуля... Там нет датчика температуры и прочих прелестей. К тому же там нумерация портов другая.
Решение казалось бы в один запрос к Меге. В веб интерфейсе всегда присутствует строчка "(fw: x.y)" . Вот и настройки для разных мег.
Но это пол-беды.
От версии к версии, что-то меняется и добавляется.
И взяв слова Андрея, что он не будет убирать web интерфейс я написал парсер.
В итоге все до единой формы, которая может отдать Мега web интерфейсом, динамически генерируются. В базе хранится только ip и пароль.
Всегда свежие настройки, типы портов, режимы портов. (В парсере только 2 константные переменные cf=1 и pn=X, где X - количество портов, с главной странички Меги.)

Если заинтересовал, могу написать свою реализацию на js (только формы и настройки, без управления)
Лень — двигатель прогресса...

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 10 окт 2014, 09:36

ArtSamovar писал(а): В итоге все до единой формы, которая может отдать Мега web интерфейсом, динамически генерируются. В базе хранится только ip и пароль.
Всегда свежие настройки, типы портов, режимы портов. (В парсере только 2 константные переменные cf=1 и pn=X, где X - количество портов, с главной странички Меги.)
Не совсем уверен, что это сообщение ответ на мой вопрос, но попробуем поддержать дискуссию ;)
В CCU.IO каждое устройство и порт имеют свой ID и если я присвоил какому-нибудь порту идентификатор, то после перезагрузки CCU.IO этот порт должен получить тот же самый идентификатор. Поэтому мне нужно хранить список соответствий между адресом порта и его ID. Могу ли я просто взять и сам записать настройки в файл?

Код: Выделить всё

var fs =        require('fs');
fs.writeFileSync(__dirname+"/datastore/adapter-home32bit.json", JSON.stringify(home32bitSettings));

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 10 окт 2014, 11:06

Еще подскажите, по какому адресу нужно отправит GET запрос CCU.IO , что бы он транслировался адаптеру и мог быть обработан в событии

Код: Выделить всё

ccu_socket.on('event', function (obj) {
    if (!obj || !obj[0]) {
        return;
    }
}
http://localhost:8080/???????

electric
Сообщения: 57
Зарегистрирован: 16 сен 2013, 00:36

Re: CCU.IO + DashUI

Сообщение electric » 10 окт 2014, 12:23

bzaugolnov писал(а):Еще подскажите, по какому адресу нужно отправит GET запрос CCU.IO , что бы он транслировался адаптеру и мог быть обработан в событии

Код: Выделить всё

ccu_socket.on('event', function (obj) {
    if (!obj || !obj[0]) {
        return;
    }
}
http://localhost:8080/???????
http://ccu.io/ru/manual.html#simpleapi

electric
Сообщения: 57
Зарегистрирован: 16 сен 2013, 00:36

Re: CCU.IO + DashUI

Сообщение electric » 10 окт 2014, 12:24

ArtSamovar писал(а):В архиве есть settings.json... Я в своей реализации (php) отказался от него, когда писал управление к Меге.
Могу объяснить. У меня несколько Мег, одна из которых ещё на 3.02 прошивке крутится. А там нет выбора модуля... Там нет датчика температуры и прочих прелестей. К тому же там нумерация портов другая.
Решение казалось бы в один запрос к Меге. В веб интерфейсе всегда присутствует строчка "(fw: x.y)" . Вот и настройки для разных мег.
Но это пол-беды.
От версии к версии, что-то меняется и добавляется.
И взяв слова Андрея, что он не будет убирать web интерфейс я написал парсер.
В итоге все до единой формы, которая может отдать Мега web интерфейсом, динамически генерируются. В базе хранится только ip и пароль.
Всегда свежие настройки, типы портов, режимы портов. (В парсере только 2 константные переменные cf=1 и pn=X, где X - количество портов, с главной странички Меги.)

Если заинтересовал, могу написать свою реализацию на js (только формы и настройки, без управления)
Очень интересно! Выкладывайте все!))) Желательно поподробнее описание!

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 10 окт 2014, 13:40

bzaugolnov писал(а):Еще подскажите, по какому адресу нужно отправит GET запрос CCU.IO , что бы он транслировался адаптеру и мог быть обработан в событии

Код: Выделить всё

ccu_socket.on('event', function (obj) {
    if (!obj || !obj[0]) {
        return;
    }
}
http://localhost:8080/???????
http://ccu-io-host:ccu.io-port/api/set/76001/?value=10

Код: Выделить всё

ccu_socket.on('event', function (obj) {
    if (!obj || !obj[0]) {
        return;
    }
    var id = obj[0];
    if (id == 76001) {
      // Это для нас. 
         var val = obj[1];
         var ack = obj[3];
       
         if (ack) {
             return;
         }
         console.log("Пришла команда для 76001 = " + val);
    }
}

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 10 окт 2014, 13:41

ArtSamovar писал(а):В архиве есть settings.json... Я в своей реализации (php) отказался от него, когда писал управление к Меге.
Могу объяснить. У меня несколько Мег, одна из которых ещё на 3.02 прошивке крутится. А там нет выбора модуля... Там нет датчика температуры и прочих прелестей. К тому же там нумерация портов другая.
Решение казалось бы в один запрос к Меге. В веб интерфейсе всегда присутствует строчка "(fw: x.y)" . Вот и настройки для разных мег.
Но это пол-беды.
От версии к версии, что-то меняется и добавляется.
И взяв слова Андрея, что он не будет убирать web интерфейс я написал парсер.
В итоге все до единой формы, которая может отдать Мега web интерфейсом, динамически генерируются. В базе хранится только ip и пароль.
Всегда свежие настройки, типы портов, режимы портов. (В парсере только 2 константные переменные cf=1 и pn=X, где X - количество портов, с главной странички Меги.)

Если заинтересовал, могу написать свою реализацию на js (только формы и настройки, без управления)
Хм... Я тоже думаю, что ArtSamovar перепутал темы. ;)

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 10 окт 2014, 13:45

bzaugolnov писал(а):
ArtSamovar писал(а): В итоге все до единой формы, которая может отдать Мега web интерфейсом, динамически генерируются. В базе хранится только ip и пароль.
Всегда свежие настройки, типы портов, режимы портов. (В парсере только 2 константные переменные cf=1 и pn=X, где X - количество портов, с главной странички Меги.)
Не совсем уверен, что это сообщение ответ на мой вопрос, но попробуем поддержать дискуссию ;)
В CCU.IO каждое устройство и порт имеют свой ID и если я присвоил какому-нибудь порту идентификатор, то после перезагрузки CCU.IO этот порт должен получить тот же самый идентификатор. Поэтому мне нужно хранить список соответствий между адресом порта и его ID. Могу ли я просто взять и сам записать настройки в файл?

Код: Выделить всё

var fs =        require('fs');
fs.writeFileSync(__dirname+"/datastore/adapter-home32bit.json", JSON.stringify(home32bitSettings));
Ну .... можно. Но правильнее было бы записывать туда конфигурацию из странички settings.html.
То есть страница считывает данные с меги и сохраняет их в настройках. Но это не тривиально и, конечно, для начала, можно перезаписать данные и при помощи

Код: Выделить всё

require('fs').writeFileSync(__dirname+"/datastore/adapter-home32bit.json", JSON.stringify(home32bitSettings));

ArtSamovar
Сообщения: 184
Зарегистрирован: 07 ноя 2011, 08:45
Откуда: Ступино МО

Re: CCU.IO + DashUI

Сообщение ArtSamovar » 10 окт 2014, 15:10

Bluefox писал(а):ArtSamovar перепутал темы. ;)
Скорее страничку, находясь на первой, думал, что на последней... и ответил соответственно :D
bzaugolnov писал(а):список соответствий между адресом порта и его ID
Ну и пусть будет 14 портов всегда. (Динамически будут меняться его свойства)
Привязка id <=> address не должна влиять на то что умеет порт и как он вообще работает.
При инициализации, порта, вызываем фабричный метод и "собираем" порт со всеми свойствами и неважно, кнопка это или шим, вход или выход.
Во вьюшке (на экране) вызов методов, относительно свойств объекта.
(Это моё маленькое имхо. Поспешил я в эту тему, извините :) )
Лень — двигатель прогресса...

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 10 окт 2014, 15:33

Bluefox писал(а): Ну .... можно. Но правильнее было бы записывать туда конфигурацию из странички settings.html.
То есть страница считывает данные с меги и сохраняет их в настройках. Но это не тривиально и, конечно, для начала, можно перезаписать данные и при помощи
Проблема в том, что у меня нет меги. У меня нечто похожее на мегу (на stm32). Там каждый порт имеет свой адрес (например RF:56.34.22.1f.a4:1). Если конечные устройства подключаются по радиоканалу или по шине CAN, их состав и доступность могут меняться. Но если я дал данному порту ID 78004, то он должен за ним остаться. Функцию преобразования RF:56.34.22.1f.a4:1 -> 78004 я придумал только в виде ассоциативного массива, который нужно где-то хранить.
Bluefox писал(а): http://ccu-io-host:ccu.io-port/api/set/76001/?value=10

Код: Выделить всё

ccu_socket.on('event', function (obj) {
    if (!obj || !obj[0]) {
        return;
    }
    var id = obj[0];
    if (id == 76001) {
      // Это для нас. 
         var val = obj[1];
         var ack = obj[3];
       
         if (ack) {
             return;
         }
         console.log("Пришла команда для 76001 = " + val);
    }
}
На сколько я понял, эта функция призвана отправить команду на аппаратный контроллер? А что делать, когда пользователь нажал кнопку выключателя и аппаратный контроллер должен отправить команду ccu.io на изменение поля. Если для этого вызвать http://ccu-io-host:ccu.io-port/api/set/76001/?value=10, то адаптер получит событие 'event', но он не будет знать, что данные пришли от контроллера, а не от виджета или сценария и должен будет отправить команду обратно на контроллер. Или я что-то не понял?

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 10 окт 2014, 16:04

Я в качестве шаблона взял адаптер homepilot.
При добавлении объектов используется следующий код:

Код: Выделить всё

setObject(curPortID, {
                            Name:         "home32bit."+curDeviceName+"."+curPortName,
                            ValueType:    16,
                            ValueSubType: 29,
                            TypeName:     "HSSDP",
                            Value:        devs[curDevice].ports[curPort].value,
                            Parent:       curDeviceID
                        });
function setObject(id, obj) {
    objects[id] = obj;
 
    if (obj.Value) {
        datapoints[obj.Name] = obj.Value;
    }
    ccu_socket.emit("setObject", id, obj);
}
И если я устанавливаю значение командой http://localhost:8080/api/set/78003/?value=560
То на запрос http://localhost:8080/api/get/78003 получаю

Код: Выделить всё

{
  "id": "78003",
  "value": 560,
  "timestamp": "2014-10-10 15:23:18",
  "lastchange": "2014-10-10 15:16:33",
  "Name": "home32bit.RF_34_56_32_45_33.Temperature",
  "ValueType": 16,
  "ValueSubType": 29,
  "TypeName": "HSSDP",
  "Value": "2178",
  "Parent": 78001,
  "ValueUnit": ""
}
где есть 2 поля "Value" и "value". Это уже устаревший адаптер? Какой писался позднее всего и его лучше использовать в качестве шаблона?
Еще не очень разобрался с полями TypeName, ValueType, ValueSubType. Насколько я понял, они для внутреннего использования: пиши туда что хочешь и если надо, то используй в том же адаптере?

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 11 окт 2014, 02:43

где есть 2 поля "Value" и "value".
Спасибо за найденную ошибку.

Должно быть так:

Код: Выделить всё

function setObject(id, obj) {
    objects[id] = obj;
 
    if (obj.Value) {
        datapoints[obj.Name] = obj.Value;
        delete obj.Value;
    }
    ccu_socket.emit("setObject", id, obj);
}
"Value" лишнее.
TypeName, ValueType, ValueSubType
Эти поля можно проигнорировать. Они используются для Диалога выбора переменных, но не обязательны.
Насколько я понял, они для внутреннего использования: пиши туда что хочешь и если надо, то используй в том же адаптере?
Можно вообще любую переменную объявить и использовать их для своего адаптера.

Задумано было, что simpleApi предназначен для использования из браузера для сторонних программ. А если писать драйвер, то он обычно разворачивает свой веб сервер на другом порту и стороннее устройство шлёт все обновления на этот порт. Можно посмотреть, как сделан MegaD адаптер.

Код: Выделить всё

var settings = require(__dirname + '/../../settings.js');
var express        = require('express');
var http           = require('http');

// Process http://ccu.io:8090/megaName/?pt=6
function restApi(req, res) {
   console.log("Info from " + req.connection.remoteAddress + " : " + req.url);
   // process url....
}

var app;
var server;

try {
        if (settings.adapters.ADAPTERNAME.settings.ioListenPort) {
            app = express();
            server = require('http').createServer(app);
        }
        if (app) {
            app.get('/*', restApi);
        }
        if (server) {
            server.listen(settings.adapters.ADAPTERNAME.settings.ioListenPort);
            logger.info("adapter XXXX listening on port " + settings.adapters.ADAPTERNAME.settings.ioListenPort);
        }
    } catch (e) {
        logger.error("adapter XXXX cannot start listening server on port " + settings.adapters.ADAPTERNAME.settings.ioListenPort + ": " + e);
    }


bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 13 окт 2014, 15:59

Спасибо за подсказки. Вроде, получилось написать адаптер.

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 20 окт 2014, 18:24

Bluefox писал(а):
TypeName, ValueType, ValueSubType
Эти поля можно проигнорировать. Они используются для Диалога выбора переменных, но не обязательны.
В DashUI не могу подобрать устройство, даже если нажимаю "убрать фильтр по устройствам". Объекты MegaD и gismeteo появляются, а моих нет, хотя в дереве объектов и в списке значений они присутствуют.
Причем, MegaD - развернутый список, а gismeteo в виде дерева.
20-10-2014 18-15-25.png
20-10-2014 18-15-25.png (69.58 КБ) 11938 просмотров
20-10-2014 18-19-58.png
20-10-2014 18-19-58.png (55.62 КБ) 11938 просмотров
Подскажите, в чем может быть дело?
Релиз DashUI - 0.9beta121
CCU.IO - 1.0.46

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 20 окт 2014, 20:05

bzaugolnov писал(а):
Bluefox писал(а):
TypeName, ValueType, ValueSubType
Эти поля можно проигнорировать. Они используются для Диалога выбора переменных, но не обязательны.
В DashUI не могу подобрать устройство, даже если нажимаю "убрать фильтр по устройствам". Объекты MegaD и gismeteo появляются, а моих нет, хотя в дереве объектов и в списке значений они присутствуют.
Причем, MegaD - развернутый список, а gismeteo в виде дерева.
20-10-2014 18-15-25.png
20-10-2014 18-19-58.png
Подскажите, в чем может быть дело?
Релиз DashUI - 0.9beta121
CCU.IO - 1.0.46
Можете прислать мне snapshot? Я бы посмотрел в чём дело.
http://dashui.ccu.io/#manual

bzaugolnov
Сообщения: 18
Зарегистрирован: 06 дек 2012, 13:24

Re: CCU.IO + DashUI

Сообщение bzaugolnov » 21 окт 2014, 09:47

Bluefox писал(а): Можете прислать мне snapshot? Я бы посмотрел в чём дело.
http://dashui.ccu.io/#manual
Отправил на адрес, указанный в мануале. Заранее спасибо за помощь.

Bluefox
Сообщения: 150
Зарегистрирован: 03 мар 2014, 20:02

Re: CCU.IO + DashUI

Сообщение Bluefox » 21 окт 2014, 20:00

Твои каналы выглядят вот так:

Код: Выделить всё

"78004": {
      "Name": "home32bit.RF_34_56_32_45_20",
      "TypeName": "CHANNEL",
      "Address": "ZZZ",
      "HssType": "home32bit",
      "DPs": [
        {
          "Humidity": 78005
        },
        {
          "Temperature": 78006
        }
      ],
      "Parent": 78000
    },
А должны быть вот так:

Код: Выделить всё

"78004": {
      "Name": "home32bit.RF_34_56_32_45_20",
      "TypeName": "CHANNEL",
      "Address": "ZZZ",
      "HssType": "home32bit",
      "DPs": {
          "Humidity": 78005,
          "Temperature": 78006
        },
      "Parent": 78000
    },
DPs это объект, а не массив. Я думаю если это поменять, то всё заработает

Ответить