Z2M валится после обновления системы

Добрый день.

Каждый раз после apt update && apt upgrade отваливается z2m. Приходится его руками запускать.
Не могу точно утверждать, но кажется это началось после обновления модуля zigbee.

приложен диагностический архив, доступен только сотрудникам поддержки
(354,1 КБ)
Куда стукнуть?

Добрый день.
А покажите логи сервиса zigbee2mqtt, вот за сегодня. Их нет в архиве поскольку это сторонний сервис.

log.7z (479,0 КБ)
Мне кажется они обнуляются при перезапуске сервиса. Может в прошлых что-то есть.
Сегодняшний лог с момента перезапуска сервиса.

Воспроизвожу:

Unpacking wb-mqtt-logs (1.5.2) over (1.5.1) ...
Preparing to unpack .../17-wb-scenarios_1.2.1_all.deb ...
Unpacking wb-scenarios (1.2.1) over (1.1.0) ...
Preparing to unpack .../18-zigbee2mqtt_2.1.1-wb101_armhf.deb ...
pnpm is not installed. Install via corepack...
Unpacking zigbee2mqtt (2.1.1-wb101) over (2.1.1-wb101) ...

Progress: [ 80%] [#######################################################

ну и

Setting up zigbee2mqtt (2.1.1-wb101) ...

Configuration file '/mnt/data/root/zigbee2mqtt/data/configuration.yaml'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** configuration.yaml (Y/I/N/O/D/Z) [default=N] ? n
Adding dependencies for pnpm
✔ The modules directory at "/mnt/data/root/zigbee2mqtt/node_modules" will be removed and reinstalled from scratch. Proceed? (Y/n) · true
Recreating /mnt/data/root/zigbee2mqtt/node_modules
Lockfile is up to date, resolution step is skipped
Packages: +366
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 366, reused 0, downloaded 366, added 366, done

dependencies:
+ ajv 8.17.1
+ bind-decorator 1.0.11
+ debounce 2.2.0
+ express-static-gzip 2.2.0
+ fast-deep-equal 3.1.3
+ finalhandler 1.3.1
(много пакетов)

После обновления - активен, запущен:

systemctl status zigbee2mqtt
● zigbee2mqtt.service - zigbee2mqtt
     Loaded: loaded (/lib/systemd/system/zigbee2mqtt.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-04-02 14:04:34 UTC; 3min 2s ago
   Main PID: 2285 (npm start)
      Tasks: 23 (limit: 2354)
     Memory: 99.7M
        CPU: 58.955s
     CGroup: /system.slice/zigbee2mqtt.service
             ├─2285 npm start
             ├─2595 sh -c node index.js
             └─2598 node index.js

Apr 02 14:04:34 wirenboard-AQASN7R6 systemd[1]: Started zigbee2mqtt.
Apr 02 14:04:47 wirenboard-AQASN7R6 npm[2285]: > zigbee2mqtt@2.1.1 start
Apr 02 14:04:47 wirenboard-AQASN7R6 npm[2285]: > node index.js
Apr 02 14:04:52 wirenboard-AQASN7R6 npm[2598]: Starting Zigbee2MQTT without watchdog.

x.7z (596,5 КБ)
Вот из journalctl. В районе 12:00
Я искренне верю, что у Вас работает. Я не пойму причину такого поведения у меня. Возможно перезапуск какого-то сервиса валит z2m. Может еще что-то.

x.txt (735,2 КБ)
Прошу прощения. Вот лог с остальными сервисами. Я ничего криминального не увидел.

Да, в процеcсе обновления сервис перезапускался:

Apr 02 12:03:11 wirenboard-AQA7SWQH npm[31698]: [2025-04-02 12:03:11] info:         z2m: Zigbee2MQTT started!
Apr 02 12:02:53 wirenboard-AQA7SWQH npm[31698]: Starting Zigbee2MQTT without watchdog.
Apr 02 12:02:51 wirenboard-AQA7SWQH npm[31561]: > node index.js
Apr 02 12:02:51 wirenboard-AQA7SWQH npm[31561]: > zigbee2mqtt@2.1.1 start
Apr 02 12:02:46 wirenboard-AQA7SWQH systemd[1]: Started zigbee2mqtt.
Apr 02 12:02:46 wirenboard-AQA7SWQH systemd[1]: zigbee2mqtt.service: Consumed 37min 52.600s CPU time.
Apr 02 12:02:46 wirenboard-AQA7SWQH systemd[1]: Stopped zigbee2mqtt.
Apr 02 12:02:46 wirenboard-AQA7SWQH systemd[1]: zigbee2mqtt.service: Succeeded.

Сервисы зависимые от обновляемых могут перезапускаться автоматически.

В продолжении темы.
Вот сейчас обновил:

Смотрю статус:

Сеть Zigbee лежит, хотя сервис запущен.
Диагностика в этот момент:

приложен диагностический архив, доступен только сотрудникам поддержки
(367,6 КБ)

Дальше перезапускаю сервис и сеть Zigbee оживает:

Архив после перезапуска.

приложен диагностический архив, доступен только сотрудникам поддержки
(368,8 КБ)

Куда стукнуть?
В данной ситуации Zigbee времянка. Это тест на даче. В реальной жизни никакого Zigbee не будет. Но “как-то не аккуратненько”.

Что-то форматирование всё попадало и не поддается исправлению… Вызывайте батюшку… )))

