Hallo liebe Gemeinde,
ich habe mal wieder gebastelt... Da beide Schulen meiner Kinder mittlerweile Webuntis zur Stundenplanverwaltung nutzen, habe ich ein rudimentäres Modul gebastelt, das die Stundenpläne ausliest und (insbesondere) Vertretungen/Entfall u.ä. darstellt. Das Modul läuft bei mir produktiv, ist aber sicher noch "early beta".
Kurzanleitung
mit
define <meinWebuntis> Webuntis
wird ein Device erstellt. Danach erstmal mit "set password" das Passwort deines Webuntis-Zugangs setzen und die Attribute server (über den du dich bei Webuntis einloggst, normalerweise sowas wie https://<griechischer Gott>.webuntis.com), school (steht auf der Login-Seite im URL-Paramter "?school=") und user (vermutlich deine EMail-Adresse) setzen.
Danach kann man mit 'get retrieveClasses' alle Schulklassen der Schule einlesen und sie sich mit 'get Classes' anzeigen lassen. Die Schulklasse deines Kindes trägst du dann im Attribut "class" ein. Ein 'get timetable' holt dann die Daten für die kommenden 7 Tage, davon sieht mal allerdings noch nicht viel...
Der komplette Stundenplan ist i.d.r. uninteressant, was interessiert sind die Abweichungen vom normalen Stundenplan, daher werden nur readings erzeugt, wenn in einem der unter "exceptionIndicators" aufgeführten Felder ein Wert steht. Als default sollten alle (meiner Meinung nach) sinnvollen Felder bereits gepflegt sein.
Wenn da zuviel unnötiger Kram kommt kann man noch bestimmte Werte über das Attribut "exceptionFilter" rausfiltern, Das Attribut erwartet space-separierte key=value Paare, wobei "key" eines der Felder aus der exceptionIndicator-Liste ist und value eine regex. Bei mir steht da z.B.:
lstext="2.HJ|1.HJ, 2.HJ"
Als Ergebnis sollte man readings e_01 - e_nn erhalten, die Abweichungen vom normalen Stundenplan enthalten. Pro Reading wieder alle enthaltenen Felder als key=value Paare. In den readings exceptionToday und exceptionTomorrow sind nochmal die Readingnamen der Exceptions für den jeweiligen Tag (also heute bzw. morgen) aufgeführt.
Zusätzlich gibt es noch eine "simpleTable" Funktion, mit der z.B. das Ergebnis in einem weblink dargestellt werden kann:
FHEM::Webuntis::simpleTable("<Webuntis Device>")
stellt alle Felder dar,
mit (beispielsweise)
FHEM::Webuntis::simpleTable("<Webuntis device>","date,startTime,su:name,te:name,code,info,substText,lstype,lstext")
werden nur die übergebenen Felder dargestellt.
Hinweis
Das Modul ist noch ziemlich neu und bestimmt nicht bugfree - vielleicht erstmal auf einem Testsystem damit spielen.
Hinweis 2
Die Erfahrung mit nur zwei Schulen zeigt, dass die Schulen Webuntis sehr unterschiedlich nutzen und die Ergebnisse und Inhalte dessen, was im Device und den Readings ankommt sehr unterschiedlich sein kann. Theoretisch kann Webuntis auch Klassenarbeiten, Hausaufgaben etc.. Ich bekomme dort aber bei keiner meiner Testschulen Ergebnisse - entweder weil sie nicht gepflegt sind, oder weil ich (über die öffentliche API) keine Berechtigung habe. Ich bin da noch am Forschen ;-)
Erfahrungen, Hinweise, Erweiterungswünsche etc... werden gerne angenommen.
Todo
* Darstellung des Ergebnisses verbessern
* Commandref überarbeiten
* Logging einbauen
* Plausi-/Syntaxprüfungen bei der Attributpflege
Updates
* 27.10.2023: Einige Bugfixes und neues Attribut "Exclude Subjects" um einzelne Fächer auszuschliessen (mich interessiert Französisch nicht, da mein Sohn Latein hat)
Top! Nutzt die Schule meiner Tochter auch. Die mobile App ist auch eher mittelmäßig.
Mal sehen, was ich da rauskriege.
Wie schnell ist denn die Api bei Ausfällen? Kommt das in Echtzeit?
Zitat von: slor am 27 Februar 2023, 08:05:12
Wie schnell ist denn die Api bei Ausfällen? Kommt das in Echtzeit?
Ich denke das kommt eher auf die Schule an, wie schnell die das pflegen ;-) Defaultmäßig ruft das Modul die Daten stündlich ab (kann über das "interval" Attribut angepasst werden).
Moin KernSani,
Super Sache, ich bin dabei. Zwei Schulen mit drei Usern. Ich werde berichten :D
Nach einem Neustart von FHEM bekomme ich diesen Fehler:no such element elementId:null, elementType:1
nach manuellen get "retrieveClasses" und "timetable" ist wieder alles schön.
Gruss
Enno
Vielen Dank für das Modul!
Das Einrichten hat erstmal geklappt. :)
Geht auch das Abfragen der Mitteilungen und der Klassenbucheinträge 8)
Zitat* Darstellung des Ergebnisses verbessern
ist damit gedacht, auch auf mehrere Readings zu verteilen? Zur Zeit sieht das bei mir so aus:
e_01 date="20230306" startTime="800" endTime="845" substText="Lesung" activityType="Unterricht" ro:longname="Klassenraum" ro:name="X3" su:longname="INFORMATIK" su:name="IT" te:longname="Einstein" te:name="AE"
Ich könnte mir das jetzt mit Userreadings umbauen, aber wenn du das schon in Planung hast, halte ich die Füsse still.
e_01_date="20230306"
e_01_startTime="800"
e_01_endTime="845"
e_01_substText="Lesung"
e_01_activityType="Unterricht"
e_01_ro:longname="Klassenraum"
e_01_ro:name="X3"
e_01_su:longname="INFORMATIK"
e_01_su:name="IT"
e_01_te:longname="Einstein"
e_01_te:name="AE"
Moinsen
Habe gerade einen Versuch gestartet und hat Prompt mein fhem-Server zum Absturz gebracht
Ich vermute "400 Bad Request" wird nicht vernünftig abgefangen und fuehrt somit zum Absturz.
Gruß
Sailor
2023.02.27 16:57:14.731 1: [UI_Webuntis] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at .//FHEM/69_Webuntis.pm line 776.
$VAR1 = '<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
';
2023.02.27 16:57:14.793 1: PERL WARNING: Use of uninitialized value $v in pattern match (m//) at FHEM/HttpUtils.pm line 663.
2023.02.27 16:57:14.794 1: PERL WARNING: Use of uninitialized value $v in concatenation (.) or string at FHEM/HttpUtils.pm line 667.
2023.02.27 16:57:14.843 1: [UI_Webuntis] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at .//FHEM/69_Webuntis.pm line 776.
$VAR1 = '<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
';
Can't use an undefined value as an ARRAY reference at .//FHEM/69_Webuntis.pm line 538.
Kann man in dem Attribut class mehrere Klassen eintragen oder ist hier vorgesehen, dass jeweils ein Device angelegt wird?
Ui, da sind ja gleich eine ganze Menge Leute dabei :-O
Zitat von: enno am 27 Februar 2023, 09:07:01
Nach einem Neustart von FHEM bekomme ich diesen Fehler:no such element elementId:null, elementType:1
nach manuellen get "retrieveClasses" und "timetable" ist wieder alles schön.
Ja, aktuell werden die Klassen nur in einem Hash vorgehalten, das wollte ich noch ändern
Zitat von: CQuadrat am 27 Februar 2023, 11:17:22
Geht auch das Abfragen der Mitteilungen und der Klassenbucheinträge 8)
Theoretisch kann ich das mit einbauen, kann es aber nicht vernünftig testen, weil da von meinen zwei Schulen nichts kommt...
Zitat von: enno am 27 Februar 2023, 13:33:58
ist damit gedacht, auch auf mehrere Readings zu verteilen? Zur Zeit sieht das bei mir so aus:
e_01 date="20230306" startTime="800" endTime="845" substText="Lesung" activityType="Unterricht" ro:longname="Klassenraum" ro:name="X3" su:longname="INFORMATIK" su:name="IT" te:longname="Einstein" te:name="AE"
Ich könnte mir das jetzt mit Userreadings umbauen, aber wenn du das schon in Planung hast, halte ich die Füsse still.
Eigentlich wollte ich nicht von einer Unmenge an Readings erschlagen werden, wenn aber der generelle Wunsch ist, das so zu machen, dann baue ich das um (oder mache es per Attribut schaltbar)
Zitat von: Sailor am 27 Februar 2023, 17:08:51
Habe gerade einen Versuch gestartet und hat Prompt mein fhem-Server zum Absturz gebracht
Ich vermute "400 Bad Request" wird nicht vernünftig abgefangen und fuehrt somit zum Absturz.
Huch, wie hast du denn das geschafft? EIgentlich wird abgefangen, wenn der BlockingCall einen Fehler zurück gibt... Schau ich mir nochmal an
Zitat von: CQuadrat am 27 Februar 2023, 17:25:54
Kann man in dem Attribut class mehrere Klassen eintragen oder ist hier vorgesehen, dass jeweils ein Device angelegt wird?
Je ein Device.
Hallo KernSani
Entwickelst Du noch weiter.
Ich komme immer noch nicht weiter was das einloggen betrifft.
2023.05.10 15:00:54.111 1: [UI_Webuntis_Leonardo] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at .//FHEM/69_Webuntis.pm line 776.
$VAR1 = '<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
';
2023.05.10 15:00:54.328 1: PERL WARNING: Use of uninitialized value $v in pattern match (m//) at FHEM/HttpUtils.pm line 682.
2023.05.10 15:00:54.328 1: PERL WARNING: Use of uninitialized value $v in concatenation (.) or string at FHEM/HttpUtils.pm line 686.
2023.05.10 15:00:55.645 1: [UI_Webuntis_Leonardo] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at .//FHEM/69_Webuntis.pm line 776.
$VAR1 = '<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
';
Can't use an undefined value as an ARRAY reference at .//FHEM/69_Webuntis.pm line 538.
Gruß
Sailor
Hallo KernSani,
unsere Schulen haben die Authentifizierung mit O365 aktiviert. Wenn man auf der Profilseite die Verknüpfung zur Mobile App aktiviert, wird ein QR Code angezeigt, darunter ein Alias-Benutzername und ein Schlüssel. Damit scheint sich die Mobile App am Webuntis Webserver zu authentifizieren (ohne den Umweg über die O365-Authentifizierung). Allerdings klappt das naheliegende leider nicht, also den angezeigten Usernamen und den Schlüssel in den Attributen Deines Moduls einzutragen. Bist Du darüber vielleicht schon gestolpert? Dr. Google zeigt ja eine Menge Doku zur Webuntis-3rd-Party API Integration an, das ist mir aber zu hoch, um durchzusteigen.
Danke & Grüße
Hi,
ich teste es gerade zum ersten Mal.
Kommt bei Server asopo.webuntis.com oder dann nur asopo rein?
Ich bekomme mit beiden Versionen einen Fehler. Auch bei School bin ich mir nicht sicher
die Url der Webseite ist : https://asopo.webuntis.com/WebUntis/?school=IGS+NAMEdesOrts#/basic/login
wie muss die school dann heißen? "IGS+NAMEdesOrts" oder "IGS NAMEdesOrts"?
Auch die E-Mail Adresse ist vorname.nachname@namederschule-gs.de
der Login auf der webuntis seite ist nur vorname.name ohne das @und dem dahinter
error
asopo.webuntis.com/WebUntis/jsonrpc.do?school=IGS+NAMEdesOrts: malformed or unsupported URL
Leider mit allen Kombinationen nur Fehler.
Nachtrag. Lösung gefunden
Aber nachdem ich die class gesetzt habe und den Timetable ziehen wollte ist fhem abgestürzt:
2023.09.21 16:58:49 1: [Webuntis] - Received invalid JSON: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\r\n<head><tit...") at ./FHEM/69_Webuntis.pm line 776.
$VAR1 = '<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
';
Can't use an undefined value as an ARRAY reference at ./FHEM/69_Webuntis.pm line 584.
Hallo zusammen,
ich bin leider ein bisschen ins Frühlings- und Sommerloch gefallen, aber jetzt da die Tage kürzer und der Regen häufiger werden, werde ich hier mal wieder ein bisschen aktiv. Ich habe im letzten halben Jahr immer mal wieder für mich ein paar kleinere Bugs gefixt (z.B. die Geschichte, dass nach einem Neustart die Klassen weg waren und der Stundenplan nicht geladen werden konnte). Die aktuelle Version hängt jetzt am ersten Post. Ich hoffe, die behebt den größten Teil der gemeldeten Fehler. Wenn nicht, bitte hier melden, dann schaue ich mir das an.
Grüße,
Oli
Da es noch Fragen zu Server, Anmeldung etc... gab.
Als Server ist der gesamte Servername anzugeben: https://<griechischer Gott>.webuntis.com
und da ein Bild mehr sagt als 1000 Worte: Das was unten in der roten Box steht ist der Schulname (da können auch url-encodete Sonderzeichen drinstehen).
Zumindest bei meiner Schule (da mittlerweile beide Kinder auf die selbe Schule gehen, habe ich nur noch eine "Testschule") wird als Login die komplette Email-Adresse verwendet (und ich habe die Auswahl zwischen Office365 und direktem Login - Office365 ist das was die Kinder verwenden, der Elternzugang ist ohne O365), das hängt aber vermutlich jeweils von der Schule ab. Da bräuchte ich dann ggf. mal per PM ein paar Details um mir das anzusehen...
Grüße,
Oli
Moin, super, dass du wieder Zeit gefunden hast.
Ich kam bis zu dem Schritt an dem ich mir die Klassennummer eingetragen habe und dann retrievetimetable gemacht habe:
Zitat2023.10.30 11:51:11 1: [KIND1Webuntis] no such element elementId:null, elementType:1
Das habe ich sowohl im Log als auch ein reading
Hi, diese Meldung kommt vom Webuntis-Server erfahrungsgemäß, wenn die Klasse nicht korrekt eingetragen wurde. Was bekommst du denn, wenn du get classes machst? Da sollte ein Popup mit drei Spalten kommen, die erste ist eine interne ID, dann kommt die Klasse, so wie sie im Attribut einegtragen werden muss nund dann noch eine Beschreibung.
Grüße,
Oli
Hi,
es sieht so aus wie im Anhang.
Ich hatte die interne ID eingetragen - das war der Fehler.
Nun habe ich exceptionCount und e_01,e_02,e_03 - muss ich mal beobachten, was ich damit machen kann.
Habe es noch nicht ganz verstanden :)
Sehr schön. Am Besten legst du dir einen Weblink an, wie oben beschrieben, dann sieht man (ein bisschen) besser, was die readings bedeuten- es sind in irgendeiner Art Abweichungen vom normalen Stundenplan. Irgendwie nutzt das aber jede Schule anders...
Super. Jetzt sehe ich schon was. Mal schauen, ob irgendwann mal was ausfällt auf das ich reagieren kann. Darum geht es mir gerade mal.
Moin,
ich häng mich hier mal dran. Einrichtung für 2 Kids hat nach ein wenig Trial&Error funktioniert. Es muss der ganze Servername rein, aber eben auch nur der Servername (wer lesen kann...) - hatte ein / am Ende und das funktionierte nicht.
Blöderweise sind grad Ferien, was die Anzahl "Exceptions" in Grenzen hält.
Danke,
Tobias
Ich habe eine Frage zum Modul. Ich kann mich einloggen, die Klassen holen aber scheitere dann an der Timetable,
Internals:
NAME Johann
NR 557
NTFY_ORDER 50-Johann
STATE ???
TYPE Webuntis
VERSION 0.2.00
eventCount 11
HTTPCookieHash:
JSESSIONID;:
Name JSESSIONID
Options Path=/WebUntis; Secure; HttpOnly; SameSite=None
Path
Value entfernt
schoolname="_aGFucy1jYXJvc3NhLSBvcw=;:
Name schoolname="_aGFucy1jYXJvc3NhLSBvcw=
Options Version=1; Max-Age=1209600; Expires=Mon, 16 Sep 2024 04:53:13 GMT; Secure; SameSite=None
Path
Value "
READINGS:
2024-09-02 06:53:13 error no such element elementId:null, elementType:1
helper:
classes <html><table><tr><td>1004</td><td>05a</td><td>Klasse 05a</td></tr><tr><td>1007</td><td>05b</td><td>Klasse 05b</td></tr><tr><td>1010</td><td>06a</td><td>Klasse 06a</td></tr><tr><td>1013</td><td>06b</td><td>Klasse 06b</td></tr><tr><td>1016</td><td>07a</td><td>Klasse 07a</td></tr><tr><td>1019</td><td>07b</td><td>Klasse 07b</td></tr><tr><td>1022</td><td>07c - bili</td><td>Klasse 07c - bili</td></tr><tr><td>1025</td><td>07d</td><td>Klasse 07d</td></tr><tr><td>1028</td><td>07e</td><td>Klasse 07e</td></tr><tr><td>1031</td><td>07f</td><td>Klasse 07f</td></tr><tr><td>1034</td><td>08a</td><td>Klasse 08a</td></tr><tr><td>1037</td><td>08b</td><td>Klasse 08b</td></tr><tr><td>1040</td><td>08c - bili</td><td>Klasse 08c - bili</td></tr><tr><td>1043</td><td>08d</td><td>Klasse 08d</td></tr><tr><td>1046</td><td>08e</td><td>Klasse 08e</td></tr><tr><td>1049</td><td>08f</td><td>Klasse 08f</td></tr><tr><td>1052</td><td>09a</td><td>Klasse 09a</td></tr><tr><td>1055</td><td>09b</td><td>Klasse 09b</td></tr><tr><td>1058</td><td>09c</td><td>Klasse 09c</td></tr><tr><td>1061</td><td>09d</td><td>Klasse 09d</td></tr><tr><td>1064</td><td>09e</td><td>Klasse 09e</td></tr><tr><td>1067</td><td>09f</td><td>Klasse 09f</td></tr><tr><td>1070</td><td>10a</td><td>Klasse 10a</td></tr><tr><td>1073</td><td>10b</td><td>Klasse 10b</td></tr><tr><td>1076</td><td>10c - bili</td><td>Klasse 10c - bili</td></tr><tr><td>1079</td><td>10d</td><td>Klasse 10d</td></tr><tr><td>1082</td><td>10e</td><td>Klasse 10e</td></tr><tr><td>1085</td><td>10f</td><td>Klasse 10f</td></tr><tr><td>1088</td><td>AMb</td><td>AMb</td></tr><tr><td>1091</td><td>Abi 2025</td><td>Klasse 12</td></tr><tr><td>1094</td><td>Abi 2026</td><td>Klasse 11</td></tr><tr><td>1097</td><td>Ausland</td><td>Ausland</td></tr><tr><td>1100</td><td>Präsenz 1</td><td>Präsenz 1</td></tr><tr><td>1103</td><td>Präsenz 2</td><td>Präsenz 2</td></tr><tr><td>1106</td><td>SLK I</td><td>SLK I</td></tr><tr><td>1109</td><td>SLK II</td><td>SLK II</td></tr></table></html>
cookies JSESSIONID=entfernt; schoolname="_aGFucy1jYXJvc3NhLSBvcw=="
classMap:
05a 1004
05b 1007
06a 1010
06b 1013
07a 1016
07b 1019
07c - bili 1022
07d 1025
07e 1028
07f 1031
08a 1034
08b 1037
08c - bili 1040
08d 1043
08e 1046
08f 1049
09a 1052
09b 1055
09c 1058
09d 1061
09e 1064
09f 1067
10a 1070
10b 1073
10c - bili 1076
10d 1079
10e 1082
10f 1085
AMb 1088
Abi 2025 1091
Abi 2026 1094
Ausland 1097
Präsenz 1 1100
Präsenz 2 1103
SLK I 1106
SLK II 1109
Attributes:
class 1094
exceptionIndicator code,info,lstext,lstype,substText
school Hans-Carossa-+OS
server https://klio.webuntis.com
user johann.weggelassen
verbose 0
Beim Suchen im Code bin ich auf Zeile 489 gestoßen in der Hoffnung, dass dort das Problem liegt. Also habe ich da hinzugefügt:
489 [neu] Log3 ( $name, "debug", "hash ".Dumper(\$hash)); ##debug
Die Ausgabe des hash liefert bei mir
debug: hash $VAR1 = \{
'VERSION' => '0.2.00',
'eventCount' => 10,
'.attrminint' => [],
'FUUID' => '66c5cc90-f33f-1115-b393-982de02d038d976f',
'NAME' => 'Johann',
'helper' => {
'classes' => "<html><table><tr><td>1004</td><td>05a</td><td>Klasse 05a</td></tr><tr><td>1007</td><td>05b</td><td>Klasse 05b</td></tr><tr><td>1010</td><td>06a</td><td>Klasse 06a</td></tr><tr><td>1013</td><td>06b</td><td>Klasse 06b</td></tr><tr><td>1016</td><td>07a</td><td>Klasse 07a</td></tr><tr><td>1019</td><td>07b</td><td>Klasse 07b</td></tr><tr><td>1022</td><td>07c - bili</td><td>Klasse 07c - bili</td></tr><tr><td>1025</td><td>07d</td><td>Klasse 07d</td></tr><tr><td>1028</td><td>07e</td><td>Klasse 07e</td></tr><tr><td>1031</td><td>07f</td><td>Klasse 07f</td></tr><tr><td>1034</td><td>08a</td><td>Klasse 08a</td></tr><tr><td>1037</td><td>08b</td><td>Klasse 08b</td></tr><tr><td>1040</td><td>08c - bili</td><td>Klasse 08c - bili</td></tr><tr><td>1043</td><td>08d</td><td>Klasse 08d</td></tr><tr><td>1046</td><td>08e</td><td>Klasse 08e</td></tr><tr><td>1049</td><td>08f</td><td>Klasse 08f</td></tr><tr><td>1052</td><td>09a</td><td>Klasse 09a</td></tr><tr><td>1055</td><td>09b</td><td>Klasse 09b</td></tr><tr><td>1058</td><td>09c</td><td>Klasse 09c</td></tr><tr><td>1061</td><td>09d</td><td>Klasse 09d</td></tr><tr><td>1064</td><td>09e</td><td>Klasse 09e</td></tr><tr><td>1067</td><td>09f</td><td>Klasse 09f</td></tr><tr><td>1070</td><td>10a</td><td>Klasse 10a</td></tr><tr><td>1073</td><td>10b</td><td>Klasse 10b</td></tr><tr><td>1076</td><td>10c - bili</td><td>Klasse 10c - bili</td></tr><tr><td>1079</td><td>10d</td><td>Klasse 10d</td></tr><tr><td>1082</td><td>10e</td><td>Klasse 10e</td></tr><tr><td>1085</td><td>10f</td><td>Klasse 10f</td></tr><tr><td>1088</td><td>AMb</td><td>AMb</td></tr><tr><td>1091</td><td>Abi 2025</td><td>Klasse 12</td></tr><tr><td>1094</td><td>Abi 2026</td><td>Klasse 11</td></tr><tr><td>1097</td><td>Ausland</td><td>Ausland</td></tr><tr><td>1100</td><td>Pr\x{c3}\x{a4}senz 1</td><td>Pr\x{c3}\x{a4}senz 1</td></tr><tr><td>1103</td><td>Pr\x{c3}\x{a4}senz 2</td><td>Pr\x{c3}\x{a4}senz 2</td></tr><tr><td>1106</td><td>SLK I</td><td>SLK I</td></tr><tr><td>1109</td><td>SLK II</td><td>SLK II</td></tr></table></html>",
'classMap' => {
'07f' => 1031,
'07e' => 1028,
'07b' => 1019,
'10c - bili' => 1076,
'10d' => 1079,
'08a' => 1034,
'09c' => 1058,
'08e' => 1046,
"Pr\x{c3}\x{a4}senz 2" => 1103,
'08f' => 1049,
'09d' => 1061,
'07a' => 1016,
'SLK II' => 1109,
'SLK I' => 1106,
'Ausland' => 1097,
'08b' => 1037,
"Pr\x{c3}\x{a4}senz 1" => 1100,
'09e' => 1064,
'05b' => 1007,
'06b' => 1013,
'10a' => 1070,
'08d' => 1043,
'08c - bili' => 1040,
'09f' => 1067,
'Abi 2025' => 1091,
'09b' => 1055,
'06a' => 1010,
'AMb' => 1088,
'05a' => 1004,
'07c - bili' => 1022,
'07d' => 1025,
'Abi 2026' => 1094,
'10b' => 1073,
'10e' => 1082,
'09a' => 1052,
'10f' => 1085
},
'cookies' => 'JSESSIONID=entfernt; schoolname="_aGFucy1jYXJvc3NhLSBvcw=="',
'cmdQueue' => [],
'passObj' => bless( {
'TYPE' => 'Webuntis'
}, 'FHEM::Core::Authentication::Passwords' )
},
'HTTPCookieHash' => {
'JSESSIONID;' => {
'Path' => '',
'Name' => 'JSESSIONID',
'Options' => 'Path=/WebUntis; Secure; HttpOnly; SameSite=None',
'Value' => 'entfernt'
},
'schoolname="_aGFucy1jYXJvc3NhLSBvcw=;' => {
'Options' => 'Version=1; Max-Age=1209600; Expires=Mon, 16 Sep 2024 04:53:13 GMT; Secure; SameSite=None',
'Value' => '"',
'Path' => '',
'Name' => 'schoolname="_aGFucy1jYXJvc3NhLSBvcw='
}
},
'NR' => 557,
'TYPE' => 'Webuntis',
'.attraggr' => [],
'.FhemMetaInternals' => 1,
'READINGS' => {
'error' => {
'TIME' => '2024-09-02 06:36:44',
'VAL' => 'no such element elementId:null, elementType:1'
}
},
'STATE' => '???',
'NTFY_ORDER' => '50-Johann'
};
Hat jemand eine Idee, wo ich weitersuchen kann?
PS Beim Webaufruf scheint es an dieser Stelle nicht zu gelingen, die elementID zu übermitteln (wenn ich das richtig interpretiere)
https://api-client.sleekplan.com/public/v1/feedback/980803070/sessions/ping?session=%7B%22init%22%3A%222024-08-21T11%3entfernt%22init_storage%22%3A%222024-09-02T05%3A07%3entferntZ%22%2C%22referrer%22%3A%22https%3A%2F%2Fklio.webuntis.com%2Ftimetable-students-my%2F__%22%7D&user=%7B%22user_id%22%3entfernt%2C%22user_token%22%3A%entfernt%22%7D&settings=&callback=jsonp_callback_6415
/public/v1/feedback/980803070/sessions/ping?session=%7B%22init%22%3A%222024-08-21T11%3A21%3entferntZ%22%2C%22init_storage%22%3A%222024-09-02T05%3A07%3A05.833Z%22%2C%22referrer%22%3A%22https%3A%2F%2Fklio.webuntis.com%2Ftimetable-students-my%2F__%22%7D&user=%7B%22user_id%22%3entfernt%2C%22user_token%22%3A%entfernt%22%7D&settings=&callback=jsonp_callback_6415
https://klio.webuntis.com/WebUntis/api/public/timetable/weekly/data?elementType=5&elementId=3139&date=2024-09-02&formatId=3
"Fehler" gefunden, der saß vor dem Bildschirm (und im Nachhinein lese ich, dass das schon mal vorkam, peinlich). Man gibt als class nicht die interne ID ein, sondern den String, der in der Datenbank hinterlegt ist. In meinem Fall also nicht 1094, sondern "Abi 2026".
Ein herzerfrischendes "Moin" vom achtern Diek vorweg.
Kann mir Jemand nochmals in Erinnerung rufen, welche Settings Serverseitig (Schulseitig) vorgenommen werden müssen, damit man Zugriff zu den Daten von WebUntis über dieses Modul hat?
Dann wende ich mich damit an den Administrator der Schule.
Danke
Gruss
Sailor
class Abi 2026
exceptionIndicator code,info,lstext,lstype,substText
school WieImmerDieHeisst
server https://klio.webuntis.com
user vorname.nachname
Guten Tag, danke für das Modul. Ich habe da ein altes Problem von mir lösen wollen (siehe hier (https://forum.fhem.de/index.php?topic=93217.45)) und einfach das Modul fortgeschrieben. Es erzeugt jetzt eine iCal-Datei, die die exceptions erhält. Da das sehr spezifisch für mich ist, hier eine Erläuterung meiner Änderungen, die muss sicher jeder anpassen:
- Es gibt eine neue Funktion sub writeICal, Zeile 789. Die schreibt die iCal (danke an Dr. Chat GPT).
- Diese Funktion wird in getTT automatisch aufgerufen, Zeile 527
- Die iCal wird das Verzeichnis FHEM-Verzeichnis-"www/tablet/".$name."_ical.ics" geschrieben, Zeile 843. Das muss sicher jeder für sich entscheiden, wie er das macht.
- Ich hole nur die exceptions der letzten beiden Tage, siehe Zeile 805ff.
Was ich gern noch hätte wäre, nicht nur die exceptions, sondern auch den ganzen Stundenplan auszulesen. Leider gelingt mir das nicht, obwohl die Daten anscheinend in der Modul gelesen werden können. Wenn jemand da einen Tipp hat, bin ich dankbar.
Mein Sohn hat in Google Kalender einen Link zu dieser iCal und liest die daten aus seinem Kalender aus. Die haben handy-Verbot in der schule, zur Erläuterung, und er wollte das so.
Hallo andies
Zitat von: andies am 25 September 2024, 11:01:35Guten Tag, danke für das Modul. Ich habe da ein altes Problem von mir lösen wollen (siehe hier (https://forum.fhem.de/index.php?topic=93217.45)) und einfach das Modul fortgeschrieben. Es erzeugt jetzt eine iCal-Datei, die die exceptions erhält. Da das sehr spezifisch für mich ist, hier eine Erläuterung meiner Änderungen, die muss sicher jeder anpassen:
- Es gibt eine neue Funktion sub writeICal, Zeile 789. Die schreibt die iCal (danke an Dr. Chat GPT).
- Diese Funktion wird in getTT automatisch aufgerufen, Zeile 527
- Die iCal wird das Verzeichnis FHEM-Verzeichnis-"www/tablet/".$name."_ical.ics" geschrieben, Zeile 843. Das muss sicher jeder für sich entscheiden, wie er das macht.
- Ich hole nur die exceptions der letzten beiden Tage, siehe Zeile 805ff.
Was ich gern noch hätte wäre, nicht nur die exceptions, sondern auch den ganzen Stundenplan auszulesen. Leider gelingt mir das nicht, obwohl die Daten anscheinend in der Modul gelesen werden können. Wenn jemand da einen Tipp hat, bin ich dankbar.
Danke für dein Update, aber leider bekomme ich auch nur die exceptions aber eine iCal - Datei erstellt sich leider auch nicht im /opt/fhem/www/tablet - Verzeichnis
Hat es irgendjemand geschafft den gesamten Stundenplan herunterzuladen?
Wenn ja, wie?
Gruß
Sailor
Also das mit dem Erstellen in dem Verzeichnis habe ich so gemacht, dass ich dort zuerst eine (leere) Datei angelegt und mit entsprechenden Rechten versehen habe - die wird dann überschrieben. Direkt schreiben ging bei mir auch nicht.
Was die exceptions angeht, müssten wir eigentlich beim Modulautor nachfragen. Ich sehe im Code, Zeile 732 den Code
#Log3 $name, LOG_ERROR, $html;
$hash->{helper}{timetable} = $html;
Wenn man den Log3 auskommentiert, erscheint der gesamte Stundenplan. Das wäre was zum ansetzen. Dazu müsste ich aber verstehen, wozu das so definiert wurde und warum.
Hallo andies
Zitat von: andies am 27 September 2024, 20:11:17Also das mit dem Erstellen in dem Verzeichnis habe ich so gemacht, dass ich dort zuerst eine (leere) Datei angelegt und mit entsprechenden Rechten versehen habe - die wird dann überschrieben. Direkt schreiben ging bei mir auch nicht.
OK, Danke - Hat geklappt.
Jetzt habe ich zwar ein mir unbekanntes Gymnasium ;D drin aber immerhin:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Hans Carossa Gymnasium//Google Calendar//DE
END:VCALENDAR
Zitat von: andies am 27 September 2024, 20:11:17Was die exceptions angeht, müssten wir eigentlich beim Modulautor nachfragen. Ich sehe im Code, Zeile 732 den Code
#Log3 $name, LOG_ERROR, $html;
Wenn man den Log3 auskommentiert, erscheint der gesamte Stundenplan. Das wäre was zum ansetzen. Dazu müsste ich aber verstehen, wozu das so definiert wurde und warum.
Auhauerha, das ist ja noch ganz roh ein JSON-String...
<Erbsenscheißerei> Muss übrigens nicht "Log3 auskommentiert" sondern "Log3 unkommentiert" heißen.</Erbsenscheißerei>
Also wenn der Winter naht, dann kann ich das Modul ja mal umstricken.
Mit JSON-Strings kenne ich mich ja nun zu genüge aus.
Werde mal KernSani fragen, ob er meinen Code gebrauchen kann.
Gruß
Sailor
Moin tosammen
So, habe mal etwas rumgestrickt...
Mit der neuen Version aufbauend auf andies Version gibt es ab jetzt ein neues Attribut: iCalPath
Dies bitte mit einem existierenden Pfad verwenden -
Beispiel1: /opt/fhem/calendar
Beispiel2: /opt/fhem/calendar/
Beispiel3: calendar
Beispiel4: calendar/
Dann
get ... timetable
set ... export
Dann sollte eigentlich im genannten Pfad eine ics-Datei erstellt/überschrieben werden.
Mit der Bitte um Rückmeldung.
Gruß
Sailor
Das sieht schon mal richtig gut aus. Zeichensetzung ist noch ein Problem, das kann man aber händisch ändern. Und meinen alten Code kannst du ja entfernen, der ist jetzt obsolet. Ein Problem gibt es noch. In der Q1/Q2 sind die Klassen riesig groß (siehe Anhang) und da wäre es gut, wenn man das Attribut
attr <name> excludeSubjects GE_LK_1,GEO_LK_1...
nutzen kann. Ich schaue gleich mal, wo das sinnvoll wäre.
PS Geht das eventuell so:
Zeile 991+
my @exSu = split( $COMMA, AttrVal( $name, "excludeSubjects", $EMPTY ) );
Zeile 1005+
if ($TTHashcontent->{su}[0]{name} && grep(/$TTHashcontent->{su}[0]{name}/,@exSu)) {
next;
}
Ich kriege da aber einen fehlerhaften iCal, also so einfach geht das nicht.
Jetzt läuft es bei mir, allerdings mit zwei weiteren Änderungen:
Zeile 959 (ca)
my $TTTeacher = $TTHashcontent->{te}[0]{longname} || 'NN ';
und
Zeile 963 (ca)
my $CalInfo = " Klasse: " . $TTClass . "\\n" . " Unterricht: " . $TTSubject . "\\n" . " Ort: " . $TTLocation . "\\n" . " Lehrkoerper: " . $TTTeacher;
(die Umlaute bei **Lehrkörper** kamen bei mir nicht richtig durch, ich sitze am Mac). Ich habe bei mir auch die Klasse entfernt, weil ja mein Sohn weiß, in welcher er ist.
Hi andie
Zitat von: andies am 01 Oktober 2024, 20:59:13Jetzt läuft es bei mir, allerdings mit zwei weiteren Änderungen:
Zeile 959 (ca)
my $TTTeacher = $TTHashcontent->{te}[0]{longname} || 'NN ';
Ist bei mir Zeile 1008 und jetzt sieht der Block so aus:
my $TTClass = Encode::decode( 'iso-8859-1', $TTHashcontent->{kl}[0]{longname}) || 'NN ';
my $TTSubject = Encode::decode( 'iso-8859-1', $TTHashcontent->{su}[0]{longname}) || 'NN ';
my $TTTeacher = Encode::decode( 'iso-8859-1', $TTHashcontent->{te}[0]{longname}) || 'NN ';
my $TTLocation = Encode::decode( 'iso-8859-1', $TTHashcontent->{ro}[0]{longname}) || 'NN ';
Zitat von: andies am 01 Oktober 2024, 20:59:13und
Zeile 963 (ca)
my $CalInfo = " Klasse: " . $TTClass . "\\n" . " Unterricht: " . $TTSubject . "\\n" . " Ort: " . $TTLocation . "\\n" . " Lehrkoerper: " . $TTTeacher;
(die Umlaute bei **Lehrkörper** kamen bei mir nicht richtig durch, ich sitze am Mac). Ich habe bei mir auch die Klasse entfernt, weil ja mein Sohn weiß, in welcher er ist.
Der Lehrkörper heißt jetzt Lehrkraft.
Verfluchter Gender-Wahn!
;D
Gruß
Sailor
Hallo andie
Zitat von: andies am 01 Oktober 2024, 20:59:13(die Umlaute bei **Lehrkörper** kamen bei mir nicht richtig durch, ich sitze am Mac). Ich habe bei mir auch die Klasse entfernt, weil ja mein Sohn weiß, in welcher er ist.
Das mit den Umlauten habe ich durch den Einsatz von "
Encode::decode( 'iso-8859-1'," hoffentlich in den Griff bekommen.
Das mit der Klasse ist so eine Sache. Ich habe 2 Kinder auf der gleichen Schule und darüber hinaus haben die in der schule eine Eigenart die Klassenzuteilung zu den Unterrichten zu machen.
Gruß
Sailor
Moin tosammen
Letzter Stand:
- Alten Code entfernt.
- Inaktives Attribut "interval" richtig implementiert.
- "set ... export" wieder gelöscht. wird jetzt automatisch mit "get ... timetable" getriggert.
- Problem mit Umlauten hoffentlich gelöst.
Gruß
Sailor
Moin zusammen,
ich würde gerne mittesten, aber ich bekomme nur den Error "No JSON after Login". Kann das an Sonderzeichen im Password oder Umlaute im Schulnamen liegen?
define Webuntis_JM Webuntis
attr Webuntis_JM exceptionIndicator code,info,lstext,lstype,substText
attr Webuntis_JM iCalPath /opt/fhem4/calendar/
attr Webuntis_JM room Schule
attr Webuntis_JM school Elsa-Brändström-Schule
attr Webuntis_JM server https://peleus.webuntis.com/
attr Webuntis_JM user enno
attr Webuntis_JM verbose 2
# FUUID 66fc4ab1-f33f-8a87-4488-90e3d54060a38398
# NAME Webuntis_JM
# NR 46
# NTFY_ORDER 50-Webuntis_JM
# STATE ???
# TYPE Webuntis
# VERSION 0.2.01
# eventCount 4
# READINGS:
# 2024-10-02 12:47:11 error No JSON after Login
# helper:
#
setstate Webuntis_JM 2024-10-02 12:47:11 error No JSON after Login
Gruss
Enno
Am Password nicht. Bist du dir sicher, dass du den Schulnamen richtig hast? Umlaute und Bindestriche etc. regeln die ja so. Kommst du auf die Webseite?
Über die Webseite kann ich mich anmelden. Mit dem Modul ging es auch schon mal... Ich habe oben mal ein List ergänzt.
Also bei mir ist ein Leerzeichen in der Schule und das sieht so aus:
school Hans-Carossa-+OS
Da ist sicher der Haken. Ich habe nur vergessen, wie ich den Namen der Schule herausgefunden habe. Das war auch über die Webseite, ich habe in den JSON gesucht.
wenn man in der Webmaske eingibt, sieht man mE die Links, zB
https://borys.webuntis.com/WebUntis/?school=EBS+Elmshorn
oder
https://nessa.webuntis.com/WebUntis/?school=elsa-brandstr%C3%B6m-rs
das wäre bei mir: https://peleus.webuntis.com/WebUntis/?school=Elsa-Br%C3%A4ndstr%C3%B6m-Schule dann versuche ich mal mein Glück damit.
Edit: Damit hat es geklappt! Ich bin wieder dabei ;D
Moin enno
Zitat von: enno am 02 Oktober 2024, 13:19:31das wäre bei mir: https://peleus.webuntis.com/WebUntis/?school=Elsa-Br%C3%A4ndstr%C3%B6m-Schule dann versuche ich mal mein Glück damit.
Edit: Damit hat es geklappt! Ich bin wieder dabei ;D
Immer diese Lehrer auf Selbstverwirklichungs-Trip mit Umlauten...
Gruß
Sailor
Moin Sailor,
für die Kinder bin ich jetzt drin. Aber wo du gerade über Lehrer her ziehst ;) Ich habe so ein Exemplar hier. Dort wird die Anmeldung bei Untis im Web über SSO gelöst. Gibt es da eine Chance? Ich muss mich dazu bei einer Portalseite einloggen und werde von dort an Untis zurückgeleitet....
Gruss
Enno
Zitat von: Sailor am 02 Oktober 2024, 11:41:32Moin tosammen
Letzter Stand:
- Alten Code entfernt.
- Inaktives Attribut "interval" richtig implementiert.
- "set ... export" wieder gelöscht. wird jetzt automatisch mit "get ... timetable" getriggert.
- Problem mit Umlauten hoffentlich gelöst.
Gruß
Sailor
Hi Sailor,
habs noch nicht getestet, aber mal kurz reingeschaut.
exportTT2iCal($hash);
Das solltest du besser am Ende von parseTT aufrufen (vor dem return z.B.).
Hintergrund ist, das parseTT die Callback-Funktion des Non-Blocking HTTP Aufrufs ist. Erst dann sind die Daten im hash TT aktualisiert.
in Zeile 694 muss es
$html[b]Row[/b] .= $t->{$f}[0]{name};
anstatt
$html .= $t->{$f}[0]{name};
heißen. War schon vorher da und hat keine Auswirkung, da die html-Darstellung nicht benutzt wird.
Was macht ihr mit der iCal Datei - also welcher use-Case ist das dann?
Danke und Gruß,
Tobias
Mein Sohn lädt sich die Datei in Google Calendar, er will Untis nicht nutzen. Er hat noch andere Termine (Sport, Freunde und so) und die hat er im Kalender.
Usecase: Wir haben in der Küche ein Display das die wichtigsten Daten aus Fhem (Floorplan) anzeigt. Fenster offen, Heizung, Luftfeuchtigkeit, Rollos, Spotify, etc. Dort haben wir auch den Familienkalender (Nextcloud), der auch auf den Handys genutzt wird, angezeigt. Jetzt werden dort die aktuellen Stundenpläne der Kinder aus Untis mit einem Readingsgroup angezeigt. Das spart uns das Nachschauen in der App, ob es Entfall oder Verschiebungen gibt.
Kann es sein, dass in Zeile 159 interval fehlt:
my @WUattr = ( "server", "school", "user", "class", "exceptionIndicator", "exceptionFilter:textField-long", "excludeSubjects", "iCalPath", "interval" );
==hier==
Moin zusammen,
vielleicht kann mir jemand helfen. Ich bekomme einfach keinen Login über das Modul hin:
Log mit Verbose 5:
2024.10.03 12:51:43 4: [myWebUntis] Processing Queue: login
2024.10.03 12:51:43 4: password Keystore handle for Device (myWebUntis) - Read password from file
2024.10.03 12:51:43 4: myWebUntis: GetCookies parsed Cookie: JSESSIONID Wert 79F861FE5BF486A39EC831BEF903EA3E Rest Path=/WebUntis; Secure; HttpOnly; SameSite=None
2024.10.03 12:51:43 4: myWebUntis: GetCookies parsed Cookie: schoolname="_Z3ltLXNjaHdhcnplbmJlaw= Wert " Rest Version=1; Max-Age=1209600; Expires=Thu, 17 Oct 2024 10:51:43 GMT; Secure; SameSite=None
2024.10.03 12:51:43 4: myWebUntis: GetCookies parsed Cookie: Tenant-Id Wert "4775900" Rest Expires=Thu, 17 Oct 2024 10:51:43 GMT; Secure; SameSite=None
2024.10.03 12:51:43 4: [myWebUntis] Processing Queue: getClass
2024.10.03 12:51:43 1: [myWebUntis] not authenticated
Vielleicht hat ja jemand noch eine Idee, woran es hakt. Das Anmelden über die Website geht ohne Probleme.
Im Webuntis finde ich einen QR-Code mit folgendem Inhalt:
Schulnummer: 4775900
Schule: gym-schwarzenbek
Url: mese.webuntis.com
Benutzer: Schülerin
Schlüssel: FXYZRQPHIXZPQQIF
Das PW der Schule ist Gymnasium#1
Danke
Moin
Versuch es mal damit:
school: gym-schwarzenbek
server: https://mese.webuntis.com
user: Schülerin
Mit set Password setzen : Gymnasium#1
Das sind leider genau die Einstellungen, mit denen es nicht geht:
Internals:
CFGFN
FUUID 66fe7509-f33f-2a34-06b8-796e79a0400bb584
NAME myWebUntis
NR 620
NTFY_ORDER 50-myWebUntis
STATE ???
TYPE Webuntis
VERSION 0.2.01
eventCount 6
HTTPCookieHash:
JSESSIONID;:
Name JSESSIONID
Options Path=/WebUntis; Secure; HttpOnly; SameSite=None
Path
Value 79F861FE5BF486A39EC831BEF903EA3E
Tenant-Id;:
Name Tenant-Id
Options Expires=Thu, 17 Oct 2024 10:51:43 GMT; Secure; SameSite=None
Path
Value "4775900"
schoolname="_Z3ltLXNjaHdhcnplbmJlaw=;:
Name schoolname="_Z3ltLXNjaHdhcnplbmJlaw=
Options Version=1; Max-Age=1209600; Expires=Thu, 17 Oct 2024 10:51:43 GMT; Secure; SameSite=None
Path
Value "
READINGS:
2024-10-03 12:51:43 error not authenticated
helper:
cookies JSESSIONID=79F861FE5BF486A39EC831BEF903EA3E; Tenant-Id="4775900"; schoolname="_Z3ltLXNjaHdhcnplbmJlaw=="
Attributes:
exceptionIndicator code,info,lstext,lstype,substText
school gym-schwarzenbek
server https://mese.webuntis.com
user Schülerin
Ich vermute mal, dass da irgendwas serverseitig gesperrt ist. :(
Ich habe noch zwei Ideen. Einmal möchten wir zwei Wochen holen, das geschieht derzeit fest verdrahtet in
Zeile 486 ( $s, $mi, $h, $d, $m, $y ) = localtime( ( time + 7 * 24 * 60 * 60 ) );
Eventuell bietet es sich an, dass man da ein weiteres Attribut setzt (btw: Wer maintained jetzt eigentlich das Modul?). In Zeile 622 findet das gleiche noch einmal für die exceptions statt.
Der Code für Ausfall ist im Modul (Zeile 757) "Entfall", bei uns "f.a.". Jetzt werden die Änderungen so umfangreich, dass wir das m.E. nicht mehr durch ein allgemeines Modul hinbekommen. Ich befürchte, jeder muss hier selbst programmieren?!
Zitat von: andies am 02 Oktober 2024, 22:18:52Mein Sohn lädt sich die Datei in Google Calendar, er will Untis nicht nutzen. Er hat noch andere Termine (Sport, Freunde und so) und die hat er im Kalender.
Ja, ok. Aber dann muss er sich doch immer (täglich) die iCal ziehen?
Zitat von: enno am 03 Oktober 2024, 09:11:59Usecase: Wir haben in der Küche ein Display das die wichtigsten Daten aus Fhem (Floorplan) anzeigt. Fenster offen, Heizung, Luftfeuchtigkeit, Rollos, Spotify, etc. Dort haben wir auch den Familienkalender (Nextcloud), der auch auf den Handys genutzt wird, angezeigt. Jetzt werden dort die aktuellen Stundenpläne der Kinder aus Untis mit einem Readingsgroup angezeigt. Das spart uns das Nachschauen in der App, ob es Entfall oder Verschiebungen gibt.
Das ist auch mein Use Case - für beide Kinder. Das Tablett im Flur zeigt dann allerdings nur die Änderungen am regulären Stundenplan an. Die bezieht das Modul ja auch ohne iCal.
Mit einem notify und eine Funktion in 99_myUtils schreibe ich mir readings, die wie in einem Calender-Device benannt sind. z.B.
e__Count | 2 | 2024-10-03 14:53:59 |
e__Count_Tot | 2 | 2024-10-03 14:53:59 |
t_001_activityType | Unterricht | 2024-10-03 14:53:59 |
t_001_code | Entfall | 2024-10-03 14:53:59 |
t_001_date | 09.10.2024 | 2024-10-03 14:53:59 |
t_001_daysleft | 6 | 2024-10-03 14:53:59 |
t_001_endTime | 09:25 | 2024-10-03 14:53:59 |
t_001_ro_longname | 212 | 2024-10-03 14:53:59 |
t_001_ro_name | 212 | 2024-10-03 14:53:59 |
t_001_startTime | 07:55 | 2024-10-03 14:53:59 |
t_001_su_longname | E-Intensivierung | 2024-10-03 14:53:59 |
... | ... | ... |
Damit kann ich dann FTUI3 auf dem Tablett füllen. Da ich dazu kein iCal brauche, hatte mich euer use-case interessiert. Was mich aber tatsächlich interessieren würde, wäre den Stundeplan auf Webuntis - sprich die Wochen oder Tagesdarstellung - über ein iframe auf dem Tablet darzustellen. Dazu fehlt mir aber aktuell noch die zündende Idee...
Zitat von: firebal301 am 03 Oktober 2024, 13:58:33Ich vermute mal, dass da irgendwas serverseitig gesperrt ist. :(
Ich habe mich mal angemeldet und dann mit der chrome erweiterung "restman" die fhem Abfrage nachgebaut. Ich bekomme damit die Klassen geliefert. Ob das in fhem auch funktioniert, kann ich gleich mal testen....
OK, das problem liegt im Login im Modul.
encode_json macht aus dem hash mit dem user Schülerin ein :{"client":"FHEM","user":"Schülerin","password":"Gymnasium#1"},"jsonrpc":"2.0","id":"FHEM","method":"authenticate"}
Das passt dann nicht. mit encode json auf dem hash ist mir da auf die schnelle keine Korrektur gelungen - das Problem ist sicher vor dem Bildschirm.
However, es funktioniert wenn du in 69_Webuntis.pm die sub login wie folgt änderst:
sub login {
my $hash = shift;
my $name = $hash->{NAME};
my $param->{header} = {
"Accept" => "*/*",
"Content-Type" => "application/json",
"Accept-Encoding" => "br, gzip, deflate"
};
##my %body = (
## "id" => "FHEM",
## "jsonrpc" => "2.0",
## "method" => "authenticate",
## "params" => {
## "password" => ReadPassword($hash),
## "user" => AttrVal( $name, "user", $EMPTY ),
## "client" => "FHEM"
## }
##);
my $jsonBody = '{"id":"FHEM","method":"authenticate","params":{"client":"FHEM","password":"'.ReadPassword($hash).'","user":"'.AttrVal( $name, "user", $EMPTY ).'"},"jsonrpc":"2.0"}';
Log3($name,LOG_SEND,"Webuntis new Login: $jsonBody");
$param->{data} = $jsonBody; ## encode_json( \%body );
Log3($name,LOG_SEND,"login sends".$param->{data});
$param->{method} = "POST";
$param->{url} = AttrVal( $name, "server", "" ) . "/WebUntis/jsonrpc.do?school=" . AttrVal( $name, "school", $EMPTY );
$param->{callback} = \&parseLogin;
$param->{hash} = $hash;
my ( $err, $data ) = HttpUtils_NonblockingGet($param);
}
Hier wird dann der json-payload "manuell" erstellt und Schülerin ist korrekt berücksichtigt.
Gruß,
Tobias
@tobi01001: Perfekt. Das war die Lösung. DANKE!
Jetzt kann ich weiter mit dem Modul spielen :-)
Zitat von: tobi01001 am 03 Oktober 2024, 15:29:15Zitat von: andies am 02 Oktober 2024, 22:18:52Mein Sohn lädt sich die Datei in Google Calendar, er will Untis nicht nutzen. Er hat noch andere Termine (Sport, Freunde und so) und die hat er im Kalender.
Ja, ok. Aber dann muss er sich doch immer (täglich) die iCal ziehen?
Man kann die per URL einbinden, da braucht er nur VPN, um in der Schule hinter meiner Firewall zuzugreifen.
Moin enno
Zitat von: enno am 02 Oktober 2024, 16:17:51Dort wird die Anmeldung bei Untis im Web über SSO gelöst. Gibt es da eine Chance? Ich muss mich dazu bei einer Portalseite einloggen und werde von dort an Untis zurückgeleitet....
Diesen Teil hat KernSani programmiert. Dort stecke ich nicht drin.
Gruß
Sailor
Hallo tobi
Zitat von: tobi01001 am 02 Oktober 2024, 21:51:37habs noch nicht getestet, aber mal kurz reingeschaut.
exportTT2iCal($hash);
Das solltest du besser am Ende von parseTT aufrufen (vor dem return z.B.).
Hintergrund ist, das parseTT die Callback-Funktion des Non-Blocking HTTP Aufrufs ist. Erst dann sind die Daten im hash TT aktualisiert.
Habe ich gemacht, stelle ich als Update bereit
Zitat von: tobi01001 am 02 Oktober 2024, 21:51:37in Zeile 694 muss es
$html[b]Row[/b] .= $t->{$f}[0]{name};
anstatt
$html .= $t->{$f}[0]{name};
heißen. War schon vorher da und hat keine Auswirkung, da die html-Darstellung nicht benutzt wird.
Ich kann keine codezeile mit
$html .= $t->{$f}[0]{name};
finden. Wahrscheinlich ist dies bereits in dem gelöschten Teil von andies.
Zitat von: tobi01001 am 02 Oktober 2024, 21:51:37Was macht ihr mit der iCal Datei - also welcher use-Case ist das dann?
Damit lässt sich sehr leicht eine Darstellung im Kalender innerhalb fhem darstellen. Ich arbeite viel mit iCals unter ftui.
Gruß
Sailor
Zitat von: andies am 03 Oktober 2024, 09:42:45Kann es sein, dass in Zeile 159 interval fehlt:
my @WUattr = ( "server", "school", "user", "class", "exceptionIndicator", "exceptionFilter:textField-long", "excludeSubjects", "iCalPath", "interval" );
==hier==
In meiner letzten Version hatte ich die schon mit aufgenommen.
Komisch - Habe ich etwa die falsche Version hochgeladen????
Egal - Gleich gibts die letzte.
Gruß
Sailor
Hallo andies
Zitat von: andies am 03 Oktober 2024, 14:07:30Ich habe noch zwei Ideen. Einmal möchten wir zwei Wochen holen, das geschieht derzeit fest verdrahtet in
Zeile 486 ( $s, $mi, $h, $d, $m, $y ) = localtime( ( time + 7 * 24 * 60 * 60 ) );
Eventuell bietet es sich an, dass man da ein weiteres Attribut setzt (btw: Wer maintained jetzt eigentlich das Modul?). In Zeile 622 findet das gleiche noch einmal für die exceptions statt.
Gute Idee!
Geändert in
( $s, $mi, $h, $d, $m, $y ) = localtime( ( time + AttrNum( $name, 'DaysTimetable', 7 ) * 24 * 60 * 60 ) );
Zitat von: andies am 03 Oktober 2024, 14:07:30Der Code für Ausfall ist im Modul (Zeile 757) "Entfall", bei uns "f.a.". Jetzt werden die Änderungen so umfangreich, dass wir das m.E. nicht mehr durch ein allgemeines Modul hinbekommen. Ich befürchte, jeder muss hier selbst programmieren?!
Gib mir mal ein paar Beispiele wie Ihr das im individuellen Fall macht.
Vielleicht ergibt sich ja eine allgemeine Lösung.
Gruß
Sailor
Moin tosammen
anbei meine letzte Version mit meinen Änderungen gegenüber kernSanis Version:
Neuste Features:
a) Neues Attribut "DaysTimetable" zur Festlegung wieviele tage im vorraus sowohl der Stundenplan als auch die Fehlzeiten heruntergeladen werden soll.
b) Die SubRoutine "exportTT2iCal($hash);" wird jetzt am Ende von "parseTT()" aufgerufen.
KernSani ist und bleibt der Maintainer von 69_Webuntis.pm. Ich habe lediglich mit dieser Version ein paar Änderungsvorschläge gemacht.
Gruß
Sailor
Bei uns ist das so:
my %codeMap = (irregular=>"Vtr. ohne Lehrer",cancelled=>"f.a.");
Das würde heißen, dass man den ganzen Codemap in die Attribute verlagert. Aber haben wir denn auch so viele Nutzer und so viele Versionen hier?
Moin zusammen
Hat mal Jemand von Euch herausbekommen, wie man den individuellen Stundenplan des Schülers anstelle des Stundenplans der gesamten Klasse inklusive aller Parallel-Kurse bekommt?
Danke!
Gruß
Sailor
Kannst du nicht die einzelnen Kurse im device händisch auskommentieren?
Zitat von: Sailor am 10 November 2024, 13:38:18Moin zusammen
Hat mal Jemand von Euch herausbekommen, wie man den individuellen Stundenplan des Schülers anstelle des Stundenplans der gesamten Klasse inklusive aller Parallel-Kurse bekommt?
Danke!
Gruß
Sailor
Der ist bei uns leider so vermurkst, dass regelmäßig Stunden komplett fehlen. Von daher hab ich da bisher keinerlei Energie hin verschwendet.
Vielleicht hab ich die Tage mal Zeit und Lust da reinzuschauen...
Moin Tobi
Zitat von: tobi01001 am 10 November 2024, 22:50:45Der ist bei uns leider so vermurkst, dass regelmäßig Stunden komplett fehlen. Von daher hab ich da bisher keinerlei Energie hin verschwendet.
Vielleicht hab ich die Tage mal Zeit und Lust da reinzuschauen...
Also hast du schon irgendwas Individuelles in der Richtung raus bekommen?
Gruß
Sailor
PS: Die kalte, dunkle Jahreszeit hat ja begonnen. Da kann man ja mal wieder programmieren! ;)
Zitat von: Sailor am 11 November 2024, 09:29:56Moin Tobi
Zitat von: tobi01001 am 10 November 2024, 22:50:45Der ist bei uns leider so vermurkst, dass regelmäßig Stunden komplett fehlen. Von daher hab ich da bisher keinerlei Energie hin verschwendet.
Vielleicht hab ich die Tage mal Zeit und Lust da reinzuschauen...
Also hast du schon irgendwas Individuelles in der Richtung raus bekommen?
Gruß
Sailor
PS: Die kalte, dunkle Jahreszeit hat ja begonnen. Da kann man ja mal wieder programmieren! ;)
Nee, Mangels funktionierendem individuellen Stundenplan (auf Seite der Schule / webuntis) habe ich es bisher noch nicht versucht.
Aber wie du schreibst, ist eventuell bei dem kalten nassen Wetter etwas Zeit dafür.
Zitat von: tobi01001 am 11 November 2024, 23:02:36Zitat von: Sailor am 11 November 2024, 09:29:56Moin Tobi
Zitat von: tobi01001 am 10 November 2024, 22:50:45Der ist bei uns leider so vermurkst, dass regelmäßig Stunden komplett fehlen. Von daher hab ich da bisher keinerlei Energie hin verschwendet.
Vielleicht hab ich die Tage mal Zeit und Lust da reinzuschauen...
Also hast du schon irgendwas Individuelles in der Richtung raus bekommen?
Gruß
Sailor
PS: Die kalte, dunkle Jahreszeit hat ja begonnen. Da kann man ja mal wieder programmieren! ;)
Nee, Mangels funktionierendem individuellen Stundenplan (auf Seite der Schule / webuntis) habe ich es bisher noch nicht versucht.
Aber wie du schreibst, ist eventuell bei dem kalten nassen Wetter etwas Zeit dafür.
OK, im Prinzip ganz einfach. Muss nur "korrekt" ins Modul eingebaut werden. Und man müsste entweder die Student-IDs ermitteln können (oder wissen) und per Attribut setzen können.
Hardcodiert funktioniert das (zumindest bei mir):
sub getTT {
...
my %body = (
...
"params" => [
{
"element" => {
"id" => 0815, ## <<< hier kommt anstatt ID der Klasse die StudentID
"type" => 5 ## Type auf 5 entspricht Student
},
...
Eventuell kann ich das die Tage selektierbar (Klasse oder Schüler) einbauen. Was war nochmal der letze Stand den ihr bzw. die Allgemeinheit nutzt?
Die SchülerID habe ich mir über den Webuntis Web-Login und Chrome im Entwicklermodus geholt...
Wenn man sich anmeldet, bekommt man über dir Antwort auf die Authentifizierung aber auch die entsprechende id geliefert. (gibt das Modul gerade nicht aus, schadet aber wohl nicht das evtl. als Internal zu hinterlegen). Wenn man sich also als Schüler anmeldet, sollte das auch die entsprechende ID zurückgeben. Irgendwie kann man bestimmt auch seine zugeordneten Kinder abfragen (evtl. wie die Klassen?!).
Gruß,
Tobias
Hallo Tobias
Zitat von: tobi01001 am 13 November 2024, 10:43:05Eventuell kann ich das die Tage selektierbar (Klasse oder Schüler) einbauen. Was war nochmal der letze Stand den ihr bzw. die Allgemeinheit nutzt?
Das wäre echt Cool.
Kannst du als Basis meine letzte 69_Webuntis.pm verwenden.
Siehe hier (https://forum.fhem.de/index.php?msg=1321855)
Gruß
Sailor
OK,
ich hab mal ein wenig was eingebaut:
- Beim Login werden iD und Typ (und sofern ein Schüler Klasse) in INTERNAL abgelegt (hätte man auch als Reading machen können).
Weiterhin gibt es zwei neue Attribute:
- studentID Schüler*innen ID
- Wenn sich dieses Webuntis Device mit den student Zugangsdaten anmeldet, kann man die ID aus den Internals ablesen -
das habe ich nicht explizit probiert. Edit: Das funktioniert bei mit wunderbar und man bekommt die IDs für Student und Klasse sowie Klassenname in den Internals angezeigt. - Alternativ über den Elternlogin bei Webuntis und im Entwicklermodus des Browsers. Wenn man da auf Stundenplan klickt und das korrekte Kind auswählt, erscheint unter Network im Entwicklermodus eine URL der art: https://....webuntis.com/WebUntis/api/public/timetable/weekly/data?elementType=5&elementId=0815&date=2024-11-13&formatId=1 in der Übersicht als data?elementType=5&elementId=6439&date=2024-11-13&formatId=1 gezeigt. --> Diese elemtId als stundentID eintragen.
- oder im Elternlogin auf seine E-Mail / Benutzernamen zu den Einstellungen und dann in den Kontaktdaten auf das Kind klicken. Dann kommt bei mir ein /contactdetails?personId=0815&isRequestForStudent=true...
- timeTableMode
- class - der Stundenplan wird wie bisher über die eingestellte Klasse geholt.
- student- der Stundenplan wird für den unter studentID angegebenden Schüler geholt.
Einfach mal schauen ob das funktioniert und gerne zurückmelden. Mit Verbose 5 im Device sieht man im Log was als Anfrage raus geht und was in der Callback zurück kommt.
Grüße,
Tobias
Moin Tobias,
vielen Dank für die Überarbeitung! Ich habe es hier bei meinen beiden Kindern eingebaut. Der Stundenplan ist jetzt für beide angepasst bei Entfall etc. Sehr schön!
Jetzt bastel ich mal weiter am Readingsgroup für die Darstellung :)
Gruss
Enno
Edit: In deiner Beschreibung steht timeTableMode auf timetable richtig ist aber wohl student
Dank für den Hinweis. Hab ich schnell korrigiert - zum Glück wegen Dropdown nicht so dramatisch.
Sind hier zufällig Pädagogen anwesend? Wüsste gerne ob man über personId und Type=2 (Teacher) auch den personalisierten Plan bekommen würde.
Hallo tobias
Zitat von: tobi01001 am 13 November 2024, 23:12:42OK,
ich hab mal ein wenig was eingebaut:
- Beim Login werden iD und Typ (und sofern ein Schüler Klasse) in INTERNAL abgelegt (hätte man auch als Reading machen können).
Weiterhin gibt es zwei neue Attribute:
- studentID Schüler*innen ID
- timeTableMode
Ist vorhanden und wird automatisch angezeigt.
Leider wird immer noch der Stundenplan der gesamten Klasse mit allem Parallelkursen exportiert und nicht der individuelle des Schülers.
Mache ich da was falsch?
Gruß
Sailor
Zitat von: Sailor am 17 November 2024, 17:22:48Hallo tobias
Zitat von: tobi01001 am 13 November 2024, 23:12:42OK,
ich hab mal ein wenig was eingebaut:
- Beim Login werden iD und Typ (und sofern ein Schüler Klasse) in INTERNAL abgelegt (hätte man auch als Reading machen können).
Weiterhin gibt es zwei neue Attribute:
- studentID Schüler*innen ID
- timeTableMode
Ist vorhanden und wird automatisch angezeigt.
Leider wird immer noch der Stundenplan der gesamten Klasse mit allem Parallelkursen exportiert und nicht der individuelle des Schülers.
Mache ich da was falsch?
Gruß
Sailor
Ja. ;D
Hast du:
- die PERSONID im Attribut studentID hinterlegt?
- das Attribut timeTableMode auf student gestellt?
Dann sollte das mit einem get ... timetable funktionieren.
Einen schülerspezifischen Stundenplan gibt es aber generell mit diesen Login-Daten bzw. unter dieser ID?
Was steht im Internal
PERSONTYPE?
Ansonsten könntest du noch entsprechende Logeinträge mit verbose 5 posten.
ACHTUNG: Darin sind in der Login-Anfrage Nutzername und Passwort im Quelltext vorhanden und in der Antwort im Zweifel auch persönliche Daten enthalten. Diese bitte entsprechend unkenntlich machen.
Wichtig wäre im Log folgendes:
...
login received {"jsonrpc":"2.0","id":"FHEM","result":{"sessionId":"12345678901234567890123456789012","personType":5,"personId":0815,"klasseId":0815}}
...
getTT sends{"method":"getTimetable","params":[{"element":{"type":5,"id":"0815"}
...
Danach folgen die Rohdaten und JSON-Formatierten Daten im Log. Eventuell siehst du da auch ob ein Fach dabei ist, was nicht hingehört.
Wenn aber die obige getTT sends - getTimetable unter element type:5 und id:.... <- SchülerID enthält und unter getTT received kein Fehler kommt, stimmt soweit alles...
LG und schöne (Schul-)Woche ;)
Moin,
ich habe insofern jetzt zumindest erfolgreich mich anmelden können, als daß der Login (mit Elterndaten) soweit funktioniert. Ich habe die Klassendaten abgefragt, sie wurden mir auch angezeigt.
Leider bekomme ich aber keine Kalenderdaten geladen.
2024.11.24 11:43:53.671 4: password Keystore handle for Device (Webuntis_Joschua) - Read password from file
2024.11.24 11:43:53.672 4: [Webuntis_Joschua] Processing Queue: login
2024.11.24 11:43:53.672 4: password Keystore handle for Device (Webuntis_Joschua) - Read password from file
2024.11.24 11:43:53.871 4: Webuntis_Joschua: GetCookies parsed Cookie: JSESSIONID Wert xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Rest Path=/WebUntis; Secure; HttpOnly; SameSite=None
2024.11.24 11:43:53.871 4: Webuntis_Joschua: GetCookies parsed Cookie: schoolname Wert "xxxxxxxxxxxxx" Rest Expires=Sun, 08 Dec 2024 10:43:53 GMT; Secure; SameSite=None
2024.11.24 11:43:53.872 4: Webuntis_Joschua: GetCookies parsed Cookie: Tenant-Id Wert "6513800" Rest Expires=Sun, 08 Dec 2024 10:43:53 GMT; Secure; SameSite=None
2024.11.24 11:43:53.872 4: login received {"jsonrpc":"2.0","id":"FHEM","result":{"sessionId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","personType":12,"personId":5188,"klasseId":0}}
2024.11.24 11:43:53.872 4: [Webuntis_Joschua] Processing Queue: getTT
2024.11.24 11:43:53.873 3: getTT sends{"id":"FHEM","method":"getTimetable","jsonrpc":"2.0","params":[{"roomFields":["id","name","longname","externalkey"],"showSubstText":true,"showInfo":true,"startDate":"20241124","showLsText":true,"showBooking":true,"subjectFields":["id","name","longname","externalkey"],"endDate":"20241208","showLsNumber":true,"showStudentgroup":true,"teacherFields":["id","name","longname","externalkey"],"element":{"id":"1261","type":5},"klasseFields":["id","name","longname","externalkey"]}]} to https://aoide.webuntis.com/WebUntis/jsonrpc.do?school=IGS%20Melle
2024.11.24 11:43:54.117 4: getTT received {"jsonrpc":"2.0","id":"FHEM","error":{"message":"no such element elementId:1261, elementType:5","code":-7002}}
2024.11.24 11:43:54.117 1: [Webuntis_Joschua] no such element elementId:1261, elementType:5
Gruß, Christoph
Hallo Christoph,
Zitat von: caldir65 am 24 November 2024, 11:48:282024.11.24 11:43:54.117 4: getTT received {"jsonrpc":"2.0","id":"FHEM","error":{"message":"no such element elementId:1261, elementType:5","code":-7002}}
2024.11.24 11:43:54.117 1: [Webuntis_Joschua] no such element elementId:1261, elementType:5
Du bist mit dem Eltern Log-In angemeldet, das Modul fragt aber einen Schülerkalender ab (elementType 5). Um das zu tun, braucht der Elternzugang Zugriff auf den gewünschten Schülerkalenderund die korrekte studentID muss eingetragen sein. Das kann ich aus dem Log nicht erkennen.
Lösch mal bitte die Attribute timeTableMode und studentID (timetableMode auf class setzen sollte auch genügen).
Im Attribut "class" muss der Text/Name der korrekten Klasse angegeben sein - gemäß der Zuordnungstabelle (könnte man mal ein Dropdown machen).
Ansonsten gern mal ein list des Device...
Gruß,
Tobias
Moin,
ich habe mal TimetableMode und StudentID gelöscht.
2024.11.25 21:24:28.718 4: password Keystore handle for Device (Webuntis_Joxxxxx) - Read password from file
2024.11.25 21:24:28.720 4: [Webuntis_Joxxxxx] Processing Queue: login
2024.11.25 21:24:28.721 4: password Keystore handle for Device (Webuntis_Joxxxxx) - Read password from file
2024.11.25 21:24:28.975 4: Webuntis_Joxxxxx: GetCookies parsed Cookie: JSESSIONID Wert FC44B4EE9CEB3692D47C75575D8D6675 Rest Path=/WebUntis; Secure; HttpOnly; SameSite=None
2024.11.25 21:24:28.975 4: Webuntis_Joxxxxx: GetCookies parsed Cookie: schoolname Wert "_aWdzIG1lbGxl" Rest Expires=Mon, 09 Dec 2024 20:24:28 GMT; Secure; SameSite=None
2024.11.25 21:24:28.976 4: Webuntis_Joxxxxx: GetCookies parsed Cookie: Tenant-Id Wert "6513800" Rest Expires=Mon, 09 Dec 2024 20:24:28 GMT; Secure; SameSite=None
2024.11.25 21:24:28.976 4: login received {"jsonrpc":"2.0","id":"FHEM","result":{"sessionId":"FC44BCEB375575D8D6675","personType":12,"personId":5188,"klasseId":0}}
2024.11.25 21:24:28.976 4: [Webuntis_Joxxxxx] Processing Queue: getTT
2024.11.25 21:24:28.977 3: getTT sends{"jsonrpc":"2.0","params":[{"teacherFields":["id","name","longname","externalkey"],"element":{"id":null,"type":1},"klasseFields":["id","name","longname","externalkey"],"subjectFields":["id","name","longname","externalkey"],"endDate":"20241209","showLsNumber":true,"showStudentgroup":true,"showBooking":true,"startDate":"20241125","showLsText":true,"showSubstText":true,"showInfo":true,"roomFields":["id","name","longname","externalkey"]}],"method":"getTimetable","id":"FHEM"} to https://aoide.webuntis.com/WebUntis/jsonrpc.do?school=IGS%20Melle
2024.11.25 21:24:29.358 4: getTT received {"jsonrpc":"2.0","id":"FHEM","error":{"message":"no such element elementId:null, elementType:1","code":-7002}}
2024.11.25 21:24:29.358 1: [Webuntis_Joxxxxx] no such element elementId:null, elementType:1
Und noch der List:Internals:
FUUID 6740cae8-f33f-378b-fb4a-44e39dda23ff7b62
NAME Webuntis_Joxxxxx
NR 1726
NTFY_ORDER 50-Webuntis_Joxxxxx
PERSONID 5188
PERSONTYPE Eltern (12)
STATE ???
TYPE Webuntis
VERSION 0.2.01
eventCount 57
HTTPCookieHash:
JSESSIONID;:
Name JSESSIONID
Options Path=/WebUntis; Secure; HttpOnly; SameSite=None
Path
Value FC44BCEB375575D8D6675
Tenant-Id;:
Name Tenant-Id
Options Expires=Mon, 09 Dec 2024 20:24:28 GMT; Secure; SameSite=None
Path
Value "6513800"
schoolname;:
Name schoolname
Options Expires=Mon, 09 Dec 2024 20:24:28 GMT; Secure; SameSite=None
Path
Value "xxxxxxxxxxxx"
READINGS:
2024-11-25 21:24:29 error no such element elementId:null, elementType:1
helper:
classes <html><table><tr><td>1231</td><td>-</td><td>-</td></tr><tr><td>1234</td><td>--</td><td>--</td></tr><tr><td>1237</td><td>5a</td><td>5a</td></tr><tr><td>1240</td><td>5b</td><td>5b</td></tr><tr><td>1243</td><td>5c</td><td>5c</td></tr><tr><td>1246</td><td>5d</td><td>5d</td></tr><tr><td>1249</td><td>5e</td><td>5e</td></tr><tr><td>1252</td><td>6a</td><td>6a</td></tr><tr><td>1255</td><td>6b</td><td>6b</td></tr><tr><td>1258</td><td>6c</td><td>6c</td></tr><tr><td>1261</td><td>6d</td><td>6d</td></tr><tr><td>1264</td><td>6e</td><td>6e</td></tr><tr><td>1267</td><td>7a</td><td>7a</td></tr><tr><td>1270</td><td>7b</td><td>7b</td></tr><tr><td>1273</td><td>7c</td><td>7c</td></tr><tr><td>1276</td><td>7d</td><td>7d</td></tr><tr><td>1279</td><td>7e</td><td>7e</td></tr><tr><td>1282</td><td>8a</td><td>8a</td></tr><tr><td>1285</td><td>8b</td><td>8b</td></tr><tr><td>1288</td><td>8c</td><td>8c</td></tr><tr><td>1291</td><td>8d</td><td>8d</td></tr><tr><td>1294</td><td>8e</td><td>8e</td></tr><tr><td>1297</td><td>9a</td><td>9a</td></tr><tr><td>1300</td><td>9b</td><td>9b</td></tr><tr><td>1303</td><td>9c</td><td>9c</td></tr><tr><td>1306</td><td>9d</td><td>9d</td></tr><tr><td>1309</td><td>9e</td><td>9e</td></tr><tr><td>1312</td><td>10a</td><td>10a</td></tr><tr><td>1315</td><td>10b</td><td>10b</td></tr><tr><td>1318</td><td>10c</td><td>10c</td></tr><tr><td>1321</td><td>10d</td><td>10d</td></tr><tr><td>1324</td><td>10e</td><td>10e</td></tr><tr><td>1327</td><td>11a</td><td>11a</td></tr><tr><td>1330</td><td>11b</td><td>11b</td></tr><tr><td>1333</td><td>11c</td><td>11c</td></tr><tr><td>1336</td><td>11d</td><td>11d</td></tr><tr><td>1339</td><td>12</td><td>Jahrgang 12</td></tr><tr><td>1342</td><td>13</td><td>Jahrgang 13</td></tr><tr><td>1345</td><td>Berat</td><td>Beratung</td></tr><tr><td>1348</td><td>Bespr</td><td>Besprechung</td></tr><tr><td>1351</td><td>CamZert</td><td>Cambridge Zertifikat</td></tr><tr><td>1354</td><td>CosRic</td><td>Costa Rica AG</td></tr><tr><td>1357</td><td>För</td><td>Förderunterricht</td></tr><tr><td>1360</td><td>JG 5</td><td>Jahrgang 5</td></tr><tr><td>1363</td><td>JG 6</td><td>Jahrgang 6</td></tr><tr><td>1366</td><td>JG 7</td><td>Jahrgang 7</td></tr><tr><td>1369</td><td>JG 8</td><td>Jahrgang 8</td></tr><tr><td>1372</td><td>JG 9</td><td>Jahrgang 9</td></tr><tr><td>1375</td><td>KollSchul</td><td>Kollegiale Schulleitung</td></tr><tr><td>1378</td><td>Ref</td><td>Referendare Betreuung</td></tr><tr><td>1381</td><td>Samm</td><td>Sammlung</td></tr><tr><td>1384</td><td>SchulL</td><td>Schulleitung</td></tr><tr><td>1387</td><td>United Nation</td><td>United Nation</td></tr><tr><td>1390</td><td>JG 10</td><td>Jahrgang 10</td></tr><tr><td>1393</td><td>Betr</td><td>Betreuung</td></tr><tr><td>1396</td><td>IPad</td><td>IPad</td></tr><tr><td>1399</td><td>Islam</td><td>Islamunterricht</td></tr><tr><td>1402</td><td>Sozial</td><td>Sozialtraining</td></tr><tr><td>1405</td><td>JGL SL</td><td>JGL SL DB</td></tr><tr><td>1408</td><td>FBL SL DB</td><td>FBL SL DB</td></tr><tr><td>1410</td><td>Perso</td><td>Perso</td></tr></table></html>
cookies JSESSIONID=FC44B4EE9CEB3692D47C75575D8D6675; Tenant-Id="6513800"; schoolname="_aWdzIG1lbGxl"
classIdMap:
1231 -
1234 --
1237 5a
1240 5b
1243 5c
1246 5d
1249 5e
1252 6a
1255 6b
1258 6c
1261 6d
1264 6e
1267 7a
1270 7b
1273 7c
1276 7d
1279 7e
1282 8a
1285 8b
1288 8c
1291 8d
1294 8e
1297 9a
1300 9b
1303 9c
1306 9d
1309 9e
1312 10a
1315 10b
1318 10c
1321 10d
1324 10e
1327 11a
1330 11b
1333 11c
1336 11d
1339 12
1342 13
1345 Berat
1348 Bespr
1351 CamZert
1354 CosRic
1357 För
1360 JG 5
1363 JG 6
1366 JG 7
1369 JG 8
1372 JG 9
1375 KollSchul
1378 Ref
1381 Samm
1384 SchulL
1387 United Nation
1390 JG 10
1393 Betr
1396 IPad
1399 Islam
1402 Sozial
1405 JGL SL
1408 FBL SL DB
1410 Perso
classMap:
- 1231
-- 1234
10a 1312
10b 1315
10c 1318
10d 1321
10e 1324
11a 1327
11b 1330
11c 1333
11d 1336
12 1339
13 1342
5a 1237
5b 1240
5c 1243
5d 1246
5e 1249
6a 1252
6b 1255
6c 1258
6d 1261
6e 1264
7a 1267
7b 1270
7c 1273
7d 1276
7e 1279
8a 1282
8b 1285
8c 1288
8d 1291
8e 1294
9a 1297
9b 1300
9c 1303
9d 1306
9e 1309
Berat 1345
Bespr 1348
Betr 1393
CamZert 1351
CosRic 1354
FBL SL DB 1408
För 1357
IPad 1396
Islam 1399
JG 10 1390
JG 5 1360
JG 6 1363
JG 7 1366
JG 8 1369
JG 9 1372
JGL SL 1405
KollSchul 1375
Perso 1410
Ref 1378
Samm 1381
SchulL 1384
Sozial 1402
United Nation 1387
hmccu:
Attributes:
DaysTimetable 14
DbLogExclude .*
class 12616d
exceptionIndicator code,info,lstext,lstype,substText
group Kalender
iCalPath ./igs_melle.ical
school IGS%20Melle
server https://aoide.webuntis.com
user xxxx.xxxx@igsmelle.net
verbose 5
Prima. Im Attribut class steht bei dir 12616d.
Trag mal bitte nur 6d ein:
attr Webuntis_Joxxxxx class 6d
Das sollte funktionieren. Und wenn mir mal etwas langweilig ist, bau ich wirklich mal ein dropdown ein.
Moin,
ja, danke, so funktioniert es, es kommt ein Kalender an. Mal sehen, was die Schule da geliefert hat ;-)
Gruß
Christoph
Moin zusammen
Ich habe ebenfalls umgestellt und stelle jetzt fest, dass nur der aktive Tag aber nicht mehr die vergangenen Tage der aktiven Woche heruntergeladen werden.
Soll heissen: Am Mittwoch sind Dienstag und Montag bereits verschwunden.
Habe ich da irgendetwas falsch eingestellt?
Gruß
Sailor
Zitat von: Sailor am 26 November 2024, 18:08:29Moin zusammen
Ich habe ebenfalls umgestellt und stelle jetzt fest, dass nur der aktive Tag aber nicht mehr die vergangenen Tage der aktiven Woche heruntergeladen werden.
Soll heissen: Am Mittwoch sind Dienstag und Montag bereits verschwunden.
Habe ich da irgendetwas falsch eingestellt?
Gruß
Sailor
Daran habe ich nichts geändert. Das Startdatum bei der Abfrage ist der aktuelle Tag. Das Enddatum ist 7 Tage in der Zukunft (oder was im Attribut DaysTimetable gesetzt ist). Man könnte einbauen, dass man immer Montags startet. Aber was interessiert die Vergangenheit?
Ich bin mir zudem ziemlich sicher, dass das schon immer so war.
Im Anhang ist noch eine Version in der die Auswahl der Klassen über Dropdown erfolgt. Sprich: Nachdem man mit retrieveClasses die verfügbaren Klassen eingelesen hat, kann man sie per Dropdown im Attribut class auswählen.
ZitatSoll heissen: Am Mittwoch sind Dienstag und Montag bereits verschwunden.
Das ist doch toll! Wer will schon Montag un Dienstag bbis zum Wochenende aufheben. Schlimm genug, dass die überhaupt immer auftauchen. ;D
LG und schönen Abend
Moin tobi
Zitat von: tobi01001 am 26 November 2024, 20:57:59Man könnte einbauen, dass man immer Montags startet.
Erledigt!
Habe ein Attribut "StartTimeTable" eingebaut
Gruss
Sailor
Moin.
Bei der Schule meiner Söhne gibt es leider keine User - zumindest ist uns keiner bekannt. Wenn man die Schule auswählt auf Webuntis bzw. via der App, dann nutzen wir den Service "anonym". Wie bekomme ich das über das Modul realisiert?
Danke und Gruß!
Zitat von: kermitthefrog am 29 November 2024, 12:58:12Moin.
Bei der Schule meiner Söhne gibt es leider keine User - zumindest ist uns keiner bekannt. Wenn man die Schule auswählt auf Webuntis bzw. via der App, dann nutzen wir den Service "anonym". Wie bekomme ich das über das Modul realisiert?
Danke und Gruß!
Das ist Modul ist aktuell nicht dafür ausgelegt ohne Anmeldung zu arbeiten.
Ich habe mir mal eine Schule gesucht, die den Stundenplan anonym ausgibt. Folgender JsonMod ergibt dir den Stundenplan der Klasse 6A am Goethe-Gymnasium 5824 in Hamburg (über den Entwicklermodus kam ich nach Auswahl der Klasse an die URL, welche nach Ergänzung der Schule direkt JSON zurückliefert):
defmod WebuntisTest JsonMod https://ikarus.webuntis.com/WebUntis/api/public/timetable/weekly/data?elementType=1&elementId=1037&date=2024-12-03&formatId=5&school=hh5824
attr WebuntisTest readingList complete();;
Damit könntest du dir einen Stundenplan erstellen oder auch nur auf Vertretungen / Ausfälle reagieren (gibt es in der Klasse / Schule offenbar nicht)...
LG
Moin,
kann ich eine Vertretung oder Ausfälle irgendwie direkt bekommen? Aus der ical geht es anscheinend nur indirekt hervor... in der AndroidApp werden solche Änderungen ja auch direkt angezeigt, insbesondere Ausfälle wären interessant.
Gruß, Christoph
Moin,
das bekommst du doch unabhängig der iCal direkt im Device? Das war ja auch die ursprüngliche Intention von KernSani für das Modul...
Ich habe über das Attribut attr webuntis exceptionIndicator code,info,lstext,lstype,substText
Readings wie e_01 date="20241212" startTime="1215" endTime="1300" code="cancelled" activityType="Unterricht" ro:longname="B1.15 (14)" ro:name="B1.15 (14)" su:longname="Wirtschaft und Recht" su:name="WR"
Diese packe ich mittels Notify und einer myUtils-Funkiton in Readings die sich wie bei einem Kalender-device lesen (damit ich meine ftui3 templates direkt verwenden kann).
# 2024-12-09 07:15:02 e__Count 2
# 2024-12-09 07:16:01 e__Count_Tot 6
# 2024-12-09 07:15:02 t_001_activityType Unterricht
# 2024-12-09 07:15:02 t_001_code Entfall
# 2024-12-09 07:15:02 t_001_date 12.12.2024
# 2024-12-09 07:15:02 t_001_daysleft 3
# 2024-12-09 07:15:02 t_001_endTime 13:00
# 2024-12-09 07:15:02 t_001_ro_longname B1.15 (14)
# 2024-12-09 07:15:02 t_001_ro_name B1.15 (14)
# 2024-12-09 07:15:02 t_001_startTime 12:15
# 2024-12-09 07:15:02 t_001_su_longname Wirtschaft und Recht
# 2024-12-09 07:15:02 t_001_su_name WR
LG