Neus Modul 98_rssFeed - Abrufen von RSS News-Feeds

Begonnen von Benni, 06 Dezember 2015, 20:34:39

Vorheriges Thema - Nächstes Thema

Benni

Hallo zusammen,

wie schon aus dem Titel ersichtlich geht es um ein neues Modul 98_rssFeed.pm
Das Modul dient dazu Daten (Titel, Beschreibung, Veröffentlichungsdatum ...) zyklisch von einer rss-Feed-URL abzurufen und u.a. als Readings bereitzustellen.
Es handelt sich um ein Hilfs-Modul und wird somit im Forum hier unter "unterstützende Dienste" von mir supportet.

Entstanden ist das ganze auf Basis des Codeschnipsels aus diesem Forenbeitrag: http://forum.fhem.de/index.php?topic=33813.0

Ich hatte das auch so in Verbindung mit InfoPanel (Ticker) im Einsatz und habe es im Laufe der Zeit mittels eines Dummy immer weiter ausgebaut, um auch bequem über das Web-IF die Feed-URL ändern kann oder auch einfach mal den Ticker deaktivieren.
Letztendlich ist daraus das genannte Modul entstanden.

Mit diesem Modul betrete ich übrigens gleich in dreierlei Hinsicht Neuland:


  • Dies ist mein erstes Umfangreicheres Coding in Perl. Ich programmiere zwar schon mehr als mein halbes Leben lang in allen möglichen Programmiersprachen doch mit Perl bin ich erst durch FHEM in Kontakt gekommen. Nicht zu vergessen, die ganzen Spezialitäten des FHEM-Frameworks, in denen ich mich bisher auch nur rudimentär zurechtfinde.
  • Dies ist mein erstes Community-Projekt an dem ich mittels SVN/Sourceforge teilnehme. Ich hatte zwar früher schon CVS im Einsatz und arbeite privat gerne mit git, aber mit SVN in einer "echten" Community bin ich erst seit dem Entschluß dieses Modul zu veröffentlichen ernsthaft in Kontakt. (Bei uns in der Firma setzen wir übrigens auf Microsoft Teamfoundation für die Codeverwaltung)
  • Dies ist das erste Mal, dass ich ein Modul öffentlich mit Support und allem drum und dran in einer OpenSource-Community zur Verfügung stelle.
Ich habe das Modul übrigens auch deshalb als "offizielles" Modul veröffentlicht wird, damit es überhaupt wahrgenommen wird. Sollte sich allerdings herausstellen, dass der Anwendungsfall doch zu speziell ist oder die Funktion des Moduls letzlich doch zu trivial ist um über den Status des Codeschnipsels hinauszureichen, bin ich natürlich auch gerne dazu bereit das ganze einfach ins Contrib zu verschieben.

Ihr seht also, ich bin an dieser Ecke noch ein echter Newbie und bitte darum, sowohl bei den Anwendern, als auch bei den anderen Entwicklern, zumindest anfänglich um etwas Nachsicht ;)
Für konstruktive Kritik und Vorshläge bin ich natürlich jederzeit offen.

Das Modul selbst habe ich sowohl mit ausführlicher deutscher und englischer Dokumentation versehen Den deutschen Auszug aus der Dokumentation findet ihr direkt im nächsten Post. Diesen werde ich allerdings zukünftig nicht mehr aktualisieren. Die aktuellste Doku zum Modul gibt es wie üblich immer über die Commandref.

Für konstruktive Kritik bin ich natürlich immer offen.

So genug geschrieben, nun bleibt mir nur zu hoffen, dass das Modul auch Nutzer findet. Viel Spaß damit  :)

Gruß Benni.

   
   
   

Benni

#1
(Sorry, aber ich habe die textlichen Formatierungen aus der Commandref hier mal nur grob umgesetzt  ;))

98_rssFeed

Mit diesem Hilfs-Device kann ein RSS-Feed per URL abgerufen werden. Das Ergebnis wird zum einen in entsprechende Readings (s.u.) eingetragen, zum Anderen können die Schlagzeilen (Headlines) noch per GET oder per bereitgestellter Funktion als Ticker-Daten abgerufen werden. Die Daten des RSS-Feeds werden dabei jeweils im angegebenen Interval aktualisiert.

Define
define <name> rssFeed <url> [interval]

url = URL zum RSS-Feed
interval = Aktualisierungsinterval in Sekunden
minimum Wert sind 600 Sekunden (10 Minuten)
maximum Wert sind 86400 Sekunden (24 Stunden)

