Neus Modul 98_rssFeed - Abrufen von RSS News-Feeds

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

Vorheriges Thema - Nächstes Thema

accessburn

Ja treffer, in der Konsole wurde er sichtbar.

Dann hänge ich gleich die nächste Frage an. Wie müsste ich es anstellen das ich eine Laufschrift (marquee) hinbekomme, in dem Fall für FTUI?
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Benni

Zitat von: accessburn am 11 April 2016, 17:12:54
Wie müsste ich es anstellen das ich eine Laufschrift (marquee) hinbekomme, in dem Fall für FTUI?

Diese Frage gehört wohl in den FTUI-Bereich des Forums. ;)

accessburn

Hätte ja sein können das du sowas weißt :-)
Wenn ich jetzt dort schreibe und du antwortest :-p
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Benni

Zitat von: accessburn am 11 April 2016, 19:14:02
Hätte ja sein können das du sowas weißt :-)

Leider kann ich zu FTUI nichts sagen, da ich das zumindest im Moment nicht einsetze.

Zitat von: accessburn am 11 April 2016, 19:14:02
Wenn ich jetzt dort schreibe und du antwortest :-p

habe ich, aber nur zur weiteren Funktionalität von rssFeed ;D

50watt

#34
Ich möchte, dass FHEM bei einem sichtbaren Überflug der ISS (International space station) reagieren kann (z.B: Licht blinkt).
Von https://spotthestation.nasa.gov/sightings/ gibt es dazu einen RSS-feed, für Wien z.B. https://spotthestation.nasa.gov/sightings/xml_files/Austria_None_Vienna.xml

Dazu habe ich in fhem ein rssFeed device definiert:
   
define rss_iss rssFeed https://spotthestation.nasa.gov/sightings/xml_files/Austria_None_Vienna.xml
attr rss_iss rfEncode utf8
attr rss_iss rfMaxLines 50
attr rss_iss rfReadings description


Das rss_iss device hat nun einige nXX_description readings mit in etwa folgendem Inhalt:
Date: Friday May 27, 2016 <br/> Time: 10:04 PM <br/> Duration: 6 minutes <br/> Maximum Elevation: 30° <br/> Approach: 10° above SSW <br/> Departure: 10° above E <br/>
Das ist genau die Information, die mich interessiert (Datum des sichtbaren Überflugs und Dauer), jedoch noch nicht so aufbereitet, dass fhem darauf reagieren kann.

Wie gehe ich nun weiter vor? Kann/soll man aus den nXX_description readings weitere Readings generieren (z.B. "nextVisibility") und mit diesen readings dann ein at rss_iss:nextVisibility set lamp on auslösen?

Oder ist rssFeed nicht das richtige Modul?
Oder???
RaspberryPi, EnOcean PI
Sonos Play1, Connect
Eltako FT55, FSB61, FAM12, FSR12-4x

Benni

Dafür ist das Modul zwar wirklich nicht gedacht, aber wahrscheinlich lässt es sich doch dafür "mißbrauchen". Ich werde morgen mal ein wenig basteln....  ;)

Benni

#36
Also, hat etwas länger gedauert, aber ich war in der Lage, das rssFeed-Device ohne Modifikation dazu zu mißbrauchen. Und weil mich die Idee, den Überflug der ISS per FHEM zu melden persönlich interessiert hat, habe ich das auch komplett ausgearbeitet.

Außerdem kann man das auch als Beispiel nehmen, wie rssFeed-Daten mit dem rssFeed-Device für FHEM weiter ausgewertet werden können.

Das ganze ist etwas umfangreicher geworden und die Perl- und RegEx-Cracks könnten das wahrscheinlich wesentlich eleganter lösen, aber so funktioniert es jetzt zumindest mal bei mir.

Wie funktionierts:

Als erstes brauchen wir ein entsprechendes rssFeed-Device, das den Feed mit den ISS-Sichtungen für den gewünschten Ort holt (Über https://spotthestation.nasa.gov/)

Weiterhin wird ein Dummy benötigt, der durch ein AT zum Zeitpunkt der Sichtung für die entsprechende Dauer eingeschaltet wird (alles weitere kann dann bequem in Abhängigkeit von diesem Dummy geschaltet werden)

Hier ein list meines rssFeed-Devices (ohne Readings):


Internals:
   DEF        https://spotthestation.nasa.gov/sightings/xml_files/Germany_None_Reutlingen.xml 3600
   INTERVAL   3600
   NAME       rssISS
   NEXTUPDATE Sun Jun  5 21:43:56 2016
   NR         81
   NTFY_ORDER 50-rssISS
   STATE      Sun Jun  5 20:43:55 2016
   TYPE       rssFeed
   URL        https://spotthestation.nasa.gov/sightings/xml_files/Germany_None_Reutlingen.xml
Attributes:
   rfCustomTextPrepFn myISSTimer
   rfEncode   utf8
   rfMaxLines 99
   rfReadings description
   room       02_iss
   webCmd     update


Interessant sind hier v.a. die Attibute rfMaxLines und rfCustomTextPrepFn

Hier noch ein List des Dummys, der geschaltet wird:


Internals:
   NAME       dmISS
   NR         82
   STATE      off
   TYPE       dummy
   Readings:
     2016-06-05 00:42:00   state           off
Attributes:
   room       02_iss
   setList    on off
   useSetExtensions 1


Hierbei wichtig der Name (wird so in der später beschriebenen sub in der 99_MyUtils verwendet) und das Attribut useSetExtensions (sonst funktioniert on-for-timer nicht)

Jetzt brauchen wir noch 2 subs  in der 99_myUtils
Den Code habe ich wieder sehr ausführlich kommentiert, so dass ihn hoffentlich jeder nachvollziehen kann:

Als erstes die Sub, die als Textmodifikations-Fn im rssFeed-Device im Attribut rfCustomTextPrepFn eingetragen wird (s.ol)


sub myISSTimer($$)
{
#Diese sub wird vom ISS-rssFeed als Text-Modifikations-Fn aufgerufen
#(der Name muss dazu im ISS-rssFeed im Attribut rfCustomTextPrepFn
#eingetragen werden)
#Diese Sub gibt den Text des description-Readings an die sub zur
#Erzeugung der ATs weiter
my($texttype,$text) = @_;
if($texttype eq 'description') {
CreateIssTimer($text);
}
#Da die Prozedur ja eigentlich einen Modifizierten Text zurückgibt,
#was aber in diesem Fall gar nicht gewünscht ist, da der Text
#lediglich zur Erzeugung von ATs ausgewertet soll, wird schlicht der
#ursprüngliche Text zurückgegeben.
#Sonst würde das Reading nicht erzeug!
return $text;
}


Und zu guter Letzt noch die sub, die die eigentliche Auswertung der description und das Anlegen der ATs übernimmt:


sub CreateIssTimer($)
{
#Übergeben an diese sub wird die description-Zeile aus dem ISS-rssFeed
#Diese enthält u.a. Zeitpunkt der Sichtungen, sowie die entsprechende Dauer.

#Liegt der darin enthaltene Zeitpunkt der Sichtung nach dem aktuellen Zeitpunkt,
#so wird ein AT angelegt, dass einen Dummy für die entsprechende Sichtungsdauer
#einschält (über on-for-timer)

#Der Name des Dummys ist in der folgenden Zeile angegeben
my $issDummy='dmISS';

#Es wird nur weitergearbeitet, wenn der Dummy auch existiert.
return 0 if(!$defs{$issDummy});

#Der folgende Hash wird benötigt um aus dem Monatskürzel aus der description
#eine Monats-Nummer zu machen
my %m2n=qw(jan 1 feb 2 mar 3 apr 4 may 5 jun 6 jul 7 aug 8 sep 9 oct 10 nov 11 dec 12);

#Aus der description wird nun erst mal entfernt, was stört (Tabs und Newlines)
my ($rstr)=@_;
$rstr=~s/(\n|\t)//g;

#Jetzt werden die einzelnen Teile (Datum, Zeit, Dauer ...) in einen Hash überführt
my @parts = split(/\ <br\/>/,$rstr);
my (%hash,$part);
foreach $part (@parts) {
my ($key, $val) = split /:\s*/,$part,2;
next unless $key;
$hash{$key} = $val;
}

#Als erstes wird die Uhrzeit entsprechend aufbereitet (Umwandlung AM/PM in 24h)
my $tm=$hash{'Time'};
#Log3 undef,3,"iss: Time=$tm";
$tm=~s/:/ /g;
my ($hr,$mn,$pm)=split / /,$tm;
$hr+=12 if($pm eq 'PM');

#Jetzt wird das Datum zur Weiterverarbeitung aufbereitet
my $dt=$hash{'Date'};
$dt=~s/,//g;
my ($wd,$month,$day,$year)=split(/ /,$dt);
#hier wird über den ganz oben definierten Hash der Monatsname in Monatsnummer gewandelt
$month=$m2n{lc $month};

#Jetzt holen wir uns noch die Dauer
my $dr=$hash{'Duration'};
my ($drm,$dun)=split / /,$dr;
#Die Dauer kommt in Minuten, die rechnen wir hier für das at in Sekunden um
my $drs=60*$drm;
#bei "less than 1 minute" enthält die Dauer zunächst 0, dann werden 59 Sekunden angenommen
$drs=59 if($drs<=0);

#Aus den ermittelten Zeitangaben bauen wir uns erst mal einen Namen für
#das zu erzeugende AT. Unter anderem um das AT bei bedarf auch nur einmal
#anzulegen#
my $atname=sprintf("atISS_%d%02d%02d_%02d%02d",$year,$month,$day,$hr,$mn);

#Die Zeitdaten werden für die weiteren Verwendung in epoch umgewandelt
my $rtime=timelocal(0,$mn,$hr,$day,$month-1,$year);

#Wenn der Zeitpunkt der Sichtung nach JETZT ist, wird ein AT angelegt,
#sonst eben nicht
if ($rtime > time()) {
#Das AT wird außerdem nur angelegt, wenn es noch nicht existiert.
if(!$defs{$atname}) {
fhem("define $atname at $rtime set $issDummy on-for-timer $drs");
#Das AT wird im hidden-Room versteckt.
#Anzeigen lassen kann man sich die ISS-ATs im WEB-Frontent von
#FHEM bspw. mit "list atISS.*"
fhem("attr $atname room hidden");
}
}

}


Noch ein paar Hinweise zu den erzeugten ATs:


  • Die ATs werden beim Update des Feeds angelegt, soweit erforderlich. Da die Daten des Feeds nicht so oft aktualisiert werden (> 1d) reicht auch eine Aktualisierung des Feeds 1 mal am Tag (Interval 86400).
    Bei Bedarf auch gerne Manuell über set update
  • Die angelegten ATs sind natürlich nicht Periodisch und werden somit auch nicht in der fhem.cfg  abgelegt, sondern im Statefile.
  • Die ATs werden außerdem im hidden-Room angelegt und können bei Bedarf mittels list atISS.* im FHEMWEB angezeigt werden.


Ich hoffe, ich habe jetzt nichts wesentliches Vergessen.

Viel Spaß damit!

PS: Großartigen Support werde ich dafür aber wohl nicht leisten wollen ;)

kumue

Habe zwei FHEM Instanzen mit FHEM2FHEM verbunden.
Im cloneDummy kommt vom rssFeed nur das state Reading an.
Aktiviere ich zusätzlich das Attribut rfDisplayTickerReadings, bekomme ich noch die Readings tickerMarquee und tickerToast.
Die nXX-Readings werden aber nicht mit übertragen  :(

Läßt sich das einrichten ?

Benni

Für die anderen Readings wird derzeit beim Setzen einfach kein Event generiert.
Schätzungsweise liegt das daran.

Das kann man aber sicherlich ändern ;)
Werde es bei Gelegenheit (per Attribut konfigurierbar) einbauen.

Ansonsten, falls deine 2. FHEM-Installation auch internet hat, würde ich den rssFeed dort einfach regulär redundant einrichten.

kumue

Zitat von: Benni am 18 Juli 2016, 16:20:43

Das kann man aber sicherlich ändern ;)
Werde es bei Gelegenheit (per Attribut konfigurierbar) einbauen.


Das wäre super !  :)
Danke schomal im voraus

Benni

Ich habe die Änderung eingebaut (ab morgen 8:00 Uhr per update verfügbar)

Es gibt ein neues Attribut, mit dem das Feature entsprechend aktiviert werden kann:

Zitat
rfAllReadingsEvents
Wenn dieses Attribut auf 1 gesetzt wird, so werden für ALLE Readings, die während des Feed-Updates erzeugt werden auch entsprechende Events generiert (abh. von den event-on-... Attributen). Von Haus aus werden, v.a. für die Readings mit den Feed-Daten keine Events generiert.

kumue


Shadow3561

Moin,
Erst einmal danke für das tolle Modul.
Ich benutze es um im Info_Panel die aktuellen News anzeigen zu lassen.
Für die Optik wäre es noch super wenn das passende Bild zum aktuellen NewsFeed angezeigt werden könnte.
Dazu müsste man aus dem Reading encodedContent die Url auslesen.
Ist es evtl möglich dies als Reading ins Modul einzubauen?

Ich würde es ja auch selbst versuchen, aber leider habe ich von Perl null Ahnung.


Mit freundlichen Grüßen

Benni

Zitat von: Shadow3561 am 01 Januar 2017, 17:56:51
Ist es evtl möglich dies als Reading ins Modul einzubauen?

Ich schau's mir die Tage mal an.

Shadow3561

#44
Moin,

Das mit dem Reading für die Url vom Bildinhalt habe ich jetzt als Userreading gelöst.

Aber,
mein FHEM hängt etwa alle 3-7 min für etwa 30sec fest seit ich dein Modul nutze.
Alle gesendeten Schaltbefehle dauern dann etwa 20-30 Sekunden und das Aufbauen einer neuen Seite des Webfrontends dauert ewig.
Habe das Verbose von global mal auf 5 gedreht und musste feststellen, dass das Modul ständig Notifys von all meinen definierten Devices empfängt.
Bei Devices mit wenig Readings ist in FHEM nichts zu merken, wenn jedoch ein Notify von meiner FritzBox oder vom SysMon kommt, dann hängt FHEM für mehrere Sekunden fest.
Ich habe allerdings keine derartigen Notifys definiert.
Habe jetzt mal das rssFeed Device gelöscht, und schon läuft FHEM wieder Flüssig.
Evtl findest du ja etwas Zeit mal drüber zu schauen oder jemand anderes kann mal in seinem Log schauen ob es dort auch so ist.


5: MyNewsNTV: MyNewsNTV hat ein notify von KNX_0407 erhalten

5: MyNewsNTV: MyNewsNTV hat ein notify von FritzBox erhalten



Mfg