Товарищи, есть список телефонных номеров и email адресов в отдельном файле addresses.js
Пытаюсь вторым скриптов вытащить из него адреса и номера. но выдает ошибку(
Помогите с осуществлением задумки) вот код которым пытаюсь считать
// Импортируем получателей из 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 содержит в себе функцию, которая возвращает некий список объектов. И он не выполняется при его вызове.
Покажите пожалуйста функцию из этого модуля?
Добрый вечер.
Спрошу здесь с Вашего позволения чтобы не плодить темы.
Как получить доступ к объекту содержащему общие переменные для двух других скриптов допустим 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__ все получается, но хотел попробовать через модули.
Если в модуле есть (описаны) методы изменения глобальных переменных - да, можно. Если нет - то вызов модуля создает просто экземпляр его. Естественно с локальными переменными.
Проблем с этим нет. А вот можно также сделать используя модуль без глобальных переменных?
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; //не дает сразу ошибка
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 и в любом файле, куда вы ее экспортировали.
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
Да, воспроизвел. Если вы логировать будете в muModule.js, то все будет работать, как вы и ожидаете. А при экспорте в еще один файл такое не работает. Подумаю, отпишусь.
я просто пытаюсь сделать обмен между сценариями некоторыми переменными., сейчас сделано через глобальные, которые видны в каждом файле сценария (скрипта). Но Вы же сами пишите метод “грязный”. Вот и пытаюсь как - то выкрутится не через глобальные. Метод с постоянным хранилищем не совсем подходит (мне не нужно сохранение в памяти при перезагрузке), обмениваться через MQTT как то тоже не вижу смысля (не будет ли это тормозить ?). Конечно можно написать все в одном файле сценария в котором объявит нужные переменные ,но он вероятно будет слишком большой и потом поддерживать его замучишься.
Был неправ, прошу прощения. При таком синтаксисе для каждого файла создается свой экземпляр данных. Правильно будет так:
module.static.varMain = {
Stage: 0, // Текущий этап работы
Error: "None", // Текущая ошибка в работе
ADC_Code: 0, // Код АЦП от датчика
};
exports.varMain = module.static.varMain;
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