Beispiel:
define myNews rssFeed http://www.gea.de/rss?cat=Region%20Reutlingen&main=true 3600

Damit wird stündlich der RSS-Feed des Reutlinger Generalanzeigers abgerufen.

Set
set <name> update
Abrufen der Daten vom rssFeed und aktualisieren der Readings

Get
get <name> ticker
Abrufen der zuletzt gelesenen Schlagzeilen im gewünschten Format (s. Attribute)

Attribute
disabled
Mit diesem Attribut kann das Device deaktiviert (1) werden bzw. auch wieder aktiviert (0 oder Attribut nicht vorhandn). Wenn das device deaktiviert ist, sind keine Readings mehr vorhanden, außer state. Außerdem werden die Daten nicht mehr zyklisch aktualisiert und get ticker liefert nur noch die Information zurück, dass der Ticker nicht mehr aktiv ist (s. dazu auch Attribut rfDisabledText).
rfDisabledText
Der hier eingetragenee Text wird beim Abruf der Schlagzeilen als einzige Zeile angezeigt, wenn der rssFeed disabled ist (s. Attribut disabled). Ist dieses Attribut nicht angegeben, so wird ein Standardtext angezeigt.
Beispiel: attr <name> rfDisabledText Dieser Feed wurde deaktiviert
rfTickerChars
Hiermit kann eine Zeichenfolge festgelegt werden, die bei den Schlagzeilen für den get-Abruf vor und nach jeder Schlagzeile, wie bei einem Nachrichten-Ticker angefügt wird.
  Beispiel: attr <name> rfTickerChars +++
  Ergebnis: +++ Dies ist eine Beispiel-Schlagzeile +++
rfMaxLines
Bestimmt, wieviele Schlagzeilen maximal aus dem Feed extrahiert werden sollen.
Sind weniger Nachrichten-Elemente im Feed enthalten, als über rfMaxLines angegeben, so werden eben nur so viele Schlagzeilen extrahiert, wie vorhanden sind.
Ist dieses Attribut nich angegeben, so wird dafür der Standard-Wert 10 angenommen.
Beispiel: attr <name> rfMaxLines 15
rfEncode
Hier kann eine Encoding-Methode (Bspw. utf8) angegeben werden. Die Texte die aus dem Feed extrahiert werden (title, descripton, ...) werden dann vor der Zuwesung an die Readings mittels encode (Perl core-Module Encode) enkodiert. Fehlt dieses Attribut, so findet keine umkodierung statt. Das kann u.U. notwendig sein, wenn in den zurückgelieferten Feed-Daten s.g. wide Characters enthalten sind. Dies kann evtl. dazu führen, das u.a. die Darstellung in FHEMWEB nicht mehr korrekt erfolgt. Dies betrifft auch das Ergebnis von rssFeedFunctions, bzw. get ticker.
rfReadings
Über dieses Attribut kann angegeben werden, welche Daten aus dem RSS-Feed in Readings extrahiert werden sollen. Das Attribut ist als Komma getrennte Liste anzugeben.
Zur Auswahl stehen dabei folgende möglichen Werte:
  title = Titelzeile
    Dies erzeugt ein Reading für den Feed-Titel und für jedes Nachrichten-Element aus dem Feed.
  description = Beschreibungstext Dies erzeugt ein Reading für die Feed-Beschreibung, bzw. für den Beschreibungstext jeden Nachrichten-Eelements.
  pubDate = Zeitpunkt der Veröffentlichung des Feeds, bzw. der einzelnen Nachrichten-Elemente
  link = Link zum Feed, bzw. zum einzelnen Nachrichten-Element auf der Homepage des Feeds.
  buildDate = Zeitpunkt der letzten aktualisierung der Feed-Daten vom Feed-Betreiber.
  imageURl = URL zum ggf. vorhandenen Bild eines Nachrichten-Elements, bzw. zum Nachrichten-Feed.
  imageTitle = Titel eines ggf. zum Feed oder Nachrichten-Element vorhandenen Bildes.

Ist Dieses Attribut nicht vorhanden, so werden die Werte "title,description,pubDate" als Voreinstellung angenommen. Beim ersten Anlegen des Device wird das Attribut automatisch erste einmal mit genau dieser Voreinstellung belegt.

Funktionen
rssFeedGetTicker
Diese Funktion gibt die ermittelten und formatierten Schlagzeilen als Zeichenkette zurück. Die einzelnen Schlagzeilen sind dabei durch Zeilenvorschub getrenn. Dieses Ergebnis kann bspw. in einem InfoPanel für einen Ticker verwendet werden. Der Funktion muss dazu der Name eines rssFeed-Devices übergeben werden. Die Ausgabe ist praktisch die selbe wie das Ergebnis, das bei get ticker geliefert wird.
Syntax: rssFeedGetTicker(<rssFeedDevice>)

