• Изменено

Техническое описание системы управления обновлениями через Telegram

Обзор

Автоматизация предоставляет интерфейс для управления обновлениями пакетов через Telegram с использованием интерактивных кнопок и команд. Основные функции:

  • Проверка доступных обновлений.
  • Обновление или переустановка отдельных компонентов, групп пакетов или всей системы.
  • Динамическое формирование кнопок (с версии 1.6.8 homed-automation).
  • Автоматическое удаление сообщений с кнопками (с версии 2.0.5 homed-automation).

Версии автоматизации и требования

Старая версия (до 1.6.8 homed-automation)

  • Название файла: upgradefromtg.json
    upgradefromtg.json
    12kB

Image description
!<

  • Особенности:
    • Статические кнопки (не зависят от установленных пакетов).
    • Сообщения с кнопками остаются в чате после нажатия.
    • Не поддерживает homed-automation < 1.6.8.

Версия 1.6.8 homed-automation

  • Название файла: upgradefromtg2.json
    upgradefromtg2.json
    26kB

Image description

Image description

Image description

Image description

Image description

  • Новые возможности:
    • Динамические кнопки: список формируется на основе установленных пакетов HOMEd.
      Пример: если пакет modbus отсутствует, кнопка не отображается.
    • Улучшенные уведомления:
    • Статус операции (успех/ошибка).
    • Время выполнения этапов (например, [12:34:56] Обновление завершено).
    • Экранирование специальных символов для Telegram.
  • Требования:
    • homed-automation версии 1.6.8 или выше.

Версия 2.0.5 homed-automation

  • Название файла: upgradefromtg-205
    upgradefromtg-205.json
    24kB
    Обновлено 28.03.2025

Как это выглядит:

Image description

Image description

Image description

Image description

Код автоматизации:

{
  "actions": [
    {
      "command": "#!/bin/sh\nTRIGGER_NAME=\"{{triggerName}}\"\nECHO_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\ncase ${TRIGGER_NAME:3:1} in\n    \"1\") ACTION_TYPE=\"update\" ;;\n    \"2\") ACTION_TYPE=\"list\" ;;\n    \"4\") ACTION_TYPE=\"upgrade\" ;;\n    \"5\") ACTION_TYPE=\"reinstall\" ;;\n    *) ACTION_TYPE=\"unknown\" ;;\nesac\ncase ${TRIGGER_NAME:5:2} in\n    \"01\") PKG=\"homed-automation\" ;;\n    \"11\") PKG=\"homed-qt\" ;;\n    \"21\") PKG=\"homed-common\" ;;\n    \"31\") PKG=\"homed-web\" ;;\n    \"41\") PKG=\"homed-recorder\" ;;\n    \"51\") PKG=\"homed-cloud\" ;;\n    \"61\") PKG=\"homed-zigbee\" ;;\n    \"71\") PKG=\"homed-custom\" ;;\n    \"81\") PKG=\"homed-modbus\" ;;\n    \"91\") PKG=\"homed-custom-midea\" ;;\n    *) PKG=\"\" ;;\nesac\ncase ${TRIGGER_NAME} in\n    \"1114991\") PKG=\"all\"; ACTION_TYPE=\"upgrade\" ;;\n    \"1114911\") PKG=\"all-homed\"; ACTION_TYPE=\"upgrade\" ;;\n    \"1115991\") PKG=\"all\"; ACTION_TYPE=\"reinstall\" ;;\n    \"1115911\") PKG=\"all-homed\"; ACTION_TYPE=\"reinstall\" ;;\nesac\n{\n    case \"$ACTION_TYPE\" in\n        \"update\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка обновить список пакетов.\" ;;\n        \"list\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка сформировать кнопки.\" ;;\n        \"upgrade\")\n            case \"$PKG\" in\n                \"all\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка обновить все пакеты OpenWRT.\" ;;\n                \"all-homed\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка обновить все пакеты HOMEd.\" ;;\n                *) echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка обновить $PKG.\" ;;\n            esac ;;\n        \"reinstall\")\n            case \"$PKG\" in\n                \"all\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка переустановить все пакеты OpenWRT.\" ;;\n                \"all-homed\") echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка переустановить все пакеты HOMEd.\" ;;\n                *) echo \"{{ timestamp | dd.MM.yy hh:mm }} Попытка переустановить $PKG.\" ;;\n            esac ;;\n        *) echo \"{{ timestamp | dd.MM.yy hh:mm }} Неизвестная операция.\" ;;\n    esac > \"$ECHO_FILE\"\n}\ncase \"$PKG\" in\n    \"all\") printf \"all OpenWRT\" ;;\n    \"all-homed\") printf \"all HOMEd\" ;;\n    *) printf \"%s\" \"$PKG\" ;;\nesac",
      "timeout": 30,
      "type": "shell",
      "uuid": "5b4a0d3155924dc1966928639a1e2552"
    },
    {
      "name": "Last UFT",
      "type": "state",
      "uuid": "fe1bb2fb071f45b9affd14581bdea39a",
      "value": "{{ shellOutput }}"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "opkg update > /tmp/opkgupdate.txt",
          "timeout": 600,
          "type": "shell",
          "uuid": "8e4fa2bd36b54a39819b313c48c1cb78"
        },
        {
          "command": "#!/bin/sh\n{\n    opkg list-upgradable | awk '\n        BEGIN {\n            printf \"Пакеты HOMEd:\\n\"\n            homed_found = 0\n            other_found = 0\n        }\n        /^homed-/ {\n            homed_pkgs = homed_pkgs $1 \"\\n\"\n            homed_found = 1\n            next\n        }\n        {\n            other_pkgs = other_pkgs $1 \"\\n\"\n            other_found = 1\n        }\n        END {\n            if (homed_found) {\n                printf \"%s\", homed_pkgs\n            } else {\n                print \"Нет доступных обновлений. Возможно нужно обновить список пакетов.\"\n            }\n            print \"Остальные пакеты OpenWRT:\\n\"\n            if (other_found) {\n                printf \"%s\", other_pkgs\n            } else {\n                printf \"Нет доступных обновлений.\"\n            }\n            if (homed_found || other_found) {\n                print \"Обновить пакеты или переустановить?\" > \"/tmp/title2tg.txt\"\n                print \"Обновление пакетов: upgrade packages\" > \"/dev/stderr\"\n                printf \"Принудительная переустановка пакетов: reinstall packages\" > \"/dev/stderr\"\n            } else {\n                print \"Не удалось найти обновления пакетов. Вы можете переустановить нужный пакет HOMEd отдельно, либо группой.\" > \"/tmp/title2tg.txt\"\n                printf \"Принудительная переустановка пакетов: reinstall packages\" > \"/dev/stderr\"\n            }\n        }\n    '\n} > /tmp/echo2tg.txt",
          "timeout": 120,
          "type": "shell",
          "uuid": "fb0e87491d5c4e7e9a7a2ef40861fd83"
        }
      ],
      "triggerName": "1111111",
      "type": "condition",
      "uuid": "20fa072c92f64d87a11029112acb3569"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "printf \" Тест пройден \" | tee /tmp/echo2tg.txt >> /tmp/title2tg.txt",
          "timeout": 20,
          "type": "shell",
          "uuid": "68a0b723870441d8857b18caa8a64003"
        }
      ],
      "triggerName": "1112011",
      "type": "condition",
      "uuid": "b06e1f000d9b4f2499154a5af6e36d11"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "printf \"Что обновить?\" > /tmp/title2tg.txt",
          "timeout": 30,
          "type": "shell",
          "uuid": "83bcb72df85e4050a639ce09bec963d7"
        },
        {
          "command": "#!/bin/sh\nopkg list-upgradable | awk '\n    $1 ~ /^homed-/ {\n        sub(/^homed-/, \"\", $1)\n        sub(/-[0-9.-]+$/, \"\", $1)\n        n = split($1, parts, \"-\")\n        name = parts[n]\n        if (name ~ /^[a-zA-Z]+$/) {\n            print length(name), name\n        }\n    }\n' | sort -n | cut -d' ' -f2- | awk '\n    BEGIN {\n        current_line = \"\"\n        current_length = 0\n    }\n    {\n        needed_length = length($0) + (current_line ? 2 : 0)\n        if (current_length + needed_length > 36) {\n            print_with_suffix(current_line)\n            current_line = $0\n            current_length = length($0)\n        } else {\n            if (current_line) {\n                current_line = current_line \", \" $0\n                current_length += needed_length\n            } else {\n                current_line = $0\n                current_length = length($0)\n            }\n        }\n    }\n    END {\n        if (current_line) {\n            print_with_suffix(current_line)\n        }\n        printf \"все пакеты HOMEd: all HOMEd upgrade, все пакеты OpenWRT: all OWRT upgrade\"\n    }\n    function print_with_suffix(line) {\n        split(line, packages, \", \")\n        for (i = 1; i <= length(packages); i++) {\n            if (i > 1) printf \", \"\n            printf \"%s: %s upgrade\", packages[i], packages[i]\n        }\n        print \"\"\n    }\n'",
          "timeout": 120,
          "type": "shell",
          "uuid": "073124bd45a345c8800062a47ed59b72"
        }
      ],
      "triggerName": "1112041",
      "type": "condition",
      "uuid": "d4710fee342749ea8e1cd2acfff1be31"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "printf \"Что принудительно переустановить?\" > /tmp/title2tg.txt",
          "timeout": 30,
          "type": "shell",
          "uuid": "bd229d9e5a5e4df7ab0efa06589ce89c"
        },
        {
          "command": "#!/bin/sh\nopkg list-installed | awk '\n    $1 ~ /^homed-/ {\n        sub(/^homed-/, \"\", $1)\n        sub(/-[0-9.-]+$/, \"\", $1)\n        n = split($1, parts, \"-\")\n        name = parts[n]\n        if (name ~ /^[a-zA-Z]+$/) {\n            print length(name), name\n        }\n    }\n' | sort -n | cut -d' ' -f2- | awk '\n    BEGIN {\n        current_line = \"\"\n        current_length = 0\n    }\n    {\n        needed_length = length($0) + (current_line ? 2 : 0)\n        if (current_length + needed_length > 36) {\n            print_with_suffix(current_line)\n            current_line = $0\n            current_length = length($0)\n        } else {\n            if (current_line) {\n                current_line = current_line \", \" $0\n                current_length += needed_length\n            } else {\n                current_line = $0\n                current_length = length($0)\n            }\n        }\n    }\n    END {\n        if (current_line) {\n            print_with_suffix(current_line)\n        }\n        printf \"все пакеты HOMEd кроме automation: all homed reinstall\"\n    }\n    function print_with_suffix(line) {\n        split(line, packages, \", \")\n        for (i = 1; i <= length(packages); i++) {\n            if (i > 1) printf \", \"\n            printf \"%s: %s reinstall\", packages[i], packages[i]\n        }\n        print \"\"\n    }\n'",
          "timeout": 120,
          "type": "shell",
          "uuid": "3f99486efe3742e2a69008de867b15ec"
        }
      ],
      "triggerName": "1112051",
      "type": "condition",
      "uuid": "11ea76e79fdb48dda26a2a5f917d7325"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "#!/bin/sh\nLOG_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\n{\n    echo \"=== Обновление пакетов HOMEd ===\"\n    echo \"{{ timestamp | dd.MM.yy hh:mm }}\"\n    PACKAGES=$(opkg list-upgradable | awk '/^homed-/ && $1 !~ /homed-automation/ {print $1}' | tr '\n' ' ')\n    if [ -z \"$PACKAGES\" ]; then\n        echo \"Нет доступных обновлений\"\n    else\n        echo \"Обновляем: $PACKAGES\"\n        START_TIME=$(date +%s)\n        if opkg upgrade $PACKAGES; then\n            echo \"Статус: успешно (за $(($(date +%s) - START_TIME )) сек)\"\n        else\n            echo \"ОШИБКА: Не удалось установить обновления\"\n        fi\n    fi\n    echo \"=== Завершено ===\"\n} > \"$LOG_FILE\" 2>&1\nawk '\n    BEGIN {status=\"\"; time=\"\"; pkgs=\"\"}\n    {\n        if ($0 ~ /Обновляем:/) pkgs = substr($0, index($0, \":\")+2)\n        if ($0 ~ /Статус:/) status = substr($0, index($0, \":\")+2)\n        if ($0 ~ /сек\\)/) time = $NF\n    }\n    END {\n        print \"Результат обновления:\"\n        if (pkgs) print \"• Пакеты: \" pkgs\n        if (status) print \"• \" status\n        if (time) print \"• Время: \" time\n        printf \"{{ timestamp | dd.MM.yy hh:mm }}\"\n    }\n' \"$LOG_FILE\" > \"$TG_FILE\"",
          "timeout": 600,
          "type": "shell",
          "uuid": "4a9ef58dd8f44c68bcee104fd9031ed5"
        },
        {
          "conditions": [
            {
              "equals": null,
              "pattern": "{{ shellOutput }}",
              "type": "pattern"
            }
          ],
          "else": [],
          "then": [
            {
              "file": "/tmp/echo2tg.txt",
              "type": "telegram",
              "uuid": "a2f7ccc7f39d442fa07413e69b62e58d"
            }
          ],
          "type": "condition",
          "uuid": "93c9d360b88f4609ba8087a7b1bd653c"
        },
        {
          "name": "Last UFT",
          "type": "state",
          "uuid": "f5bdbfbea8fa4d41ad3c7d0e5af5291d",
          "value": "homed-automation"
        }
      ],
      "triggerName": "1114911",
      "type": "condition",
      "uuid": "5f51a98d3c4d4cbab1e03020cb8a4da9"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "#!/bin/sh\nLOG_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\n{\n    echo \"=== Проверка обновлений пакетов OpenWRT ===\"\n    echo \"{{ timestamp | dd.MM.yy hh:mm }}\"\n    PACKAGES=$(opkg list-upgradable | awk '!/^homed-automation($| )/ {print $1}' | tr '\n' ' ')\n    if [ -z \"$PACKAGES\" ]; then\n        echo \"Нет доступных обновлений\"\n        echo \"----------------------------------------\"\n        echo \"Возможно нужно обновить список пакетов\"\n    else\n        echo \"Найдены обновления для: $PACKAGES\"\n        echo \"----------------------------------------\"\n        START_TIME=$(date +%s)\n        if opkg upgrade $PACKAGES; then\n            echo \"Статус: успешно (за $(($(date +%s) - START_TIME )) сек)\"\n        else\n            echo \"ОШИБКА: Не удалось установить обновления\"\n        fi\n    fi\n    echo \"=== Проверка завершена ===\"\n    echo \"{{ timestamp | dd.MM.yy hh:mm }}\"\n} > \"$LOG_FILE\" 2>&1\nawk '\n    BEGIN {\n        status = \"Нет доступных обновлений\";\n        time = \"\";\n        pkgs = \"\";\n        recommendation = \"\";\n    }\n    {\n        if ($0 ~ /Найдены обновления для:/) pkgs = substr($0, index($0, \":\")+2)\n        if ($0 ~ /Статус:/) status = substr($0, index($0, \":\")+2)\n        if ($0 ~ /сек\\)/) time = $NF\n        if ($0 ~ /Возможно нужно обновить список пакетов/) recommendation = $0\n    }\n    END {\n        print \"Результат проверки обновлений:\"\n        if (pkgs != \"\") {\n            print \"• Доступные обновления: \" pkgs\n            print \"• \" status\n            if (time != \"\") print \"• Время выполнения: \" time\n        } else {\n            print \"• \" status\n            if (recommendation != \"\") print \"• \" recommendation\n        }\n        printf \"• Время проверки: {{ timestamp | dd.MM.yy hh:mm }}\"\n    }\n' \"$LOG_FILE\" > \"$TG_FILE\"",
          "timeout": 1200,
          "type": "shell",
          "uuid": "a87cc026bc34401caaed907890e17de1"
        },
        {
          "conditions": [
            {
              "equals": null,
              "pattern": "{{ shellOutput }}",
              "type": "pattern"
            }
          ],
          "else": [],
          "then": [
            {
              "file": "/tmp/echo2tg.txt",
              "type": "telegram",
              "uuid": "1421b51ff62243f98957875484a0ff89"
            }
          ],
          "type": "condition",
          "uuid": "a3cc4f008557471c9b62b87ed3ada585"
        },
        {
          "name": "Last UFT",
          "type": "state",
          "uuid": "c860e0b7ac704fc5bfb7ebf2c9671d35",
          "value": "homed-automation"
        }
      ],
      "triggerName": "1114991",
      "type": "condition",
      "uuid": "dda865b92686411ea71ebd9a9c15a368"
    },
    {
      "conditions": [
        {
          "conditions": [
            {
              "between": [
                1114001,
                1114899
              ],
              "pattern": "{{ triggerName }}",
              "type": "pattern"
            },
            {
              "conditions": [
                {
                  "equals": "homed-automation",
                  "name": "Last UFT",
                  "type": "state"
                },
                {
                  "conditions": [
                    {
                      "equals": 1114911,
                      "pattern": "{{ triggerName }}",
                      "type": "pattern"
                    },
                    {
                      "equals": 1114991,
                      "pattern": "{{ triggerName }}",
                      "type": "pattern"
                    }
                  ],
                  "type": "OR"
                }
              ],
              "type": "AND"
            }
          ],
          "type": "OR"
        }
      ],
      "else": [],
      "then": [
        {
          "command": "#!/bin/sh\nPACKAGE=\"{{ state | Last UFT }}\"\nLOG_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\n{\n    echo \"{{ timestamp | dd.MM.yy hh:mm }} Проверка обновлений $PACKAGE\"\n    if opkg list-upgradable | awk -v pkg=\"$PACKAGE\" '$1 == pkg {found=1; exit} END{exit !found}'; then\n        echo \"Найдено обновление\"\n        START=$(date +%s)\n        if opkg upgrade \"$PACKAGE\"; then\n            echo \"Статус: успешно (за $(($(date +%s) - START)) сек)\"\n        else\n            echo \"Статус: ошибка обновления!\" >&2\n        fi\n    else\n        echo \"Обновлений $PACKAGE не найдено\"\n        echo \"Возможно нужно обновить список пакетов\"\n    fi\n    echo \"{{ timestamp | dd.MM.yy hh:mm }} Завершено\"\n} >> \"$LOG_FILE\" 2>&1\nawk '{\n    gsub(/[][*_`#]/, \"\\\\\\\\&\")\n    sub(/^\\[[0-9:]*\\] /, \"\")\n    print\n}' \"$LOG_FILE\" >> \"$TG_FILE\"",
          "timeout": 120,
          "type": "shell",
          "uuid": "26b7e9a0a04f488b877d672832f22005"
        }
      ],
      "type": "condition",
      "uuid": "620b33e197184025817e60884bbd6e4b"
    },
    {
      "conditions": [
        {
          "between": [
            1115001,
            1115899
          ],
          "pattern": "{{ triggerName }}",
          "type": "pattern"
        }
      ],
      "else": [],
      "then": [
        {
          "delay": "30",
          "triggerName": "1115101",
          "type": "delay",
          "uuid": "0e7f5c1cd337422e983543c7d79eb07e"
        },
        {
          "command": "#!/bin/sh\nPACKAGE=\"{{ state | Last UFT }}\"\nLOG_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\n{\n    echo \"{{ timestamp | dd.MM.yy hh:mm }} Начало переустановки $PACKAGE\"\n    if ! opkg list-installed | grep -q \"^$PACKAGE \"; then\n        echo \"Ошибка: пакет не установлен\"\n        exit 1\n    fi\n    echo \"Текущая версия:\"\n    opkg list-installed | grep \"^$PACKAGE \"\n    START=$(date +%s)\n    if opkg install --force-reinstall \"$PACKAGE\" 2>&1 | grep -v 'Not deleting modified conffile'; then\n        echo \"Новая версия:\"\n        opkg list-installed | grep \"^$PACKAGE \"\n        echo \"Статус: успешно (за $(($(date +%s) - START)) сек)\"\n    else\n        echo \"ОШИБКА переустановки!\"\n    fi\n    printf \"{{ timestamp | dd.MM.yy hh:mm }} Завершено\"\n} > \"$LOG_FILE\" 2>&1\nawk '{\n    gsub(/[][*_`#]/, \"\\\\\\\\&\")\n    sub(/^\\[[0-9:]*\\] /, \"\")\n    print\n}' \"$LOG_FILE\" > \"$TG_FILE\"",
          "timeout": 120,
          "type": "shell",
          "uuid": "5fbe102c0be54ecf88588ab43fdd5deb"
        }
      ],
      "type": "condition",
      "uuid": "5dba60cb603545908369d2ae33441256"
    },
    {
      "conditions": [],
      "else": [],
      "then": [
        {
          "command": "#!/bin/sh\nLOG_FILE=\"/tmp/echo2tg.txt\"\nTG_FILE=\"/tmp/title2tg.txt\"\n{\n    echo \"{{ timestamp | dd.MM.yy hh:mm }} Переустановка пакетов HOMEd\"\n    PKGS=$(opkg list-installed | awk '/^homed-/ && !/homed-automation/ {print $1}' | tr '\n' ' ')\n    if [ -z \"$PKGS\" ]; then\n        echo \"Нет пакетов для переустановки\"\n        exit 0\n    fi\n    echo \"Пакеты: $PKGS\"\n    START=$(date +%s)\n    if opkg install --force-reinstall $PKGS 2>&1 | grep -v 'Not deleting modified conffile'; then\n        echo \"Статус: успешно (за $(($(date +%s) - START)) сек)\"\n    else\n        echo \"ОШИБКА переустановки!\"\n    fi\n    echo \"{{ timestamp | dd.MM.yy hh:mm }} Завершено\"\n} > \"$LOG_FILE\" 2>&1\nawk '{\n    gsub(/[][*_`#]/, \"\\\\\\\\&\")\n    sub(/^\\[[0-9:]*\\] /, \"\")\n    print\n}' \"$LOG_FILE\" > \"$TG_FILE\"",
          "timeout": 600,
          "type": "shell",
          "uuid": "a000effcc2ea4371b8adbff968f98779"
        },
        {
          "conditions": [
            {
              "equals": null,
              "pattern": "{{ shellOutput }}",
              "type": "pattern"
            }
          ],
          "else": [],
          "then": [
            {
              "file": "/tmp/echo2tg.txt",
              "type": "telegram",
              "uuid": "7e5ed059c11742efbb4b03bb5c6dac8f"
            }
          ],
          "type": "condition",
          "uuid": "ab733a32e8ea41e09b4b092b3b2be710"
        }
      ],
      "triggerName": "1115911",
      "type": "condition",
      "uuid": "6ae4cc8d730846698a2173fe37559e77"
    },
    {
      "conditions": [
        {
          "equals": null,
          "pattern": "{{ shellOutput }}",
          "type": "pattern"
        }
      ],
      "else": [],
      "then": [
        {
          "command": "printf \"обновление: upgrade packages,тест: button test, переустановка: reinstall packages\"",
          "timeout": 30,
          "type": "shell",
          "uuid": "cd1e8b1ee95b4a818f2c37bcfec710f6"
        }
      ],
      "type": "condition",
      "uuid": "4579734194de426d9ad158608834116f"
    },
    {
      "message": "Команда принята\n{{ file | /tmp/echo2tg.txt }}",
      "remove": true,
      "type": "telegram",
      "uuid": "83587e1eb9de4246bc559afbc77ca603"
    },
    {
      "delay": "1",
      "type": "delay",
      "uuid": "7559eb7ff7114adf9af40e8d15076730"
    },
    {
      "keyboard": "{{ shellOutput }}\n🔁 Обновить список пакетов: /opkgupdate",
      "message": "{{ file | /tmp/title2tg.txt }}",
      "remove": true,
      "type": "telegram",
      "uuid": "2272ecdc986344229ace89300508aedc"
    }
  ],
  "note": "Обновление пакетов через Telegram",
  "restart": false,
  "triggers": [
    {
      "message": "/opkgupdate",
      "name": "1111111",
      "type": "telegram"
    },
    {
      "message": "button test",
      "name": "1112011",
      "type": "telegram"
    },
    {
      "message": "upgrade packages",
      "name": "1112041",
      "type": "telegram"
    },
    {
      "message": "reinstall packages",
      "name": "1112051",
      "type": "telegram"
    },
    {
      "message": "all OWRT upgrade",
      "name": "1114991",
      "type": "telegram"
    },
    {
      "message": "automation upgrade",
      "name": "1114101",
      "type": "telegram"
    },
    {
      "message": "qt upgrade",
      "name": "1114111",
      "type": "telegram"
    },
    {
      "message": "common upgrade",
      "name": "1114121",
      "type": "telegram"
    },
    {
      "message": "web upgrade",
      "name": "1114131",
      "type": "telegram"
    },
    {
      "message": "recorder upgrade",
      "name": "1114141",
      "type": "telegram"
    },
    {
      "message": "cloud upgrade",
      "name": "1114151",
      "type": "telegram"
    },
    {
      "message": "zigbee upgrade",
      "name": "1114161",
      "type": "telegram"
    },
    {
      "message": "custom upgrade",
      "name": "1114171",
      "type": "telegram"
    },
    {
      "message": "modbus upgrade",
      "name": "1114181",
      "type": "telegram"
    },
    {
      "message": "midea upgrade",
      "name": "1114191",
      "type": "telegram"
    },
    {
      "message": "all HOMEd upgrade",
      "name": "1114911",
      "type": "telegram"
    },
    {
      "message": "automation reinstall",
      "name": "1115101",
      "type": "telegram"
    },
    {
      "message": "qt reinstall",
      "name": "1115111",
      "type": "telegram"
    },
    {
      "message": "common reinstall",
      "name": "1115121",
      "type": "telegram"
    },
    {
      "message": "web reinstall",
      "name": "1115131",
      "type": "telegram"
    },
    {
      "message": "recorder reinstall",
      "name": "1115141",
      "type": "telegram"
    },
    {
      "message": "cloud reinstall",
      "name": "1115151",
      "type": "telegram"
    },
    {
      "message": "zigbee reinstall",
      "name": "1115161",
      "type": "telegram"
    },
    {
      "message": "custom reinstall",
      "name": "1115171",
      "type": "telegram"
    },
    {
      "message": "modbus reinstall",
      "name": "1115181",
      "type": "telegram"
    },
    {
      "message": "midea reinstall",
      "name": "1115191",
      "type": "telegram"
    },
    {
      "message": "all HOMEd reinstall",
      "name": "1115911",
      "type": "telegram"
    }
  ]
}
  • Новые возможности:
    • Автоматическое удаление сообщений с кнопками сразу после их нажатия.
    • Короткие уведомления (например, "Команда принята") удаляются автоматически.
    • Информационные логи сохраняются в /tmp/echo2tg.txt и /tmp/title2tg.txt.
  • Требования:
    • homed-automation версии 2.0.5 или выше.

