(Gelöst) httpmod Vertretungsplan auslesen - variable URL

Begonnen von PingPong, 20 Januar 2020, 21:22:56

Vorheriges Thema - Nächstes Thema

PingPong

Hallo zusammen,

ich würde gerne den Vertretungsplan auf einer Schulwebseite auslesen und mich per Telegram darüber informieren lassen,
wenn eines meiner Kids am nächsten oder am aktuellen Tag Vertretungsstunden hat.
Dies Webseite würde ich gerne per httpmod aulesen.
Ich scheiter leider schon am Anfang damit, dass die Webseite einen variablen Link aufweist.
Beispiel: https://user:passwort@schule.de/toll/<Tagesdatum>.

Habt Ihr eine Idee, wie ich hier das Tagesdatum ermitteln und in die Definition einsetzen kann?
Die Replacement Funktion in httpmod ist mir leider noch schleierhaft :-(

VG
Marc

Christoph Morrison

Zitat von: PingPong am 20 Januar 2020, 21:22:56
Hallo zusammen,

ich würde gerne den Vertretungsplan auf einer Schulwebseite auslesen und mich per Telegram darüber informieren lassen,
wenn eines meiner Kids am nächsten oder am aktuellen Tag Vertretungsstunden hat.
Dies Webseite würde ich gerne per httpmod aulesen.
Ich scheiter leider schon am Anfang damit, dass die Webseite einen variablen Link aufweist.
Beispiel: https://user:passwort@schule.de/toll/<Tagesdatum>.

Habt Ihr eine Idee, wie ich hier das Tagesdatum ermitteln und in die Definition einsetzen kann?
Die Replacement Funktion in httpmod ist mir leider noch schleierhaft :-(

Das geht ungefähr so:

defmod Vertretungsplan HTTPMOD https://user:passwort@schule.de/toll/%%date%% <dein interval>
attr Vertretungsplan replacement01Mode expression
attr Vertretungsplan replacement01Regex %%date%%
attr Vertretungsplan replacement01Value { # hier generierst du das Datum mit Perl }


Siehe:
ZitatIf the replacement[0-9]*Mode is expression, then the corresponding replacement[0-9]*Value is evaluated as a perl expression to compute the replacement. Inside such a replacement expression it is possible to refer to capture groups of the replacement regex.

PingPong

Hallo Christoph,

vielen Dank für Deine Antwort.
Leider tappe ich weiter im Dunkeln. Hast Doch noch nen Tipp für mich, wie man das Tagesdatum mit Perl generieren kann?
VG
Marc

Christoph Morrison


PingPong

Guten Morgen,
das Datum wird im Format yyyy-mm-dd benötigt.

VG
Marc

Christoph Morrison


PingPong

Ohje, gar nicht meine Welt.
Habe jetzt auch das letzte Attribut gesetzt, zumindest soweit dass nicht schon bei der Anlage des Attributs ein Fehler fliegt :-)

Werde jetzt heute Abend mal weitersuchen, ob ich nun auf die Webseite zugreifen kann -> Authentifizierung ist hier auch noch ein Thema.
Bin nicht sicher, ob ich mit User/Passwort im Link hinkomme.

VG
Marc

CoolTux

Zitat von: PingPong am 22 Januar 2020, 13:52:22
Ohje, gar nicht meine Welt.
Habe jetzt auch das letzte Attribut gesetzt, zumindest soweit dass nicht schon bei der Anlage des Attributs ein Fehler fliegt :-)

Werde jetzt heute Abend mal weitersuchen, ob ich nun auf die Webseite zugreifen kann -> Authentifizierung ist hier auch noch ein Thema.
Bin nicht sicher, ob ich mit User/Passwort im Link hinkomme.

VG
Marc

Man wächst mit seinen eigenen Anforderungen  ;)
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

PingPong

Also
attr Vertretungsplan replacement01Value { strftime '%Y-%m-%d', localtime }
scheint zu funktionieren - Anmeldung an der Webseite ebenfalls.

Dann steht jetzt morgen die Regex an.
Mühsam ernährt sich das Eichhörnchen.

Christoph Morrison

Siehst du, die ersten Schritte sind gar nicht so schwer.

RegExp kannst du z.B. bei https://regexr.com/ testen.

PingPong

Danke für den Tipp. Ja, die Seite kenne ich schon.
Habe auch schon 1-2 httpmod Zugriffe via Regex im Einsatz.
Muss jetzt aber erstmal überlegen, wie ich damit umgehen kann, dass ich die Anzahl der Treffer auf der Seite nicht kenne.
Mal sehen. :-)

PingPong

Hallo zusammen,

so, ich habe es nun auch geschafft, die Readings in fhem zu erzeugen. Zudem bekomme ich die gewünschten Informationen auch in einer ReadingsGroup angezeigt.
Damit ist die Grundlage geschaffen, um die Daten jetzt per Telegram zu versenden.

Jetzt bräuchte ich aber nochmal nen Denkanstoß:
Ich habe jetzt ja ein Device (mein httpmod) mit einer variablen Anzahl an Readings.
Ich hole alle 60 Minuten die Daten von der Webseite ab. Wenn sich nun ein Reading ändert (egal welches) möchte ich eine Telegram Nachricht erzeugen.
Habt Ihr eine Idee, wie hier das notify/doif aussehen muss?

Christoph Morrison

Normales Vorgehen im DOIF mit Trigger auf ein Reading [device:reading] und im HTTPMOD-Device event-on-change-reading setzen.
Das DOIF löst dann nur aus, wenn sich ein Reading ändern, nicht auch wenn es nur aktualisiert wird.

Bei einer variablen Anzahl von Readings solltest du auch mal einen Blick auf ReadingXXMaxAge werfen - sonst hast du u.U. lange irgendwelche alten Readings im Device, die aber nicht mehr interessant sind.

PingPong

Hi,

ReadingXXMaxAge hatte ich schon gesetzt, da bei einer dynamischen Anzahl an Readings ansonsten ein Haufen alter Readings stehen bleibt, wenn bspw. an einem Tag 3 Stunden ausfallen und am Folgetag keine mehr. Das sollte schon passen. Aber ganz lieben Dank für den Hinweis.

Das grundsätzliche Verhalten von doif mit Anwendung auf ein Reading ist mir klar. Aber entweder passt das ja in meinem Anwendungsfall nicht oder ich verstehe es noch nicht.
Ich bräuchte ja entweder ein Doif, welche alle Readings im Blick hat oder ich bräuchte ein weiteres (noch nicht vorhandenes) Reading, welches mir quasi in fhem sagt, ob sich eines meiner Readings geändert hat, sodass ich dann das doif nur auf dieses Reading schauen lasse.

Christoph Morrison

Zitat von: PingPong am 24 Januar 2020, 15:34:03
Ich bräuchte ja entweder ein Doif, welche alle Readings im Blick hat oder ich bräuchte ein weiteres (noch nicht vorhandenes) Reading, welches mir quasi in fhem sagt, ob sich eines meiner Readings geändert hat, sodass ich dann das doif nur auf dieses Reading schauen lasse.

Die Bedingung im DOIF kann auch ein regulärer Ausdruck sein. Zum Beispiel wenn dein Stundenplan-HTTPMOD Stundenplan heißt und deine Readings dort Vertretung-1, Vertretung-2 und Vertretung-3, dann kannst du auf [Stundenplan:"Vertretung-\d+"] matchen - dann wird das Doif jedesmal getriggert, wenn in Vertretung-{1,2,3,n} ein Event erzeugt wird.