Readings
Je nach Auswahl der Attribute werden verschiedene Readings bereitgestellt. Diese Readings sind teilweise mit einem Präfix versehen um sie bspw. dem Feed selbst oder einem Nachrichten-Element zuozuordnen.

Nxx_
Diese Readings beziehen sich alle auf die einzelnen Nachrichten-Elemente, wobei xx den Index des jeweiligen Nachrichten-Elements angibt.
Beispiel für die Readings eines Nachrichten-Elements:
  N00_title
  N00_descripton
  N00_pubDate

f_
Diese Readings beziehen sich alle auf den Nachrichten-Feed selbst.
Beispiel für die Readings des Nachrichten-Feeds
  f_title
  f_descripton
  f_buildDate

preparedLines
Dieses Reading gibt an, wie viele Schlagzeilen tatsächlich beim letzten update aus dem Nachrichten-Feed extrahiert wurden.
state
Dieses Reading gibt, wenn das Device nicht disabled ist, den Zeitpunkt der letzten aktualisierung mittels update an, egal ob automatisch oder manuell ausgelöst. Ist das device disabled, steht genau das im Reading. Beim Anlegegen des Device mittels define findet das erste Aktualisieren der Daten verzögert statt. Während dieser Verzögerung steht der state auf "defined".

Edit: Gerade noch gesehen, dass ich vergessen habe zu erwähnen, dass das Perl-Modul XML::Simple benötigt wird.

hillbicks

Genau das habe ich doch gesucht, damit kann man morgens schoen auf die Nachrichten Seite wechseln wenn man im Bad ist (FTUI).

Ich hab zum Testen mal den Reutlinger Generalanzeiger angelegt, kann mit get myNews ticker auch die Ueberschriften sehe, allerdings fuer ein Klick in fhem selber in eine komplett leere Seite.(Firefox, Chromium)

Logfile sagt beim Aufruf des Eintrages im FHEMWEB

2015.12.22 22:11:54 1: memGzip: Wide character in memGzip at ./FHEM/01_FHEMWEB.pm line 454.

Wenn ich noch was nachgucken soll, sag Bescheid :)

Benni

Setze mal das Attribut rfEncode auf utf8, dann sollte es eigentlich klappen.

hillbicks

#4
Das wars, ich dank Dir!

Cooles Modul  ;D

EDIT: Wer lesen kann ist klar im Vorteil.... Sorry, hatte den Part vorhin schlecht ueberlesen.

hillbicks

So, ich doch nochmal ;)

Kannst Du bei Dir bitte mal  diesen Feed hier pruefen. Auch mit rfEncode UTF8 schmiert fhem komplett ab und laesst sich auch nicht mehr starten, musste es dann aus der fhem.cfg rausnehmen.

http://www.deutschlandfunk.de/die-nachrichten.353.de.rss

letzte Fehlermeldung im Log:
not well-formed (invalid token) at line 1, column 0, byte 0 at /usr/lib/x86_64-linux-gnu/perl5/5.20/XML/Parser.pm line 187.

OS: Debian Jessie

Gruss

Benni

Hallo,

das kann ich mir leider erst nach Weihnachten anschauen, da ich im Moment im Weihnachtsurlaub bin 8) und mangels guter Internetverbindung keinen vernünftigen Zugriff auf mein Entwicklungssystem habe.

Wie gesagt, ich schaue es mir nach Weihnachten an.
Bis dahin kannst du ja vllt. mal den Feed der Tagesschau nehmen. Von dem weiß ich, dass er funktioniert. :)

hillbicks


Benni

#8
So,

nachdem ich heute Nachmittag doch noch in den Genuss eines einigermaßen brauchbaren Hotel-WLANs gekommen bin und auch etwas Zeit und Muse hatte, konnte ich noch ein wenig testen und basteln (Cool, was selbst gebasteltes zu Weihnachten ;) ) und das mit Erfolg:

Das Problem war, dass der RSS-Feed teilweise gzip komprimiert daher kam, deshalb war es natürlich bei der Weiterverarbeitung auch kein wohlgeformtes XML. Das war, was die Fehlermeldung meinte. Allerdings kommen die Feed-Daten nicht immer komprimiert daher, das wechselt anscheinend willkürlich von Abruf zu Abruf.  :-\

