27.04.2026: Под снегом

Почему кот по будням начинает орать примерно в 6:30 и почему не занимается этим по выходным? Наверное у него такая работа.

Утро понедельника пришло в этот мир. Кот орёт за дверью… На самом деле это мявы, но в тишине утра они воспринимаются именно как ор и мешают спать.

Эль поднялась, чтобы разогреть завтрак Эм. Я вдруг вспомнил, что сегодня должна заработать корпоративная инфраструктура, а значит было бы желательно  сделать тестовый прогон ещё до начала рабочего дня.

«Алиса, включи рабочий компьютер», — сказал я тихо.
Алиса включила какую-то песню. Громко. Зараза.
«Алиса, выключи музыку! Музыку выключи!» — командую я.
Алисе плевать. Алиса — в режиме токующего глухаря.

Ну почему у этой гадской колонки нет кнопки «вообще никогда, блин, не включать музыку»?! Музыку слушаю только в наушниках. Из колонки она бывает нужна практически никогда. Алиса для меня — голосовой интерфейс умного дома и справочная: погода, факты, быстрые вопросы, таймер, напоминалка. Но эта сволочь при любых непонятках переходит в режим: «Сейчас ты будешь хавать песенки!». Ей плевать на время суток, на мои просьбы. А где пресловутое «Запрос не понят»? А нету! Не изобрели! «Включаю песню Шоколад»! Не обляпайся.

Встал, подошёл вплотную: «Алиса, выключи музыку». Услышала. Выключила. Но сон — всё. Сон выветрился.

Спасибо разработчикам из компании скеднЯ! За многое. Но не за это!

Включаю компьютер, дожидаюсь загрузки, запускаю прогон автотестов и иду завтракать. На два часа раньше чем нужно. А так хотелось выспаться…

Через час понял, что уже не усну, не смотря на хмурую погоду и сильный снегопад. Ну зато полежал на славу.

Перед тем как встать, создал несколько артов с помощью нейронки, и обновил обложку сообщества «Антидрыщ».

Это для меня. Я там единственный подписчик и других не предвидится.

Роутер-дублёр, который несколько дней исполнял обязанности подгоревшего, лежит на тумбочке. Это непорядок. Так что сразу и убрал на хранение в фирменную коробку. Пустую коробку от нового, убрал тоже. Пусть полежит на всякий случай.

Раз уж включил режим наведения порядка, то заодно протёр пыль на комоде (где стоит 3D-принтер). Чистота — залог здоровья.

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

И конечно-же сделал первый подход приседаний. Вчера-то их вообще не делал.

Ого! И небо очистилось. Тучи разбежались, выглянуло солнце, снег начал активно таять.

Вот теперь хорошо. Теперь порядок!

Смотрю на результат прогона. То ли стартовала не вся инфраструктура, то ли «лыжи не едут». Все тесты провалились.

Зря вставал.

Начал гонять тесты локально. Ну точно дело не в лыжах. 502 Bad Gateway, однако. Подождём…

Вчера вечером обнаружил, что система синхронизации часов дала странный сбой и они перевелись на час назад.

Я понятия не имею как такое вообще возможно даже в теории. Для такого нужно было бы нажать кнопку Down (а не Up) и вместо пяти нажатий Set сделать четыре. Т.е. фантастика как она есть. Но факт остаётся фактом, часы глюканули.

Значит нужно добавить надёжности механизму перевода на минуту вперёд. Чтобы исключить проблемы хотя бы в этом месте.

Первоначальная задумка была такой:

  1. Увеличиваю время нажатия с 500 мс до 800 мс.
  2. Добавляю отклик. Т.е. после нажатия ESP32-C3 сообщит HASS, что операция выполнена успешно.
  3. В автоматизации, если ответ на нажатие не пришёл за 5 секунд, прерываем процесс нажатием кнопки Exit.
  4. Если ответ на нажатие кнопки Exit не пришёл трижды, то прерываем автоматизацию с ошибкой.
  5. Если ответ на нажатие кнопки Exit успешно получен, то ждём 50 секунд и пытаемся повторить выполнение автоматизации.

