Page 1 sur 4

[LUA] Sortir les poubelles

Publié : 14 avr. 2016, 18:43
par vil1driver
Salut,

juste un petit script pour m'avertir de sortir la poubelle et la bonne ;)
  • semaine impair = poubelle grise
  • semaine pair = poubelle jaune
j'utilise SmsGateway mais libre à vous d'utiliser le système de notification qui vous convient

Code : Tout sélectionner

--[[


name : script_time_poubelles.lua

ce script à pour but de déterminer si nous sommes en semaine pair ou impair
et fonction de cela, le jeudi en fin d'après midi,
de nous alerter par SMS de sortir la poubelle concernée.




--]]


-- Get day of a week at year beginning 
--(tm can be any date and will be forced to 1st of january same year)
-- return 1=mon 7=sun
function getYearBeginDayOfWeek(tm)
  yearBegin = os.time{year=os.date("*t",tm).year,month=1,day=1}
  yearBeginDayOfWeek = tonumber(os.date("%w",yearBegin))
  -- sunday correct from 0 -> 7
  if(yearBeginDayOfWeek == 0) then yearBeginDayOfWeek = 7 end
  return yearBeginDayOfWeek
end

-- tm: date (as retruned from os.time)
-- returns basic correction to be add for counting number of week
--  weekNum = math.floor((dayOfYear + returnedNumber) / 7) + 1 
-- (does not consider correctin at begin and end of year) 
function getDayAdd(tm)
  yearBeginDayOfWeek = getYearBeginDayOfWeek(tm)
  if(yearBeginDayOfWeek < 5 ) then
    -- first day is week 1
    dayAdd = (yearBeginDayOfWeek - 2)
  else 
    -- first day is week 52 or 53
    dayAdd = (yearBeginDayOfWeek - 9)
  end  
  return dayAdd
end
-- tm is date as returned from os.time()
-- return week number in year based on ISO8601 
-- (week with 1st thursday since Jan 1st (including) is considered as Week 1)
-- (if Jan 1st is Fri,Sat,Sun then it is part of week number from last year -> 52 or 53)
function getWeekNumberOfYear(tm)
  dayOfYear = os.date("%j",tm)
  dayAdd = getDayAdd(tm)
  dayOfYearCorrected = dayOfYear + dayAdd
  if(dayOfYearCorrected < 0) then
    -- week of last year - decide if 52 or 53
    lastYearBegin = os.time{year=os.date("*t",tm).year-1,month=1,day=1}
    lastYearEnd = os.time{year=os.date("*t",tm).year-1,month=12,day=31}
    dayAdd = getDayAdd(lastYearBegin)
    dayOfYear = dayOfYear + os.date("%j",lastYearEnd)
    dayOfYearCorrected = dayOfYear + dayAdd
  end  
  weekNum = math.floor((dayOfYearCorrected) / 7) + 1
  if( (dayOfYearCorrected > 0) and weekNum == 53) then
    -- check if it is not considered as part of week 1 of next year
    nextYearBegin = os.time{year=os.date("*t",tm).year+1,month=1,day=1}
    yearBeginDayOfWeek = getYearBeginDayOfWeek(nextYearBegin)
    if(yearBeginDayOfWeek < 5 ) then
      weekNum = 1
    end  
  end  
  return weekNum
end  

function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str	
end

----------------------------------------------------------------------


commandArray = {}



local time = string.sub(os.date("%X"), 1, 5)
local day = os.date("%A")

-- le jeudi soir à 18h30 et 20h30
if ( day == "Thursday" and (time == "18:30" or time == "20:30") ) then

	-- récupérer numéro de la semaine actuelle
	useDate = os.time()	-- os.time{year=2015,month=9,day=30} -- il est possible de préciser la date
	weekNum = getWeekNumberOfYear(useDate)

	-- semaine pair ou impair
	pair = weekNum%2 == 0

	--print(os.date("%A %d/%m/%Y",useDate)..": week number:"..tostring(weekNum))


	if pair then
		-- poubelle jaune
		msg = "n\'oublie pas de sortir la poubelle jaune"
	else
		-- poubelle grise
		msg = "n\'oublie pas de sortir la poubelle grise"
	end
	-- olivier
	commandArray[1]={['OpenURL']='http://192.168.22.70:41047/send.html?smsto=+33612345678&smsbody='..url_encode(msg)..'&smstype=sms'}
	-- delphine
	commandArray[2]={['OpenURL']='http://192.168.22.70:41047/send.html?smsto=+33687654321&smsbody='..url_encode(msg)..'&smstype=sms'}
	print(msg)
end



return commandArray 
http://easydomoticz.com/une-plateforme- ... omoticz-2/

Re: Sortir les poubelles

Publié : 16 avr. 2016, 19:16
par jacques68
Merci pour ce script!!! :D
Je mets en test

Re: Sortir les poubelles

