Hallo, ich bin leider nicht so fit in javascript, vlt. kann mir wer helfen.
Script Beschreibung:
Shelly I4, input 1 triggert auf button down die Abfrage von 4 shelly Plus1
wenn alle 4 shelly's aus sind schaltet er shelly 1 ein.
wenn einer oder mehrere shelly's an sind schaltet er alle aus.
Sozusagen ein alles aus und wenn alles aus ist schalte nur definierte Shelly's ein.
Mein script läuft, es ist gruselig aber es läuft.
Zu meinem Problem:
Wenn einer der shelly's nicht erreichbar ist oder z.B. weil die Authentication an ist oder der response nicht ankommt wegen Timeout etc. dann bleibt das script stehen.
Da ich es gerne ein wenig stabiler bekommen würde sollte das Script weiterlaufen.
Folgende Fehlermeldung bekomme ich in der Debug Console:
shelly_http.cpp:99 0x3ffe16a0 HTTP Request timeout
at script_6.js:80
at api_rpc.js:8
RPC cb error: type error
shelly_notification:161 Status change of script:6: {"id":6,"errors":["type_error"],"running":false}
idealerweise sollte er einen nicht erreichbaren shelly als "false" sprich aus annehmen, irgendwie ist mir nicht ganz klar welche Parameter da die funktion in script_6.js:80 erwartet.
Das Script sollte hald einfach bei einem Fehler weiterlaufen, irgendwann kommt der shelly wieder.
Hier als Beispiel das Script:
ich weis console.log und print kommen auf das gleiche raus.
// Vergleichsfunktion für alle 4 shelly's schöner wäre würde er die Anzahl der definierten shelly's als response length selber bestimmen
// response global definiert damit alle nachfolgenden funktionen darauf bereits zugreifen können.
let responses = [];
function checkResponses() {
if (responses.length === 4) {
let allFalse = false;
for (let i = 0; i < responses.length; i++) {
console.log(JSON.stringify(responses[i]));
if (responses[i] !== false) {
allFalse = true;
break;
}
}
if (allFalse) {
console.log("one of the responses is True");
Shelly11.call(
"switch.set",
{ id: 0, on: false },
function (result, error_code, message) {
print(JSON.stringify(result), error_message, message);
}
);
Shelly12.call(
"switch.set",
{ id: 0, on: false },
function (result, error_code, message) {
print(JSON.stringify(result), error_message, message);
}
);
Shelly13.call(
"switch.set",
{ id: 0, on: false },
function (result, error_code, message) {
print(JSON.stringify(result), error_message, message);
}
);
Shelly14.call(
"switch.set",
{ id: 0, on: false },
function (result, error_code, message) {
print(JSON.stringify(result), error_message, message);
}
);
} else {
console.log("not all responses are false");
Shelly11.call(
"switch.set",
{ id: 0, on: true },
function (result, error_code, message) {
print(JSON.stringify(result), error_message, message);
}
);
}
}
};
// rpc beispiel aus dem github tutorial repository abgewandelt ich finde das beispiel sehr umständlich aber es funktioniert
let RemoteShelly = {
_cb: function (result, error_code, error_message, callback) {
console.log(result.body);
let rpcResult = JSON.parse(result.body);
console.log("rpcresult" rpcResult);
let rpcCode = result.code;
console.log("code" rpcCode);
let rpcMessage = result.message;
console.log("mess" rpcMessage);
callback(rpcResult, rpcCode, rpcMessage);
},
composeEndpoint: function (method) {
return "http://" + this.address + "/rpc/" + method;
},
call: function (rpc, data, callback) {
let postData = {
url: this.composeEndpoint(rpc),
body: data,
};
Shelly.call("HTTP.POST", postData, RemoteShelly._cb, callback);
},
getInstance: function (address) {
let rs = Object.create(this);
// remove static method
rs.getInstance = null;
rs.address = address;
return rs;
},
};
// Hier die shelly's mittels IP definiert der letzte auf X.140 um den Timeout Fehler zu provozieren, ich wüerde auch gerne einen Timeout definieren sagen wir 20ms oder so
let Shelly11 = RemoteShelly.getInstance("192.168.33.11");
let Shelly12 = RemoteShelly.getInstance("192.168.33.12");
let Shelly13 = RemoteShelly.getInstance("192.168.33.13");
let Shelly14 = RemoteShelly.getInstance("192.168.33.140");
// Abfrage der Shelly's bei button_down extra nicht single klick oder sowas .. via rpc call und dann jeweils aufrufen der checkResponses Funktion
Shelly.addEventHandler(function (event) {
if (event.component === "input:0" && event.info.event === "btn_down") {
console.log("Button was pushed");
Shelly11.call(
"switch.getstatus",
{ id: 0 },
function (result, error_code, error_message) {
responses.push(result.output);
checkResponses();
print("11" result.output);
}
);
Shelly12.call( "switch.getstatus", { id: 0 },
function (result, error_code, error_message) {
responses.push(result.output);
print("12" result.output);
checkResponses();
}
);
Shelly13.call(
"switch.getstatus",
{ id: 0 },
function (result, error_code, error_message) {
responses.push(result.output);
print("13" result.output);
checkResponses();
}
);
Shelly14.call(
"switch.getstatus",
{ id: 0 },
function (result, error_code, error_message) {
responses.push(result.output);
print("14" result.output);
checkResponses();
}
);
// Resetten der responses Variable damit die checkResponses Funktion beim nächsten mal von button_down wieder einen definierten zustand hat
responses = [];
}
});
Alles anzeigen
Vielen Dank für eure Kommentare.