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
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.
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
Welches Format hat das Tagesdatum denn?
Guten Morgen,
das Datum wird im Format yyyy-mm-dd benötigt.
VG
Marc
Dann schau dir mal die Doku zu strftime (https://perldoc.perl.org/POSIX.html#strftime) und localtime (https://perldoc.perl.org/functions/localtime.html) an.
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
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 ;)
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.
Siehst du, die ersten Schritte sind gar nicht so schwer.
RegExp kannst du z.B. bei https://regexr.com/ testen.
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. :-)
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?
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.
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.
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.
Perfekt, Danke für den Tipp. Das bekomme ich dann hin.
So, klasse. Auch das bekomme ich umgesetzt.
Allerdings treten meine Wissenslücken hier tröpfchenweise auf :-(
Ich hole die Daten alle 10 Minuten von der webseite ab.
Meine Telegram Nachricht, die mich eigentlich nur über Änderungen informieren soll, schlägt jetzt aber alle 10 Minuten bei mir auf, obwohl sich an den einzelnen Readings nichts ändert.
event-on-Change habe ich gesetzt.
Habt Ihr eine Idee, was ich hier noch falsch mache?
Eventuell event-on-update???
Gesendet von meinem SM-G930F mit Tapatalk
Magst Du mir Deine Idee erläutern?
Auf die Idee wäre ich jetzt so gar nicht gekommen.
Ich probiere manchmal solche Sachen ohne es erklären zu können aus.
Eventuell ist ja das Überschreiben mit dem selben Wert trotzdem ein change und
das Schreiben eines anderen Wertes ein Update.
Gesendet von meinem SM-G930F mit Tapatalk
Lag ich richtig oder war das total falsch?
Gesendet von meinem SM-G930F mit Tapatalk
Poste bitte ein (anoymisiertes) list deines HTTPMOD und des DOIF.
So, ich denke, ich habe es nun am Laufen.
Ich danke Euch vielmals für Eure Unterstützung. Bei meinem zuletzt geschilderten Problem saß der Esel mal wieder vor dem Rechner :-)
Ich hatte bei meinen Tests zwischenzeitlich das ReadingXXMaxAge auf 6 Sekunden gesetzt, um die Readings zu leeren. Dies hatte ich aber nicht wieder zurückgesetzt. So hatte ich dann natürlich ständig Updates auf den Readings.
Von der grundsätzlich Logik habe ich es nun also. Jetzt fehlen noch ein paar Feinheiten. Z.B. würde ich gerne die Daten in einer Tabelle darstellen und per Telegram versenden. Aber da werd ich mal googeln, ob das irgendwie geht.
Ansonsten würde ich den Thread jetzt schließen.
Danke für Eure Geduld. :-)