Скорее сбой, у пол европы такая же хрень))
NEWS
Latest posts made by dimon
-
RE: Драйвер Telegram Adapter
Пример №2 Структура меню и действия
! ```
`var button = [{name: 'меню',button: ['Комната 1','Комната 2','Закрыть','меню']},
{name: 'Комната 1',button: ['Сценарии','Ручное управление','Назад','Закрыть','меню']},
{name: 'Сценарии', button: ['Сцена 1','Сцена 2','Назад','Закрыть','Комната 1']},
{name: 'Ручное управление', button: ['Действие 3','Действие 4','Назад','Закрыть','Комната 1']},
{name: 'Комната 2', button: ['Действие 1','Действие 2','Назад','Закрыть','меню']}
];
! var menuUp = 'меню';
var first_tap = false;
! on({id: "telegram.0.communicate.request", ack: false, change: 'any'}, function (obj) {
command = obj.state.val.substring(obj.state.val.indexOf(']')+1);
user = obj.state.val.substring(obj.state.val.indexOf('[')+1,obj.state.val.indexOf(']'));
//************************************
// меню
//************************************
var menu = {
reply_markup: {
inline_keyboard: [[],[]],
}
};log("message_id = " + getState("telegram.0.communicate.requestMessageId").val); log("menuUp = " + menuUp); if (command === 'меню') first_tap = true; if (command === 'Назад') command = menuUp; var but1 = getButtonArray(button, 'name', command).toString(); if (but1.length > 0) { // проверяем, что строка не пустая var but2 = but1.split(','); //преобразуем в массив menuUp = but2.pop(); //вырезаем последний элемент log ("but2 = " + JSON.stringify(but2)); if (but2.length > 0) { // проверяем что массив не пуст var index = 0; for (var i=0, len=but2.length; i <len; i++)/{/if/((i="">1)&&(index < 1)) index = ++index; menu.reply_markup.inline_keyboard[index].push({ text: but2[i], callback_data: but2[i]}); } log(JSON.stringify(menu.reply_markup.inline_keyboard)); if (first_tap) { sendTo('telegram.0', {user: user, text: 'Меню ' + command, reply_markup: menu.reply_markup}); first_tap = false; } else sendTo('telegram', { user: user, text: 'Меню ' + command, editMessageText: { options: { chat_id: getState("telegram.0.communicate.requestChatId").val, message_id: getState("telegram.0.communicate.requestMessageId").val, reply_markup: menu.reply_markup } } }); } } else log("but1 пуст");
//************************************
// Команды
//************************************
// ищем в тексте команды
if (command ==="Действие 1") {
//тут код что надо сделать
CommandDone();
}! if (command ==="Закрыть") {
sendTo('telegram', {
user: user,
text: 'Конец',
editMessageText: {
options: {
chat_id: getState("telegram.0.communicate.requestChatId").val,
message_id: getState("telegram.0.communicate.requestMessageId").val,
}
}
});
}
});
! function CommandDone(){
sendTo('telegram', {
user: user,
text: 'Выполняю...',
editMessageText: {
options: {
chat_id: getState("telegram.0.communicate.requestChatId").val,
message_id: getState("telegram.0.communicate.requestMessageId").val,
}
}
});
}
! function getButtonArray(obj, keyName, Name) {
var result = [];
for (var attr in obj) {
if (obj[attr] && typeof obj[attr] === 'object') {
result = result.concat(getButtonArray(obj[attr], keyName, Name));
}
if (attr === keyName && obj[attr] === Name) {
result.push(obj.button);
}
}
return result;
}</len;>! ЗЫ. Код до конца не оптимизирован, есть еще куда стремиться ;) ! Использую твое меню с небольшими доработками. Прошу помочь с редактированием сообщений. Такой код:
~~[code]~~if (command ==="Действие 1") {
sendTo('telegram', {
user: user,
text: 'Что-нибудь написано',
editMessageText: {
options: {
chat_id: getState("telegram.0.communicate.requestChatId").val,
message_id: getState("telegram.0.communicate.requestMessageId").val,
}
}
});
}[/code]! меняет сообщение на "Что-нибудь написано" и затирает клавиатуру. ! А хотелось бы, чтобы клавиатура оставалась на месте, а вывод был в сообщение над клавиатурой. Вот так: ! ![](http://pics.4minipc.ru/images/2018/03/28/2018-03-28_00-19-56.png)~~[img]~~[http://pics.4minipc.ru/images/2018/03/2 ... -19-56.png](http://pics.4minipc.ru/images/2018/03/28/2018-03-28_00-19-56.png)[/img] ! Буду благодарен за подсказку.[/i][/i] ```
-
RE: Проблема со скриптом
В общем проблему решил так:
! ````
var T1 = 3; //Стоимость тарифа Т1
var difference = 0; //Разница между старым и новым значением
createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
createState('energy_count.pmwh', 0, {name: 'pmwh без глюка', read: true, write: true, unit: 'kWh'});
! on({id: "javascript.0.energy_count.pmwh", change: "any"}, function (obj) {
if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
setState('javascript.0.energy_count.pmwh', obj.newState.val, true);
}
});
! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
log('obj.newState.val = '+ obj.newState.val);
log('obj.oldState.val = '+ obj.oldState.val);
if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
log('difference = '+ difference);
var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
log('mD = '+ mD);
log('mDC = '+ mDC);
setState('javascript.0.energy_count.Day', mD, true);
setState('javascript.0.energy_count.DayCost', mDC, true);}
});! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
setState('javascript.0.energy_count.Day', 0, true);
setState('javascript.0.energy_count.DayCost', 0, true);
});Теперь работает стабильно и без пропусков. На очереди сохранение значения при перезагрузке.
-
RE: Проблема со скриптом
! ````
var T1 = 3; //Стоимость тарифа Т1
var difference = 0; //Разница между старым и новым значением
createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "any"}, function (obj) {
log('obj.newState.val = '+ obj.newState.val);
log('obj.oldState.val = '+ obj.oldState.val);
if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
log('difference = '+ difference);
var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
log('mD = '+ mD);
log('mDC = '+ mDC);
setState('javascript.0.energy_count.Day', mD, true);
setState('javascript.0.energy_count.DayCost', mDC, true);}
});
! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
setState('javascript.0.energy_count.Day', 0, true);
setState('javascript.0.energy_count.DayCost', 0, true);
});Обрати внимание на "change: "any"" `
Сделал проще - включил сохранение истории для mqtt.0.ESP00163EB3.pmwh.
Вот что она показала:
!
![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -59-43.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_22-59-43.png</link_text>" />![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -12-22.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_23-12-22.png</link_text>" />~~~~ ~~~~Была у меня мысль, что косячить может mqtt, но я никогда не замечал изменения значений. Судя по истории ноль появляется на несколько секунд. Выходит все мороки со скриптом напрасны, он и в начальной версии работал правильно.
!Буду дальше искать варианты выполнить "хотелку".
Спасибо!~~~~
-
RE: Проблема со скриптом
Наверное у тебя приходят нули по mqtt но ты их не печатает, т.к. смотришь, чтоб новое значение было больше.
Поставь проверку на ноль и печатай лог `
Так лог ведь печатается:
!
15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937 15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021 !
А вот и весь код. Что куда добавить?
! ````
var T1 = 3; //Стоимость тарифа Т1
var difference = 0; //Разница между старым и новым значением
createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
log('obj.newState.val = '+ obj.newState.val);
log('obj.oldState.val = '+ obj.oldState.val);
if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
log('difference = '+ difference);
var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
log('mD = '+ mD);
log('mDC = '+ mDC);
setState('javascript.0.energy_count.Day', mD, true);
setState('javascript.0.energy_count.DayCost', mDC, true);}
});
! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
setState('javascript.0.energy_count.Day', 0, true);
setState('javascript.0.energy_count.DayCost', 0, true);
}); -
RE: Проблема со скриптом
Сделал проверку на "0".
Скрипт не производит арифметику, если obj.oldState.val = 0. Теперь считает нормально. Но отсюда получаем новый глюк:
15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937
15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0
15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938
15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0
15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938
15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0
15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938
15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0
15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939
15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938
15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001
15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007
15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021
он пропускает значения, т.к. obj.oldState.val для 7939 это 7938, а последний раз он отработал по 7937.
-
RE: Проблема со скриптом
Сделал по рекоммендации. Несколько часов нормальной работы и опять…
Вот что нарыл в логе:
Последнее нормальное значение:
2017-03-31 11:30:13.025 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837
2017-03-31 11:30:13.026 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7836
2017-03-31 11:30:13.027 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001
2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 0.081
2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 0.243
Следующее, уже не правильное:
2017-03-31 11:30:23.000 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837
2017-03-31 11:30:23.001 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 0
2017-03-31 11:30:23.002 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 7.837
2017-03-31 11:30:23.003 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 7.918
2017-03-31 11:30:23.004 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 23.754
Прошло еще немного времени:
2017-03-31 11:38:38.110 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7841
2017-03-31 11:38:38.111 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7840
2017-03-31 11:38:38.112 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001
2017-03-31 11:38:38.114 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 172.526
2017-03-31 11:38:38.115 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 517.578
Куда то временами пропадает obj.oldState.val.
Как быть?
-
Проблема со скриптом
Имеется приборчик PZEM-004t - китайский измеритель напряжения, тока, мощности и суммарного потребления. Подключен к iobroker через esp8266 с прошивкой wifi-iot по mqtt. Показания исправно приходят в iobroker. Появилось желание сделать расчет суточного потребления и его стоимости.
Написал скрипт:
var T1 = 3; //Стоимость тарифа Т1 var difference = 0; //Разница между старым и новым значением createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'}); createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'}); createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'}); on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) { if (obj.newState.val >= obj.oldState.val) { difference = (obj.newState.val - obj.oldState.val)/1000; var mD = Math.round (parseFloat (getState("javascript.0.energy_count.Day").val + difference)*1000)/1000; var mDC = Math.round (parseFloat (getState("javascript.0.energy_count.DayCost").val + (difference * T1))*1000)/1000; setState('javascript.0.energy_count.Day', mD, true); setState('javascript.0.energy_count.DayCost', mDC, true); } }); schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания setState('javascript.0.energy_count.Day', 0, true); setState('javascript.0.energy_count.DayCost', 0, true); });
Сначала скрипт считает все нормально, значения плюсуются исправно, но в какой-то момент начинает складывать не понятные мне значения:
![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/2.png" />![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/1.png" />Причем исходные данные от PZEM идут как положено.
Есть идеи?~~~~
-
RE: Скрипт для Narodmon.ru
C кодом Bluefox не заработало. Сервер народного мониторинга отдает данные но с ошибкой
javascript.0 2017-01-20 11:26:00.593 error script.js.common.narodmon: "{"error":"NO_USER_AGENT","errno":400}{"sensors":[{"id":2709,"value":0.4,"time":1484900366},{"id":19004,"value":0,"time":1484900404}]}"
Вот что написано на сайте Народного мониторинга - Без HTTP-заголовка User-Agent: MyAppName (название Вашего приложения на латинице) веб-сервер может счесть запрос за "мусорный".
Исправил вот так:
`var request = require('request'); var crypto = require('crypto'); var IDs = ['12345', '6789']; // ID датчиков. (вместо 12345 и 6789 подставить нужные нам ID датчиков, как массив) var apiKey = '123456789ABCDF'; // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте. var hash = crypto.createHash('md5').update(apiKey).digest('hex'); for (var i = 0; i < IDs.length; i++) { createState('narodmon.sensor.' + IDs[i], { name: 'Sensor from narodmon', type: 'number', role: 'level.temperature', read: true, unit: 'C°', write: false }); } // every 5 minutes schedule('*/5 * * * *', function () { request({ url: 'http://narodmon.ru/api', method: 'POST', headers: ({'User-Agent': 'Name_Of_Your_App'}), // Заменить Name_Of_Your_App на название Вашего приложения на латинице json: { cmd: 'sensorsValues', sensors: IDs.join(','), uuid: hash, api_key: apiKey, lang: 'ru' } }, function(error, response, body) { if (error || !body || !body.sensors) { console.error(error || JSON.stringify(body)); } else { console.log(JSON.stringify(body)); for (var i = 0; i < body.sensors.length; i++) { var valueSensor = Math.round(body.sensors[i].value * 10) / 10; // round to 0.1 step setState('javascript.0.narodmon.sensor.' + body.sensors[i].id, valueSensor, true); } } }); });`[/i][/i][/i]
-
RE: Разные ошибки
После последних обновлений перестал работать админский интерфейс - белый экран. Причем vis работает.
Что можно сделать?