ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Расписание групп очного отделения УТЖТ на сегодня с учётом замен
Translation pending
EducationGitHub @raspisanie-utgtOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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); после первой успешной проверки она закрывается сама. Страница без замен очного отделения
(поменялась вёрстка) тоже считается сбоем.