FHEM Forum

FHEM => Automatisierung => Thema gestartet von: yersinia am 09 März 2026, 09:48:42

Titel: Ideensuche: Webseiten periodisch & zufällig abfragen
Beitrag von: yersinia am 09 März 2026, 09:48:42
Hallo zusammen,
vlt. kann mir jemand ein paar Ideen geben, wie ich eine Webseite periodisch abfragen kann.
Gegeben ist ein Webshop mit Artikeln. Jeder Artikel hat eine eindeutig aufrufbare Produktseite mit Preis - wenn das Produkt nicht verfügbar ist, wird eine Fehlerseite zurückgeliefert. Ich möchte für verschiedene Produkte (derzeit 23) werktags (genauer: Mo-Fr) periodisch die Preise bzw. Verfügbarkleit abfragen.

Derzeit löse ich das mit einem DOIF Device, welches die 23 HTTPMOD Devices nacheinander aufruft (set xxx reread). Darauf reagiert ein notify welches dann einmalig eine Nachricht verschickt. Vorteile des DOIFs:
- Abfrage kann auf Wochentage begrenzt werden
- Abfragebeginn und -ende kann ich variabel definieren (feste Zeit plus zufällige Anzahl von Sekunden)
- Abfragepausen zwischen den einzelnen HTTPMOD Devices kann ich per wait definieren
- Pausen zwischen den "Runden" kann ich per repeatcmd steuern
Nachteilig dieser Lösung ist, dass wenn ich Änderungen an dem Produktportfolio vornehmen möchte, ich, neben HTPPMOD Devices, das DOIF jedes mal ändern muss (DEF & wait).

Bezüglich des Nachteils, frage ich mich, ob ich das auch via at (und dem Aufruf von perl code mit perl specials) lösen könnte. Die Devices bekomm' ich über die devspec (TYPE=HTTPMOD:FILTER=NAME=Namensschema.*), allerdings bin ich mir nicht sicher wie ich
- das at device nur in einem bestimmten Zeitfenster ausführe (ggf via disabledForInterval)
- den Startzeitpunkt des at device per Zufall auswählen lasse -> starte nicht jeden Tag zur gleichen Uhrzeit
- das at device nach Abarbeitung in eine zufällig gewählte Pause (1,5h + rand(x)) übergeht (und nach Ablauf wieder ausgeführt wird)
- die einzelnen HTTPMOD Devices mit zufälligen Abständen (45s + rand(y)) ausführen (reread) - ggf per jeweils einmalig erstellten, weiteren at devices
und das ganze non-blocking ohne perl-sleep. ;)

Ein at Device anstelle eines DOIF devices war für mich erstmal naheliegend; aber vlt gibt es ja noch andere Ideen?
Titel: Aw: Ideensuche: Webseiten periodisch & zufällig abfragen
Beitrag von: JoWiemann am 09 März 2026, 10:21:09
Hallo,

ich habe bei der Suche mit Fhem & randomize folgendes gefunden: https://wiki.fhem.de/wiki/RandomTimer, aber nicht geprüft, ob das genau Deine Anforderungen abdeckt.

Grüße Jörg
Titel: Aw: Ideensuche: Webseiten periodisch & zufällig abfragen
Beitrag von: betateilchen am 09 März 2026, 11:15:21
Grundsätzlich kann ein at die Ausführungszeit über eine perl Funktion ermitteln, die HH:MM:SS zurückliefert.
Diese Funktion kann auch wiederholend aufgerufen werden, also mit *{perlCode}

Dazu muss man wissen, dass diese Funktion für den folgenden Ausführungszeitpunkt immer erst nach der Ausführung des at aufgerufen wird.

Wenn also in der Funktion festgelegt ist, dass sie einen Zeitpunkt "45 Minuten + random()-Sekunden" zurückliefert, wird der Zufälligkeitsteil bei jeder Berechnung neu ausgewertet. Es sollten also immer unterschiedliche Abstände dabei herauskommen.
Titel: Aw: Ideensuche: Webseiten periodisch & zufällig abfragen
Beitrag von: Damian am 09 März 2026, 13:21:26
Bei den Nachteilen sprichst du immer von zufälliger Verzögerung. Warum baust du sie nicht in deinem DOIF ein? Den Zufall kannst du sowohl im wait-Attribut, als auch bei berechneten Zeittriggern angeben.
Titel: Aw: Ideensuche: Webseiten periodisch & zufällig abfragen
Beitrag von: yersinia am 09 März 2026, 15:16:46
Danke für die schnellen Rückmeldungen.

Zitat von: JoWiemann am 09 März 2026, 10:21:09ich habe bei der Suche mit Fhem & randomize folgendes gefunden: https://wiki.fhem.de/wiki/RandomTimer, aber nicht geprüft, ob das genau Deine Anforderungen abdeckt.
Danke, das kannte ich noch nicht. Wenn ich die Doku richtig verstehe, beschränkt sich das auf ein Device - und nicht zB eine Perl-Funktion oder eine Gruppe von Devices.

Zitat von: betateilchen am 09 März 2026, 11:15:21Grundsätzlich kann ein at die Ausführungszeit über eine perl Funktion ermitteln, die HH:MM:SS zurückliefert.
Das ist mir bekannt und wäre auch meine erste Wahl gewesen. Dies würde aber "nur" das initiale at definieren; ich möchte nicht für jedes HTTPMOD Device ein eigenes at definieren. Letzteres würde ich gern über eine Schleife basierend auf devspec2array aktualisieren - aber eben mit einem zeitlichen Abstand.

Zitat von: betateilchen am 09 März 2026, 11:15:21Dazu muss man wissen, dass diese Funktion für den folgenden Ausführungszeitpunkt immer erst nach der Ausführung des at aufgerufen wird.
Das passt.

Zitat von: Damian am 09 März 2026, 13:21:26Bei den Nachteilen sprichst du immer von zufälliger Verzögerung. Warum baust du sie nicht in deinem DOIF ein? Den Zufall kannst du sowohl im wait-Attribut, als auch bei berechneten Zeittriggern angeben.
Dann hab ich mich mißverständlich ausgedrückt - das DOIF funktioniert, inklusive variabler Zeitdifferenz via wait Attribut. Was mich nervt (first world problems!) ist die Tatsache, dass wenn ich ein HTTPMOD Device hinzufüge/entferne, ich die DOIF DEF sowie was wait Attribut anpassen muss. Das DOIF sieht etwa so aus:
([([06:50]+int(rand(300)))-([20:30]-int(rand(300)))|8])
(set Produkt_1 reread)
(set Produkt_2 reread)
(set Produkt_3 reread)
(set Produkt_4 reread)
##[...]
(set Produkt_23 reread)
DOELSE ()
mit
Attributes:
   do         always
   repeatcmd  4600+rand(400)
   wait       0,45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30),45+rand(30)
Schön wäre, wenn das DOIF im Ausfrührungsteil über die vorhandenen Devices iterieren und ein reread durchführen könnte - mit jeweiliger Pause dazwischen. Devspec wäre
TYPE=HTTPMOD:FILTER=NAME=Produkt_.*