Отправка ответа СМС в ответ на входящее, SMS Manager2

Добрый день, с помощью 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 в отдельный было бы лучше.

1 лайк