Kannst du mal bitte folgenden RPC auf den jeweiligen Uni ausführen:
Der mit dem Fehler:
{"id":2,"running":false,"mem_free":23814,"errors":["syntax_error"],"error_msg":"Uncaught SyntaxError: RETURN statement, but not in a function.\n\n at return actual_data;\n ^\nin function \"GetActualData\" called from actual_data = GetActualData()\n ^\nin function \"Timer1event\" called from Timer1event();\n ^\nin function called from system\n\n"}
Der mit dem Fehler (ohne RETURN):
{"id":3,"running":false,"mem_free":23856,"errors":["internal_error"],"error_msg":"Uncaught InternalError: Too many scopes removed\n at actual_data = GetActualData()\n ^\nin function \"Timer1event\" called from Timer1event();\n ^\nin function called from system\n\n"}
Der wo es läuft:
{"id":1,"running":true,"mem_used":2688,"mem_peak":3304,"mem_free":22498}
Und hier noch das Script. Die Problem-Funktion ist extra mit "// ############################" markiert.
// Messen & speichern von Temperatur & Feuchte inkl. Datum
// speichern von minTemp (mit Feuchte & Datum), maxTemp (mit Feuchte & Datum) für jeden Wochentag im KVS
// speichern von absoluten minTemp (mit Feuchte & Datum) bzw. maxTemp (mit Feuchte & Datum) im KVS
// 2025-05-29 - 2025-06-01 v1 ## testing ##
// Definitionen / Konstante
// Temperaturspeicher
let maxTemp = "n/a";
let minTemp = "n/a";
let maxTempHum = "n/a";
let minTempHum = "n/a";
let maxTempDate = "n/a";
let minTempDate = "n/a";
// Datum
let D = null;
let saveHour = null;
let day = "n/a";
let month = "n/a";
let year = "n/a";
let hour = "n/a";
let min = "n/a";
let sec = "n/a";
let dayName = "n/a";
let dayArray = Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");
// Messintervall Timer 1 (>= drei Sekunden)
let delay1 = 4;
// Messdatenarray
let actual_data = {
tC: "n/a", // Temperatur in °C
rH: "n/a", // rel. Luftfeuchtigkeit in %rH
V: "n/a" // Spannung in V
};
// KVS
let err = 0;
let saved = 0;
let KVSkeyMaxTemp = "all-time max Temp";
let KVSkeyMinTemp = "all-time min Temp";
let KVSkeyMaxTempValue = null;
let KVSkeyMinTempValue = null;
let KVSdayArray = Array("-", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
// Startsequenz, wird unten (EOF Script) einmalig zum Scriptstart aufgerufen
function init() {
// Variable zum stündlichen debug-log aktualisieren
saveHour = Date().getHours() + 1;
// Timer1 (Intervall, um Temperatur & Feuchte zu messen)
startTimer1(delay1);
// im KVS gespeicherten Wert "KVSkeyMaxTempValue" holen
KVSgetValueMaxTemp();
// im KVS gespeicherten Wert "KVSkeyMinTempValue" holen
KVSgetValueMinTemp();
};
// Timer1 starten
function startTimer1(delay) {
// Timer1 handle
Timer.set(delay * 1000,
true,
function () {
Timer1event();
},
null
);
};
// Timer1 event
function Timer1event() {
// Temperatur & Feuchte messen
actual_data = GetActualData()
// debug
print(actual_data)
// Temperatur auswerten
CompareTemperature(actual_data)
};
// ############################
// aktuelle Istdaten auslesen
function GetActualData() {
// wenn Temperatursensor verfügbar
if (Shelly.getComponentStatus("temperature:100") != null) {
actual_data.tC = Shelly.getComponentStatus("temperature:100").tC;
}
// wenn Feuchtesensor verfügbar
if (Shelly.getComponentStatus("humidity:100") != null) {
actual_data.rH = Shelly.getComponentStatus("humidity:100").rh;
}
// wenn Voltmeter verfügbar
if (Shelly.getComponentStatus("voltmeter:100") != null) {
actual_data.V = Shelly.getComponentStatus("voltmeter:100").voltage;
}
// debug
// print(actual_data.tC + "°C ", actual_data.rH + " %rH ", actual_data.V + " V");
// Rückgabe
return actual_data;
};
// aktuelles Datum & Zeit holen und formatieren
function getDateTime() {
var D = Date();
day = "" + D.getDate();
month = "" + (D.getMonth() + 1);
year = "" + D.getFullYear();
hour = "" + D.getHours();
min = "" + D.getMinutes();
sec = "" + D.getSeconds();
dayName = dayArray[D.getDay()];
if (day.length < 2) {
day = '0' + day;
}
if (month.length < 2) {
month = '0' + month;
}
if (hour.length < 2) {
hour = '0' + hour;
}
if (min.length < 2) {
min = '0' + min;
}
if (sec.length < 2) {
sec = '0' + sec;
}
return dayName + " " + [day, month, year].join(".") + " " + [hour, min, sec].join(":");
}
// erstellen von neuen KVS-Einträgen und setzen von KVS-Werten
function KVSsetValue(key, value) {
Shelly.call("KVS.Set", {
"key": key, "value": value
}, function(response, error_code) {
if (error_code === 0) {
err = 0;
} else {
err = error_code ;
};
});
};
// asynchrone Funktion, benötigt lange zum füllen der globalen Variablen
function KVSgetValueMaxTemp() {
Shelly.call("KVS.Get", {
"key": KVSkeyMaxTemp
}, function(response, error_code) {
if (error_code === 0) {
KVSkeyMaxTempValue = response.value.substring(0, response.value.indexOf("°C"));
} else {
KVSkeyMaxTempValue = "n/a";
};
});
};
// asynchrone Funktion, benötigt lange zum füllen der globalen Variablen
function KVSgetValueMinTemp() {
Shelly.call("KVS.Get", {
"key": KVSkeyMinTemp
}, function(response, error_code) {
if (error_code === 0) {
KVSkeyMinTempValue = response.value.substring(0, response.value.indexOf("°C"));
} else {
KVSkeyMinTempValue = "n/a";
};
});
};
// aktuelle Istdaten mit Solldaten vergleichen und auswerten
function CompareTemperature(actual_data) {
// temporäres speichern der Temperatur Max- & Min-Werte mit Datum und Feuchte
// speichern des Maximalwerts
if (actual_data.tC > maxTemp || maxTemp === "n/a") {
maxTempDate = getDateTime();
maxTemp = actual_data.tC;
maxTempHum = actual_data.rH;
}
// speichern des Minimalwerts
if (actual_data.tC < minTemp || minTemp === "n/a") {
minTempDate = getDateTime();
minTemp = actual_data.tC;
minTempHum = actual_data.rH;
}
// debug
print("log - min: " + minTemp + "°C " + minTempHum + "%rF " + minTempDate + " - max: " + maxTemp + "°C " + maxTempHum + "%rF " + maxTempDate);
// stündlich einmalig einen kompletten Wert im debug-log schreiben
// D wird weiter verwendet...
D = Date();
if (D.getHours() === saveHour) {
print("log - min: " + minTemp + "°C " + minTempHum + "%rF " + minTempDate + " - max: " + maxTemp + "°C " + maxTempHum + "%rF " + maxTempDate);
saveHour++;
if (saveHour === 24) {saveHour = 0};
};
// täglich um 23:59 Uhr: speichern der Tages-Max- & -Min-Werte sowie ggf. eines neuen absoluten Max- oder -Min-Werts
if (D.getHours() === 23 && D.getMinutes() === 59 && saved === 0) {
// Tages-Max- & -Min-Werte f��r KVS zusammenstellen
var newKVSmaxTempValue = maxTemp + "°C " + maxTempHum + "%rF " + maxTempDate;
var newKVSminTempValue = minTemp + "°C " + minTempHum + "%rF " + minTempDate;
// absolute Max- & Min-Werte prüfen und ggf. neue Werte im KVS speichern
if (maxTemp > KVSkeyMaxTempValue || KVSkeyMaxTempValue === "n/a") {
KVSsetValue(KVSkeyMaxTemp, newKVSmaxTempValue);
}
if (minTemp < KVSkeyMinTempValue || KVSkeyMinTempValue === "n/a") {
KVSsetValue(KVSkeyMinTemp, newKVSminTempValue);
}
// aktuellen Wochentag für KVS-Key ermitteln - Format: "1 Mo", "2 Di", ...
// Tageskürzel
var KVSdayName = maxTempDate.substring(0, 2);
// Tagesnummer (Arrayindex)
var newKVSdayKey = KVSdayArray.indexOf(KVSdayName) + " " + KVSdayName;
// Tages-Max- & -Min-Werte für KVS zusammenstellen
var newKVSdayValue = "min: " + newKVSminTempValue + " - max: " + newKVSmaxTempValue;
// Tageswert in KVS speichern
KVSsetValue(newKVSdayKey, newKVSdayValue);
// debug
print(newKVSminTempValue);
print(newKVSmaxTempValue);
print(newKVSdayKey);
print(newKVSdayValue);
// zurücksetzen der temporären Tageswerte
saved = 1;
maxTemp = "n/a";
minTemp = "n/a";
maxTempDate = "n/a";
minTempDate = "n/a";
maxTempHum = "n/a";
minTempHum = "n/a";
} else if (D.getHours() != 23 && saved === 1) {
saved = 0;
};
};
// Startsequenz aufrufen
init();
Alles anzeigen