﻿{
  "Version": "",
  "TemplateID": "6AA600D5-93C4-4DB5-9490-7AB2CF6F19C2",
  "GUID": "d1651e60-325a-4ae3-8b52-79fedfb6f0af",
  "Inputs": {
    "ENERGINET_TOKEN": {
      "Name": "ENERGINET_TOKEN",
      "Value": "TOKEN GOES HERE",
      "Scaling": 1.0,
      "Unit": "",
      "Description": "Token for authentication",
      "Category": "",
      "Custom1": "",
      "Custom2": "",
      "Custom3": "",
      "TagLink": false
    }
  },
  "Parameters": {
    "processing": "//Updated 2026-01-21\n//To send history (Optional):\n/*\n\n     Create an Input named: SEND_HISTORY\n     Enter the start date (YYYY-MM-DD) in Custom1 of the input.\n     Enter the end date (YYYY-MM-DD) in Custom2 of the input. (if not filled in, today's date is used automatically)\n     Enter frequency 1H, 1D in Custom3 (1H = hourly values, 1D = one value per day)\n     \n     Tip: Create a separate report with dedicated token for sending history data and run it manualy when needed.\n\t Token can only be used to send data once every 10 minutes.   \n*/\n\nvar inputs = [INPUTS];\nvar historyFrequency = new System.TimeSpan(24,0,0);\n\nvar toDate = System.DateTime.Now;\nvar sendbuilder = new System.Text.StringBuilder();\nsendbuilder.Append(\"[\");\nvar lastsend = \"\";\nvar fromDate = \"\";\nvar sendHistory = false;\nvar returnstr = new System.Text.StringBuilder();\nvar token = \"\";\nreturnstr.Append(\"Sent: \");\n\nif(inputs[\"SEND_HISTORY\"]) {\n   if(inputs[\"SEND_HISTORY\"].Custom1) {\n        try {        \n            fromDate = System.DateTime.ParseExact(inputs[\"SEND_HISTORY\"].Custom1, \"yyyy-MM-dd\", System.Globalization.CultureInfo.InvariantCulture);\n            if(inputs[\"SEND_HISTORY\"].Custom2) {\n                toDate = System.DateTime.ParseExact(inputs[\"SEND_HISTORY\"].Custom2, \"yyyy-MM-dd\", System.Globalization.CultureInfo.InvariantCulture);\n            }  \n            if(inputs[\"SEND_HISTORY\"].Custom3) {\n                switch (inputs[\"SEND_HISTORY\"].Custom3) {\n                    case '1H':\n                        historyFrequency = new System.TimeSpan(1,0,0);\n                        break;\n                    case '1D':\n                        historyFrequency = new System.TimeSpan(24,0,0);\n                        break;\n                    case '1M': \n                        historyFrequency = System.TimeSpan.FromDays(30);\n                        break;\n                    default:\n                        break;\n                }\n            }\n            sendHistory = true;\n        } catch (e) {\n            debug(e);\n        }\n    }\n}\n\nif(inputs[\"ENERGINET_TOKEN\"]) {\n    if(inputs[\"ENERGINET_TOKEN\"].Value) {\n        token = inputs[\"ENERGINET_TOKEN\"].Value;    \n    }  \n}\n\nif(!token) {\n    return \"TOKEN MISSING\"; \n}\n\nfor(var k in inputs) {\n    if(tags.ContainsKey(k)) { \n\n        if (!sendHistory && tags[k].Timestamp == System.DateTime.MinValue) {\n            continue;\n        }\n\n        var tname = k;\n        if(inputs[k].Custom2) {\n            tname = inputs[k].Custom2;\n        }\n\n        var valuesAdded = false;\n        sendbuilder.Append(\"{\\\"meterID\\\": \\\"\" + tname + \"\\\", \\\"values\\\": [\");\n\n        if(sendHistory) {\n            var td = getTrendData(k, fromDate, toDate);\n\n            var decimals = 0;\n            try {\n                var curValStr = tags[k].Value.ToString().Replace(\",\", \".\");\n                if (curValStr.indexOf(\".\") >= 0) {\n                    decimals = curValStr.length - curValStr.indexOf(\".\") - 1;\n                }\n            } catch (e) {\n                decimals = 0;\n            }\n\n            var first = true;       \n            for(var j = 0; j < td.Count; j++) {\n                var datel = new System.DateTime(td[j].Key);\n\n                if (datel == System.DateTime.MinValue) {\n                    continue;\n                }\n\n                if(first) {\n                    lastsend = datel;                   \n                }\n\n                if(first || (datel - lastsend) > historyFrequency.Ticks/10000) {                  \n                    valuesAdded = true;\n                    lastsend = datel;\n\n                    var val = System.Convert.ToDouble(td[j].Value);\n                    var valStr = val.ToString(\"F\" + decimals, System.Globalization.CultureInfo.InvariantCulture);\n\n                    var ret = \"[\\\"\" + datel.ToString(\"o\").replace(\".\", \":\").replace(\".\", \":\") + \"\\\",\" + valStr + \"]\";\n                    sendbuilder.Append(ret + \",\");\n                }\n                first = false;\n            }\n        } else {\n            var ret = \"[\\\"\" + tags[k].Timestamp.ToString(\"o\").replace(\".\", \":\").replace(\".\", \":\") + \"\\\",\" + tags[k].Value + \"]\";\n            sendbuilder.Append(ret + \",\");\n            valuesAdded = true;\n        }\n\n        if(valuesAdded) {\n            sendbuilder.Length--;\n            sendbuilder.Append(\"]},\");\n            returnstr.AppendLine(k + \", \");\n        } else {\n            sendbuilder.Length -= (\"{\\\"meterID\\\": \\\"\" + tname + \"\\\", \\\"values\\\": [\").Length;\n        }\n    }\n}\n\nif(sendbuilder.Length > 1) sendbuilder.Length--;\nsendbuilder.Append(\"]\");\n\nvar ret = \"\";\nif(sendHistory) {\n    SendToEnergiNet(sendbuilder.ToString());\n    return returnstr.ToString();\n} else {\n    SendToEnergiNet(sendbuilder.ToString());\n    return System.DateTime.Now + \"<BR>\" + returnstr + \" \" + sendbuilder.ToString();\n}\n\nfunction SendToEnergiNet(jsontext) {  \n    var HTTPurl = \"https://www.energinet.net/apiImport/data\";\n    var handler = new System.Net.Http.HttpClientHandler();\n    var client = new System.Net.Http.HttpClient(handler);\n    client.DefaultRequestHeaders.Add(\"Authorization\", \"Bearer \" + token);  \n\n    var contenttype = \"application/json\";\n    var content = new System.Net.Http.StringContent(jsontext, System.Text.Encoding.UTF8, contenttype);\n\n    var response = client.PostAsync(HTTPurl, content).GetAwaiter().GetResult();\n    debug(response.RequestMessage.ToString());\n    debug(response.StatusCode.ToString());\n    returnstr.AppendLine(response.RequestMessage.ToString());\n    returnstr.AppendLine(response.StatusCode.ToString());\n}",
    "presentation": "<script>\n$(document).ready(function () {\n    var out = `[OUTPUT]`;\n\n    try {\n        var jsonStart = out.indexOf(\"[\");\n        var jsonEnd = out.lastIndexOf(\"]\") + 1;\n\n        if (jsonStart >= 0 && jsonEnd > jsonStart) {\n            var metaPart = out.substring(0, jsonStart).replace(/\\n/g, \"<br>\");\n            var jsonPart = out.substring(jsonStart, jsonEnd);\n            var rest = out.substring(jsonEnd).replace(/\\n/g, \"<br>\");\n\n            var data = JSON.parse(jsonPart);\n            var dataHtml = \"<br><strong>Data:</strong><br>\";\n\n            data.forEach(item => {\n                if (item.meterID && item.values && item.values.length > 0) {\n                    item.values.forEach(val => {\n                        let timestamp = val[0];\n                        let value = val[1];\n                        dataHtml += `<div><strong>${item.meterID}</strong>: ${timestamp} – ${value}</div>`;\n                    });\n                }\n            });\n\n            $('#outputdiv').html(`<strong>Metadata:</strong><br>${metaPart}<br>${dataHtml}<br>${rest}`);\n        } else {\n            // Ingen JSON, visa allt som metadata\n            $('#outputdiv').html(`<strong>Metadata:</strong><br>${out.replace(/\\n/g, \"<br>\")}`);\n        }\n    } catch (e) {\n        $('#outputdiv').html(\"<div style='color:red;'>Kunde inte tolka JSON-data</div>\");\n        console.error(\"JSON parse error:\", e);\n    }\n});\n</script>\n\n<div id=\"outputdiv\"></div>"
  },
  "Exports": {},
  "Sendings": {},
  "DataKey": "data",
  "NextRunTime": "2026-01-21T13:15:00",
  "Interval": "01:00:00",
  "RunType": 2,
  "RunOnView": false,
  "Active": true,
  "History": false,
  "ReadyToRun": false,
  "Running": false,
  "Alias": "",
  "Description": "",
  "Name": "energinetexport"
}