[{"id":"af86bf98ca546101","type":"ui_template","z":"38565ad851da076a","group":"472a29f10598521a","name":"Checkboxes Akku","order":6,"width":"12","height":"1","format":"<!--\n<div style=\"display: flex; flex-wrap: wrap; gap: 3px;padding-left: 35px;\">\n <div ng-repeat=\"n in [].constructor(24) track by $index\">\n <label>\n <input type=\"checkbox\" ng-model=\"checkboxes[$index]\" ng-change=\"sendCheckboxState()\">\n </label>\n </div>\n</div>\n-->\n\n<div style=\"display: flex; flex-wrap: wrap; gap: 3px;padding-left: 35px;\">\n <div ng-repeat=\"n in msg.payload.checkboxes track by $index\">\n <label>\n <input type=\"checkbox\" ng-model=\"checkboxes[$index]\" ng-change=\"sendCheckboxState()\" ng-value=\"n\">\n </label>\n </div>\n</div>\n\n\n\n<script>\n (function(scope) {\n // Initialisieren der Checkboxen, falls msg.payload.checkboxes verfügbar ist\n scope.$watch('msg.payload', function(data) {\n if (data && data.checkboxes) {\n scope.checkboxes = data.checkboxes; // Setze den Zustand der Checkboxen\n } else {\n scope.checkboxes = new Array(24).fill(false); // Standard: Alle auf false setzen\n }\n });\n\n // Funktion, um den Zustand der Checkboxen zu senden\n scope.sendCheckboxState = function() {\n // Prüfen, ob der Zustand der Checkboxen wirklich geändert wurde\n var checkboxState = scope.checkboxes; \n \n // Debug-Ausgabe: Ausgabe der geänderten Checkboxen im Debug-Fenster\n scope.send({ payload: { checkboxes: scope.checkboxes, debug: \"Checkbox Zustand geändert\" } });\n \n // Sende die geänderten Checkboxen als msg an den Flow\n scope.send({ payload: { checkboxes: checkboxState } });\n };\n })(scope);\n</script>\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":890,"y":360,"wires":[["e171cefbae2babe1"]]},{"id":"c66e7e564331dc31","type":"function","z":"38565ad851da076a","name":"","func":"var FL_Strompreise24 = flow.get(\"FL_Strompreise24\") || [];\nvar FL_Stunden24 = flow.get(\"FL_Stunden24\") || [];\nvar FL_CheckboxState = flow.get(\"FL_CheckboxState\") || new Array(24).fill(false);\n\nnode.warn(\"Empfangene msg.payload: \" + JSON.stringify(msg.payload));\n\n\nif (msg.payload && msg.payload.data && Array.isArray(msg.payload.data)) {\n node.warn(\"Neue Daten empfangen, aktualisiere Strompreise...\");\n\n FL_Strompreise24 = [];\n FL_Stunden24 = [];\n\n msg.payload.data.forEach((entry) => {\n FL_Strompreise24.push(entry.marketprice / 10);\n let date = new Date(entry.start_timestamp);\n FL_Stunden24.push(date.getHours() + \":\" + (\"0\" + date.getMinutes()).slice(-2));\n });\n\n flow.set(\"FL_Strompreise24\", FL_Strompreise24);\n flow.set(\"FL_Stunden24\", FL_Stunden24);\n\n FL_CheckboxState = new Array(24).fill(false);\n let indexedPrices = FL_Strompreise24.map((price, index) => ({ price, index }));\n indexedPrices.sort((a, b) => a.price - b.price);\n\n let lowestIndices = indexedPrices.slice(0, 4).map(entry => entry.index);\n lowestIndices.forEach((index) => {\n FL_CheckboxState[index] = true;\n });\n\n flow.set(\"FL_CheckboxState\", FL_CheckboxState);\n}\n\nif (msg.payload && msg.payload !== \"\") {\n //node.warn(\"Trigger: Jede Sekunde, prüfe aktuelle Checkbox...\");\n \n if (FL_Strompreise24.length > 0 && FL_Stunden24.length > 0) {\n let now = new Date();\n let currentHour = now.getHours();\n let AkkuLaden = FL_CheckboxState[currentHour] ? 1 :0;\n\n //node.warn(\"Checkboxen: \" + FL_CheckboxState);\n //node.warn(\"Akkuladen: \" + AkkuLaden);\n //node.warn(\"akt.Stunde: \" + currentHour);\n\n let textOutput = {\n payload: AkkuLaden ? \"Akku lädt\" : \"Akku wird nicht geladen\"\n };\n\n let chartOutput = {\n payload: [{\n series: [\"Strompreise\"],\n data: [FL_Strompreise24],\n labels: FL_Stunden24\n }]\n };\n\n let checkboxOutput = {\n payload: {\n FL_Strompreise24: FL_Strompreise24,\n FL_Stunden24: FL_Stunden24,\n checkboxes: FL_CheckboxState\n }\n };\n\n flow.set(\"FL_CheckboxState\", FL_CheckboxState);\n flow.set(\"AkkuLaden\", AkkuLaden);\n\n node.send([chartOutput, checkboxOutput, textOutput]);\n //return [chartOutput, checkboxOutput, textOutput];\n } else {\n node.warn(\"Fehler: Keine gültigen Strompreise oder Stunden verfügbar!\");\n return [null, null, null];\n }\n} else {\n node.warn(\"Fehler: Kein gültiger Trigger empfangen\");\n return null;\n}\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":340,"wires":[["97c93b6a5a4f021c"],["af86bf98ca546101"],["f179424e292e9072"]]},{"id":"37a5e4cee357045b","type":"http request","z":"38565ad851da076a","name":"Preise von awattar laden","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://api.awattar.at/v1/marketdata?start={{payload}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":510,"y":260,"wires":[["8b6ca85de65430d3","c66e7e564331dc31"]]},{"id":"6b43156f871e2d4c","type":"inject","z":"38565ad851da076a","name":"5 sek","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":450,"y":140,"wires":[["c66e7e564331dc31"]]},{"id":"97c93b6a5a4f021c","type":"ui_chart","z":"38565ad851da076a","name":"","group":"472a29f10598521a","order":5,"width":"12","height":"4","label":"Strompreise","chartType":"bar","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":870,"y":320,"wires":[[]]},{"id":"f179424e292e9072","type":"ui_text","z":"38565ad851da076a","group":"472a29f10598521a","order":7,"width":0,"height":0,"name":"Akku lädt?","label":"text","format":"{{msg.payload}}","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1030,"y":180,"wires":[]},{"id":"6be2883865cdd224","type":"function","z":"38565ad851da076a","name":"epoch_seconds","func":"// Holen des aktuellen Datums\nlet now = new Date();\n\n// Setze die Uhrzeit auf 00:00:00 UTC\nlet startOfDay = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0));\n\n// Berechne die epoch seconds für den Beginn des aktuellen Tages\nlet epochMilliSeconds = Math.floor(startOfDay.getTime());\n\n// Setze die epochSeconds in die msg.payload für den nächsten Node\nmsg.payload = epochMilliSeconds;\nreturn msg;\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":260,"wires":[["37a5e4cee357045b","f9473b51329b3e04"]]},{"id":"277a00131d48d196","type":"inject","z":"38565ad851da076a","name":"alle 24h aktualisieren","props":[],"repeat":"18000","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":120,"y":120,"wires":[["6be2883865cdd224"]]},{"id":"8bf5e1d3f7417d8b","type":"ui_button","z":"38565ad851da076a","name":"","group":"472a29f10598521a","order":4,"width":0,"height":0,"passthru":false,"label":"Button-Trigger ","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"trigger","payloadType":"str","topic":"topic","topicType":"msg","x":140,"y":80,"wires":[["6be2883865cdd224"]]},{"id":"472a29f10598521a","type":"ui_group","name":"Awattar_Group","tab":"2dde8bcb178d77da","order":2,"disp":true,"width":"15","collapse":false,"className":""},{"id":"2dde8bcb178d77da","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]