14.02.2024: День влюблённых

Я уже говорил, что влюблённость — это болезнь. Много раз говорил. Любовь — это хорошо и здорово. Влюблённость — это зло, боль, страдания и почти психическое расстройство. Потенциально опасное для человека и окружающих, между прочим.

Так почему «день влюблённых» объявлен как праздник? Ответ очевиден.

Во-первых, продаванам нужно зарабатывать, а февраль в этом плане довольно провальный месяц. Вот декабрь, когда народ закупается к встрече нового года — месяц просто шикарный.

Когда работал в продажах, это была основная выручка года в моей отрасли. Сметалось даже залежавшееся.

Конец августа — первая половина сентября, тоже хороший период для продаж. Ещё неплох май и самое начало июня. Январь, конец февраля, март, немножко апрель — тоже туда-сюда. Но вот конец января и почти весь февраль — мёртвый сезон. Вот продаваны и пролоббировали праздник. Да такой, чтобы было стыдно не тратиться. Впрочем, об этом дальше.

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

Вообще, для такого поводов и не надо. Однако, с поводом даже забавнее. Повод дисциплинирует. Повод — напоминает.

Хочется повод? Получи и распишись! Ну или так, без росписи… Так что праздник прижился.

А давайте запилим «День сифилиса», «День гриппа» или вот например «День травматологии». Почему нет? Можно по быстрому сгенерировать традиции, антураж, мероприятия и т.д. Попросить какую-нибудь нейросеть и вперёд.

Ну а что? Важность травматологии трудно переоценить. Особенно сейчас. Да и продаваны от магазинов медтехники и аптек — наверняка оценят и поддержат.

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

А какие ивенты в связи с этим праздником можно проводить в школах и даже в ВУЗ’ах! Это же просто песня! Это же… целевое расходование средств, для прокачки общественно полезных навыков первой помощи. Да ещё и с элементами соревнования и даже призами!

Это! А не эти ваши дни влюблённых. Тьфу!

А поздравлять любимых можно хоть ежедневно, хоть раз в год. Это уже личное дело и, возможно, семейные традиции. Даёшь «День травматологии» в массы!

Впрочем, всё вышесказанное — это моё мнение и вообще утренний бред.

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

Ладно. Мечты — это хорошо. Мечты — лучше фантазий. Полезнее, продуктивнее и всё-такое.

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

Перерыв! Подправил вчерашний скетч.

// Пин кулера
#define CULLER_PIN 3
// Пин реле ресета
#define RESET_RELAY 4
// Пин светодиода перезагрузки
#define RESET_LED_PIN 5
// Индикация включённой отмены ресета
#define CANCEL_LED_PIN 2
// Переключатель отмены ресета
#define CANCEL_PIN 10
// Ожидание по умолчанию
#define COUNTER_START 300000
// Задержка по умолчанию
#define DELAY 20

void setup() {
  pinMode(CULLER_PIN, OUTPUT); //Пин кулера
  pinMode(RESET_RELAY, OUTPUT); //Пин реле ресета
  pinMode(RESET_LED_PIN, OUTPUT); //Пин светодиода перезагрузки
  pinMode(CANCEL_PIN, INPUT_PULLUP); //Переключатель отмены ресета
  pinMode(CANCEL_LED_PIN, OUTPUT); //Переключатель отмены ресета
  Serial.begin(9600); 
  digitalWrite(CULLER_PIN, HIGH); //Включаю кулер
  digitalWrite(RESET_RELAY, HIGH); //Включаю реле
  Serial.println("Setup complete");
}

void loop() {
  long counter = COUNTER_START; //Счётчик миллисекунд до перезагрузки
  char coller = '0';
  Serial.println("Starting loop");
  Serial.println(COUNTER_START);
  Serial.println(counter);
  while (counter >= 0) {
    cancel_led_status();
    if (Serial.available() > 0) { //Если порт доступен
      coller = (char)Serial.read();
      if (coller == '1') {
          digitalWrite(CULLER_PIN, HIGH); //Включаю кулер
          counter = COUNTER_START;
          Serial.println("Coller ON");
      }
      if (coller == '0') {
          digitalWrite(CULLER_PIN, LOW); //Выключаю кулер
          counter = COUNTER_START;
          Serial.println("Coller OFF");
      }
    }
    delay(DELAY); //Делаю задержку
    counter = counter - DELAY; //Вычитаю из счётчика время задержки
  }

  Serial.println("Reset Situation");

  if (!digitalRead(CANCEL_PIN)) {
    Serial.println("Reset activated");
    //Если мы выпали из цикла, значит сервер висит и нужно сделать ресет
    digitalWrite(RESET_RELAY, HIGH); //Размыкаю реле
    digitalWrite(RESET_LED_PIN, HIGH); //Включаю индикацию перезагрузки
    delay(15000); //Жду 15 секунд
    digitalWrite(RESET_RELAY, LOW); //Замыкаю реле
    delay(60000); //Жду минуту
    digitalWrite(RESET_LED_PIN, LOW); //Выключаю индикацию перезагрузки
  }else{
    Serial.println("Reset canceled");  
  }

}

void cancel_led_status(){
    if (!digitalRead(CANCEL_PIN)) {
      digitalWrite(CANCEL_LED_PIN, LOW);
    }else{
      digitalWrite(CANCEL_LED_PIN, HIGH);
    }
}

Теперь он нормально работает.

Забавно, но почему-то в моей плате переменная типа int отказывалась принимать значение 300 000 и уходила в минуса. Пришлось сделать тип long. Это помогло. Ну и разное по мелочи поправил, добавив вывод в порт отладочной информации.

При подключении, плата нагрелась так, что я чуть не обжог пальцы.

Радует то, что USB порт не сгорел. Вовремя я запах пластика унюхал.

Оказалось, чуть-чуть припоя (это было даже не заметно) попало между пинами. Ну и замкнуло, судя по всему. После прочистки скальпелем, плата нормально прошилась, светодиоды мигают именно так, как и ожидалось. Осталось испытать силовую часть.

Но сначала. нужно написать автоматизацию, которая будет пихать в порт ноль или единицу раз в 30 секунд.

Иначе коробочка с HASS начнёт перезагружается каждые 5 минут.

А вот так выглядит кусок конфига для HASS, куда я засунул включение/выключения кулера.

command_line:
  # Кулер на HASS
  - switch:
      name: 'Кулер на HASS'
      icon: 'mdi:mdi:fan'
      command_on: 'echo "1" > /dev/ttyUSB0'
      command_off: 'echo "0" > /dev/ttyUSB0'
      unique_id: 'fan_on_hass'

Пока тут нет условий. Просто «переключатель».

И он работает. Кулер включается и выключается, в зависимости от того, куда я его переключил.

Теперь нужна автоматизация. Она должна анализировать значение температуры процессора (такой сенсор у меня уже есть) и если температура выше 50°C, то включать кулер. Если ниже — выключать.

# Температура процессора сервера HA
- sensor:
    name: 'Температура процессора (HA)'
    command: 'cat /sys/class/thermal/thermal_zone0/temp'
    unique_id: 'ha_cpu_temperature'
    unit_of_measurement: '°C'
    value_template: '{{ value | multiply(0.001) | round(1) }}'
    scan_interval: 90

Вот кусок кода сенсора температуры процессора в той же секции command_line.

Автоматизация простая. Их, собственно, две. Тригерятся по расписанию раз в минуту (/1).

Второе условие — температура.

  • В первой автоматизации она выше 50 и тогда кулер включается.
  • Во второй — ниже 50.

Лучше было бы сделать чтобы выключался кулер при температуре ниже 45, а включался при выше 55, но тогда в интервале между этими автоматизациями в порт не уходило-бы значение 0 или 1, и тогда устройство решило бы, что нужно произвести перезагрузку.

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

Вот поэтому я и не стал делать корпус сразу. Сначала нужно убедиться, что не придётся переделывать.

Спойлер! Придётся.

За этими заботами закончился перерыв. Делаю бэкап HASS и иду работать дальше.

Вечер. Бегу за цветами и шоколадом. Ужинаем и… иду писать код на джаве.

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

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

Введите имя

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

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

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

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