[DzVents] Script de présence... encore :)

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

[DzVents] Script de présence... encore :)

Message par Neutrino »

Bonjour à tous,
Je partage ce script qui permet tester la présence d'un appareil sur votre réseau.
Il est aussi possible de tester une adresse IP externe pour tester la connexion Internet par exemple.
Il se base sur la table ARP de votre serveur hébergeant Domoticz doublé d'un ping.

Testé avec des appareils connectés sur wifi et ethernet, ce script fonctionnait sur ma Freebox v5 et fonctionne sur ma Livebox v4.
Galaxy S7 et 8, iPad et autres périphériques wifi exotiques ( xiaomi gateway, esp8266...) sont bien détectés.

Il faut d'abord créer les interrupteurs virtuels (dummy) correspondant à vos appareils.
Le script est à placer dans ~/domoticz/scripts/dzVents/scripts .

ARPing.lua

Code : Tout sélectionner

--[[
	Prerequisits
	==================================
	Domoticz v3.8837 or later (dzVents version 2.4 or later)

	Scan ARP + ping
	
-- Authors  ----------------------------------------------------------------
	V1.0 - Neutrino
	
]]--
-- Variables to customize --------------------------------------------------

local fetchIntervalMins = 1 --  Délais entre interrogations 

--Tableau des périphériques à interroger
-- ping['adresse IP']={'Interrupteur virtuel',0} 
local ping = {}
	ping['192.168.15.2']={'Zbox',0}
	ping['192.168.15.38']={'Galaxy S8',0}
	ping['192.168.15.36']={'Galaxy S7',0}
	ping['192.168.15.1']={'miniK9',0}
	ping['192.168.15.33']={'iPad',0}
	ping['192.168.15.37']={'SmartTv',0}
	ping['192.168.15.4']={'Tardis',0}
	ping['192.168.15.14']={'Reboot',0}
	ping['9.9.9.9']={'Internet',0} -- Test Internet

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

local scriptName = 'ARPing'
local scriptVersion = '1.0'

return {
	active = true,
	logging = {
		--level = domoticz.LOG_DEBUG, -- Uncomment to override the dzVents global logging setting
		marker = scriptName..' '..scriptVersion
	},
	on = {
		timer = {
			'every '..tostring(fetchIntervalMins)..' minutes',
		},
	},

	execute = function(domoticz, item)
		local arp = {} -- Table pour les lignes du fichier

		if (domoticz.utils.fileExists("/proc/net/arp"))then
			local file = io.open("/proc/net/arp", "r") -- Ouvre le fichier en mode lecture
			local ligne = {} -- Table pour les lignes du fichier

			for line in file:lines() do -- Pour chaque lignes
				table.insert(arp, line) -- On insère les lignes dans la table
			end


			i =0
			for i,r in pairs(arp) do
				switch = arp[i]:sub(1,arp[i]:find(" ")-1) --Extraction des IP de la table ARP
				if(ping[switch]~=nil)then -- IP recherchée
					if arp[i]:find("0x2")~=nil then --Flag 0x2 => IP connue sur le réseau, connectée
						domoticz.log("arp success "..ping[switch][1], domoticz.LOG_DEBUG)
						ping[switch][2]=1 -- flag pour mise à On
					else
						--Adresse IP connue mais déconnectée
						domoticz.log("arp fail "..ping[switch][1], domoticz.LOG_DEBUG)
						ping[switch][2]=2 -- Flag pour mise à Off
					end 
				end
			end
			for ip, switch in pairs(ping) do
				os.execute('ping -c10 -W1 '..ip..' &') -- lancement d'un ping sur les IP à tester pour forcer la MAJ ARP
				if(switch[2]==1)then
					domoticz.log(ip..' '..switch[1]..' On actuellement '..domoticz.devices(switch[1]).state, domoticz.LOG_DEBUG)
					if (domoticz.devices(switch[1]).state=='Off')then
						domoticz.devices(switch[1]).switchOn()
					end
				elseif(switch[2]==2)then
					domoticz.log(ip..' '..switch[1]..' Off actuellement '..domoticz.devices(switch[1]).state, domoticz.LOG_DEBUG)
					if (domoticz.devices(switch[1]).state=='On')then
						domoticz.devices(switch[1]).switchOff()
					end
				else
					--@IP non trouvée dans le fichier ARP
					--On le ping à l'ancienne
					domoticz.log("IP "..ip.." non trouvée dans ARP", domoticz.LOG_DEBUG)
					if os.execute('ping -c1 -W1 '..ip) then
						domoticz.log("Ping "..ip.." "..switch[1].." On actuellement "..domoticz.devices(switch[1]).state, domoticz.LOG_DEBUG)
						if (domoticz.devices(switch[1]).state=='Off')then
							domoticz.devices(switch[1]).switchOn()
						end
					else
						domoticz.log("IP injoignable "..switch[1].." Off actuellement "..domoticz.devices(switch[1]).state, domoticz.LOG_DEBUG)
						if (domoticz.devices(switch[1]).state=='On')then
							domoticz.devices(switch[1]).switchOff()
						end
					end
				end
			end
		else
			domoticz.log('Erreur lecture fichier arp', domoticz.LOG_ERROR)
		end
	end
}
J'en suis pleinement satisfait, alors je partage :)
Amusez-vous bien ;)
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
cyberbob
Messages : 511
Inscription : 28 nov. 2016, 19:43
Localisation : Belgique

