NEWS
[Gelöst] Auf Sonnenstand reagieren mit beschreibbarer Variable
-
@paul53 sagte in [Hilfe] Auf Sonnenstand reagieren mit beschreibbarer Variable:
Ändere es bitte auch in der Doku (s.o), da sonst sicherlich weitere Neulinge darüber stolpern.
Gerne.
Hast du mal das komplette Skript?
Nach der Änderung meckert es jetzt noch mehr.14:16:27.777 warn javascript.0 at Sonnenstand_berechnen (script.js.Wetter_und_Klima.Sonnenstand:30:7) 14:16:27.777 warn javascript.0 at script.js.Wetter_und_Klima.Sonnenstand:38:2 14:16:27.777 warn javascript.0 at Sonnenstand_berechnen (script.js.Wetter_und_Klima.Sonnenstand:31:7) 14:16:27.777 warn javascript.0 at script.js.Wetter_und_Klima.Sonnenstand:38:2
EDIT:
Mein Fehler. Habe die Zeilen komplett ohne Prüfung übernommen.
Der Pfad stimmte so natürlich nicht -
@paul53
Jetzt drehe ich mich im Kreis.Also vom Sonnenstands Script beide Variablen in String und meine beschreibbare Variable in String schaltet das Licht ein.
Da meckert aber das Sonnenstands Script wegen "Number".
Stelle ich auf Number um ist das Sonnenstandsscript in Ordnung aber mein Licht schaltet nicht.
Meine beschreibbare Variable auf "Number" geändert und trotzdem kein einschaltenIch verzweifle gerade.
Sebastian
-
@paul53
Du hast das Skript in Global?Soll das so sein?
-
@Homoran
Nein, das ist nur meine Bezeichnung. -
@webseb79
Danke!
ich ändere es gerade in der Doku -
@Homoran sagte:
Hast du mal das komplette Skript?
const suncalc = require('suncalc'); const result = getObject("system.adapter.javascript.0"); const lat = result.native.latitude; const long = result.native.longitude; const idEle = 'Sonnenstand.Elevation'; const idAzi = 'Sonnenstand.Azimut'; createState(idEle, 0, {type: 'number', unit: '°'}); createState(idAzi, 0, {type: 'number', unit: '°'}); function Sonnenstand_berechnen () { var now = new Date(); var sunpos = suncalc.getPosition(now, lat, long); var h = sunpos.altitude * 180 / Math.PI; var a = sunpos.azimuth * 180 / Math.PI + 180; setState(idEle, Math.round(10 * h) / 10, true); setState(idAzi, Math.round(a), true); } schedule("* * * * *", Sonnenstand_berechnen); // jede Minute
-
@paul53
Danke!Das hast du ja mal wieder massiv verschlankt
-
@Homoran sagte:
Das hast du ja mal wieder massiv verschlankt
Nein, nur die Logs entfernt, dafür aber Konstanten als solche deklariert und den Datenpunkttyp "number" mitgegeben.
-
@webseb79 sagte:
Meine beschreibbare Variable auf "Number" geändert und trotzdem kein einschalten
Stimmt der Datentyp ?
log('Typ Grenzwert: ' + typeof gwElevation);
-
Jetzt ist Grenzwert Typ "Number" und Elevation auch Typ "Number"
-
@webseb79 Dann sollte es funktionieren. Wie sieht das komplette Skript jetzt aus ?
-
createState('javascript.0.Zeiten.Treppenlicht.Elevation', -0.5 , {type:"number", role:"javascript"}); var idt3 = 'javascript.0.Zeiten.Treppenlicht.Elevation'; var idElevation = getState(idt3).val; on({ id: "javascript.0.Global.Sonnenstand.Elevation"/*Global.Sonnenstand.Elevation*/, change: "ne", valLe: idElevation, oldValGt: idElevation, logic: "and" }, function (obj) { Treppenlicht_an_Sonnenuntergang(); }); function Treppenlicht_an_Sonnenuntergang() { if (getState("radar.0.G-Tag-Claudia.here"/*G-Tag-Claudia.here*/).val === false && getState("radar.0.G-Tag-Sebastian.here"/*G-Tag-Sebastian.here*/).val === false ) { return; } if (getState("knx.0.Licht.Licht-Status.OG-Schlafzimmer-Treppenleuchte-Schalten-Status"/*OG-Schlafzimmer-Treppenleuchte-Schalten-Status*/).val === 1) { return; } event("Schlafzimmer...Treppenbeleuchtung zum Sonnenuntergang eingeschalten","Allgemein","white"); setState ("knx.0.Licht.Licht-Schalten.OG-Schlafzimmer-Treppenleuchte-Schalten"/*OG-Schlafzimmer-Treppenleuchte-Schalten*/, 1); }
Wie schon erwähnt ... Typ String und alles lief.
Sebastian
-
@webseb79 sagte:
Wie schon erwähnt ... Typ String und alles lief.
Ein Stringvergleich (im Trigger) dürfte Probleme machen (bei negativen Werten).
-
@paul53
Zu dem Zeitpunkt war der Sonnenstand ja positiv...also kannst du rechthaben.
Das Script läuft ja schon einige Zeit, nur 2 Dinge wurden verändertvalLe: -0.5, oldValGt: -0.5, auf valLe: idElevation, oldValGt: idElevation,
Wie kann ich die feste vergebene Zahl nun flexibel über Vis steuern?
-
@webseb79 sagte:
Wie kann ich die feste vergebene Zahl nun flexibel über Vis steuern?
Zusätzlich:
on(idt3, function(dp) { idElevation = dp.state.val; });
-
Da bin ich jetzt überfragt wohin das noch soll.
Deine on - Anweisung sagt doch nur das wenn sich idt3 ändert dieser Wert in idElevation geschoben wird , oder?
Ich triggere doch auf den ständig veränderten Sonnenstand.Sebastian
-
@webseb79 sagte:
das wenn sich idt3 ändert dieser Wert in idElevation geschoben wird , oder?
Richtig. Das genau wolltest Du doch: Wenn der Wert in Vis geändert wird, kommt diese Änderung auch im Skript an, ohne dass das Skript neu gestartet werden muss.
-
Deine letzte Anweisung
on(idt3, function(dp) { idElevation = dp.state.val; });
hatte ich vorhin noch nicht und dort ging es doch schon wie ich es wollte , halt nur mit dem Datentyp "String" als Variable von Vis kommend und vergleichend vom Sonnenstandsscript die Variable kommend auch als "String".
Nur dann kam doch die Meldung vom Sonnenstandsscript das es ein Datentyp "Number" verlangt. -
@webseb79 sagte:
hatte ich vorhin noch nicht und dort ging es doch schon wie ich es wollte
Ohne den Trigger wird der Wert nur bei Skriptstart aktualisiert und bleibt dann konstant, egal was in Vis geändert wird.
-
@paul53
Ok ... zum laufen bekomme ich das nicht.
Gibt es eine andere Variante um zum Ziel zu kommen?
Eine angelegte Variable in Instanz.0 durch Vis beschreibbar vergleicht den Elevation Wert des Sonnenstandes und löst eine Funktion aus beim unterschreiten als 1.Beispiel und beim Überschreiten als 2.Beispiel.
Hast du da eine Idee Paul53Danke Sebastian