Die Ausführung von calls ist asynchron. Muss man anders machen.
Probiere mal bitte Folgendes und sage mir, wann in der Console 'Fertig' ausgegeben wird. Wenn das ausgegeben wird, nachdem
die Jalousie auf 24% gefahren ist, ist das machbar.
Die Ausführung von calls ist asynchron. Muss man anders machen.
Probiere mal bitte Folgendes und sage mir, wann in der Console 'Fertig' ausgegeben wird. Wenn das ausgegeben wird, nachdem
die Jalousie auf 24% gefahren ist, ist das machbar.
Willkommen im Forum, Torsten
Wer viel hat, weiß viel, oder hat viele Fragen. Beides ist hier willkommen.
Grüße von der Nordsee
Michael
Kann der Shelly selbst:
Einfach dein Skript bei dein_Skript_Name einsetzen und starten.
function watch() {
if(script_id===undefined) return;
if(!Shelly.getComponentStatus("script:"+script_id).running) {
print('Watchdog: Starte ' + filename);
Shelly.call("Script.Start", {"id":script_id});
}
}
Shelly.call('Script.List','',
function(result, error_code, error_message){
let a = result['scripts'];
for (let i=0; i<a.length; i++) {
if(a[i]['name'] === filename) {
script_id = a[i]['id'];
break;
}
}
}
);
let filename = 'dein_Skript_Name';
let script_id;
t1 = Timer.set(10000,true,watch);
Alles anzeigen
Welcome to the Forum.
I would recommend that you open a new thread. If you describe your problem in detail there, you will be helped even without the connection diagrams that are not available in the moment. If necessary, someone will make a sketch.
Greetings from the North Sea coast
Michael
Nein, das fragt ja nur den Errorcode des Requets ab. Jeder kritische Fall sollte durch try/catch abgefangen werden.
Diese Zeile:
macht zum Beispiel bei KEINER response, im Sinne von, der Shelly ist gar nicht erreichbar, durchaus ärger.
Wenn es response gar nicht gibt, ist das weder true noch false, sondern undefined. else kennt aber nur true oder false. Dann wird ein Fehler geworfen.
Resultat: Uncaught ReferenceError: "response" is not defined. Skript abgebrochen.
//response ist nicht definiert
try {
if (response) {
print('ok');
}
} catch(e) {
print('nok');
}
Resultat: nok. Skript läuft weiter.
Und, dein Code:
würde ich, wie folgt, ergänzen:
Ein timeout ist ein definierter Fehlerfall und führt zu einem anderen Fehlercode, als wenn gar nicht passiert. Ein Grund weniger für einen Absturz
Ich denke, beide Maßnahmen sind sinnvoll. Teste mal.
Solltest deinen Nick in Shelly-Killer umbenennen
Der Vorteil ist, dass die Limits pro Skript gelten:
Das kann man so umgehen. Außerdem weißt du, wenn nur eines deiner Skripte abstürzt, wo der Fehler auftaucht.
AFAIK ist das nicht der beste Weg (kvs). Der Chip, wo das gespeichert wird, ist nicht für dauerndes Schreiben vorgesehen.
Der bessere Weg ist ws oder http-Endpoint.
Beispiel mit http-endpoint:
function log(to_log) {
console.log(to_log);
}
function send_response(response) {
response.code = 200;
response.send();
}
function watch(request,response) {
if(request.query==='vars') {
response.body = JSON.stringify(my_vars_for_other_script);
}
send_response(response);
}
let my_vars_for_other_script = {'sunset':'17:12', 'sunrise':'06:26'};
HTTPServer.registerEndpoint('my_endpoint',watch);
script_id = Shelly.getCurrentScriptId();
log('Your possible urls are:');
log('http://127.0.0.1' + '/script/' + script_id + '/my_endpoint?xxxx');
Alles anzeigen
function get_vars() {
Shelly.call('http.get', {url:'http://127.0.0.1/script/7/my_endpoint?vars'},
function (response,error_code) {
if (error_code === 0) {
vars_from_other_script=JSON.parse(atob(response.body_b64));
print(vars_from_other_script.sunset);
print(vars_from_other_script.sunrise);
}
}
);
}
let vars_from_other_script;
get_vars();
Alles anzeigen
Uff, harter Tobak. Kennst du die Api?
Z.B.
Shelly.getComponentStatus("sys").time
oder
Shelly.getComponentStatus("sys").unixtime
Und, dein Skript ist so megakompliziert, weil GPT zwar Javascript 'kann'*, aber die Shelly Api nicht kennt.
Skript in sinnvolle Funktionseinheiten auf 2 oder 3 Skriptr aufteilen, Daten zwischen den Skripten austauschen über z.B.http-Endpoints <- auch in der Api zu finden.
Ist als Anregung gemeint, nicht als Kritik.
*und das auch eigentlich nicht wirklich.
Wenn du deine 4 Skripte hier postest, kann man dir helfen, das zusammen zu fassen. Es gehen halt nur 3 Skripte.
Ich bin mir sicher, dass man das in einem Skript auch erledigen kann.
Ich kenne die offiziellen BT Skripte nicht. Ein ehemaliger User Dekat hat hier seine eigenen Skripte zu BT eingestellt.
Da hatte er mal etwas dazu geschrieben. Es kommt halt auch auch Firmwareversionen. BT ist ja erst in letzter Zeit überarbeitet worden
und war lange Zeit noch sehr experimentell. Da gab es damals Probleme in Scripten, weil, schlag mich tot, was es war, hing aber mit Scannen zusammen. Ich habe hier auch ein Paar eigene BT-Skripte im Einsatz. Ich würde sagen, Versuch macht klug. Ich habe noch nie etwas anderes einstellen müssen, als Enable Bluetooth. Und Weitergabe als MQTT geht so auch. Kannst das in einem Skript auch mit http, ws, wss, oder udp weiterleiten, wohin du willst.
Willst du selber Skripten, oder nur fertige Skripte nutzen? Aber, ist Wurscht. Wir bekommen dein Problem schon gelöst.
Versuche doch einfach mal, ob es mit der Empfohlenen Einstellung besser läuft. Cloud willst du doch nicht nutzen, oder?
Enable Bluetooth -> Bluetooth eingeschaltet, Skripte können BT nutzen, z.B. scannen.
Enable RPC -> Der Shelly kann Befehle über BT engegen nehmen. Z.B. Ein/Aus.... Braucht man im Skript nicht, kann das Skript ja selber machen.
Enable Bluetooth Gatway. Alles, was der Shelly über BT empfängt, wird in die Cloud übertragen, Scripte können BT nicht mehr, wie vorgesehen nutzen.
So, wie auf dem Screenshot eingestellt, funktionieren alle üblichen Skripte.
Die Hardware 'Bluetooth Gateway' ist etwas anderes, und stellt die, in der Produktbeschreibung genannten Eigenschaften zu Verfügung.
Kann es sein, dass du mit Opera einen anderen DNS nutzt?
So oder so, das Problem behebt sich mit der Zeit selbst. Die DNS-Server im Netz müssen das nur 'durchtelefonieren'.
Willkommen im Forum.
Zu deinem geplanten Projekt wirst du hier sicherlich hilfreiche Antworten bekommen.
Du kannst maximal 3 Timer nutzen.
Man kann auch Timer wieder rücksetzen.
Hilfreich wäre es, dein gesamtes Skript zu sehen. Dann kann ich helfen.
Leute, das Forum war und ist immer für euch da. Natürlich wollen wir alle, das Forum für euch so gut wie möglich gestalten.
Ihr habt ja selber, durch eure Mitarbeit, wesentlich dazu beigetragen. Daher kann ich euren Unmut gut verstehen.
Alle getroffenen Maßnahmen haben Gründe. Was wir jetzt gut gebrauchen könnten, ist eure Geduld und eure Solidarität.
Danke dafür.
Na dann, wenn wir helfen können, gerne fragen!
Oh, da ist Thomas ja schon da
Softwaremäßig geht das unabhängig. Ich habe auch hier im Forum mal ein passendes Skript veröffentlicht.
Hardewaremäßig dürfen keine verschiedenen Phasen im Shelly zusammenkommen. Wobei mir die Schaltung nicht ganz klar ist,
die dir vorschwebt. Aber dafür gibt es hier andere Spezialisten thgoebel und andere.