NEWS


  • Hey,

    wie baue ich eine IF-Abfrage auf, die folgendes prüfen soll:

    es ist eine Startstunde für Tagbetrieb und eine für Nachtbetrieb gegeben.
    nun soll geprüft werden ob ein Wert innerhalb des Tagbereiches liegt oder im Nachtbereich

    ein:

    if (Wert>=TagStartStunde && Wert < Nachtstartstunde){reaktion}
    
    

    funktioniert nur bedingt, da der Übergang nach 23 Uhr auf 0 Uhr hier mit einfließt.
    Wenn der Wert bspw. 15 ist bei Nachtstart 2 und Tagstart 10, stimmt zwar die erste Teilbedingung, aber die zweite nicht.

    Nehme ich stattdessen eine ODER Verknüpfung springt er zwar bei allen Werten richtig in die Bedingung (auch für Wert = 1 bspw.), aber wenn (warum auch immer) Tag und Nachtstart vertauscht wären, also Tagstart bei 2 liegt und Nachtstart bei 10 würde Wert 18 die IF-Bedingung (mit ODER) erfüllen, obwohl bei 18 schon Nacht wäre.

    Hat jemand eine Idee oder gar fertige Logik um das korrekt zu prüfen?

    Grüße

    Stephan


  • @BigStephan da gabe es schon mal ein Script für. Hier mal ein Link dazu. Funktion: Prüfen, ob innerhalb eines Zeitfensters

    ich hatte das mal für meine Weihnachtsbeleuchtung um eine Schaltzeit erweitert.

    var von1 = getState('javascript.0.Variablen.Schaltzeit_on_1').val; // '06:00:00'
    var bis1 = getState('javascript.0.Variablen.Schaltzeit_off_1').val;
    var von2 = getState('javascript.0.Tageszeit.Sonnenuntergang').val;
    var bis2 = getState('javascript.0.Variablen.Schaltzeit_off_2').val;
    
    function main() {
    function currentDate() {
        var d = new Date();
        return new Date(d.getFullYear(), d.getMonth(), d.getDate());
    }
    function addTime(strTime) {
        var time = strTime.split(':');
        var d = currentDate();
        d.setHours(time[0]);
        d.setMinutes(time[1]);
        d.setSeconds(time[2]);
        return d;
    }
    function isTimeInRange(strLower, strUpper) {
        var now = new Date();
        var lower = addTime(strLower);
        var upper = addTime(strUpper);
        var inRange = false;
        if (upper > lower) {
            // opens and closes in same day
            inRange = (now >= lower && now <= upper) ? true : false;
        } else {
            // closes in the following day
            inRange = (now >= upper && now <= lower) ? false : true;
        }
        return inRange;
    }
    if (isTimeInRange(von1, bis1) || isTimeInRange(von2, bis2))
        {if (getState('scene.0.Licht_X-Mas_innen').val === false) {
            setState('scene.0.Licht_X-Mas_innen', true);
            }
    }
    else{
        setState('scene.0.Licht_X-Mas_innen', false);
        }
    }
    schedule("*/1 * * * *", main);
    main();
    

  • oder die interne funktion

    if(isAstroDay()){
    
    }
    

    //Returns true if the current time is between the astro sunrise and sunset.
    Link Text
    die prüft zwar nur auf Sonnenaufgang und untergang aber im link steht weiter unten wie man mit einem offset arbeitet.
    viele grüße


  • @BigStephan: Versuche es mal so:

    if(TagStartStunde < Nachtstartstunde) {
       if(Wert >= TagStartStunde && Wert < Nachtstartstunde) {reaktion}
    } else {
       if(Wert >= TagStartStunde || Wert < Nachtstartstunde) {reaktion}
    }
    

  • OK Danke.
    Habs mit der verschachtelten IF Funktion hinbekommen!

    Grüße

    Stephan


  • @BigStephan sagte:

    Habs mit der verschachtelten IF Funktion hinbekommen!

    Dann markiere bitte das Thema in der Überschrift als [gelöst].

Suggested Topics

1.8k
Online

38.4k
Users

43.8k
Topics

612.3k
Posts