NEWS
RSS Parser
-
Hallo zusammen,
ich würde gerne einen Newsfeed parsen und für die gängigen Inhalte (title, description) Datenpunkte anlegen. Hat vielleicht jemand so ein script für mich als Muster? Ich bin nicht so der js Experte
Vielen Dank!
Beste Grüße
Griesemer
-
Hallo,
Kannst du die Quelle des rss Feeds nennen?
Dann kann man leichter probieren.
Pix
Gesendet von meinem iPhone mit Tapatalk
-
@pix:Hallo,
Kannst du die Quelle des rss Feeds nennen? `
Ja, klar: https://www.sv98.de/?type=9818Mir geht es um die beiden Tags <title>und <description>.</title>
-
Hallo Griesemer,
ich habe den RSS-Reader mal zusammengebaut. Ich nutze ein ähnliches Skript, das allerdings die Daten in eine json-Tabelle schreibt (von Bluefox). Ich denke aber, eine HTML Tabelle ist besser zur formatieren und ich mag das basic-HTML Widget in VIS lieber
Javascript:
Als erstes das Skript:
/* VIS TV Programm Bringt einen RSS-Feed als Tabelle in ioBroker setzt die Library xml2js voraus (in Javascript Einstellungen zufügen) für http://forum.iobroker.net/viewtopic.php?f=21&t=1683 erstellt: 08.11.2015 von Pix (auf Basis von Bluefox Code) für Griesemer */ createState('RSS-Feed.SV98.Tabelle', {write: true, read: true, name: 'RSS Feed SV98 Tabelle', type: 'string', desc: 'SV98 RSS Feed als HTML Tabelle'}); createState('RSS-Feed.Optin', true, {write: true, read: true, name: 'Optin RSS Feeds abrufen', type: 'boolean', desc: 'Sollen RSS-Feeds abgerufen werden?'}); var link = 'http://www.sv98.de/?type=9818'; var idOptin = 'RSS-Feed.Optin', optin_beschreibung = 'RSS Feed', idFeedTabelle = 'RSS-Feed.SV98.Tabelle'; function RSS_einlesen () { // alle 5 Minuten var optin = getState(idOptin).val; var parseString = require('xml2js').parseString; var request = require('request'); if (optin) request(link, function (error, response, body) { if (!error && response.statusCode == 200) { parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { //log(JSON.stringify(result, null, 2)); if (err) { log("Fehler: " + err); } else { var tabelle =''; for(var i = 0; i <result.rss.channel.item.length; i++)/{/tabelle/+="<tr><td>" result.rss.channel.item[i].title/'</td=""></result.rss.channel.item.length;>'; } tabelle += ' | Titel | Beschreibung | | --- | --- | | ' + result.rss.channel.item[i].description + ' | '; setState(idFeedTabelle, tabelle); } }); } else { log(error); } }); // Ende request log('RSS-Feed ' + link + ' eingelesen'); } schedule("*/10 * * * *", RSS_einlesen); RSS_einlesen(); // Opt In setzen - Logging on( { id: idOptin, change: 'ne' }, function (obj) { if (obj.newState.val === false || obj.newState.val =='false') { log('Opt in Variable <' + optin_beschreibung + ' Push> auf <aus '/+/obj.newstate.val="">gesetzt ', 'info'); } else if (obj.newState.val === true || obj.newState.val =='true') { log('Opt in Variable <' + optin_beschreibung + ' Push> auf <ein '/+/obj.newstate.val="">gesetzt ', 'info'); } });</ein></aus>
Wie man ein Skript im Javascript Adapter einfügt, weißt du doch, oder?
Bei diesem Skript musst du unbedingt noch die Javascript-Adapter Einstellungen anpassen. In ioBroker Admin der Reiter Instanzen. Wo wir schonmal hier sind: lege bitte eine zweite Instanz des Adapter an und nutze diese (wird dann javascript.1). Da hier Daten von einem externen Anbieter kommen, der irgendwann evtl. zB seine Links ändert, kann das Skript dann den Adapter abstürzen lassen. Dann wäre der Rest der Haussteuerung auch bis zum Neustart lahmgelegt. Aus diesem Grund ist eine zweite Instanz (nur für externe Inhalte) sinnvoll.
In den Javascript-Adaptereinstellungen dann bitte unter "zusätzliche npm-Module" xml2js eintragen
Die Einstellungen speichern und kurz warten. Der Adapter wird neu geladen und das npm Modul installiert.
Dann Script Reiter öffnen und ein neues Script mit "+" anlegen und den obigen Code aus dem Spoiler einfügen. Namen des Scripts anpassen, speichern und aktivieren.
Im Log sollten die ersten Daten ankommen.VIS:
Im VIS-Editor kannst du nun ein neues Widget einfügen. Hier mein Vorschlag:[{"tpl":"tplHtml","data":{"visibility-cond":"==","visibility-val":1,"refreshInterval":"0","html":"{javascript.1.RSS-Feed.SV98.Tabelle}"},"style":{"left":"101px","top":"43px","z-index":"20","width":"840px","height":"auto"},"widgetSet":"basic"}]
In diesem Code ist die Javascript Instanz gespeiechert ("javascript.1.***"), die sollte natürlich mit der Instanz, in der dein Script läuft übereinstimmen (siehe oben).
Das Widget hat die Höhe "auto" (Widgeteinstellungen). Es wird recht lang, der RSS-Fed hatte heute 30 Arrayelemente. Wenn du weniger willst, sag bescheid, dann begrenzen wir das.
Die Daten werden, wie gesagt, als HTML Tabelle gespeichert. Diese muss m´noch per CSS formatiert werden. Ausser der Tabelle an sich (table class="rss_feed"), habe ich keine weiteren Klassen vergeben. Damit lässt sich die Tabelle unter anderen Tabellen im VIS-Projekt eindeutig identifizieren. Die einzelnen Felder der Tabelle (x Zeilen, 2 Spalten <) werden mit dem nth-Selektor angesprochen.Überschrift Titel | Überschrift Beschreibung
Titel 1 | Beschreibung 1
Titel 2 | Beschreibung 2
etc.Folgenden Code in den Reiter CSS im VIS Editor einfügen:
/* ----------- RSS Reader -----------------*/ /* Table Klasse = rss_feed */ /* Table head */ /* Überschrift weglassen .rss_feed thead { display:none; } */ /* Titel */ .rss_feed thead th:nth-child(1){ color: red; text-align: left; } /* Beschreibung */ .rss_feed thead th:nth-child(2){ color: yellow; text-align: left; } /* Inhalt des Feeds */ /* Titel */ .rss_feed tr td:nth-child(1){ color: pink; text-align: left; vertical-align: top; margin-bottom: 1em; } /* Beschreibung */ .rss_feed tr td:nth-child(2){ color: orange; text-align: left; vertical-align: top; margin-bottom: 1em; }
Die Farben sind im Klartext und können natürlich leicht angepasst werden. Schätze pink und orange passen nicht so zum Club
Textfamilie und -größe, etc kannst du auch noch hier festlegen. Oder in den Widget Einstellungen (mittlerer Reiter).
So, das wars. Sollte dann vor der Anpassung der Farben und Schrift erstmal so aussehenBei Fragen und Anpassungen einfach melden!
Gruß
Pix -
Hab noch was vergessen!
Im Skript ist eine Optin-Variable verbaut. Das nutze ich sehr viel. Damit kannst du das Importieren der RSS-Feeds ein- und ausschalten.
Zum Beispiel schalte ich sowas aus, wenn
-
es einen Fehler ausgibt
-
ich längere Zeit in Urlaub fahre und die Daten nur zu Hause am Tablet brauche
-
Probleme mit dem Internetzugang bestehen (Router defekt, Einwahlprobleme, Kabel in der Strasse durchtrennt, …)
Das läßt sich leicht von VIS aus machen und du musst nicht in die Admin Oberfläche dafür. Einfach Optin auf false und schon wird das RSS-Einlesen nicht mehr ausgeführt. Passende Widgets gibts ja ohne Ende.
Gruß
Pix
-
-
wow, sensationell - danke Pix!
Eine zweite Instanz des Javascript-Adapters habe ich sowieso schon zum testen eingerichtet. Ich werde das nachher gleich mal ausprobieren.
Nachtrag: habe ich gemacht und läuft perfekt
Besten Gruß
Griesemer
-
Danke, freut mich!
Hab nochmal ne andere Formatierung eingebaut. Für diesen Inhalt ist diese Darstellung besser:
CSS:
/* LAYOUT ÜBEREINANDER ************** */ /* ### Table head (Spaltentitel) ### */ /* Überschrift weglassen */ .rss_feed thead { display:none; } /* ### Inhalt des Feeds ### */ /* beide Spalten */ .rss_feed tr { text-align: left; } /* Tablerow mit Titel */ .rss_feed tr:nth-child(odd) { color: rgba(230,230,250,1); font-size: 110%; font-weight: 800; } /* Tablerow mit inhalt */ .rss_feed tr:nth-child(even) { color: rgba(230,230,250,1); font-size: 80%; } .rss_feed tr:nth-child(even) td { padding-bottom: 2em; }
Scriptteil ersetzen
} else { /* // Titel links, Inhalt rechts var tabelle =''; for(var i = 0; i <result.rss.channel.item.length; i++)/{/tabelle/+="<tr><td>" result.rss.channel.item[i].title/'</td=""></result.rss.channel.item.length;>'; } */ // Titel oben, INhalt darunter (wie in der Zeitung) var tabelle =' | Titel | Beschreibung | | --- | --- | | ' + result.rss.channel.item[i].description + ' | '; for(var i = 0; i <result.rss.channel.item.length; i++)/{/tabelle/+="<tr><td>" result.rss.channel.item[i].title/'</td=""></result.rss.channel.item.length;>'; } tabelle += ' | RSS-Feed | | --- | | ' + result.rss.channel.item[i].description + ' | '; setState(idFeedTabelle, tabelle); }`
Gruß
Pix
-
@pix:Hab nochmal ne andere Formatierung eingebaut. `
Genial Ich sitze seit zwei Stunden an dem Script um genau diese Darstellungsform hinzubekommen - das hat sich ja hiermit erledigt.Tausend Dank!
-
Hallo Pix,
hab deine Anleitung gerade mal mit http://www.tvspielfilm.de/tv-programm/rss/filme.xml ausprobiert.
Funktioniert super !!!
Wie würdest du denn die Anzeige der Spielfilme abhängig von der Uhrzeit des Aufrufes der View einschränken?
Also nur die Filme anzeigen die noch kommen.
Gruß
Holger
-
Hallo Holger,
eine inhaltliche Sortierung ist schon schwierig. Ich könnte die Beschränkung auf weniger Elemente im Array anwenden. Bisher weren die Elemente gezählt und alle nacheinander in die Tabelle eingefügt. Muss ich mir mal ansehen.
Bei mir sieht TV momentan so aus:
Da werden auch jetzt um 2315 noch Tipps von 1605 angezeigt (linke Spalte). Um diese Zeit schaue ich einfach auf die JETZT-Ansicht.Gruß,
Pix
-
Das sieht doch mal klasse aus.
Du hast hier also zwei RSS-Feeds für die Anzeige genutzt.
Eigentlich wollte ich mich mal an einem RPI Adapter heran wagen.
Aber wenn man einmal anfängt im Forum zu schnuppern
Gruß
Holger
-
Hallo Holger,
ja das sind zwei RSS-Feeds, die in zwei separaten Skripts eingelesen werden. Im Unterschied zum obigen Skript, werden die Daten dann im Format für das JSON Tabellenwidget abgespeichert. Ich nutze aber lieber das HTML Tabellenformat allein. Bluefox hat mir im Juni damit geholfen –>> http://forum.iobroker.net/viewtopic.php?f=21&t=880&sid=968c7f80b8566ec431d300d339231afc#p7021
Grüße,
Pix
-
Ich wollte den RSS-Feed-Parser jetzt selbst konstruktiv nutzen (sorry Griesemer, aber der SV98 hat keien Stammplatz auf meinem Wandtablet).
Mir fiel diese Seite auf: http://spotthestation.nasa.gov/sighting … kE0RK4vcUE
Dort kann man sich für seine Stadt die Sichtbarkeit der Internationalen Raumstation als RSS liefern lassen. Dazu noch ein paar iFrames http://www.lizard-tail.com/isana/tracking/ https://www.urthecast.com/live und schon ist die ISS-View fertig :lol:
Habt Ihr auch noch Ideen?
Gruß,
Pix
-
Hallo,
mich lies der RSS-Feed nicht los. Deshalb habe ich noch etwas rumgespielt und doch auf den Inhalt zugegriffen.
Das String-Datum aus der Titelzeile wird umgewandelt und in die Dauer bis zum Überflug berechnet. Vergangene Überflüge werden nicht mehr in die Tabelle eingefügt.
Wie würdest du denn die Anzeige der Spielfilme abhängig von der Uhrzeit des Aufrufes der View einschränken?
Also nur die Filme anzeigen die noch kommen.
Vielleicht kriege ich das beim TV-Programm ja auch noch hin.
Javascript Raumstation von spotthestation.nas.gov einlesen:
ALTE VERSION VON April 2016 (neue Version im nächsten Spoiler)/* VIS RSS ISS Bringt einen RSS-Feed der ISS als Tabelle in ioBroker setzt die Library xml2js voraus (in Javascript Einstellungen zufügen) Pushover-Adapter benötigt für http://forum.iobroker.net/viewtopic.php?f=21&t=1683 erstellt: 09.11.2015 von Pix (auf Basis von Bluefox Code) für Griesemer 10.11.2015 Umbau auf RSS-Fed der ISS als Basis für neue VIS View "ISS" check_aktuell prüft, ob Feld des RSS Feeds ein vergangenes oder zukünftiges Datum liefert zeitbis prüft gibt die Dauer bis zum Überflug als String zurück 01.01.2016 Einlesen auch bei Optin-Zuschaltung 07.01.2016 Optin optimiert 17.01.2016 Meldung, wenn Sichtbarkeit zwischen angegebenen Zeiten "instanz" in Variable gesetzt 25.01.2016 Optin aus leert die Tabelle 26.01.2016 Struktur verbessert 04.02.2016 globale Pushfunktion eingeführt 01.03.2016 Optin Log Subscriptions durch Regexp Funktion in anderem Skript ersetzt 30.03.2016 OptinPush Fehler beseitigt 06.04.2016 Code optimiert Möglichkeit anderer Stationen als ISS berücksichtigt Link geändert (HTTPS) 12.04.2016 Meldungen werden erst kurz vor dem Überflug gesendet 15.04.2016 Berechnung der Differenz aus Überflugzeit und Jetztzeit in ms 19.04.2016 Überprüfung, ob Überflüge existieren, wenn nicht, Ausgabe todo: In einer Funktion die Überflugzeit extrahieren und als Objekt mit den DP veraltet, relativ, total, Stunde, Minute, etc. zurückgeben. Wetter und Sichtweite in Benachrichtigung einbauen */ var logging = false; var instanz = 'javascript.2'; var idAnwesenheit = "javascript.0.Anwesenheit"/*Status Anwesenheit*/, idNachtruhe = "javascript.0.Nachtruhe"/*Nachtruhe*/; var link = 'https://spotthestation.nasa.gov/sightings/xml_files/Germany_None_Bottrop.xml'; // A N P A S S E N!!!!! // ab hier nix mehr ändern createState('RSS-Feed.ISS.Tabelle', { name: 'RSS Feed ISS-Sichtung Tabelle', type: 'string', desc: 'NASA ISS Sichtungen RSS Feed als HTML Tabelle' }); createState('RSS-Feed.Optin', true, { name: 'Optin RSS Feeds abrufen', type: 'boolean', desc: 'Sollen RSS-Feeds abgerufen werden?' }); createState('Optin.Dienste.RSS.ISS.Sichtbarkeit.Push', true, { name: 'Optin Sichtbarkeit ISS Push melden', desc: 'Sollen die heutige ISS Sichtbarkeit per Pushnachricht gemeldet werden?', type: 'boolean' }); createState('Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Anwesenheit', 1, { name: 'Priorität der Pushmeldung bei Anwesenheit', desc: 'Mit welcher Priorität soll die Nachricht bei Anwesenheit gesendet werden?', type: 'number' }); createState('Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Nachtruhe', 1, { name: 'Priorität der Pushmeldung bei Nachtruhe', desc: 'Mit welcher Priorität soll die Nachricht bei nachtruhe gesendet werden?', type: 'number' }); createState('Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Abwesenheit', 1, { name: 'Priorität der Pushmeldung bei Abwesenheit', desc: 'Mit welcher Priorität soll die Nachricht bei Abwesenheit gesendet werden?', type: 'number' }); var idOptin = instanz + '.RSS-Feed.Optin', idOptinPush = instanz + '.Optin.Dienste.RSS.ISS.Sichtbarkeit.Push', idOptinPushPrioAnwesenheit = instanz + '.Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Anwesenheit', idOptinPushPrioNachtruhe = instanz + '.Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Nachtruhe', idOptinPushPrioAbwesenheit = instanz + '.Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Abwesenheit', idFeedTabelle = instanz + '.RSS-Feed.ISS.Tabelle'; function meldung_push (text, titel, prio) { var optin_push = getState(idOptinPush).val; if (optin_push) { // wenn Optin var dienst = 1; // Pushover push(dienst, text, titel, prio); } // Ende Optin } function sichtbarkeit_melden (ueberflugzeit, station) { var anwesenheit = getState(idAnwesenheit).val, nachtruhe = getState(idNachtruhe).val; // Wenn zwischen zwei Uhrzeiten, dann Pushmeldung // Nur bei Dunkelheit // ggf Variablen (wenn zwischen Astro Sonnenuntergang und Uhrzeit) var pushprio, betreff = 'ioBroker Meldung', nachricht = 'Die ' + station + ' überfliegt heute um ' + formatDate(ueberflugzeit, "SS:mm"); // prio festlegen if (anwesenheit == 1) { // anwesend if (nachtruhe === 0) pushprio = getState(idOptinPushPrioAnwesenheit).val; // wach am Tag else pushprio = getState(idOptinPushPrioNachtruhe).val; } else pushprio = getState(idOptinPushPrioAbwesenheit).val; var jetzt = new Date(); // ******************** Meldung erst kurz vor Überflug var diff = ueberflugzeit - jetzt; var tag = Math.floor(diff / (1000*60*60*24)); diff = diff % (1000*60*60*24); var std = Math.floor(diff / (1000*60*60)); diff = diff % (1000*60*60); var min = Math.floor(diff / (1000*60)); diff = diff % (1000*60); log('Differenz berechnen: Überflugzeit (' + ueberflugzeit + ') - Jetzt (' + jetzt + ') = ' + (ueberflugzeit - jetzt) + 'ms, also ' + tag + ' Tage ' + std + ' std ' + min + ' min'); //1h = 60min = 60* 60 Sekunden = 3.600 * 1.000 ms = 3.600.000ms // Meldung pünktlich absetzen nach Millisekunden nachricht += ', also in ' + min + ' Minuten Ihren Wohnort!'; if (ueberflugzeit - jetzt <= (3600000 / 2) ) { // 1/2h meldung_push(nachricht, betreff, pushprio); } } function uhrzeit_extrahieren (beschreibung) { /* Beispiel Input <description>Date: Sunday Jan 17, 2016 Time: 5:13 AM Duration: less than 1 minute Maximum Elevation: 20° Approach: 20° above ENE Departure: 17° above ENE</description> */ var beschreibung_nur_uhrzeit_grob = beschreibung.split('Time: '); // Teilen vor 'Time: ' if (logging) log('nach Split 1: "' + beschreibung_nur_uhrzeit_grob[1] + '"'); var beschreibung_nur_uhrzeit_grob2 = beschreibung_nur_uhrzeit_grob[1].split(' '); // Teilen bei Leerzeichen zwischen Zeit und AM/PM if (logging) log('nach Split 2: "' + beschreibung_nur_uhrzeit_grob2[0] + '"'); var beschreibung_tageszeit = beschreibung_nur_uhrzeit_grob2[1]; //.substring(0,2); // extrahiert AM oder PM, Beispiel AM if (logging) log('Tagezeit: ' + beschreibung_tageszeit); var beschreibung_nur_uhrzeit_fein = beschreibung_nur_uhrzeit_grob2[0].split(':'); var beschreibung_stunde = beschreibung_nur_uhrzeit_fein[0]; // Beispiel 5 var beschreibung_minute = beschreibung_nur_uhrzeit_fein[1]; // Beispiel 13 var minute = parseInt(beschreibung_minute); var stunde_amerikanisch = parseInt(beschreibung_stunde); var stunde = beschreibung_tageszeit == 'PM' ? stunde_amerikanisch + 12 : stunde_amerikanisch; if (logging) log('Stunde: ' + stunde_amerikanisch + ' ' + beschreibung_tageszeit + ' > ' + stunde + ' Minute: ' + minute); var uhrzeit_ohne_datum = new Date (); uhrzeit_ohne_datum.setHours(stunde); uhrzeit_ohne_datum.setMinutes(minute); if (logging) log(uhrzeit_ohne_datum); // ist die Zeit heute return (uhrzeit_ohne_datum); } function check_heute_noch(zeit_ueberflug) { var heute = new Date(); /*var jahr = heute.getFullYear(); var monat = heute.getMonth(); var tag = heute.getDate(); var std = heute.getHours(); var min = heute.getMinutes(); var jetzt = new Date(jahr, monat, tag, std, min);*/ var heute_noch = (zeit_ueberflug > heute /*jetzt*/) ? true : false; return(heute_noch); } function datum_station_extrahieren (titelzeile) { // Übergabe String wie "2015-11-05 ISS Sighting" var titelzeile_array = titelzeile.split(' '); // String nach Leerzeichen trennen und nur das Datum am Anfang auslösen var datum_sichtung_string = titelzeile_array[0].split('-'); // ersten Teil des Strings nach Bindestrich trennen var datum_sichtung = new Date(datum_sichtung_string[0],datum_sichtung_string[1]-1,datum_sichtung_string[2]); // An -1 beim Monat denken (0=Jan, 11=Dez) var station_sichtung = titelzeile_array[1]; // ISS oder anderer Stationsname return({ 'DatumSichtung': datum_sichtung, 'StationSichtung': station_sichtung }); } function zeitbis (datum_ueberflug) { // // Übergabe "Thu Nov 19 2015 00:00:00 GMT+0100" -> heute; morgen; übermorgen; noch X Tage var heute = new Date(); heute.setHours(0); // Es gilt nur das Datum, daher Mitternacht heute.setMinutes(0); heute.setSeconds(0); heute.setMilliseconds(0); heute = heute.getTime(); ueberflug = datum_ueberflug.getTime(); var tagesdauer = 1000 * 60 * 60 * 24; // 1000ms * 60 = 1min * 60 = 1std * 24 = 1Tag var restzeit = (ueberflug - heute) / tagesdauer; var restzeit_string; switch (restzeit) { case 0: restzeit_string = 'heute'; break; case 1: restzeit_string = 'morgen'; break; case 2: restzeit_string = 'übermorgen'; break; default: restzeit_string = 'in ' + restzeit + ' Tagen'; break; } //log('Zeit bis Überflug: ' + restzeit); return(restzeit_string); } function check_aktuell (datum_ueberflug){ // Übergabe "Thu Nov 19 2015 00:00:00 GMT+0100" var heute = new Date(); heute.setHours(0); // Es gilt nur das Datum, daher Mitternacht heute.setMinutes(0); heute.setSeconds(0); heute.setMilliseconds(0); var vorbei; if (datum_ueberflug < heute) vorbei = true; else vorbei = false; return(vorbei); } function RSS_einlesen () { // alle 5 Minuten var optin = getState(idOptin).val; var parseString = require('xml2js').parseString; var request = require('request'); if (optin) request(link, function (error, response, body) { if (!error && response.statusCode == 200) { parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { //log(JSON.stringify(result, null, 2)); if (err) log("Fehler: " + err, 'error'); else { // Titel oben, Inhalt darunter (wie in der Zeitung) var tabelle =''; var titelzeile, // Inhalt des RSS-Feeds title datum_ueberflug, // Überflug im Datumsformat datum_relativ, // Dauer bis Überflug als String veraltet, // true;false -> Verganenheit oder Zukunft station; // Name der Station (ISS, ...), wird ind er Titelzeile geliefert if (typeof result.rss.channel.item !== 'undefined') { // prüfen, ob result.rss.channel.item existiert for(var i = 0; i <result.rss.channel.item.length; 3/19/2015/i++)/{/titelzeile="result.rss.channel.item[i].title;" datum_ueberflug="datum_station_extrahieren(titelzeile).DatumSichtung;" mache/aus/"2015-11-05/iss/sighting"/sowas/"thu/nov/00:00:00/gmt+0100"/station="datum_station_extrahieren(titelzeile).StationSichtung;" "iss"/veraltet="check_aktuell(datum_ueberflug);" alte/einträge,/älter/als/mitternacht/nicht/zeigen./heutige,/bereits/vergangene/aber/schon/zeigen/datum_relativ="zeitbis(datum_ueberflug);" heute,/morgen,/übermorgen,/in/tagen,/.../wenn/veraltet,/eintrag/anfügen/if/(!veraltet)/tabelle/+="<tr><td>" '/('/')</td=""></result.rss.channel.item.length;>'; // wenn Überflug heute, dann Überflugzeit prüfen und ggf. melden if (datum_relativ === 'heute') { zeit_ueberflug = uhrzeit_extrahieren(result.rss.channel.item[i].description); // übergibt extrahiertes Datum und Beschreibung mit Zeit info if (logging) log('Zeit Überflug: ' + formatDate(zeit_ueberflug)); // genaue Flugzeit in Datumformat // prüfen obe Überflugzeit in der Zukunft ist, sonst keine Meldung if (check_heute_noch(zeit_ueberflug)) sichtbarkeit_melden(zeit_ueberflug, station); } } } else { tabelle += ''; log('Derzeit keine Überflüge'); } tabelle += ' <caption>Anstehende Sichtungen</caption> | RSS-Feed | | --- | | ' + result.rss.channel.item[i].description + ' | | Derzeit keine Überflüge | '; setState(idFeedTabelle, tabelle); } }); } else log(error, 'error'); log('RSS-Feed ' + link + ' eingelesen'); }); // Ende request } schedule("*/30 * * * *", RSS_einlesen); RSS_einlesen(); // ------------------------------------------------------------------ // Opt In setzen - Logging on(idOptin, function (obj) { log('Opt in Variable <rss-feed iss-Überflüge="">auf <' + obj.state.val + '> gesetzt ', 'info'); if (obj.state.val) RSS_einlesen(); else setState(idFeedTabelle, ' '); });</rss-feed>
Skript von Januar 2018
Neue Version des Skripts aus Januar 2018 löst alte Version von April 2016 ab:/* VIS RSS ISS Bringt einen RSS-Feed der ISS als Tabelle in ioBroker setzt die Library xml2js voraus (in Javascript Einstellungen zufügen) Pushover-Adapter benötigt für http://forum.iobroker.net/viewtopic.php?f=21&t=1683 erstellt: 09.11.2015 von Pix (auf Basis von Bluefox Code) für Griesemer 10.11.2015 Umbau auf RSS-Fed der ISS als Basis für neue VIS View "ISS" check_aktuell prüft, ob Feld des RSS Feeds ein vergangenes oder zukünftiges Datum liefert relativerTag prüft gibt die Dauer bis zum Überflug als String zurück 01.01.2016 Einlesen auch bei Optin-Zuschaltung 07.01.2016 Optin optimiert 17.01.2016 Meldung, wenn Sichtbarkeit zwischen angegebenen Zeiten "instanz" in Variable gesetzt 25.01.2016 Optin aus leert die Tabelle 26.01.2016 Struktur verbessert 04.02.2016 globale Pushfunktion eingeführt 01.03.2016 Optin Log Subscriptions durch Regexp Funktion in anderem Skript ersetzt 30.03.2016 OptinPush Fehler beseitigt 06.04.2016 Code optimiert Möglichkeit anderer Stationen als ISS berücksichtigt Link geändert (HTTPS) 12.04.2016 Meldungen werden erst kurz vor dem Überflug gesendet 15.04.2016 Berechnung der Differenz aus Überflugzeit und Jetztzeit in ms 19.04.2016 Überprüfung, ob Überflüge existieren, wenn nicht, Ausgabe 22.09.2016 Pushsafer eingepflegt 28.09.2016 Text2Speech State eingefügt 08.10.2016 Grudnlegende Änderungen: Berechnungen nur in ms Ausgabe des relativen Datums (heute, morgen, etc.) korrigiert mehr Verbesserungen (Array mit Datenanlage begonnen) 09.10.2016 Umbau Skript: Daten werden alle 30min geparst, aber das Ergebnis wird jede Minute ausgewertet (für aktuelle relative Zeitangabe [5min bis X]) 16.10.2016 Errechnet zeitBis nun in einer extra Funktion relativerTag 21.04.2017 Code angepasst, für den Fall keiner Überflüge 30.05.2017 neue VIS-View, jetzt Optin RSS-Feed pro Feed. Also hier neues Objekt RSS ISS Optin createStates, roles, idVariablen Fehler in Optin subscription 22.01.2018 nach US-Shutdown try & catch zur Fehlervermeidung eingefügt Fucntion readRSS korrigiert todo: Wetter und Sichtweite in Benachrichtigung einbauen createStates() nochmal checken (bei forceCreation gibt es Fehler) */ const forceCreation = false; const logging = false; const idAnwesenheit = "javascript.0.Anwesenheit"/*Status Anwesenheit*/, idNachtruhe = "javascript.0.Nachtruhe"/*Nachtruhe*/; const link = 'https://spotthestation.nasa.gov/sightings/xml_files/Germany_None_Munchen.xml'; const idFeedTabelle = 'RSS-Feed.ISS.Tabelle', idResult = 'RSS-Feed.ISS.Result', idText2Speech = 'RSS-Feed.ISS.text2speech', idZeit = 'RSS-Feed.ISS.Zeit', idZeitString = 'RSS-Feed.ISS.ZeitString', idOptin = 'RSS-Feed.ISS.Optin', idOptinPush = 'Optin.Dienste.RSS.ISS.Sichtbarkeit.Push', idOptinPushPrioAnwesenheit = 'Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Anwesenheit', idOptinPushPrioNachtruhe = 'Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Nachtruhe', idOptinPushPrioAbwesenheit = 'Optin.Dienste.RSS.ISS.Sichtbarkeit.Push.Prioritaet.Abwesenheit'; // ab hier nix mehr ändern createState(idFeedTabelle, " ", forceCreation, { name: 'RSS Feed ISS-Sichtung Tabelle', type: 'string', desc: 'NASA ISS Sichtungen RSS Feed als HTML Tabelle', role: 'html' }); createState(idOptin, true, forceCreation, { name: 'Optin RSS Feeds abrufen', type: 'boolean', def: true, desc: 'Sollen RSS-Feeds abgerufen werden?', role: 'switch' }); createState(idResult, " ", forceCreation, { name: 'Nächste ISS-Sichtung JSON', type: 'string', desc: 'NASA ISS Sichtungen - Ergebnis der geparsten Webseite', role: 'json' }); createState(idText2Speech, " ", forceCreation, { name: 'Nächste ISS-Sichtung Ansage', type: 'string', desc: 'NASA ISS Sichtungen - nächste Sichtung optimiert für die Sprachausgabe', role: 'text' }); createState(idZeit, 1, forceCreation, { name: 'Nächste ISS-Sichtung (Zeit)', type: 'number', desc: 'NASA ISS Sichtungen - nächste Sichtung' }); createState(idZeitString, " ", forceCreation, { name: 'Nächste ISS-Sichtung (Zeit) Zeichenkette', type: 'string', desc: 'NASA ISS Sichtungen - nächste Sichtung', role: 'text' }); createState(idOptinPush, true, forceCreation,{ name: 'Optin Sichtbarkeit ISS Push melden', def: true, desc: 'Sollen die heutige ISS Sichtbarkeit per Pushnachricht gemeldet werden?', type: 'boolean', role: 'switch' }); createState(idOptinPushPrioAnwesenheit, 1, forceCreation, { name: 'Priorität der Pushmeldung bei Anwesenheit', desc: 'Mit welcher Priorität soll die Nachricht bei Anwesenheit gesendet werden?', def: 1, type: 'number' }); createState(idOptinPushPrioNachtruhe, 1, forceCreation, { name: 'Priorität der Pushmeldung bei Nachtruhe', def: 1, desc: 'Mit welcher Priorität soll die Nachricht bei nachtruhe gesendet werden?', type: 'number' }); createState(idOptinPushPrioAbwesenheit, 1, forceCreation, { name: 'Priorität der Pushmeldung bei Abwesenheit', def: 1, desc: 'Mit welcher Priorität soll die Nachricht bei Abwesenheit gesendet werden?', type: 'number' }); function meldung_push (text, titel, prio) { var optin_push = getState(idOptinPush).val; if (optin_push) { // wenn Optin var dienst = 2; //4 var empfaenger = 'j'; push(dienst, text, titel, prio, empfaenger); } // Ende Optin } function zeitBis(ueberflugzeit) { var jetzt = new Date(); // ******************** Meldung erst kurz vor Überflug if (logging) log('FZ: ' + ueberflugzeit); if (logging) log('JZ: ' + jetzt.getTime()); if (logging) log('jetzt: ' + jetzt); var diff = ueberflugzeit - jetzt.getTime(); var tag = Math.floor(diff / (1000*60*60*24)); diff = diff % (1000*60*60*24); var std = Math.floor(diff / (1000*60*60)); diff = diff % (1000*60*60); var min = Math.floor(diff / (1000*60)); diff = diff % (1000*60); return({ 'tag': tag, 'std': std, 'min': min + 1 }); } function meldeUeberflug (ueberflugzeit, station, relativerTag) { //minütlicher check if (logging) log('ÜZeit: ' + ueberflugzeit); var anwesenheit = getState(idAnwesenheit).val, nachtruhe = getState(idNachtruhe).val; // Wenn zwischen zwei Uhrzeiten, dann Pushmeldung // Nur bei Dunkelheit // ggf Variablen (wenn zwischen Astro Sonnenuntergang und Uhrzeit) var pushprio, betreff = 'ioBroker Meldung', nachricht = 'Die ' + station + ' überfliegt ' + relativerTag + ' um ' + formatDate(ueberflugzeit, "SS:mm"); // prio festlegen if (anwesenheit == 1) { // anwesend if (nachtruhe === 0) pushprio = getState(idOptinPushPrioAnwesenheit).val; // wach am Tag else pushprio = getState(idOptinPushPrioNachtruhe).val; } else pushprio = getState(idOptinPushPrioAbwesenheit).val; var tag = zeitBis(ueberflugzeit).tag; var std = zeitBis(ueberflugzeit).std; var min = zeitBis(ueberflugzeit).min; var jetzt = new Date (); if (logging) log('Differenz berechnen: Überflugzeit (' + ueberflugzeit + ') - Jetzt (' + jetzt.getTime() + ') = ' + (ueberflugzeit - jetzt.getTime()) + 'ms, also ' + tag + ' Tage ' + std + ' std ' + min + ' min'); //1h = 60min = 60* 60 Sekunden = 3.600 * 1.000 ms = 3.600.000ms // Meldung pünktlich absetzen nach Millisekunden nachricht += ', also in ' + min + ' min Ihren Wohnort!'; if (ueberflugzeit - jetzt <= (3600000 / 2) ) { // 1/2h if (min === 30 || min === 10 || min === 1) meldung_push(nachricht, betreff, pushprio); // nur 30, 5 und 1 Minute vor Überflug melden } } function extrahiereTitelzeile (titelzeile) { // Übergabe String wie "2015-11-05 ISS Sighting" var titelzeile_array = titelzeile.split(' '); // String nach Leerzeichen trennen und nur das Datum am Anfang auslösen var datum_sichtung_string = titelzeile_array[0].split('-'); // ersten Teil des Strings nach Bindestrich trennen var datum_sichtung = new Date(datum_sichtung_string[0],datum_sichtung_string[1]-1,datum_sichtung_string[2]); // An -1 beim Monat denken (0=Jan, 11=Dez) var station_sichtung = titelzeile_array[1]; // ISS oder anderer Stationsname if (logging) log('Datum ohne Uhrzeit: ' + datum_sichtung + ' oder ' + datum_sichtung.getTime() + ' ms'); return({ 'DatumSichtung': datum_sichtung, 'StationSichtung': station_sichtung }); } function extrahiereBeschreibung (beschreibung) { /* Beispiel Input <description>Date: Sunday Jan 17, 2016 Time: 5:13 AM Duration: less than 1 minute Maximum Elevation: 20° Approach: 20° above ENE Departure: 17° above ENE</description> */ var beschreibung_nur_uhrzeit_grob = beschreibung.split('Time: '); // Teilen vor 'Time: ' if (logging) log('nach Split 1: "' + beschreibung_nur_uhrzeit_grob[1] + '"'); var beschreibung_nur_uhrzeit_grob2 = beschreibung_nur_uhrzeit_grob[1].split(' '); // Teilen bei Leerzeichen zwischen Zeit und AM/PM if (logging) log('nach Split 2: "' + beschreibung_nur_uhrzeit_grob2[0] + '"'); var beschreibung_tageszeit = beschreibung_nur_uhrzeit_grob2[1]; //.substring(0,2); // extrahiert AM oder PM, Beispiel AM if (logging) log('Tagezeit: ' + beschreibung_tageszeit); var beschreibung_nur_uhrzeit_fein = beschreibung_nur_uhrzeit_grob2[0].split(':'); var beschreibung_stunde = beschreibung_nur_uhrzeit_fein[0]; // Beispiel 5 var beschreibung_minute = beschreibung_nur_uhrzeit_fein[1]; // Beispiel 13 var minute = parseInt(beschreibung_minute); var stunde_amerikanisch = parseInt(beschreibung_stunde); var stunde = beschreibung_tageszeit == 'PM' ? stunde_amerikanisch + 12 : stunde_amerikanisch; if (logging) log('Stunde: ' + stunde_amerikanisch + ' ' + beschreibung_tageszeit + ' > ' + stunde + ' Minute: ' + minute); var uhrzeit_ohne_datum = new Date (0); uhrzeit_ohne_datum.setHours(stunde); uhrzeit_ohne_datum.setMinutes(minute); if (logging) log('Uhrzeit ohne Datum: ' + uhrzeit_ohne_datum + ' oder ' + uhrzeit_ohne_datum.getTime() + ' ms (an Sommerzeit denken)'); // ist die Zeit ohne Datum (1.1.1970) return({ 'UhrzeitSichtung': uhrzeit_ohne_datum // todo weitere Daten parsen // Elevation // Duration // Approch & Departure }); } function relativerTag (datum_ueberflug) { // Übergabe Zeitpunkt in ms seit 1.1.1970 -> heute; morgen; übermorgen; noch X Tage var heute = new Date(); heute.setHours(0); // Es gilt nur das Datum, daher Mitternacht heute.setMinutes(0); heute.setSeconds(0); heute.setMilliseconds(0); heute = heute.getTime(); var ueberflug = new Date(datum_ueberflug); /*ueberflug.setHours(0); ueberflug.setMinutes(0); ueberflug.setMilliseconds(0); ueberflug = ueberflug.getTime();*/ var tagesdauer = 1000 * 60 * 60 * 24; // 1000ms * 60 = 1min * 60 = 1std * 24 = 1Tag var restzeit = (ueberflug - heute) / tagesdauer; var restzeit_string; switch (restzeit) { case -2: restzeit_string = 'vorgestern'; break; case -1: restzeit_string = 'gestern'; break; case 0: restzeit_string = 'heute'; break; case 1: restzeit_string = 'morgen'; break; case 2: restzeit_string = 'übermorgen'; break; default: if (restzeit > 2) restzeit_string = 'in ' + restzeit + ' Tagen'; if (restzeit < 0) restzeit_string = 'vor ' + restzeit*(-1) + ' Tagen'; break; } //log('Zeit bis Überflug: ' + restzeit); return(restzeit_string); } function checkVeraltet (zeitpunkt_ueberflug){ // Übergabe Zeitpunkt in ms seit 1.1.1970 var jetzt = new Date(); var vorbei; if (jetzt > zeitpunkt_ueberflug) vorbei = true; else vorbei = false; return(vorbei); } function baueSprachausgabe (ueberflugzeit, station, relativerTag) { var tag = zeitBis(ueberflugzeit).tag; var std = zeitBis(ueberflugzeit).std; var min = zeitBis(ueberflugzeit).min; if (logging) log('Differenz berechnen (Sprachausgabe): Überflugzeit (' + ueberflugzeit + ') - Jetzt (' + Date.now() + ') = ' + (ueberflugzeit - Date.now()) + 'ms, also ' + tag + ' Tage ' + std + ' std ' + min + ' min'); // Text2Speech Aufbereitung var ansage_tag = (tag > 1 ) ? tag + ' Tagen' : ''; ansage_tag = (tag === 1) ? 'einem Tag' : ansage_tag; ansage_tag = (tag === 0) ? '' : ansage_tag; var ansage_std = (std > 1 ) ? std + ' Stunden' : ''; ansage_std = (std === 1) ? 'einer Stunde' : ansage_std; ansage_std = (std === 0) ? '' : ansage_std; var ansage_min = (min > 1 ) ? min + ' Minuten' : ''; ansage_min = (min === 1) ? 'einer Minute' : ansage_min; ansage_min = (min === 0) ? '' : ansage_min; var nachricht = 'Die ' + station + ' überfliegt ' + relativerTag + ' um ' + formatDate(ueberflugzeit, "SS:mm") + ' ihren Wohnort. Das ist in ' + ansage_tag + ' ' + ansage_std + ' ' + ansage_min + '.'; var ansage = (ansage_tag !== 0 && ansage_std !== 0 && ansage_min !== 0) ? nachricht : 'Derzeit keine Überflüge'; setState(idText2Speech, ansage); } function checkResult () { // jede Minute die bereits gespeicherten Daten der Webseite einlesen und mit aktueller Zeit vergleichen var optin = getState(idOptin).val; var result = JSON.parse(getState(idResult).val); if (optin) { // Array mit errechneten Zeiten und Daten anlegen // flugzeit absolut (ms), flugzeit datum, fluzeit uhrzeit, relativer tag (heute, morgen, ...), veraltet (false/true) var flugzeit_array = []; // HTML Ausgabe für VIS // Titel oben, Inhalt darunter (wie in der Zeitung) var tabelle =''; var titelzeile, // Inhalt des RSS-Feeds in title beschreibung, // Inhalt des RSS-Feeds in description datum_ueberflug, // Überflug als Datum-Objekt datum_relativ, // Dauer bis Überflug als String uhrzeit_ueberflug, // Uhrzeit, bzw. ms seit Mitternacht des Flugtages zeitpunkt_ueberflug, // genauer Zeitpunkt in ms seit 1.1.1970 veraltet, // true;false -> Überflug in der Vergangenheit station; // Name der Station (ISS, ...), wird in der Titelzeile geliefert var next_ueberflug_string = ""; var next_ueberflug_ms = 0; if (typeof result.rss.channel.item !== 'undefined') { // prüfen, ob result.rss.channel.item existiert for(var i = 0; i < result.rss.channel.item.length; i++) { // JSON-Result durchgehen titelzeile = result.rss.channel.item[i].title; // "2016-10-07 ISS Sighting" beschreibung = result.rss.channel.item[i].description; if (logging) log('############ ' + (i+1) + '. Eintrag im ISS-Plan ##################'); datum_ueberflug = extrahiereTitelzeile(titelzeile).DatumSichtung; // mache aus "2015-11-05 ISS Sighting" sowas "Thu Nov 05 2015 00:00:00 GMT+0100" station = extrahiereTitelzeile(titelzeile).StationSichtung; // mache aus "2015-11-05 ISS Sighting" sowas "ISS" datum_relativ = relativerTag(datum_ueberflug); // heute, morgen, übermorgen, in 3 Tagen, ... uhrzeit_ueberflug = extrahiereBeschreibung(beschreibung).UhrzeitSichtung; // Kommendes Datum und Uhrzeit der Überflüge im Array (wobei Datum bereits aus Titelzeile kommt) uhrzeit_ueberflug.setHours(uhrzeit_ueberflug.getHours()+1); // eine Stunde Unterschied zwischen CET und CEST zeitpunkt_ueberflug = datum_ueberflug.getTime() + uhrzeit_ueberflug.getTime(); // Datum UND Uhrzeit seit Mitternacht, also gesamte Zeit seit 1.1.1970 veraltet = checkVeraltet(zeitpunkt_ueberflug); // Zeitpunkt schon vorbei? boolean; // HTML: wenn nicht veraltet, Eintrag anfügen // todo: description auch noch aufschlüsseln (Elevation, Duration, etc.) if (!veraltet) tabelle += ''; // Array: Überflugzeit, Überflug Datum Mitternacht, Überflug Uhrzeit ohne Datum, Zeit bis Überflug in relativen Tagen (heute, morgen, übermorgen, in X Tagen), Überflug vorbei (boolean), Stationsname flugzeit_array[i] = [zeitpunkt_ueberflug, datum_ueberflug.getTime(), uhrzeit_ueberflug.getTime(), datum_relativ, veraltet, station ]; if (logging) { log('_____ISS ARRAY ' + i + ' _______'); log('Überflugzeit in ms: ' + flugzeit_array[i][0] + ' ' + formatDate(flugzeit_array[i][0], "DD.MM.YYYY SS:mm") ); log('Überflugzeit Datum: ' + flugzeit_array[i][1] + ' ' + formatDate(flugzeit_array[i][1], "DD.MM.YYYY SS:mm") ); log('Überflugzeit Uhrzeit: ' + flugzeit_array[i][2] + ' ' + formatDate(flugzeit_array[i][1], "DD.MM.YYYY SS:mm") ); log('Überflugzeit relativ: ' + flugzeit_array[i][3]); log('Überflugzeit veraltet?: ' + flugzeit_array[i][4]); log('Überflugzeit Station: ' + flugzeit_array[i][5]); log('_____ENDE ISS ARRAY _____'); } } // Ende FOR-Schleife (i) // Array durchgehen, bis nicht mehr veraltet // nur nächsten Überflug abspeichern (auch wenn noch andere danach kommen) // evtl dazu array sortieren nach überflugzeit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< http://www.w3schools.com/jsref/jsref_sort.asp for (var next = 0; next < flugzeit_array.length; next++) { // Array mit Überflugzeiten hochzählen var pattern = /\d/g; // prüfen, ob nur nummern drin stehen (Zeit in ms), Plausibilität if (pattern.test(flugzeit_array[next][0])) { if (!flugzeit_array[next][4]) { // wenn nicht veraltet if (logging) log('###### nächster Überflug der ' + flugzeit_array[next][5]); next_ueberflug_ms = (flugzeit_array[next][0] > 0) ? flugzeit_array[next][0] : 0; // setState(idZeit, next_ueberflug_ms); next_ueberflug_string = (next_ueberflug_ms > 0) ? flugzeit_array[next][3] + ', ' + formatDate(next_ueberflug_ms, "SS:mm") : "keine Überflüge"; // setState(idZeitString, next_ueberflug_string); if (flugzeit_array[next][3] === 'heute' || flugzeit_array[next][3] === 'morgen') meldeUeberflug (next_ueberflug_ms, station, flugzeit_array[next][3]); // prüfen, ob Meldung abzusetzen ist baueSprachausgabe(flugzeit_array[next][0], flugzeit_array[next][5], flugzeit_array[next][3]); break; // abbrechen, sobald erster Flug gefunden, welcher noch kommt } } } // Ende FOR (next) } else { tabelle += ''; if (logging) log('Derzeit keine Überflüge'); } tabelle += ' <caption>Anstehende Sichtungen</caption> | RSS-Feed | | --- | | ' + datum_relativ + ' (' + station + ') | | ' + result.rss.channel.item[i].description + ' | | Derzeit keine Überflüge | '; // HTML-Tabelle schließen setState(idFeedTabelle, tabelle); setState(idZeit, next_ueberflug_ms); setState(idZeitString, next_ueberflug_string); if (logging) log('ISS Daten aktualisiert'); // bedenke: minütliches log } // Ende Optin } function readRSS () { // nur alle 30 Minuten Webseite einlesen var optin = getState(idOptin).val; var parseString = require('xml2js').parseString; var request = require('request'); if (optin) try { request(link, function (error, response, body) { if (!error && response.statusCode == 200) { error_flag = false; parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, ergebnis) { //log(JSON.stringify(ergebnis, null, 2)); if (err) { log("Fehler: " + err, 'error'); setState(idResult, " "); error_flag = true; } else { setState(idResult, JSON.stringify(ergebnis, null, 2)); // Ergebnis des Parsens abspeichern log('RSS-Feed ' + link + ' eingelesen'); error_flag = false; checkResult(); } }); } else { log("Fehler Request: " + error, 'error'); // Falls Nasa-Seite nicht erreichbar error_flag = true; } }); // Ende request } catch (fehler) { log('Fehler (try): ' + fehler, 'error'); error_flag = true; } } var error_flag = false; // checkResult ruft bereits abgespeicherte Daten auf. Falls diese Daten falsch/kaputt sind, error_flag true readRSS(); schedule("*/30 * * * *", readRSS); // Webseite aus dem Netz einlesen schedule("*/1 * * * *", function () { if (error_flag) { setState(idText2Speech, "Es sind keine Flugdaten abrufbar."); setState(idFeedTabelle, " Es gibt Probleme beim Einlesen der Daten "); setState(idResult, " "); setState(idZeit, 1); setState(idZeitString, " "); } else checkResult(); // Eingelesene Daten aus Datenpunkt auswerten (spart Internetzugriffe) }); // ------------------------------------------------------------------ // Opt In setzen - Logging on(idOptin, function (obj) { log('Opt in Variable <rss-feed iss-Überflüge="">auf <' + obj.state.val + '> gesetzt ', 'info'); if (obj.state.val) readRSS(); else setState(idFeedTabelle, ' '); });
Alte View:
View:
Neue View:
CSS
/* Table Klasse = rss_feed */ .rss_feed { border-collapse: collapse; border-spacing: 0; } .rss_feed caption { display: none; } /* ### Table head (Spaltentitel) ### */ /* Überschrift weglassen */ .rss_feed thead { display:none; } /* LAYOUT ÜBEREINANDER ************** */ /* ### Table head (Spaltentitel) ### */ /* Überschrift weglassen */ .rss_feed thead { display:none; } /* ### Inhalt des Feeds ### */ /* beide Spalten */ .rss_feed tr { text-align: left; } /* Tablerow mit Titel */ .rss_feed tr:nth-child(odd) { color: rgba(240,240,250,1); font-size: 110%; font-weight: 800; } /* Tablerow mit inhalt */ .rss_feed tr:nth-child(even) { color: rgba(240,240,250,1); font-size: 80%; } .rss_feed tr:nth-child(even) td { padding-bottom: 2em; }
Viele Grüße,
PixEDIT 06.04.2016 17:20Uhr Skript optimiert und neuen Link verarbeitet (jetzt https). Ausserdem die Möglichkeit eingebaut, auch andere Stationen auszuwerten. Die Seite liefert nicht nur Daten zur ISS.
EDIT 19.04.2016 12:20Uhr Skript wertet Fehler besser aus, wenn XML-Feed nicht wie erwartet. Benachrichtigung, ob Überflug jetzt pro Überflug nur einmal kurz vor Ereignis (0-30min davor).
EDIT 22.01.2018 Neue Skriptversion mit Try & Catch - FUnktion, um ausfallenden Nasa-Server / Intenetverbindung abzufangen.
-
Hallo Pix,
ist echt verrückt wie einen iobroker in seinen Bann ziehen kann :shock: .
Werde mir deine Lösung auf jeden Fall mal genauer anschauen.
Bin gerade im Lernmodus.
Gruß
Holger
1518_pv.txt -
@pix:Habt Ihr auch noch Ideen? `
Vielleicht wäre das ein Thema für einen flexibel konfigurierbaren RSS-Adapter. Ich könnte dazu allerdings nicht viel beitragenBeste Grüße
Griesemer
-
Hallo,
ein flexibel konfigurierbarer Adapter ist vermutlich deshalb ein Problem, weil die RSS-Quellen natürlich sehr unterschiedlich sind und vor allem die Ausgabe von jedem User unterschiedlich gewünscht wird. Dafür ist ein individuelles CSS nötig.
Aber vielleicht gibt es noch RSS-Feeds die nützlich, aber unbekannt/versteckt im Netz sind.
Und hat jemand eine Idee, wie ich von ioBroker Javascript einen Kalendereintrag erzeugen kann?
Gruß,
Pix
-
Vielleicht wäre das ein Thema für einen flexibel konfigurierbaren RSS-Adapter. Ich könnte dazu allerdings nicht viel beitragen `
Das war auch mein Gedanke.Deswegen habe ich mal meinen ersten Adapter gestartet.
iobroker.rss
Hab da ein paar Ideen.
Mal schauen wie ich damit zurecht komme.
Zumindest wird das Grundgerüst schon mal in der Testumgebung angezeigt.
Ich werde den Adapter dann unter GIT stellen.
Ist aber alles Neuland.
Gruß
Holger
-
Bin leider noch nicht weiter gekommen, aber ich hätte noch einen RSS
-
Hallo,
es gibt derzeit ein Problem mit dem Dienst http://spotthestation.nasa.gov
Daher funktioniert das o.g. Skript zur Zeit nicht und führt zum Absturz der entsprechenden Javascript Instanz. Das zeigt anschaulich, weshalb man Skripte, die auf fremden Daten basieren, nur in einer separaten Javscript-Instanz nutzen sollte.
Wer es nutzt, sollte das Skript vorerst deaktivieren.
Gruß
Pix