Восстановление базы после обновления

Добрый день!
Обновил Wirendoard 6.5 до версии WB-2304 с WB-2201 с увеличением раздела root.
В целом все прошло успешно, кроме пары моментов:

  1. /mnt/data/var/lib/wirenboard/db у меня был давно вынесен на флэшку, и база занимает уже около 900Мб. После обновления примонтировал флэшку обратно, сделал дамп и восстановление базы, но не помогло. Работает только новая база, соответственно все старые данные недоступны.
    Дамп и старая база есть, можно ли как-то импортировать в текущую?
  2. У меня много tasmota устройств, раньше пользовался конвертером tasmota2wb. Он все еще актуален и будет работать на bullseye? Или нужно другое решение искать?
    Спасибо!

Добрый день.

Читается ли успешно “старая” база, есть ли в ней информация?
Структура менялась ранее релиза так что должна соответствовать текущей.

Должен, не проверял его.

В дампе информация видна. Вопрос как правильно ее добавить к текущей рабочей базе?

В текущем релизе версия

echo "select * from variables;" | sqlite3 /mnt/data/var/lib/wirenboard/db/data.db
db_version|6

Поэтому достатчно загрузить базу.

А можете подсказать как именно импортировать, чтобы не затереть все данные?
Вот такая команда сработает, или что-то сложнее нужно?
sqlite3 my_database.sqlite < dumpfile.sql

Да. Я бы вообще не трогал базу при обновлении, чтобы не выгружать-загружать.
Ну и, не помню досконально sqlite, уберите из дампа команды создания таблиц.

Подскажите как собрать конвертер tasmota2wb под wb7 ?
Или может быть кто-нибудь поделится готовой сборкой.

А что именно не работает в конверторе?

На этапе make возникает ошибка mosqpp not defined. Лог не сохранился, т.к. уже снес виртуалку на которой пытался скомпилировать.

Здравствуйте!
Я использую вот такой конвертер на wb-rules, написанный родственником:

tasmota.js
// Указание объекта имен, с ключами в виде id устройств.
var maxWaitTime = 330;

var config = {
  'tasmota_4914DB': 'name1', //сюда пишете свое название для устройства
  'tasmota_0B21F7': 'name2',
  'tasmota_3213B6': 'name3',
  'tasmota_4248ED': 'name4',
  'tasmota_B56D2A': 'name4'
};  

// Указание объекта значений, с ключами в виде адресов, значения в формате: [value, type, canEdit]
var map = {
  'POWER': ['k1', 'switch'], 
  'POWER1': ['k1', 'switch'],
  'POWER2': ['k2', 'switch'],
  'POWER3': ['k3', 'switch'],
  'POWER4': ['k4', 'switch'],
  'AM2301.Temperature': ['temperature', 'temperature'],
  'AM2301.Humidity': ['humidity', 'rel_humidity'],
  'MHZ19B.CarbonDioxide': ['co2', 'concentration'],
  'StatusNET.IPAddress': ['ip'],
  'Info2.IPAddress': ['ip'],
  'LWT': ['status', 'switch', false],
}; 

var controls = {};

// управляем контролом
var waitTimeout = {};
function setData(device, controlName, value) {
  var el = map[controlName];
  if(!el) return;
  
  var key = device.getId() + '/' + el[0];
  controls[key] = controlName;
  
  if(el[1] === 'switch') {
    if(el[2] !== false) el[2] = true;
    value = ['ON', 'on', 'Online'].indexOf(value) > -1;
  }
  
  if(!getControl(key)) {
    device.addControl(el[0], {
      type: el[1] || "text",
      value: value,
      readonly: !el[2], 
    });
        
    if(el[2]) defineRule(key, {
      whenChanged: key,
      then: function (newValue, cellName, controlName) {
        var key = cellName + '/' + controlName;
        if(el[1] === 'switch') newValue = newValue ? 'on' : 'off';
          
        publish('cmnd/' + cellName + '/' + controls[key], newValue);
      }
    });
  } 

  if(dev[key] != value) {
    if(!waitTimeout[key]) {
      dev[key] = value;
      waitTimeout[key] = setTimeout(function(){
        waitTimeout[key] = false;
      }, 300);
    }
  }
}

var statusTimeouts = {};
// обрабатываем все устройства
for(var deviceCode in config) {
  var device = defineVirtualDevice(deviceCode, {
    title: config[deviceCode],  
    cells: {}
  });   

  trackMqtt('+/' + deviceCode + '/#', function(message){ 
    var parse = message.topic.split('/');
    device = getDevice(parse[1]);
    try {
      var data = JSON.parse(message.value);
      if(typeof data === 'object') {
        if(data.StatusSNS) data = data.StatusSNS;
        if(data.StatusSTS) data = data.StatusSTS;
        
        for(var key in data) {
          if(typeof data[key] === 'object')
            for(var name in data[key]) {
              setData(device, key + '.' + name, data[key][name]); 
            } 
          else 
            setData(device, key, data[key]);
        }
      }

      if(statusTimeouts[device.getId()]) clearTimeout(statusTimeouts[device.getId()]);
      statusTimeouts[device.getId()] = setTimeout(function(){
        setData(device, 'LWT', 0);
      }, maxWaitTime * 1000)
    } catch(e) {
      if(message.value) setData(device, parse[2], message.value);
    } 
  });

  // устанавливаем системное время на tasmota  
  publish('cmnd/' + deviceCode + '/Time', Date.now() / 1000);
  publish('cmnd/' + deviceCode + '/Timezone',(new Date).getHours() - (new Date).getUTCHours());
  
  // инифиируем параметры tasmota 
  publish('cmnd/' + deviceCode + '/Status', '0');
}
4 лайка

Большое спасибо Вам и Вашему родственнику, скрипт отлично работает

Мне не за что=) А ему передам. Отлично, что все заработало!

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.