Взаимодействие с системой

Запуск процесса обновления

Команда: /opkgupdate
или
Кнопка: Обновить список пакетов.

Действие:
Система проверяет обновления и отправляет список доступных пакетов, разделённый на:

  • Пакеты HOMEd (например, web, zigbee, automation).
  • Остальные пакеты OpenWRT (например, libustream).

Отображаются кнопки выбора режима:

  • Обновление пакетов — запуск обновления.
  • Принудительная переустановка — переустановка пакетов.

Основные сценарии

Обновление пакетов

  • Кнопка: Все пакеты HOMEd → обновляет все компоненты HOMEd, homed-automation обновляется в конце, если доступно.
  • Кнопка: Все пакеты OpenWRT → обновляет все пакеты, homed-automation обновляется в конце.
  • Кнопки с названиями пакетов (например, web, zigbee) → точечное обновление.

Переустановка пакетов

  • Кнопка: Принудительная переустановка → список пакетов для переустановки.
  • Кнопка: Все пакеты HOMEd → переустанавливает все HOMEd-пакеты, кроме homed-automation (его нужно переустанавливать отдельно).
  • Кнопки с названиями пакетов → точечная переустановка.

Особенности работы с homed-automation

  • Групповые операции:
    homed-automation обновляется/переустонавливается в конце всех пакетов.
  • Переустановка:
    Для homed-automation требуется отдельная команда /automation_reinstall или кнопка automation reinstall.

