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 и иду работать дальше.
Вечер. Бегу за цветами и шоколадом. Ужинаем и… иду писать код на джаве.
А всё потому, что хочу сделать крутые отчёты в Аллюре без всяких там костылей.
Напишите комментарий