Новый 2024-й год: День 12: Пятница

Пятница! Первая рабочая пятница 2024-го года. В такой день хочется собрать все дела в кучу, скомкать и пнуть как футбольный мяч, чтобы летели далеко-далеко. Но это только в каком-нибудь аниме будет выглядеть красиво и обоснованно.

В реальности я бы не хотел так делать.

  • Во-первых, дела — вещь нужная и полезная. При том, полезная не только для меня.
  • Во-вторых, на надо «далеко-далеко». Было у меня такое в жизни. Оценил, проникся, больше не хочу.

Да и не  в делах дело. Просто хочется лениться с самого утра. Хочется, но…

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

Проблема 1: Пробрасывается почему-то только GET-запрос, хотя воспринимается как POST. В результате, имеем ограничение по количеству знаков и часть текста режется.

А так-как GET кодируется в urlecode то кириллические символы занимают ещё больше места, а текст урезается ещё больше.

Проблема 2: Если на колонке выставлена низкая громкость, то текст оповещения будет произноситься тихо.

Всё потому, что колонка работает не локально, а из облака, однако гайды в сети описывают только локальный вариант.

Итак, устанавливаю громкость колонки с Алисой в Home Assistance перед тем, как она начнёт говорить.

Добавил вот такой блок перед блоком, который отправляет текст в колонку.

service: media_player.volume_set
data:
  entity_id: media_player.yandex_station_ID_КОЛОНКИ_В_ХОУМ_АССИСТЕНТЕ
  volume_level: >-
    {% set ya_c_vol_current = state_attr('media_player.yandex_station_ID_КОЛОНКИ_В_ХОУМ_АССИСТЕНТЕ', 'volume_level') %}
    {% if ya_c_vol_current != 0.7 %} 0.7
    {% else %} 0.6
    {% endif %}

Проверяю какая громкость установлена сейчас, и если она не 0.7, то  делаю 0.7, а если 0.7 — делаю 0.6. Это нужно для того, чтобы колонка не говорила что-нибудь типа «такая громкость уже установлена». Она это делает вслух и это бесит. Бесило…

С этим вроде всё.

Теперь разбираюсь с передачей данных в webhook Home Assistance методом POST.

Во-первых, меняю блок, который проговаривает текст.

service: media_player.play_media
entity_id: media_player.yandex_station_ID_КОЛОНКИ_В_ХОУМ_АССИСТЕНТЕ
data:
  media_content_id: "{{ trigger.data.mess }}"
  media_content_type: text

Во-вторых, ковыряю функцию передачи текста.

//CURL-запрос
function curl_response($url, $mess) {
    $fields = ['mess' => $mess];
    $postvars = http_build_query($fields);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
    $result = curl_exec($ch);
    echo $result;
    curl_close($ch);
}

Теперь она выглядит так. Урл выглядит как http://IP:PORT/api/webhook/ID_ВЕБХУКА

И это работает. Однако текст по прежнему ограничен в количестве знаков.

Так вот в чём дело! Сто символов!

«…Я же говорил, что место проклятое, а ты — руки кривые, руки кривые…». © Бородатый анекдот

Ну и славно! Допилил ещё проверку на дату файла с количеством приседаний. Если он менялся не сегодня, то колонка сообщит о том, что данные не обновлялись.

Пришлось повозиться с курлом и часовым поясом, но там ничего сложного.

//Получить количество приседаний
function get_file($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FILETIME, true);
    
    $result = curl_exec($curl);
    if ($result === false) {
                //Если файл не получен
        return false;
    }
    $timestamp = curl_getinfo($curl, CURLINFO_FILETIME);
      
    if ($timestamp != -1) { //otherwise unknown
        $date_now = date("d.m.Y");
        $date_file = date("d.m.Y", $timestamp);
        if ($date_now != $date_file) {
                        //Если файл обновлялся не сегодня
            return false;
        }
    }
    curl_close($curl);
    
        //Выдаю содержимое файла
    return $result;
}

Зато теперь, если данные не обновлены, я просто зайду в ТГ-бота и кликну по команде /logs. Или присяду раз 20 и вкину количество в того же бота. А если колонка и после этого не сможет получить количество приседаний, то значит проблема на стороне сервера и нужно лезть разбираться.

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

Обед! Правда я ничего не ем, но зато отдыхаю по полной. А перекусить и потом можно будет. Позже.

Вечер. Играю в 7d2d. Увы, но в целом не продвинулся. Разве что раздобыл оружие и боеприпасы получше. Через пару игровых дней придёт орда, а значит пора уделить время и оборонительным конструкциям. Впрочем, с этим в следующий раз.

Напишите комментарий

Введите имя

Введите адрес электронной почты

Введите адрес вашего сайта

Нажмите эту кнопку, чтобы отправить комментарий.

Введите текст комментария