Table of Contents

IoT Fahrplananzeiger

Einfaches RangierbeispielPositionsbestimmungErweitertes RangierbeispielRangieren mit FrachtscheinenIoT Fahrplananzeiger
ASCII���Screenshot
Hier ist eine Möglichkeit beschrieben, wie man mit Hilfe von einem MQTT-Broker und Node-Red einen separaten Fahrplananzeiger einrichten kann. Diese Form der Darstellung bietet viele Darstellungs- und Konfigurationsmöglichkeiten, außerhalb der Steuerung von Rocrail.

Funktionsweise

Der Broker bildet das Bindeglied zwischen Rocrail und Node-Red. Rocrail sendet über die MQTT-Schnittstelle alle benötigten Informationen an den Broker. Der Broker verteilt diese weiter an Node-Red. In Node-Red werden die Informationen nun über "Nodes" verarbeitet und zur Ausgabe an einen Browser weitergeleitet. Damit der Browser dynamisch alle Daten bekommt und anzeigen kann, kommunizieren der Browser und Node-Red über eine Websocket.

Voraussetzungen

Einrichtung eines MQTT-Brokers, Node-Red und des Rocrail Client MQTT Service, wie hier beschrieben.
Für die Anpassung von Stylesheet und Template sind Kenntnisse in CSS und Javascript unerlässlich. Informationen und Hilfe dazu findet man unter wiki.selfhtml.org.

Am Einfachsten läßt sich das Ganze auf einem Raspberrypi einrichten, da sich dort bereits die benötigten Komponenten befinden oder nachinstallierten lassen.

Unter dem Menü "Entwicklung" findet man bereits Node-Red.
Den Mosquitto-Broker kann man einfach nach installieren, in dem man auf "Einstellungen → Add/Remove Software" geht:

und anschließend im Suchfeld "mosquitto" eingibt:

Beim Software-Paket einen Haken setzen und auf "Apply" klicken.

Installation und Einrichtung

Wenn man den MQTT-Broker und Node-Red installiert und eingerichtet hat, importiert man den "fpa-flow". Dazu öffnet man die Datei "fpa-flow.txt" in einem Editor. Dort alles markieren und kopieren. Als Nächstes in Node-Red über "Import → Clipboard" und "Einfügen" den FPA-Flow importieren. Danach in Node-Red oben rechts auf "Deploy" klicken, damit der Flow in Node-Red auch mit den Änderungen aktiv wird.
Der Flow ist auf die Default-Einstellungen vom Broker und von Red-Node voreingestellt. Das bedeutet im MQTT-Node ist als Broker-Serveradresse "127.0.0.1:1883" eingestellt. Für die Darstellung des Fahrplananzeigers in einem Browser ist für die eingehende und ausgehende Verbindung, die Default-Serveradresse von Red-Node "127.0.0.1:1880" eingestellt. Hier müssen also evtl. die IP-Adressen geändert werden, wenn man nicht die Default-Einstellungen der Komponenten verwendet, oder diese nicht in der lokalen Rechner-Umgebung eingerichtet hat.
ASCII���Screenshot
ASCII���Screenshot

Einrichtung in Rocrail

Zuerst muß noch der MQTT-Service in Rocrail eingerichtet werden. Dazu unter Rocrail Eigenschaften → Dienste die IP-Adresse vom MQTT-Broker und den Port eintragen. Ist der MQTT-Broker auf dem RasPi installiert, wäre das die IP-Adresse vom RasPi.

In Rocrail muß unter Ortschaften → Einzelheiten → bei "Fahrplan erzeugen" für den Bahnhof, der im Anzeiger dargestellt werden soll, ein Haken gesetzt sein. Dadurch wird eine Fahrplan-Liste für diese Ortschaft erstellt und auch an Node-Red weitergeleitet.
Bei den Blöcken, die Bestandteil der Ortschaft und damit für den anzuzeigenden Bahnhof sind, muß unter Allgemein bei "Bahnsteig / Gleis" das jeweilige Bahnhofsgleis eingetragen werden. Das kann sowohl numerisch, als auch alphanumerisch sein. Also 1, 2, 3 usw. , wie auch 1a, 2b oder 10a.
Bei den jeweiligen Fahrplänen sind unter Ziele eine Zug-Nummer einzutragen. Es gibt jetzt zwei Möglichkeiten Fahrpläne im Anzeiger darzustellen. Eine Möglichkeit ist, über das Textfeld bei den Zielen im Fahrplan, "Fake" Informationen vorzugeben. Es sind dabei drei Angaben - getrennt durch Kommas - möglich. 1. Ziel, 2. über, 3. Hinweis (z.B. "Hamburg,Bremen-Köln-Basel,Sonderzug"). Diese Möglichkeit ist auch im FPA-Node als Default voreingestellt.

TIPP: Wer ein Flugzeugsymbol als Kennzeichen für einen Flughafen verwenden möchte, kann ein HTML Entity im Textfeld bei den Zielen im Fahrplan verwenden "✈" ✈︎

Zusätzlich gibt es noch das Feld "Bemerkungen". Dieses wird auch an den Fahrplananzeiger übergeben und dort als reines Textfeld ausgewertet. Jedoch wird es nicht zur Anzeige gebracht. Dieses kann man sich selber individuell im Anzeiger zur Anzeige bringen. Die Variable zur Ausgabe in der Anzeige lautet "remark".

Eine weitere Möglichkeit ist, die Anzeige für den Fahrplan nur aus den Ortschaften der Blöcke, die hier als Ziele definiert sind, generiert wird. In diesem Fall muß das Textfeld bei den Zielen leer bleiben! Im FPA-Node muß zusätzlich die Variable "FPtext" auf "no" gesetzt werden !

ASCII���Screenshot

Konfiguration in Node-Red im FPA-Flow

FPA-Node

Im FPA-Node muß auf jeden Fall die Variable ("station") für den Bahnhof gesetzt werden, für den die Anzeige erfolgen soll, damit die richtige Fahrplan-Tabelle ausgewertet wird.

/* Station (same as in Rocrail defined "area")
Bahnhof (die selber Bezeichnung, wie in Rocrail unter Ortschaften definiert) */
var station = "Bahnhof";

Heißt also die Ortschaft / Bahnhof z.B. "Frankfurt" , muß "Bahnhof" durch "Frankfurt" ersetzt werden.

Es können aber noch weitere Variablen geändert werden:

/* Value for content in schedule textfield "yes" or "no"
Variable für Inhalt im Textfeld beim Fahrplan  "yes" oder "no" */
var FPtext = "yes";

Diese Variable gibt vor, wie die Anzeige der Ziele und weitere Informationen erfolgt. "yes" ist die Default-Einstellung und bedeutet, daß in der Anzeige ein "Ziel", "über" und "Hinweis" angezeigt werden. Wie bereits unter "Einrichtung in Rocrail" beschrieben, wird somit das Textfeld im Fahrplan unter Ziele ausgewertet. Setzt man die Variable auf "no" werden aus den Ortschaften der eingetragenen Blöcken bei den Zielen im Fahrplan, eine Zeichenkette gebildet und bei "via" (über) eingetragen. Das Feld "Ziel" und "Hinweis" im Anzeiger werden dann nicht befüllt.

/* Text in case of train cancelled
Text der angezeigt wird, wenn Zug ausfällt */
var cancel = "ausgefallen cancelled";

Hier kann der Text geändert werden, der angezeigt werden soll, wenn ein Zug ausfällt.

/* Text that is displayed in case of delay
Text der angezeigt wird bei Verspätung */
var delayminute = " Minute verspätet!";
var delayminutes = " Minuten verspätet!";

Hier kann der Text angepasst werden, der angezeigt werden soll, wenn ein Zug Verspätung hat. Dabei wird nach "einer" und "mehr" Minute(n) unterschieden.

/* Maximum number of timetables in the Display
Maximale Anzahl an Fahrplänen im Display */
var maxFP = "10";

Die Variable "maxFP" gibt vor, wie viele Einträge maximal im Anzeiger aufgelistet werden sollen. Default ist der Wert auf 10 voreingestellt.

/* If you want marquee as Fault Display set run to "yes"
Wenn man Laufschrift als Störung im Dispaly haben möchte run aud "yes" setzen*/
var run = "yes";

Mit der Variablen "run" kann festgelegt werden, ob man eine Laufschrift ( run = "yes" ) oder einen statischen Text ( run = "no" ) angezeigt bekommen möchte.

Im weiter folgendem "Script-Code" sollte man keine Änderungen vornehmen. Das kann zu Fehlfunktion und falscher Ausgabe in der Anzeige führen !

Stylesheet

Der Stylesheet-Node oder auch allgemein das Stylesheet genannt, ist für die Formatierung der Ausgabe verantwortlich. Im Stylesheet können die Formate für Farben, Schriften, Schriftgrößen etc. eingestellt werden. Wenn man Änderungen daran vornehmen möchte, sollte man Kenntnisse in der Formatierung mit CSS besitzen. Eine Hilfe-Seite dazu ist oben angegeben. Ein paar Variablen für Hintergrundfarbe und Schriftfarbe sind bereits vordefiniert und können so einfach am Anfang des Stylesheets angepasst werden:

:root {
/* Hier sind die Farben für die Ausgabe definiert
Es können jeweils Hintergrund- und Schriftfarbe angepasst werden */
    /*Hintergrundfarbe */
    --background: #006;
    /*Schriftfarbe */
    --fontcolor: #fff;
    /* Schriftart */
    --fontart: arial;
    //color: #fff;
    /* Hintergrundfarbe ungerade Zeile Liste */
    --backgroundfirst: #006;
    /* Schriftfarbe ungerade Zeile */
    --fontfirst: #fff;
    /* Hintergrundfarbe gerade Zeile */
    --backgroundsec: #309;
    /* Schriftfarbe gerade Zeile */
    --fontsec: #fff;
    /* Hintergrundfarbe Störung (fault) */
    --backgroundfault: #ff0;
    /* Schriftfarbe Störung (fault) */
    --fontfault: #006;
}

Template

Der "Template"-Node oder auch allgemein das Template genannt, ist für die Darstellung im Display verantwortlich (Also wie z.B. eine Internetseite aufgebaut ist [HTML]). Das Template besteht in diesem Fall aus mehreren Tabellen. Die erste Tabelle hat als Inhalt "Abfahrt, Uhr und ein Logo".
Die zweite Tabelle bildet bereits den Kopfteil von der Fahrplanliste. Dort werden die Spalten eingerichtet, was aus einer Fahrplanzeile angezeigt wird. Z.B. hier definierte Spalten-Breiten ("col"), müssen dann auch in die dritte Tabelle übernommen werden.
Die dritte Tabelle gibt die generierte Liste aus dem FPA-Node wieder. Da die Anzeige ja dynamisch sein soll (Also Ankunft setzen, Verspätungen anzeigen etc.), ist diese Tabelle nicht mit einfachen "HTML-Elementen" hier abbildbar. Die Elemente müssen per Script generiert werden. Damit die per Script generierten Elemente im Template richtig platziert werden, ist hier ein "Platzhalter vorgesehen, der NICHT verändert oder gelöscht werden darf !
Also am nachfolgenden HTML-Code keine Änderungen vornehmen:

<tbody id="list"></tbody>

Wer die durch Javascript generierten Elemente anpassen möchte, sollte unbedingt über Javascript-Kenntnisse [createElement()] verfügen. Der Grundaufbau dazu ist jeweils immer der gleiche:

cell = document.createElement("td"); // Zelle erzeugen
text = document.createTextNode(obj[i].ptime); // geplante Ankunftzeit setzen
cell.appendChild(text); // geplante Ankunftzeit setzen
cell.setAttribute("class","time"); // class geplante Ankunftzeit setzen
row.appendChild(cell); // Zelle an Zeile binden

Es wird ein <td>-Element erzeugt (Eine Zelle generiert)
Ein Text erzeugt (dieser platziert sich dann zwischen <td></td>)
Ein Attribut für die Zelle gesetzt ( das Attribut gibt die im Stylesheet definierte Formatierung vor)
Die Zelle wird an die Zeile gebunden (Also im Prinzip: "<tr><td>text</td></tr>")
Im Template-Node sind die entsprechenden Zeilen kommentiert.

Hinweisfeld am Fuss

