NEWS
Драйвер ioBroker MySensors
-
fishka18rus Не совсем так. Данный драйвер принимает данные (посылает команды) через физический шлюз, выполненный на одном из вариантов Serial, MQTT или Ethernet. Соответственно на чем сделан шлюз (ардуина + usb или esp8266 или сетевой модуль) не важно для ioBroker, будет работать с любой железкой либо через uart, либо через сеть
-
Возможность автоматической раздачи id, новым подключаемым узлам и возможность обновления прошивки по воздуху (на основе загрузчика MYSBootloader планируется?
-
da… v planax est
-
Кто может подказать по такой штуке…
в скетче описал датчики, они появились в Объектах в таком виде:
~~![](</s><URL url=)http://s019.radikal.ru/i634/1604/fe/567a3f1240f8.png" />
В скетче датчики описаны так:
MyMessage AlmStatus(MyAlm, V_VAR1); MyMessage BatStatus(MyBat, V_WATT); MyMessage NetStatus(MyNet, V_VAR2); gw.present(MyAlm, S_CUSTOM, "123", false); gw.present(MyBat, S_POWER, "123", false); gw.present(MyNet, S_CUSTOM, "123", false);
По картинке видно, что V_VAR1 и V_VAR2 показываются пустыми полями, и по началу не подтягивались и данные.
А для S_POWER добавилась лишняя переменная, которая не была описана.
Чтобы данные с переменных V_VAR1 и V_VAR2 тоже было видно, прописал ручками так:
~~![](</s><URL url=)http://s017.radikal.ru/i409/1604/d3/89954a1243f8.png" />
Но по идее этот подход не соответсвуют идее разработчика. Как вообще правильно надо описывать датчики в MySensors?
Я предполагал, что драйвер брокера из gw.present вытягивает переменные S_…, а потом уже из сообщений тянет типы переменных V_…. При таком подходе в Объектах было бы только то, что описанно в скетче и ничего лишнего.~~~~
-
Но по идее этот подход не соответсвуют идее разработчика. Как вообще правильно надо описывать датчики в MySensors?
Я предполагал, что драйвер брокера из gw.present вытягивает переменные S_…, а потом уже из сообщений тянет типы переменных V_…. При таком подходе в Объектах было бы только то, что описанно в скетче и ничего лишнего. `
а как вытащить тип переменной из V… ?
пример S_Custom
-
По идее все просто…
gw.present(2, S_CUSTOM, "text", false);
в шлюз придет:
30;2;0;0;23;text
где:
__30 - адрес узла
2 - child-sensor-id - адрес датчика
0 - message-type "presentation"
0 - ack
23 - sub-type "S_CUSTOM"__
т.е. переменную S_… получили из презентации
–--------------------------
теперь будем получать код переменной V…
__MyMessage AlmStatus(2, V_VAR2);
gw.send(AlmStatus.set(-84));__
в шлюз получим:
2016-04-05 11:43:04 warn Serial data received: 30;2;1;0;25;-84
где:
__30 - адрес узла
2 - child-sensor-id - адрес датчика
1 - message-type "set"
0 - ack__
25 - sub-type "V_VAR2"
-84 - значение
В результате дерево объектов можно построить следующим образом:
1. с узла при презентации получаем: арес узла, адреса датчиков, их тип S_… и комментарий, название скетча, версия скетча
2. При отправке сообщений gw.send(MyMessage.set(x)); добавляем в дерево объектов подобъекты типов V_…, к каким добавить объектам S_… определяем по адресу датчика.
-
По идее все просто…
gw.present(2, S_CUSTOM, "text", false);
в шлюз придет:
30;2;0;0;23;text
где:
__30 - адрес узла
2 - child-sensor-id - адрес датчика
0 - message-type "presentation"
0 - ack
23 - sub-type "S_CUSTOM"__
т.е. переменную S_… получили из презентации
–--------------------------
теперь будем получать код переменной V…
__MyMessage AlmStatus(2, V_VAR2);
gw.send(AlmStatus.set(-84));__
в шлюз получим:
2016-04-05 11:43:04 warn Serial data received: 30;2;1;0;25;-84
где:
__30 - адрес узла
2 - child-sensor-id - адрес датчика
1 - message-type "set"
0 - ack__
25 - sub-type "V_VAR2"
-84 - значение
В результате дерево объектов можно построить следующим образом:
1. с узла при презентации получаем: арес узла, адреса датчиков, их тип S_… и комментарий, название скетча, версия скетча
2. При отправке сообщений gw.send(MyMessage.set(x)); добавляем в дерево объектов подобъекты типов V_…, к каким добавить объектам S_… определяем по адресу датчика. `
Это означает, что пока сенсоры не пошлют данные, объекты не создадутся. А если это output? И данные никогда не придут? Или температура, которая каждые 30 мин обновляется? -
если output, то правильно использовать вот эту штуку:
The ack parameter has the following meaning:
Outgoing: 0 = unacknowledged message, 1 = request ack from destination node
Incoming: 0 = normal message, 1 = this is an ack message
что логично, если мы посылаем команду на узел надо ведь получить подтверждение, что команда принята, а не потерялась?
> Или температура, которая каждые 30 мин обновляется?
Можно проверять есть ли в дереве объектов уже такая переменная у датчика №х, если нет, то добавляем в дерево. Если есть просто обновляем значение у нее.И потом, можно сделать гибрид :roll:
т.е. оставить все как сейчас + добавить это:
> Можно проверять есть ли уже в дереве объектов такая переменная у датчика, если нет, то добавляем в дерево. Если есть просто обновляем значение у нее.
-
По идее что-то типа такого должно выходить для сенсоров S_CUSTOM
~~![](</s><URL url=)http://s020.radikal.ru/i710/1604/3f/3fb04f1da99b.png" />
1-й адрес уже работает, данные видны
2-й еще скетч не додлелал, поэтому пока false~~
-
как отправить команду на узел mySensors?
…
скриптом так sendTo ('mysensors.0', 'send', '30;1;1;0;24;3\n');
кнопкой из vis можно как то послать команду не используя скрипты?
-
Bluefox переделал немного библиотеку, чтобы как и говорил ранее, добавлялись новые датчики, которые по умолчанию не входят в список.
файл main.js
! ```
/* jshint -W097 */// jshint strict:false /*jslint node: true */ "use strict"; ! // you have to require the utils module and call adapter function var utils = require(__dirname + '/lib/utils'); // Get common adapter utils var serialport; var Parses = require('sensors'); var MySensors = require(__dirname + '/lib/mysensors'); var getMeta = require(__dirname + '/lib/getmeta').getMetaInfo; var getMeta2 = require(__dirname + '/lib/getmeta').getMetaInfo2; ! var adapter = utils.adapter('mysensors'); var devices = {}; var mySensorsInterface; var floatRegEx = /^[+-]?\d+(\.\d*)$/; var inclusionOn = false; var inclusionTimeout = false; ! var config = {}; ! try { serialport = require('serialport');//.SerialPort; } catch (e) { console.warn('Serial port is not available'); } ! //принимаем и обрабатываем сообщения adapter.on('message', function (obj) { if (obj) { switch (obj.command) { case 'listUart': if (obj.callback) { if (serialport) { // read all found serial ports serialport.list(function (err, ports) { adapter.log.info('List of port: ' + JSON.stringify(ports)); adapter.sendTo(obj.from, obj.command, ports, obj.callback); }); } else { adapter.log.warn('Module serialport is not available'); adapter.sendTo(obj.from, obj.command, [{comName: 'Not available'}], obj.callback); } } ! break; } } }); ! // is called when adapter shuts down - callback has to be called under any circumstances! adapter.on('unload', function (callback) { adapter.setState('info.connection', false, true); try { if (mySensorsInterface) mySensorsInterface.destroy(); mySensorsInterface = null; callback(); } catch (e) { callback(); } }); ! // is called if a subscribed state changes adapter.on('stateChange', function (id, state) { if (!state || state.ack || !mySensorsInterface) return; ! // Warning, state can be null if it was deleted adapter.log.debug('stateChange ' + id + ' ' + JSON.stringify(state)); ! if (id === adapter.namespace + '.inclusionOn') { setInclusionState(state.val); } else // output to mysensors if (devices[id] && devices[id].type == 'state') { if (typeof state.val === 'boolean') state.val = state.val ? 1 : 0; if (state.val === 'true') state.val = 1; if (state.val === 'false') state.val = 0; ! mySensorsInterface.write( devices[id].native.id + ';' + devices[id].native.childId + ';1;0;' + devices[id].native.varTypeNum + ';' + state.val, devices[id].native.ip); } }); ! adapter.on('objectChange', function (id, obj) { if (!obj) { if (devices[id]) delete devices[id]; } else { if (obj.native.id !== undefined && obj.native.childId !== undefined && obj.native.subType !== undefined) { devices[id] = obj; } } }); ! // is called when databases are connected and adapter received configuration. // start here! adapter.on('ready', function () { main(); }); ! // start here! adapter.on('unload', function () { adapter.setState('inclusionOn', false, true); }); ! var presentationDone = false; ! function setInclusionState(val) { val = val === 'true' || val === true || val === 1 || val === '1'; inclusionOn = val; ! if (inclusionTimeout) clearTimeout(inclusionTimeout); inclusionTimeout = null; ! if (inclusionOn && adapter.config.inclusionTimeout) { inclusionTimeout = setTimeout(function () { inclusionOn = false; adapter.setState('inclusionOn', false, true); }, adapter.config.inclusionTimeout); } } ! function processPresentation(data, ip, port) { var result = Parses.parse(data.toString()); ! //var result = [{ // id: lineParts[0], // childId: lineParts[1], // type: Values.types[lineParts[2]], // ack: lineParts[3] === '1', // payload: lineParts[5] // subType: Values.subTypes[result.type][lineParts[4]]; //}]; ! if (!result || !result.length) { adapter.log.warn('Cannot parse data: ' + data); return null; } ! for (var i = 0; i < result.length; i++) { adapter.log.debug('Got: ' + JSON.stringify(result[i])); if (result[i].type === 'presentation' && result[i].subType) { adapter.log.debug('Сообщение Презетация'); presentationDone = true; var found = false; for (var id in devices) { adapter.log.debug('id = ' + id); if ((!ip || ip === devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.subType == result[i].subType) { found = true; adapter.log.debug('Найден id = ' + id); break; } } ! // Add new node if (!found) { adapter.log.debug('Не найден id. Добавляем новый узел'); var objs = getMeta(result[i], ip, port, config[ip || 'serial']); for (var j = 0; j < objs.length; j++) { adapter.log.debug('Проверка ' + devices[adapter.namespace + '.' + objs[j]._id]); if (!devices[adapter.namespace + '.' + objs[j]._id]) { devices[adapter.namespace + '.' + objs[j]._id] = objs[j]; adapter.log.info('Add new object: ' + objs[j]._id + ' - ' + objs[j].common.name); adapter.setObject(objs[j]._id, objs[j], function (err) { if (err) adapter.log.error(err); }); } } } // проверяем, есть ли принятая переменная в объектах } else if (result[i].type === 'set' && result[i].subType) { adapter.log.debug('Тип "set". Ищем переменную в базе...'); var found = false; var id_found; // сюда сохраним id совпавший по параметрам id и childId for (var id in devices) { if ((!ip || ip === devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { found = true; adapter.log.debug('Найден id = ' + id); break; } if (devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId){ id_found = id; adapter.log.debug('Сохранили id_found с совпавшими id и childId'); adapter.log.debug('devices[id_found].native.id = ' + devices[id_found].native.id); adapter.log.debug('devices[id_found].native.childId = ' + devices[id_found].native.childId); } adapter.log.debug('Объект не найден!!!'); } // Добавляем новую переменную в существующий узел if (!found) { adapter.log.debug('Не найден id. Добавляем новую переменную'); var common_name = devices[id_found].common.name.split('.'); var objs = getMeta2(result[i], ip, port, config[ip || 'serial'],devices[id_found].native.subType,common_name[0]); if (!devices[adapter.namespace + '.' + objs[0]._id]) { devices[adapter.namespace + '.' + objs[0]._id] = objs[0]; adapter.log.info('Add new object: ' + objs[0]._id + ' - ' + objs[0].common.name); adapter.setObject(objs[0]._id, objs[0], function (err) { if (err) adapter.log.error(err); }); } } } else { // try to convert value var val = result[i].payload; if (floatRegEx.test(val)) val = parseFloat(val); if (val === 'true') val = true; if (val === 'false') val = false; result[i].payload = val; } } return result; } /* function syncObjects(index, cb) { if (typeof index === 'function') { cb = index; index = 0; } ! index = index || 0; ! if (!adapter.config.devices || index >= adapter.config.devices.length) { cb && cb(); return; } ! var id = adapter.config.devices[index].name.replace(/[.\s]+/g, '_'); ! adapter.getObject(id, function (err, obj) { if (err) adapter.log.error(err); ! // if new or changed if (!obj || JSON.stringify(obj.native) !== JSON.stringify(adapter.config.devices[index])) { adapter.setObject(id, { common: { name: adapter.config.devices[index].name, def: false, type: 'boolean', // нужный тип надо подставить read: 'true', write: 'true', // нужный режим надо подставить role: 'state', desc: obj ? obj.common.desc : 'Variable from mySensors' }, type: 'state', native: adapter.config.devices[index] }, function (err) { // Sync Rooms adapter.deleteStateFromEnum('rooms', '', '', id, function () { if (adapter.config.devices[index].room) { adapter.addStateToEnum('rooms', adapter.config.devices[index].room, '', '', id); } }); ! if (err) adapter.log.error(err); if (!obj) { adapter.log.debug('Create state ' + id); ! // if new object => create state adapter.setState(id, null, true, function () { setTimeout(function () { syncObjects(index + 1, cb); }, 0); }); } else { adapter.log.debug('Update state ' + id); setTimeout(function () { syncObjects(index + 1, cb); }, 0); } }); } else { setTimeout(function () { syncObjects(index + 1, cb); }, 0); } }); } ! function deleteStates(states, cb) { if (!states || !states.length) { cb && cb(); return; } var id = states.pop(); adapter.log.debug('Delete state ' + id); adapter.delForeignObject(id, function (err) { adapter.deleteStateFromEnum('rooms', '', '', id); ! if (err) adapter.log.error(err); ! adapter.delForeignState(id, function (err) { if (err) adapter.log.error(err); ! setTimeout(function () { deleteStates(states, cb); }, 0); }) }); } */ function main() { adapter.getState('inclusionOn', function (err, state) { setInclusionState(state ? state.val : false); }); ! // read current existing objects (прочитать текущие существующие объекты) adapter.getForeignObjects(adapter.namespace + '.*', 'state', function (err, states) { // subscribe on changes adapter.subscribeStates('*'); adapter.subscribeObjects('*'); devices = states; ! if (!devices[adapter.namespace + '.info.connection'] || !devices[adapter.namespace + '.info.connection'].common || (devices[adapter.namespace + '.info.connection'].common.type === 'boolean' && adapter.config.type !== 'serial') || (devices[adapter.namespace + '.info.connection'].common.type !== 'boolean' && adapter.config.type === 'serial')) { adapter.setForeignObject(adapter.namespace + '.info.connection', { "_id": "info.connection", "type": "state", "common": { "role": "indicator.connected", "name": adapter.config.type === 'serial' ? 'If connected to my sensors' : 'List of connected gateways', "type": adapter.config.type === 'serial' ? 'boolean' : 'string', "read": true, "write": false, "def": false }, "native": { ! } }, function (err) { if (err) adapter.log.error(err); }); } ! mySensorsInterface = new MySensors(adapter.config, adapter.log, function (error) { // if object created mySensorsInterface.write('0;0;3;0;14;Gateway startup complete'); ! // process received data mySensorsInterface.on('data', function (data, ip, port) { var result = processPresentation(data, ip, port); // update configuration if presentation received ! if (!result) return; ! for (var i = 0; i < result.length; i++) { if (result[i].type === 'set') { adapter.log.debug('Тип сообщения: set'); // If set quality if (result[i].subType == 77) { adapter.log.debug('subType = 77'); for (var id in devices) { if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId) { adapter.log.debug('Set quality of ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, {q: typeof result[i].payload}, true); } } } else { if (result[i].subType === 'V_LIGHT') result[i].subType = 'V_STATUS'; if (result[i].subType === 'V_DIMMER') result[i].subType = 'V_PERCENTAGE'; ! for (var id in devices) { adapter.log.debug(devices[id].native.varType + ' /// ' + result[i].subType); if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { ! if (devices[id].common.type == 'boolean') { result[i].payload = result[i].payload === 'true' || result[i].payload === true || result[i].payload === '1' || result[i].payload === 1; } adapter.log.debug('Set value ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, result[i].payload, true); break; } } } } else if(result[i].type === 'internal') { var saveValue = false; adapter.log.debug('Внутреннее сообщение'); switch (result[i].subType) { case 'I_BATTERY_LEVEL': // 0 Use this to report the battery level (in percent 0-100). adapter.log.info('Battery level ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; break; ! case 'I_TIME': // 1 Sensors can request the current time from the Controller using this message. The time will be reported as the seconds since 1970 adapter.log.info('Time ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); if (!result[i].ack) { // send response: internal, ack=1 mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;1;' + result[i].subType + ';' + Math.round(new Date().getTime() / 1000), ip); } break; ! case 'I_VERSION': // 2 Used to request gateway version from controller. adapter.log.info('Version ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; if (!result[i].ack) { // send response: internal, ack=1 mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;1;' + result[i].subType + ';' + (adapter.version || 0), ip); } break; ! case 'I_SKETCH_NAME': // 2 Used to request gateway version from controller. adapter.log.info('Name ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; break; ! case 'I_INCLUSION_MODE': // 5 Start/stop inclusion mode of the Controller (1=start, 0=stop). adapter.log.info('inclusion mode ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload ? 'STARTED' : 'STOPPED'); break; ! case 'I_CONFIG': // 6 Config request from node. Reply with (M)etric or (I)mperal back to sensor. result[i].payload = (result[i].payload == 'I') ? 'Imperial' : 'Metric'; adapter.log.info('Config ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); config[ip || 'serial'] = config[ip || 'serial'] || {}; config[ip || 'serial'].metric = result[i].payload; saveValue = true; break; ! case 'I_LOG_MESSAGE': // 9 Sent by the gateway to the Controller to trace-log a message adapter.log.info('Log ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); break; ! case 'I_ID_REQUEST': if (inclusionOn) { // find maximal index var maxId = 0; for (var id in devices) { if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id > maxId) { maxId = devices[id].native.id; } } maxId++; if (!result[i].ack) { // send response: internal, ack=0, I_ID_RESPONSE mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;0;4;' + maxId, ip); } } else { adapter.log.warn('Received I_ID_REQUEST, but inclusion mode is disabled'); } break; ! default: adapter.log.info('Received INTERNAL message: ' + result[i].subType + ': ' + result[i].payload); } ! if (saveValue) { for (var id in devices) { adapter.log.debug('2 ' + devices[id].native.varType + ' /// ' + result[i].subType); if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { ! if (devices[id].common.type == 'boolean') result[i].payload = !!result[i].payload; if (devices[id].common.type == 'number') result[i].payload = parseFloat(result[i].payload); ! adapter.log.info('Set value ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, result[i].payload, true); break; } } } ! } } }); ! mySensorsInterface.on('connectionChange', function (isConn, ip, port) { adapter.setState('info.connection', isConn, true); // try soft request if (!presentationDone && isConn) { // request metric system mySensorsInterface.write('0;0;3;0;6;get metric', ip, port); mySensorsInterface.write('0;0;3;0;19;force presentation', ip, port); setTimeout(function () { // send reboot command if still no presentation if (!presentationDone) { mySensorsInterface.write('0;0;3;0;13;force restart', ip, port); } }, 1500); } }); }); }); }
файл getmeta.js (добавил функцию)
! >![spoiler]`~~[code]~~function getMetaInfo2(packet, ip, port, config, subType, common_name) {
! config = config || {};
var type = presentation[subType];
if (!type) {
type = {
type: 'string',
role: 'state',
vars: ['V_VAR1', 'V_VAR2', 'V_VAR3', 'V_VAR4', 'V_VAR5'],
index: packet.subType
};
}
var varType = packet.subType;
var variable = vars[varType];
var id = (ip ? ip.replace(/./g, '') + '.' : '') + packet.id + '.' + packet.childId + '' + subType.replace('S_', '') + /*'.' + packet.subType + */ '.' + varType;var result = [ { _id: (ip ? ip.replace(/\./g, '_') + '.' : '') + packet.id + '.' + packet.childId + '_' + subType.replace('S_', '') + '.' + varType, common: { name: common_name ? (common_name + '.' + varType) : id, type: variable.type, role: variable.role + (type.role ? '.' + type.role : ''), min: variable.min, max: variable.max, unit: variable.unit, def: variable.def, read: variable.read, write: variable.write }, native: { ip: ip, id: packet.id, childId: packet.childId, subType: packet.subType, subTypeNum: type.index, varType: varType, varTypeNum: variable.index }, type: 'state' } ];
! return result;
}
! module.exports.getMetaInfo = getMetaInfo;
module.exports.getMetaInfo2 = getMetaInfo2;[/code]`[/spoiler][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i] -
Почему не видит сом порт на Raspi ???
evice converter now attached to ttyUSB0
root@raspberrypi:~# dmesg
Нажмите Ctrl+A и Ctrl+C, что бы скопировать в буфер обмена и после этого нажмите мышкой в любом месте.
mysensors-0 2016-09-24 21:32:56.957 warn Module serialport is not available
mysensors-0 2016-09-24 21:32:55.643 info starting. Version 1.0.2 in /opt/iobroker/node_modules/iobroker.mysensors
host-raspberrypi 2016-09-24 21:32:53.436 info instance system.adapter.mysensors.0 started with pid 2654
host-raspberrypi 2016-09-24 21:32:51.029 info instance system.adapter.mysensors.0 terminated with code 0 (OK)
mysensors-0 2016-09-24 21:32:51.000 info terminating
host-raspberrypi 2016-09-24 21:32:50.916 info stopInstance system.adapter.mysensors.0 killing pid 2648
host-raspberrypi 2016-09-24 21:32:50.915 info stopInstance system.adapter.mysensors.0
-
Почему не видит сом порт на Raspi ???
evice converter now attached to ttyUSB0
root@raspberrypi:~# dmesg
Нажмите Ctrl+A и Ctrl+C, что бы скопировать в буфер обмена и после этого нажмите мышкой в любом месте.
mysensors-0 2016-09-24 21:32:56.957 warn Module serialport is not available
mysensors-0 2016-09-24 21:32:55.643 info starting. Version 1.0.2 in /opt/iobroker/node_modules/iobroker.mysensors
host-raspberrypi 2016-09-24 21:32:53.436 info instance system.adapter.mysensors.0 started with pid 2654
host-raspberrypi 2016-09-24 21:32:51.029 info instance system.adapter.mysensors.0 terminated with code 0 (OK)
mysensors-0 2016-09-24 21:32:51.000 info terminating
host-raspberrypi 2016-09-24 21:32:50.916 info stopInstance system.adapter.mysensors.0 killing pid 2648
host-raspberrypi 2016-09-24 21:32:50.915 info stopInstance system.adapter.mysensors.0 `
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install python2.7
-
Да установлено всё это, а СОМ порт не видит :oops:
-
Да установлено всё это, а СОМ порт не видит :oops: `
Ruf mal noch mal:cd /opt/iobroker iobroker stop mysensors npm install iobroker.mysensors --production --force iobroker upload mysensors iobroker start mysensors
Danach sollten die Ports in der Konfig drin sein.
-
Ещё пару переустановок всего и заработало :shock:
-
Ещё пару переустановок всего и заработало :shock: `
Молодец! -
Вот ни где не сказано, что inclusionON надо в Обьектах поставить в TRUE, и тогда добавляются сенсоры в Нодах.
-
Вот ни где не сказано, что inclusionON надо в Обьектах поставить в TRUE, и тогда добавляются сенсоры в Нодах. `
По идее должно управляться из настроек. Получается что не работает? -
Добрый день.
Перечитал эту ветку.
Не могу понять, почему у меня не появляются данные с нод во вкладке "объекты"?
В логе вижу, что данные идут.
` > mysensors-0 2016-10-07 15:25:29.157 info Connectedmysensors-0 2016-10-07 15:25:29.142 info disconnected
mysensors-0 2016-10-07 15:24:48.362 info List of port: [{"comName":"/dev/ttyAMA0"},{"comName":"/dev/ttyUSB0","manufacturer":"1a86","serialNumber":"1a86_USB2.0-Serial","pnpId":"usb-1a86_USB2.0-Serial-if00-port0","vendorId":"0x1a86","productI
mysensors-0 2016-10-07 15:24:29.147 info Log :TSP:SANCHK:OK
mysensors-0 2016-10-07 15:24:29.142 warn Serial data received: 0;255;3;0;9;TSP:SANCHK:OK
mysensors-0 2016-10-07 15:23:29.205 info Log :TSP:SANCHK:OK
mysensors-0 2016-10-07 15:23:29.191 warn Serial data received: 0;255;3;0;9;TSP:SANCHK:OK
mysensors-0 2016-10-07 15:23:29.157 info Connected
mysensors-0 2016-10-07 15:23:29.139 info disconnected
mysensors-0 2016-10-07 15:22:29.144 info Log :TSP:SANCHK:OK
mysensors-0 2016-10-07 15:22:29.139 warn Serial data received: 0;255;3;0;9;TSP:SANCHK:OK
mysensors-0 2016-10-07 15:22:26.284 info Log :TSP:MSG:SEND 0-0-10-10 s=3,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
mysensors-0 2016-10-07 15:22:26.264 warn Serial data received: 0;255;3;0;9;TSP:MSG:SEND 0-0-10-10 s=3,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
mysensors-0 2016-10-07 15:22:26.185 info Log :TSP:MSG:ACK msg
mysensors-0 2016-10-07 15:22:26.161 warn Serial data received: 0;255;3;0;9;TSP:MSG:ACK msg
mysensors-0 2016-10-07 15:22:26.158 info Log :TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=2,l=2,sg=0:0
mysensors-0 2016-10-07 15:22:26.154 warn Serial data received: 0;255;3;0;9;TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=2,l=2,sg=0:0
mysensors-0 2016-10-07 15:22:26.094 info Log :TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=0,l=1,sg=0:0
mysensors-0 2016-10-07 15:22:26.084 warn Serial data received: 0;255;3;0;9;TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=0,l=1,sg=0:0
mysensors-0 2016-10-07 15:22:26.024 info Log :TSP:MSG:SEND 0-0-10-10 s=2,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
mysensors-0 2016-10-07 15:22:26.014 warn Serial data received: 0;255;3;0;9;TSP:MSG:SEND 0-0-10-10 s=2,c=1,t=2,pt=2,l=2,sg=0,ft=0,st=ok:0
mysensors-0 2016-10-07 15:22:25.954 info Log :TSP:MSG:ACK msg
mysensors-0 2016-10-07 15:22:25.928 warn Serial data received: 0;255;3;0;9;TSP:MSG:ACK msg
mysensors-0 2016-10-07 15:22:25.884 info Log :TSP:MSG:READ 10-10-0 s=2,c=1,t=2,pt=2,l=2,sg=0:0
mysensors-0 2016-10-07 15:22:25.874 warn Serial data received: 0;255;3;0;9;TSP:MSG:READ 10-10-0 s=2,c=1,t=2,pt=2,l=2,sg=0:0
mysensors-0 2016-10-07 15:22:25.814 info Log :TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=0,l=1,sg=0:0
mysensors-0 2016-10-07 15:22:25.809 warn Serial data received: 0;255;3;0;9;TSP:MSG:READ 10-10-0 s=3,c=1,t=2,pt=0,l=1,sg=0:0
mysensors-0 2016-10-07 15:22:15.577 info Log :TSP:MSG:SEND 0-0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0,ft=0,st=ok:0100
mysensors-0 2016-10-07 15:22:15.572 warn Serial data received: 0;255;3;0;9;TSP:MSG:SEND 0-0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0,ft=0,st=ok:0100
mysensors-0 2016-10-07 15:22:15.478 info Log :TSP:MSG:REL MSG
mysensors-0 2016-10-07 15:22:15.474 warn Serial data received: 0;255;3;0;9;TSP:MSG:REL MSG
mysensors-0 2016-10-07 15:22:15.449 info Log :TSP:MSG:READ 0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0:0100
mysensors-0 2016-10-07 15:22:15.435 warn Serial data received: 0;255;3;0;9;TSP:MSG:READ 0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0:0100
mysensors-0 2016-10-07 15:22:15.394 info Log :TSP:MSG:SEND 0-0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0,ft=0,st=ok:0100
mysensors-0 2016-10-07 15:22:15.369 warn Serial data received: 0;255;3;0;9;TSP:MSG:SEND 0-0-10-138 s=3,c=1,t=2,pt=6,l=2,sg=0,ft=0,st=ok:0100 `
Во вкладке "настройки драйверов" mysensors adapter вижу бледную надпись
"Включить режим присваивания адресов"
Сервер на малинке.
1530_mys.png