Требования и совместимость

|     Версия автоматизации    |automation|                 Особенности                  |
|-----------------------------|----------|----------------------------------------------|
| `upgradefromtg.json       ` | < 1.6.8  | Статические кнопки, сообщения не удаляются.  |
| `upgradefromtg2.json      ` | ≥ 1.6.8  | Динамические кнопки, улучшенные уведомления. |
| `upgradefromtg_v2.0.5.json` | ≥ 2.0.5  | Удаление сообщений с кнопок после нажатия.   |

Примеры взаимодействия

Обновление списка пакетов

Пользователь: Нажимает Обновить список пакетов.
Система: Отправляет:

Пакеты HOMEd:  
- web  
- zigbee  

Остальные пакеты OpenWRT:  
- libustream  

Сообщение с предыдущими кнопками удаляется.

Переустановка пакета

Пользователь: Выбирает Принудительная переустановка → web.
Система: Отправляет лог:


[14:20:35] Переустановка homed-web
Статус: успешно

Сообщение с кнопками удаляется, а итоговый отчёт остаётся.


Рекомендации

- Перед использованием выполните /opkgupdate для актуализации списка пакетов.
- Логи операций сохраняются в /tmp/opkg_*.txt (для диагностики).
- Для версий до 2.0.5 сообщения с кнопками остаются в чате.

