{"id":6246,"date":"2026-03-25T14:42:38","date_gmt":"2026-03-25T13:42:38","guid":{"rendered":"https:\/\/energydata.dk\/dokumentation\/api-dokumentation\/"},"modified":"2026-09-24T11:30:57","modified_gmt":"2026-09-24T09:30:57","slug":"api-dokumentation","status":"publish","type":"page","link":"https:\/\/energydata.dk\/da\/dokumentation\/api-dokumentation\/","title":{"rendered":"API Dokumentation"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"6246\" class=\"elementor elementor-6246 elementor-4247\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5d68e57 elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"5d68e57\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a2811b9\" data-id=\"a2811b9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-47d3e88 elementor-widget elementor-widget-menu-anchor\" data-id=\"47d3e88\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"apidocumentation\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-18e9428 elementor-section-full_width animated-slow toc-layout elementor-section-height-default elementor-section-height-default elementor-invisible\" data-id=\"18e9428\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;animation&quot;:&quot;fadeIn&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-1553591 TOC_column elementor-hidden-tablet elementor-hidden-mobile\" data-id=\"1553591\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2cce5a6 elementor-widget__width-initial Tableofcontents elementor-widget elementor-widget-table-of-contents\" data-id=\"2cce5a6\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"Tableofcontents\" data-settings=\"{&quot;exclude_headings_by_selector&quot;:[],&quot;marker_view&quot;:&quot;bullets&quot;,&quot;icon&quot;:{&quot;value&quot;:&quot;icon icon-caret-double-right-light&quot;,&quot;library&quot;:&quot;icomoon-1&quot;},&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_offset&quot;:100,&quot;sticky_parent&quot;:&quot;yes&quot;,&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;],&quot;no_headings_message&quot;:&quot;No headings were found on this page.&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h4 class=\"elementor-toc__header-title\">\n\t\t\t\tIndholdsfortegnelse\t\t\t<\/h4>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__2cce5a6\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-0b2faef right_column\" data-id=\"0b2faef\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c62d586 elementor-widget elementor-widget-heading\" data-id=\"c62d586\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">API Dokumentation<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-86a866b elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"86a866b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-0cbb1f0\" data-id=\"0cbb1f0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e3f575d elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"e3f575d\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"Introduction\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introduktion<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2d987c elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"f2d987c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dette dokument giver en kort introduktion til <abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;erne som EnergyDataDK stiller til r\u00e5dighed. Hvis du er ny p\u00e5 platformen anbefaler vi at du starter med at l\u00e6se vores <a href=\"https:\/\/energydata.dk\/da\/dokumentation\/platform-vejledning\/\" target=\"_blank\" rel=\"noopener\">platform vejledning<\/a> og <a href=\"https:\/\/energydata.dk\/da\/dokumentation\/dataejer-vejledning\/\" target=\"_blank\" rel=\"noopener\">data ejer vejledning<\/a> for at f\u00e5 et general overblik over EnergyDataDK dets funktioner. <\/p><p>Data kan b\u00e5de blive importeret og eksporteret via vores <abbr title=\"Application Programming Interface\">API<\/abbr>. De forskellige mekanismer er som f\u00f8lgende: <\/p><ul><li><strong>Batch import data<\/strong> \u2013 Kan anvendes n\u00e5r der er brug for at uploade store m\u00e6ngder data, enten historisk eller ikke-tidskritiske data.<\/li><li><strong>Fetch data<\/strong> \u2013 For at downloade en eller flere datastr\u00f8mmer<\/li><li><strong>Connect via <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr><\/strong> \u2013 Bliver brugt til at uploade (publish) data til en eller flere datastr\u00f8mmer eller til at downloade (subscribe to) en eller flere datastr\u00f8mmer. Adskillige v\u00e6rdier kan bliver offentliggjort samtidig, og <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>&#8216;s Quality of Service (QoS) er underst\u00f8ttet. <\/li><\/ul><div> <\/div><div>For at udf\u00f8re en af \u200b\u200bdisse handlinger kr\u00e6ves et <abbr title=\"Application Programming Interface\">API<\/abbr>-token, som er en alfanumerisk kode, der bruges som bekr\u00e6ftelse p\u00e5, at du har adgang til datas\u00e6ttet. Et deploy-token kan konfigureres til at give tilladelse til at udf\u00f8re en enkelt, flere eller alle handlinger, der er anf\u00f8rt ovenfor, hvorimod et personligt token giver alle de privilegier til dataene, som ejeren af \u200b\u200btokenet har. <\/div><div> <\/div><p>Hvis du st\u00f8der p\u00e5 fejl i dette dokument, eller har forbedringsforslag er du velkommen til at kontakte os p\u00e5 <a style=\"background-color: #ffffff;\" href=\"mailto:energydatadk@dtu.dk\">energydatadk@dtu.dk<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5cb8a74 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"5cb8a74\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-4ed33e7\" data-id=\"4ed33e7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-23f5d06 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"23f5d06\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"terminology\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Terminologi<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d2ceaaa elementor-widget elementor-widget-spacer\" data-id=\"d2ceaaa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e710368 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"e710368\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style type=\"text\/css\">.tg {\r\n    border-collapse:collapse;\r\n    border-spacing:0;\r\n    \r\n}\r\n.tg td {\r\n    border:0;font-family:Arial, sans-serif;\r\n    font-size:14px;\r\n    overflow:hidden;\r\n    padding:10px 5px;\r\n    word-break:normal;\r\n    \r\n}\r\n.tg th {\r\n    background-color:#000;\r\n    border:0;\r\n    color:#FFF;\r\n    font-family:Arial, sans-serif;\r\n    font-size:14px;\r\n    font-weight:700;\r\n    overflow:hidden;\r\n    padding:10px 5px;\r\n    word-break:normal;\r\n    \r\n}\r\n.tg .tg-0pky {\r\n    border-color:inherit;\r\n    text-align:left;\r\n    vertical-align:top\r\n    \r\n}\r\n.tg-term {\r\n    font-weight: 700;\r\n}\r\n<\/style><table class = \"tg\"><thead><tr><th class =\"tg-0pky\">Term<\/th><th class =\"tg-0pky\">Meaning<\/th><\/tr><\/thead><tbody><tr><td class =\"tg-0pky tg-term\">API<br\/> (Application Programming Interface)<\/td><td class =\"tg-0pky\"> A set of rules that allows different software systems to communicate and exchange data with each other.<\/td><\/tr><tr><td class =\"tg-0pky tg-term\">MQTT <br\/>  (Message Queuing Telemetry Transport)<\/td><td class =\"tg-0pky\">Lightweight messaging protocol used to transmit data between devices through a central server called a broker.\r\nIt follows a publish\/subscribe model: devices publish data to specific topics, and other devices subscribe to those topics to receive the messages.<\/td><\/tr><tr><td class =\"tg-0pky tg-term\"><abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> Prefix<\/td><td class =\"tg-0pky\"> A single alphanumeric string configured by data owner. This prefix is placed at the beginning of all <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> topics associated with specific data set. It acts as a simple identifier that groups topics together and distinguishes them from those of other data sets.<\/td><\/tr><tr><td class =\"tg-0pky tg-term\"><abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> Sufix (Topic)<\/td><td class =\"tg-0pky\">A unique label for a datastream. The suffix is added after the <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> prefix and forms the full topic used when publishing or requesting data for that datastream.<\/td><\/tr><tr><td class =\"tg-0pky tg-term\">Token<\/td><td class =\"tg-0pky\">A token is a unique string used to authenticate and authorize access to an <abbr title=\"Application Programming Interface\">API<\/abbr> or data service. It identifies the requester and ensures that only permitted systems or users can insert or retrieve data.\r\n<\/td><\/tr><tr><td class =\"tg-0pky tg-term\">Deploy Token<\/td><td class =\"tg-0pky\">A deploy token is a credential that is explicitly permitted to perform certain operations on specific datasets. It is intended for use when deploying devices or other systems in the field. Because a deploy token has only limited, predefined permissions, any compromise of the device or system using it results in minimal exposure. <br\/> You can link any of the licenses you have via group memberships to the token.<\/td><\/tr><tr><td class =\"tg-0pky tg-term\">Personal Access Token<\/td><td class =\"tg-0pky\">A personal access token is a credential that carries the same rights as the user account that issued it. It is intended for use on the issuing user\u2019s own computer for local development and testing.\r\n                 <br\/> <i> Warning: If compromised, a personal access token can be used to access everything available to the issuing user. <\/i><\/td><\/tr><\/tbody><\/table>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-80137fe elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"80137fe\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-366f23d\" data-id=\"366f23d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cbb4289 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"cbb4289\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"create-an-api-token\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">API token oprettelse<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-73c5f60 elementor-widget elementor-widget-text-editor\" data-id=\"73c5f60\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tDu kan oprette og administrere dine <strong><abbr title=\"Application Programming Interface\">API<\/abbr> tokens<\/strong> ved at v\u00e6lge API tokens fra <strong>Settings<\/strong> menuet (<em><a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/settings_api.png\">Fig. 1<\/a><\/em>).\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9e866a4 elementor-widget elementor-widget-image\" data-id=\"9e866a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/settings_api.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"settings_api\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTM2OSwidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAxXC9zZXR0aW5nc19hcGkucG5nIn0%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"417\" height=\"505\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/settings_api.png\" class=\"attachment-full size-full wp-image-5369\" alt=\"A dropdown menu titled &apos;Settings&apos; with a &apos;Manage&apos; section header. The menu includes the options: Groups, Datasets, API Tokens, and Alarms. &apos;API Tokens&apos; is highlighted in blue text.\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/settings_api.png 417w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/settings_api-248x300.png 248w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 1. Setting: API Tokens <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33f015b elementor-widget elementor-widget-text-editor\" data-id=\"33f015b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Hvilket tager dig til siden vist nedunder.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f655b17 elementor-widget elementor-widget-image\" data-id=\"f655b17\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Token creation\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTk4OCwidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAzXC9Ub2tlbi1jcmVhdGlvbi0xLnBuZyJ9\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1329\" height=\"1051\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1.png\" class=\"attachment-full size-full wp-image-5988\" alt=\"&quot;Interface for creating an API token. The top section contains a &apos;Name&apos; field with &apos;Onboarding_token&apos; and a &apos;Token type&apos; dropdown set to &apos;Deploy token&apos;. Below are checkboxes for permissions: &apos;Batch import data&apos; and &apos;Fetch data from datasets via API&apos; are selected. A large table allows selecting licenses, showing columns for Permission, Dataset ID, and Group origin. The first row for &apos;Project Onboarding&apos; with &apos;Owner&apos; permission is checked.&quot;\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1.png 1329w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1-300x237.png 300w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1-1024x810.png 1024w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1-768x607.png 768w\" sizes=\"auto, (max-width: 1329px) 100vw, 1329px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 2. API token formular <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e75cd1 elementor-widget elementor-widget-text-editor\" data-id=\"0e75cd1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For at oprette et nyt token skal du indtaste et navn i feltet \u00f8verst, v\u00e6lge tokentypen og derefter v\u00e6lge tokentilladelserne. Der er to tokentyper tilg\u00e6ngelige: &#8220;Implementer token&#8221; og &#8220;Personlig adgangstoken&#8221;. Deres definitioner findes i afsnittet om <a href=\"#terminology\">terminologi<\/a> i denne vejledning.  <p>\n<p><strong>Token tilladelser<\/strong><p><p>Tilladelserne som et specifik token kan tildeles er som f\u00f8lgende, flere valg er mulig:<\/p>\n<p><\/p><ul>\n \t<li>Batch import data<\/li>\n \t<li>Fetch data<\/li>\n \t<li>Forbind til <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr><\/li>\n<\/ul>\n<p>For at selektere hvilket dataset du vil give tokenet adgang til, kan du bruge s\u00f8gefeltet i nedre hj\u00f8rnet til h\u00f8jre <em><a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Token-creation-1.png\">Figur 2<\/a><\/em>.<\/p>\n<p>S\u00e5 snart alt er indstillet kan du oprette tokenet ved trykke p\u00e5 \u201cCreate\u201d knappen ved bunden af siden. En pop up kommer op hvor API n\u00f8glen bliver vist. V\u00e6r meget opm\u00e6rksom p\u00e5, at <em>n\u00f8glen bliver kun vist den ene gang<\/em>, der vil ikke v\u00e6re muligheder at se det igen senere.  <\/p>\n<p><strong>Administrer <abbr title=\"Application Programming Interface\">API<\/abbr> tokens<\/strong><\/p>\n<p>Token administration er tilg\u00e6ngelig p\u00e5 samme side som hvor du opretter nye tokens.<br\/>Ved bunden af siden f\u00e5r du et overblik over alle tokens som er tidligere oprettet (<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI.png\">Fig. 3<\/a>).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c9de41 elementor-widget elementor-widget-image\" data-id=\"0c9de41\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"ManageAPI\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTk5MCwidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAzXC9NYW5hZ2VBUEkucG5nIn0%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1823\" height=\"183\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI.png\" class=\"attachment-full size-full wp-image-5990\" alt=\"&quot;The &apos;Manage API Tokens&apos; section of a dashboard. A text on the left explains that users can delete existing tokens. On the right, a white card displays a list of three tokens: &apos;Onboarding_token&apos;, &apos;Token_test&apos;, and &apos;Token_batch_dataset1&apos;. Each token has &apos;View&apos; and &apos;Delete&apos; text links aligned to the right side of the row.&quot;\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI.png 1823w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI-300x30.png 300w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI-1024x103.png 1024w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI-768x77.png 768w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/ManageAPI-1536x154.png 1536w\" sizes=\"auto, (max-width: 1823px) 100vw, 1823px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 3. Administration af API Tokens <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-94fb866 elementor-widget elementor-widget-text-editor\" data-id=\"94fb866\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Fra denne liste kan du se token detaljer, eller slette dem. Du vil dog ikke kunne se selve API n\u00f8glen.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-2193bcf elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"2193bcf\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-f35733d\" data-id=\"f35733d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d8eef22 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"d8eef22\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"batch-upload-data\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Batch data upload<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd813c3 elementor-widget elementor-widget-text-editor\" data-id=\"cd813c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tHvis du har historiske data, kan du uploade dem alle p\u00e5 \u00e9n gang ved hj\u00e6lp af batchimport-<abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;en. Du kan uploade en eller flere datastr\u00f8mme til et datas\u00e6t, du har &#8220;skriverettigheder&#8221; til, eller som du ejer. \n\nF\u00f8r du uploader dataene, skal du have oprettet et datas\u00e6t hos EnergyDataDK, som skal modtage dataene.\nAlle trin i <a href=\"https:\/\/energydata.dk\/da\/dokumentation\/dataejer-vejledning\/#dataset_creation\" target=\"_blank\" rel=\"noopener\">oprettelsen af \u200b\u200bdatas\u00e6ttet<\/a> er forklaret i afsnittet om oprettelse af datas\u00e6t i <a href=\"https:\/\/energydata.dk\/da\/dokumentation\/dataejer-vejledning\/\" target=\"_blank\" rel=\"noopener\">Data Owner Guide<\/a>.\n\nDet er vigtigt at sikre sig at <abbr title=\"Comma-separated Values\">CSV<\/abbr>-filen til batch upload er korrekt formateret. En ukorrekt formateret fil vil blive afvist. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5bdcac9 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"5bdcac9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-a495e82\" data-id=\"a495e82\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b116ec8 elementor-widget elementor-widget-heading\" data-id=\"b116ec8\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"csv-file-formatting\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">CSV-fil format<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-be4410f elementor-widget elementor-widget-text-editor\" data-id=\"be4410f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Filen skal v\u00e6re formateret som <abbr title=\"Comma-separated Values\">CSV<\/abbr> efter <b>RFC4180<\/b> standarden. Ud over det, hvis filen indeholder ikke-ascii karakterer, b\u00f8r filen blive kodet som UTF-8. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3751bcb elementor-widget elementor-widget-heading\" data-id=\"3751bcb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">F\u00f8rste r\u00e6kke<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1d404c6 elementor-widget elementor-widget-text-editor\" data-id=\"1d404c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Den f\u00f8rste r\u00e6kke i <abbr title=\"Comma-separated Values\">CSV<\/abbr>-filen skal indeholde overskrifter. Overskriften i en given kolonne identificerer den datastr\u00f8m, som kolonnens data skal importeres til. Overskriften kan enten v\u00e6re <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-emnet, der er knyttet til den givne datastr\u00f8m, for eksempel: &#8220;pr\u00e6fiks\/suffiks&#8221;, eller datastr\u00f8ms-ID&#8217;et, for eksempel: &#8220;123456&#8221;.<br\/>Den f\u00f8rste kolonne i f\u00f8rste r\u00e6kke ignoreres.  <\/p><p>Som dataejer tildeler du emner (topics) til datastr\u00f8mme under datas\u00e6t oprettelsen. Hvis du har f\u00e5et tildelt ejerrettigheder fra en anden bruger, eller du ikke har ejerrettigheder og du derfor ikke kender emnerne, kan du finde frem til emnet og datastr\u00f8m ID p\u00e5 flere m\u00e5der. Disse metoder er beskrevet under <a href=\"#topic-and-datastream-id-retrieval\"><g id=\"gid_1\">Topic og Datastr\u00f8m ID hentning<\/g><\/a>.  <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b657ad elementor-widget elementor-widget-heading\" data-id=\"5b657ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Tidsstempler<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e1df2c8 elementor-widget elementor-widget-text-editor\" data-id=\"e1df2c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tTidsstemplerne skal formateres som <code>YYYY-MM-DD[T]HH:mm:ss.SSS[Z]<\/code>, f.eks. 2021-05-01T10:12:44.432Z for 1. maj 2023, 10:12:44.432 <abbr title=\"Coordinated Universal Time\">UTC<\/abbr>. <em>Tidsstemplet skal v\u00e6re i <abbr title=\"Coordinated Universal Time\">UTC<\/abbr>-tidszonen<\/em>.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9cb0699 elementor-widget elementor-widget-text-editor\" data-id=\"9cb0699\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition warning\">\n  <p class=\"admonition-title\">Tidsstempler skal v\u00e6re i stigende r\u00e6kkef\u00f8lge.<\/p>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-729a894 elementor-widget elementor-widget-heading\" data-id=\"729a894\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Data<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b835d2b elementor-widget elementor-widget-text-editor\" data-id=\"b835d2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tDatatypen i en kolonne <em>skal<\/em> matche datatypen for den datastr\u00f8m, som kolonnen tilh\u00f8rer.<br\/>S\u00e5 hvis en datastr\u00f8m er defineret som et heltal, <i>skal<\/i> alle v\u00e6rdier for den datastr\u00f8m ogs\u00e5 v\u00e6re heltal.\n\nHvis et felt efterlades tomt, afh\u00e6nger standardv\u00e6rdien af \u200b\u200bdatatypen for den tilsvarende datastr\u00f8m.<br\/>Hvis datastr\u00f8mmen er af typen streng, importeres en tom streng. Hvis datastr\u00f8mmen er af typen heltal eller dobbelt, importeres ingen v\u00e6rdi. \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-55ded95 elementor-widget elementor-widget-text-editor\" data-id=\"55ded95\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition warning\"><p class=\"admonition-title\">Vigtig<\/p><p>N\u00e5r du bruger &#8220;doubles&#8221; (tal med decimaler), skal du s\u00f8rge for at bruge punktum (.) og ikke komma (,) som decimalseparator.\nHvis du bruger komma (,) som decimalseparator, opst\u00e5r der en typekonflikt, og systemet vil ikke kunne behandle importen.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bc70fde elementor-widget elementor-widget-heading\" data-id=\"bc70fde\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Eksempel<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d2a176 elementor-widget elementor-widget-text-editor\" data-id=\"6d2a176\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"MsoNormal\">Nedenfor er en eksempelfil. Bem\u00e6rk, at den f\u00f8rste datastr\u00f8m (117217) er af typen streng, den anden datastr\u00f8m (my\/topic) er af typen double, og den sidste datastr\u00f8m (119221) er af typen integer.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7654b08 code-background elementor-widget elementor-widget-text-editor\" data-id=\"7654b08\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre><span class=\"span-color-1\">;<\/span><span class=\"span-color-2\">117217;<\/span><span class=\"span-color-3\">mit\/emne;<\/span><span class=\"span-color-4\">119221<\/span>\n<span class=\"span-color-1\">2021-03-10T20:24:30.139Z;<\/span><span class=\"span-color-2\">en_streng;<\/span><span class=\"span-color-3\">23.4121;<\/span><span class=\"span-color-4\">-10<\/span>\n<span class=\"span-color-1\">2021-03-10T20:24:31.144Z;<\/span><span class=\"span-color-2\">\"endnu en streng\";<\/span><span class=\"span-color-3\">999888777.121;<\/span><span class=\"span-color-4\">0<\/span>\n<span class=\"span-color-1\">2021-03-10T20:24:32.161Z;<\/span><span class=\"span-color-2\">en tredje streng;<\/span><span class=\"span-color-3\">-1.33e-16;<\/span><span class=\"span-color-4\">45<\/span>\n<span class=\"span-color-1\">2021-03-10T20:24:33.186Z;<\/span><span class=\"span-color-2\">;<\/span><span class=\"span-color-3\">54.1;<\/span><span class=\"span-color-4\">11<\/span>\n<span class=\"span-color-1\">2021-03-10T20:24:34.201Z;<\/span><span class=\"span-color-2\">en-fjerde-streng;<\/span><span class=\"span-color-3\">;<\/span><span class=\"span-color-4\">45<\/span><\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-608b3ca elementor-widget elementor-widget-text-editor\" data-id=\"608b3ca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"MsoNormal\">L\u00e6g m\u00e6rke til at de tomme felter i r\u00e6kke 5 (datastr\u00f8m 117217) og r\u00e6kke 6 (my\/topic). Til datastr\u00f8m 117217, bliver en tom streng importeret med tidsstempel 2021-03-10T20:24:33.186Z. Til datastr\u00f8m my\/topic, vil ingen v\u00e6rdi blive importeret med timesstempel 2021-03-10T20:24:34.201Z. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-26592fd elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"26592fd\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-fc2b2a4\" data-id=\"fc2b2a4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ee8f651 elementor-widget elementor-widget-heading\" data-id=\"ee8f651\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"steps-to-follow\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Batch upload ved brug af curl<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a6bde13 elementor-widget elementor-widget-text-editor\" data-id=\"a6bde13\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400;\">EnergyDataDK\u2019s <abbr title=\"Application Programming Interface\">API<\/abbr> <abbr title=\"Uniform Resource Locator\">URL<\/abbr> is: <a href=\"https:\/\/admin.energydata.dk\/api\/v1\/import\">https:\/\/admin.energydata.dk\/api\/v1\/import<\/a><\/p>\nDu kan g\u00f8re dette fra din computers terminal (kommandoprompt), og ordene i &#8220;&lt;&gt;&#8221; skal udfyldes med dine oplysninger.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-505cdb1 elementor-widget elementor-widget-text-editor\" data-id=\"505cdb1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition info\">\n<p class=\"admonition-title\">N\u00e5r du udfylder nedenst\u00e5ende oplysninger, skal du erstatte hele pladsholderen, <em>inklusive<\/em> <span class=\"code\">&lt;<\/code> and <span class=\"code\">&gt;<\/code> brackets.<\/p>\nFor eksempel:\n<ul>\n \t<li>Template: <code>&lt;username&gt;@&lt;domain&gt;<\/code><\/li>\n \t<li>Dit onput: <code>support@energydata.dk<\/code> (Not <code>&lt;admin&gt;@&lt;domain&gt;<\/code>)<\/li>\n<\/ul>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4dd4cb2 elementor-widget elementor-widget-heading\" data-id=\"4dd4cb2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">1. Opret upload <\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f427fee elementor-widget elementor-widget-text-editor\" data-id=\"f427fee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Start din kommandolinjeterminal.<br\/>I Windows kan du g\u00f8re dette ved at trykke p\u00e5 <i class=\"fa fa-windows\"><\/i> + R, indtaste kommandoen &#8220;cmd&#8221; og trykke p\u00e5 &#8220;Enter&#8221;-tasten.<\/p>\n<p>For at komme i gang skal du indtaste f\u00f8lgende kommando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd29663 elementor-widget elementor-widget-text-editor\" data-id=\"dd29663\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -H \"Accept: application\/json\" -X POST https:\/\/admin.energydata.dk\/api\/v1\/import --data-urlencode \"importname=<span class=\"fade\"><import_name><\/import_name><\/span>\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b4eb713 elementor-widget elementor-widget-text-editor\" data-id=\"b4eb713\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Systemet returnerer et objekt med information om uploaden:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b189298 elementor-widget elementor-widget-text-editor\" data-id=\"b189298\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition code\"><p class=\"admonition-title\">Output<\/p><p>{\n&#8220;user_id&#8221;:<span class=\"fade\">&lt;dit_bruger_id&gt;<\/span>,\n&#8220;status&#8221;:&#8221;stored&#8221;,\n&#8220;name&#8221;:&#8221;import_name&#8221;,\n&#8220;updated_at&#8221;:&#8221;2025-09-17T08:15:43.000000Z&#8221;,\n&#8220;created_at&#8221;:&#8221;2025-09-17T08:15:43.000000Z&#8221;,\n<span class=\"focus\">&#8220;id&#8221;:00000<\/span>\n}<\/p>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20abc6c elementor-widget elementor-widget-text-editor\" data-id=\"20abc6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p class=\"MsoNormal\">Vi skal bruge <b>id<\/b> for at forts\u00e6tte med n\u00e6ste trin; at hente upload-<abbr title=\"Uniform Resource Locator\">URL<\/abbr>&#8216;en.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76653d6 elementor-widget elementor-widget-heading\" data-id=\"76653d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">2. F\u00e5 upload URL<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-736c9cb elementor-widget elementor-widget-text-editor\" data-id=\"736c9cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Brug id&#8217;et fra outputtet fra den forrige kommando til at indtaste f\u00f8lgende kommando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e285b35 elementor-widget elementor-widget-text-editor\" data-id=\"e285b35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -H \"Accept: application\/json\" \"https:\/\/admin.energydata.dk\/api\/v1\/import\/<span class=\"fade\"><id><\/id><\/span>\/upload_url\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-107518f elementor-widget elementor-widget-text-editor\" data-id=\"107518f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Systemet returnerer dit unikke link, som vil se s\u00e5dan ud:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e021d5 elementor-widget elementor-widget-text-editor\" data-id=\"7e021d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition code\"><p class=\"admonition-title\">Output<\/p><p>{&#8220;upload_url&#8221;:&#8221;https:\\\/\\\/s3.energydata.dk\\\/import\\\/inbox\\\/s123456\\\/a53f2b5d-0493-44ea-bed7-e48c26cf99ed.csv?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&#038;X-Amz-Algorithm=AWS4-HMAC-SHA256&#038;X-Amz-Credential=edk-s3-root%2F20250917%2Fdefault%2Fs3%2Faws4_request&#038;X-Amz-Date=20250917T082537Z&#038;X-Amz-SignedHeaders=host&#038;X-Amz-Expires=7200&#038;X-Amz-Signature=29744bc062fe06d545250c56b2cc8e19cdf4095b9fd936392fdb7f92ab88f1bc&#8221;}<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3565a14 elementor-widget elementor-widget-text-editor\" data-id=\"3565a14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tV\u00e6rdien af \u200b\u200b<strong>upload_url<\/strong> er p\u00e5kr\u00e6vet for f\u00f8lgende trin.\n<div class=\"admonition warning\"><p class=\"admonition-title\">De seks forekomster af escapede skr\u00e5streger, \u201d\\\/\u201d, skal erstattes af almindelige skr\u00e5streger, \u201d\/\u201d.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c955839 elementor-widget elementor-widget-heading\" data-id=\"c955839\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">3. Upload CSV fil <\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d47f7cf elementor-widget elementor-widget-text-editor\" data-id=\"d47f7cf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tBrug den \u00e6ndrede upload-<abbr title=\"Uniform Resource Locator\">URL<\/abbr> fra det forrige trin til at indtaste f\u00f8lgende kommando:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6077b92 elementor-widget elementor-widget-text-editor\" data-id=\"6077b92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -H PUT -T <span class=\"fade\">\"<path_to_file><\/path_to_file><\/span>\" -H \"Content-Type: application\/octet-stream\" \"<span class=\"fade\"><upload_url><\/upload_url><\/span>\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-de3fcdd elementor-widget elementor-widget-text-editor\" data-id=\"de3fcdd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Systemet returnerer ikke noget, men uploaden skal stadig valideres og indtages.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-31f04fc elementor-widget elementor-widget-heading\" data-id=\"31f04fc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">4. Valider import <\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e18325b elementor-widget elementor-widget-text-editor\" data-id=\"e18325b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For at validere importen skal du indtaste f\u00f8lgende kommando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-246f24b elementor-widget elementor-widget-text-editor\" data-id=\"246f24b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -H \"Accept: application\/json\" -X PUT https:\/\/admin.energydata.dk\/api\/v1\/import\/<span class=\"fade\">&lt;id&gt;<\/span>\/validate<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46bd76e elementor-widget elementor-widget-text-editor\" data-id=\"46bd76e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Systemet burde returnere noget lignende dette:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-511c2da elementor-widget elementor-widget-html\" data-id=\"511c2da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"admonition code\">\n    <p class=\"admonition-title\">Output<\/p>\n    <p>{\n\"id\":00000,\n\"name\":\"import_name\",\n<span class=\"focus\">status\":\"validating\"<\/span>,\n\"user_id\":000,\n\"datastreams\":null,\n\"validated_lines\":0,\n\"ingested_lines\":0,\n\"min_ts\":null,\n\"max_ts\":null,\n\"validated_at\":null,\n\"ingested_at\":null,\n\"created_at\":\"2026-04-08T11:06:52.000000Z\",\n\"updated_at\":\"2026-04-08T11:35:05.000000Z\"\n}<\/p>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4116b46 elementor-widget elementor-widget-text-editor\" data-id=\"4116b46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition success\">\n<p class=\"admonition-title\">For at kontrollere, at vi har fulgt alle trin korrekt, skal v\u00e6rdien af \u200b\u200bstatus v\u00e6re &#8220;validating&#8221;.<\/p>\n\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-092d644 elementor-widget elementor-widget-heading\" data-id=\"092d644\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">5. Indl\u00e6s import<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8ea1612 elementor-widget elementor-widget-text-editor\" data-id=\"8ea1612\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Det sidste trin er at indl\u00e6se uploaden. For at g\u00f8re dette skal du indtaste f\u00f8lgende kommando: <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf963a3 elementor-widget elementor-widget-text-editor\" data-id=\"cf963a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -H \"Accept: application\/json\" -X PUT https:\/\/admin.energydata.dk\/api\/v1\/import\/<span class=\"fade\">&lt;id&gt;<\/span>\/ingest<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f02145e elementor-widget elementor-widget-text-editor\" data-id=\"f02145e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tBem\u00e6rk igen &#8220;id&#8221; i <abbr title=\"Uniform Resource Locator\">URL<\/abbr>&#8216;en. Systemet skal returnere:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1f06a39 elementor-widget elementor-widget-text-editor\" data-id=\"1f06a39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition code\">\n<p class=\"admonition-title\">Output<\/p>\n<p>\n{\n&#8220;id&#8221;:00000,\n&#8220;name&#8221;:&#8221;Import_name&#8221;,\n<span class=\"focus\">&#8220;status&#8221;:&#8221;ingesting&#8221;<\/span>,\n&#8220;user_id&#8221;:000,\n&#8220;datastreams&#8221;:[1000001,1000002,1000003],\n&#8220;validated_lines&#8221;:100,\n&#8220;ingested_lines&#8221;:0,\n&#8220;min_ts&#8221;:&#8221;2026-01-01T00:00:00.000000Z&#8221;,\n&#8220;max_ts&#8221;:&#8221;2026-03-22T00:00:00.000000Z&#8221;,\n&#8220;validated_at&#8221;:&#8221;2026-04-08T12:11:08.000000Z&#8221;,\n&#8220;ingested_at&#8221;:null,\n&#8220;created_at&#8221;:&#8221;2026-04-08T12:09:50.000000Z&#8221;,\n&#8220;updated_at&#8221;:&#8221;2026-04-08T12:13:21.000000Z&#8221;\n}<\/p>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2eb8271 elementor-widget elementor-widget-text-editor\" data-id=\"2eb8271\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t&#8220;Status&#8221; skal v\u00e6re &#8220;ingesting&#8221;. Hvis der er noget galt med din <abbr title=\"Comma-separated Values\">CSV<\/abbr>-fil, f\u00e5r du i stedet f\u00f8lgende fejl: \n<div class=\"admonition code\"><p class=\"admonition-title\">Output<\/p><p>{&#8220;error&#8221;:&#8221;Unable to start ingestion&#8221;}<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1cdd662 elementor-widget elementor-widget-heading\" data-id=\"1cdd662\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"example-python-code\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Batch upload ved brug af Python<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9703c8c elementor-widget elementor-widget-text-editor\" data-id=\"9703c8c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Her er et eksempel p\u00e5 en Python-kode til batch-upload af data. N\u00e5r du downloader, er det n\u00f8dvendigt at \u00e6ndre filen fra .txt til .py, eller blot kopiere og inds\u00e6tte den i din foretrukne kodeeditor. Hvis du forts\u00e6tter med sidstn\u00e6vnte, skal den opdeles i to filer med samme navne som de downloadede filer.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aab204d elementor-widget elementor-widget-text-editor\" data-id=\"aab204d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<strong>Hoved fil:<\/strong> <code>batch_upload.py<\/code>\n\nDette er kode du kan bruge til at uploade din <abbr title=\"Comma-separated Values\">CSV<\/abbr>-fil til EnergyDataDK. Du skal angive dit <abbr title=\"Application Programming Interface\">API<\/abbr> token og datastr\u00f8m ID&#8217;erne som h\u00f8rer til de datastr\u00f8mme du vil inds\u00e6tte data i. \n\nDet er ikke n\u00f8dvendigt at \u00e6ndre andet i koden udover de f\u00f8lgende 3 brugerdefinerede v\u00e6rdier.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f785c56 elementor-widget elementor-widget-text-editor\" data-id=\"f785c56\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><code>&lt;PATH_TO_YOUR_CSV_FILE&gt;<\/code>: I Python kan man bruge &#8220;\/&#8221;, &#8220;\\\\&#8221;, eller &#8220;\\&#8221;. Fordi \\U, \\D, osv. bliver brugt til specielle karaterer anbefaler vi at g\u00f8re brug af &#8220;\/&#8221;, eller &#8220;\\\\&#8221;, eller tilf\u00f8je &#8220;r&#8221; foran <abbr title=\"Uniform Resource Locator\">URL<\/abbr>&#8216;en for at indikere at det er en r\u00e5 streng.<br\/>For example:<ul><li>r&#8221;C:\\Users\\You\\Documents\\data.csv&#8221;<\/li><li>&#8220;C:\\\\Users\\\\You\\\\Documents\\\\data.csv&#8221;<\/li><li>&#8220;C:\/Users\/You\/Documents\/data.csv&#8221;<\/li><\/ul><\/li><li><code><your_api_token><\/your_api_token><\/code>Dette er dit API-token. Det burde nogenlunde ligne dette: &#8220;12aBcd34e5FgH6IJklmNOpq7R8sTuvW9x0y1ZAbc&#8221;.<\/li><li><code><your_datastream_ids><\/your_datastream_ids><\/code>: Hvis dun \u00f8nsker at inds\u00e6tte dat i kun en enkel datastr\u00f8m kan du tilf\u00f8je en enkel v\u00e6rdi mellem <br\/>de firkantede parenteser og anf\u00f8rselstegn, lige som det her: [1000001]. Hvis du \u00f8nsker at inds\u00e6tte data i adskillige datastr\u00f8mme p\u00e5 en gang skal du skille disse v\u00e6rdier med kommaer, som her: [1000001, 1000002, 1000003].<br\/>V\u00e6r opm\u00e6rksom p\u00e5 at r\u00e6kkef\u00f8lgen af datastr\u00f8mmene <i>skal<\/i> stemme overens med den i <abbr title=\"Comma-separated Values\">CSV<\/abbr>-filen!<\/li><li><code>&lt;YOUR_FILE_NAME&gt;<\/code>: Indtast det midlertidige filnavn, der genereres under uploaden.<\/li><li><code>&lt;YOUR_TMP_DIR&gt;<\/code>: Indtast fil-stien til mappen, hvor den midlertidige fil skal gemmes under upload.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-653a2a6 elementor-widget elementor-widget-text-editor\" data-id=\"653a2a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition failure\"><p class=\"admonition-title\">Du kan f\u00e5 en meddelelse af typen <span class=\"code\">ModuleNotFoundError: No module named &#8216;pytz&#8217;<\/span>.<\/p><p>For at rette dette skal du indtaste kommandoen: <code>python -m pip install pytz<\/code>.<br\/>Dette vil installere det manglende modul.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa4c16f elementor-widget elementor-widget-code-highlight\" data-id=\"fa4c16f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"7-11\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import pytz\r\nimport csv\r\nfrom datetime import datetime\r\nfrom EnergyDataImport import EnergyDataImport\r\n\r\n# ###### CONFIGURATION ######\r\nCSV_FILE_PATH = <PATH_TO_YOUR_CSV_FILE>  # Format: r\"C:\\Users\\You\\Documents\\data.csv\"\r\nAUTH_TOKEN = <YOUR_API_TOKEN>            # Format: \"12aBcd34e5FgH6IJklmNOpq7R8sTuvW9x0y1ZAbc\"\r\nDATASTREAM_IDS = <YOUR_DATASTREAMS_IDS>  # Format: [1, 2...]\r\nIMPORT_NAME = <YOUR_FILE_NAME>           # Format: myFileName.csv\r\nTMP_DIR = <YOUR_TMP_DIR>                 # Format: r\"C:\\Users\\You\\Documents\\temporary\"\r\n# ###########################\r\n\r\n# ----- NO NEED TO MODIFY ANYTHING AFTER THIS POINT -----\r\ndef run_multi_import():\r\n    # 1. Pass the list of IDs to the properties argument\r\n    with EnergyDataImport(\r\n        upload_filename=IMPORT_NAME,\r\n        properties=DATASTREAM_IDS,  # Class creates a header with all IDs\r\n        energydata_api_token=AUTH_TOKEN,\r\n        overwrite=True,\r\n        tmp_dir=TMP_DIR\r\n    ) as batch:\r\n        with open(CSV_FILE_PATH, mode='r', encoding='utf-8') as f:\r\n            reader = csv.reader(f, delimiter=';')\r\n            next(reader) # Skip metadata line\r\n            for row in reader:\r\n                if not row or len(row) < (len(DATASTREAM_IDS) + 1):\r\n                    continue\r\n                # Parse timestamp (Column 0)\r\n                raw_ts = datetime.strptime(row[0], \"%Y-%m-%dT%H:%M:%S.%fZ\")\r\n                utc_ts = pytz.utc.localize(raw_ts)\r\n                # 2. Extract values for all streams (Columns 1, 2, and 3)\r\n                # Ensure the list length matches len(DATASTREAM_IDS)\r\n                values = [float(row[i+1]) for i in range(len(row)-1)]\r\n                # 3. Add the row to the batch\r\n                batch.add_values(utc_ts, values)\r\n \r\n        # Proceed with the standard lifecycle\r\n        batch.upload()\r\n        batch.validate()\r\n        batch.ingest()\r\n \r\nif __name__ == \"__main__\":\r\n    run_multi_import()<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ee1acc elementor-widget elementor-widget-text-editor\" data-id=\"3ee1acc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Hj\u00e6lpefil:<\/strong> <code>EnergyDataImport.py<\/code><\/p>\n<p>Denne kode indeholder funktionerne for hovedfejlen. Der kr\u00e6ves ingen \u00e6ndringer. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e70b9ef elementor-widget elementor-widget-code-highlight\" data-id=\"e70b9ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import requests\r\nimport csv\r\nimport time\r\nimport os\r\nimport pytz\r\nimport json\r\nfrom datetime import datetime\r\nfrom enum import Enum\r\nfrom typing import List\r\nfrom pathlib import Path\r\n\r\nclass EnergyDataImport:\r\n    \"\"\"\r\n    A utility class to make batch importing to EnergyData.dk easier from Python.\r\n    \r\n    This class handles building a CSV file in the correct format to be used for \r\n    importing to EnergyData.dk via the batch API. It manages the entire lifecycle:\r\n    creating the proper CSV, uploading, validating, and ingesting the file.\r\n    \"\"\"\r\n\r\n    # The API host for EnergyDataDK import endpoints\r\n    API_HOST = 'https:\/\/admin.energydata.dk\/api\/v1\/import'\r\n    API_HEADERS = { 'Accept' : 'application\/json' }\r\n\r\n    # The format required by EnergyDataDK for timestamps\r\n    TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ'\r\n\r\n    class Status(Enum):\r\n        \"\"\"Internal state machine to track the progress of the import job.\"\"\"\r\n        UNINITIALIZED = 0\r\n        OPEN = 1\r\n        CLOSED = 2\r\n        UPLOADING = 3\r\n        STORED = 4\r\n        VALIDATING = 5\r\n        READY = 6\r\n        INGESTING = 7\r\n        DONE = 8\r\n        ABORTED = 9\r\n        ERROR = 10\r\n    \r\n    def __init__(\r\n        self,\r\n        upload_filename: str, \r\n        properties: List,  \r\n        energydata_api_token: str,\r\n        overwrite: bool = False, \r\n        tmp_dir: str = '\/tmp\/energydata_batch_upload', \r\n        autoclean_tmp_files: bool = True):\r\n        \"\"\"\r\n        Constructor for class. Create an instance for each batch upload. \r\n        An instance cannot be reused between multiple imports.\r\n\r\n        Args:\r\n            upload_filename (str): Name for the import file generated locally and used on the server.\r\n            properties (List): List of property IDs or Topics to which data will be added.\r\n            energydata_api_token (str): API token from https:\/\/portal.energydata.dk\/user#accesstokens.\r\n            overwrite (bool): Controls whether to overwrite existing local or remote files.\r\n            tmp_dir (str): Directory for temporary CSV storage before upload.\r\n            autoclean_tmp_files (bool): If True, removes local files once the context is closed.\r\n        \"\"\"\r\n        self.status = self.Status.UNINITIALIZED\r\n        self.import_id = None\r\n        self.upload_url = None\r\n        self.added_lines = 0\r\n        self.previous_ts = None\r\n        self.upload_filename = upload_filename\r\n        self.local_file_path = Path.joinpath(Path(tmp_dir), Path(upload_filename))\r\n        self.properties = properties\r\n        self.energydata_api_token = energydata_api_token\r\n        self.overwrite = overwrite\r\n        self.tmp_dir = tmp_dir\r\n        self.autoclean_tmp_files = autoclean_tmp_files\r\n        self.api_headers = dict(self.API_HEADERS)\r\n        self.api_headers.update({'Authorization': f'Bearer {energydata_api_token}'})\r\n\r\n    def __enter__(self):\r\n        \"\"\"\r\n        Prepares the environment: creates the temp directory and opens the CSV file for writing.\r\n        \"\"\"\r\n        self.__assert_status(self.Status.UNINITIALIZED)\r\n        Path(self.tmp_dir).mkdir(parents=True, exist_ok=True)\r\n        \r\n        if not self.overwrite and Path.exists(self.local_file_path):\r\n            raise Exception(f\"File '{self.upload_filename}' already exists. Set overwrite=True.\")\r\n            \r\n        self.fd = open(self.local_file_path, mode='w', newline='')\r\n        # CSV format: delimiter ';', double quotes for strings, non-numeric quoting\r\n        self.writer = csv.writer(self.fd, quoting=csv.QUOTE_NONNUMERIC, delimiter=';', \r\n                                quotechar='\"', escapechar='\\\\', doublequote=False)\r\n        # Header row: First column is empty (reserved for timestamp), followed by property list\r\n        self.writer.writerow([''] + self.properties)\r\n\r\n        self.__change_status(self.Status.UNINITIALIZED, self.Status.OPEN)\r\n        return self\r\n\r\n    def __exit__(self, type, value, traceback):\r\n        \"\"\"Closes the file descriptor and handles automatic cleanup of local files.\"\"\"\r\n        if hasattr(self, 'fd') and not self.fd.closed: self.fd.close()\r\n        if self.autoclean_tmp_files and os.path.exists(self.local_file_path): \r\n            os.remove(self.local_file_path)\r\n        self.status = self.Status.CLOSED\r\n\r\n    def add_values(self, time: datetime, values: List):\r\n        \"\"\"\r\n        Adds a row of data to the import buffer.\r\n\r\n        Args:\r\n            time (datetime): Timestamp. Must be timezone-aware.\r\n            values (List): Data values matching the number of properties in the constructor.\r\n\r\n        Raises:\r\n            Exception: If time is not timezone-aware or if timestamps are not monotonically increasing.\r\n        \"\"\"\r\n        self.__assert_status(self.Status.OPEN)\r\n        if time.tzinfo == None:\r\n            raise Exception(\"No timezone specified for the datetime object.\")\r\n        if len(values) != len(self.properties):\r\n            raise Exception(f\"Expected {len(self.properties)} values, found {len(values)}.\")\r\n        if self.previous_ts is not None and time <= self.previous_ts:\r\n            raise Exception(\"Added timestamps must be strictly increasing.\")\r\n        \r\n        self.previous_ts = time\r\n        # Convert to UTC ISO format before writing\r\n        self.writer.writerow(\r\n            [time.astimezone(pytz.UTC).strftime(self.TIMESTAMP_FORMAT)] + list(values)\r\n        )\r\n        self.added_lines += 1\r\n\r\n    def upload(self, print_progress = True):\r\n        \"\"\"\r\n        Finalizes the CSV and uploads it to the server storage. Once called, state \r\n        transitions from OPEN to UPLOADING and finally to STORED.\r\n        \"\"\"\r\n        self.__change_status(self.Status.OPEN, self.Status.UPLOADING)\r\n        self.fd.close()\r\n        \r\n        # 1. Create the import job record\r\n        res = requests.post(url=self.API_HOST, headers=self.api_headers, params={'importname': self.upload_filename})\r\n        res.raise_for_status()\r\n        self.import_id = res.json()['id']\r\n\r\n        # 2. Get the secure S3 upload URL\r\n        res = requests.get(url=f'{self.API_HOST}\/{self.import_id}\/upload_url', headers=self.api_headers)\r\n        res.raise_for_status()\r\n        self.upload_url = res.json()['upload_url'].replace(\"\\\\\", \"\") \r\n        \r\n        if print_progress: print(f'Starting file upload for job id: {self.import_id}')\r\n        \r\n        # 3. Upload the binary data\r\n        with open(self.local_file_path, 'rb') as f:\r\n            res = requests.put(self.upload_url, data=f, headers={\"Content-Type\": \"application\/octet-stream\"})\r\n        res.raise_for_status()\r\n\r\n        self.__change_status(self.Status.UPLOADING, self.Status.STORED)\r\n        if print_progress: print(f'Successfully stored job id {self.import_id}')\r\n\r\n    def validate(self, errors_limit = 0, block = True, print_progress = True):\r\n        \"\"\"\r\n        Triggers server-side validation. State transitions from STORED to VALIDATING \r\n        and finally to READY.\r\n        \"\"\"\r\n        self.__change_status(self.Status.STORED, self.Status.VALIDATING)\r\n        self.__api_put_request(block, 'validate', lambda s: self.__validation_progress(s, print_progress), {'errors_limit': errors_limit})\r\n\r\n    def ingest(self, block = True, print_progress = True):\r\n        \"\"\"\r\n        Triggers final ingestion. State transitions from READY to INGESTING \r\n        and finally to DONE.\r\n        \"\"\"\r\n        self.__change_status(self.Status.READY, self.Status.INGESTING)\r\n        self.__api_put_request(block, 'ingest', lambda s: self.__ingestion_progress(s, print_progress))\r\n\r\n    def __api_put_request(self, block, path, progress_callback, body = None):\r\n        \"\"\"Helper to send PUT requests and poll for status updates.\"\"\"\r\n        res = requests.put(url=f'{self.API_HOST}\/{self.import_id}\/{path}', headers=self.api_headers, json=body)\r\n        res.raise_for_status()\r\n        while block:\r\n            time.sleep(5)\r\n            status = self.__get_status()\r\n            if not progress_callback(status): break\r\n\r\n    def __get_status(self):\r\n        \"\"\"Retrieves the current job metadata from the server.\"\"\"\r\n        res = requests.get(url=f'{self.API_HOST}\/{self.import_id}', headers=self.api_headers)\r\n        res.raise_for_status()\r\n        return res.json()\r\n\r\n    def __assert_status(self, expected):\r\n        if expected != self.status:\r\n            raise Exception(f\"Expected status '{expected}', but found '{self.status}'\")\r\n\r\n    def __change_status(self, expected, to):\r\n        self.__assert_status(expected)\r\n        self.status = to\r\n    \r\n    def __validation_progress(self, status, print_progress):\r\n        if print_progress: print(f'Validated {status[\"validated_lines\"]}\/{self.added_lines} lines')\r\n        if status['status'] == 'validating': return True\r\n        if status['status'] == 'ready':\r\n            self.__change_status(self.Status.VALIDATING, self.Status.READY)\r\n            return False\r\n        raise Exception(f'Validation failed: {status[\"status\"]}')\r\n\r\n    def __ingestion_progress(self, status, print_progress):\r\n        if print_progress: print(f'Ingested {status[\"ingested_lines\"]}\/{self.added_lines} lines')\r\n        if status['status'] == 'ingesting': return True\r\n        if status['status'] == 'done':\r\n            self.__change_status(self.Status.INGESTING, self.Status.DONE)\r\n            print(\"******Data uploaded successfully******\")\r\n            return False\r\n        raise Exception(f'Ingestion failed: {status[\"status\"]}')<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fa7622 elementor-widget elementor-widget-text-editor\" data-id=\"2fa7622\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tN\u00e5r du har indtastet dine brugerdefinerede data og k\u00f8rt hovedfilen (batch_upload.py), vises flere udskrifter i terminalen, inklusive antallet af uploadede linjer og hvorn\u00e5r dataene er uploadet.<br\/><br\/>Bem\u00e6rk venligst, at indl\u00e6sningsprocessen kan tage et par minutter for store datas\u00e6t.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5d11e65 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"5d11e65\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6fdbbc7\" data-id=\"6fdbbc7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bcafec3 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"bcafec3\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"fetch-data\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Fetch data<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8fc3ced elementor-widget elementor-widget-text-editor\" data-id=\"8fc3ced\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Du kan anvende fetch data <abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;et for at downloade data fra en aller adskillige datastr\u00f8mme fra et datas\u00e6t. V\u00e6r opm\u00e6rksom at du skal bruge l\u00e6se-rettigheder for at kunne hente dataet. Ressourcen kan blive brugt til at hente de seneste v\u00e6rdier, eller v\u00e6rdier fra et tidsinterval.  <\/p><p>V\u00e6r opm\u00e6rksom p\u00e5 at denne ressource ikke returnerer <abbr title=\"JavaScript Object Notation\">JSON<\/abbr> ved succesfulde foresp\u00f8rgsler. I disse tilf\u00e6lde bliver respons data sent tilbage til klienten som <abbr title=\"Comma-separated Values\">CSV<\/abbr>. Du b\u00f8r dog stadig specificere &#8220;Accept: application\/json&#8221; i headeren for at sikre at fejl bliver returneret til klienten som <abbr title=\"JavaScript Object Notation\">JSON<\/abbr>.  <\/p><p>For at hente data, skal du bruge f\u00f8lgende <abbr title=\"Uniform Resource Locator\">URL<\/abbr>: https:\/\/admin.energydata.dk\/api\/v1\/datastreams\/values, med <abbr title=\"Application Programming Interface\">API<\/abbr> parametre, som er:<\/p><ul><li>IDs: liste af datastr\u00f8m ID&#8217;er til at eksporter, adskilt med kommaer<\/li><li>From: for et angivet tidsrum, dato hvorfra du \u00f8nsker at eksportere, ISO8601-formateret dato (\u00c5\u00c5\u00c5\u00c5-MM-DDTt:mm:ss).<\/li><li>To: For et angivet tidsrum, dato indtil hvilken du \u00f8nsker at eksportere, ISO8601-formateret dato (\u00c5\u00c5\u00c5\u00c5-MM-DDTt:mm:ss).<\/li><li>Latest: Boolean (sandt eller falsk), indikerer om de seneste v\u00e6rdier skal hentes.<\/li><\/ul><p>For at f\u00e5 adgang til datastr\u00f8ms-id&#8217;erne, hvis du er ejeren, kan du se disse p\u00e5 den respektive datas\u00e6tside ved at klikke p\u00e5 den datastr\u00f8m, du er interesseret i (se<em> <\/em>samme billede som i bad-uploaden). Hvis du kun har &#8220;Skrive&#8221;-rettigheder, kan du kun se disse selv ved at downloade en br\u00f8kdel af dataene fra webstedet, selvom de er tomme. Fra en s\u00e5dan fil indeholder headerne de \u00f8nskede id&#8217;er og emner. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f3b655c elementor-widget elementor-widget-text-editor\" data-id=\"f3b655c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Metoden nedunder beskriver hvordan du kan hente data ved brug af kommandolinjen i Windows. <br>Du kan dog ogs\u00e5 bruge en tredjepart applikation som Postman. Du kan finde en vejledning til hentning af data ved brug af Postman <a href=\"https:\/\/energydata.dk\/da\/hentning-af-data-ved-brug-af-postman\/\">her<\/a>. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f8ae4c elementor-widget elementor-widget-heading\" data-id=\"0f8ae4c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Hent v\u00e6rdier for en udspecificeret tidsrum<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd95859 elementor-widget elementor-widget-text-editor\" data-id=\"dd95859\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tFor at hente v\u00e6rdier fra et bestemt tidsrum, defineret med \u201cfrom\u201d og \u201cto\u201d indikatorer. Du kan g\u00f8re dette ved at skrive f\u00f8lgende i command prompt af din pc. L\u00e6g m\u00e6rke til at v\u00e6rdierne mellem \u201c  &lt;&gt;\u201d referer til dem du skal udfylde med de oplysninger du vil hente, inklusiv output filen.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c497b29 elementor-widget elementor-widget-text-editor\" data-id=\"c497b29\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition info\">\n<p class=\"admonition-title\">N\u00e5r du udfylder nedenst\u00e5ende oplysninger, skal du erstatte hele pladsholderen, <em>inklusive<span class=\"code\"><\/span> <span class=\"code\">&lt; og &gt;<\/span> parenteserne.<\/em><\/p>\nFor eksempel:\n<ul>\n \t<li>Template: <code>&lt;username&gt;@&lt;domain&gt;<\/code><\/li>\n \t<li>Dit onput: <code>support@energydata.dk<\/code> (Not <code>&lt;admin&gt;@&lt;domain&gt;<\/code>)<\/li>\n<\/ul>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-624239d elementor-widget elementor-widget-text-editor\" data-id=\"624239d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -X GET \"https:\/\/admin.energydata.dk\/api\/v1\/datastreams\/values?ids=<span class=\"fade\"><list_of_datastreams><\/list_of_datastreams><\/span>&from=<span class=\"fade\"><start_of_timespan><\/start_of_timespan><\/span>&to=<span class=\"fade\"><end_of_timespan><\/end_of_timespan><\/span>\" -H \"Accept: application\/json\" -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -o \"<span class=\"fade\"><output_file.csv><\/output_file.csv><\/span>\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1bea69c elementor-widget elementor-widget-text-editor\" data-id=\"1bea69c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For eksempel:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f62cc90 elementor-widget elementor-widget-text-editor\" data-id=\"f62cc90\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -X GET \"https:\/\/admin.energydata.dk\/api\/v1\/datastreams\/values?ids=1001,1002,1003&from=1970-01-01&to=2030-12-31\" -H \"Accept: application\/json\" -H \"Authorization: Bearer G7kPz2QmL9xVJ4aRfT8wNcY1sD3uHCoEb6Z5iX0A\" -o \"myOutputFile.csv\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ebd1646 elementor-widget elementor-widget-text-editor\" data-id=\"ebd1646\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Outputtet vil se nogenlunde s\u00e5dan ud, men med de specifikke data fra din import. Output-<abbr title=\"Comma-separated Values\">CSV<\/abbr>-filen vil blive gemt i den samme mappe, som du udstedte kommandoen fra. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-af90b37 elementor-widget elementor-widget-text-editor\" data-id=\"af90b37\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre> % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 46 0 46 0 0 271 0 --:--:-- --:--:-- --:--:-- 277<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-071234f elementor-widget elementor-widget-heading\" data-id=\"071234f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Hent seneste v\u00e6rdier<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-430691e elementor-widget elementor-widget-text-editor\" data-id=\"430691e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Denne metode returnerer den sidste r\u00e6kke (eller tidsstempel) af den tilg\u00e6ngelige data for den specificerede datastr\u00f8m eller datastr\u00f8mme. Du beh\u00f8ver ikke specificere &#8220;from&#8221; eller &#8220;to&#8221; kun datastr\u00f8m ID&#8217;et. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c828b5f elementor-widget elementor-widget-text-editor\" data-id=\"c828b5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -X GET \"https:\/\/admin.energydata.dk\/api\/v1\/datastreams\/values?ids=<span class=\"fade\"><list_of_datastreams><\/list_of_datastreams><\/span>&latest=True\" -H \"Accept: application\/json\" -H \"Authorization: Bearer <span class=\"fade\"><your_token><\/your_token><\/span>\" -o \"<span class=\"fade\"><output_file.csv><\/output_file.csv><\/span>\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c8044c elementor-widget elementor-widget-text-editor\" data-id=\"1c8044c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For eksempel:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4516065 elementor-widget elementor-widget-text-editor\" data-id=\"4516065\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>curl -X GET \"https:\/\/admin.energydata.dk\/api\/v1\/datastreams\/values?ids=1001,1002,1003&latest=True\" -H \"Accept: application\/json\" -H \"Authorization: Bearer G7kPz2QmL9xVJ4aRfT8wNcY1sD3uHCoEb6Z5iX0A\" -o \"myOutputFile.csv\"<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0cf680c elementor-widget elementor-widget-text-editor\" data-id=\"0cf680c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Outputtet vil se nogenlunde s\u00e5dan ud, men med de specifikke data fra din import. Output-<abbr title=\"Comma-separated Values\">CSV<\/abbr>-filen vil blive gemt i den samme mappe, som du udstedte kommandoen fra. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65d4fbc elementor-widget elementor-widget-text-editor\" data-id=\"65d4fbc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre> % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 32 0 32 0 0 218 0 --:--:-- --:--:-- --:--:-- 225<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-42001c1 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"42001c1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-780bde2\" data-id=\"780bde2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d405eab elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"d405eab\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"mqtt\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">MQTT<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8147ce1 elementor-widget elementor-widget-text-editor\" data-id=\"8147ce1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> <abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;en giver dig mulighed for at uploade (publicere) data til en eller flere datastr\u00f8mme eller downloade (abonnere p\u00e5) en eller flere datastr\u00f8mme i realtid. Flere v\u00e6rdier kan publiceres samtidigt, og <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>&#8216;s Quality of Service (QoS) underst\u00f8ttes.<br\/>For at bruge <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> <abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;en til at publicere eller abonnere p\u00e5 en datastr\u00f8m, skal du have et token, der giver rettigheder til at oprette forbindelse til <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-m\u00e6gleren. <\/p><p><abbr title=\"Application Programming Interface\">API<\/abbr>&#8216;et er bygget ovenp\u00e5 <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> protokollen, version 3.1.1. M\u00e6gleren er tilg\u00e6ngelig hos <strong>mqtts.energydata.dk<\/strong> og er \u00e5bn for <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr> forbindelser p\u00e5 <strong>port 8883<\/strong>. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20d0959 elementor-widget elementor-widget-text-editor\" data-id=\"20d0959\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Her er en oversigt over <abbr title=\"Quality of Service\">QoS<\/abbr>-niveauerne:<\/p><ul>\n \t<li><strong>0<\/strong> &#8211; standardniveauet for servicekvalitet, som <em>ikke<\/em> garanterer levering af beskeden. Udgiveren sender beskeden til MQTT-brokeren h\u00f8jst \u00e9n gang, og brokeren bekr\u00e6fter ikke modtagelsen. Brug dette niveau, hvis du kan acceptere tab af besked.  <\/li>\n \t<li><strong>1<\/strong> &#8211; det servicekvalitetsniveau, som <em>garanterer<\/em> levering af beskeden. Udgiveren sender beskeden mere end \u00e9n gang, indtil MQTT-m\u00e6gleren bekr\u00e6fter modtagelsen. Brug dette niveau, n\u00e5r beskeden skal leveres, og du ikke har et problem med, at abonnenten modtager beskeden mere end \u00e9n gang.  <\/li>\n \t<li><strong>2<\/strong> &#8211; det servicekvalitetsniveau, som <em>garanterer levering af beskeden pr\u00e6cis \u00e9n gang<\/em>. Udgiveren sender og gemmer beskeden, indtil der er opn\u00e5et et dobbelt handshake mellem afsender og modtager for at bekr\u00e6fte modtagelsen. Du kan bruge dette niveau, n\u00e5r beskeden skal behandles uden at duplikere.  <\/li>\n<\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ac749fe elementor-widget elementor-widget-heading\" data-id=\"ac749fe\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"publish-data\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Uploade data<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c05e213 elementor-widget elementor-widget-text-editor\" data-id=\"c05e213\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Publicering af data giver dataudbydere mulighed for at sende data til lagring i EnergyDataDK. Det er muligt at udgive meddelelser med \u00e9n eller flere v\u00e6rdier. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7ca2d8 elementor-widget elementor-widget-text-editor\" data-id=\"b7ca2d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition danger\">\n<p class=\"admonition-title\">Formatet for nyttelasten er af afg\u00f8rende betydning; s\u00f8rg venligst for n\u00f8je overholdelse af formateringen!<\/p>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c343f95 elementor-widget elementor-widget-heading\" data-id=\"c343f95\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Enkeltv\u00e6rdi payload format<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aacf4dd elementor-widget elementor-widget-text-editor\" data-id=\"aacf4dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Beskeder med enkelv\u00e6rdi indeholder et tidsstempel og en v\u00e6rdi. Datastr\u00f8mmen, der er knyttet til beskeden, udledes af <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-emnet. Tidsstemplet skal v\u00e6re et heltal i Unix Epoch-format, det vil sige antallet af millisekunder siden 01-01-1970. V\u00e6rditypen afh\u00e6nger af, hvad der er angivet for den specifikke datastr\u00f8m, streng, double eller heltal.   <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed3d5b5 elementor-widget elementor-widget-code-highlight\" data-id=\"ed3d5b5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-json line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-json\">\n\t\t\t\t\t<xmp>{\n  \"timestamp\": <unix_timestamp>,\n  \"value\": <value>\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2e38d0f elementor-widget elementor-widget-text-editor\" data-id=\"2e38d0f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For eksempel:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da39119 elementor-widget elementor-widget-code-highlight\" data-id=\"da39119\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-json line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-json\">\n\t\t\t\t\t<xmp>{\n  \"timestamp\": 1775727761141\n  \"value\": 14.47\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fdf5fa7 elementor-widget elementor-widget-heading\" data-id=\"fdf5fa7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Multiv\u00e6rdi payload format<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-17c1949 elementor-widget elementor-widget-text-editor\" data-id=\"17c1949\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Multiv\u00e6rdimeddelelser bruges i situationer, hvor du har brug for at udgive flere forskellige, men relaterede v\u00e6rdier. De vil blive tilf\u00f8jet med samme tidsstempe,l til det samme datas\u00e6t, p\u00e5 datastr\u00f8msemner angivet som f\u00f8lger: <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a851837 elementor-widget elementor-widget-code-highlight\" data-id=\"a851837\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-json line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-json\">\n\t\t\t\t\t<xmp>{\n  \"timestamp\": <unix_timestamp>\n  \"value\": {\n    \"<datastream_topic>\": <value>,\n    \u22ef\n  }\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aca19a6 elementor-widget elementor-widget-text-editor\" data-id=\"aca19a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>For eksempel:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d0131d9 elementor-widget elementor-widget-code-highlight\" data-id=\"d0131d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-json line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-json\">\n\t\t\t\t\t<xmp>{\n  \"timestamp\": 1775727761141\n  \"value\": {\n    \"a-datastream-topic\": 14.47,\n    \"other-datastream-topic\": 34,\n    \"last-datastream-topic\": \"Hello world\",\n  }\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d43c465 elementor-widget elementor-widget-heading\" data-id=\"d43c465\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Python scripts til data publishing<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d338b39 elementor-widget elementor-widget-text-editor\" data-id=\"d338b39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Et eksempel p\u00e5 Python-kode til publicering af meddelelser med flere v\u00e6rdier kan findes nedenfor, hvor pladsholdere (ordene i &#8220;&lt;&gt;&#8221;) skal erstattes med dine oplysninger.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-db8f1c0 elementor-widget elementor-widget-text-editor\" data-id=\"db8f1c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Der er 4 oplysninger, du skal tilpasse:<\/p><table><tbody><tr><th>Variable<\/th><th>Format<\/th><\/tr><tr><td>CLIENT_ID<\/td><td><p>Unik identifikator uden mellemrum.<\/p><p>For eksempel:<\/p><ul><li>&#8220;20260413115412_CLIENT&#8221;<\/li><li>&#8220;FREDDY_MERCURY&#8221;<\/li><\/ul><\/td><\/tr><tr><td>TOPIC<\/td><td><p>I meddelelser med flere v\u00e6rdier er datas\u00e6ttets emne p\u00e5kr\u00e6vet, og datastr\u00f8mmens emner vil v\u00e6re defineret i nyttelasten.<br\/>For eksempel:<\/p><ul><li>&#8220;dataset-topic&#8221;<\/li><li>&#8220;mqtt-prefix&#8221;<\/li><\/ul><p> <\/p><p>I beskeder med \u00e9n v\u00e6rdi skal det fulde emne (b\u00e5de suffiks og pr\u00e6fiks) angives.<br\/>For eksempel:<\/p><ul><li>datas\u00e6t\/datastr\u00f8m<\/li><li>pr\u00e6fiks\/suffiks<\/li><\/ul><\/td><\/tr><tr><td>TOKEN<\/td><td><p>Dit API-token, som giver <em>skriveadgang<\/em> til det p\u00e5g\u00e6ldende datas\u00e6t.<\/p><p>For eksempel:<\/p><ul><li>&#8220;12aBcd34e5FgH6IJklmNOpq7R8sTuvW9x0y1ZAbc&#8221;<\/li><\/ul><\/td><\/tr><tr><td>VALUE<\/td><td><p>Den\/de v\u00e6rdier, der skal indtastes i datastr\u00f8mmen\/datastr\u00f8mmene.<br>Dette skal v\u00e6re en dictionary (n\u00f8gle\/v\u00e6rdi-par):<\/p><pre>{\n  &lt;DATASTREAM_TOPIC&gt;:  &lt;VALUE&gt;\n}<\/pre><p>For eksempel:<\/p><pre>{\n \"b325\/electricity-consumption\": 34.5678,\n \"b329\/electricity-consumption\": 234.567\n}\n<\/pre><\/td><\/tr><\/tbody><\/table><p>Tidsstemplet tilf\u00f8jes automatisk og vil v\u00e6re det tidspunkt, du k\u00f8rer dette script.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c0b3628 elementor-widget elementor-widget-text-editor\" data-id=\"c0b3628\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition failure\">\n<p class=\"admonition-title\">Du kan f\u00e5 en fejlmeddelelse af typen <span class=\"code\">ModuleNotFoundError: No module named &#8216;paho&#8217;<\/span>.<\/p>\n<p>For at rette dette skal du indtaste kommandoen: <code style=\"font-size: 16px;\">python -m pip install paho-mqtt<\/code>.<br\/>Dette vil installere det manglende modul.\n<\/p>\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acf7d79 elementor-widget elementor-widget-code-highlight\" data-id=\"acf7d79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"9-12\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import paho.mqtt.client as mqtt\r\nimport time\r\nimport json\r\n\r\n# MQTT Configuration\r\nBROKER = \"mqtts.test.energydata.dk\"\r\nPORT = 8883\r\nKEEPALIVE = 45\r\nTOPIC = \"<MQTT_TOPIC>\"\r\nCLIENT_ID = \"<MY_UNIQUE_MQTT_CLIENT_ID>\"\r\nTOKEN = \"<API_TOKEN>\"\r\nVALUE = <VALUE>\r\n\r\n# Connection tracking flag\r\nconnected = False\r\n\r\n# Callback when connected\r\ndef on_connect(client, userdata, flags, rc):\r\n    global connected\r\n    if rc == 0:\r\n        print(\"Connected to broker.\")\r\n        connected = True\r\n    else:\r\n        print(f\"Connection failed with code {rc}.\")\r\n\r\n# Callback when disconnected\r\ndef on_disconnect(client, userdata, rc):\r\n    global connected\r\n    print(\"Disconnected.\")\r\n    connected = False\r\n\r\n# Create client\r\nclient = mqtt.Client(client_id=CLIENT_ID)\r\nclient.username_pw_set(username=TOKEN)\r\nclient.tls_set()\r\n\r\n# Attach callbacks\r\nclient.on_connect = on_connect\r\nclient.on_disconnect = on_disconnect\r\n\r\n# Connect to the broker\r\nclient.connect(host=BROKER, port=PORT, keepalive=KEEPALIVE)\r\n\r\n# Start background loop\r\nclient.loop_start()\r\n\r\n# Wait for connection\r\nmessage_printed = False\r\nwhile not connected:\r\n    if not message_printed:\r\n        print(\"Waiting for connection...\")\r\n        message_printed = True\r\n    time.sleep(.5)\r\n\r\n# Send messages\r\ntry:\r\n    timestamp = int(time.time() * 1000)\r\n    payload = {\r\n        \"timestamp\": timestamp,\r\n        \"value\": VALUE\r\n    }\r\n\r\n    # Publish the message\r\n    result = client.publish(topic=TOPIC, qos=0, payload=json.dumps(payload))\r\n\r\n    # Check the result\r\n    if result[0] == 0:\r\n        print(f\"Message published successfully.\")\r\n    else:\r\n        print(f\"Failed to publish message, result code: {result[0]}.\")\r\n\r\nexcept KeyboardInterrupt:\r\n    print(\"Stopping publisher...\")\r\nexcept Exception as e:\r\n    print(f\"Exception: {e}\")\r\nfinally:\r\n    client.loop_stop()\r\n    client.disconnect()\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-621de39 elementor-widget elementor-widget-text-editor\" data-id=\"621de39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>N\u00e5r du publicerer til EnergyDataDK ved hj\u00e6lp af <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>, b\u00f8r du bruge Quality of Service (QoS) 1 for at sikre, at meddelelser leveres. Dette er is\u00e6r vigtigt, hvis du publicerer med en h\u00f8j kapacitet, da overbelastningsbeskyttelsesmekanismer kan kassere dine meddelelser.  Hvorfor og hvordan beskrives detaljeret nedenfor.<\/p>\n<p>N\u00e5r EnergydataDK <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-m\u00e6gleren modtager en publiceringsbesked fra din klient, f\u00f8jes beskeden til en k\u00f8 af indg\u00e5ende beskeder. Denne k\u00f8 er pr. klient og kan indeholde op til 1000 beskeder. Beskeder i k\u00f8en fjernes fra k\u00f8en serielt p\u00e5 en <abbr title=\"First-in First-out\">FIFO<\/abbr>-m\u00e5de.   N\u00e5r <abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-brokeren fjernes fra k\u00f8en, kontrollerer den, at klienten er autoriseret til at udgive beskeder om det givne emne.<\/p>\n<p>Hvis autorisationen lykkes, videresendes beskeden til lagring i EnergyDataDK og til alle klienter, der abonnerer p\u00e5 det p\u00e5g\u00e6ldende emne. Hvis beskeden blev publiceret med QoS 1 eller 2, sender MQTT\u2011brokeren kvitteringen, efter at autorisationen er gennemf\u00f8rt. <\/p>\n<p>Hvis godkendelsen mislykkes, afbrydes klientens forbindelse med det samme, og alle beskeder i k\u00f8en for indg\u00e5ende beskeder kasseres.<\/p>\n<p>Hvis MQTT-brokeren ikke kan f\u00f8lge med klienten, vil k\u00f8en for indg\u00e5ende beskeder med tiden blive fuld. N\u00e5r k\u00f8en er fuld, kasserer MQTT-brokeren alle beskeder, den modtager fra klienten. <\/p>\n<p>Det betyder, at din client skal begr\u00e6nse sig selv for at undg\u00e5 at miste beskeder. Du g\u00f8r dette ved at udgive dine beskeder med <abbr title=\"Quality of Service\">QoS<\/abbr> 1. Din klient skal derefter vente p\u00e5 at modtage en bekr\u00e6ftelse fra brokeren, f\u00f8r der udgives flere beskeder.   Dette kan g\u00f8res i Python med paho-mqtt &lt;<a href=\"https:\/\/pypi.python.org\/pypi\/pahomqtt\/\">https:\/\/pypi.python.org\/pypi\/pahomqtt\/<\/a>&gt; bibliotek med funktionen <code>wait_for_publish<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-179b6d3 elementor-widget elementor-widget-heading\" data-id=\"179b6d3\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"subscribe-to-data\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Abonnere p\u00e5 data<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61b0c7b elementor-widget elementor-widget-text-editor\" data-id=\"61b0c7b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Det giver abonnenter mulighed for at modtage realtidsbeskeder med de data, der er offentliggjort p\u00e5 EnergyDataDK. Et eksempel p\u00e5 Python-kode om, hvordan man abonnerer p\u00e5 en specifik datastr\u00f8m for at hente dens livedata, vises nedenfor, hvor ordene i &#8221; igen&#8221; st\u00e5r. &lt;&gt;&#8221; skal udfyldes med dine oplysninger.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab559e9 elementor-widget elementor-widget-code-highlight\" data-id=\"ab559e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"7-8\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import paho.mqtt.client as mqtt\r\nfrom datetime import datetime, timezone\r\n\r\n# MQTT Configuration\r\nbroker_host = 'mqtts.energydata.dk'\r\nbroker_port = 8883\r\nsubscribe_topic = \"<mqtt_prefix\/datastream_topic>\" \r\ntoken = \"<your_token>\" \r\n\r\n# Callback when the client connects to the broker\r\ndef on_connect(client, userdata, flags, rc):\r\n    code_responses = [\r\n        \"\", \r\n        \"unacceptable protocol version\", \r\n        \"identifier rejected\", \r\n        \"Server unavailable\", \r\n        \"bad user name or password\", \r\n        \"not authorized\"\r\n        ]\r\n    if rc == 0:\r\n        print(f\"Connection Accepted: Connected to {broker_host} successfully!\")\r\n        client.subscribe(subscribe_topic, qos=1)\r\n        print(f\"Subscribed to topic: {subscribe_topic}\")\r\n    else:\r\n        print(f\"Connection refused: {code_responses[rc]}\")\r\n\r\n# Callback when a message is received\r\ndef on_message(client, userdata, msg):\r\n    payload = msg.payload.decode()\r\n    print(f\"[{datetime.now(timezone.utc)}] Received `{payload}` from `{msg.topic}`\")\r\n\r\n# Create and configure the MQTT client\r\nclient = mqtt.Client()\r\nclient.username_pw_set(token)\r\nclient.tls_set()\r\nclient.on_connect = on_connect\r\nclient.on_message = on_message\r\n\r\n# Connect and keep alive\r\nclient.connect(broker_host, broker_port)\r\nclient.loop_forever()<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37cc06b elementor-widget elementor-widget-text-editor\" data-id=\"37cc06b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"admonition failure\"><p class=\"admonition-title\">Du kan f\u00e5 en fejlmeddelelse af typen <span class=\"code\">ModuleNotFoundError: No module named &#8216;paho&#8217;<\/span>.<\/p><p>For at rette dette skal du indtaste kommandoen: <code>python -m pip install paho-mqtt<\/code>.<br\/>Dette vil installere det manglende modul.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f44e2af elementor-widget elementor-widget-text-editor\" data-id=\"f44e2af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<abbr title=\"Message Queuing Telemetry Transport\">MQTT<\/abbr>-pr\u00e6fikset er det, der svarer til datas\u00e6ttet, hvorfor datastream-emnet er for den specifikke datastr\u00f8m.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-15683dd elementor-widget__width-auto elementor-fixed toc-toggle elementor-hidden-desktop elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"15683dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;fixed&quot;}\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"icon icon-list-light\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-b3e9402 elementor-section-full_width elementor-section-height-min-height elementor-section-height-default\" data-id=\"b3e9402\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-35dec91\" data-id=\"35dec91\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1bcf555 elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"1bcf555\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"topic-and-datastream-id-retrieval\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Emne og Datastr\u00f8m ID hentning<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8725ae2 elementor-widget elementor-widget-text-editor\" data-id=\"8725ae2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Der findes tilf\u00e6lde hvor du har brug for at skrive ind i datas\u00e6ttet eller l\u00e6se datastr\u00f8mme ved brug af <abbr title=\"Application Programming Interface\">API<\/abbr> uden at du kender emnerne eller ID&#8217;er. Der findes et par metoder for at hente disse v\u00e6rdier. <\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-502d81c elementor-widget elementor-widget-heading\" data-id=\"502d81c\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"dataset-page\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Datas\u00e6t side<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6dcb3e6 elementor-widget elementor-widget-text-editor\" data-id=\"6dcb3e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Hvis du er ejer af datas\u00e6ttet, kan emne- og datastr\u00f8ms-ID&#8217;et ses p\u00e5 informationssiden for den respektive datastr\u00f8m<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/Datastream_information-1.png\">(fig. 4b)<\/a>. Du kan f\u00e5 adgang til denne side ved at v\u00e6lge den \u00f8nskede datastr\u00f8m i oversigten over dit datas\u00e6t (<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information-1.png\">fig. 4a).<\/a> <\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-eeff409 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"eeff409\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-086073d\" data-id=\"086073d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-800923e elementor-widget elementor-widget-image\" data-id=\"800923e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information-1.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Datastream_information\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTk5NCwidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAzXC9EYXRhc3RyZWFtX2luZm9ybWF0aW9uLTEucG5nIn0%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"203\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information-1.png\" class=\"attachment-full size-full wp-image-5994\" alt=\"&quot;The Datastreams interface table. The highlighted eye icon next to &apos;Datastream_name&apos; represents the visibility or &apos;view details&apos; toggle for this specific stream. The row also includes a numerical value of 9 and a field for comments, with vertical dots on the far left indicating an options menu.&quot;\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information-1.png 653w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information-1-300x93.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 4a. Datastr\u00f8m information access point <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-66e2d29\" data-id=\"66e2d29\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-57a2e6a elementor-widget elementor-widget-image\" data-id=\"57a2e6a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information_page.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Datastream_information_page\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTk5NywidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAzXC9EYXRhc3RyZWFtX2luZm9ybWF0aW9uX3BhZ2UucG5nIn0%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"603\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information_page.png\" class=\"attachment-full size-full wp-image-5997\" alt=\"&quot;The Datastream details page showing the full configuration for ID 5540878. The interface highlights the unique stream ID and the associated MQTT or system Topic for identification. The Properties table provides a comprehensive breakdown of the stream&apos;s context, including its location in Kgs. Lyngby, its CC 4.0 data license, and its classification under the DTU organization.&quot;\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information_page.png 655w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/03\/Datastream_information_page-300x276.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 4b. Datastr\u00f8m oplysninger  <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-9d0898a elementor-widget elementor-widget-heading\" data-id=\"9d0898a\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"metadata-download\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Metadata download<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e7facf elementor-widget elementor-widget-text-editor\" data-id=\"0e7facf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En anden mulighed er at downloade de komplette metadata for det valgte datas\u00e6t ved at klikke p\u00e5 download-ikonet i \u00f8verste h\u00f8jre hj\u00f8rne af Datastream-siden<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download.png\">(fig. 5).<\/a> Denne download indeholder metadata for alle datastr\u00f8mme, samt deres respektive navne og ID&#8217;er. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-414868f elementor-widget elementor-widget-image\" data-id=\"414868f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"metadata_download\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6NTMzNiwidXJsIjoiaHR0cHM6XC9cL2VuZXJneWRhdGEuZGtcL3dwLWNvbnRlbnRcL3VwbG9hZHNcLzIwMjZcLzAxXC9tZXRhZGF0YV9kb3dubG9hZC5wbmcifQ%3D%3D\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1233\" height=\"385\" src=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download.png\" class=\"attachment-full size-full wp-image-5336\" alt=\"The &apos;Datastreams&apos; dashboard view. At the top, there are three tabs: &apos;SEARCH (15)&apos;, &apos;STAGED (0)&apos;, and &apos;EXPORT&apos;. A blue box highlights a vertical three-dot (kebab) menu icon in the top right corner. Below the tabs is a data table with filterable columns for Datastream, Theme tag, Geo tag, Unit, and Data license. Each column header has a text input field for filtering.\" srcset=\"https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download.png 1233w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download-300x94.png 300w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download-1024x320.png 1024w, https:\/\/energydata.dk\/wp-content\/uploads\/2026\/01\/metadata_download-768x240.png 768w\" sizes=\"auto, (max-width: 1233px) 100vw, 1233px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Figur 5. Metadata download vindue <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ea06483 elementor-widget elementor-widget-heading\" data-id=\"ea06483\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"csv-datastream-download\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">CSV Datastr\u00f8m Download <\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e50bf65 elementor-widget elementor-widget-text-editor\" data-id=\"e50bf65\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Den sidste mulighed er at downloade udvalgte datastr\u00f8mme via <abbr title=\"Comma-separated Values\">CSV<\/abbr>-eksport. Overskrifterne af det resulterende fil vil indeholde de relevante datastr\u00f8m ID&#8217;er og emner. <\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d94ad42 elementor-widget elementor-widget-html\" data-id=\"d94ad42\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\nwindow.addEventListener('scroll', function() {\r\n    const toc = document.querySelector(\".Tableofcontents\");\r\n    if (!toc) return;\r\n\r\n    const links = toc.querySelectorAll('a[href^=\"#\"]');\r\n    const activationLine = 130; \r\n    let currentId = \"\";\r\n\r\n    if (window.scrollY > 200) {\r\n        links.forEach(link => {\r\n            const id = link.getAttribute(\"href\").slice(1);\r\n            const element = document.getElementById(id);\r\n            \r\n            if (element) {\r\n                const rect = element.getBoundingClientRect();\r\n                \r\n                \/* THE FIX: \r\n                   Instead of checking if the heading (rect.bottom) is > 0,\r\n                   we check if the NEXT section hasn't hit the activation line yet.\r\n                   This keeps the current link blue until the NEXT one starts.\r\n                *\/\r\n                if (rect.top <= activationLine) {\r\n                    currentId = id;\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    links.forEach(link => {\r\n        const id = link.getAttribute(\"href\").slice(1);\r\n        if (currentId !== \"\" && id === currentId) {\r\n            link.setAttribute('data-active', 'true');\r\n        } else {\r\n            link.setAttribute('data-active', 'false');\r\n            link.classList.remove('elementor-item-active');\r\n            link.closest('.elementor-toc__list-item')?.classList.remove('active');\r\n        }\r\n    });\r\n}, { passive: true });\r\n<\/script>\r\n\r\n<script>\r\n    \/\/mobile devices\r\nwindow.addEventListener('scroll', function() {\r\n    const toc = document.querySelector(\".Tableofcontents-copy\");\r\n    if (!toc) return;\r\n\r\n    const links = toc.querySelectorAll('a[href^=\"#\"]');\r\n    \r\n    \/\/ THE FIX: Use 20% of the screen height instead of a fixed 150px\r\n    const activationLine = window.innerHeight * 0.2; \r\n    let currentId = \"\";\r\n\r\n    if (window.scrollY > 100) {\r\n        links.forEach(link => {\r\n            const id = link.getAttribute(\"href\").slice(1);\r\n            const element = document.getElementById(id);\r\n            if (element) {\r\n                const rect = element.getBoundingClientRect();\r\n                \r\n                \/\/ On mobile, headers often move fast. \r\n                \/\/ This checks if the header has entered the top 20% of the screen.\r\n                if (rect.top <= activationLine) {\r\n                    currentId = id;\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    links.forEach(link => {\r\n        const id = link.getAttribute(\"href\").slice(1);\r\n        if (currentId !== \"\" && id === currentId) {\r\n            link.setAttribute('data-active', 'true');\r\n        } else {\r\n            link.setAttribute('data-active', 'false');\r\n            link.classList.remove('elementor-item-active');\r\n            link.closest('.elementor-toc__list-item')?.classList.remove('active');\r\n        }\r\n    });\r\n}, { passive: true });\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n<style>\r\n\/* 1. GLOBAL COLORS: Force neutral state for everyone *\/\r\n.Tableofcontents a, \r\n.Tableofcontents-copy a {\r\n    color: #333333 !important; \r\n    font-weight: 600 !important;\r\n    text-decoration: none !important;\r\n}\r\n\r\n\/* 2. ACTIVE COLORS: Only blue when data-active is true *\/\r\nbody .Tableofcontents a[data-active=\"true\"],\r\nbody .Tableofcontents-copy a[data-active=\"true\"] {\r\n    color: #2F3EEA !important;\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n  \/* THE MODAL *\/\r\n  .Tableofcontents-copy {\r\n    display: none !important;\r\n    position: fixed !important;\r\n    top: 5% !important; \r\n    bottom: 5% !important;\r\n    left: 5% !important;\r\n    right: 5% !important;\r\n    transform: none !important; \r\n    width: auto !important;\r\n    max-width: 420px !important;\r\n    margin: 0 auto !important;\r\n    max-height: 90vh !important;\r\n    overflow-y: auto !important;\r\n    -webkit-overflow-scrolling: touch;\r\n    background: #f1f1f1 !important;\r\n    border-radius: 12px !important;\r\n    padding: 20px !important;\r\n    box-shadow: 0 12px 32px rgba(0,0,0,0.25) !important;\r\n    z-index: 9999 !important;\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transition: opacity 220ms ease;\r\n  }\r\n\r\n  .Tableofcontents-copy.show {\r\n    display: block !important;\r\n    opacity: 1 !important;\r\n    pointer-events: auto !important;\r\n  }\r\n\r\n  \/* THE TOGGLE BUTTON: Fixed units (px) prevent drifting *\/\r\n  .toc-toggle {\r\n    position: fixed !important;\r\n    z-index: 10000;\r\n    background: #f1f1f1;\r\n    padding: 7px 7px 0 7px;\r\n    box-shadow: 0 2px 4px rgba(0,0,0,0.2);\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n\r\n  .toc-overlay.show {\r\n    display: block;\r\n    position: fixed;\r\n    inset: 0;\r\n    background: rgba(0,0,0,0.45);\r\n    z-index: 9998;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n  const toggle = document.querySelector('.toc-toggle');\r\n  const toc = document.querySelector('.Tableofcontents-copy');\r\n  if (!toggle || !toc) return;\r\n\r\n  let overlay = document.querySelector('.toc-overlay');\r\n  if (!overlay) {\r\n    overlay = document.createElement('div');\r\n    overlay.className = 'toc-overlay';\r\n    document.body.appendChild(overlay);\r\n  }\r\n\r\n  const openModal = () => {\r\n    toc.classList.add('show');\r\n    overlay.classList.add('show');\r\n    document.body.classList.add('toc-open');\r\n  };\r\n  const closeModal = () => {\r\n    toc.classList.remove('show');\r\n    overlay.classList.remove('show');\r\n    document.body.classList.remove('toc-open');\r\n  };\r\n\r\n  toggle.addEventListener('click', (e) => {\r\n    e.preventDefault();\r\n    toc.classList.contains('show') ? closeModal() : openModal();\r\n  });\r\n  overlay.addEventListener('click', closeModal);\r\n  document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeModal(); });\r\n});\r\n<\/script>\r\n<style>\r\n\r\nhtml {\r\n    scroll-behavior: smooth !important;\r\n}\r\n\r\n\r\n  \/* This ensures the target section has some breathing room when you jump to it *\/\r\n:target::before {\r\n    content: \"\";\r\n    display: block;\r\n    height: 140px; \/* Match your activation line *\/\r\n    margin: -140px 0 0;\r\n}  \r\n    \r\n<\/style>\r\n\r\n\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c85f171 elementor-widget__width-inherit Tableofcontents-copy elementor-hidden-desktop elementor-widget elementor-widget-table-of-contents\" data-id=\"c85f171\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;],&quot;exclude_headings_by_selector&quot;:[],&quot;marker_view&quot;:&quot;bullets&quot;,&quot;icon&quot;:{&quot;value&quot;:&quot;icon icon-caret-double-right-light&quot;,&quot;library&quot;:&quot;icomoon-1&quot;},&quot;no_headings_message&quot;:&quot;No headings were found on this page.&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_effect&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_direction&quot;:&quot;negative&quot;,&quot;motion_fx_translateY_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;sticky&quot;:&quot;top&quot;,&quot;sticky_offset&quot;:80,&quot;sticky_parent&quot;:&quot;yes&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;motion_fx_translateY_affectedRange&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:0,&quot;end&quot;:100}},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;],&quot;sticky_effects_offset&quot;:0,&quot;sticky_anchor_link_offset&quot;:0}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h4 class=\"elementor-toc__header-title\">\n\t\t\t\tIndholdsfortegnelse\t\t\t<\/h4>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__c85f171\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-37aaf8e elementor-widget__width-auto elementor-fixed elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"37aaf8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_position&quot;:&quot;fixed&quot;,&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_opacity_effect&quot;:&quot;yes&quot;,&quot;motion_fx_opacity_range&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:5,&quot;end&quot;:20}},&quot;motion_fx_opacity_direction&quot;:&quot;out-in&quot;,&quot;motion_fx_opacity_level&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<a class=\"elementor-icon\" href=\"#apidocumentation\">\n\t\t\t<i aria-hidden=\"true\" class=\"fas fa-chevron-up\"><\/i>\t\t\t<\/a>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Indholdsfortegnelse API Dokumentation Introduktion Dette dokument giver en kort introduktion til API&#8216;erne som EnergyDataDK stiller til r\u00e5dighed. Hvis du er ny p\u00e5 platformen anbefaler vi at du starter med at l\u00e6se vores platform vejledning og data ejer vejledning for at f\u00e5 et general overblik over EnergyDataDK dets funktioner. Data kan b\u00e5de blive importeret og eksporteret [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":0,"parent":5506,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6246","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/pages\/6246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/comments?post=6246"}],"version-history":[{"count":6,"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/pages\/6246\/revisions"}],"predecessor-version":[{"id":9612,"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/pages\/6246\/revisions\/9612"}],"up":[{"embeddable":true,"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/pages\/5506"}],"wp:attachment":[{"href":"https:\/\/energydata.dk\/da\/wp-json\/wp\/v2\/media?parent=6246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}