Я надеялся, что обратная связь повысит надёжность. Но на практике вышло ровно наоборот.

Больше запросов — больше шансов всё запороть.

Пошёл от обратного. Вместо передачи всей последовательности нажатий на кнопки буду передавать одну команду. А уже команда запустит макрос,  который положу в прошивку контроллера (ESP32-C3).

esphome:
  name: wallclock
  friendly_name: WallClock

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf

logger:

api:
  encryption:
    key: "тутключ="

ota:
  - platform: esphome
    password: "тутпароль"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Wallclock Fallback Hotspot"
    password: "тутдругойпароль"

captive_portal:

output:
  - platform: gpio
    pin: GPIO1
    id: output_exit
  - platform: gpio
    pin: GPIO3
    id: output_down
  - platform: gpio
    pin: GPIO4
    id: output_up
  - platform: gpio
    pin: GPIO5
    id: output_set

button:
  - platform: template
    name: "Exit (A)"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - homeassistant.event:
          event: esphome.wallclock_button_pressed
          data:
            button: "A"
  
  - platform: template
    name: "Down (B)"
    on_press:
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - homeassistant.event:
          event: esphome.wallclock_button_pressed
          data:
            button: "B"
  
  - platform: template
    name: "Up (C)"
    on_press:
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - homeassistant.event:
          event: esphome.wallclock_button_pressed
          data:
            button: "C"
  
  - platform: template
    name: "Set (D)"
    on_press:
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - homeassistant.event:
          event: esphome.wallclock_button_pressed
          data:
            button: "D"

  - platform: template
    name: "Add Minute"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Subtract Minute"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Add Hour"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Subtract Hour"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Add Day"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Subtract Day"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Add Month"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Subtract Month"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Add Year"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_up
      - delay: 800ms
      - output.turn_off: output_up
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

  - platform: template
    name: "Subtract Year"
    on_press:
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit
      - delay: 500ms
      - output.turn_on: output_set
      - delay: 800ms
      - output.turn_off: output_set
      - delay: 500ms
      - output.turn_on: output_down
      - delay: 800ms
      - output.turn_off: output_down
      - delay: 500ms
      - output.turn_on: output_exit
      - delay: 800ms
      - output.turn_off: output_exit

Получилось длинно. Но зато теперь я могу не только добавить/убавить минуту, но и час, день, месяц, год.

Определённо стало лучше. А главное, это работает.

Меж тем, инфраструктура наконец включилась. Так что поставил повторный прогон тестов. Но не всех, а только нужного мне сегмента.

Пусть собирает статистику, а я на её основе уже буду видеть что осталось актуализировать.

А сам пошёл заваривать чай. Пока ходил, всё отработало.

Если верить статистике — упало 20 тестов из 135. Но я не верю, а потому открываю Allure-отчёт.

Вот! Упало 8. И снова не верю!

Шесть кейсов действительно честно упало, но зато оставшихся два это не тесты. Это пачки тестов, которые срезались на этапе инициализации.

Так что по факту у меня тут (6 + 7) всего 13. Выписал в файл. Ими и занялся.

Как можно смержить ветку саму в себя? Не знаю, но мой напарник как-то смог. Разгребали в 4 руки. Было весело.

Заглянул в Steam. Обновлений к 7d2d не вышло. Значит вечером стримлю Хогвартс Легаси. Заодно посмотрю как себя покажет новый роутер.

В этот раз стрим получился скучным.

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

Ни себе удовольствия, ни зрителям. Поэтому после стрима засел смотреть сериальчик «Добро пожаловать в Ад, Ирума».

Там сюжет, постоянный движ, никаких превозмоганий и прочего. Возможно такими и стоит делать игры для отдыха. Хотя… Есть же аниме.

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

Введите имя

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

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

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

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