Проблема с require

Товарищи, есть список телефонных номеров и email адресов в отдельном файле addresses.js
Пытаюсь вторым скриптов вытащить из него адреса и номера. но выдает ошибку(

Error: error error (rc -100)
anon native strict preventsyield
require native strict preventsyield
F /etc/wb-rules/Volt.js:2 preventsyield

Помогите с осуществлением задумки) вот код которым пытаюсь считать

// Импортируем получателей из addresses.js
var addresses = require("./addresses.js");
var emailRecipients = addresses.emailRecipients;
var smsRecipients = addresses.smsRecipients;

// Имя устройства и канала, которые отслеживают напряжение
var voltageDevice = "ST";
var voltageChannels = ["Urms L1", "Urms L2", "Urms L3"];

// Имена виртуальных устройств для настройки границ напряжения
var voltageMaxDevice = "Param";
var voltageMaxChannel = "VoltageMax";
var voltageMinDevice = "Param";
var voltageMinChannel = "VoltageMin";

// Переменные для хранения таймеров
var voltageCheckTimer = null;
var buzzerTimer = null;

// Флаг для отслеживания состояния напряжения
var isVoltageOutOfRange = false;

// Функция для отправки e-mail сообщения
function sendEmail(subject, message) {
    var emailCommand = "echo '" + message + "' | mail -s '" + subject + "' ";
    emailRecipients.forEach(function(email) {
        try {
            runShellCommand(emailCommand + email);
        } catch (error) {
            log("Ошибка при отправке e-mail на " + email + ": " + error);
        }
    });
    log("E-mail сообщения отправлены");
}

// Функция для отправки SMS сообщения
function sendSMS(message) {
    smsRecipients.forEach(function(phone) {
        try {
            Notify.sendSMS(phone, message);
        } catch (error) {
            log("Ошибка при отправке SMS на " + phone + ": " + error);
        }
    });
    log("SMS сообщения отправлены");
}

// Функция для включения зуммера на 10 секунд
function activateBuzzer() {
    dev["buzzer"]["enabled"] = true;
    dev["TH"]["Buzzer"] = true;
    dev["BZ"]["K1"] = true;
    buzzerTimer = setTimeout(function() {
        dev["buzzer"]["enabled"] = false;
        dev["TH"]["Buzzer"] = false;
        dev["BZ"]["K1"] = false;
        buzzerTimer = null;
        // Если напряжение все еще вне допустимых пределов, повторно включаем зуммер
        if (isVoltageOutOfRange) {
            activateBuzzer();
        }
    }, 10000);
}

// Функция для обработки события выхода напряжения за пределы
function handleVoltageOutOfRange() {
    var voltageMax = dev[voltageMaxDevice][voltageMaxChannel];
    var voltageMin = dev[voltageMinDevice][voltageMinChannel];
    var outOfRange = false;
    var currentVoltages = {};

    voltageChannels.forEach(function(channel) {
        var currentVoltage = dev[voltageDevice][channel];
        currentVoltages[channel] = currentVoltage;
        if (currentVoltage > voltageMax || currentVoltage < voltageMin) {
            outOfRange = true;
        }
    });

    if (outOfRange) {
        // Если напряжение вышло за пределы, запускаем таймер на 5 секунд
        if (voltageCheckTimer === null) {
            voltageCheckTimer = setTimeout(function() {
                // По истечении 5 секунд проверяем напряжение снова
                var voltageAfterTimeout = {};
                var stillOutOfRange = false;

                voltageChannels.forEach(function(channel) {
                    var voltage = dev[voltageDevice][channel];
                    voltageAfterTimeout[channel] = voltage;
                    if (voltage > voltageMax || voltage < voltageMin) {
                        stillOutOfRange = true;
                    }
                });

                if (stillOutOfRange && !isVoltageOutOfRange) {
                    // Если напряжение все еще за пределами и флаг не установлен, отправляем e-mail и SMS сообщения
                    var message = "Напряжение вышло за пределы БЦ Интеграл: " + JSON.stringify(voltageAfterTimeout);
                    sendEmail("Проблема с напряжением БЦ Интеграл", message);
                    sendSMS(message);
                    isVoltageOutOfRange = true;
                    // Включаем зуммер
                    activateBuzzer();
                }
                // Сбрасываем таймер
                voltageCheckTimer = null;
            }, 5000);
        }
    } else {
        // Если напряжение восстановилось и флаг установлен, отправляем сообщения о нормализации
        if (isVoltageOutOfRange) {
            var message = "Напряжение вернулось в норму БЦ Интеграл: " + JSON.stringify(currentVoltages);
            sendEmail("Напряжение в норме БЦ Интеграл", message);
            sendSMS(message);
            isVoltageOutOfRange = false;
            // Отключаем зуммер, если он включен
            if (buzzerTimer !== null) {
                clearTimeout(buzzerTimer);
                buzzerTimer = null;
                dev["buzzer"]["enabled"] = false;
                dev["TH"]["Buzzer"] = false;
                dev["BZ"]["K1"] = false;
            }
        }
        // Сбрасываем таймер, если он был установлен
        if (voltageCheckTimer !== null) {
            clearTimeout(voltageCheckTimer);
            voltageCheckTimer = null;
        }
    }
}

// Подписываемся на изменения значения напряжения для всех фаз
voltageChannels.forEach(function(channel) {
    defineRule("voltageOutOfRangeRule_" + channel, {
        whenChanged: voltageDevice + "/" + channel,
        then: function(newValue, devName, cellName) {
            handleVoltageOutOfRange();
        }
    });
});

Добрый день.

А каким образом должен, по задумке, выполняться addresses.js?
То есть что внутри за функция emailRecipients?

вот по сути и хотелось бы уточнить, как это осуществить?

Я, скорее всего не понимаю, но опишу как вижу:
модуль addresses.js содержит в себе функцию, которая возвращает некий список объектов. И он не выполняется при его вызове.
Покажите пожалуйста функцию из этого модуля?

Если в addresses.js вы объявите:

exports.address1 = 'info@wirenboard.com'

то в Volt.js вы можете получить это значение таким образом:

var addresses = require("addresses");
address = addresses.address1;

Таким же образом можно вызывать из addresses.js функции и т.д.

1 лайк

Добрый вечер.
Спрошу здесь с Вашего позволения чтобы не плодить темы.
Как получить доступ к объекту содержащему общие переменные для двух других скриптов допустим Mod1.js и Mod2.js описанному в модуле muModule в папке /etc/wb-rules-modules/muModule.js? Пробовал так

varMain = {
    Stage : 0,           // Текущий этап работы 
    Error : "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};
exports = module.static.varMain;

В других модулях пробовал получить и изменить так

var m = require("muModule"); // подключаем модуль
 
varMain.Stage = 2;  // просто уже не знаю как
m.Error = "Test";   // просто уже не знаю как
//m.varMain.Stage = 2; //не дает сразу ошибка

в другом пытался считать

var mu = require("muModule"); // подключаем модуль
function MuLog(){
  log ("Stage = "+ varMain.Stage + " Error =  " + mu.Error);
};

setInterval (MuLog, 1000);

Результат

Stage = 0 Error = undefined

Как правильно использовать модуль в моем случае? Еще раз повторю я пытаюсь всего лишь передавать некоторые общие переменные между скриптами которые хранятся внутри объекта в подключаемом модуле. Через глобальные global.__proto__ все получается, но хотел попробовать через модули.

https://wirenboard.com/wiki/Движок_правил_wb-rules_1.7#Изоляция_сценариев

У меня Wirenboard 7 и там wb-rules 2.0. Wiki я перечитал несколько раз https://github.com/wirenboard/wb-rules?tab=readme-ov-file#%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8

но что то видимо не понимаю.

Как вот это


Применить к объекту?

Или изменить переменную объекта можно только в самом модуле, а из других можно только прочитать, но не изменить?

Если в модуле есть (описаны) методы изменения глобальных переменных - да, можно. Если нет - то вызов модуля создает просто экземпляр его. Естественно с локальными переменными.

Ну с глобальными все просто объявил их в одном сценарии через

global.__proto__ varMain = {
    Stage : 0,           // Текущий этап работы 
    Error : "None",      // Текущая ошибка в работе 
    ADC_Code: 0         // Код АЦП от датчика 
};

и в любом другом изменяй или получай допустим так

global.__proto__ varMain.Error = "Test";
log(global.__proto__ varMain.Stage);

Проблем с этим нет. А вот можно также сделать используя модуль без глобальных переменных?

varMain = {
    Stage : 0,           // Текущий этап работы 
    Error : "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};
exports = module.static.varMain;

Просто как я думал - подключу его в сценариях и буду через него обмениваться переменными которые общие для этих сценариев. Тогда вместо глобальных - которые доступны всем, в сценариях которыми нужны общие переменные будут подключен это модуль. Он же объявлен как static и я думал что объект varMan общий для всех сценариев где он импортирован. [quote=“Jury_yamal, post:7, topic:21103”]

var m = require("muModule"); // подключаем модуль
 
varMain.Stage = 2;  // просто уже не знаю как
m.Error = "Test";   // просто уже не знаю как
//m.varMain.Stage = 2; //не дает сразу ошибка

[/quote]

muModule.js

var varMain = {
    Stage : 0,           // Текущий этап работы 
    Error : "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};

exports.varMain = varMain;

Mod1.js

var m = require("muModule"); 
log.info(m.varMain.Error);

m.varMain.Error теперь можете менять в Mod1.js и в любом файле, куда вы ее экспортировали.

muModule.js сделал как у Вас

var varMain = {
    Stage : 0,           // Текущий этап работы 
    Error : "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};

exports.varMain = varMain;

и положил в папку

/etc/wb-rules-modules/muModule.js

в файле Mod1.js

var m = require("muModule"); // подключаем модуль

function MuLog(){
m.varMain.Stage = 22;
};
setInterval (MuLog, 1000);

в другом файле Mod 2

var m = require("muModule"); 
function MuLog(){
log.info("module 1 Stage = "+ m.varMain.Stage); 
};

setInterval (MuLog, 1000);

пробую прочитать значение которое записывается в Mod 1
А в логе вместо ожидаемых 22 получаю 0

2024-08-16 11:36:21module 1 Stage = 0
2024-08-16 11:36:22module 1 Stage = 0
2024-08-16 11:36:23module 1 Stage = 0
2024-08-16 11:36:24module 1 Stage = 0
2024-08-16 11:36:25module 1 Stage = 0
2024-08-16 11:36:26module 1 Stage = 0

Может как то вот это нужно использовать?

Если модулю требуется использовать данные, общие для всех файлов сценариев, для хранения данных следует использовать объект module.static .

пробовал

exports.varMain = module.static.varMain

но не выходит, в логе тоже самое

Верне перестартанул wb rules в логе
При

exports.varMain = module.static.varMain;

в логе

2024-08-16 11:54:15ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2000
MuLog /etc/wb-rules/rules.js:4 preventsyield

2024-08-16 11:54:16ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2904
MuLog /etc/wb-rules/test122.js:4 preventsyield

2024-08-16 11:54:16ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2000
MuLog /etc/wb-rules/rules.js:4 preventsyield

2024-08-16 11:54:17ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2904
MuLog /etc/wb-rules/test122.js:4 preventsyield

2024-08-16 11:54:17ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2000

Значит что что то делаю не так

Да, воспроизвел. Если вы логировать будете в muModule.js, то все будет работать, как вы и ожидаете. А при экспорте в еще один файл такое не работает. Подумаю, отпишусь.

я просто пытаюсь сделать обмен между сценариями некоторыми переменными., сейчас сделано через глобальные, которые видны в каждом файле сценария (скрипта). Но Вы же сами пишите метод “грязный”. Вот и пытаюсь как - то выкрутится не через глобальные. Метод с постоянным хранилищем не совсем подходит (мне не нужно сохранение в памяти при перезагрузке), обмениваться через MQTT как то тоже не вижу смысля (не будет ли это тормозить ?). Конечно можно написать все в одном файле сценария в котором объявит нужные переменные ,но он вероятно будет слишком большой и потом поддерживать его замучишься.

Был неправ, прошу прощения. При таком синтаксисе для каждого файла создается свой экземпляр данных. Правильно будет так:

module.static.varMain = {
    Stage: 0,           // Текущий этап работы 
    Error: "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};

exports.varMain = module.static.varMain;

Теперь будет работать. У меня работает.

1 лайк

у меня не воспроизводится, по прежнему в логе 0

2024-08-16 13:09:43module 1 Stage = 0
2024-08-16 13:09:44module 1 Stage = 0
2024-08-16 13:09:45module 1 Stage = 0
2024-08-16 13:09:46module 1 Stage = 0
2024-08-16 13:09:47module 1 Stage = 0
2024-08-16 13:09:48module 1 Stage = 0
2024-08-16 13:09:49module 1 Stage = 0
2024-08-16 13:09:50module 1 Stage = 0
2024-08-16 13:09:51module 1 Stage = 0
2024-08-16 13:09:52module 1 Stage = 0
2024-08-16 13:09:53module 1 Stage = 0

система

Welcome to Wiren Board 7.3.3 (s/n AWH3C6UH), release unstable.latest (as testing                                                                                                                                                             )
Linux wirenboard-AWH3C6UH 5.10.35-wb168 #1 SMP Tue Jun 18 08:00:16 UTC 2024 armv 


● wb-rules.service - MQTT Rule engine for Wiren Board
     Loaded: loaded (/lib/systemd/system/wb-rules.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-08-16 08:00:09 UTC; 7min ago
   Main PID: 19597 (wb-rules)
      Tasks: 19 (limit: 2354)
     Memory: 28.2M
        CPU: 2min 18.759s
     CGroup: /system.slice/wb-rules.service
             └─19597 /usr/bin/wb-rules -syslog -editdir /etc/wb-rules/ /usr/share/wb-rules-system/rules/ /etc/wb-rules/ /usr/share/wb-rules/

Aug 16 08:07:45 wirenboard-AWH3C6UH wb-rules[19597]: INFO: [rule info] module 1 Stage = 0

я взял скопировал ваш код

module.static.varMain = {
    Stage: 0,           // Текущий этап работы 
    Error: "None",      // Текущая ошибка в работе 
    ADC_Code: 0,         // Код АЦП от датчика 
};

exports.varMain = module.static.varMain;

вставил в модуль muModule.js перезапустил wb-rules. но влоге 0

А эти файлы у Вас такие?
Mod1.js

var m = require("muModule"); // подключаем модуль

function MuLog(){
m.varMain.Stage = 22;
};
setInterval (MuLog, 1000);

Mod2.js

var m = require("muModule"); 
function MuLog(){
log.info("module 1 Stage = "+ m.varMain.Stage); 
};

setInterval (MuLog, 1000);

Или вы их тоже как то меняли?