RSS-Feed mit notify bei Schlagwort

Begonnen von Barney1337, 06 Juni 2016, 16:12:20

Vorheriges Thema - Nächstes Thema

Barney1337

Hallo FHEM-Community!

Seit 3 Tagen sitze ich nun daran und versuche, einen RSS-feed abzufragen und beim Auftauchen einer definierten Zeichenfolge eine Push-Nachricht via Telegram-Bot zu verschicken.
Ich habe es bereits geschafft, dass bei manuellem trigger-Kommando eine Nachricht verschickt wird.
Ebenso hatte ich es auch schon geschafft, dass von alleine Nachrichten verschickt wurden, allerdings bis zu 50 Stück in kürzester Zeit.

Zunächst einmal die Versionsinfo:
ZitatFhem info:
Release: 5.7 FeatureLevel: 5.7
OS: linux
Arch: arm-linux-gnueabihf-thread-multi-64int
Perl: v5.20.2

Es hapert scheinbar am triggern des notify-events, oder an den diversen if-Abfragen, die ich dem notify angehängt habe.
Das Versenden einer Vielzahl von Nachrichten habe ich versucht durch "attr myDealz event-on-change-reading .*" zu unterbinden, bisher ohne Erfolg.

Als Beispiel habe ich die Zeichenfolge "m/amazon/i" genommen.
Wobei ich gelesen habe, dass das führende "m" redundant ist. Das abschließende "i" (ignorecase) soll die Groß-/Kleinschreibung irrelevant machen.

Hier mal der (vermutlich relevante und teilweise gekürzte) Code:
define myDealz rssFeed http://www.xyz.de/rss/ 600
attr myDealz event-on-change-reading .*
attr myDealz rfEncode utf8
attr myDealz rfMaxLines 20
attr myDealz rfReadings title

define myDealzPush notify myDealz.* {\
my $n00 = ReadingsVal("myDealz","n00_title","");;\
my $n01 = ReadingsVal("myDealz","n01_title","");;\
.
.
.
my $n19 = ReadingsVal("myDealz","n19_title","");;\
if ($n00 =~ m/Amazon/i || $n01 =~ m/Amazon/i || ... || $n19 =~ m/Amazon/i) {\
fhem("set Telegram_Bot message \@123456789 Ein neuer Amazon Deal wurde eingestellt!")\
}\
}


Wäre ein Traum, wenn irgendjemand Tipps hätte, oder einen groben Schnitzer im Code sieht.
Habe wie gesagt schon diverse Varianten ausprobiert, bin in Perl und FHEM aber noch nicht sehr bewandert.

Beste Grüße

Benni

Hallo Barney1337,

das Problem ist, dass rssFeed keine Events für die einzelnen erzeugten Readings generiert, deshalb kannst du darauf auch kein Notify triggern (das bleibt auch so!), was ja das naheliegendste wäre.

Es gibt allerdings eine Möglichkeit die Texte, die für die Readings aus dem Feed extrahiert werden, ggf. vor dem Setzen der Readings noch über eine eigene sub zu modifizieren (s.a. Commandref zu rssFeed / Attribut rfCustomTextPrepFn. Natürlich können in dieser sub auch die Texte analysiert und ggf. weitere Aktionen, je nach Inhalt ausgelöst werden.

Dies ist zwar nicht die ursprüngliche Idee hinter dieser Funktionalität, aber sie lässt sich dafür hervorragend "mißbrauchen"

Das ganze habe ich erst gestern relativ detailliert  für den RSS-Feed, der NASA, der ISS-Überflüge ankündigt beschrieben. Siehe dazu mal folgenden Thread: https://forum.fhem.de/index.php/topic,45261.msg458921.html#msg458921

Schau dir das mal an, das sollte dir weiterhelfen.

Gruß Benni.

Barney1337

Zitat von: Benni am 06 Juni 2016, 17:00:20
[...]
das Problem ist, dass rssFeed keine Events für die einzelnen erzeugten Readings generiert, deshalb kannst du darauf auch kein Notify triggern (das bleibt auch so!), was ja das naheliegendste wäre.
[...]

Hallo Benni,

schon mal vielen Dank für die schnelle Antwort.
Bevor ich jetzt mit dem Post, auf den du verwiesen hast, loslege, frage ich doch noch einmal kurz nach:

Würde es nicht ausreichen, wenn der rssFeed an sich ein Event triggered?
Ich Update den Feed alle 10 Minuten, dann ändert sich das State-Datum unter Internals und auch unter Readings, damit ließe sich kein notify triggern?
Das würde dann doch ausreichen, damit er in dem Moment alle Readings einmal durchgeht und nach dem Wort sucht.

Falls das auch nicht funktioniert werde ich mich demnächst mal an deine etwas komplexere Vorgehensweise aus dem anderen Thread wagen  :D

Beste Grüße

Benni

Zitat von: Barney1337 am 06 Juni 2016, 17:11:43
Würde es nicht ausreichen, wenn der rssFeed an sich ein Event triggered?

Tut er auch, da sich ja bei der Aktualisierung der state ändert, was ein Event generiert.
(Ob das wirklich alle 10 Minuten sein muss ist auch fraglich)
Aber dann musst du dir tatsächlich ja jedes Reading einzeln holen und anschauen (so wie du es ja auch schon angefangen hast). Das funktioniert natürlich auch, ist aber relativ aufwändig, da du das dann ja ggf. 20 mal oder auch häufiger machen musst.

In der von mir vorgeschlagenen Variante musst du den Code nur einmal für die Analyse beliebig vieler Readings schreiben, was das ganze auch von der Fehleranfälligkeit her deutlich reduziert und vereinfacht.

Du kannst aber auch in deinem (!) Code per Schleife die einzelnen Readings durchgehen. Wie viele Items bei der letzten Aktualisierung tatsächlich aus dem Feed extrahiert werden konnten steht ja im Reading preparedLines

Sehe ich das übrigens richtig, dass du die fhem.cfg direkt bearbeitest?
Davon würde ich dringend abraten, denn gerade bei größeren Codings kommt es dabei gerne zu Fehlern, speziell, wenn mann die Semikolons und Zeilenvorschübe selbst escapen muss.