69_Webuntis: Beta-Modul zum Auslesen von Webuntis Stundenplänen

Begonnen von KernSani, 26 Februar 2023, 23:52:38

Vorheriges Thema - Nächstes Thema

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

enno

#46
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.
Einfacher FHEM Anwender auf Intel®NUC

andies

Kann es sein, dass in Zeile 159 interval fehlt:
    my @WUattr = ( "server", "school", "user", "class", "exceptionIndicator", "exceptionFilter:textField-long", "excludeSubjects", "iCalPath", "interval" );
                                                                                                                                          ==hier==
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

firebal301

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

enno

Moin

Versuch es mal damit:

school:    gym-schwarzenbek
server: https://mese.webuntis.com
user:    Schülerin

Mit set Password setzen : Gymnasium#1
Einfacher FHEM Anwender auf Intel®NUC

firebal301

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. :(

andies

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?!

FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

tobi01001

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__Count22024-10-03 14:53:59
e__Count_Tot22024-10-03 14:53:59
t_001_activityTypeUnterricht2024-10-03 14:53:59
t_001_codeEntfall2024-10-03 14:53:59
t_001_date09.10.20242024-10-03 14:53:59
t_001_daysleft62024-10-03 14:53:59
t_001_endTime09:252024-10-03 14:53:59
t_001_ro_longname2122024-10-03 14:53:59
t_001_ro_name2122024-10-03 14:53:59
t_001_startTime07:552024-10-03 14:53:59
t_001_su_longnameE-Intensivierung2024-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....
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

tobi01001

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
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

firebal301

@tobi01001: Perfekt. Das war die Lösung. DANKE!

Jetzt kann ich weiter mit dem Modul spielen :-)

andies

Zitat von: tobi01001 am 03 Oktober 2024, 15:29:15
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?
Man kann die per URL einbinden, da braucht er nur VPN, um in der Schule hinter meiner Firewall zuzugreifen.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Sailor

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
******************************
Man wird immer besser...

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
******************************
Man wird immer besser...

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
******************************
Man wird immer besser...

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
******************************
Man wird immer besser...