Page 1 sur 6

[LUA] Script Jour férié

Publié : 11 oct. 2015, 18:34
par fredclo
Bonjour,

pour ceux qui n'auraient pas vu mon post sur le forum officiel de domoticz, je le poste ici aussi.

Le but est d'obtenir une variable dans domoticz qui prend la valeur true si jour férié et false si jour normal. C'est plus que pratique pour mes programmes (un bouton virtuel est week-end-jourférié ON ou OFF selon le jour et ainsi tout est facilement automatisable comme les volets le matin dans la chambre, la radio le matin...). Car les volets qui s'ouvrent le matin à 7h00 avec la radio qui hurle quand on est un jour férié c'est pas WAF du tout !!
Le plus dur est de trouver les jours de pâques.
Le mérite revient entièrement à audibert qui met son script jour pâque sur site :
http://gurau-audibert.hd.free.fr/josdbl ... rs-feries/

Dans une console, avec nano créer dans /scripts/lua : script_time_jf.lua

Listing--------------------------------------------------------------------------------------

Code : Tout sélectionner

commandArray = {}
-- Retourne le jour de Pâques au format epoch
-- annee : année (Integer) dont on désire connaître le jour de Pâques (ex : 2014)
-- La fonction n'effectue le calcul que si l'année a changée depuis son dernier appel
GetJourPaquesAnnee=0      -- Variable globale (année du dernier calcul) pour ne pas recalculer le jour de Pâques à chaque appel
GetJourPaquesEpochPaque=0 -- Variable globale (jour de Pâques au format epoch) pour ne pas recalculer le jour de Pâques à chaque appel
time = os.date("*t")
if((time.min == 5) and (time.hour == 0)) then
function GetJourPaques(annee)
  if(GetJourPaquesAnnee~=annee or GetJourPaquesEpochPaque==0) then
    local a=math.floor(annee/100)   -- donne 20 pour 2015
    local b=math.fmod(annee,100)    -- donne 15 pour 2015
    local c=math.floor((3*(a+25))/4)  -- donne 33 pour 20
    local d=math.fmod((3*(a+25)),4)   -- donne 3 pour 20
    local e=math.floor((8*(a+11))/25)
    local f=math.fmod((5*a+b),19)
    local g=math.fmod((19*f+c-e),30)
    local h=math.floor((f+11*g)/319)
    local j=math.floor((60*(5-d)+b)/4)
    local k=math.fmod((60*(5-d)+b),4)
    local m=math.fmod((2*j-k-g+h),7)
    local n=math.floor((g-h+m+114)/31)
    local p=math.fmod((g-h+m+114),31)
    local jour=p+1
    local mois=n
    GetJourPaquesAnnee=annee
    GetJourPaquesEpochPaque=os.time{year=annee,month=mois,day=jour,hour=12,min=0}
  end
  return GetJourPaquesEpochPaque
end

-- Retourne true si le jour courant est un jour férié
-- Le calcul des jours férié n'est fait qu'un fois par an (ou si la Vera reboot)
JourFerieAnnee=0  -- Variable globale (année du dernier calcul) pour ne pas recalculer le tableau à chaque appel
JourFerieTab = {} -- Variable globale (tableau des jours fériés) pour ne pas recalculer le tableau à chaque appel
function JourFerie()
  local today=os.date("%m-%d")
  local annee=tonumber(os.date("%Y"))
  if(annee~=JourFerieAnnee) then
    JourFerieAnnee=annee
    -- Dates fixes
    JourFerieTab["01-01"] = true -- 1er janvier
    JourFerieTab["05-01"] = true -- Fête du travail
    JourFerieTab["05-08"] = true -- Victoire des alliés
    JourFerieTab["07-14"] = true -- Fête nationale
    JourFerieTab["08-15"] = true -- Assomption
    JourFerieTab["11-01"] = true -- Toussaint
    JourFerieTab["11-11"] = true -- Armistice
    JourFerieTab["12-25"] = true -- Noël
    -- Dates variables
    local epochPaques=GetJourPaques(annee)
    JourFerieTab[os.date("%m-%d",epochPaques)] = true             -- Pâques
    JourFerieTab[os.date("%m-%d",epochPaques+24*60*60)] = true    -- Lundi de Pâques = Pâques + 1 jour
    JourFerieTab[os.date("%m-%d",epochPaques+24*60*60*39)] = true -- Ascension = Pâques + 39 jours
    JourFerieTab[os.date("%m-%d",epochPaques+24*60*60*49)] = true -- Pentecôte = Ascension + 49 jours
  end
  return JourFerieTab[today] -- (nldr : Both nil and false make a condition false)
end

-- print(JourFerie())
-- jf=(JourFerie())
-- print (jf)

if JourFerie() == true
then
commandArray['Variable:jf'] = 'true'
else
commandArray['Variable:jf'] = 'false'
end
end
return commandArray
end listing----------------------------------------------------------------------

