{"id":7027,"date":"2026-02-17T19:49:59","date_gmt":"2026-02-17T18:49:59","guid":{"rendered":"https:\/\/www.temperatur.nu\/info\/?p=7027"},"modified":"2026-02-18T19:40:54","modified_gmt":"2026-02-18T18:40:54","slug":"rapportera-fran-shelly","status":"publish","type":"post","link":"https:\/\/www.temperatur.nu\/info\/rapportera-fran-shelly\/","title":{"rendered":"Rapportera fr\u00e5n Shelly"},"content":{"rendered":"\n<p>Shelly Plus Uni (Gen2) \u00e4r en liten och kraftfull enhet med inbyggt st\u00f6d f\u00f6r scripting, vilket g\u00f6r det enkelt att rapportera temperaturer direkt till temperatur.nu utan att beh\u00f6va en separat styrenhet. Detta script kan k\u00f6ras p\u00e5 samtliga Shelly Pro\/Plus med st\u00f6d f\u00f6r script och temperatursensorer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-content-vad-du-beh\u00f6ver\">Vad du beh\u00f6ver<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Shelly Plus Uni<\/strong>&nbsp;(Gen2 med scriptingsst\u00f6d) (Eller annan Shelly-enhet med st\u00f6d f\u00f6r script.<\/li>\n\n\n\n<li><strong>Temperatursensor<\/strong>: DS18B20 (upp till 5 st st\u00f6ds av h\u00e5rdvaran, scriptet st\u00f6der 1-2 st med automatiskt val av kallaste temperatur).<\/li>\n\n\n\n<li><strong>Hashkod<\/strong>: Din unika kod fr\u00e5n temperatur.nu. <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-content-f\u00f6rberedelser\">F\u00f6rberedelser<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>G\u00e5 till&nbsp;<a href=\"https:\/\/www.temperatur.nu\/nystation\/\">temperatur.nu\/nystation<\/a>&nbsp;och skapa en ny station. V\u00e4lj &#8221;Rapporteringsurl&#8221; som metod.<\/li>\n\n\n\n<li>Kopiera din&nbsp;<strong>Hashkod<\/strong>.<\/li>\n\n\n\n<li>Anslut din sensor till din Shelly Plus Uni och aktivera den under\u00a0<strong>Settings<\/strong>\u00a0->\u00a0<strong>Components<\/strong>. Notera sensorns ID (standard \u00e4r ofta 100 f\u00f6r sensor 1 och 101 f\u00f6r sensor 2).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-content-installation-av-scriptet\">Installation av scriptet<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Logga in p\u00e5 din Shellys webbgr\u00e4nssnitt.<\/li>\n\n\n\n<li>G\u00e5 till fliken&nbsp;<strong>Scripts<\/strong>&nbsp;och klicka p\u00e5&nbsp;<strong>Add Script<\/strong>.<\/li>\n\n\n\n<li>Ge scriptet ett namn, till exempel &#8221;Temperatur.nu Reporter&#8221;.<\/li>\n\n\n\n<li>Kopiera och klistra in koden nedan:<\/li>\n<\/ol>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>Visa och kopiera koden<\/strong><\/summary><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ ==================================================\n\/\/ Temperatur.nu Reporter f\u00f6r Shelly Plus Uni\n\/\/ ==================================================\n\/\/ Detta script l\u00e4ser temperatur fr\u00e5n en eller tv\u00e5 sensorer\n\/\/ och rapporterar till temperatur.nu via deras API.\n\/\/ ==================================================\n\n\/\/ ============ KONFIGURATION ============\n\/\/ VIKTIGT: \u00c4ndra dessa v\u00e4rden f\u00f6r din installation\n\n\/\/ Din unika hash fr\u00e5n temperatur.nu (f\u00e5r du vid registrering)\nlet API_HASH = &quot;DIN_HASH_H\u00c4R&quot;;\n\n\/\/ Sensor ID f\u00f6r f\u00f6rsta sensorn (100 = f\u00f6rsta DS18B20, 101 = andra, osv.)\nlet SENSOR_ID_1 = 100;\n\n\/\/ Sensor ID f\u00f6r andra sensorn (valfritt - l\u00e4mna null om du bara har en sensor)\n\/\/ Om tv\u00e5 sensorer anv\u00e4nds rapporteras den KALLASTE temperaturen\nlet SENSOR_ID_2 = null; \/\/ Exempel: 101 f\u00f6r andra DS18B20\n\n\/\/ Rapporteringsintervall i MINUTER (standard 3 minuter)\nlet REPORT_INTERVAL_MINUTES = 3;\n\n\/\/ ============ SCRIPT START ============\n\/\/ (\u00c4ndra ingenting under denna rad)\n\nlet REPORT_INTERVAL_MS = REPORT_INTERVAL_MINUTES * 60 * 1000;\n\n\/\/ Funktion f\u00f6r att l\u00e4sa temperatur fr\u00e5n en sensor\nfunction readTemperature(sensorId, callback) {\n Shelly.call(&quot;Temperature.GetStatus&quot;, { id: sensorId }, function (result, error_code, error_message) {\n if (error_code !== 0) {\n console.log(&quot;Fel vid l\u00e4sning av sensor&quot;, sensorId + &quot;:&quot;, error_message);\n callback(null);\n return;\n }\n\n if (!result || typeof result.tC === &#039;undefined&#039;) {\n console.log(&quot;Ingen temperaturdata fr\u00e5n sensor&quot;, sensorId);\n callback(null);\n return;\n }\n\n callback(result.tC);\n });\n}\n\n\/\/ Funktion f\u00f6r att l\u00e4sa fr\u00e5n en eller tv\u00e5 sensorer och returnera kallaste\nfunction readTemperatures(callback) {\n let temp1 = null;\n let temp2 = null;\n let sensor1Done = false;\n let sensor2Done = false;\n\n \/\/ Funktion som kallas n\u00e4r b\u00e5da sensorerna \u00e4r klara\n function checkIfDone() {\n \/\/ Om vi bara har en sensor\n if (SENSOR_ID_2 === null) {\n if (sensor1Done) {\n if (temp1 !== null) {\n console.log(&quot;Temperatur fr\u00e5n sensor&quot;, SENSOR_ID_1 + &quot;:&quot;, temp1, &quot;\u00b0C&quot;);\n }\n callback(temp1);\n }\n return;\n }\n\n \/\/ Om vi har tv\u00e5 sensorer, v\u00e4nta tills b\u00e5da \u00e4r klara\n if (!sensor1Done || !sensor2Done) {\n return;\n }\n\n console.log(&quot;Sensor&quot;, SENSOR_ID_1 + &quot;:&quot;, temp1 !== null ? temp1 + &quot; \u00b0C&quot; : &quot;ej tillg\u00e4nglig&quot;);\n console.log(&quot;Sensor&quot;, SENSOR_ID_2 + &quot;:&quot;, temp2 !== null ? temp2 + &quot; \u00b0C&quot; : &quot;ej tillg\u00e4nglig&quot;);\n\n \/\/ V\u00e4lj kallaste temperaturen\n let coldest = null;\n if (temp1 !== null &amp;&amp; temp2 !== null) {\n coldest = Math.min(temp1, temp2);\n console.log(&quot;Anv\u00e4nder kallaste temperaturen:&quot;, coldest, &quot;\u00b0C&quot;);\n } else if (temp1 !== null) {\n coldest = temp1;\n console.log(&quot;Anv\u00e4nder temperatur fr\u00e5n sensor&quot;, SENSOR_ID_1, &quot;(sensor&quot;, SENSOR_ID_2, &quot;ej tillg\u00e4nglig)&quot;);\n } else if (temp2 !== null) {\n coldest = temp2;\n console.log(&quot;Anv\u00e4nder temperatur fr\u00e5n sensor&quot;, SENSOR_ID_2, &quot;(sensor&quot;, SENSOR_ID_1, &quot;ej tillg\u00e4nglig)&quot;);\n }\n\n callback(coldest);\n }\n\n \/\/ L\u00e4s fr\u00e5n f\u00f6rsta sensorn\n Shelly.call(&quot;Temperature.GetStatus&quot;, { id: SENSOR_ID_1 }, function (result, error_code, error_message) {\n if (error_code === 0 &amp;&amp; result &amp;&amp; typeof result.tC !== &#039;undefined&#039;) {\n temp1 = result.tC;\n } else if (error_code !== 0) {\n console.log(&quot;Fel vid l\u00e4sning av sensor&quot;, SENSOR_ID_1 + &quot;:&quot;, error_message);\n }\n sensor1Done = true;\n checkIfDone();\n });\n\n \/\/ Om det finns en andra sensor, l\u00e4s fr\u00e5n den ocks\u00e5 (parallellt!)\n if (SENSOR_ID_2 !== null) {\n Shelly.call(&quot;Temperature.GetStatus&quot;, { id: SENSOR_ID_2 }, function (result, error_code, error_message) {\n if (error_code === 0 &amp;&amp; result &amp;&amp; typeof result.tC !== &#039;undefined&#039;) {\n temp2 = result.tC;\n } else if (error_code !== 0) {\n console.log(&quot;Fel vid l\u00e4sning av sensor&quot;, SENSOR_ID_2 + &quot;:&quot;, error_message);\n }\n sensor2Done = true;\n checkIfDone();\n });\n }\n}\n\n\/\/ Funktion f\u00f6r att rapportera temperatur till temperatur.nu\nfunction reportTemperature(temperature) {\n if (temperature === null) {\n console.log(&quot;Kan inte rapportera - ingen giltig temperatur&quot;);\n return;\n }\n\n \/\/ Bygg URL med parametrar\n let url = &quot;https:\/\/www.temperatur.nu\/rapportera.php?hash=&quot; + API_HASH + &quot;&amp;t=&quot; + temperature;\n\n console.log(&quot;Rapporterar temperatur:&quot;, temperature, &quot;\u00b0C&quot;);\n console.log(&quot;Anrop:&quot;, url);\n\n \/\/ Skicka HTTP GET request\n Shelly.call(&quot;HTTP.GET&quot;, { url: url }, function (result, error_code, error_message) {\n if (error_code !== 0) {\n console.log(&quot;Fel vid rapportering till temperatur.nu:&quot;, error_message);\n return;\n }\n\n console.log(&quot;Rapportering till temperatur.nu lyckades&quot;);\n if (result &amp;&amp; result.body) {\n console.log(&quot;Svar fr\u00e5n server:&quot;, result.body);\n }\n });\n}\n\n\/\/ Huvudfunktion som k\u00f6rs periodiskt\nfunction checkAndReport() {\n console.log(&quot;--- Temperatur.nu Reporter ---&quot;);\n console.log(&quot;Tid:&quot;, new Date().toISOString());\n\n \/\/ Validera konfiguration\n if (API_HASH === &quot;DIN_HASH_H\u00c4R&quot; || API_HASH === &quot;&quot;) {\n console.log(&quot;VARNING: API_HASH \u00e4r inte konfigurerad! Uppdatera scriptet med din hash fr\u00e5n temperatur.nu&quot;);\n return;\n }\n\n \/\/ L\u00e4s temperatur(er) och rapportera\n readTemperatures(function (temp) {\n if (temp !== null) {\n reportTemperature(temp);\n } else {\n console.log(&quot;Kunde inte l\u00e4sa temperatur fr\u00e5n n\u00e5gon sensor&quot;);\n }\n });\n}\n\n\/\/ K\u00f6r en g\u00e5ng direkt vid start\ncheckAndReport();\n\n\/\/ S\u00e4tt upp timer f\u00f6r periodisk rapportering\nTimer.set(REPORT_INTERVAL_MS, true, checkAndReport);\n\nconsole.log(&quot;Temperatur.nu Reporter startad!&quot;);\nconsole.log(&quot;Sensor 1 ID:&quot;, SENSOR_ID_1);\nif (SENSOR_ID_2 !== null) {\n console.log(&quot;Sensor 2 ID:&quot;, SENSOR_ID_2, &quot;(anv\u00e4nder kallaste)&quot;);\n}\nconsole.log(&quot;Rapporteringsintervall:&quot;, REPORT_INTERVAL_MINUTES, &quot;minuter&quot;);\n<\/pre><\/div>\n\n\n<p><\/p>\n<\/details>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-content-aktivering\">Aktivering<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u00c4ndra&nbsp;<code>API_HASH<\/code>&nbsp;till din egen kod \u00f6verst i scriptet.<\/li>\n\n\n\n<li>Klicka p\u00e5&nbsp;<strong>Save<\/strong>&nbsp;och d\u00e4refter&nbsp;<strong>Start<\/strong>.<\/li>\n\n\n\n<li><strong>Viktigt<\/strong>: Aktivera fliken&nbsp;<strong>&#8221;Run on startup&#8221;<\/strong>&nbsp;s\u00e5 att scriptet startar automatiskt om str\u00f6mmen g\u00e5r eller enheten startas om.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"user-content-verifiering\">Verifiering<\/h2>\n\n\n\n<p>Klicka p\u00e5&nbsp;<strong>Console<\/strong>&nbsp;l\u00e4ngst ner i script-editorn. D\u00e4r ska du se en rad som b\u00f6rjar med&nbsp;<code>Anrop: https:\/\/...<\/code>&nbsp;vilket bekr\u00e4ftar att scriptet skickar data korrekt. Om du inte ser consolen &#8211; g\u00e5 direkt till enheten ip-nummer och klicka p\u00e5 scriptet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shelly Plus Uni (Gen2) \u00e4r en liten och kraftfull enhet med inbyggt st\u00f6d f\u00f6r scripting, vilket g\u00f6r det enkelt att rapportera temperaturer direkt till temperatur.nu utan att beh\u00f6va en separat styrenhet. Detta script kan k\u00f6ras p\u00e5 samtliga Shelly Pro\/Plus med st\u00f6d f\u00f6r script och temperatursensorer. Vad du beh\u00f6ver F\u00f6rberedelser Installation av scriptet Aktivering Verifiering Klicka [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7041,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7027","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-okategoriserade"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts\/7027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/comments?post=7027"}],"version-history":[{"count":5,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts\/7027\/revisions"}],"predecessor-version":[{"id":7042,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts\/7027\/revisions\/7042"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/media\/7041"}],"wp:attachment":[{"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/media?parent=7027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/categories?post=7027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/tags?post=7027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}