Es gibt noch eine vierte Tabelle am Ende. Diese enthält eine Zelle als "Hinweis". Ausgewertet wird ein Textfeld aus Rocrail, welches die Kennung "fault" haben muß. Wird dieses Textfeld in Rocrail aktualisiert, wird der Text automatisch in der untersten Zeile vom Fahrplananzeigers dargestellt. Diese kann man z.B. verwenden, um bei einem ausgelösten Nothalt in Rocrail per Aktion das Textfeld in Rocrail zu aktualisieren und damit einen Text im Anzeiger anzeigen zu lassen.

Mögliche Variablen zur Ausgabe im FPA

Die nachfolgende Liste zeigt die definierten Variablen und ihre Bedeutung, die im Anzeiger zur Anzeige gebracht werden können. Welche davon angezeigt werden sollen, kann im Template-Node festgelegt werden.

Bedeutung Bezeichnung der Variablen im IoT FPA
Punkt für Ankunft point
geplante Abfahrtzeit ptime
aktuelle Abfahrtzeit atime
Zug-Nr. train
über via
Ziel des
Gleis track
Hinweis notice
Verspätung delay
Zugausfall cancel
Bemerkungen remark
Störungen fault

Aufruf des Anzeigers über einen Browser

Der Fahrplananzeiger wird bei Default-Werten über "127.0.0.1:1880/fpa" aufgerufen. Getestet wurde er unter Safari, Chrom, Edge, Internetexplorer und Opera. Firefox ist nicht kompatibel !
Natürlich kann man die Anzeige auch für weitere Bahnhöfe verwenden. Dazu muß man den Flow duplizieren. Außerdem müssen die Einstellungen im:
HTTP-Node
HTTP-response Node
Websocket in Node
Websocket out Node
Im Template-Node die Zeile:

        // This needs to point to the web socket in the Node-RED flow
        // ... in this case it's ws/fpa
        wsUri += "//" + loc.host + loc.pathname.replace("fpa","ws/fpa");

angepasst werden. Der Aufruf über den Browser erfolgt dann nicht mehr Default über "/fpa", sondern z.B. den Namen des Bahnhofs (z.B. /Apeldoorn).
Nicht zu vergessen, auch die Variable für den anzuzeigenden Bahnhof im FPA-Node anzupassen.

Beispiel:
knipsel.jpg
Template:

        // This needs to point to the web socket in the Node-RED flow
        // ... in this case it's ws/fpa
        wsUri += "//" + loc.host + loc.pathname.replace("Apeldoorn","ws/Apeldoorn");

FPA:

/* Station (same as in Rocrail defined "area")
Bahnhof (die selber Bezeichnung, wie in Rocrail unter Ortschaften definiert) */
var station = "Apeldoorn";

Der Flow

Update 22/01/18 : Anpassung im FPA-Node für Berechnung Zugausfälle; Ergänzung Layout um Piktogramm. Ab Rocrail Rev. 13446 !
Update 23/01/18 : Hinweistext am Fuss der Anzeige jetzt wahlweise als Laufschrift oder statisch.
Update 30/01/18 : Fehlerkorrekturen; Feld "Bemerkungen" aus den Fahrplänen wird jetzt mit ausgewertet (Jedoch nicht in der Anzeige zur Ausgabe gebracht)
Update 12/04/18 : Fehlerkorrektur bei der Berechnung von Zugausfällen
fpa-flow.txt.zip

Templates

Wenn man gerne eine Bildschirmausgabe für andere Bahngesellschaften haben möchte, kann man hier weitere Stylesheets und Templates herunterladen. Diese in einem Editor öffnen, alles markieren und kopieren. Anschließend diese über Node-Red → Import → Clipboard in den Flow einfügen. Jetzt kann man neue Verbindungen zu den Nodes legen, die zu den vorhanden löschen und sich nach "Deploy" und einem "reload" im ausgebenden Browser, das Layout ansehen. Später dann die alten Nodes einfach löschen.

Hier sind von Usern angepasstes Stylesheet und Template für andere Länder: (Diese bitte als Nodes in den Flow importieren)
Für Deutschland DB: format-db.zip Gerrit (nice2have)
ASCII���Screenshot
Für Österreich ÖBB: format-oebb.zip Danke an Peter (peter&basti)
Für Niederlande: format-nl.zip Danke an Jan (janvanderborden)