Добрый день!
Циклом создаются значения в PersistentStorage
Не получается потом также циклом прочитать значения.
Как прочитать значения?
Добрый день!
Циклом создаются значения в PersistentStorage
Не получается потом также циклом прочитать значения.
Как прочитать значения?
Добрый день.
Значения читаются так: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board
То есть аргументом для ps отдается строка - имя параметра.
Смотрел этот пример. Ну а если мне именно эту строку из хранилища и надо извлечь? Бежать циклом по всем элементам (по индексам) и получать из них значение параметра
файл 1 - создание глоб. массива -
var CONFIG_FILE_PATH = "/mnt/data/etc/dali/lights.json";
var lightsObj = readConfig(CONFIG_FILE_PATH);
var lightsArr = new PersistentStorage("lights", {global: true});
lightsArr = StorableObject({ });
lightsObj.lights.forEach(function(light) {
var lightId = 'N' + light.getway + 'A' + light.address;
lightsArr[lightId] = StorableObject(light);
});
в этом же файле вывожу содержимое -
for (var key in lightsArr) {
log(key)
log("val:"+lightsArr[key].descr)
}
выводится всё норм, 24 элемента
файл 2 - чтение глоб. массива -
такой же цикл, для вывода содержимого
var lightsArr = new PersistentStorage("lights", {global: true});
for (var key in lightsArr) {
log(key)
log("val:"+lightsArr[key].descr)
}
}
выводится только
name
_psself
А для ps разве в документации заявлено перечисление? Я не нашел.
нельзя в цикле писать в ps?
Можно. Конечно можно, запись и чтение можно даже совмещать в одном и том же цикле. Но при чтении в ps нужно аргументом передавать имя читаемого параметра.
Например вот: Примеры правил — Wiren Board
в примере цикл бежит по другому объекту lights, не по ps
у меня другая немного задача:
readConfig()Как писал чуть выше:
для этого объекта перечисления нет. Не планировалось и не реализовано. То есть использовать значения можно - но не перечислять их.
хорошо, почему тогда так не работает -
файл 1
var lightsStorage = new PersistentStorage("lights2", {global: true});
lightsStorage["data"] = JSON.stringify(lightsObj);
log(lightsStorage["data"])
лог выводит ожидаемый JSON
файл 2
var lightsStorage = PersistentStorage("lights2", {global: true});
log(lightsStorage["data"])
в консоле ошибка ECMAScript error: TypeError: [[DefaultValue]] coerce failed
пробуем через StorableObject()
файл 1
var lightsStorage = new PersistentStorage("lights2", {global: true});
lightsStorage= StorableObject({data: lightsObj});
log(lightsStorage.data)
выводит [object Object],[object Object],[object Object] – ожидаемо и нормально
файл 2
var lightsStorage = PersistentStorage("lights2", {global: true});
log(lightsStorage["data"])
в консоле ошибка ECMAScript error: TypeError: [[DefaultValue]] coerce failed
Создаю первый файл.
//Сохраним в ps значение типа стринг.
var simpledata = "1234568qwealdldldjhdhd"
var lightsStorage = new PersistentStorage("lights2", {global: true});
lightsStorage["data"] = simpledata;
Второй файл:
var lightsStorage = new PersistentStorage("lights2", {global: true});
log(lightsStorage["data"])
выдает ожидаемое:
2025-11-11 15:42:10
1234568qwealdldldjhdhd
Опишите пожалуйста что, какое действие предполагается сделать? Какое неявное преобразование подразумеваете?
Да ничего такого…
Прочитать json файл в одном wb-rule
Кинуть его в ps
Этот ps прочитать в другом wb-rule
Так, я опишу как вижу со своей стороны:
Вы пытаетесь что-то записать в хранилище. Какого типа записываемое? То есть что именно пытаетесь сохранить, как оно выглядит в строчном виде?
Валидный json записывается.
Этот же json проходит онлайн валидаторы, читается и обрабатывается питоном, читается и обрабатывается wb-rule, но в том же файле, где создаётся ps.
В другом файле этот ps не выводится, тем же самым кодом, которым он выводится в первом файле
Может я что-то упускаю в языке программирования, но ведь сначала одной переменной присваивается результат создания объекта new, а затем эта переменная тупо переписывается другим объектом, никакого отношения к ps уже не имеющему. Поэтому и нет ошибок, всё работает ожидаемо.
А так - ps не может хранить объекты, только строки. Можете объект упаковать в json, а потом распаковать после получения из ps.
Так тоже не работает
lightsStorage["data"]= StorableObject({data: lightsObj})
В файле 2
obj = lightsStorage["data"];
log(obj.data)
log выводит [object Object]
Но если потом этот объект перебирать циклом
obj.data.forEach(function() {
log(1)
})
вылетает ошибка: ECMAScript error: TypeError: call target not an object
В логе скорее всего написана строка, даже если она в синтаксисе объекта.
Дайте его (выведите в строку, выложите) - попробую воспроизвести.
Да, неявные преобразования - зло. И сам про них иногда забываю и сижу потом в отладке…
Используйте для перебора for (var i in Object). Это сработает. Там разные типы этих объектов и не везде foreach работает. Или там надо какую-то функцию применить для преобразования. Но поскольку for достаточно, то я не стал глубоко копать, когда сталкивался. Это не единственное место, где такая функция не работала.