Wenn es ein Gen 2/3 ist, erreichst du mit dieser Methode folgendes:
1.) Der Shelly taucht nie wieder in deinem Netzwerk auf.
2.) Du findest ihn mit Hilfe einer Wärmebildkamera.
Wenn es ein Gen 2/3 ist, erreichst du mit dieser Methode folgendes:
1.) Der Shelly taucht nie wieder in deinem Netzwerk auf.
2.) Du findest ihn mit Hilfe einer Wärmebildkamera.
Ich kann. Eben getestet. Aber das heißt ja nichts. Admin ?
Welcome to the forum. Feel free to ask your questions. Pretty sure you will find help here,
Greetings
Michael
Vorausgesetzt du hast unter Setting --> Location and time den richtigen Breiten- und Längengrad eingetragen.
Du kannst dir auch die Astro-Zeiten selbst holen:
function get_astro(){
print('Try to get location...');
Shelly.call('sys.getConfig','',
function(result, error_code, error_message,action_type) {
if(error_code === 0) {
lon = result.location.lon;
lat = result.location.lat
print('Longutude: ' + lon);
print('Latitude: ' + lat);
url = "https://api.sunrisesunset.io/json?lat=" + lat + "&lng=" + lon;
print('Try to get astro data...');
Shelly.call('http.get', {url:url,timeout:15},
function(result, error_code, error_message,action_type) {
if(error_code === 0) {
let res = JSON.parse(result.body);
print('Sunrise: ' + twelve_to_twentyfour(res.results.sunrise));
print('Sunset : ' + twelve_to_twentyfour(res.results.sunset));
sunrise = time_to_number(res.results.sunrise.slice(0,res.results.sunrise.indexOf(' ')));
sunset = time_to_number(res.results.sunset.slice(0,res.results.sunset.indexOf(' ')));
sunset += 12 * 3600;
print('System ready');
}
}
);
}
}
);
}
let lon
let lat
let sunrise;
let sunset;
get_astro();
Alles anzeigen
Da muss jemand anders ran. Bin Shelly-Cloud-Verweigerer.
ChatGPT
Schön, dass es klappt
Das u.g. Skript macht Folgendes:
Wenn es aufgerufen wird, fährt es die Jalousie in die unter desired_pos angegebene Position + 1.
Da ich nun keine weitere Kontrolle habe, wegen der asynchronen Ausführung, startet gleichzeitig ein, sich wiederholender, Timer.
Der Timer ruft jede Sekunde die Funktion get_cur_pos auf. Diese Funktion stellt die aktuelle Position fest und wenn desired_pos + 1
erreicht ist, wird der Befehl aufgerufen, die Position desired_pos, also die gewünschte Position, anzufahren. Also 1% nach oben.
Auch hier habe ich keine Kontrolle, also starte ich einen einmaligen Timer, der das Skript nach 3 Sekunden beendet, sofern stop_if_ready = true.
Da ich keine Jalousien habe, ist das Skript ungetestet. Ich gehe davon aus, dass Position 0 ganz geöffnet und Position 100 ganz geschlossen ist.
// user config
let desired_pos = 93;
let stop_if_ready = true;
// user config end
function stop_script() {
Shelly.call("script.stop", {"id":Shelly.getCurrentScriptId()});
}
function get_cur_pos() {
let coverStatus = Shelly.getComponentStatus("cover", 0);
if(coverStatus.current_pos === desired_pos + 1) {
Timer.clear(t1);
Shelly.call('Cover.GoToPosition', {'id': 0, 'pos': desired_pos},
function(result, error_code, error_message) {
if(error_code === 0) {
if(stop_if_ready) {
t1 = Timer.set(3000,false,stop_script);
}
}
}
);
}
}
let t1;
Shelly.call('Cover.GoToPosition', {'id': 0, 'pos': desired_pos + 1},
function(result, error_code, error_message) {
if(error_code === 0) {
t1 = Timer.set(1000,true,get_cur_pos);
}
}
);
Alles anzeigen
Ich muss wissen, wann das Fertig kommt, wenn du NUR meinen Code ausführst.
Die entscheidende Frage ist, kommt die Ausgabe, wenn sie in der Stellung 93 ist, oder vorher?
Kann man ja machen. Meine Lösung ist autark. Deine Lösung ist auf Netzwerk und laufenden MQTT Server angewiesen.
Gleich zwei zusätzliche Fehlerquellen. Dein Shelly-Flugzeug wird dann über Satellit gesteuert.
"händisch" gestoppt wird bzw. nicht gestartet
Setze es auf Autostart, dann hat sich "nicht gestartet" erledigt. Und ""händisch" gestoppt" trifft ja wohl auf alles zu, egal, wie man es löst.
Außerdem kann man das Spielchen ja auch noch so treiben, dass das Skript den Watchdog überwacht und umgekehrt der Watchdog das Skript.
Der Watchdog ist bulletproof und läuft sogar weiter, wenn das Netzwerk ausfällt. Kannst ja noch einmal einen Watchdog auf den Watchdog ansetzen
Gibt, wenn das so nicht geht, noch andere Möglichkeiten. Aber teste und berichte erst einmal.
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.