Re: [DzVents] Script de présence... encore :)

Message par cyberbob »

Merci pour ton partage.
Est-ce que cela fonctionne sur d'autres box que la Freebox et livebox, Comme par exemple la Bbox 3 ?
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: [DzVents] Script de présence... encore :)

Message par Neutrino »

cyberbob a écrit : 23 sept. 2018, 17:11 Merci pour ton partage.
Est-ce que cela fonctionne sur d'autres box que la Freebox et livebox, Comme par exemple la Bbox 3 ?
A mon avis, oui. Je ne vois pas pourquoi ça ne fonctionnerai pas.
Reste plus qu'à tester ;)
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
cyberbob
Messages : 511
Inscription : 28 nov. 2016, 19:43
Localisation : Belgique

Re: [DzVents] Script de présence... encore :)

Message par cyberbob »

Oui il faut tester comme tu dis.
Car la Bbox 3 de proximus ne donne pas accès a leur api et leur paramétrage est assez limité.
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: [DzVents] Script de présence... encore :)

Message par Dim33 »

Bonjour,

Le script semble tourner correctement avec une Freebox V6. Merci à Neutrino, une fois de plus.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
fabd
Messages : 100
Inscription : 11 janv. 2016, 10:14

Re: [DzVents] Script de présence... encore :)

Message par fabd »

Je fais remonter le topic.

Je suis completement nouveau sur ce language. J'ai fait un simple copié collé du contenu dans le repertoire qui va bien, mais comment on lui dit de l'executer ?
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: [DzVents] Script de présence... encore :)

Message par Wolfen38 »

fabd a écrit : 26 août 2019, 13:51 Je fais remonter le topic.

Je suis completement nouveau sur ce language. J'ai fait un simple copié collé du contenu dans le repertoire qui va bien, mais comment on lui dit de l'executer ?
Il se lance tout seul toutes les minutes

Au début du script, tu as

Code : Tout sélectionner

local fetchIntervalMins = 1 --  Délais entre interrogations
Si tu veux toutes les 2 minutes, tu remplaces 1 par 2
fabd
Messages : 100
Inscription : 11 janv. 2016, 10:14

Re: [DzVents] Script de présence... encore :)

Message par fabd »

Je precise : j'ai activé dzvents dans les options avec les logs tres tres verbeuses
fabd
Messages : 100
Inscription : 11 janv. 2016, 10:14

Re: [DzVents] Script de présence... encore :)

Message par fabd »

En mettant dzvents en verbeux, je vois apparaitre plein de log concernant des scripts "exemples". Ca se melange avec le script de neutrino. Je vais voir pour les déplacer et je reviens :)
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: [DzVents] Script de présence... encore :)

Message par Wolfen38 »

perso je suis en error+minimal+generic
Répondre