Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Gelöst] Auf Sonnenstand reagieren mit beschreibbarer Variable

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Gelöst] Auf Sonnenstand reagieren mit beschreibbarer Variable

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @webseb79 last edited by

      @webseb79
      Danke!
      ich ändere es gerade in der Doku

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Homoran last edited by

        @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
        
        Homoran 1 Reply Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators @paul53 last edited by

          @paul53
          Danke!

          Das hast du ja mal wieder massiv verschlankt 😉

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Homoran last edited by

            @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.

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @webseb79 last edited by

              @webseb79 sagte:

              Meine beschreibbare Variable auf "Number" geändert und trotzdem kein einschalten

              Stimmt der Datentyp ?

              log('Typ Grenzwert: ' + typeof gwElevation);
              
              W 1 Reply Last reply Reply Quote 0
              • W
                webseb79 @paul53 last edited by

                @paul53

                Jetzt ist Grenzwert Typ "Number" und Elevation auch Typ "Number"

                paul53 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @webseb79 last edited by

                  @webseb79 Dann sollte es funktionieren. Wie sieht das komplette Skript jetzt aus ?

                  W 1 Reply Last reply Reply Quote 0
                  • W
                    webseb79 @paul53 last edited by webseb79

                    @paul53

                    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

                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @webseb79 last edited by

                      @webseb79 sagte:

                      Wie schon erwähnt ... Typ String und alles lief.

                      Ein Stringvergleich (im Trigger) dürfte Probleme machen (bei negativen Werten).

                      W 1 Reply Last reply Reply Quote 0
                      • W
                        webseb79 @paul53 last edited by

                        @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ändert

                            valLe: -0.5,  
                            oldValGt: -0.5, 
                        auf
                        
                            valLe: idElevation,  
                            oldValGt: idElevation, 
                        

                        Wie kann ich die feste vergebene Zahl nun flexibel über Vis steuern?

                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @webseb79 last edited by

                          @webseb79 sagte:

                          Wie kann ich die feste vergebene Zahl nun flexibel über Vis steuern?

                          Zusätzlich:

                          on(idt3, function(dp) {
                             idElevation = dp.state.val;
                          });
                          
                          W 1 Reply Last reply Reply Quote 0
                          • W
                            webseb79 @paul53 last edited by

                            @paul53

                            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

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @webseb79 last edited by

                              @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.

                              W 1 Reply Last reply Reply Quote 0
                              • W
                                webseb79 @paul53 last edited by

                                @paul53

                                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.

                                paul53 1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 @webseb79 last edited by

                                  @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.

                                  W 1 Reply Last reply Reply Quote 0
                                  • W
                                    webseb79 @paul53 last edited by

                                    @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 Paul53

                                    Danke Sebastian

                                    1 Reply Last reply Reply Quote 0
                                    • paul53
                                      paul53 last edited by

                                      Vorschlag:

                                      const idGrenzwert = 'javascript.0.Zeiten.Treppenlicht.Elevation';
                                      const idElevation = "javascript.0.Global.Sonnenstand.Elevation"/*Global.Sonnenstand.Elevation*/;
                                      
                                      createState(idGrenzwert, -0.5, {type: 'number', unit: '°'});
                                      
                                      var gwElevation = parseFloat(getState(idGrenzwert).val);
                                      on(idGrenzwert, function(dp) {
                                         gwElevation = parseFloat(dp.state.val);
                                      });
                                      
                                      on(idElevation, function(dp) {
                                         if(dp.state.val <= gwElevation && dp.oldState.val > gwElevation) {
                                            // Aktion bei Unterschreiten Grenzwert
                                         }
                                         if(dp.state.val >= gwElevation && dp.oldState.val < gwElevation) {
                                            // Aktion bei Überschreiten Grenzwert
                                         }
                                      });
                                      
                                      W 1 Reply Last reply Reply Quote 0
                                      • W
                                        webseb79 @paul53 last edited by

                                        @paul53

                                        Vielen Dank Paul53 !
                                        Ich glaube wir hätten die ganze Sache schon viel früher lösen können mit deinem Vorschlag.
                                        Ich muss auch sagen das du richtig gut im Stoff stehst was Javascript angeht.
                                        Ich lese ja ziemlich viel hier mit Tag täglich und du bist eigentlich bei vielen Lösungen mit present.
                                        Mach weiter so.

                                        Danke

                                        Sebastian

                                        paul53 1 Reply Last reply Reply Quote 0
                                        • paul53
                                          paul53 @webseb79 last edited by

                                          @webseb79 sagte:

                                          Ich glaube wir hätten die ganze Sache schon viel früher lösen können mit deinem Vorschlag.

                                          Das Sonnenstandsskript musste auch für den richtigen Datenpunkttyp korrigiert werden.

                                          1 Reply Last reply Reply Quote 0
                                          • First post
                                            Last post

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          739
                                          Online

                                          31.8k
                                          Users

                                          80.0k
                                          Topics

                                          1.3m
                                          Posts

                                          3
                                          31
                                          1431
                                          Loading More Posts
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          The ioBroker Community 2014-2023
                                          logo