Publié : 16 avr. 2016, 20:36
par jacques68
Test effectué avec succès. J'ai juste du modifie le format du numéro de tel en enlevant le 33 et remplacer par 0 et avoir le numéro commençant par 06
:lol:

Re: Sortir les poubelles

Publié : 18 avr. 2016, 18:56
par rimram31
Histoire de taquiner, os.date('%V') ça devrait marcher même sous dz non ?

Au début, j'ai pensé au date gnu mais finalement j'ai vu que '%V' était standard C. A ce propos, je n'ai appris que cette année que dans la norme, la 1ere semaine est celle ayant au moins 4 jours sur la nouvelle année, cette année c'est donc le 4 Janvier et donc 16 cette semaine.

Re: Sortir les poubelles

Publié : 18 avr. 2016, 20:09
par vil1driver
Idem pour l'histoire des 4 jours.. ;)

On arrête jamais d'apprendre :D

La source de mon script est la suivante et il est indiqué que le %V n'était plus fonctionnel, je n'ai pas testé du coups..

http://lua-users.org/wiki/WeekNumberInYear

Re: Sortir les poubelles

Publié : 21 avr. 2016, 22:33
par glut
Bonsoir,
De mon coté, j'avais réalisé ce script

Code : Tout sélectionner

-- script_time_semaine_paire.lua

local numero_du_jour_de_la_semaine = tonumber(os.date("%w"))
local numero_de_la_semaine = tonumber(os.date("%W"))
local numero_du_mois = tonumber(os.date("%m"))

commandArray = {}

time = os.date("*t")

if (time.hour == 19 and time.min == 00) then -- Mise à jour a 19:00
    
   -- dépôt du verre mercredi soir semaines paires --
    if math.fmod(numero_de_la_semaine, 2) == 0 then
        if numero_du_jour_de_la_semaine == 3 then
            commandArray['SendNotification'] = '#Ramassage du verre'
            commandArray['SendEmail'] = '#Ramassage du verre#xxx@gmail.com'
        end
    end

    -- dépôt des encombrants jeudi soir mois impairs --
    if math.fmod(numero_du_mois, 2) ~= 0 then
        if numero_du_jour_de_la_semaine == 4 then
            commandArray['SendNotification'] = '#Ramassage des encombrants'
            commandArray['SendEmail'] = '#Ramassage des encombrants#xxx@gmail.com'
        end
    end
end

return commandArray

Re: Sortir les poubelles

Publié : 24 avr. 2016, 17:58
par Grincheux
Merci pour le partage, en test.
J'ai pas tout compris mais quand les années ne commenceront pas 4 jours, il faudra modifier quelque chose ?

Re: Sortir les poubelles

Publié : 25 avr. 2016, 10:14
par vil1driver
La semaine qui comprend le 31 décembre et le 1er janvier est soit numérotée 01 soit 53..
Tout dépend du nombre de jour qu'elle compte dans la nouvelle année, la majorité l'emporte.

Non rien à modifier dans le script.

Re: Sortir les poubelles

Publié : 02 mai 2016, 19:54
par Grincheux
Merci Vil1driver pour l'explication et 1er mail reçu aujourd'hui, nickel tout a marché, madame apprécie pas trop mais moi j'adore ☺ Du coup c'est moi qui a sorti les poubelles :)

Re: Sortir les poubelles

Publié : 02 mai 2016, 21:16
par vil1driver
;)
bobjones62 a écrit : je n'ai encore jamais réalisé de Script lua.
J'ai recopié ton script sous Bloc-Notes en modifiant l'adresse IP par l'adresse IP de mon PI et le numéro de téléphone puis enregistré en UTF-8.
Le fichier je l'ai copié avec WinSCP dans le répertoire /home/pi/domoticz/scripts/lua

Maintenant je ne sais que faire pour l'utiliser
ahh ba c'est déjà pas mal :)

préfère notepad++ au simple bloc note.. tu verras c'est nettement plus puissant
tu peux même configurer winscp pour qu'un double clic sur un fichier te l'ouvre direct dans notepad++
à coups de ctrl+s pour valider chaque modif, les essais sont simplifiés

une fois les scripts dans le dossier lua, domoticz se charge de les lancer..

donc de ce côté là tu n'as rien à faire.

cependant, ce script utilise un système de notification spécifique que (je suppose) tu ne possèdes pas.
l'ip des 2 URL n'est pas celle de domoticz mais d'un serveur de SMS (lien de l'article en parlant en fin de tuto)

donc soit tu tentes d'installer SMS gateway,
soit tu vas donc devoir le modifier un petit peut en remplaçant ces URL pas la commande de notification classique (email)

Code : Tout sélectionner

commandArray['SendNotification']='Poubelles#'..url_encode(msg)..'#0'
ou

Code : Tout sélectionner

commandArray['SendEmail']='Poubelles#'..url_encode(msg)..'#your@email.com'
bien sure tu peux également adapter le jour et l'heure dans le code