Автоматическое сохранение данных из Home Assistant в Google Sheets

Home Assistant плохо подходит для того чтобы долго хранить данные.

Home Assistant отлично показывает текущее состояние дома и можно легко понять что было сегодня-вчера, но вот хранить и работать с данными за долгий период времени средствами Home Assistant проблематично.

В качестве эксперимента я решил сделать автоматическое сохранение интересных для меня данных из Home Assistant в Google Sheets (аналог Microsoft Excel). У меня это решение работает уже несколько дней и я пока очень доволен тем что получилось. Но это все-таки эксперимент. Совершенно не факт что это решение у меня приживется. Но я все рано решил рассказать о том что у меня получилось — может быть, подобное решение кому-нибудь пригодится или наведет на какие-то интересные мысли.

Внимание! Для того чтобы можно было реализовать этот проект нужно немного понимать в программировании. Нужно чтобы сервер Home Assistant был доступен снаружи (т.е. чтобы был какой-то адрес https://example.com на котором работает сервер HA) и нужно знать список сенсоров которые вы хотите сохранять в Google Sheets.

Архитектура

Итак, давайте сначала рассмотрим совсем в общих чертах как это все устроено.

Есть данные (в Home Assistant) и есть место куда нужно сохранить эти данные (Google Sheets). Нужно сделать что-то что будет выполнять этот процесс сохранения.

Для этой задачи я решил использовать штуку под названием Google Script — с помощью нее можно создавать маленькие программки которые будут выполняться где-то на серверах Google. Программа на Google Script будет получать данные с моего сервера Home Assistant, а потом будет сохранять эти данные в документ Google Sheets.

Как получить данные из Home Assistant

У меня в Home Assistant есть сенсор "sensor.daily_energy_boiler". Статус этого сенсора — число — информация сколько кВтч сегодня использовал бойлер. (А еще есть атрибут "last_period" — сколько кВтч вчера использовал этот бойлер).

Бойлер у меня подключен через умную розетку BlitzWolf BW-SHP8. Эта розетка считает сколько через нее прошло, а сенсор "sensor.daily_energy_boiler" я сделал с помощью штатной интеграции Home Assistant utility_meter:

utility_meter:
  daily_energy_boiler:
    source: sensor.bw_shp8_boiler_total_daily_energy
    cycle: daily

Я хочу получить возможность прочитать значение этого сенсора извне.

У системы Home Assistant есть API. Для того чтобы использовать API нужно получить токен. Для этого нужно зайти на страницу http://IP:8123/profile и нажать на кнопку "Create Token" в разделе "Long-Lived Access Tokens":

Вас спросят как вы хотите называть этот токен (что вводить — не очень важно, я ввел "google sheets"), а потом Home Assistant покажет токен:

Токен показывается один раз. После того как вы его создали вы уже больше его никогда ну сможете увидеть в интерфейсе Home Assistant, так что нужно сразу его куда-нибудь скопировать (Если вы вдруг потеряли токен — ничего страшного, удаляете этот токен и выпускаете новый).

Токен — это длинная строка символов что-то вроде:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI0M2I1NTkyMzYzNWQ0NDgyOGNlYmRiNmE3NDVkOGQ1NCIsImlhdCI6MTYxMjcwNDQ5MiwiZXhwIjoxOTI4MDY0NDkyfQ.lqUZJ8VzytpnGT3ryNJmj_54cNoOO5LaVWlwAeiGB6U

И теперь с этим токеном вы можете обратиться к серверу Home Assistant и прочитать любые данные с этого сервера, а кроме этого получаете возможность изменять очень многое на этом сервере (Токен — это как логин и пароль — не стоит его всем рассказывать).

Вот пример запроса, с помощью которого можно получить информацию про сенсор "sensor.daily_energy_boiler":

curl "https://EXAMPLE.COM/api/states/sensor.daily_energy_boiler" \
     -H 'Content-Type: application/json' \
     -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI0M2I1NTkyMzYzNWQ0NDgyOGNlYmRiNmE3NDVkOGQ1NCIsImlhdCI6MTYxMjcwNDQ5MiwiZXhwIjoxOTI4MDY0NDkyfQ.lqUZJ8VzytpnGT3ryNJmj_54cNoOO5LaVWlwAeiGB6U'

Сервер возвращает JSON с данными про сенсор:

Настройка Google Sheets

В первую очередь нужно зайти на страницу https://docs.google.com/spreadsheets/ и создать новый документ.

Стоит сразу переименовать этот документ во что-то понятное. Я назвал "electicity":

После этого нужно открыть путь меню Tools -> Script editor:

Откроется пустой проект:

И туда нужно ввести код. Вот пример кода который используется у меня:

function updateElectricity() {

  var data = [];

  var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
  var now = new Date();
  var yesterday = new Date(now.getTime() - MILLIS_PER_DAY);

  var date = Utilities.formatDate(yesterday, 'Europe/Moscow', 'yyyy-MM-dd');
  data.push(date);

  var sensors = [
    'sensor.daily_energy_boiler',
    'sensor.daily_energy_heater',
    'sensor.daily_energy_gate',
    'sensor.daily_energy_pump',
  ];

  sensors.forEach(function(sensor){
    var lastPeriod = getSensorLastPeriod(sensor)
    data.push(lastPeriod);
  });

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow(data);
}

function getSensorLastPeriod(sensor) {
  var baseUrl = 'https://EXAMPLE.COM/';
  var token = 'TOKEN';

  var url = baseUrl + 'api/states/' + sensor;

  var options = {
    'method' : 'get',
    'contentType': 'application/json',
    'headers' : {
      'authorization' : 'Bearer ' + token,
    },
  };

  var response = UrlFetchApp.fetch(url, options);
  var data = JSON.parse(response.getContentText());
  return data.attributes.last_period;
}

Совершенно обязательно вам нужно будет заменить 3 момента в этом коде:

  1. Вместо 'https://EXAMPLE.COM/' указать адрес вашего сервера HA
  2. Вместо 'TOKEN' указать ваш токен к HA
  3. Указать правильный список сенсоров (строки которые идут после 'var sensors = [')

Нажимайте на иконку с дискетой чтобы сохранить код. И сразу стоит переименовать проект:

После этого нужно нажать на кнопку Run.

Появится запрос что нужно выдать некоторые права этому коду (это происходит только при первом запуске):

Для того чтобы этот код работал ему нужен доступ к таблицам Google Sheets и нужно чтобы этот код мог обращаться ко внешним ресурсам — все логично, нужно разрешить это:

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

(Но скорее всего с первого раза это не сработает — нужно внимательно читать сообщения про ошибки и исправлять их)

После того как скрипт отработал успешно можно зайти в таблицу и увидеть что там появились данные:

Теперь можно настроить автоматическое сохранение данных. Для этого нужно зайти в раздел Triggers:

Нажать на кнопку Add Trigger и там выбрать:

После сохранения этого триггера таблица Google Sheets начнет обновляться автоматически каждый день.

Иван Бессарабов
ivan@bessarabov.ru

8 февраля 2021

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha