Getting charts to work - NOOB

Hi, I am very new to Node Red, but I am trying to learn.

I am replicating this solar forecast service here.
I installed node-red-contrib-chartjs and added it to the flow.
The chart is created, but it is blank.
Was wondering if anyone might help me troubleshoot.
Chart.js samples (venus.local)


[{"id":"2c960f5d8350dc1e","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"9f3296e0a0295237","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"a543a3917ae9ec1a","type":"tab","label":"Flow 3","disabled":false,"info":"","env":[]},{"id":"93f485839dfa27a8","type":"subflow","name":"Solar forecast","info":"This subflow uses the http request node to fetch solar forecasts for geographical positions, using the API from https://forecast.solar/. Please check their website and consider getting a paid account.\n\nDo note that, on a free account, you are limited in the number of requests to do. Also note that the data only gets updated once every 15 minutes, so there is no reason to query more often. There is rate limiting built in the subflow not to perform requests more than once every 15 minutes.\n\n# Configuration\n\nIt uses the parameters as described on: http://doc.forecast.solar/doku.php\n\n - `:apikey` - personal API key for registered users\n - `:lat` - latitude of location, -90 (south) … 90 (north); Internal precission is 0.0001 or abt. 10 m\n - `:lon` - longitude of location, -180 (west) … 180 (east); Internal precission is 0.0001 or abt. 10 m\n - `:dec` - plane declination, 0 (horizontal) … 90 (vertical); Internal precission is integer\n - `:az` - plane azimuth, -180 … 180 (-180 = north, -90 = east, 0 = south, 90 = west, 180 = north); Internal precission is integer\n - `:kwp` - installed modules power in kilo watt peak (kWp)\n\nYou can choose between 3 different type of requests. Note that only `estimate` is available on the free plan.\n\n- `estimate` - this is the forecasted estimate that your panels should produce (given the right parameter settings)\n- `history` - historical data showing the long term averages for the days to come. See [https://joint-research-centre.ec.europa.eu/pvgis-online-tool/pvgis-data-download/cm-saf-solar-radiation_en](https://joint-research-centre.ec.europa.eu/pvgis-online-tool/pvgis-data-download/cm-saf-solar-radiation_en) for where the data is fetched from.\n- `clear sky` - estimate given if there would be a clear sky tomorrow\n\nIn case of estimates, one of the following options can be selected:\n- `watts` - Watts (power) average for the period\n- `watt_hours_period` - Watt hours (energy) for the period\n- `watt_hours` - Watt hours (energy) summarized over the day\n- `watt_hours_day` - Watt hours (energy) summarized for each day\n\nFor the graph output there are some extra settings available:\n\n- _Output in kWh_ - when checked output can be set to kWh instead of Wh\n- _Show todays forecast_ - whether or not to include todays forecast\n- _Days to forecast_ - the number of days to forecast (excluding today). Note that you can not get more days forecasted than your API key allows.\n- _Widen graph_ - widen the graph to only show non-zero values\n\n# Input \n\nThe input is for triggering the solar forecast request. \nIt triggers when injecting a message into the node.\n\n# Output\n\nThere are two outputs. The first output is an object with the result and a status message stored into the `msg.payload`.\n\nMost important is the `msg.payload.result`, which contains the estimated production of the panels. E.g.:\n\n```\npayload: object\n  result: object\n    2022-11-28: 23\n    2022-11-29: 35\n```\n\nThe `msg.payload.message` gives information on how successful the query was, the exitcode of the query and the status of the rate limit (how many queries you have left).\n\nThe **second** output can be directly linked to a line or a bar chart, quickly giving a once-glance overview for the predicted forecast.\n\n# Status\n\nInitially the status of the note will be a blue dot, showing \"_Unknown limit_\", as it is unaware of the set ratelmits. After the first request, the returned ratelimit will be put in the text in the form of `remaining/limit`. If more than half the limit is remaining, the dot will be green. If less then half the limit is remaining, the dot will be yellow. If no limit is left, the dot will turn red.\nPlease keep in mind that the ratelimit will be reset after one hour, so you can send a new request after that hour.\n\nIf something is wrong in the API request, the dot will turn red\nand the message will contain the msg.payload with the error. This\nhappens typically when the API is temporally down for maintenance.","category":"","in":[{"x":240,"y":100,"wires":[{"id":"c8dc6aa14b9f3e92"}]}],"out":[{"x":760,"y":260,"wires":[{"id":"2f42837904c91d73","port":0},{"id":"fcc8d69a3ab88e6d","port":0}]},{"x":770,"y":340,"wires":[{"id":"5b0a430fb61e70e7","port":0}]}],"env":[{"name":"latitude","type":"num","value":"51.3","ui":{"icon":"font-awesome/fa-location-arrow","type":"input","opts":{"types":["num"]}}},{"name":"longitude","type":"num","value":"5.6","ui":{"icon":"font-awesome/fa-location-arrow","type":"input","opts":{"types":["num"]}}},{"name":"declination","type":"num","value":"37","ui":{"icon":"font-awesome/fa-chevron-up","type":"input","opts":{"types":["num"]}}},{"name":"azimuth","type":"num","value":"0","ui":{"icon":"font-awesome/fa-compass","type":"spinner","opts":{"min":-180,"max":180}}},{"name":"modules power","type":"num","value":"1","ui":{"icon":"font-awesome/fa-power-off","type":"input","opts":{"types":["num"]}}},{"name":"apikey","type":"cred","ui":{"icon":"font-awesome/fa-key","type":"input","opts":{"types":["cred"]}}},{"name":"type","type":"str","value":"estimate","ui":{"label":{"en-US":"type"},"type":"select","opts":{"opts":[{"l":{"en-US":"Estimate"},"v":"estimate"},{"l":{"en-US":"History"},"v":"history"},{"l":{"en-US":"Clear sky"},"v":"clearsky"}]}}},{"name":"watt","type":"str","value":"watts","ui":{"icon":"font-awesome/fa-question-circle-o","type":"select","opts":{"opts":[{"l":{"en-US":"Watts (power) average for the period"},"v":"watts"},{"l":{"en-US":"Watt hours (energy) for the period"},"v":"watt_hours_period"},{"l":{"en-US":"Watt hours (energy) summarized over the day"},"v":"watt_hours"},{"l":{"en-US":"Watt hours (energy) summarized for each day"},"v":"watt_hours_day"}]}}},{"name":"kwhoutput","type":"bool","value":"false","ui":{"label":{"en-US":"Output in kWh (in the graph)"},"type":"checkbox"}},{"name":"showtoday","type":"bool","value":"true","ui":{"label":{"en-US":"Show todays forecast"},"type":"checkbox"}},{"name":"daystoforecast","type":"str","value":"-1","ui":{"label":{"en-US":"Days to forecast"},"type":"select","opts":{"opts":[{"l":{"en-US":"Max"},"v":"-1"},{"l":{"en-US":"0"},"v":"0"},{"l":{"en-US":"1"},"v":"1"},{"l":{"en-US":"2"},"v":"2"},{"l":{"en-US":"3"},"v":"3"},{"l":{"en-US":"4"},"v":"4"},{"l":{"en-US":"5"},"v":"5"},{"l":{"en-US":"6"},"v":"6"}]}}},{"name":"widengraph","type":"bool","value":"true","ui":{"label":{"en-US":"Widen graph"},"type":"checkbox"}}],"meta":{"module":"Solar Forecast","version":"0.0.9","author":"dfaber@victronenergy.com","desc":"Get solar forecasting per location","keywords":"solar,forecast,api","license":"GPL-3.0"},"color":"#FFCC66","inputLabels":["trigger"],"outputLabels":["output","graph"],"icon":"font-awesome/fa-sun-o","status":{"x":680,"y":560,"wires":[{"id":"1bfc1cde3ee94e4b","port":0},{"id":"a798fbe66cf133d5","port":0}]}},{"id":"victron-client-id","type":"victron-client"},{"id":"c706820c0d61f023","type":"http request","z":"93f485839dfa27a8","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":390,"y":180,"wires":[["1b5ccaa05d54f7c3"]]},{"id":"b9488734852cd0ca","type":"function","z":"93f485839dfa27a8","name":"create forecast.solar url","func":"msg.url = 'https://api.forecast.solar/';\n\nif (env.get('apikey')) {\n    msg.url += env.get('apikey') + '/';\n    }\n\nmsg.url += env.get('type') + '/';\n\nmsg.url += env.get('watt') + '/';\n\nmsg.url += env.get('latitude') + '/' +\n           env.get('longitude') + '/' +\n           env.get('declination') + '/' +\n           env.get('azimuth') + '/' +\n           env.get('modules power');\n\nmsg.topic = 'solar forecast: '+(env.get('type') || '');\nmsg.topic += (' '+env.get('watt') || '');\nif (env.get('kwhoutput')) {\n    msg.topic += ' (kWh)';\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":100,"wires":[["975daf96f15cfb61"]]},{"id":"1b5ccaa05d54f7c3","type":"json","z":"93f485839dfa27a8","name":"Convert to json","property":"payload","action":"","pretty":false,"x":680,"y":180,"wires":[["e718a22973cc2864"]]},{"id":"559391d1288f762a","type":"function","z":"93f485839dfa27a8","name":"update ratelimit","func":"var remaining = msg.payload.message.ratelimit.remaining || 0;\nvar limit = msg.payload.message.ratelimit.limit;\n\nflow.set('forecast.solar.ratelimit.remaining', remaining)\nflow.set('forecast.solar.ratelimit.limit', limit)\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":480,"wires":[["e56826252134b93a"]]},{"id":"e718a22973cc2864","type":"link out","z":"93f485839dfa27a8","name":"link out 1","mode":"link","links":["3fa24f2d08195961","0a20e852662c8cec"],"x":815,"y":180,"wires":[]},{"id":"3fa24f2d08195961","type":"link in","z":"93f485839dfa27a8","name":"link in 1","links":["e718a22973cc2864"],"x":385,"y":480,"wires":[["559391d1288f762a"]]},{"id":"0a20e852662c8cec","type":"link in","z":"93f485839dfa27a8","name":"link in 2","links":["e718a22973cc2864"],"x":225,"y":260,"wires":[["fcc8d69a3ab88e6d"]]},{"id":"4734b6f403e1f03e","type":"inject","z":"93f485839dfa27a8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":530,"y":440,"wires":[["e56826252134b93a"]]},{"id":"1bfc1cde3ee94e4b","type":"function","z":"93f485839dfa27a8","name":"update status","func":"var remaining = flow.get('forecast.solar.ratelimit.remaining') || -1;\nvar limit = flow.get('forecast.solar.ratelimit.limit') || -1\n\nvar text = remaining.toString() + '/' + limit.toString();\nvar fill = \"green\";\n\nif (remaining == 0) {\n    fill = \"red\";\n    text = \"Limit used\";\n}\n\nif (remaining > 0 && remaining < limit / 2) {\n    fill = \"yellow\"\n}\n\nif (remaining == -1 ) {\n    fill = \"blue\"\n    text = \"Limits unknown\"\n}\n\nmsg.payload = ({ fill: fill, text: text });\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":580,"wires":[[]]},{"id":"a18e96179ec2d987","type":"function","z":"93f485839dfa27a8","name":"Create graph output","func":"var m = {};\nm.labels = [];\nm.data = [];\n\nm.series = [];\nm.data = [];\nm.labels = [];\n\nfor (let j = 0; j <= msg.days; j++) {\n    m.data[j] = [];\n}\n\nif (msg.watt === 'watt_hours_day') {\n    var i = 0;\n    m.series.push(\"Watt hours per day\");\n    for (const key in msg.payload.result) {\n        m.labels.push(key);\n        if (msg.kwhoutput) {\n            m.data[i] = +(Math.round(msg.payload.result[key]/100)*.1).toFixed(1);\n        } else {\n            m.data[i] = msg.payload.result[key];\n        }\n        i++;\n    }\n    m.data = [m.data];\n    return { payload: [m] };\n}\n\nfor (let i = 0; i <= 23; i++) {\n\n    m.labels.push(i.toString()+':00');\n    if (msg.resolution === 4) {\n       m.labels.push(i.toString()+':15');\n    }\n    if (msg.resolution === 2 || msg.resolution == 4) {\n       m.labels.push(i.toString()+':30');\n    }\n    if (msg.resolution === 4) {\n       m.labels.push(i.toString()+':45');\n    }\n\n    for (let j = 0; j <= msg.days; j++) {\n        m.data[j].push(0);\n        if (msg.resolution === 4) {\n           m.data[j].push(0)\n        }\n        if (msg.resolution === 2 || msg.resolution == 4) {\n           m.data[j].push(0)\n        }\n        if (msg.resolution === 4) {\n           m.data[j].push(0)\n        }\n\n    }\n}\n\nvar offset = 0;\nfor (const key in msg.payload.result) {\n    var d = new Date(key)\n    if (m.series.indexOf(d.toISOString().split('T')[0]) === -1) {\n        m.series.push(d.toISOString().split('T')[0])\n    }\n\n    var h = d.getHours();\n    var minutes = d.getMinutes();\n\n    if (minutes === 0 ) {\n        offset = 0;\n    } else {\n        offset++;\n    }\n\n    if (msg.kwhoutput) {\n        m.data[m.series.length - 1][h*msg.resolution+offset] = +(Math.round(msg.payload.result[key]/100)*.1).toFixed(1);\n    } else {\n        m.data[m.series.length - 1][h*msg.resolution+offset] = msg.payload.result[key];\n    }\n}\n\nreturn { payload: [m] };\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":340,"wires":[["5b0a430fb61e70e7"]]},{"id":"975daf96f15cfb61","type":"link out","z":"93f485839dfa27a8","name":"link out 7","mode":"link","links":["14f2e68e572f4ef8"],"x":805,"y":100,"wires":[]},{"id":"14f2e68e572f4ef8","type":"link in","z":"93f485839dfa27a8","name":"link in 18","links":["975daf96f15cfb61"],"x":245,"y":180,"wires":[["c706820c0d61f023"]]},{"id":"c4307905e114824f","type":"catch","z":"93f485839dfa27a8","name":"","scope":null,"uncaught":false,"x":260,"y":440,"wires":[["f427f19392c399ce"]]},{"id":"e56826252134b93a","type":"link out","z":"93f485839dfa27a8","name":"link out 8","mode":"link","links":["dbaf8f5f5a920686"],"x":685,"y":480,"wires":[]},{"id":"dbaf8f5f5a920686","type":"link in","z":"93f485839dfa27a8","name":"link in 19","links":["e56826252134b93a"],"x":385,"y":580,"wires":[["1bfc1cde3ee94e4b"]]},{"id":"f427f19392c399ce","type":"link out","z":"93f485839dfa27a8","name":"link out 9","mode":"link","links":["2ded0c14a222b4d9","2f42837904c91d73"],"x":375,"y":440,"wires":[]},{"id":"2ded0c14a222b4d9","type":"link in","z":"93f485839dfa27a8","name":"link in 20","links":["f427f19392c399ce"],"x":385,"y":540,"wires":[["a798fbe66cf133d5"]]},{"id":"a798fbe66cf133d5","type":"function","z":"93f485839dfa27a8","name":"Set error status","func":"node.warn(msg.payload)\nmsg.payload = ({ fill: \"red\", text: msg.payload });\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":540,"wires":[[]]},{"id":"2f42837904c91d73","type":"link in","z":"93f485839dfa27a8","name":"link in 21","links":["f427f19392c399ce"],"x":665,"y":280,"wires":[[]]},{"id":"fcc8d69a3ab88e6d","type":"function","z":"93f485839dfa27a8","name":"Processed info","func":"msg.resolution = 60;\nmsg.days = 1;\nmsg.type = env.get('type');\nmsg.watt = env.get('watt');\nmsg.kwhoutput = env.get('kwhoutput');\n\nvar key1 = Object.keys(msg.payload.result)[1];\nvar key2 = Object.keys(msg.payload.result)[2];\nvar key3 = Object.keys(msg.payload.result)[Object.keys(msg.payload.result).length-1];\n\nvar d1 = new Date(key1);\nvar d2 = new Date(key2); \nvar d3 = new Date(key3);\nmsg.resolution = 3600000 / (d2.getTime() - d1.getTime());\n\nmsg.days = Math.floor((d3.getTime() - d1.getTime()) / (1000 * 3600 * 24));\n\nif (msg.watt === 'watt_hours_day') {\n    msg.resolution = null;\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":260,"wires":[["a18e96179ec2d987"]],"info":"Function to process the result from forecast.solar to add\nextra information, which is handy for either graphing or\nto store in a database.\n\n\nThe extra values added:\n- `msg.resolution` - The number of measurements per hour. If\nno API key is used, this will be 1. Other values may be 2 or 4.\n- `msg.days` - The number of days in the forcast. If no API\n- key is used this will be 1. Other values may be 3 or 6."},{"id":"5b0a430fb61e70e7","type":"function","z":"93f485839dfa27a8","name":"Filter graph","func":"var forecasted = msg.payload[0].series.length;\n\nif ((env.get('daystoforecast') > -1) && (env.get('daystoforecast') < forecasted)) {\n    for (i = 1; i < (forecasted - env.get('daystoforecast')); i++ ) {\n        msg.payload[0].data.pop();\n        msg.payload[0].series.pop();\n    }\n}\n\nif (env.get('watt') === 'watt_hours_day' ) {\n    forecasted = msg.payload[0].labels.length;\n    for (i = 1; i < (forecasted - env.get('daystoforecast')); i++ ) {\n        msg.payload[0].labels.pop();\n        msg.payload[0].data[0].pop();\n    }\n}\n\nif (!env.get('showtoday')) {\n    msg.payload[0].data.shift();\n    msg.payload[0].series.shift();\n}\n\nif (env.get('widengraph')) {\n    var c = msg.payload[0].labels.length;\n    var x = 0;\n    for (i = 0; i < c; i++) {\n        var remove = true;\n        for (d = 0; d < msg.payload[0].data.length; d++) {\n            if (msg.payload[0].data[d][x] > 0) {\n                remove = false;\n            }\n        }\n        if (remove) {\n            msg.payload[0].labels.splice(x, 1);\n            for (d = 0; d < msg.payload[0].data.length; d++) {\n                 msg.payload[0].data[d].splice(x, 1);\n            }\n            x--;\n        }\n        x++;\n    }\n    // Still the first and last datapoints should be zero, so\n    // add those again\n    msg.payload[0].labels.unshift('');\n    msg.payload[0].labels.push('');\n    for (d = 0; d < msg.payload[0].data.length; d++) {\n         msg.payload[0].data[d].unshift(0);\n         msg.payload[0].data[d].push(0);\n    }   \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":340,"wires":[[]]},{"id":"c8dc6aa14b9f3e92","type":"delay","z":"93f485839dfa27a8","name":"1 msg/15 minutes","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"15","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":100,"wires":[["b9488734852cd0ca"]]},{"id":"a7e1312e.5108a","type":"victron-input-battery","z":"2c960f5d8350dc1e","service":"com.victronenergy.battery.ttyS7","path":"/Soc","serviceObj":{"service":"com.victronenergy.battery.ttyS7","name":"TG BMV 712 ","paths":[{"path":"/Alarms/Alarm","type":"enum","name":"Alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/HighStarterVoltage","type":"enum","name":"High starter-voltage alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/HighTemperature","type":"enum","name":"High battery temperature alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/HighVoltage","type":"enum","name":"High voltage alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/LowSoc","type":"enum","name":"Low state-of-charge alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/LowStarterVoltage","type":"enum","name":"Low starter-voltage alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/LowTemperature","type":"enum","name":"Low battery temperature alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/LowVoltage","type":"enum","name":"Low voltage alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/Alarms/MidVoltage","type":"enum","name":"Mid-voltage alarm","enum":{"0":"No alarm","2":"Alarm"}},{"path":"/ConsumedAmphours","type":"float","name":"Consumed Amphours (Ah)"},{"path":"/Dc/0/Current","type":"float","name":"Current (A)"},{"path":"/Dc/0/MidVoltage","type":"float","name":"Mid-point voltage of the battery bank (V)"},{"path":"/Dc/0/MidVoltageDeviation","type":"float","name":"Mid-point deviation of the battery bank (%)"},{"path":"/Dc/0/Temperature","type":"float","name":"Battery temperature (C)"},{"path":"/Dc/0/Voltage","type":"float","name":"Voltage (V)"},{"path":"/Dc/1/Voltage","type":"float","name":"Starter battery voltage (V)"},{"path":"/History/AutomaticSyncs","type":"float","name":"Automatic syncs (count)"},{"path":"/History/AverageDischarge","type":"float","name":"Average discharge (Ah)"},{"path":"/History/ChargeCycles","type":"float","name":"Charge cycles (count)"},{"path":"/History/ChargedEnergy","type":"float","name":"Charged Energy (kWh)"},{"path":"/History/DeepestDischarge","type":"float","name":"Deepest discharge (Ah)"},{"path":"/History/DischargedEnergy","type":"float","name":"Discharged Energy (kWh)"},{"path":"/History/FullDischarges","type":"float","name":"Full discharges (count)"},{"path":"/History/HighStarterVoltageAlarms","type":"float","name":"High starter voltage alarms (count)"},{"path":"/History/HighVoltageAlarms","type":"float","name":"High voltage alarms (count)"},{"path":"/History/LastDischarge","type":"float","name":"Last discharge (Ah)"},{"path":"/History/LowStarterVoltageAlarms","type":"float","name":"Low starter voltage alarms (count)"},{"path":"/History/LowVoltageAlarms","type":"float","name":"Low voltage alarms (count)"},{"path":"/History/MaximumStarterVoltage","type":"float","name":"Maximum starter voltage (V DC)"},{"path":"/History/MaximumVoltage","type":"float","name":"Maximum voltage (V DC)"},{"path":"/History/MinimumStarterVoltage","type":"float","name":"Minimum starter voltage (V DC)"},{"path":"/History/MinimumVoltage","type":"float","name":"Minimum voltage (V DC)"},{"path":"/History/TimeSinceLastFullCharge","type":"float","name":"Time since last full charge (seconds)"},{"path":"/History/TotalAhDrawn","type":"float","name":"Total Ah drawn (Ah)"},{"path":"/Relay/0/State","type":"enum","name":"Relay status","enum":{"0":"Open","1":"Closed"}},{"path":"/Soc","type":"float","name":"State of charge (%)"},{"path":"/TimeToGo","type":"float","name":"Time to go (h)"}]},"pathObj":{"path":"/Soc","type":"float","name":"State of charge (%)"},"initial":"","name":"","x":200,"y":200,"wires":[["967c021a.4e981"]]},{"id":"7a66435e.a64fcc","type":"victron-output-vebus","z":"2c960f5d8350dc1e","service":"com.victronenergy.vebus.ttyS4","path":"/Mode","serviceObj":{"service":"com.victronenergy.vebus.ttyS4","name":"MultiPlus-II 12/3000/120-50 120V","paths":[{"path":"/Ac/ActiveIn/CurrentLimit","type":"float","name":"Active input current limit (A)","writable":true},{"path":"/Ac/In/1/CurrentLimit","type":"float","name":"Input 1 current limit (A)","writable":true},{"path":"/Mode","type":"enum","name":"Switch Position","enum":{"1":"Charger Only","2":"Inverter Only","3":"On","4":"Off"},"writable":true},{"path":"/Soc","type":"float","name":"VE.Bus state of charge (%)","writable":true},{"path":"/SystemReset","type":"enum","name":"VE.Bus Reset","enum":{"0":"No","1":"Yes"},"writable":true}]},"pathObj":{"path":"/Mode","type":"enum","name":"Switch Position","enum":{"1":"Charger Only","2":"Inverter Only","3":"On","4":"Off"},"writable":true},"initial":"","name":"","x":1370,"y":200,"wires":[]},{"id":"95d75091.0ac12","type":"change","z":"2c960f5d8350dc1e","name":"Charger Only - INVERTER OFF","rules":[{"t":"set","p":"payload","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":830,"y":160,"wires":[["1898bb04.622815","1db37ee24d55e860"]]},{"id":"f5995c2.c28a4a","type":"change","z":"2c960f5d8350dc1e","name":"Inverter ON - INVERT OR CHARGE","rules":[{"t":"set","p":"payload","pt":"msg","to":"3","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":240,"wires":[["1898bb04.622815","1db37ee24d55e860"]]},{"id":"967c021a.4e981","type":"switch","z":"2c960f5d8350dc1e","name":"SoC Switch","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"25","vt":"str"},{"t":"lt","v":"50","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":430,"y":200,"wires":[["95d75091.0ac12"],["e174d8df.3ed888"],["f5995c2.c28a4a"]]},{"id":"1898bb04.622815","type":"rbe","z":"2c960f5d8350dc1e","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"payload","topi":"topic","x":1090,"y":200,"wires":[["7a66435e.a64fcc"]]},{"id":"e174d8df.3ed888","type":"function","z":"2c960f5d8350dc1e","name":"night?","func":"// get current hours\nconst hr = new Date().getHours();\n\n// trigger a message if the time is between 12am and 6am or 'night'\nif (hr >= 0 && hr <= 6) {\n    return [msg, null]; // input 1\n} else {\n    return [null, msg]; // input 2\n}\n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":200,"wires":[["95d75091.0ac12"],["f5995c2.c28a4a"]]},{"id":"1db37ee24d55e860","type":"debug","z":"2c960f5d8350dc1e","name":"debug 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1300,"y":280,"wires":[]},{"id":"82aa6b0cb02c754e","type":"subflow:93f485839dfa27a8","z":"9f3296e0a0295237","name":"","env":[{"name":"latitude","value":"24.6","type":"num"},{"name":"longitude","value":"-81.8","type":"num"},{"name":"declination","value":"0","type":"num"},{"name":"azimuth","value":"180","type":"num"},{"name":"modules power","value":"2450","type":"num"},{"name":"apikey","type":"cred"},{"name":"watt","value":"watt_hours_period","type":"str"},{"name":"kwhoutput","type":"bool","value":"true"},{"name":"daystoforecast","value":"2","type":"str"}],"x":300,"y":260,"wires":[["14c843b0206c8392"],["14c843b0206c8392","adc51c75d3626292"]]},{"id":"e45016f7e1a97af4","type":"inject","z":"9f3296e0a0295237","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":80,"y":280,"wires":[["82aa6b0cb02c754e"]]},{"id":"14c843b0206c8392","type":"debug","z":"9f3296e0a0295237","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":520,"y":280,"wires":[]},{"id":"adc51c75d3626292","type":"chartjs-line","z":"9f3296e0a0295237","name":"TP01","path":"charts","charttitle":"TP01","xaxis":"labels","yaxis":"data","x":510,"y":340,"wires":[["475db9ffa4ca283c"]]},{"id":"475db9ffa4ca283c","type":"debug","z":"9f3296e0a0295237","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":540,"y":440,"wires":[]}]

Instead of posting your entire flow, could you set the debug node connected to the Solar forecast to display. the complete msg object. Then run your flows and copy the data from the debug node and paste it to a reply - please no screen shots. I want to see some data that is being sent to the charts node.

There’s a great page in the docs (Working with messages : Node-RED) that will explain how to use the debug panel to find the right path to any data item.

Pay particular attention to the part about the buttons that appear under your mouse pointer when you over hover a debug message property in the sidebar.

BX00Cy7yHi

Is there a reason you are using that rather than the standard dashboard chart?

No there isnt. It was referenced as the chart tool in the original solar forecast post. What would you recommend instead?

Thank you for your offer to help. Here is the debug info

[{"labels":["","8:00","9:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00","18:00","19:00","20:00",""],"data":[[0,11.7,62.6,134.9,315.7,612.8,1202.4,1652.6,1633.7,1517.7,1271.9,891.3,475.5,92.7,0],[0,74.2,442.9,863.8,1257.2,1573.1,1783.1,1827.6,1755.9,1576.5,1255.9,873.1,467.2,92.1,0]],"series":["2023-03-28","2023-03-29"]}]

The problem is with the format of your data that you are sending to the chart. I've copied some data from the node's NPM site and fed it into the charts node and it works fine. if you import this flow you can see that the node does work, it's just the format of the data is different.

[{"id":"adc51c75d3626292","type":"chartjs-line","z":"9f3296e0a0295237","name":"TP01","path":"charts","charttitle":"TP01","xaxis":"labels","yaxis":"data","x":430,"y":300,"wires":[[]]},{"id":"ca2a41ad30a8ef80","type":"inject","z":"9f3296e0a0295237","name":"Your data","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"labels\":[\"7:00\",\"8:00\",\"9:00\",\"10:00\",\"11:00\",\"12:00\",\"13:00\",\"14:00\",\"15:00\",\"16:00\",\"17:00\",\"18:00\",\"19:00\",\"20:00\",\"\"],\"data\":[[0,11.7,62.6,134.9,315.7,612.8,1202.4,1652.6,1633.7,1517.7,1271.9,891.3,475.5,92.7,0],[0,74.2,442.9,863.8,1257.2,1573.1,1783.1,1827.6,1755.9,1576.5,1255.9,873.1,467.2,92.1,0]],\"series\":[\"2023-03-28\",\"2023-03-29\"]}]","payloadType":"json","x":260,"y":340,"wires":[["adc51c75d3626292","24d22e87c0db590c"]]},{"id":"23a938c563d41f8b","type":"inject","z":"9f3296e0a0295237","name":"Example data","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"channel\":\"Population\",\"color\":\"Blue\",\"dataset\":[{\"x\":\"Europe\",\"y\":741},{\"x\":\"Australia\",\"y\":24},{\"x\":\"Africa\",\"y\":1.2},{\"x\":\"America\",\"y\":325},{\"x\":\"Asia\",\"y\":4.4}]},{\"channel\":\"Economy\",\"color\":\"Green\",\"dataset\":[{\"x\":\"Europe\",\"y\":12},{\"x\":\"Australia\",\"y\":13},{\"x\":\"Africa\",\"y\":3},{\"x\":\"America\",\"y\":22},{\"x\":\"Asia\",\"y\":18}]}]","payloadType":"json","x":250,"y":240,"wires":[["adc51c75d3626292","b04a2421fe6d85ee"]]},{"id":"b04a2421fe6d85ee","type":"debug","z":"9f3296e0a0295237","name":"Example data","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":540,"y":220,"wires":[]},{"id":"24d22e87c0db590c","type":"debug","z":"9f3296e0a0295237","name":"Your data","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":500,"y":380,"wires":[]}]

So you will need to read about chart.js and you should take a tutorial (do a google search using 'charts tutorial' and you will find several) so you can format your data so it will work.

BTY: the node hasn't been updated in over two years and I found when looking at the issues I had commented on one of them and said:

Just tested this on NR v3.0.2 and node-red-contrib-chartjs v0.5.2 running on macOS v12.5 and it works fine.
To open a chart you must use yourIP:1880/XXX where xxx is the PATH named in the node. and you have to open the browser to that path before injecting the data to the node.

For example, if you want to run Population Radar Chart (last example) and NR is running on 192.168.1.50, you would first open a window with http://192.168.1.50:1880/POR and then press the 'inject' button for that flow.

After playing with it a bit, personally I wouldn't use it because if you refresh to chart window in the browser, the data disappears and you have to go back and trigger the sending of the data to te chart again to see it.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.