Ajouter dans domoticz la variable jf as string, et vous aurez la variable jf true ou false selon qu'à 00h05 c'est un jour férié ou pas (exécution qu'une fois par jour à 00h05)

fredclo

Re: script Jour férié

Publié : 11 oct. 2015, 20:58
par patrice
Bonsoir
sinon dans le style il y ahttp://domogeek.entropialux.com/static/doc/index.html qui rend énormement de services et qui est une tres belle API facilement interrogeable.

Mais il n'a pas le calcul de Paques, juste si c'est vacances scolaires ou pas mais aussi plein d'autres trucs
A voir donc,

Re: script Jour férié

Publié : 11 oct. 2015, 23:05
par fredclo
domogeek est arrêté faute de financement, je crois.

Par contre, pour être complet, le source est téléchargeable pour l'héberger chez soi. Je n'ai pas réussi l'install sur mon RPi, la faute à Python que je ne sais pas installer complètement (pb de sécurité ssl...).
Je n'ai pas insisté puisque mon prg me suffit. Mais en regardant le source rapidement, j'ai cru voir qqchose qui ressemblait au calcul des jours de pâques...

Re: script Jour férié

Publié : 13 nov. 2015, 20:02
par jule1986
Bonjour,
Merci beaucoup pour ce script, pensez vous qu'il est possible de rajouter les vacances scolaire comme l'auteur original en parle sur son site ?
Si oui comment adapter son script pour qu'il soit compatible avec domoticz ? il faut insérer le code dans le même script ou en faire un autre ?

Merci d'avance pour vos réponse.

Re: script Jour férié

Publié : 13 nov. 2015, 20:17
par fredclo
bonsoir
je n'ai pas regardé le source de domogeek (l'auteur original dont vous parlez ? si oui, ce n'est pas lui sur ce script), mais je suppose que c'est saisi à la main.

donc il suffit de saisir dans le script les dates voulues (en bas là où il y a les dates)
fred

Re: script Jour férié

Publié : 14 nov. 2015, 08:57
par jule1986
Non je parle de l'auteur original de ce script : http://gurau-audibert.hd.free.fr/josdbl ... rs-feries/

Mais son script n'est pas pour domoticz a la base... (Merci pour la retranscription :D )

Re: script Jour férié

Publié : 14 nov. 2015, 09:52
par fredclo
ah ok ! j'avais pas vu comme j'ai pas d'enfant et suis pas fonctionnaire, les vacances scolaires je connais pas.
mais la réponse reste la meme comme vous voyez dans le script d'origine : saisir les dates dans la 2 eme partie du script

fred

Re: script Jour férié

Publié : 02 déc. 2015, 17:16
par fratton
Bonne idée de script, ce qui me gène, c'est d'utiliser un script_time, donc exécuter toute les minutes, pour quelques chose que l'on a besoin de faire qu'une fois par jour, même si la mise à jour n'a lieu qu'une fois à 0h05.
Pour éviter cela, on peut faire un interrupteur virtuel avec une planification à "On" à 0h05 et Off à 0h06 et appeler le script lua dans la config de l'interrupteur. Mais cela ajoute encore des chose à domoticz, qui sur un Raspberry Pi n'est pas très économique en terme de de ressource.

J'ai donc recréer le script en PHP, qui à l'avantage de disposer d'une fonction easter_date() qui donne le jour de Pâques.

Code : Tout sélectionner

<?php
date_default_timezone_set('Europe/Paris');

// Domoticz IP:PORT
$IPPORT="192.168.1.100:8080";
// Variable utilisateur Domoticz à mettre à jour
$VARIABLE="JOUR_FERIE";


$ferie="NON";

$aujourdhui=date("d/m/Y");
$paques  = easter_date(date("Y"));
$pD  = date("j", $paques);
$pM = date("n", $paques);
$pY = date("Y", $paques);

$lundi_de_paques=date("d/m/Y",mktime(0, 0, 0, $pM, $pD + 1,  $pY));
$ascension=date("d/m/Y",mktime(0, 0, 0, $pM, $pD + 39, $pY));
$pentecote=date("d/m/Y", mktime(0, 0, 0, $pM, $pD + 49, $pY));
$lundi_de_pencote=date("d/m/Y", mktime(0, 0, 0, $pM, $pD + 50, $pY));

if (
        $aujourdhui=="01/01/".date("Y")         // Jour de l'an : 1er janvier
        or $aujourdhui=="01/05/".date("Y")      // Fête du travail : 1er mai
        or $aujourdhui=="08/05/".date("Y")      // Victoire des alliés 1945 : 8 mai
        or $aujourdhui=="14/07/".date("Y")      // Fête nationale : 14 juillet
        or $aujourdhui=="15/08/".date("Y")      // Assomption : 15 août
        or $aujourdhui=="01/11/".date("Y")      // Toussaint : 1er novembre
        or $aujourdhui=="08/11/".date("Y")      // Armistice de 1918 : 11 novembre
        or $aujourdhui=="25/12/".date("Y")      // Noël : 25 décembre
        or $aujourdhui==$paques                 // Pâques
        or $aujourdhui==$lundi_de_paques        // Lundi de pâques : pâques + 1 jour
        or $aujourdhui==$ascension              // L'Ascension  : pâques + 39 jours
        or $aujourdhui==$pentecote              // La pentecôte : pâques + 49 jours
        or $aujourdhui==$lundi_de_pencote       // Lundi de pentecôte : pâques + 50 jours
        ) {

        $ferie="OUI";
} else {
        $ferie="NON";
};

$majdomoticz="http://".$IPPORT."/json.htm?type=command&param=updateuservariable&vname=".$VARIABLE."&vtype=2&vvalue=".$ferie;

echo file_get_contents($majdomoticz);

?>
Ensuite l'appel par un cron à 0h01 :

Code : Tout sélectionner

1 0 * * * php5 -n /home/pi/domoticz/scripts/php/jours_feries.php > /tmp/jours_feries.log 2>&1

Re: script Jour férié

Publié : 02 déc. 2015, 17:31
par vil1driver
tu sais que dans un script_time tu peux définir une heure de lancement ?

Code : Tout sélectionner

time = os.date("*t")

-- Trigger at 00:10 
if (time.hour == 0 and time.min == 10) then

Re: script Jour férié

Publié : 02 déc. 2015, 17:35
par fratton
Attention, en réalité, tu ne définis pas l'heure de lancement, tu lance le script lua toutes les minutes et dans ce script tu test l'heure, ce n'est pas la même chose.