Forum

Forum

Jak poznat, že je z...
 
Notifications
Clear all

Jak poznat, že je zítra státní svátek

5 Posts
3 Users
0 Reactions
364 Views
(@omicron-czech)
New Member
Joined: 2 years ago
Posts: 1
Topic starter  

Zdravím, už nějakou dobu se s tím trápím a pořád se mi nedaří. Už mě asi přepadla autorská slepota a potřeboval bych alespoň nakopnou správným směrem.

Mám do Configu importovaný kalendář státních svátků a uživatelský režim Svátek, který mi vrací 0/1 když není/je svátek. Pro správné spouštění uživatelských režimů potřebuji vědět, že státní svátek je zítra. Dnes opět manuálně nastavuji večerní režimy, tak jako mají být v pátek a v sobotu, protože zítra je svátek.

Máte někdo vytvořeno? Už opravdu nevím jak s tím pohnout. Za každou radu děkuji.

 



   
Quote
(@xxpeta)
Trusted Member
Joined: 7 years ago
Posts: 66
 

Já bych to řešil přes shelly ve kterém by běžel script, který vrátí do Loxone počet dní do nejbližšího svátku. Pak už to je v Loxone hračka. Mám takhle řešeno číslo týdne s posledním pátkem v měsíci kvůli popelnicím na papír.



   
ReplyQuote
(@kimot)
Estimable Member
Joined: 9 years ago
Posts: 104
 

@xxpeta 

Mohu se zeptat jak ze shelly dostanete, kdy je státní svátek?
Taky do něj píšu skripty, ale na takovou funkci jsem ještě nenarazil.
Napadá mne jedině, že si to bude to shelly odněkud stahovat nebo to v něm bude pro daný rok natvrdo nastavené.
Díky.


This post was modified 2 months ago by kimot

   
ReplyQuote
(@xxpeta)
Trusted Member
Joined: 7 years ago
Posts: 66
 

Zkoušel jsem script asi takhle. Je to bez zápisu do Loxone, ale logika chodí:

/**
 * Shelly script s OpenHolidays API
 * Automatická aktualizace každou půlnoc (00:01)
 */

function getNextHoliday() {
  let now = new Date();
  let year = now.getFullYear();
  let todayTs = new Date(year, now.getMonth(), now.getDate()).getTime();

  let url = "https://openholidaysapi.org/PublicHolidays?" +
            "countryIsoCode=CZ" +
            "&validFrom=" + year + "-01-01" +
            "&validTo=" + year + "-12-31" +
            "&languageIsoCode=CS" +
            "&subdivisionCode=CZ";

  console.log("Stahuji svátky pro rok " + year + "...");

  Shelly.call("HTTP.GET", { url: url, timeout: 15 }, function(res, error_code, error_msg) {
    if (error_code !== 0) {
      console.log("Chyba připojení: " + error_msg);
      scheduleNextRun(); // I při chybě naplánuje další pokus na zítra
      return;
    }

    if (!res.body || res.body.length < 10) {
      console.log("API vrátilo prázdnou odpověď.");
      scheduleNextRun();
      return;
    }

    let holidays = JSON.parse(res.body);
    let minDays = 999;
    let holidayName = "";

    for (let i = 0; i < holidays.length; i++) {
      let h = holidays[i];
      let hDate = new Date(h.startDate);
      let hTs = hDate.getTime();
      let diff = Math.ceil((hTs - todayTs) / 86400000);

      if (diff >= 0 && diff < minDays) {
        minDays = diff;
        if (h.name && h.name.length > 0) {
          holidayName = h.name[0].text;
        } else {
          holidayName = "Státní svátek";
        }
      }
    }

    if (holidayName !== "") {
      console.log("---------------------------------------");
      console.log("Nejbližší svátek: " + holidayName);
      console.log("Počet dní: " + minDays);
      console.log("---------------------------------------");
    } else {
      console.log("V tomto roce již žádné svátky nejsou.");
    }

    scheduleNextRun(); // Naplánuje spuštění na další den
  });
}

// Funkce pro plánování spuštění v 00:01
function scheduleNextRun() {
  let now = new Date();
  // Nastavíme cílový čas na dnešek 23:59:59 + 61 vteřin (tedy zítra 00:01)
  let tomorrow = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59);
  let msUntilMidnight = tomorrow.getTime() - now.getTime() + 61000;

  console.log("Další aktualizace za: " + Math.round(msUntilMidnight / 1000 / 60) + " minut.");
  
  Timer.set(msUntilMidnight, false, function() {
    getNextHoliday();
  });
}

// První spuštění hned po uložení
getNextHoliday();


   
ReplyQuote
(@kimot)
Estimable Member
Joined: 9 years ago
Posts: 104
 

@xxpeta 

Díky, takže jak jsem myslel.



   
ReplyQuote
Share: