Здравствуйте!
В виртуальной панели не выводятся значения . Подскажите где ошибка.
правило :
defineVirtualDevice("virtual_datetime_display", {
title: "Virtual DateTime Display",
cells: {
date: {
type: "text",
value: ""
},
time: {
type: "text",
value: ""
}
}
});
function getFormattedDate() {
var now = new Date();
var day = now.getDate().toString().padStart(2, '0');
var month = (now.getMonth() + 1).toString().padStart(2, '0');
var year = now.getFullYear();
return day + "-" + month + "-" + year;
}
function getFormattedTime() {
var now = new Date();
var hours = now.getHours().toString().padStart(2, '0');
var minutes = now.getMinutes().toString().padStart(2, '0');
return hours + ":" + minutes;
}
defineRule("update_datetime_display", {
when: cron("@every 1m"), // Обновление каждую минуту
then: function() {
dev["virtual_datetime_display"]["date"] = getFormattedDate();
dev["virtual_datetime_display"]["time"] = getFormattedTime();
}
});
Каналы MQTT также пустые.
Добрый день!
У вас не работает padStart – в Duktape, который использует движок правил, он, скорее всего, не имплементирован, поэтому ничего не показывается. Это относительно новая фича языка. Стрелочные функции =>, let тоже пока не поддерживаются.
Вы можете реализовать padStart самостоятельно, чтобы не переписывать код.
Добавьте в начало правила такой, например, вариант реализации padStart:
if (!String.prototype.padStart) {
String.prototype.padStart = function (targetLength, padString) {
var str = String(this);
targetLength = targetLength >> 0;
padString = (padString === undefined) ? " " : String(padString);
if (padString === "") padString = " ";
if (str.length >= targetLength) return str;
var padLen = targetLength - str.length;
while (padString.length < padLen) {
padString += padString;
}
return padString.slice(0, padLen) + str;
};
}
После этого правило должно заработать:
Рекомендую также обратить внимание на нашу реализацию вывода системного времени в виртуальное устройство: wb-rules-system/rules/system_time.js at master · wirenboard/wb-rules-system · GitHub .
JackDallas:
У вас не работает padStart – в Duktape, который использует движок правил, он, скорее всего, не имплементирован, поэтому ничего не показывается
Но в других устройствах все отображается
что то не получается . может не туда вставляяю. можно поподробней в какое место именно надо вставлять?
Познаний в написании пока маловато!
У меня на стенде вот в таком виде ваше правило заработало:
if (!String.prototype.padStart) {
String.prototype.padStart = function (targetLength, padString) {
var str = String(this);
targetLength = targetLength >> 0; // to int
padString = (padString === undefined) ? " " : String(padString);
if (padString === "") padString = " ";
if (str.length >= targetLength) return str;
var padLen = targetLength - str.length;
while (padString.length < padLen) {
padString += padString;
}
return padString.slice(0, padLen) + str;
};
}
defineVirtualDevice("virtual_datetime_display", {
title: "Virtual DateTime Display",
cells: {
date: {
type: "text",
value: ""
},
time: {
type: "text",
value: ""
}
}
});
function getFormattedDate() {
var now = new Date();
var day = now.getDate().toString().padStart(2, '0');
var month = (now.getMonth() + 1).toString().padStart(2, '0');
var year = now.getFullYear();
return day + "-" + month + "-" + year;
}
function getFormattedTime() {
var now = new Date();
var hours = now.getHours().toString().padStart(2, '0');
var minutes = now.getMinutes().toString().padStart(2, '0');
return hours + ":" + minutes;
}
defineRule("update_datetime_display", {
when: cron("@every 1m"), // Обновление каждую минуту
then: function() {
dev["virtual_datetime_display"]["date"] = getFormattedDate();
dev["virtual_datetime_display"]["time"] = getFormattedTime();
}
});
Ваш код менять не пришлось, только дополнить:
Да я так тоже пробовал но у меня не заработал.
Сегодня скопирол ваш - все заработало .
Спасибо.