@paul-thomas1964 Hastily cobbled together as I didn't want to leave you hanging
It should give you a start on how to collect and format the data for the influx batch node.
You will need to install and setup influx and Grafana first. There are plenty of topics on the subject.
Good luck
EDIT: updated this flow 05/05/24
[{"id":"684c3335c4b8c0f4","type":"http request","z":"712086ff.3e3668","name":"Login","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://my.ovoenergy.com/api/v2/auth/login","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":715,"y":945,"wires":[["90fca0eb6cee56a9"]]},{"id":"353f19c455104822","type":"http request","z":"712086ff.3e3668","name":"get account Id","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://smartpaymapi.ovoenergy.com/first-login/api/bootstrap/v2/","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1045,"y":945,"wires":[["aa2511901c4507f5"]]},{"id":"90fca0eb6cee56a9","type":"change","z":"712086ff.3e3668","name":"pass on cookies","rules":[{"t":"set","p":"cookies","pt":"msg","to":"responseCookies","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":865,"y":945,"wires":[["353f19c455104822"]]},{"id":"941566573a2bd7dd","type":"debug","z":"712086ff.3e3668","name":"debug 429","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1335,"y":945,"wires":[],"l":false},{"id":"aa2511901c4507f5","type":"change","z":"712086ff.3e3668","name":"Save account","rules":[{"t":"set","p":"account","pt":"flow","to":"payload.accounts[0].accountId","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1225,"y":945,"wires":[["941566573a2bd7dd"]]},{"id":"6f17099f032ed31b","type":"inject","z":"712086ff.3e3668","name":"Set uid/pw","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"{\"username\":\"name\",\"password\":\"1234\",\"rememberMe\":false}","payloadType":"json","x":415,"y":945,"wires":[["0faf80101d11f3cf"]]},{"id":"daba20e623b83d33","type":"inject","z":"712086ff.3e3668","name":"08:00","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 08 * * *","once":false,"onceDelay":0.1,"topic":"half-hourly","payload":"","payloadType":"date","x":505,"y":870,"wires":[["0a026588ca3e7dfe"]]},{"id":"08196494f1094e6f","type":"function","z":"712086ff.3e3668","name":"prev day 1/2hr data","func":"if (msg.statusCode !== 200) {\n const text = `error - statusCode: ${msg.statusCode} - ${msg.payload.message}`\n node.error(text);\n node.status({ fill: \"red\", shape: \"dot\", text: text });\n return\n}\nlet gas = msg.payload.gas.data\nlet elec = msg.payload.electricity.data\n\nif (gas.length === 0) { // check data exists\n node.warn(\"No Data\");\n node.status({ fill: \"yellow\", shape: \"dot\", text: \"No Data \" + msg.date });\n return [null, msg]\n} else {\n node.send([null, { reset: true }]);\n node.status({ fill: \"green\", shape: \"dot\", text: \"success \" + msg.date });\n}\n\nlet msgData = [];\n\nfor (let index = 0; index < gas.length; index++) {\n\n msgData.push({\n measurement: \"meters\",\n retentionPolicy: \"month\",\n fields: {\n kWh: gas[index].consumption\n },\n tags: { type: \"gas\" },\n timestamp: new Date(gas[index].interval.end).getTime()\n })\n\n msgData.push({\n measurement: \"meters\",\n retentionPolicy: \"month\",\n fields: {\n kWh: elec[index].consumption\n },\n tags: { type: \"electric\" },\n timestamp: new Date(elec[index].interval.end).getTime()\n })\n}\n\nmsg.retentionPolicy = \"month\"\nmsg.payload = msgData\nreturn msg\n","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":990,"y":870,"wires":[["f30fe26d9b66da20"],["9a2d6b76f7a01497"]]},{"id":"08415f8845dc554c","type":"function","z":"712086ff.3e3668","name":"prev day daily data","func":"if (msg.statusCode !== 200) {\n const text = `error - statusCode: ${msg.statusCode} - ${msg.payload.message}`\n node.error(text);\n node.status({ fill: \"red\", shape: \"dot\", text: text });\n return\n}\n\nlet gas = msg.payload.gas.data\nlet elec = msg.payload.electricity.data\n\nlet date = new Date()\nlet index = date.getDate() - 1 //start at 0\n\nif (gas.length === 0 || !gas[index]) { // check data exists\n node.warn(\"No Data\");\n node.status({ fill: \"yellow\", shape: \"dot\", text: \"No Data \" + msg.date });\n return [null, msg]\n} else {\n node.send([null, { reset: true }]);\n node.status({ fill: \"green\", shape: \"dot\", text: \"success \" + msg.date });\n}\n\nlet msgData = [];\n\nmsgData.push({\n measurement: \"meters_daily\",\n fields: {\n kWh: gas[index].consumption,\n cost: parseFloat(gas[index].cost.amount),\n rate: gas[index].rates.anytime,\n standing: gas[index].rates.standing\n },\n tags: { type: \"gas\" },\n timestamp: new Date(gas[index].interval.end).getTime()\n})\n\nmsgData.push({\n measurement: \"meters_daily\",\n fields: {\n kWh: elec[index].consumption,\n cost: parseFloat(elec[index].cost.amount),\n rate: elec[index].rates.anytime,\n standing: elec[index].rates.standing\n },\n tags: { type: \"electric\" },\n timestamp: new Date(elec[index].interval.end).getTime()\n})\n\nmsg.payload = msgData\nreturn msg","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":990,"y":780,"wires":[["f9805cc3853816cd"],["28535746a2b0102f"]],"info":"let gas = msg.payload.gas.data\r\nlet elec = msg.payload.electricity.data\r\n\r\nif (gas.length <= 0) {\r\n node.warn(\"No Data\");\r\n return\r\n}\r\n\r\nlet msgData = [];\r\n\r\nfor (let index = 0; index < gas.length; index++) {\r\n\r\n msgData.push({\r\n measurement: \"meters_daily\",\r\n fields: {\r\n kWh: gas[index].consumption,\r\n cost: parseFloat(gas[index].cost.amount),\r\n rate: gas[index].rates.anytime,\r\n standing: gas[index].rates.standing\r\n },\r\n tags: { type: \"gas\" },\r\n timestamp: new Date(gas[index].interval.end).getTime()\r\n })\r\n\r\n msgData.push({\r\n measurement: \"meters_daily\",\r\n fields: {\r\n kWh: elec[index].consumption,\r\n cost: parseFloat(elec[index].cost.amount),\r\n rate: elec[index].rates.anytime,\r\n standing: elec[index].rates.standing\r\n },\r\n tags: { type: \"electric\" },\r\n timestamp: new Date(elec[index].interval.end).getTime()\r\n })\r\n\r\n}\r\n\r\nmsg.payload = msgData\r\nreturn msg"},{"id":"ba83939051e4d299","type":"inject","z":"712086ff.3e3668","name":"08:01","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"01 08 * * *","once":false,"onceDelay":0.1,"topic":"daily","payload":"","payloadType":"date","x":505,"y":780,"wires":[["40b033d6f34637ed"]]},{"id":"84f8082f57dd83fc","type":"function","z":"712086ff.3e3668","name":"prev month data","func":"if (msg.statusCode !== 200) {\n const text = `error - statusCode: ${msg.statusCode} - ${msg.payload.message}`\n node.error(text);\n node.status({ fill: \"red\", shape: \"dot\", text: text });\n return\n}\n\nlet date = new Date()\n// array index starts at 0, but contains Jan data, luckily JS uses 0 for Jan so returns prev months data for us, but in Jan we need to get Dec\nlet index = (date.getMonth() > 0 ? date.getMonth() : 12)\n\nlet gas = msg.payload.gas.data.filter(el => el.month === index)\nlet elec = msg.payload.electricity.data.filter(el => el.month === index)\n\nif (gas.length === 0) { // check data exists\n node.warn(\"No Data\");\n node.status({ fill: \"yellow\", shape: \"dot\", text: \"No Data \" + msg.date });\n return [null, msg]\n}\nnode.send([null, { reset: true }]);\nnode.status({ fill: \"green\", shape: \"dot\", text: \"success \" + msg.date });\n\nlet msgData = [];\n\nmsgData.push({\n measurement: \"meters_monthly\",\n fields: {\n kWh: gas[0].consumption,\n cost: parseFloat(gas[0].cost.amount)\n },\n tags: { type: \"gas\" },\n timestamp: new Date(`${gas[0].year}-${gas[0].month}-28`).getTime()\n})\n\nmsgData.push({\n measurement: \"meters_monthly\",\n fields: {\n kWh: elec[0].consumption,\n cost: parseFloat(elec[0].cost.amount)\n },\n tags: { type: \"electric\" },\n timestamp: new Date(`${elec[0].year}-${elec[0].month}-28`).getTime()\n})\n\nmsg.payload = msgData\nreturn msg","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":980,"y":690,"wires":[["0e51e4fbe51c8e82"],["bb2892828da855ae"]]},{"id":"28535746a2b0102f","type":"trigger","z":"712086ff.3e3668","name":"request again","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"hr","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1195,"y":780,"wires":[["40b033d6f34637ed"]]},{"id":"9a2d6b76f7a01497","type":"trigger","z":"712086ff.3e3668","name":"request again","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"hr","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1195,"y":870,"wires":[["0a026588ca3e7dfe"]]},{"id":"0e51e4fbe51c8e82","type":"debug","z":"712086ff.3e3668","name":"month","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1165,"y":660,"wires":[]},{"id":"f9805cc3853816cd","type":"debug","z":"712086ff.3e3668","name":"daily","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1165,"y":750,"wires":[]},{"id":"f30fe26d9b66da20","type":"debug","z":"712086ff.3e3668","name":"1/2 Hourly","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1185,"y":840,"wires":[]},{"id":"a233e567ed14f81b","type":"function","z":"712086ff.3e3668","name":"1st of Month","func":"if (msg.payload && typeof msg.payload === 'number') {\n let date = new Date(msg.payload);\n if (date.getDate() === 1) { return msg };\n}\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":690,"wires":[["f5af5a459c186a81"]]},{"id":"9a1f40d1980e7bce","type":"inject","z":"712086ff.3e3668","name":"08:03","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"03 08 * * *","once":false,"onceDelay":0.1,"topic":"monthly","payload":"","payloadType":"date","x":505,"y":690,"wires":[["a233e567ed14f81b"]]},{"id":"ba72fc1e5f5409fa","type":"link in","z":"712086ff.3e3668","name":"token","links":[],"x":335,"y":990,"wires":[["3d0a81a8b9338aa1"]]},{"id":"4997c59341cf820c","type":"link out","z":"712086ff.3e3668","name":"link out 124","mode":"return","links":[],"x":1095,"y":990,"wires":[]},{"id":"9fc2ad832cb1b28c","type":"function","z":"712086ff.3e3668","name":"set date","func":"let date = new Date();\ndate.setDate(date.getDate() - 1); // Set date to yesterday\n\nswitch (msg.topic) {\n\n case \"daily\":\n msg.date = date.toISOString().slice(0, 7); // eg 2024-02\n break;\n\n case \"monthly\":\n msg.date = date.getFullYear(); // eg 2024\n break;\n\n case \"half-hourly\":\n msg.date = date.toISOString().split('T')[0]; // eg 2024-02-29\n break;\n\n}\n\n\nmsg.cookies = { \"refresh_token\": msg.responseCookies?.refresh_token };\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":990,"wires":[["dc559f20c7b236a2"]],"info":"let date = new Date()\r\n\r\ndate.setDate(date.getDate() - 1); //yesterday\r\n\r\nvar year = date.toLocaleString(\"default\", { year: \"numeric\" });\r\nvar month = date.toLocaleString(\"default\", { month: \"2-digit\" });\r\nvar day = date.toLocaleString(\"default\", { day: \"2-digit\" });\r\n\r\nmsg.date = `${year}-${month}-${day}`;\r\n\r\nmsg.cookies = { \"refresh_token\": msg.responseCookies.refresh_token }\r\n\r\nreturn msg;"},{"id":"0e5cb6b7979bba5e","type":"http request","z":"712086ff.3e3668","name":"login and get token","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://my.ovoenergy.com/api/v2/auth/login","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":615,"y":990,"wires":[["9fc2ad832cb1b28c"]]},{"id":"3d0a81a8b9338aa1","type":"change","z":"712086ff.3e3668","name":"get login","rules":[{"t":"set","p":"payload","pt":"msg","to":"login","tot":"flow"},{"t":"set","p":"account","pt":"msg","to":"account","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":435,"y":990,"wires":[["0e5cb6b7979bba5e"]]},{"id":"0faf80101d11f3cf","type":"change","z":"712086ff.3e3668","name":"","rules":[{"t":"set","p":"login","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":575,"y":945,"wires":[["684c3335c4b8c0f4"]]},{"id":"bb2892828da855ae","type":"trigger","z":"712086ff.3e3668","name":"request again","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"hr","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1195,"y":690,"wires":[["f5af5a459c186a81"]]},{"id":"0a026588ca3e7dfe","type":"link call","z":"712086ff.3e3668","name":"","links":["ba72fc1e5f5409fa"],"linkType":"static","timeout":"30","x":820,"y":870,"wires":[["08196494f1094e6f"]]},{"id":"40b033d6f34637ed","type":"link call","z":"712086ff.3e3668","name":"","links":["ba72fc1e5f5409fa"],"linkType":"static","timeout":"30","x":820,"y":780,"wires":[["08415f8845dc554c"]]},{"id":"f5af5a459c186a81","type":"link call","z":"712086ff.3e3668","name":"","links":["ba72fc1e5f5409fa"],"linkType":"static","timeout":"30","x":820,"y":690,"wires":[["84f8082f57dd83fc"]]},{"id":"a887108a06c1c13f","type":"comment","z":"712086ff.3e3668","name":"Enter login details here and run once","info":"","x":170,"y":945,"wires":[]},{"id":"dc559f20c7b236a2","type":"http request","z":"712086ff.3e3668","name":"get data ","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://smartpaymapi.ovoenergy.com/usage/api/{{topic}}/{{account}}?date={{date}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":975,"y":990,"wires":[["4997c59341cf820c"]]},{"id":"4e7f1f609def5432","type":"inject","z":"712086ff.3e3668","name":"Manual","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"monthly","payload":"","payloadType":"date","x":505,"y":645,"wires":[["985e25a568aca41b"]]},{"id":"985e25a568aca41b","type":"junction","z":"712086ff.3e3668","x":735,"y":645,"wires":[["f5af5a459c186a81"]]}]