Page 1 sur 1

Notification multi-user

Publié : 04 juil. 2020, 19:31
par pierrotori
Bonjour
Comment gérez vous les notifications multi utilisateurs ?
Par exemple que dans certains scripts toute la famille reçoive un sms sans que ce soit inscrit en dur dans le script
Bonne soiree
Pierrotori

Re: Notification multi-user

Publié : 13 juil. 2020, 21:33
par pierrotori
Bon j’ ai cree plusieurs fichiers pour gérer en fonction des scripts et des users les types de message
Je me bats avec les fonctions de lecture de fichiers dzvents et les séparateurs je vous tiens au courant

Re: Notification multi-user

Publié : 08 sept. 2020, 19:36
par pierrotori
Voici le script qui monte 2 fichiers en RAM via la fonction file_ram
j'ai donc trouvé comment lire les fichiers via une fonction, je partage donc la solution

Je viens lire un fichier de notification alimenté par les scripts et en fonction des 2 fichiers des paramétrages je peux envoyer des infos à plusieurs membre de la famille
fichiers des notifications
notifications_script avec cette structure -> script;type;message
fichiers paramétrages
script_user.txt" avec cette structure -> y/n;script;user
user_notification.txt" avec cette structure -> user;channel;command

Code : Tout sélectionner

-- Authors  ----------------------------------------------------------------
-- v1.0 pierrotori 20200909 Notification

local scriptName        = 'NOTIFICATION'
local scriptVersion     = '1.0'

local f_dry_run = 'Y'                -- (Y) pour tester commandes sans activer sms
local f_notification = "N"           -- (Y) Active les f_notifications, (N) les désactive 
local SubSystem = domoticz.NSS_HTTP  --[[ Systèmes de f_notification disponibles :
                        NSS_GOOGLE_CLOUD_MESSAGING NSS_HTTP NSS_KODI NSS_LOGITECH_MEDIASERVER NSS_NMA NSS_PROWL NSS_PUSHALOT NSS_PUSHBULLET NSS_PUSHOVER NSS_PUSHSAFER
                        Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule et entourez l'ensemble par des {}.
                        Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}
                        --]]
local message = '.'

return {
	active = true,
	on = {
	timer = { 'every minutes' }
	},
    logging = {
        -- level = domoticz.LOG_INFO,   -- Seulement un niveau peut être actif; commenter les autres
        -- level = domoticz.LOG_ERROR,
        level = domoticz.LOG_DEBUG,
        -- level = domoticz.LOG_MODULE_EXEC_INFO,
        marker = scriptName..' v'..scriptVersion
    },

execute = function(dz)

    local function file_ram(file_trt)
		
		record_file = {}								-- Table pour les lignes du fichier
		local file = io.open(file_trt, "r")          	-- Ouvre le fichier en mode lecture
		line = {}						 				-- Table pour les lignes du fichier
		for line in file:lines() do 					-- Pour chaque lignes
			table.insert(record_file, line) 			-- On insère les lignes dans la table
		end
		return record_file
		
	end -- function
	
	local par1 = 0
	local par2 = 0
	local par3 = 0
	--fichier et chemin pour sms
	local dir_notif="/tmp/"
	local notif_script="notification_script.txt"
	local dir_file="/home/pi/domoticz/exploit_file/"
	local script_user="script_user.txt"
	local user_channel="user_channel.txt"

	-- PROGRAM STARTS
	dz.log('============== NOTIFICATION ==================', dz.LOG_INFO)
	-- fichiers de parametrages
	if dz.helpers.file_exists(dir_file..script_user) ~= nil then par1=1 end
	if dz.helpers.file_exists(dir_file..user_channel) ~= nil then par2=1 end
	-- si un existe pas alors pb
	if par1==0 or par2==0 then
		dz.log('Notification:Probleme de paramétrage', dz.LOG_DEBUG)
	else
		if dz.helpers.file_exists(dir_notif..'tmp.'..notif_script) ~= nil 
		then
			-- reprise
			dz.log('Reprise fichier notification', dz.LOG_DEBUG)
			par3=1
		else 
			if 	dz.helpers.file_exists(dir_notif..notif_script) ~= nil 
			then
				-- on traite le fichier des messages
				dz.helpers.file_move(dir_notif..notif_script, dir_notif..'tmp.'..notif_script)
				par3=1
			end
		end
	end
	-- on traite les messages	
	if par3==1 then
		-- on monte les fichiers parametrage en ram
		-- parametrage script user
		local record_script = {}
		record_script = file_ram(dir_file..script_user)
		-- parametrage user chanel
		local record_user = {}
		record_user = file_ram(dir_file..user_channel)

		-- lecture fichier des notifications
		local f_notif = io.open(dir_notif..'tmp.'..notif_script, "r") -- Ouvre le fichier en mode lecture
		local r_notif = {}					 			-- Table pour les lignes du fichier
		local l_notif = {}								-- Table pour les lignes du fichier
		for l_notif in f_notif:lines() do 					-- Pour chaque lignes
			-- dz.log('notification:'..l_notif, dz.LOG_DEBUG)
			r_notif = dz.utils.stringSplit(l_notif,";")
			j = 0
			local r_script = {}					 		-- Table pour les lignes du fichier
			-- lecture fichier param script_user
			for j,line_script in ipairs(record_script) do
				if line_script:find(r_notif[1]) ~= nil then
					-- recheche si user parametre pour script
					r_script = dz.utils.stringSplit(line_script,";")
					if r_script[1] == 'y' then
						-- lecture fichier param user_channel
						i = 0
						local r_user = {}				-- Table pour les lignes du fichier
						for i,line_user in ipairs(record_user) do
							--dz.log('script:'..r_notif[1]..' user:'..r_script[3], dz.LOG_DEBUG)
							--dz.log(line_user, dz.LOG_DEBUG)
							--dz.log(line_user:find(r_script[3]), dz.LOG_DEBUG)
							if line_user:find(r_script[3]) ~= nil then
								-- recherche channel pour user
								r_user = dz.utils.stringSplit(line_user,";")						
								if f_dry_run == 'Y' 
								then
									dz.log('script:'..r_notif[1], dz.LOG_DEBUG)
									dz.log('user:'..r_script[3], dz.LOG_DEBUG)
									dz.log('command:'..r_user[3], dz.LOG_DEBUG)
									dz.log('message:'..r_notif[3], dz.LOG_DEBUG)
									msg=dz.helpers.urlEncode(r_notif[3])
									os.execute('curl -s -i -k "'..r_user[3]..msg..'"')
								end
							end
						end
					end
				end
			end
		end
	end
end -- execute
} -- return

Le script permet donc de traiter des messages en fonction d'un fichier alimenté par les scripts
La question est que lorsque que je génère un message dans le fichier des notifications, comment je peux gérer l'accès au fichier si 2 scripts y accèdent en même Temps?