Shelly Plus Uni (Gen2) är en liten och kraftfull enhet med inbyggt stöd för scripting, vilket gör det enkelt att rapportera temperaturer direkt till temperatur.nu utan att behöva en separat styrenhet. Detta script kan köras på samtliga Shelly Pro/Plus med stöd för script och temperatursensorer.
Vad du behöver
- Shelly Plus Uni (Gen2 med scriptingsstöd) (Eller annan Shelly-enhet med stöd för script.
- Temperatursensor: DS18B20 (upp till 5 st stöds av hårdvaran, scriptet stöder 1-2 st med automatiskt val av kallaste temperatur).
- Hashkod: Din unika kod från temperatur.nu.
Förberedelser
- Gå till temperatur.nu/nystation och skapa en ny station. Välj ”Rapporteringsurl” som metod.
- Kopiera din Hashkod.
- Anslut din sensor till din Shelly Plus Uni och aktivera den under Settings -> Components. Notera sensorns ID (standard är ofta 100 för sensor 1 och 101 för sensor 2).
Installation av scriptet
- Logga in på din Shellys webbgränssnitt.
- Gå till fliken Scripts och klicka på Add Script.
- Ge scriptet ett namn, till exempel ”Temperatur.nu Reporter”.
- Kopiera och klistra in koden nedan:
Visa och kopiera koden
// ==================================================
// Temperatur.nu Reporter för Shelly Plus Uni
// ==================================================
// Detta script läser temperatur från en eller två sensorer
// och rapporterar till temperatur.nu via deras API.
// ==================================================
// ============ KONFIGURATION ============
// VIKTIGT: Ändra dessa värden för din installation
// Din unika hash från temperatur.nu (får du vid registrering)
let API_HASH = "DIN_HASH_HÄR";
// Sensor ID för första sensorn (100 = första DS18B20, 101 = andra, osv.)
let SENSOR_ID_1 = 100;
// Sensor ID för andra sensorn (valfritt - lämna null om du bara har en sensor)
// Om två sensorer används rapporteras den KALLASTE temperaturen
let SENSOR_ID_2 = null; // Exempel: 101 för andra DS18B20
// Rapporteringsintervall i MINUTER (standard 3 minuter)
let REPORT_INTERVAL_MINUTES = 3;
// ============ SCRIPT START ============
// (Ändra ingenting under denna rad)
let REPORT_INTERVAL_MS = REPORT_INTERVAL_MINUTES * 60 * 1000;
// Funktion för att läsa temperatur från en sensor
function readTemperature(sensorId, callback) {
Shelly.call("Temperature.GetStatus", { id: sensorId }, function (result, error_code, error_message) {
if (error_code !== 0) {
console.log("Fel vid läsning av sensor", sensorId + ":", error_message);
callback(null);
return;
}
if (!result || typeof result.tC === 'undefined') {
console.log("Ingen temperaturdata från sensor", sensorId);
callback(null);
return;
}
callback(result.tC);
});
}
// Funktion för att läsa från en eller två sensorer och returnera kallaste
function readTemperatures(callback) {
let temp1 = null;
let temp2 = null;
let sensor1Done = false;
let sensor2Done = false;
// Funktion som kallas när båda sensorerna är klara
function checkIfDone() {
// Om vi bara har en sensor
if (SENSOR_ID_2 === null) {
if (sensor1Done) {
if (temp1 !== null) {
console.log("Temperatur från sensor", SENSOR_ID_1 + ":", temp1, "°C");
}
callback(temp1);
}
return;
}
// Om vi har två sensorer, vänta tills båda är klara
if (!sensor1Done || !sensor2Done) {
return;
}
console.log("Sensor", SENSOR_ID_1 + ":", temp1 !== null ? temp1 + " °C" : "ej tillgänglig");
console.log("Sensor", SENSOR_ID_2 + ":", temp2 !== null ? temp2 + " °C" : "ej tillgänglig");
// Välj kallaste temperaturen
let coldest = null;
if (temp1 !== null && temp2 !== null) {
coldest = Math.min(temp1, temp2);
console.log("Använder kallaste temperaturen:", coldest, "°C");
} else if (temp1 !== null) {
coldest = temp1;
console.log("Använder temperatur från sensor", SENSOR_ID_1, "(sensor", SENSOR_ID_2, "ej tillgänglig)");
} else if (temp2 !== null) {
coldest = temp2;
console.log("Använder temperatur från sensor", SENSOR_ID_2, "(sensor", SENSOR_ID_1, "ej tillgänglig)");
}
callback(coldest);
}
// Läs från första sensorn
Shelly.call("Temperature.GetStatus", { id: SENSOR_ID_1 }, function (result, error_code, error_message) {
if (error_code === 0 && result && typeof result.tC !== 'undefined') {
temp1 = result.tC;
} else if (error_code !== 0) {
console.log("Fel vid läsning av sensor", SENSOR_ID_1 + ":", error_message);
}
sensor1Done = true;
checkIfDone();
});
// Om det finns en andra sensor, läs från den också (parallellt!)
if (SENSOR_ID_2 !== null) {
Shelly.call("Temperature.GetStatus", { id: SENSOR_ID_2 }, function (result, error_code, error_message) {
if (error_code === 0 && result && typeof result.tC !== 'undefined') {
temp2 = result.tC;
} else if (error_code !== 0) {
console.log("Fel vid läsning av sensor", SENSOR_ID_2 + ":", error_message);
}
sensor2Done = true;
checkIfDone();
});
}
}
// Funktion för att rapportera temperatur till temperatur.nu
function reportTemperature(temperature) {
if (temperature === null) {
console.log("Kan inte rapportera - ingen giltig temperatur");
return;
}
// Bygg URL med parametrar
let url = "https://www.temperatur.nu/rapportera.php?hash=" + API_HASH + "&t=" + temperature;
console.log("Rapporterar temperatur:", temperature, "°C");
console.log("Anrop:", url);
// Skicka HTTP GET request
Shelly.call("HTTP.GET", { url: url }, function (result, error_code, error_message) {
if (error_code !== 0) {
console.log("Fel vid rapportering till temperatur.nu:", error_message);
return;
}
console.log("Rapportering till temperatur.nu lyckades");
if (result && result.body) {
console.log("Svar från server:", result.body);
}
});
}
// Huvudfunktion som körs periodiskt
function checkAndReport() {
console.log("--- Temperatur.nu Reporter ---");
console.log("Tid:", new Date().toISOString());
// Validera konfiguration
if (API_HASH === "DIN_HASH_HÄR" || API_HASH === "") {
console.log("VARNING: API_HASH är inte konfigurerad! Uppdatera scriptet med din hash från temperatur.nu");
return;
}
// Läs temperatur(er) och rapportera
readTemperatures(function (temp) {
if (temp !== null) {
reportTemperature(temp);
} else {
console.log("Kunde inte läsa temperatur från någon sensor");
}
});
}
// Kör en gång direkt vid start
checkAndReport();
// Sätt upp timer för periodisk rapportering
Timer.set(REPORT_INTERVAL_MS, true, checkAndReport);
console.log("Temperatur.nu Reporter startad!");
console.log("Sensor 1 ID:", SENSOR_ID_1);
if (SENSOR_ID_2 !== null) {
console.log("Sensor 2 ID:", SENSOR_ID_2, "(använder kallaste)");
}
console.log("Rapporteringsintervall:", REPORT_INTERVAL_MINUTES, "minuter");
Aktivering
- Ändra
API_HASHtill din egen kod överst i scriptet. - Klicka på Save och därefter Start.
- Viktigt: Aktivera fliken ”Run on startup” så att scriptet startar automatiskt om strömmen går eller enheten startas om.
Verifiering
Klicka på Console längst ner i script-editorn. Där ska du se en rad som börjar med Anrop: https://... vilket bekräftar att scriptet skickar data korrekt. Om du inte ser consolen – gå direkt till enheten ip-nummer och klicka på scriptet.