Поправил форматирование руками. У code крыша съезжает. Сделал через цитирование.

То есть сам сервис работает, насколько я вижу. Ну, попробую воспроизвести.

Сам сервис да, работает. Но после обновлений (и как следствие рестарта каких-то других сервисов) перестает общение с железом. Сейчас да, точно вспоминаю, что началось с обновлением прошивки Zigbee модуля.
Могу дать доступ, возможно так проще будет воспроизвести.

Для интереса попробовал даже прошивку в модуль “старую”
Ну и перезапускал сервисы. Не выходит воспроизвести. Способ уронить - только потыкать в порт модуля, то есть деконфигурировать его.
От прошивки модуля не зависит.

Глобально я на проблему забил. Просто делаю apt update && apt upgrade -y && service zigbee2mqtt restart

Это поведение стабильно проявляется, когда обновляются пакеты. Так что как обновите что-то в репозитории, можно продолжить. Обновлялся только вчера с таким же поведением. Обновляемся, ждем минуту-две и zigbee ложится до перезагрузки z2m.

Но если Вам интересно разобраться, могу дать доступ. Объект тестовый, можно играться.

Приглашение отправил.
AQA7SWQH

Вот именно сегодня тоже обновился.

root@wirenboard-AQASN7R6:~# apt upgrade -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  cmux hubpower libwbmqtt1-4 python-wb-io python3-all python3-distutils python3-lib2to3
Use 'apt autoremove' to remove them.
The following packages will be upgraded:
  wb-mqtt-serial wb-release-info
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,089 kB of archives.
After this operation, 164 kB of additional disk space will be used.
Get:1 https://deb.wirenboard.com/wb7/bullseye testing/main armhf wb-release-info all 1.0-testing~wb7+bullseye~20250418083835 [1,672 B]
Get:2 https://deb.wirenboard.com/wb7/bullseye testing/main armhf wb-mqtt-serial armhf 2.159.0 [1,087 kB]
Fetched 1,089 kB in 2s (517 kB/s)         
(Reading database ... 51093 files and directories currently installed.)
Preparing to unpack .../wb-release-info_1.0-testing~wb7+bullseye~20250418083835_all.deb ...
Unpacking wb-release-info (1.0-testing~wb7+bullseye~20250418083835) over (1.0-testing~wb7+bullseye~20250417115003) ...
Setting up wb-release-info (1.0-testing~wb7+bullseye~20250418083835) ...
(Reading database ... 51093 files and directories currently installed.)
Preparing to unpack .../wb-mqtt-serial_2.159.0_armhf.deb ...
Unpacking wb-mqtt-serial (2.159.0) over (2.158.10) ...
Setting up wb-mqtt-serial (2.159.0) ...

Я уверен, что у всех остальных всё нормально. Что у меня так “звезды сошлись”.
Я собственно и говорю как стабильно воспроизвести “у меня”.
Если интересно разобраться (вдруг какая-то бага неочевидная) - я дал доступ. Если не интересно - я забью. Мне перезапускать z2m после обновления не в напряг.

Немного локализовал проблему.

root@wirenboard-AQA7SWQH:~# service wb-mqtt-serial restart

После этого Zigbee сеть ложится. Пока не произойдет:

root@wirenboard-AQA7SWQH:~# service zigbee2mqtt restart

После перезапуска всё приходит в норму.

О как… Так, а есть ли правила, которые что-нибудь публикуют из wb-mqtt-seral в топики zigbee2mqtt?
Например null, который публикует wb-mqtt-serial при остановке-запуске?

Есть 2 правила, которые работают с mqtt:

Туевской лампе делаю осмысленное виртуальное устройство. Раз:

/**
 * Convert RGB to XY
 */
function RGBtoXY(red,green,blue){
    red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
    green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
    blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
    var X = red * 0.664511 + green * 0.154324 + blue * 0.162028;
    var Y = red * 0.283881 + green * 0.668433 + blue * 0.047685;
    var Z = red * 0.000088 + green * 0.072310 + blue * 0.986039;
    var fx = X / (X + Y + Z);
    var fy = Y / (X + Y + Z);
    return [fx.toPrecision(4),fy.toPrecision(4)];
}

