﻿{
  "Version": "2.25.10.14021",
  "TemplateId": "6AA600D5-93C4-4DB5-9490-7AB2CF6F19C2",
  "GUID": "254d58d3-67b8-463c-81f6-d784484ede6d",
  "Inputs": {},
  "Parameters": {
    "processing": "/*\n     Settings for each input(tag):\n     Custom1: Enter a MeterID if different from the tag name; leave blank to use the tag name \n\t Custom2: Set the data frequency in minutes (15, 30, or 60); if left blank = default 60\n     \n     To send history (Optional):\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\n*/\n\nvar inputs = [INPUTS];\n\nvar sendHistory = false;\nvar fromDate, toDate;\n\nif (inputs[\"SEND_HISTORY\"]) {\n    sendHistory = true;\n    try {\n        if (inputs[\"SEND_HISTORY\"].Custom1 && inputs[\"SEND_HISTORY\"].Custom1 !== \"\") {\n            fromDate = DateTime.ParseExact(\n                inputs[\"SEND_HISTORY\"].Custom1,\n                \"yyyy-MM-dd\",\n                CultureInfo.InvariantCulture\n            );\n        } else {\n            fromDate = DateTime.Today.AddDays(-1);\n        }\n\n        if (inputs[\"SEND_HISTORY\"].Custom2 && inputs[\"SEND_HISTORY\"].Custom2 !== \"\") {\n            toDate = DateTime.ParseExact(\n                inputs[\"SEND_HISTORY\"].Custom2,\n                \"yyyy-MM-dd\",\n                CultureInfo.InvariantCulture\n            );\n        } else {\n            toDate = DateTime.Today;\n        }\n    } catch (e) {\n        debug(\"Fel vid datumtolkning: \" + e);\n        fromDate = DateTime.Today.AddDays(-1);\n        toDate = DateTime.Today;\n    }\n} else {\n    toDate = DateTime.Today;\n    fromDate = toDate.AddDays(-1);\n}\n\nvar output = \"\";\n\nfor (var key in inputs) {\n    if (key === \"SEND_HISTORY\") continue;\n\n    if (tags.ContainsKey(key)) {\n        const trendData = getTrendData(key, fromDate, toDate);\n\n        if (!trendData || trendData.Count === 0) {\n            continue;\n        }\n\n        var currentTagValue = tags[key].Value;\n        var decimals = getDecimals(currentTagValue);\n\n        var displayName = (inputs[key] && inputs[key].Custom1 && inputs[key].Custom1 !== \"\")\n            ? inputs[key].Custom1\n            : key;\n\n        var interval = 60;\n        if (inputs[key] && inputs[key].Custom2 && inputs[key].Custom2 !== \"\") {\n            var parsed = parseInt(inputs[key].Custom2, 10);\n            if (parsed === 15 || parsed === 30 || parsed === 60) {\n                interval = parsed;\n            }\n        }\n\n        let lastInterval = null;\n\n        for (let i = 0; i < trendData.Count; i++) {\n            const dt = new DateTime(trendData[i].Key);\n\n            var intervalIndex = dt.Hour * 60 + dt.Minute;\n            intervalIndex = Math.floor(intervalIndex / interval);\n\n            if (lastInterval === null || intervalIndex !== lastInterval) {\n                lastInterval = intervalIndex;\n                let timestamp = dt.ToString(\"yyyy-MM-dd HH:mm:ss\");\n                let value = formatValue(trendData[i].Value, decimals);\n\n                output += timestamp + \";\" + displayName + \";\" + value + \"\\r\\n\";\n            }\n        }\n    }\n}\n\nif (output === \"\") {\n    output = \"NO DATA FOUND\";\n}\n\nreturn output;\n\nfunction getDecimals(val) {\n    val = val.toString();\n    if (val.indexOf('.') >= 0) {\n        return val.split('.')[1].length;\n    }\n    if (val.indexOf(',') >= 0) {\n        return val.split(',')[1].length;\n    }\n    return 0;\n}\n\nfunction formatValue(value, decimals) {\n    value = Number(value);\n    const adjustment = Math.pow(10, decimals);\n    value = Math.round((value + Number.EPSILON) * adjustment) / adjustment;\n    return value.toString().replace(\".\", \",\");\n}",
    "presentation": "<style>\n  #outlet {\n    font-family: Monospace;\n    white-space: pre;\n    font-size: 12px;\n    color: #000000;\n  }\n</style>\n\n<output id=\"outlet\">[OUTPUT]</output>",
    "useLegacyProcessing": "0"
  },
  "Exports": {
    "es_2": {
      "ExporterID": "1FA32C52-4666-4D07-8206-ED813323600D",
      "Name": "es_2",
      "Description": "",
      "Active": true,
      "LastExport": "2026-02-06T13:33:11.6081696+01:00",
      "LastExportOutput": "C:\\ProgramData\\WebPort\\Try And Error\\assets\\export\\20260206133311.txt",
      "Parameters": {}
    }
  },
  "Sendings": {
    "To Energinet": {
      "SenderID": "612807DB-7756-47FB-9192-21D73E7E5ECF",
      "Name": "To Energinet",
      "Description": "",
      "Active": true,
      "Exporter": "es_2",
      "LastSending": "0001-01-01T00:00:00",
      "RetryOnFail": false,
      "MissedSendings": [
        "C:\\ProgramData\\WebPort\\Try And Error\\assets\\export\\20260206133311.txt"
      ],
      "Parameters": {
        "active": "1",
        "reciever": "",
        "subject": "",
        "body": "",
        "default": "0",
        "sender": "",
        "host": "",
        "port": "25",
        "ssl": "0",
        "username": "",
        "password": "[encrypted>68wXtapK96Xwc71NgLUVCw=="
      }
    }
  },
  "DataKey": "data",
  "NextRunTime": "2026-02-07T13:32:43.8599387+01:00",
  "Interval": "1.00:00:00",
  "RunType": 4,
  "RunOnView": false,
  "Active": true,
  "History": false,
  "ReadyToRun": false,
  "Running": true,
  "Alias": "",
  "Description": "",
  "Name": "Energinet Email Report"
}