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 есть сенсор "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 с данными про сенсор:
В первую очередь нужно зайти на страницу 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 момента в этом коде:
Нажимайте на иконку с дискетой чтобы сохранить код. И сразу стоит переименовать проект:
После этого нужно нажать на кнопку Run.
Появится запрос что нужно выдать некоторые права этому коду (это происходит только при первом запуске):
Для того чтобы этот код работал ему нужен доступ к таблицам Google Sheets и нужно чтобы этот код мог обращаться ко внешним ресурсам — все логично, нужно разрешить это:
В том случае если ошибок нет, то после запуска скрипта в логе будет вот такое:
(Но скорее всего с первого раза это не сработает — нужно внимательно читать сообщения про ошибки и исправлять их)
После того как скрипт отработал успешно можно зайти в таблицу и увидеть что там появились данные:
Теперь можно настроить автоматическое сохранение данных. Для этого нужно зайти в раздел Triggers:
Нажать на кнопку Add Trigger и там выбрать:
После сохранения этого триггера таблица Google Sheets начнет обновляться автоматически каждый день.
8 февраля 2021
Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha
|