ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Сайт: https://raspisanie-utgt.github.io/
Статический сайт: расписание любой из 19 групп очного отделения на сегодня, завтра и неделю
с реальным временем звонков, с учётом замен и с картинкой распоряжения о замене.
При первом заходе открывается выбор группы, выбор запоминается; ссылка ?group=21-С открывает
нужную группу сразу. «Я преподаватель» — расписание преподавателя по всем группам (?teacher=).
| Файл | Источник |
|---|---|
data/groups/*.json | Расписание учебных занятий, 1 семестр 2026/2027 (PDF), все 19 групп — tools/extract_schedule.py, сверены вручную |
data/calendar.json | Календарный учебный график: каникулы, практики, сессии, праздники — tools/extract_calendar.py |
data/bells.json | Расписание звонков 2026/2027 (PDF) |
data/zameny/ | Замена уроков, обновляет scraper.py |
Недели. Расписание чередуется: 1-я / 2-я неделя. В PDF это ячейка, разделённая на две строки:
верхняя — 1-я неделя, нижняя — 2-я, предмет идёт на всю пару (у 11-А: пятница и суббота, 3-я пара).
Номер недели считается от week_anchor в расписании группы (19.10.2026 — 1-я неделя),
а если в распоряжении о замене написано «N-я неделя», берётся оттуда.
scraper.py скачивает страницу замен, находит блоки «на DD месяца YYYY года / очное отделение»
и скачивает картинки.data/zameny/<дата>.json.
Если распознавание сомнительное, сайт об этом предупреждает. Картинка показывается всегда.
Картинки бывают мелкими (≈620 точек в ширину) — тогда tesseract путает П/Д/И, 7/1, 3/5. Поэтому группу,
урок и кабинет читаем несколькими способами (разный масштаб, белое поле вокруг, «только цифры»)
и берём ответ большинства; потом сверяем с расписанием (check_with_schedule: отмена урока, которого
у группы нет, — неуверенно; спорный кабинет — по расписанию и прошлым распоряжениям).
Расхождение прочтений (меньше 60% согласны), кривая группа (на весь её блок), ячейка с текстом,
прочитанная пустой, урок вроде «1-5» — строка помечается «неуверенно», и сайт просит сверить с картинкой.
После правок распознавания: python tools/ocr_proverka.py — сравнит со всеми сохранёнными днями;
python tools/ocr_sintetika.py — нарисует таблицы «как распоряжение» и проверит, что ни одна ошибка
не проходит без пометки (на 1400 строках: ошибок ~3%, все помечены, лишних тревог ~3%).site/agenda.js в браузере накладывает замены на обычное расписание и звонки
и подсвечивает текущий и следующий урок (время московское). Дни выбираются полосой «Пн 2 · Вт 3 …»
(две недели без воскресений и «Неделя», на телефоне листается вбок и свайпом по расписанию); у предметов
свой цвет; идущую пару обходит рамка-таймер; до первой пары и на перемене сверху крупно следующая пара;
«Поделиться» под парами делает картинку дня (shareCanvas в app.js)..github/workflows/update.yml) запускается каждый час с 06:47 до 21:47 МСК
(и сразу по сигналу сторожа tools/storozh.gs), сохраняет новые замены коммитом и деплоит сайт на GitHub Pages.
Тесты в нём идут только при правках кода (push) — ежечасное обновление их не ждёт и не может ими остановиться;
тесты читают только образцы из tests/fixtures, а не живые data/ (там дни старше 21 дня удаляются).
Любая поломка — задача с меткой сбой (tools/health.py); на сайте — плашка «данные не обновлялись с …».Замены обычно выкладывают накануне, поэтому сайт хранит их за последние 21 день, и «сегодняшние» замены остаются видны, даже когда на сайте УТЖТ уже висят завтрашние.
sudo apt install tesseract-ocr tesseract-ocr-rus
pip install -r requirements.txt
python scraper.py # проверить сайт и обновить data/zameny
python scraper.py --ocr картинка.png # распознать одну картинку
python build_site.py && python -m http.server -d _site 8000
python -m pytest tests -q && node --test tests/agenda.test.js tests/calendar.test.js tests/teachers.test.js
Посмотреть любой день: index.html?group=11-А&date=2026-10-24.
Данные расписания 11-А и звонков совпадают с присланными исходными файлами (проверено программно), формат приведён к одному для сайта и консоли.
tools/semestr.py раз в час смотрит страницу «Расписания и графики» техникума:
data/next/. В data/groups/ оно переходит само в первый день каникул перед семестром
(switch_on, не раньше чем за 3 недели): сайт заранее показывает новые пары, а последние учебные дни старого
семестра остаются со старыми. Пришло позже начала семестра — включается сразу;data/calendar.json (старый год работает до 31 августа);
проверка — праздники должны встать на свои даты (значит, дни недели в графике поняты верно).Не прошло проверку — ничего не меняется, сайт работает по-старому. Обо всём — задача с меткой источник
(через data/notices.txt). Даты семестра: 1-й — с 1 сентября до конца зимних каникул, 2-й — со дня после них до
31 августа (по графику; после конца сайт пишет «нового расписания пока нет», а не показывает старое).
Ручные правки пар (data/popravki.json, поле source) относятся к своему PDF и к новому не применяются.
Номер недели продолжает чередоваться; если распоряжения покажут другой — scraper.py поправит сам.
С 20 августа (новый учебный год) сайт сам переводит запомненную группу на следующий курс (11-А → 21-А), после 4 курса — предлагает выбрать заново; бот домашки — тоже.
Звонки (data/bells.json) по-прежнему вручную: поменялся их PDF — задача от tools/sources.py.
Разобрать вручную: python tools/extract_schedule.py <pdf>, python tools/extract_calendar.py <pdf>.
tools/extract_schedule.py извлекает расписание всех 19 групп очного отделения из PDF
по сетке таблицы → data/groups/<группа>.json (+ index.json). Все группы сверены вручную
("verified": true).scraper.py сохраняет замены по всем группам: поле all_changes в data/zameny/<дата>.json.
python scraper.py --reprocess заново распознаёт уже скачанные картинки.tools/check_data.py — проверка данных: опечатки в названиях и инициалах, накладки пар,
один кабинет у двух пар, преподаватель в двух местах, странные кабинеты, сомнительные замены,
номер недели в распоряжениях. Запускается при каждой автопроверке (отчёт в логе),
явные ошибки ломают тесты. Опечатки PDF (перестановки букв, инициалы, точка после кода МДК)
extract_schedule.py исправляет сам и пишет, что исправил.data/archive/ (python tools/archive.py --show 21-С).python tools/extract_schedule.py путь/к/расписанию.pdf
tools/tg_feedback.py + .github/workflows/feedback.yml: каждые 15 минут забирает новые
сообщения из бота и создаёт по каждому задачу с меткой telegram. Явный спам (ссылки,
реклама, капслок) получает метку возможно спам, и бот такому отправителю не отвечает.
В задачу попадает только текст — без имени, @username и id чата (репозиторий публичный); телефоны,
почта и @упоминания в тексте заменяются на «[скрыто]». Если человек заблокировал бота, задача всё равно
создаётся одна (ответ «спасибо» просто не доходит).
Подключение: создать бота у @BotFather и добавить его токен в секрет репозитория
TELEGRAM_BOT_TOKEN (Settings → Secrets and variables → Actions). Без секрета запуск просто пропускается.
Ответы людям. Id чата нигде не сохраняется (только на время запуска, чтобы сразу сказать «спасибо»), поэтому позже ответить автору через бота нельзя — отвечать можно на сайте (исправить) или в новостях.
tools/extract_calendar.py — календарный учебный график (КУГ) из PDF техникума → data/calendar.json:
праздники, каникулы, сессия с экзаменами, практика, сборы — для всех 19 групп.
На сайте: строка «До каникул N дней», выходные в праздники и каникулы, отсчёт до сессии за 45 дней.tools/news.py — последние новости с utgt-pgups.ru → data/news.json, обновляется вместе с заменами;
на сайте — раскрывающийся блок «Новости техникума».Преподаватели. tools/teachers.py берёт полные ФИО из PDF «Педагогический состав» на сайте УТЖТ →
data/teachers.json. На сайте: нажать на урок — полное имя и «как обращаться».
Полезное. data/info.json — учебная часть (часы работы, телефон), ссылки (СДО, ВК), документы по курсам
(индивидуальный проект, курсовые, ВКР) и программы ГИА по специальностям. На сайте — свёрнутый блок «Полезное»
со статусом «Открыто / Обед / Закрыто, откроется …». На компьютере вместо блоков «Где преподаватель» и
«Полезное» справа плитки с иконками и живыми подписями (звонки, учебная часть, кабинеты по этажам и др.) —
каждая открывает своё окно (drawTiles и openPanel в app.js). В графике (calendar.json) для каждой группы также
специальность, курсовые работы и названия практик по условным обозначениям.
Мониторинг. tools/health.py после каждой проверки ведёт счётчик неудач подряд (data/health.json).
3 неудачи подряд (≈ 3 часа) — открывается задача с меткой «сбой», назначенная владельцу (пуш в приложении
GitHub); после первой успешной проверки она закрывается сама. Страница без замен очного отделения
(поменялась вёрстка) тоже считается сбоем.