function makeVirtualTuyaLamp(deviceName, deviceNameRU, lampDeviceID) {
  
  defineVirtualDevice(deviceName, {
      title: deviceNameRU,
      cells: {
    	state: {
          title: "Включено",
    	    type: "switch",
    	    value: false
    	},
    	brightness: {
          title: "Яркость",
    	    type: "range",
            min: 0,
            max: 254,
    	    value: 254
    	},
    	colortemp: {
          title: "Цветовая температура",
          type: "value",
          value: 250,
          enum: {
              0: {ru: "RGB Control"},
            153: {ru: "Coolest"},
            250: {ru: "4000K Cool"},
            370: {ru: "2700K Neutral"},
            454: {ru: "2200K Warm"},
            500: {ru: "Warmest"}
          },
          readonly: false
    	},
    	color: {
          title: "Цвет",
    	  type: "rgb",
          value: false
    	},
      }
  });
  
  defineRule(deviceName + "_state", {
    whenChanged: [deviceName + "/state",deviceName + "/brightness", deviceName + "/colortemp", deviceName + "/color"],
    then: function (newValue, devName, cellName) {
      var vState;
      if (dev[deviceName + "/state"] == true){ vState = "ON";} else { vState = "OFF";}
      var vBright = dev[deviceName + "/brightness"];
      var vColTemp = dev[deviceName + "/colortemp"];
      var jsnXY;
      if(vColTemp == 0) { // XY
        var vColRGB = dev[deviceName + "/color"].toString().split(";");
        var XY = RGBtoXY(vColRGB[0], vColRGB[1], vColRGB[2]);
        var jsnXY = {
          state: vState,
          brightness: vBright,
          color: {
            hue: 240,
            saturation: 100,
            x: XY[0],
            y: XY[1]
          }
        }
      }
      else { // Color temperature
        var jsnXY = {
          state: vState,
          brightness: vBright,
          color_temp: vColTemp,
        }
      }
    
      var jsToSend = JSON.stringify(jsnXY);
      //log(jsToSend);
      publish("zigbee2mqtt/" + lampDeviceID + "/set", jsToSend);
    }
  });
}
makeVirtualTuyaLamp("koridor_lamp", "Лампа в коридоре", "ZB_LAMP_ENTRANCE");

Ночной режим это условно 2 состояния. Когда я на даче и когда нет. Два:

defineVirtualDevice("night_mode", {
    title: "Ночной режим",
    cells: {
	night: {
	    type: "switch",
	    value: false
	},
    }
});

defineRule({
  whenChanged: "cityron-pu-3_1/Panel Status",
  then: function (newValue, devName, cellName) {
    dev["night_mode/night"] = !newValue;
  }
});

defineRule({
  whenChanged: "night_mode/night",
  then: function (newValue, devName, cellName) {
    dev["wb-mr6cu_175/K1"] = true; // Гараж
	dev["wb-mr6cu_175/K2"] = true; // Вход
	dev["wb-mr6cu_175/K3"] = newValue; // Сортир
	dev["wb-mr6cu_175/K4"] = newValue; // Зал
    dev["wb-mr6c_73/K1"] = !newValue; // Реле в зале
    dev["cityron-pu-3_1/Panel Status"] = !newValue;
    
    var vState;
    
    if (newValue == true){
      // Ночной режим. Гасим что не нужно.
      vState = "OFF";
      dev["l_Entrance/tmr_enabled"] = false; // Свет в коридоре, если включен
      dev["wb-led_181/Channel 1"] = false; // LED Studio up
      dev["wb-led_181/Channel 2"] = false; // LED Studio down
    }
    else {
      // Дневной режим.
      vState = "ON";
    }
    
    // Розетка в зале на печки
    publish("zigbee2mqtt/ZB_SOCKET_ZAL/set", JSON.stringify({state: vState }));

    // Свет
    publish("zigbee2mqtt/ZB_SWITCH_ZAL/set", JSON.stringify({state: vState }));
  }
});

defineRule("ZB_BUTTON_rule", {
  whenChanged: "ZB_BUTTON/action",
  then: function (newValue, devName, cellName) {
    switch(dev["ZB_BUTTON/action"]){
      case "hold": {
        dev["night_mode/night"] = !dev["night_mode/night"]; 
        break;
      }
      case "double": {
        dev["wb-led_181/Channel 1"] = !dev["wb-led_181/Channel 1"]; // LED Studio up
        dev["wb-led_181/Channel 2"] = !dev["wb-led_181/Channel 2"]; // LED Studio down
        break;
      }
      case "single": {
        publish("zigbee2mqtt/ZB_SWITCH_ZAL/set", JSON.stringify({state: "TOGGLE" }));
        break;
      }
      default: { break; }
    }
    dev["ZB_BUTTON/action"] = "none";
   }
});