From fb079d3610481925f17a0822c54fc95a2a1a25f7 Mon Sep 17 00:00:00 2001 From: Friedrich Beckmann Date: Wed, 2 Sep 2026 14:10:52 +0200 Subject: update Wahlpflichtfächerliste to WiSe 2026/27 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crawl/wp.py | 94 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 24 deletions(-) (limited to 'crawl') diff --git a/crawl/wp.py b/crawl/wp.py index 55d33e0..58af945 100644 --- a/crawl/wp.py +++ b/crawl/wp.py @@ -1,46 +1,82 @@ import json from datetime import datetime -# PDF courses: (SP, Name, Dozent, SWS, CP, Turnus, shortname in WebUntis) -# Only courses with SoSe or WiSe/SoSe turnus are relevant +# PDF courses: (SP, Name, Dozent, SWS, CP, Turnus, shortname(s) in WebUntis) +# Source: 260806_WPF_TI_FKE_WiSe2026.pdf (Wahlpflichtmodule FK Elektrotechnik, WiSe 2026/27) +# Full list of all modules. The last field is either a single shortname, a list +# of shortnames (module split over several timetable entries, e.g. lecture + +# Praktikum), or None if no matching timetable entry was found. +# Existing shortnames were kept; new ones were looked up in timetables.json, +# preferring the entry that actually carries scheduled dates. PDF_COURSES = [ # Aufbau - ("Aufbau", "Praktikum Messtechnik", "Großmann", 2, 2, "SoSe", "E-MT.PR"), - # Automat./Robotik + ("Aufbau", "Elektrische Messtechnik", "Frey", 4, 5, "WiSe", "E-EMT"), + ("Aufbau", "Elektromagnetische Verträglichkeit (EMV)", "Stolle", 4, 5, "WiSe", "E-EMV"), + ("Aufbau", "Feldlehre", "Meyer", 4, 5, "WiSe", "E-ET4"), + ("Aufbau", "Messtechnik Praktikum", "Großmann", 2, 2, "SoSe", "E-MT.PR"), + # Autom./Robotik ("Autom./Robotik", "Antriebstechnik", "Meyer", 4, 5, "SoSe", "E-ANT"), - ("Autom./Robotik", "Automatisierungstechnik 1", "Zeller / Danzer", 4, 5, "WiSe/SoSe", "E-AUT.1"), - ("Autom./Robotik", "Praktikum Automatisierungstechnik", "Zeller / Danzer", 2, 2, "WiSe/SoSe", "E-AUT.PR"), + ("Autom./Robotik", "Antriebstechnik Praktikum", "Meyer", 2, 2, "WiSe", "E-ANT.PR"), + ("Autom./Robotik", "Automatisierungstechnik 1", "Zeller", 4, 5, "WiSe/SoSe", "E-AUT.1"), + ("Autom./Robotik", "Automatisierungstechnik 2", "Zeller / Danzer", 4, 5, "WiSe", "E-AUT.2"), + ("Autom./Robotik", "Automatisierungstechnik Praktikum", "Zeller", 2, 2, "WiSe/SoSe", "E-AUT.PR"), ("Autom./Robotik", "Robot Systems Engineering", "Dietrich", 4, 5, "SoSe", "E-RSE"), + ("Autom./Robotik", "Robot Systems Engineering Praktikum", "Dietrich", 2, 2, "WiSe", "E-RSE.PR"), # Elektronik ("Elektronik", "Automobilelektronik", "Schurk", 2, 2, "WiSe/SoSe", "E-%AUTOM"), ("Elektronik", "Formula Student Electric", "Markgraf", 4, 5, "WiSe/SoSe", None), ("Elektronik", "Fortgeschrittene Messtechnik", "Großmann", 4, 5, "SoSe", "E-FMT"), + ("Elektronik", "IoT - Methoden der industriellen Bildverarbeitung", "Zeuke / Steyer", 2, 2, "WiSe", "E-IOT"), + ("Elektronik", "Mikroelektronik", "Beckmann", 4, 5, "WiSe", "E-MIKEL"), ("Elektronik", "Schaltungstechnik", "Zedler", 4, 5, "WiSe/SoSe", "E-SCHT"), - ("Elektronik", "Elektrische Maschinen", "Meyer", 4, 5, "SoSe", "E-ELMA"), + ("Elektronik", "Schaltungstechnik Praktikum", "Zedler", 2, 2, "WiSe", "E-SCHT.PR"), + ("Elektronik", "System-on-Chip Design", "Beckmann", 4, 5, "WiSe", ["E-SOC", "E-SOC.PR"]), # Energietechnik + ("Energietechnik", "Elektrische Maschinen", "Meyer", 4, 5, "SoSe", "E-ELMA"), + ("Energietechnik", "Elektrische Maschinen Praktikum", "Meyer", 2, 2, "WiSe", "E-ELMA.PR"), + ("Energietechnik", "Energiespeicher", "Schwägerl", 2, 2, "WiSe", "E-ENSP"), + ("Energietechnik", "Energietechnische Anlagen", "Finkel", 4, 5, "WiSe", "E-ENAN"), ("Energietechnik", "Erneuerbare Energien", "Schwägerl", 4, 5, "SoSe", "E-EREN"), - ("Energietechnik", "Praktikum Erneuerbare Energien", "Schwägerl", 2, 2, "WiSe/SoSe", "E-EREN.PR"), + ("Energietechnik", "Erneuerbare Energien Praktikum", "Schwägerl", 2, 2, "WiSe/SoSe", "E-EREN.PR"), ("Energietechnik", "Hochspannungstechnik", "Finkel", 4, 5, "SoSe", "E-HST"), + ("Energietechnik", "Hochspannungstechnik Praktikum", "Finkel", 2, 2, "WiSe", "E-HST.PR"), ("Energietechnik", "Leistungselektronik", "Ritter", 4, 5, "SoSe", "E-LE"), + ("Energietechnik", "Leistungselektronik Praktikum", "Ritter", 2, 2, "WiSe", "E-LE.PR"), + ("Energietechnik", "Smart Grid Fundamentals", "Finkel", 2, 2, "WiSe", "E-%SGridF"), # Information - ("Information", "Eingebettete Echtzeitsysteme mit Praktikum", "Werthschulte", 4, 5, "SoSe", "E-EES"), - ("Information", "Künstliche Intelligenz: Grundlagen und Anwendungen", "Legat", 4, 5, "SoSe", None), ("Information", "Digitale Zwillinge: Grundkonzepte und Anwendungen", "Legat", 4, 5, "SoSe", "E-DIGTWIN"), + ("Information", "Edge AI – Grundlagen und Anwendungen", "Dietrich", 2, 2, "SoSe", None), + ("Information", "Eingebettete Echtzeitsysteme mit Praktikum", "Werthschulte", 4, 5, "SoSe", "E-EES"), ("Information", "Industrial Security Basics", "Hollmann", 4, 5, "SoSe", "E-IS1C5"), - ("Information", "Matlab/Simulink", "Werthschulte", 2, 2, "WiSe/SoSe", "E-MATLAB"), + ("Information", "Künstliche Intelligenz: Grundlagen und Anwendungen", "Legat", 4, 5, "WiSe", "E-KI"), + ("Information", "Matlab Simulink", "Werthschulte", 2, 2, "WiSe/SoSe", "E-%MATLAB"), + ("Information", "Smartphone und IoT-Sicherheit", "Werthschulte", 2, 2, "WiSe", "E-SEC"), # Kommunikation ("Kommunikation", "Digitale Kommunikation mit Praktikum", "Kamuf", 4, 5, "SoSe", "E-DIGK"), + ("Kommunikation", "Entwurf moderner Kommunikationssysteme mit Praktikum", "Kamuf", 4, 5, "WiSe", ["E-EMK", "E-EMK.PR"]), + ("Kommunikation", "Funksysteme", "Stolle", 4, 5, "WiSe", "E-FUSYS"), + ("Kommunikation", "Funktechnik in der Praxis", "Bögl", 2, 2, "SoSe", "E-%FUNKT"), ("Kommunikation", "Hochfrequenz-Schaltungstechnik mit Praktikum", "Stolle", 4, 5, "SoSe", "E-HFSCH"), ("Kommunikation", "Hochfrequenzsysteme mit Praktikum", "Stolle", 4, 5, "SoSe", "E-HFSYS"), - ("Kommunikation", "Funktechnik in der Praxis", "Bögl", 2, 2, "SoSe", None), # Übergreifend - ("Übergreifend", "Fertigungstechnik", "Dietrich", 4, 5, "SoSe", "E-FT"), - ("Übergreifend", "Systems Engineering", "Frommelt", 4, 5, "WiSe/SoSe", None), + ("Übergreifend", "Advanced Topics in Electrical Engineering", "Gastdozierende", 2, 2, "WiSe/SoSe", None), + ("Übergreifend", "Amateurfunk", "Stolle / Peter", 2, 2, "WiSe/SoSe", "E-%AF"), + ("Übergreifend", "Betriebsorganisation", "Zeller / Tammer", 2, 2, "WiSe", "E-%BO"), + ("Übergreifend", "Betriebswirtschaftslehre für Ingenieure", "Finkel", 2, 2, "WiSe", "E-BWL_I"), ("Übergreifend", "Elektrokonstruktion mit E-Plan", "Danzer / Voicau-Ottlik", 2, 2, "SoSe", "E-%EPLAN"), ("Übergreifend", "Elektronikproduktion", "Dietrich / Baur", 2, 2, "SoSe", "E-EP"), + ("Übergreifend", "Existenzgründung", "Adam", 2, 2, "WiSe", "E-EXIGRUE"), + ("Übergreifend", "Fertigungstechnik", "Dietrich", 4, 5, "SoSe", "E-FT"), + ("Übergreifend", "Kinematik und Kinetik", "Eckert", 4, 5, "WiSe", "E-KIN"), + ("Übergreifend", "Multiphysics Simulation", "Frey", 2, 2, "WiSe", "E-MPHY.SIM"), + ("Übergreifend", "Nachhaltiges Management industrieller Produktion", "Dietrich", 2, 2, "WiSe", "E-FTN"), + ("Übergreifend", "Optimale Produkte und Prozesse", "Frommelt", 2, 2, "WiSe", "E-OPRO"), + ("Übergreifend", "Projekt \"Technische Informatik\"", "", 2, 2, "WiSe/SoSe", None), + ("Übergreifend", "Projektseminar \"Technische Informatik\"", "", 2, 2, "WiSe/SoSe", None), + ("Übergreifend", "Ringvorlesung „Energie und Ökologie\"", "Schwägerl", 2, 2, "WiSe", "E-ENOEK"), ("Übergreifend", "Systemdenken im Produktentstehungsprozess", "Königbauer", 4, 5, "SoSe", "E-THINK"), - ("Übergreifend", "Advanced Topics in Electrical Engineering", "Gastdozierende", 2, 2, "WiSe/SoSe", None), - ("Übergreifend", "Amateurfunk", "Stolle", 2, 2, "WiSe/SoSe", None), + ("Übergreifend", "Systems Engineering", "Frommelt", 4, 5, "WiSe/SoSe", None), + ("Übergreifend", "Zeit- und Selbstmanagement", "Manhardt", 2, 2, "SoSe", "E-ZEITM"), ] DAY_NAMES = { @@ -113,15 +149,25 @@ kurse = [] no_data = [] for sp, name, dozent, sws, cp, turnus, shortname in PDF_COURSES: - semester = "WS/SS" if "WiSe/SoSe" in turnus else "SS" - - course_data = by_shortname.get(shortname) if shortname else None - - if course_data: - slots = get_slots(course_data) - merged = merge_slots(slots) + # Turnus -> Semester: WiSe/SoSe -> WS/SS, WiSe -> WS, SoSe -> SS + semester = {"WiSe/SoSe": "WS/SS", "WiSe": "WS", "SoSe": "SS"}[turnus] + + # shortname may be a single shortname, a list of shortnames, or None. + # A module can have several timetable entries (e.g. lecture + Praktikum + # under different shortnames); we collect the slots of all of them. + if shortname is None: + shortnames = [] + elif isinstance(shortname, (list, tuple)): + shortnames = list(shortname) else: - merged = [] + shortnames = [shortname] + + slots = [] + for sn in shortnames: + course_data = by_shortname.get(sn) + if course_data: + slots.extend(get_slots(course_data)) + merged = merge_slots(slots) if not merged: no_data.append(name) -- cgit v1.2.3