Ну вот тут бы как раз скриншот из телеги и не помешал, типа такого:Image description

    Sonar Добавил, а так же поправил ошибку в автоматизации, что не выводила кнопки если обновления отсутсвовали.

    • Sonar оценил это.

    Sonar а зачем "Дачный" замазал? Что тут такого секретного?))

    • Sonar оценил это.

    А чтобы никто не догадался ("Ы"). Хотел смайл поставить, но они тут не вставляются.

      🤔

        Блин, да почему у меня не хочет проверять наличие новых пакетов? Хотя при этом обновляет по кнопке.
        Уже вторую автоматизацию пробую и такая беда.
        Вот лог который присылает автоматизация в телегу.

        opkgupdate.zip
        445B
        • igor ответили на это сообщение.
          • Изменено

          -SecurBond- В моей автоматизации при отсутвии обновлений, присылает файл opkgupdate.txt с подписью, что обновления остутствуют. Значит что и вэб интерфейсе пакетов для обновлений нет. Если б обновления были пришёл бы файл opkglistupgradable.txt. Это всё видно если открыть автоматизаицию и посмотреть в action работу первого по счёту condition и его condition уровнем ниже (так сказать под-condition). Могу предположить что были установлены пакеты из песочницы с названиями версиий пакетов из последующего релиза потому OpenWRT воспринимает это не как обновление. По сути такое же было пару раз когда релиз выходил с багом и был быстро исправлен, но название версии пакета не менялась, кто успел обновиться на версию с багом обновить пакет обычной командой уже не мог, потому как названия совпадали. и только принудительная переустановка пакетов могла помочь.
          Если всё же я ошибаюсь и дело в мой автоматизации, то при следующем релизе попоробуйте запустить команду opkg list-upgradable и проверить есть пакеты в списке кандидатов на обновление, а так же проверить в вэб интерфейсе OpenWRT System=>Sofware=>Updates наличие этих пакетов.
          А файл opkgupdate.txt присылается для понимания, что шлюз получает от репозиториев базу данных о доступных пакетах. Из этого лога можно понять имеет ли шлюз доступ к репозиториям, в с лучае ошибки в логе это отобразится.

          • -SecurBond- ответили на это сообщение.

            igor Спасибо что объяснили, подожду следующего релиза и проверю еще раз.

            • igor ответили на это сообщение.
              • Изменено

              -SecurBond- Я нашёл ошибку. Прошу прощения! Сейчас поправлю файл. Поправил. Проверяйте!
              Но там ошибка влияла исключительно на то что присылалось сообщение что обновления отсутствуют и файл со списком доступных пакетов не отсылался. Но если жать кнопки обновить, то обновления должны были выполняться и отчёт об их успешном обновлении должен был приходить в телеграм.

              • -SecurBond- ответили на это сообщение.
                • Изменено

                igor Подтверждаю, пакеты обновлялись по кнопке, правда отчёт об успешном обновлении не приходил, просто писал "Команда принята" и обновлял. Исправления смогу проверить после следующего обновления... )

                  igor Проверил. На версии OpenWrt 23.05.4 r2 Всё работает !!!

                  • igor оценил это.
                  7 дней спустя
                  • Изменено

                  Исправлена ошибка в обновлённой версии автоматизации из-за которой вместо точечного обновления пакетов происходила принудительная переустановка, при обновлении групповых пакетов, этих проблем не возникало. Так же в описание добавил несколько скриншотов новой автоматизации.
                  Странно, никто не заметил баг. Может не пользуется никто.

                    • Изменено

                    Пользуемся . Спасибо за автоматизацию.

                    • igor оценил это.
                    19 дней спустя

                    Часть автоматизации перестала работать с какой-то версии homed-automation ( возможно с версии 2.0). Почему-то shelloutput перестал формировать кнопки если не добавалять к нему символы и в остальном тоже стал через раз выводить данные. Пришлось переделать автоматизацию и вместе с тем добавить функцию удаления сообщений, что добавил уважаемый разработчик в новых версиях пакета.

                      igor Image description
                      При этом в opkglistupgradable.txt:

                      Пакеты HOMEd:
                      Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'

                      Остальные пакеты OpenWRT:
                      Нет доступных обновлений. Проверьте актуальность списка пакетов с помощью 'opkg update'

                      В вебе тоже пусто.

                      • igor ответили на это сообщение.

                        MuMoKpoKoDuJI Это означает, что доступных обновлений нет. Я считаю неправильным выводить информацию с длинным списком доступных пакетов в текстовом сообщении Telegram (не в виде файла), так как их может быть настолько много, что сообщение просто не отобразится.
                        Как можно сделать так, чтобы кнопка с обновлением не выводилась, если пакеты для обновления отсутствуют? Пока я не понимаю, в каких случаях shelloutput возвращает значение _NULL_.
                        Я предположил, что человек поймёт отсутствие обновлений, прочитав присланный файл.
                        Или, возможно, ваш посыл заключается в чём-то другом? Если это так, напишите, пожалуйста, развёрнуто. На основе двух скриншотов с короткими комментариями к ним я мог понять ситуацию не полностью.

                          igor я к тому, что зачем мне лезть в текстовый файл, чтобы узнать, что обновлений нет. При этом кнопка "обновление пакетов" доступна, что сбивает с толку.
                          В данной ситуации логичнее было бы убрать кнопку "обновление пакетов", если после opkg update у нас пусто.
                          Ни в коем случае не наезжаю, просто поделился мнением.

                          • igor ответили на это сообщение.
                            • Изменено

                            _NULL_ - в данном случае это отсутствие вывода, пустая строка.

                            • igor ответили на это сообщение.

                              warlock Это я понимаю. Я не понимаю почему иногда shelloutput не будет выводится если я его не экранирую или если не добавлю символ сразу после, например так {shelloutput} кнопок не будет, а так {shelloutput}fgsffg кнопки появятся, но с дополнительной кнопкой fgsffg, либо можно так {shelloutput} но первая кнопка будет с обратной кавычкой и в конце появится отдельная кнопка с обратной кавычкой.