Wie auch immer! Das Modul stellt ab sofort selbständig fest, ob die Daten komprimiert daherkommen, oder nicht und dekomprimiert diese. Das wird auch in einem neuen Reading gzippedFeed (1=Feed-Daten waren gezippt / 0 = Feed-Daten waren ungezippt) dokumentiert.

Weiterhin wird die XML-Verarbeitung nun in einem eval durchgeführt, um ein komplettes Abschmieren von FHEM bei Fehlern dabei zu verhindern.

Das ganze habe ich entsprechend dokumentiert und eingecheckt. Sollte also ab morgen per update verfügbar sein.

hillbicks

Das ging ja fix *g*

Hinzufuegen hat auch zuerst geklappt, anschliessend ist fhem wieder abgeraucht. Eintrag aus fhem.cfg manuell geloescht, verbose auf 5 gestellt und feed wieder hinzugefuegt. Anschliessend ist fhem direkt abgeraucht. Ich hab dann anschliessend noch ein paar perl xml pakete installiert (inklusive Abhaengigkeiten), jetzt scheint es zu laufen. librpc-xml-perl und libcompress-raw-zlib-perl.

Falls jemand noch ein aehnliches Problem haben sollte. :)

Benni

#10
Ok!
Freut mich jedenfalls, dass es jetzt bei dir läuft.

Das mit den Paketen habe ich auf die Schnelle nicht ganz durchschaut.
Benötigt werden eigentlich nur XML::Simple, was ja bei dir anscheinend beim unkomprimierten XML von anderen Feeds bereits funktioniert hat.

Für das neu hinzugekommene Dekomprimieren eines gzip-komprimierten Feeds wird IO::Compress::Gunzip benötigt, was meinem Verständnis nach zu den Core-Modulen gehört und somit vorhanden sein sollte. Allerdings ist das wohl auch von Compress::Raw::Zlib abhängig, was dem von dir installierten libcompress-raw-zlib-perl entsprechen dürfte.

Am besten ist wohl, man installiert die benötigten Pakete über apt-get, dann sollten eigentlich auch alle Abhängigkeiten direkt mit installiert werden:

XML::Simple
apt-get install libxml-simple-perl

IO::Compress::Gunzip
apt-get install libio-compress-perl

Werde die Doku entsprechend anpassen.

Update: Inzwischen gibt es hier neue Erkenntnisse zur generellen Verfügbarkeit von IO::Compress::Gunzip, deshalb wird die Doku erst mal nicht aktualisiert.


hillbicks

Ne, das war es leider auch nicht. Hast Du den Feed vom Deutschlandfunk bei Dir noch drin?

FHEM ist diese Nacht wieder abgeschmiert und liess sich erst wieder starten nachdem die rss Eintraege fuers dradio geloescht hatte. :)

Benni

#12
ja, den habe ich auf meinem Entwicklungssystem noch drin und er läuft seit ich die Änderungen eingecheckt auch problemlos.
Der Feed wird alle 10 Minuten abgerufen.
Im Moment bin ich etwas ratlos.  :-\

Steht in deinem log noch was sachdienliches drin, vor dem Abschmieren?

hillbicks

Seltsam....

Steht leider nur das uebliche drin

not well-formed (invalid token) at line 1, column 0, byte 0 at /usr/lib/x86_64-linux-gnu/perl5/5.20/XML/Parser.pm line 187.

Ich kann es heute nacht gerne nochmal mit verbose 5 laufen lassen, in der Hoffnung das wir dann etwas mehr sehen.

Benni

Ich habe mir inzwischen mal eine virtuelle Maschine aufgesetzt, mit einem aktuellen debian Jessie system.

FHEM Version 5.7 installiert (via apt-get von debian.fhem.de) und per update auf den aktuellen Stand gebracht.

XML::Simple mittels
apt-get install libxml-simple-perl
installiert.

Habe mir ein rss mit dem Feed vom Deutschlandfunk angelegt und läuft!
Ich musste, wie angenommen auch keine zusätzlichen Pakete für IO::Compression.Gunzip mehr installieren. War alles schon da!

Ich denke also ein Verbose Log 5 könnte eventuell weiterhelfen, da wir damit die kompletten feed-Daten von jedem Abruf erhalten. Füllt allerdings das Log nicht ganz unerheblich. Ich hoffe mal, das ist kein Problem.

Hast du bei dir wirklich das aktuellste 98_rssFeed-Modul am Laufen?

ein version .*rssFeed.* in der webif-command line sollte folgendes ausgeben:
Zitat
File          Rev   Last Change

98_rssFeed.pm 10258 2015-12-24 15:51:29Z svnbenni