Перебор циклом значений в 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
у меня другая немного задача:

  • прочитать 1 раз внешний json через readConfig()
  • кинуть его в ps
  • дальше оперировать (читать, добавлять, изменять) с данными только внутри ps

Как писал чуть выше:

для этого объекта перечисления нет. Не планировалось и не реализовано. То есть использовать значения можно - но не перечислять их.

хорошо, почему тогда так не работает -

файл 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 достаточно, то я не стал глубоко копать, когда сталкивался. Это не единственное место, где такая функция не работала.