Vorweg: Ich verwende OpenDTU nicht und kann daher nur nach Doku vorgehen.
Laut der Konsole wird der Befehl ausgeführt und das Limit gesetzt. Allerdings kann ich in der openDTU keine Änderung verzeichnen. Kann mir jemand helfen?
Die Meldung in der Konsole sagt nur, dass der Request erfolgreich abgeschickt wurde. Sie sagt NICHT, dass OpenDTU den Request auch akzeptiert hat. Mit hoher Wahrscheinlichkeit lehnt OpenDTU den Request ab, weil User und Passwort nicht korrekt gesendet wurden.
Hier ist eine modifizierte Version deines Scriptes, in der ich drei Dinge geändert habe:
- Anstelle von HTTP.POST wird HTTP.Request mit der Methode POST verwendet (weil bei HTTP.POST kurioserweise keine eigenen Header mitgegeben werden können).
- Username und Passwort werden im Header so mitgegeben, wie es die Basic HTTP Authentication vorsieht.
- Zusätzlich ist eine Fehlerbehandlung implementiert, die genaue Auskunft über etwaige Probleme geben sollte.
// Konfiguration
let url = "http://192.168.178.41/api/limit/config";
let serial = "SERIENNUMMER";
let username = "admin";
let password = "PASSWORT";
// Funktion zum Senden des HTTP POST
function sendLimit(limit_value) {
let payload = {
serial: serial,
limit_type: 0,
limit_value: limit_value,
};
Shelly.call(
"HTTP.Request",
{
method: "POST",
url: url,
body: JSON.stringify({ data: payload }),
headers: {
Authorization: "Basic " + btoa(username + ":" + password),
"Content-Type": "application/json",
},
},
function (res, errc, errm) {
if (errc !== 0) {
print("Shelly Fehler", errc, errm);
} else if (res.code !== 200) {
print("OpenDTU Fehler", res.code, res.message);
} else {
print("Limit erfolgreich geändert!");
}
},
);
}
// Liste der gewünschten Zeiten (Stunde, Minute) und Limit-Werte
let schedule = [
{ hour: 8, minute: 0, value: 600 },
{ hour: 11, minute: 00, value: 500 },
{ hour: 14, minute: 0, value: 800 },
];
// Überprüfung jede Minute
Timer.set(60000, true, function () {
let now = new Date();
let h = now.getHours();
let m = now.getMinutes();
for (let i = 0; i < schedule.length; i++) {
if (h === schedule[i].hour && m === schedule[i].minute) {
sendLimit(schedule[i].value);
break;
}
}
});
Alles anzeigen
Wenn du jetzt die Funktion sendLimit() aufrufst, sollte in der Konsole eine von drei Meldungen erscheinen:
- Shelly Fehler ... wenn der Request nicht abgeschickt werden konnte
- OpenDTU Fehler ... wenn OpenDTU den Request nicht akzeptiert hat
- Limit erfolgreich geändert wenn alles funktioniert hat
Versuch es bitte mal und lass mich wissen, was die Konsole sagt...