ID – zrób to sam

Inteligentny dom stworzony własnymi rękami

Skrypty

4. “cisza nocna”

Skrypt, który napiszemy będzie pozwalał na wprowadzenie do naszego systemu możliwości określenia tzw. ciszy nocnej w określonych godzinach. Takie rozwiązanie pozwoli np. na automatyczne wyłączanie urządzeń w określonych godzinach, wyłączenie wysyłania powiadomień, lub automatyczne ściemnianie światła o określonej godzinie.

Na początku należy utworzyć 5 zmiennych (obiektów):
moje.config.cisza_nocna (bool) – jeśli true to cisza nocna aktywna
moje.config.cisza_nocna_od (string) – godzina od kiedy ma obowiązywać cisza nocna
moje.config.cisza_nocna_do (string) – godzina do kiedy ma obowiązywać cisza nocna
moje.config.czisza_nocna_do_pom (string) – zmienna pomocnicza
moje.config.czisza_nocna_do_pom (string) – zmienna pomocnicza

W kolejnym kroku należy utworzyć skrypt w folderze CRON i nazwać go 1m co będzie odpowiadać zdarzeniom wykonywanym co 1 minutę.

//Deklarujemy niezbędne obiekty i zmienne
var czas_od = new Date();
var czas_do = new Date();
var t1, t2;

//skrypt będzie wykonywał się co 1 minutę
schedule('* * * * *', function () {

    //wywołanie funkcji z kodem, którego będziemy używać w kilku miejscach
    ciszaNocna();

    //jeżeli cisza nocna jest nieaktywna to zapisz obliczone daty i godziny do zmiennych pomocniczych
    if (getState("moje.config.cisza_nocna").val === false) {
        setState("moje.config.czisza_nocna_do_pom", czas_do.toString());
        setState("moje.config.czisza_nocna_od_pom", czas_od.toString());
    }

    //pobranie zapisanych dat i godzin ze zmiennych pomocniczych
    var czas_od_calc = new Date(getState("moje.config.czisza_nocna_od_pom").val);
    var czas_do_calc = new Date(getState("moje.config.czisza_nocna_do_pom").val);

    //jeżeli cisza nocna jest nieaktywna to... 
    if (getState("moje.config.cisza_nocna").val == false) {
        //sprawdź czy jesteśmy w godzinach ciszy nocnej
        if (compareTime(czas_od_calc.getTime(), czas_do_calc.getTime(), "between")) {
            setState("moje.config.cisza_nocna", true);
        }
    } else {
        //sprawdź czy nie jesteśmy w godzinach ciszy nocnej
        if (compareTime(czas_od_calc, czas_do_calc, "not between")) {
            setState("moje.config.cisza_nocna", false);
        }
    }
});

//Jeżeli wprowadzimy zmiany godzin podczas trwania ciszy nocnej zostaną one automatycznie uwzględnione
on({ id: 'moje.config.cisza_nocna_od', change: 'ne' }, function (obj) {
    ciszaNocna();
    //aktualizacja zmiennych o nowe daty
    setState("moje.config.czisza_nocna_do_pom", czas_do.toString());
    setState("moje.config.czisza_nocna_od_pom", czas_od.toString());

});
on({ id: 'moje.config.cisza_nocna_do', change: 'ne' }, function (obj) {
    ciszaNocna();
    //aktualizacja zmiennych o nowe daty
    setState("moje.config.czisza_nocna_do_pom", czas_do.toString());
    setState("moje.config.czisza_nocna_od_pom", czas_od.toString());

});

function ciszaNocna() {
    //ustawienie daty początkowej
    czas_od = new Date();
    czas_do = new Date();
    
    //Pobieramy z obiektów wartości z ustawionymi godzinami
    t1 = getState("moje.config.cisza_nocna_od").val;
    t2 = getState("moje.config.cisza_nocna_do").val;

    //jeżeli zmienne są puste (nie ma ustawionych godzin) to przerwij skrypt
    if (t1 === null || t2 === null)
        return;

    //rozbijamy ustawione godziny na poszczególne składniki (godzina, minuty i sekundy)
    var at1 = t1.split(":");
    var at2 = t2.split(":");

    //Zapisuje date i czas dla ustawionych godzin
    czas_od.setHours(at1[0]);
    czas_od.setMinutes(at1[1]);
    czas_od.setSeconds(at1[2]);

    czas_do.setHours(at2[0]);
    czas_do.setMinutes(at2[1]);
    czas_do.setSeconds(at2[2]);


    //Jeżeli godzina "od" jest większa od godziny "do" oznacza to, że godzina "do" jest w kolejnym dniu
    //Jeżeli godzina "od" jest równa 0 (północ) to godzina "do" musi być w kolejnym dniu
    //Jeżeli godziny "od" i "do" są równe, ale minuty "od" są większe od minut "do" to godzina "do" jest w kolejnym dniu
    if (Number(at1[0]) > Number(at2[0]) || Number(at1[0]) === 0 || (Number(at1[0]) == Number(at2[0]) && Number(at1[1]) > Number(at2[1]))) {
        //dodanie do daty i czasu "do" 1 dnia
        czas_do.setDate(czas_do.getDate() + 1);
    }
}

Aby móc korzystać z ciszy nocnej musimy mieć możliwość ustawiania godzin tej ciszy. Najwygodniejszą opcją będzie wizualizacja.

Otwieramy edytor wizualizacji i nasz projekt Projekt1. Przechodzimy do widoku Glowny i z lewej strony wyszukujemy widgetu Input Datetime

Przeciągamy go na ekran roboczy i następnie szukamy widgetu html, który posłuży nam za pole etykiety.

Zaznaczamy widget html i z prawej strony okna w polu HTML: wpisujemy Od:. Następnie zaznaczamy widget Input Datetime i w polu Object ID wybieramy moje.config.cisza_nocna_od i zaznaczamy opcję Time only. Zaznaczamy oba widgety, kopiujemy i zmieniamy ich właściwości dla zmiennej moje.config.cisza_nocna_do.

Aby wiedzieć czy cisza nocna jest aktywna dodamy odpowiednią ikonkę.
Szukamy widgetu image

W polu source wskazujemy na ikonkę o adresie /icons-icons8/others/color/Adware Free.png i zaznaczamy opcję Stretch abyśmy mogli zmieniać rozmiar obrazka. Następnie rozwijamy belkę Visibility i w polu Object ID wyszukujemy zmiennej moje.config.cisza_nocna. Pole condition zostawiamy bez zmian (==) a w polu Value for condition wpisujemy true. Powyższe ustawienia spowodują, że obrazek będzie widoczny tylko kiedy zmienna moje.config.cisza_nocna będzie miała wartość true.

Jeżeli wszystko ustawiliśmy dobrze to w przypadku aktywnej ciszy nocnej powinniśmy mieć taki widok

ZOSTAW ODPOWIEDŹ

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *