[
    {
        "id": "e962ade6.b53fa",
        "type": "tab",
        "label": "Fahrplananzeiger",
        "disabled": false,
        "info": ""
    },
    {
        "id": "a36d20ff.0d672",
        "type": "mqtt in",
        "z": "e962ade6.b53fa",
        "name": "",
        "topic": "rocrail/service/info",
        "qos": "1",
        "broker": "cafe9d5b.d4035",
        "x": 101.5,
        "y": 156,
        "wires": [
            [
                "17b4611e.5567b7"
            ]
        ]
    },
    {
        "id": "2eec94e4.1b1994",
        "type": "debug",
        "z": "e962ade6.b53fa",
        "name": "",
        "active": true,
        "console": "false",
        "complete": "payload",
        "x": 793,
        "y": 79,
        "wires": []
    },
    {
        "id": "426b4641.184bb",
        "type": "function",
        "z": "e962ade6.b53fa",
        "name": "FPA",
        "func": "/* Hier können Variablen definert werden \nVariables can be defined here */\n\n/* Station (same as in Rocrail defined \"area\")\nBahnhof (die selber Bezeichnung, wie in Rocrail unter Ortschaften definiert) */\nvar station = \"Bahnhof\";\n\n/* Value for content in schedule textfield \"yes\" or \"no\"\nVariable für Inhalt im Textfeld beim Fahrplan  \"yes\" oder \"no\" */\nvar FPtext = \"yes\";\n/* Text in case of train cancelled\nText der angezeigt wird, wenn Zug ausfällt */\nvar cancel = \"ausgefallen cancelled\";\n\n\n/* Text that is displayed in case of delay\nText der angezeigt wird bei Verspätung */\nvar delayminute = \" Minute verspätet!\";\nvar delayminutes = \" Minuten verspätet!\";\n\n/* Maximum number of timetables in the Display\nMaximale Anzahl an Fahrplänen im Display */\nvar maxFP = \"10\";\n\n/* If you want marquee as Fault Display set run to \"yes\"\nWenn man Laufschrift als Störung im Dispaly haben möchte run aud \"yes\" setzen*/\nvar run = \"yes\";\n\n/* Do not change ! */\ncancel = flow.set(\"cancel\",cancel);\nstation = flow.set(\"station\",station);\ndelayminute = flow.set(\"delayminute\",delayminute);\ndelayminutes = flow.set(\"delayminutes\",delayminutes);\nmaxFP = flow.set(\"maxFP\",maxFP);\nFPtext = flow.set(\"FPtext\",FPtext);\nvar stationRR = \"\";\nstationRR = flow.set(\"stationRR\",stationRR);\nmotime = 0;\n\nvar jObj = msg.payload;\nvar tag = Object.keys(jObj)[0];\n\n/* Fault */\nif( tag == \"tx\" ) {\n    var fault = jObj.tx.$.id;\n    if( fault == \"fault\") {\n        var fault = jObj.tx.$.text;\n        styleon = \"<div class=\\\"run\\\"><span class=\\\"fault2\\\">\";\n        styleoff = \"<span class=\\\"fault1\\\">\";\n        styleend = \"</span>\";\n        styleendoff = \"</span></div>\";\n        if(fault.length > 0) {\n            if( run === \"no\") {\n                msg.payload = ( { fault: styleoff + fault + styleend } );\n            }\n            if(run === \"yes\") {\n                msg.payload = ( { fault: styleon + fault + styleendoff } );\n            }\n        } else {\n            msg.payload = ( { fault: styleoff + fault + styleend } );\n        }\n        return msg;\n    }\n    }\n\n/* Clock */\nif( tag == \"clock\") {\n    var divider = jObj.clock.$.divider;\n    divider = flow.set(\"divider\",divider);\n    mtime = jObj.clock.$.time * 1000;\n    mtime = new Date(mtime),\n    mhour = mtime.getHours();\n    mminutes = mtime.getMinutes();\n    mtime = mhour * 60 + mminutes * 1;\n    mtime = flow.set(\"mtime\",mtime);\n    if( mminutes < 10 ) {\n        var mminutes = \"0\" + mminutes;\n    }\n    if( mhour < 10 ) {\n        var mhour = \"0\" + mhour;\n    }\n    var time = mhour + \":\" + mminutes;\n    msg.payload = ( { \"time\": time } );\n    return msg;\n}\n\n/* Scheduletable */\nif( tag == \"scheduletable\" ) {\n    var stationRR = jObj.scheduletable.$.id;\n    stationRR = flow.set(\"stationRR\",stationRR);\n    }\nstationRR = flow.get(\"stationRR\") || \"\";\nstation = flow.get(\"station\") || \"\";\nif( tag == \"scheduletable\" && station == stationRR ) {\n    var i = 0;\n    if ( typeof(jObj.scheduletable.scheduletableentry) === \"undefined\" ) {\n        FPlength = 0\n    } else {\n        FPlength = jObj.scheduletable.scheduletableentry.length;\n    }\n    var list = new Array(\"list\");\n    //var motime = flow.get(\"mtime\") || \"\";\n    //motime = motime * 1;\n    var FPhour = jObj.scheduletable.$.hour;\n    FPhour = FPhour * 60;\n    var FPminute = jObj.scheduletable.$.minute;\n    motime = FPhour * 1 + FPminute * 1;\n    var maxFP = flow.get(\"maxFP\",maxFP) || \"\";\n    maxFP = maxFP * 1 - 1;\n    /* Anzeiger mit leeren Zeilen auffüllen */\n    while( i <= maxFP ) {\n        list[i] = ( { point: \" \" , ptime: \" \" , atime: \" \" , train: \" \" , via: \" \" , des: \" \" , track: \" \" , notice: \" \" , delay: \" \" , cancel: \" \" , remark: \" \" } );\n        i++;\n    }\n    var i = 0;\n    /* Fahrplaneinträge in Anzeige schreiben */\n    if( FPlength <= maxFP ) {\n        maxFP = FPlength - 1;\n    }\n        while( i <= maxFP ) {\n            /* Pruefen auf Ankunft */\n            var bkdes = jObj.scheduletable.scheduletableentry[i].$.bkid;\n            var lcbkid = jObj.scheduletable.scheduletableentry[i].$.lcbkid;\n            if( typeof(lcbkid) === \"undefined\" ) { // Pruefen auf Inhalt\n                var point = '';\n            } else {\n                if( lcbkid == bkdes ) {\n                    var point = '*';\n                } else {\n                    var point = '';\n                    }\n            }\n            /* geplante Abfahrtzeit setzen */\n            var hour = jObj.scheduletable.scheduletableentry[i].$.hour;\n            if( hour < 10 ) {\n                var hour = \"0\" + hour;\n            }\n            var min = jObj.scheduletable.scheduletableentry[i].$.minute;\n            if( min < 10 ) {\n                var min = \"0\" + min;\n            }\n            var ptime = hour + \":\" + min;\n            /* Zugnummer */\n            train = jObj.scheduletable.scheduletableentry[i].$.trainid;\n            if( typeof(train) === \"undefined\" ) { // Pruefen auf Inhalt            \n                train = \"Train undefined \";\n            }\n            /* Gleis */\n            track = jObj.scheduletable.scheduletableentry[i].$.platform;\n            if( typeof(track) === \"undefined\" ) { // Pruefen auf Inhalt \n                track = \"Track undefined \";\n            }\n            /* Bemerkungen */\n            remark = jObj.scheduletable.scheduletableentry[i].$.remark;\n            if( typeof(remark) === \"undefined\" ) { // Pruefen auf Inhalt \n                remark = \" \";\n            }\n            /* Prüfen ob Variable FPtext yes oder no */\n            FPtext = flow.get(\"FPtext\",FPtext) || \"\";\n            /* Inhalt Textfeld Fahrplan splitten */\n            split = jObj.scheduletable.scheduletableentry[i].$.via;\n            if(FPtext === \"yes\") {\n                /* Inhalt Textfeld Fahrplan splitten */\n                if( typeof(split) === \"undefined\" ) { // Pruefen auf Inhalt\n                    split = \"via undefined\";\n                }\n                var split = split.split(\",\");\n                /* Ziel */\n                var des = split[0];\n                /* via */\n                if( typeof(split[1]) === \"undefined\" ) { // Pruefen auf Inhalt            \n                    var via = \" \";\n                }\n                else {\n                    var via = split[1];\n                }            \n                /* Hinweis */\n                if( typeof(split[2]) === \"undefined\" ) { // Pruefen auf Inhalt\n                    var notice = \" \";\n                }\n                else {\n                    var notice = split[2];\n                }\n            }\n            if( FPtext === \"no\") {\n                var split = split.split(\",\");\n                var splitlength = split.length;\n                via = split[0];\n                for(l = 1; l < splitlength; l++) {\n                via +=  \" - \" + split[l];\n                }\n                des = \"\";\n                notice = \"\";\n            }\n            /* Pruefen auf Verspaetung */\n            var delay = 0;\n            var atime = \"\";\n            var delay = jObj.scheduletable.scheduletableentry[i].$.delay;\n            if( typeof(delay) === \"undefined\") { //Pruefen auf Inhalt\n                var delay = \"\";\n                var atime = \"\";\n            } else {\n                if ( delay == 0 ) {\n                var delay = \"\";\n                var atime = \"\";   \n                }\n                if( delay > 0 ) {\n                    /* Aktuelle Abfahrtzeit ermitteln */\n                    var hourdelay = hour * 1;\n                    var mindelay = min * 1 + delay * 1;\n                    if( mindelay > 59 ) {\n                        hourdelay = Math.floor( mindelay * 1 / 60 );\n                        mindelay = mindelay - ( hourdelay * 60 );\n                        hourdelay = hour * 1 + hourdelay * 1;\n                        if( hourdelay > 23 ) {\n                            hourdelay = hourdelay * 1 - 23;\n                        }\n                    }\n                    mindelay = mindelay * 1;\n                    hourdelay = hourdelay * 1;\n                    if( mindelay < 10 ) {\n                        var mindelay = \"0\" + mindelay;\n                    }\n                    if( hourdelay < 10 ) {\n                        var hourdelay = \"0\" + hourdelay;\n                    }\n                    var atime = hourdelay + \":\" + mindelay;\n                    var delayminute = flow.get(\"delayminute\",delayminute) || \"\";\n                    var delayminutes = flow.get(\"delayminutes\",delayminutes) || \"\";\n                    if( delay == 1 ) {\n                        delay = delay + delayminute;   \n                    }\n                    if( delay > 1 ){\n                        delay = delay + delayminutes;\n                    }\n                    if( delay == 0 ) {\n                        delay = \"\";\n                    }\n                }\n            }\n            /* Prüfen auf Ausfall */\n            var starthour = jObj.scheduletable.scheduletableentry[i].$.starthour;\n            var startminute = jObj.scheduletable.scheduletableentry[i].$.startminute;\n            var timeproc = jObj.scheduletable.scheduletableentry[i].$.timeprocessing;\n            timeproc = timeproc * 1;\n            var timeframe = jObj.scheduletable.scheduletableentry[i].$.timeframe;\n            timeframe = timeframe * 1;\n            var startFP = starthour * 60 + startminute * 1;\n            var lcid = jObj.scheduletable.scheduletableentry[i].$.lcid;\n            var maxdelay = jObj.scheduletable.scheduletableentry[i].$.maxdelay;\n            var cancel = \"\";\n            /* stündliche FP */\n            if( timeproc == 2 ) {\n                maxdelay = startFP * 1 + timeframe * 1;\n                if( motime > 1380 && maxdelay < 59 ) {\n                    maxdelay = 24 * 60 + maxdelay * 1;\n                }\n                if( typeof(lcid) === \"undefined\" || lcid === \"\" ) {\n                    if( maxdelay < motime ) {\n                        var cancel = flow.get(\"cancel\",cancel) || \"\";\n                    }\n                }\n            }\n            /* absolute FP */\n            if( timeproc == 0 ) {\n                var divider = flow.get(\"divider\",divider);\n                maxdelay = maxdelay * 1 * divider / 60;\n                maxdelay = maxdelay + startFP * 1;\n                if( motime > 1380 && maxdelay < 59 ) {\n                    maxdelay = 24 * 60 + maxdelay * 1;\n                }\n                if( typeof(lcid) === \"undefined\" || lcid === \"\" ) {\n                    if( maxdelay < motime ) {\n                        var cancel = flow.get(\"cancel\",cancel) || \"\";\n                    }\n                }\n            }\n            list[i] = ( { point: point , ptime: ptime , atime: atime , train: train , via: via , des: des , track: track , notice: notice , delay: delay , cancel: cancel , remark: remark } );\n            i++;\n            }\n            //node.warn(list);\n        msg.payload = list;\n        return msg;\n    }",
        "outputs": 1,
        "noerr": 0,
        "x": 436,
        "y": 156,
        "wires": [
            [
                "c2d6c229.f965c8"
            ]
        ]
    },
    {
        "id": "17b4611e.5567b7",
        "type": "xml",
        "z": "e962ade6.b53fa",
        "name": "",
        "attr": "",
        "chr": "",
        "x": 288.5,
        "y": 156,
        "wires": [
            [
                "426b4641.184bb"
            ]
        ]
    },
    {
        "id": "1d8a734.5112c0d",
        "type": "comment",
        "z": "e962ade6.b53fa",
        "name": "Templates Output",
        "info": "",
        "x": 408.5,
        "y": 239,
        "wires": []
    },
    {
        "id": "57b95d14.614694",
        "type": "comment",
        "z": "e962ade6.b53fa",
        "name": "Für Debug-Ausgabe",
        "info": "",
        "x": 789.5,
        "y": 35,
        "wires": []
    },
    {
        "id": "bd032f3.14af7d",
        "type": "comment",
        "z": "e962ade6.b53fa",
        "name": "Connection to Broker",
        "info": "Hier IP-Adresse und Port zum Broker eintragen.\nTopic: rocrail/service/info",
        "x": 107.5,
        "y": 116,
        "wires": []
    },
    {
        "id": "31d50e0a.e141f2",
        "type": "comment",
        "z": "e962ade6.b53fa",
        "name": "Variable definieren",
        "info": "Am Anfang des Nodes sind zwei Variablen \nzu definieren:\narea = \"Ortschaft\" ; Hier ist die Ortschaft / der Bahnhof \neinzutragen, für den der Fahrplananzeiger gilt.",
        "x": 452.5,
        "y": 116,
        "wires": []
    },
    {
        "id": "671a8a05.875c54",
        "type": "http in",
        "z": "e962ade6.b53fa",
        "name": "get /fpa",
        "url": "/fpa",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 87.5,
        "y": 282,
        "wires": [
            [
                "5383a17c.bd9b4"
            ]
        ]
    },
    {
        "id": "3ee26f93.1a2448",
        "type": "http response",
        "z": "e962ade6.b53fa",
        "name": "HTML /fpa",
        "statusCode": "",
        "headers": {},
        "x": 785.5,
        "y": 281,
        "wires": []
    },
    {
        "id": "c8aa5520.c4505",
        "type": "template",
        "z": "e962ade6.b53fa",
        "name": "Template",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "<!doctype html>\n<html>\n  <head>\n      <style>\n              {{{payload.style}}}\n      </style>\n    <meta charset=\"utf-8\">\n    <title>Fahrplananzeiger</title>\n    <script type=\"text/javascript\">\n        var ws;\n        var wsUri = \"ws:\";\n        var loc = window.location;\n        console.log(loc);\n        if (loc.protocol === \"https:\") { wsUri = \"wss:\"; }\n        // This needs to point to the web socket in the Node-RED flow\n        // ... in this case it's ws/fpa\n        wsUri += \"//\" + loc.host + loc.pathname.replace(\"fpa\",\"ws/fpa\");\n\n        function wsConnect() {\n            console.log(\"connect\",wsUri);\n            ws = new WebSocket(wsUri);\n            //var line = \"\";    // either uncomment this for a building list of messages\n            ws.onmessage = function(msg) {\n                console.log(msg);\n                var line = \"\";  // or uncomment this to overwrite the existing message\n                // parse the incoming message as a JSON object\n                data = msg.data;\n                //console.log(\"output\", data);                \n                obj = JSON.parse(data);\n                console.log(obj);\n                var tag = Object.keys(obj);\n                if( tag == \"time\") {\n                   //get time\n                   obj = obj.time;\n                   document.getElementById('time').innerHTML = obj;\n                }\n                if( tag == \"fault\") {\n                   //get fault\n                   obj = obj.fault;\n                   document.getElementById('fault').innerHTML = obj;\n                }\n                if(typeof(obj) == \"object\") {\n                    if(obj instanceof Array) {\n                    //console.log(obj.length);\n                    var pointer = obj.length;\n                    var list = document.getElementById('list');\n                    if(list.hasChildNodes()) {\n                        Anzahl = document.getElementById(\"list\").childNodes.length;\n                        //console.log(\"Liste\",list);\n                        //console.log(Anzahl);\n                        for (var i = 0; i < Anzahl; i++) {\n                            list.removeChild(list.firstChild);\n                        }\n                    }\n                    var i = 0;\n                    while( i < pointer ) {\n                        /* Start ceate Row for Display */\n                        /* Hier beginnt die Erzeugung der Zeilen für die Anzeige */\n                        row = document.createElement(\"tr\"); //Zeile erzeugen\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        /* Hier wird der Punkt als svg erzeugt */\n                        if( obj[i].point == \"*\") {\n                        svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n                        circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n                        circle.setAttribute('cx',\"7\"); // Position x\n                        circle.setAttribute('cy',\"7\"); // Position y\n                        circle.setAttribute('r',\"7\"); // Radius\n                        circle.setAttribute('fill',\"#00ff00\"); // Füllfarbe\n                        svg.appendChild(circle);\n                        svg.setAttribute('width', '14px');  //Breite svg\n                        svg.setAttribute('height', '14px');  // Höhe svg\n                        svg.setAttribute('viewBox', '0 0 14 14'); // sichtbare Größe svg\n                        cell.appendChild(svg);\n                        } else {\n                            text = document.createTextNode(\"\");\n                            cell.appendChild(text);\n                        }\n                        row.appendChild(cell);\n                        /* Ende Punkt erzeugen */\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        text = document.createTextNode(obj[i].ptime); // geplante Ankunftzeit setzen\n                        cell.appendChild(text); // geplante Ankunftzeit setzen\n                        cell.setAttribute(\"class\",\"time\"); // class geplante Ankunftzeit setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        myP = document.createElement(\"p\"); // Absatz erzeugen\n                        text = document.createTextNode(obj[i].atime); // aktuelle Ankunftzeit setzen\n                        myP.appendChild(text); // aktuelle Ankunftzeit setzen\n                        myP.setAttribute(\"id\",\"atime\"); // class aktuelle Ankunftzeit setzen\n                        cell.appendChild(myP); // Absatz an Zelle binden\n                        myP = document.createElement(\"p\"); // Absatz erzeugen\n                        text = document.createTextNode(obj[i].cancel); //Ausfall setzen\n                        myP.appendChild(text); //Ausfall setzen\n                        myP.setAttribute(\"id\",\"cancel\"); //Ausfall setzen\n                        cell.appendChild(myP); // Absatz an Zelle binden\n                        cell.setAttribute(\"class\",\"time\"); // class Absatz setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zeller erzeugen\n                        text = document.createTextNode(obj[i].train); // Zugnummer setzen\n                        cell.appendChild(text); // Zugnummer setzen\n                        cell.setAttribute(\"class\",\"train\"); // class Zugnummer setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        text = document.createTextNode(obj[i].des); // Ziel setzen\n                        cell.appendChild(text); // Ziel setzen\n                        cell.setAttribute(\"class\",\"des\"); // calls Ziel setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        text = document.createTextNode(obj[i].via); // via setzen\n                        cell.appendChild(text); // via setzen\n                        cell.setAttribute(\"class\",\"via\"); // class via setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        text = document.createTextNode(obj[i].track); // Gleis setzen\n                        cell.appendChild(text); // Gleis setzen\n                        cell.setAttribute(\"class\",\"track\"); // calls Gleis setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        cell = document.createElement(\"td\"); // Zelle erzeugen\n                        myP = document.createElement(\"p\"); // Absatz erzeugen\n                        text = document.createTextNode(obj[i].notice); // Hinweis etzen\n                        myP.appendChild(text); // Hinweis setzen\n                        myP.setAttribute(\"id\",\"notice\"); // class Hinweis setzen\n                        cell.appendChild(myP); // Absatz an Zelle binden\n                        myP = document.createElement(\"p\"); // Absatz erzeugen\n                        text = document.createTextNode(obj[i].delay); // Verspätung erzeugen\n                        myP.appendChild(text); // Verspätung erzeugen\n                        myP.setAttribute(\"id\",\"delay\"); // class Verspätung setzen\n                        cell.appendChild(myP); // Absatz an Zelle binden\n                        cell.setAttribute(\"class\",\"notice\"); // class Zelle setzen\n                        row.appendChild(cell); // Zelle an Zeile binden\n                        row.setAttribute(\"id\",\"row\"); // id der Zeile setzen\n                        list.appendChild(row); // Zeile an Tabellen Body binden\n                        /* End generate*/\n                        /*Ende Erzeugung */\n                        i++;\n                    }\n                    }\n                }\n            }\n            ws.onopen = function() {\n                console.log(\"connected\");\n            }\n            ws.onclose = function() {\n                // in case of lost connection tries to reconnect every 3 secs\n                setTimeout(wsConnect,3000);\n            }\n        }\n    </script>\n</head>\n<body onload=\"wsConnect();\" onunload=\"ws.disconnect();\">\n<!-- Ab hier kann das Template angepasst werden -->\n<table class=\"head\">\n    <colgroup>\n    <col width=\"30\">\n    <col width=\"90\">\n    <col width=\"90\">\n    <col width=\"170\">\n    <col width=\"60\">\n    <tr class=\"trhead\">\n        <th class=\"head0\"> \n\t\t<div class=\"skalierender-svg-container\" style=\"padding-bottom: 0%\">\n\t\t\t<svg\n\t\t\t\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\t\t\t\txmlns:cc=\"http://creativecommons.org/ns#\"\n\t\t\t\txmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n\t\t\t\txmlns:svg=\"http://www.w3.org/2000/svg\"\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\tid=\"svg870\"\n\t\t\t\tversion=\"1.1\"\n\t\t\t\tviewBox=\"0 0 8.4666659 8.4666668\"\n\t\t\t\theight=\"32\"\n\t\t\t\twidth=\"32\">\n\t\t\t\t<defs\n\t\t\t\tid=\"defs864\" />\n\t\t\t\t\t<metadata\n\t\t\t\t\tid=\"metadata867\">\n\t\t\t\t\t<rdf:RDF>\n\t\t\t\t\t<cc:Work\n\t\t\t\t\trdf:about=\"\">\n\t\t\t\t\t<dc:format>image/svg+xml</dc:format>\n\t\t\t\t\t<dc:type\n\t\t\t\t\trdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\n\t\t\t\t\t<dc:title></dc:title>\n\t\t\t\t</cc:Work>\n\t\t\t\t</rdf:RDF>\n\t\t\t\t</metadata>\n\t\t\t\t<g\n\t\t\t\ttransform=\"translate(0,-288.53333)\"\n\t\t\t\tid=\"layer1\">\n\t\t\t\t<path\n\t\t\t\tid=\"path1441\"\n\t\t\t\td=\"m 2.5516227,296.71425 c 0.924391,-0.008 2.43703,-0.008 3.36142,0 0.924391,0.008 0.168071,0.0138 -1.68071,0.0138 -1.848781,0 -2.605101,-0.006 -1.68071,-0.0138 z m -1.91173807,-0.11503 -0.117564,-0.10255 0.149397,0.0875 c 0.196627,0.11514 0.199552,0.11763 0.138313,0.11763 -0.02892,0 -0.105485,-0.0462 -0.170146,-0.10256 z m 6.98291707,0.0875 c 0.01141,-0.008 0.08798,-0.0544 0.170146,-0.10256 l 0.149397,-0.0875 -0.117564,0.10255 c -0.06466,0.0564 -0.141227,0.10256 -0.170147,0.10256 -0.02892,0 -0.04324,-0.007 -0.03183,-0.0151 z m -6.81459307,-0.23367 c -0.08927,-0.0544 -0.206832,-0.17199 -0.261258,-0.26125 -0.09608,-0.15759 -0.09896,-0.257 -0.09896,-3.42413 0,-3.16712 0.0029,-3.26653 0.09896,-3.42412 0.05443,-0.0893 0.171992,-0.20683 0.261258,-0.26126 0.15758903,-0.0961 0.25699807,-0.099 3.42412407,-0.099 3.167126,0 3.266534,0.003 3.424124,0.099 0.08926,0.0544 0.206831,0.17199 0.261257,0.26126 0.09608,0.15759 0.09896,0.257 0.09896,3.42412 0,3.16713 -0.0029,3.26654 -0.09896,3.42413 -0.05443,0.0893 -0.171992,0.20683 -0.261257,0.26125 -0.15759,0.0961 -0.256998,0.099 -3.424124,0.099 -3.167126,0 -3.26653504,-0.003 -3.42412407,-0.099 z m 6.83760607,-0.2719 0.122234,-0.12223 v -3.29125 -3.29125 l -0.122234,-0.12223 -0.122233,-0.12223 H 4.2323327 0.94108366 l -0.12223403,0.12223 -0.122233,0.12223 v 3.29125 3.29125 l 0.122233,0.12223 0.12223403,0.12224 h 3.29124904 3.291249 z m -6.501009,-1.09783 c 0,-0.17338 0.0012,-0.1743 0.224095,-0.1743 0.206864,0 0.224095,-0.01 0.224095,-0.12668 0,-0.1254 0.0036,-0.12653 0.361041,-0.11204 0.3313,0.0134 0.362352,0.0239 0.376955,0.12667 0.01534,0.10802 0.03459,0.11205 0.535337,0.11205 h 0.519424 v -0.1245 -0.12449 h 1.967053 1.967053 v 0.11669 c 0,0.1161 -0.004,0.11686 -0.784331,0.14868 -0.810861,0.0331 -1.497693,0.12396 -1.929704,0.25538 -0.200617,0.061 -0.561028,0.0759 -1.855006,0.0763 l -1.606012,5.7e-4 z m 1.344568,-0.57269 c -1.029691,-0.0278 -1.114617,-0.0533 -1.270494,-0.38184 -0.07116,-0.14997 -0.0808,-0.30263 -0.06344,-1.00551 0.01835,-0.74305 0.0346,-0.86987 0.157303,-1.22709 0.07526,-0.21911 0.197122,-0.52164 0.270797,-0.67228 l 0.133954,-0.2739 0.585137,-0.014 c 0.622141,-0.0149 0.658812,-0.0329 0.507415,-0.24906 -0.110613,-0.15793 -0.333019,-0.25979 -0.567191,-0.25979 -0.146061,0 -0.201668,-0.0206 -0.201668,-0.0747 0,-0.0639 0.143863,-0.0747 0.995977,-0.0747 0.852113,0 0.995976,0.0108 0.995976,0.0747 0,0.0541 -0.05561,0.0747 -0.201668,0.0747 -0.234173,0 -0.456578,0.10186 -0.567191,0.25979 -0.145929,0.20834 -0.106578,0.23819 0.313954,0.23819 0.490838,0 0.586109,0.0662 0.849703,0.5904 0.529559,1.0531 1.334423,1.70044 2.443723,1.96543 l 0.4482,0.10707 v 0.46019 0.46018 l -1.954603,0.0136 c -1.075032,0.007 -2.369178,0.002 -2.875882,-0.0113 z m 4.730888,-0.62249 c 0,-0.19089 -0.01476,-0.22409 -0.0996,-0.22409 -0.08228,0 -0.0996,0.0332 -0.0996,0.1909 0,0.20415 0.02743,0.25729 0.132797,0.25729 0.0455,0 0.0664,-0.0706 0.0664,-0.2241 z m -0.298793,-0.044 c 0,-0.19329 -0.01425,-0.22101 -0.124497,-0.24209 -0.118987,-0.0227 -0.124497,-0.0131 -0.124497,0.21829 0,0.22503 0.0088,0.24209 0.124497,0.24209 0.113862,0 0.124497,-0.0187 0.124497,-0.21829 z m -0.398391,-0.0805 c 0,-0.13695 -0.01681,-0.2493 -0.03735,-0.24968 -0.02054,-4.2e-4 -0.08777,-0.0142 -0.149396,-0.0307 -0.105355,-0.0282 -0.112047,-0.015 -0.112047,0.22112 0,0.19732 0.01868,0.25603 0.08715,0.27392 0.19786,0.0517 0.211645,0.0377 0.211645,-0.21466 z m -0.448189,-0.11651 c 0,-0.23661 -0.01397,-0.27226 -0.12684,-0.32369 -0.208598,-0.095 -0.22761,-0.0747 -0.211787,0.22651 0.01511,0.28761 0.04587,0.32417 0.301278,0.35812 0.02054,0.003 0.03735,-0.11469 0.037349,-0.26094 z m -0.549895,-0.21963 c -0.0021,-0.32814 -0.0062,-0.33876 -0.174296,-0.4459 l -0.172188,-0.10976 v 0.37106 c 0,0.37091 6.5e-5,0.37108 0.161847,0.44183 0.08901,0.0389 0.167448,0.0726 0.174295,0.0748 0.0068,0.002 0.0115,-0.14721 0.01034,-0.33208 z m -3.643165,0.0772 c 0.139685,-0.13968 0.03445,-0.38843 -0.164336,-0.38843 -0.133484,0 -0.224095,0.0906 -0.224095,0.2241 0,0.13348 0.09061,0.22409 0.224095,0.22409 0.05752,0 0.131468,-0.0269 0.164336,-0.0598 z m 1.955485,-0.0461 c 0.08968,-0.16758 -0.01372,-0.3423 -0.202567,-0.3423 -0.111154,0 -0.165881,0.0315 -0.205386,0.1182 -0.07899,0.17336 0.0185,0.32999 0.205386,0.32999 0.09782,0 0.164568,-0.0349 0.202567,-0.10589 z m 1.092202,-0.40689 v -0.41318 l -0.199195,-0.19451 -0.199195,-0.19451 v 0.30195 c 0,0.54734 0.04919,0.76025 0.193803,0.83885 0.07144,0.0388 0.146696,0.0715 0.167238,0.0726 0.02054,10e-4 0.03735,-0.18394 0.03735,-0.41119 z m -0.873248,-0.94883 c 0.08818,-0.0645 0.08524,-0.0834 -0.07135,-0.46064 -0.08982,-0.21636 -0.188549,-0.40986 -0.219394,-0.42998 -0.03085,-0.0201 -0.484721,-0.0369 -1.008612,-0.0374 -0.702437,-5.6e-4 -0.965904,0.0156 -1.003466,0.0615 -0.07572,0.0925 -0.309851,0.68854 -0.309851,0.78877 0,0.0478 0.02801,0.0982 0.06225,0.11198 0.03424,0.0138 0.601395,0.0269 1.260353,0.029 0.9323,0.003 1.218506,-0.011 1.290068,-0.0633 z m -0.884452,-1.50352 0.109754,-0.17219 h -0.244408 -0.244409 l 0.109755,0.17219 c 0.06036,0.0947 0.120959,0.17218 0.134654,0.17218 0.01369,0 0.07429,-0.0775 0.134654,-0.17218 z m -2.80448907,5.72741 c -0.04543,-0.0693 -0.07353,-0.13511 -0.06246,-0.14618 0.01107,-0.0111 0.05788,0.0456 0.104027,0.12605 0.102768,0.17907 0.07225,0.19384 -0.04157,0.0201 z m 7.68148707,0.002 c 0.115138,-0.19663 0.117625,-0.19956 0.117625,-0.13832 0,0.0289 -0.04615,0.10549 -0.102553,0.17015 l -0.102553,0.11756 z m -7.77685707,-3.56062 c 0,-1.84878 0.0062,-2.6051 0.0138,-1.68071 0.0076,0.92439 0.0076,2.43703 0,3.36142 -0.0076,0.92439 -0.0138,0.16807 -0.0138,-1.68071 z m 7.91801207,0 c 0,-1.84878 0.0062,-2.6051 0.0138,-1.68071 0.0076,0.92439 0.0076,2.43703 0,3.36142 -0.0076,0.92439 -0.0138,0.16807 -0.0138,-1.68071 z m -7.89174307,-3.4223 c 0,-0.0289 0.04615,-0.10548 0.102554,-0.17015 l 0.102553,-0.11756 -0.08748,0.1494 c -0.115138,0.19662 -0.117625,0.19955 -0.117627,0.13831 z m 7.75544707,-0.12618 -0.08787,-0.16153 0.100317,0.11756 c 0.08536,0.10004 0.130985,0.20691 0.08787,0.20582 -0.0068,-1.4e-4 -0.05199,-0.073 -0.100317,-0.16185 z M 0.63988463,288.9366 c 0.06466,-0.0564 0.141226,-0.10255 0.170146,-0.10255 0.06124,0 0.05831,0.002 -0.138313,0.11762 l -0.149397,0.0875 z m 7.10326407,-0.006 c -0.08217,-0.0526 -0.123867,-0.0958 -0.09266,-0.096 0.0312,-1.4e-4 0.109635,0.0438 0.174296,0.0977 0.148054,0.12334 0.112442,0.12259 -0.08163,-0.002 z m -5.191526,-0.13354 c 0.924391,-0.008 2.43703,-0.008 3.36142,0 0.924391,0.008 0.168071,0.0138 -1.68071,0.0138 -1.848781,0 -2.605101,-0.006 -1.68071,-0.0138 z\"\n\t\t\t\tstyle=\"fill:#ffffff;fill-opacity:1;stroke-width:0.04979881\" />\n\t\t\t\t</g>\n\t\t\t</svg>\n\t\t</div>\n       </th>\n        <th class=\"head1\">\n            Abfahrt\n        </th>\n        <th class=\"head2\">\n           Departure / Départ \n        <th class=\"head3\" id=\"time\">\n            {{ time }}\n        </th>\n        <th class=\"head4\"> \n<div class=\"skalierender-svg-container\">\n\t<svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.0\" width=\"744.09448\" height=\"526.5354\" class=\"skalierendes-svg\" viewBox=\"0 0 745 527\" id=\"svg2367\">\n\t\t<defs id=\"defs2369\"/>\n\t\t<g transform=\"translate(-593.32638,-244.47955)\" id=\"layer1\">\n\t\t<g transform=\"matrix(2.8072397,0,0,2.8072397,-1054.5664,-1311.3148)\" id=\"g2504\">\n\t\t<path d=\"M 829.65558,723.91382 L 607.93512,723.91382 L 607.93512,572.06531 L 829.65558,572.06531 L 829.65558,723.91382 z \" style=\"fill:#ffffff;fill-rule:nonzero;stroke:none\" id=\"path94\"/>\n\t\t<path d=\"M 628.05363,591.26554 L 672.46452,591.26554 C 700.1795,591.26554 716.45792,609.13001 716.45792,647.69737 C 716.45792,688.76906 699.42822,705.21447 672.46452,705.21447 L 628.05363,705.21447 L 628.05363,591.26554 z M 728.89635,591.26554 L 778.56638,591.26554 C 799.35267,591.26554 809.78756,603.78737 809.78756,618.22924 C 809.78756,637.17898 798.68479,643.60689 790.08654,645.44344 L 790.08654,645.94432 C 802.94226,647.61387 814.54582,656.71311 814.54582,674.16029 C 814.46242,692.94303 800.85532,705.21447 775.47767,705.21447 L 728.89635,705.21447 L 728.89635,591.26554 z M 655.51822,609.13001 L 665.28523,609.13001 C 681.06286,609.13001 689.41072,620.48318 689.41072,647.19649 C 689.41072,677.83328 679.6437,687.01601 665.78612,687.01601 L 655.51822,687.01601 L 655.51822,609.13001 z M 756.11055,608.96311 L 766.62884,608.96311 C 777.39772,608.96311 781.82209,614.97354 781.82209,621.98583 C 781.82209,630.50068 777.23072,636.4277 766.46194,636.4277 L 756.11055,636.4277 L 756.11055,608.96311 z M 756.11055,657.88187 L 769.04977,657.88187 C 781.82209,657.88187 785.24469,664.05929 785.24469,672.15675 C 785.24469,681.58987 778.39939,687.01601 769.21676,687.01601 L 756.11055,687.01601 L 756.11055,657.88187 z M 619.12139,560.54524 L 819.88856,560.54524 C 834.16344,560.54524 845.767,572.06531 845.767,586.34028 L 845.767,709.55535 C 845.767,723.83032 834.16344,735.43388 819.88856,735.43388 L 619.12139,735.43388 C 604.84642,735.43388 593.32635,723.83032 593.32635,709.55535 L 593.32635,586.34028 C 593.32635,572.06531 604.84642,560.54524 619.12139,560.54524 z M 619.45528,578.15932 L 819.63807,578.15932 C 824.06244,578.15932 827.65204,581.74892 827.65204,586.17329 L 827.65204,709.72234 C 827.65204,714.14671 824.06244,717.7363 819.63807,717.7363 L 619.45528,717.7363 C 615.03091,717.7363 611.44132,714.14671 611.44132,709.72234 L 611.44132,586.17329 C 611.44132,581.74892 615.03091,578.15932 619.45528,578.15932\" style=\"fill:#ec1b2d;fill-rule:evenodd;stroke:none\" id=\"path96\"/>\n\t\t</g>\n\t\t</g>\n\t</svg>\n</div>\n        </th>\n    </tr>\n</table>\n<table class=head>\n        <colgroup>\n    <col width=\"10\">\n    <col width=\"30\">\n    <col width=\"40\">\n    <col width=\"40\">\n    <col width=\"80\">\n    <col width=\"140\">\n    <col width=\"40\">\n    <col width=\"60\">\n  </colgroup>\n\t<tr class=\"trhead\">\n        <th> </th>\n        <th>Zeit</th>\n        <th>Erwartet</th>\n        <th>Zug</th>\n        <th>nach</th>\n        <th>    </th>\n        <th>Bahnsteig</th>\n        <th> </th>\n    </tr>\n    <tr class=\"trhead\">\n        <th>\n        </th>\n        <th class=\"it\">Time</th>\n        <th class=\"it\">Estimated</th>\n        <th class=\"it\">Train</th>\n        <th class=\"it\">to</th>\n        <th>\n        </th>\n        <th class=\"it\">Platform</th>\n        <th>\n        </th>\n    </tr>\n</table>\n<table class=\"list\">\n    <colgroup>\n    <col width=\"10\">\n    <col width=\"30\">\n    <col width=\"40\">\n    <col width=\"40\">\n    <col width=\"80\">\n    <col width=\"140\">\n    <col width=\"40\">\n    <col width=\"60\">\n  </colgroup>\n<tbody id=\"list\"></tbody>\n</table>\n<table class=\"foot\">\n    <tr class=\"foot\">\n        <td class=\"foot\" id=\"fault\">\n          {{ fault }}\n        </td>\n    </tr>\n</table>\n</body>\n</html>",
        "output": "str",
        "x": 489.5,
        "y": 282,
        "wires": [
            [
                "3ee26f93.1a2448"
            ]
        ]
    },
    {
        "id": "5383a17c.bd9b4",
        "type": "template",
        "z": "e962ade6.b53fa",
        "name": "Stylesheet",
        "field": "payload.style",
        "fieldType": "msg",
        "format": "html",
        "syntax": "mustache",
        "template": ":root {\n/* Hier sind die Farben für die Ausgabe definiert\nEs können jeweils Hintergrund- und Schriftfarbe angepasst werden */\n    /*Hintergrundfarbe */\n    --background: #006;\n    /*Schriftfarbe */\n    --fontcolor: #fff;\n    /* Schriftart */\n    --fontart: arial;\n    //color: #fff;\n    /* Hintergrundfarbe ungerade Zeile Liste */\n    --backgroundfirst: #006;\n    /* Schriftfarbe ungerade Zeile */\n    --fontfirst: #fff;\n    /* Hintergrundfarbe gerade Zeile */\n    --backgroundsec: #309;\n    /* Schriftfarbe gerade Zeile */\n    --fontsec: #fff;\n    /* Hintergrundfarbe Störung (fault) */\n    --backgroundfault: #ff0;\n    /* Schriftfarbe Störung (fault) */\n    --fontfault: #006;\n}\nbody {\n    /* definiert die Schriftgröße zum gesamten Seitenverhältnis */\n    font-size: 1em;\n    background-color: var(--background);\n    color: var(--fontcolor);\n    padding:0 0 0 0;\n}\n\n/* Abfahrt */\n.head1 {font-size: 2.5em}\n/* Depart*/\n.head2 {font-style: italic; font-size: 1.5em}\n/* Uhr */\n.head3 {font-size: 2.0em; text-align: left}\n/* Logo */\n.head4 { font-size: 2.0em; text-align: left; color: var(--fontcolor)}\n.it {font-style: italic; font-size: 1.3em; text-align: left}\n/* Hintergrundfarbe der Zellen im Kopf und am Fuss */\ntd.head {background-color: var(--background)}\ntd.foot {background-color: var(--background)}\n\ntable.head {\n    table-layout:fixed;\n    overflow: hidden;\n\twidth: 100%;\n\theight: 50%;\n\tfont-family: var(--fontart);\n\tborder: 0px;\n\tborder-color: #fff;\n\tborder-spacing: 0;\n\tmargin:0;\n    padding: 0;\n}\ntable.list {\n    table-layout:fixed;\n    overflow: hidden;\n\twidth: 100%;\n\theight: 100%;\n\tfont-family: var(--fontart);\n\tborder: 0px;\n\tborder-spacing: 0;\n\tmargin:0;\n    padding: 0;\n}\np { padding: 0; margin: 0;\n}\ntable.foot {\n    table-layout:fixed;\n    overflow: hidden;\n    background-color: var(--background);\n\twidth: 100%;\n\theight: 100%;\n\tfont-family: var(--fontart);\n\tborder: 0px;\n\tborder-spacing: 0;\n\tmargin:0;\n    padding: 0;\n}\n\ndiv.run {\n    background-color: var(--backgroundfault);\n    white-space: nowrap;\n    overflow: hidden;\n}\nspan.fault2 {\n    /*display:block;*/\n    margin-left:100%;\n    font-size: 2em;\n    color: var(--fontfault);\n    padding: 0px;\n    /*height: 2em;*/\n    /*width: 100%;*/\n    -webkit-animation: textrun 25s linear infinite;\n    animation: textrun 25s linear infinite;\n    }\n    @-webkit-keyframes textrun {\n    0% {  transform: translate(0%, 0);}\n    100% { margin-left:-100%;transform: translate(-100%, 0);}\n    }\n \n    @keyframes textrun {\n    0% { transform: translate(0, 0);}\n    100% { margin-left:-100%; transform: translate(-100%, 0); }\n    }\nspan.fault1 {\n    font-size: 2em;\n    color: var(--fontfault);\n    background-color: var(--backgroundfault);    \n    padding: 0px;\n    /*height: 2em;*/\n    /*width: 100%;*/\n}\n      th {\n        background-color: var(--background); \n        color: var(--fontcolor);\n      \tfont-size: 1.3em;\n      \ttext-align: left;\n      \tmargin:0;\n      \tpadding: 0 0 0 0;\n      \theight: 1.5em;\n        /*border-bottom: 0px solid #ffffff;*/\n      }\n      /* Hintergrundfarbe Standard einer Zeile */\n      tr {\n        background-color: var(--background);\n        color: var(--fontcolor);\n        /* Zeilenhöhe */\n        height : 2em;\n      }\n      /* Hintergrundfarbe der ungeraden Zeilen */\n      tr:nth-child(even) {\n        background-color: var(--backgroundfirst);\n        color: var(--fontfirst);\n        /* Zeilenhöhe */\n        height : 2em;\n      }\n      /* Hintergrundfarbe der geraden Zeilen */\n      tr:nth-child(odd) {\n        background-color: var(--backgroundsec);\n        color: var(--fontsec);\n        /* Zeilenhöhe */\n        height : 2em;\n      }\n/* Formatierung der einzelnen Zellen / Felder der Liste */\n.point {color: --fontcolor; text-align: center; position: absolut;}\n.time {text-align: left; font-size: 1.5em}\n.train {padding-left: 10px; font-size: 1.3em}\n.des {text-align: left; font-size: 1.5em; height: 2em}\n.via {padding-left: 10px}\n.track {padding-left: 10px; text-align: center; font-size: 1.3em}\n.notice {padding-left: 10px}\n#cancel {font-size: 14px; font-style: italic}\n#cancel::first-line {font-style: normal}\n\n/* Important ! NO changes in follow */\n\ndiv.skalierender-svg-container {\n display: table-cell;\n position: relative; \n width: 100px;\n padding-bottom: 60%; /*override this inline for aspect ratio other than square */\n}\n.skalierendes-svg {\n position: absolute; \n height: 100%; \n width: 100%; \n left: 0; \n top: 0;\n}",
        "output": "str",
        "x": 311.5,
        "y": 282,
        "wires": [
            [
                "c8aa5520.c4505"
            ]
        ]
    },
    {
        "id": "d84b1918.e0bba8",
        "type": "websocket in",
        "z": "e962ade6.b53fa",
        "name": "",
        "server": "63d13d4e.f28854",
        "client": "",
        "x": 80.5,
        "y": 217,
        "wires": [
            []
        ]
    },
    {
        "id": "c2d6c229.f965c8",
        "type": "websocket out",
        "z": "e962ade6.b53fa",
        "name": "",
        "server": "63d13d4e.f28854",
        "client": "",
        "x": 796.5,
        "y": 155,
        "wires": []
    },
    {
        "id": "cafe9d5b.d4035",
        "type": "mqtt-broker",
        "z": "",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": ""
    },
    {
        "id": "63d13d4e.f28854",
        "type": "websocket-listener",
        "z": "",
        "path": "/ws/fpa",
        "wholemsg": "false"
    }
]