NEWS
Ошибка создания объекта в OWFS
-
> у меня при записи через FS(добавил строчки в драйвер) - реакция на изменении менее 1 сек. 7 шт DS2413(движение, стиральная машина, нагреватель воды, насос подкачки воды и т.д.). порт А вход с детектора движения, В выход на реле.
Клас!
делись строчками в драйвере
-
у меня при записи через FS(добавил строчки в драйвер) - реакция на изменении менее 1 сек. 7 шт DS2413(движение, стиральная машина, нагреватель воды, насос подкачки воды и т.д.). порт А вход с детектора движения, В выход на реле. `
Какой адаптер, как подключен? -
адаптер DS9490B, DS9490R USB to 1-Wire.
подключение датчиков звездой, DS2413(7 шт), DS2405, питание 5В на DS18B20(21 шт), кабель UTP5. максимальная длинна 30 метров до бани.
запускаю сервис owserver owfs
добавил запись значений через FS в /opt/iobroker/node_modules/iobroker.owfs/main.js
var fs = require('fs');
…
function writeWire(wire, value) {
if (wire) {
adapter.log.debug('Write /' + wire.id + '/' + (wire.property || 'temperature') + ' with "' + value + '"');
var path1wire = "/var/1-wire";
if (wire.property == "sensed.BYTE") {
var pathfs = "/" + wire.id + "/PIO.BYTE";
} else if (wire.property == "PIO.BYTE") {
var pathfs = "/" + wire.id + "/PIO.BYTE";
} else {
var pathfs = "/" + wire.id + '/' + (wire.property || 'temperature');
}
path1wire = path1wire + pathfs;
var dataV = parseInt(value);
adapter.log.debug(path1wire + ' with "' + dataV + '"');
// Пишем в файл.
fs.writeFile(path1wire, dataV, function(err, written) {
if (err) {
// Произошла ошибка при записи
adapter.log.warn('Cannot write value of ' + path1wire + ': ' + err);
}
});
client.write('/' + wire.id + '/' + (wire.property || 'temperature'), value, function(err, message) {
adapter.log.debug('Write /' + wire.id + '/' + (wire.property || 'temperature') + ':' + message);
//no idea what is received here
if (err) {
adapter.log.warn('Cannot write value of /' + wire.id + '/' + (wire.property || 'temperature') + ': ' + err);
}
});
}
}
-
> добавил запись значений через FS в /opt/iobroker/node_modules/iobroker.owfs/main.js
Спасибо! буду пробовать` > подключение датчиков звездой, DS2413(7 шт), DS2405, питание 5В на DS18B20(21 шт), кабель UTP5. максимальная длинна 30 метров до бани.
запускаю сервис owserver owfs `
У меня тоже UTP5 до 20 м в луче звезды.питание 9В и около датчиков ставлю стабилизатор 7805 - копейки стоит, а душе спокойнее
Раньше при питании 5В и включениях реле - бывали сбои.
Все на одном UPS ES 550G.
Мне больше нравится DS2408S - 8-канальный ключ. Часть портов использую на вход
(датчики движения, герконы, выходы компараторов датчиков дыма/газа, протечки, фотодиоды и т. п.)
часть на управление (светодиоды - индикация, реле, тиристоры).
В DS2408 есть приятная особенность - alarm.
Раньше, когда моя система была на Raspberry Pi и самописных Python/bash скриптах -
ресурсов катастрофически не хватало, и удобно было в цикле просматривать лишь папку alarm
и при возникновении алармов про изменение состояния порта -
уже распарсывать инфу по отдельным портам, вместо того, чтобы бегать по всем папкам.
Для датчиков освещения, влажности, поточных значений датчиков газа/дыма - использую DS2438.
Для отсылки срочных сообщений - GPRS Shield на SIM900.
-
адаптер DS9490B, DS9490R USB to 1-Wire.
подключение датчиков звездой, DS2413(7 шт), DS2405, питание 5В на DS18B20(21 шт), кабель UTP5. максимальная длинна 30 метров до бани.
запускаю сервис owserver owfs
добавил запись значений через FS в /opt/iobroker/node_modules/iobroker.owfs/main.js `
Alekseym6, в ioBroker в драйвере owfs есть кнопка "Read addresses" она у тебя находит датчики и ключи? -
> добавил запись значений через FS в /opt/iobroker/node_modules/iobroker.owfs/main.js
Наверное тогда нужно закомментировать строки:client.write('/' + wire.id + '/' + (wire.property || 'temperature'), value, function (err, message) { ... });
Чтобы не было попытки клиентом переписать повторно значение.
И добавить для чтения что-то вроде:
function readWire(wire) { if (wire) { var path1wire = "/mnt/1wire"; var pathfs = "/" + wire.id + '/' + (wire.property || 'temperature'); path1wire = path1wire + pathfs; fs.readFile(path1wire, 'utf8', function (err,result) { if (err) { adapter.log.warn('Cannot read value of ' + path1wire + ': ' + err); } });
Закомментировав:
` > client.read('/' + wire.id + '/' + (wire.property || 'temperature'), function(err, result) {…
}); `
Вечером дома протестирую
-
адаптер owfs не обновляю, версия 0.0.2. кнопки поиска нет.
строчку не исключаю - для проверки
-
Мои изменения в <u>/opt/iobroker/node_modules/iobroker.owfs/main.js</u>
(версия 0.2.2 (2016-07-29))
var fs = require('fs');
Функция writeWire
! function writeWire(wire, value) {
! if (wire) {
! adapter.log.debug('Write /' + wire.id + '/' + (wire.property || 'temperature') + ' with "' + value + '"');
! var path1wire = "/mnt/1wire";
! if (wire.property == "sensed.BYTE") {
! var pathfs = "/" + wire.id + "/PIO.BYTE";
! } else if (wire.property == "PIO.BYTE") {
! var pathfs = "/" + wire.id + "/PIO.BYTE";
! } else {
! var pathfs = "/" + wire.id + '/' + (wire.property || 'temperature');
! }
! var pathfile = path1wire + pathfs;
! var dataV = parseInt(value);
! adapter.log.debug(pathfile + ' with "' + dataV + '"');
! // Write to file
! fs.writeFile(pathfile, dataV, function(err, written) {
! if (err) {
! // Write error
! adapter.log.warn('Cannot write value of ' + pathfile + ': ' + JSON.stringify(err));
! adapter.setState('wires.' + wire._name, {val: 0, ack: true, q: 0x84});
! } else {
! if (wire.property.indexOf('PIO') === -1) {
! adapter.setState('wires.' + wire._name, parseFloat(value) || 0, true);
! } else {
! adapter.setState('wires.' + wire._name, !(value === '0' || value === 0 || value === 'false' || value === false), true);
! }
! }
! });
! /*
! client.write('/' + wire.id + '/' + (wire.property || 'temperature'), value, function (err, message) {
! if (message !== undefined) {
! adapter.log.debug('Response for write /' + wire.name + '/' + (wire.property || 'temperature') + ': ' + message);
! }
! // no idea what is received here
! if (err) {
! adapter.log.warn('Cannot write value of /' + wire.id + '/' + (wire.property || 'temperature') + ': ' + JSON.stringify(err));
! adapter.setState('wires.' + wire._name, {val: 0, ack: true, q: 0x84});
! } else {
! if (wire.property.indexOf('PIO') === -1) {
! adapter.setState('wires.' + wire._name, parseFloat(value) || 0, true);
! } else {
! adapter.setState('wires.' + wire._name, !(value === '0' || value === 0 || value === 'false' || value === false), true);
! }
! }
! });
! */
! }
! }Функция readWire
! function readWire(wire) {
! if (wire) {
! /*
! client.read('/' + wire.id + '/' + (wire.property || 'temperature'), function(err, result) {
! result.value = result.value || '0';
! result.value = result.value.trim();
! adapter.log.debug('Read ' + result.path + ':' + result.value);
! if (!err) {
! if (wire.property.indexOf('PIO') !== -1) {
! adapter.setState('wires.' + wire._name, (result.value == '1'), true);
! } else {
! adapter.setState('wires.' + wire._name, parseFloat(result.value) || 0, true);
! }
! } else {
! adapter.setState('wires.' + wire._name, {val: 0, ack: true, q: 0x84}); // sensor reports error
! adapter.log.warn('Cannot read value of /' + wire.id + '/' + (wire.property || 'temperature') + ': ' + err);
! }
! });
! */
! var path1wire = "/mnt/1wire";
! var pathfs = "/" + wire.id + '/' + (wire.property || 'temperature');
! var pathfile = path1wire + pathfs;
! // Read from file
! fs.readFile(pathfile, function (err,data) {
! var result = data;
! adapter.log.debug('Read ' + pathfile + ':' + result);
! if (!err) {
! if (wire.property.indexOf('PIO') !== -1) {
! adapter.setState('wires.' + wire._name, (result == '1'), true);
! } else {
! adapter.setState('wires.' + wire._name, parseFloat(result) || 0, true);
! }
! } else {
! adapter.setState('wires.' + wire._name, {val: 0, ack: true, q: 0x84}); // sensor reports error
! adapter.log.warn('Cannot read value of ' + pathfile + ': ' + err);
! }
! });
! }
! }В настройках адаптера OWFS в ioBroker:
Timeout(ms): 3000
Poll interval(sec): 2
Работает неделю без сбоев.
Реакция на read/rwite где-то около секунды-двух.
это приемлемо для обработки сигнала от датчиков движения.
Конечно это будет работать лишь на локальной системе.
Поэтому правильнее бы в настройки адаптера OWFS вывести возможность
выбора - локальное включение или удаленная работа по tcp (IMHO)
И нужно учесть, что при такой частоте опроса увеличивается нагрузка на процессор.
Но в моей Orange Pi+2 это практически не ощутимо
-
Главное посмотри почему с удалённого неработает `
Поменяй в файле /etc/owfs.conf# With this setup, any client (but owserver) uses owserver on the # local machine... !server: -s 4304
и
####################### OWSERVER ######################## server: -p 4304
У тебя только локальный доступ настроен `
Локально или нелокально все равно больше одного-трёх "Read addresses" не читает. При этом owfs, majordom, demo(Андрея) находит всегда и визде. -
А вот подскажите пожалуйста
Раньше драйвер, в случае невозможности считать данные с датчика, тут же рапортовал об ошибке в логе, с указанием адреса датчика.
А вот в новой версии такого не происходит. Отключил датчик, а брокер в объектах сообщает его последнее значение.
Как вернуть сообщение об ошибке. Я подозреваю где-то возможно указать время в течение которого драйвер пытается считать значения не выдавая ошибку. Однако я не нашел где:(