{"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-10-31T09:48:27","modified_gmt":"2026-10-31T08:48:27","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 class=\"wp-block-paragraph\">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. Skriptet fungerar p\u00e5 alla Shelly Pro- och Plus-enheter som har st\u00f6d f\u00f6r skript 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 st\u00f6d f\u00f6r skript), eller en annan Shelly-enhet med skriptst\u00f6d.<\/li>\n\n\n\n<li><strong>Temperatursensor<\/strong>: DS18B20 (h\u00e5rdvaran klarar upp till 5 st; skriptet hanterar en eller tv\u00e5 och anv\u00e4nder den kallaste).<\/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 anm\u00e4l en ny m\u00e4tpunkt. V\u00e4lj &#8221;Hashkod&#8221; som rapporteringss\u00e4tt.<\/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 class=\"wp-block-paragraph\"><\/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>: sl\u00e5 p\u00e5&nbsp;<strong>&#8221;Run on startup&#8221;<\/strong>&nbsp;s\u00e5 att skriptet 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 class=\"wp-block-paragraph\">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. Ser du inte konsolen, g\u00e5 direkt till enhetens IP-adress i webbl\u00e4saren och klicka p\u00e5 skriptet.<\/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. Skriptet fungerar p\u00e5 alla Shelly Pro- och Plus-enheter som har st\u00f6d f\u00f6r skript och temperatursensorer. Vad du beh\u00f6ver F\u00f6rberedelser Installation av scriptet Aktivering Verifiering [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7440,"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"],"_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":6,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts\/7027\/revisions"}],"predecessor-version":[{"id":7402,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/posts\/7027\/revisions\/7402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.temperatur.nu\/info\/wp-json\/wp\/v2\/media\/7440"}],"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}]}}