Добрый день, с помощью chatgpt добавил в скрипт SMSManager.js отправку ответа по СМС, с показаниями датчика. Кто поумнее меня, посмотрите, всё ли нормально накодили :).
SMSManager2.js (6,9 КБ)
Добрый день, с помощью chatgpt добавил в скрипт SMSManager.js отправку ответа по СМС, с показаниями датчика. Кто поумнее меня, посмотрите, всё ли нормально накодили :).
SMSManager2.js (6,9 КБ)
Добрый день.
Посмотреть выложенный файлом js не выйдет, его скачать невозможно. Лчше исходники вставить, именно как “код”.
А что ожидаете от результатов просмотра?
Код работает, но возможно есть какие то косяки, я вообще не программист.
(function () {
var nuberSMSById = {};
var processedSMS = {};
defineVirtualDevice("sms_manager", {
title: "SMS Manager",
cells: {
resend_to_telegramm: {
type: "switch",
value: true,
title: "Пересылать SMS в Telegramm",
order: 10
},
enable_auto_reply: {
type: "switch",
value: true,
title: "Авто-ответ SMS",
order: 20
},
keyword: {
type: "text",
value: "TEMP",
title: "Кодовое слово",
order: 30
},
resended_SMS_timeStamp: {
type: "text",
value: "",
title: "Последнее SMS",
order: 40
}
}
});
// =========================
// SMS polling
// =========================
function checkSms() {
runShellCommand(
"mmcli --modem wbc --messaging-list-sms --output-json",
{
captureOutput: true,
exitCallback: function (exitCode, capturedOutput) {
if (exitCode !== 0) return;
try {
var data = JSON.parse(capturedOutput);
var list = data["modem.messaging.sms"];
if (!list) return;
list.forEach(function (item) {
var parts = item.split("/");
var smsId = parseInt(parts[parts.length - 1], 10);
if (!isNaN(smsId)) {
addSMS(smsId);
}
});
} catch (e) {
log.error("SMS list parse error: " + e);
}
}
}
);
setTimeout(checkSms, 10000);
}
// =========================
// Read SMS details
// =========================
function addSMS(numberSMS) {
if (processedSMS[numberSMS]) return;
processedSMS[numberSMS] = true;
runShellCommand(
"mmcli --modem wbc --sms {} --output-json".format(numberSMS),
{
captureOutput: true,
exitCallback: function (exitCode, capturedOutputSMS) {
if (exitCode !== 0) return;
try {
var Sms = JSON.parse(capturedOutputSMS);
var phoneNumber = Sms["sms"]["content"]["number"];
var textSMS = Sms["sms"]["content"]["text"];
var timeStamp = Sms["sms"]["properties"]["timestamp"];
var idSMS = timeStamp
.replace(/-/g, "")
.replace(/:/g, "")
.replace(/\+/g, "")
.replace(/\s/g, "");
addContols(idSMS, phoneNumber, textSMS, timeStamp);
nuberSMSById[idSMS] = numberSMS;
} catch (e) {
log.error("SMS parse error: " + e);
}
}
}
);
}
// =========================
// UI + logic
// =========================
function addContols(idSMS, phoneNumber, textSMS, timeStamp) {
if (!textSMS || textSMS.length === 0) return;
if (getDevice("sms_manager").isControlExists("SMS_{}_04_btn".format(idSMS))) {
return;
}
log.debug("New SMS: " + idSMS);
updateControl("SMS_{}_00_separator".format(idSMS), "------------------------", "text", "", true);
updateControl("SMS_{}_01_timeStamp".format(idSMS), "Дата", "text", timeStamp, true);
updateControl("SMS_{}_02_phoneNumber".format(idSMS), "Номер", "text", phoneNumber, true);
updateControl("SMS_{}_03_textSMS".format(idSMS), "Текст", "text", textSMS, true);
updateControl("SMS_{}_04_btn".format(idSMS), "Удалить", "pushbutton", false, false);
// update last timestamp
if (
!dev["sms_manager/resended_SMS_timeStamp"] ||
dev["sms_manager/resended_SMS_timeStamp"] < timeStamp
) {
dev["sms_manager/resended_SMS_timeStamp"] = timeStamp;
if (dev["sms_manager/resend_to_telegramm"]) {
sendMsg("SMS {}\n{}\n{}".format(phoneNumber, timeStamp, textSMS));
}
}
// =========================
// AUTO REPLY LOGIC
// =========================
if (!dev["sms_manager/enable_auto_reply"]) return;
var keyword = dev["sms_manager/keyword"];
if (textSMS && textSMS.indexOf(keyword) !== -1) {
var temp = getTemperature();
var reply =
"TEMP: " + temp + " °C\n" +
"Time: " + timeStamp;
sendSMS(phoneNumber, reply);
}
}
// =========================
// Update UI controls
// =========================
function updateControl(controlName, title, type, value, readonly) {
if (!getDevice("sms_manager").isControlExists(controlName)) {
getDevice("sms_manager").addControl(controlName, {
title: title,
type: type,
value: value,
readonly: readonly
});
if (type === "pushbutton") {
defineRule("click_" + controlName, {
whenChanged: "sms_manager/" + controlName,
then: function () {
deleteSMS(controlName);
}
});
}
} else {
if (dev["sms_manager/" + controlName] !== value) {
getDevice("sms_manager")
.getControl(controlName)
.setValue({ value: value, notify: false });
}
}
}
// =========================
// Send SMS (mmcli)
// =========================
function sendSMS(number, text) {
runShellCommand(
"mmcli --modem wbc --messaging-create-sms=\"text='{}',number='{}'\"".format(text, number),
{
captureOutput: true,
exitCallback: function (code, out) {
if (code !== 0) return;
var m = out.match(/\/SMS\/(\d+)/);
if (!m) return;
var smsId = m[1];
runShellCommand(
"mmcli --modem wbc --sms {} --send".format(smsId)
);
}
}
);
}
// =========================
// Temperature from MQTT
// =========================
function getTemperature() {
return dev["wb-msw-v4_182/Temperature"];
}
// =========================
// Telegram (optional)
// =========================
function sendMsg(text) {
var msg = {
chatId: chatId,
text: text
};
dev[msgTopic] = JSON.stringify(msg);
}
// =========================
// Delete SMS
// =========================
function deleteSMS(ControlName) {
var parts = ControlName.split("_");
var idSMS = parts[1];
runShellCommand(
"mmcli --modem wbc --messaging-delete-sms {}".format(nuberSMSById[idSMS]),
{
captureOutput: true,
exitCallback: function (code) {
if (code === 0) {
deleteControls(idSMS);
}
}
}
);
}
function deleteControls(idSMS) {
["00_separator", "01_timeStamp", "02_phoneNumber", "03_textSMS", "04_btn"]
.forEach(function (suffix) {
var name = "SMS_{}_{}".format(idSMS, suffix);
getDevice("sms_manager").removeControl(name);
runShellCommand(
"mqtt-delete-retained '/devices/sms_manager/{}/#'".format(name)
);
});
}
// =========================
// Init
// =========================
runShellCommand("mmcli -G WARN");
checkSms();
})();
Ну, явных ошибок не вижу. Но не стал бы объединять вообще все в один скрипт, конечно. Выделить непосредственную работу с mmcli в отдельный было бы лучше.