[DzVents] Changement d'IP publique avec création automatique du device
Publié : 23 févr. 2018, 10:51
Après avoir rédigé un script en LUA pour être informer de son changement d'ip publique, j'ai regardé plusieurs scripts sur le forum officiel et je suis tombé sur un plugin python qui devait faire la même chose. (malheureusement il ne marche pas chez moi).
dans ce post il y a à la septième page, un script DZVents m'a donné envie de le tester.
Après l'avoir testé avec succès donc, je me suis mis en tète de l'améliorer car je trouvais dommage d'utiliser un fichier temporaire pour récupérer l'adresse publique via le site https://ifcfg.me/ utilisé par Emme le créateur du script et Manjh celui qui l'a légèrement modifié et proposé sur le thread du plugin python.
Du coup, dans mon élan pour améliorer encore un peu ce script, je me suis amusé à créer le device automatiquement au premier lancement pour simplifier encore plus l'utilisation.
J'ai aussi ajouté un test simple de validation de l'adresse IP résultant de la requête afin de limiter les faux positifs.
vous devez stocker le script sous le nom Wan-IP-checker.lua dans le répertoire domoticz/scripts/dzVents/scripts
Le script est exécuté toutes les 30 minutes (modifiable) et va :
1. créer un nouveau custom device de type text si un hardware correspondant existe (Dummy (Does nothing, use for virtual switches only)) ce n'est pas immédiat attendre au moins les 30 premières minutes avant de s’inquiéter
2. récupérer votre adresse IP publique actuelle et la stocker dans le device text auto créé (il faudra attendre 30 minutes supplémentaires pour que le device se mette à jour)
3. la comparer à l'IP précédente
4. vous envoyer un message d'avertissement si les deux adresses sont différentes via les notifications domoticz et mettre à jour le device text avec la nouvelle adresse
dans ce post il y a à la septième page, un script DZVents m'a donné envie de le tester.
Après l'avoir testé avec succès donc, je me suis mis en tète de l'améliorer car je trouvais dommage d'utiliser un fichier temporaire pour récupérer l'adresse publique via le site https://ifcfg.me/ utilisé par Emme le créateur du script et Manjh celui qui l'a légèrement modifié et proposé sur le thread du plugin python.
Du coup, dans mon élan pour améliorer encore un peu ce script, je me suis amusé à créer le device automatiquement au premier lancement pour simplifier encore plus l'utilisation.
J'ai aussi ajouté un test simple de validation de l'adresse IP résultant de la requête afin de limiter les faux positifs.
vous devez stocker le script sous le nom Wan-IP-checker.lua dans le répertoire domoticz/scripts/dzVents/scripts
Le script est exécuté toutes les 30 minutes (modifiable) et va :
1. créer un nouveau custom device de type text si un hardware correspondant existe (Dummy (Does nothing, use for virtual switches only)) ce n'est pas immédiat attendre au moins les 30 premières minutes avant de s’inquiéter
2. récupérer votre adresse IP publique actuelle et la stocker dans le device text auto créé (il faudra attendre 30 minutes supplémentaires pour que le device se mette à jour)
3. la comparer à l'IP précédente
4. vous envoyer un message d'avertissement si les deux adresses sont différentes via les notifications domoticz et mettre à jour le device text avec la nouvelle adresse
Code : Tout sélectionner
--[[
Stocker le script sous le nom Wan-IP-checker.lua dans le répertoire domoticz/scripts/dzVents/scripts
script originel : Emme (Milano, Italy) https://www.domoticz.com/forum/viewtopic.php?t=14489
modifié légèrement par Manjh http://www.domoticz.com/forum/viewtopic.php?f=65&t=16266&start=120#p171957
modifié par papoo (22/02/2018) pour suppression de l'utilisation du fichier temporaire, test de l'adresse IP résultante de la requête et création du device text si inexistant
Le script est exécuté toutes les 30 minutes (modifiable) et va :
1. créer un nouveau custom device de type text si un hardware correspondant existe (Dummy (Does nothing, use for virtual switches only)) ce n'est pas immédiat attendre au moins les 30 premières minutes avant de s’inquiéter
2. récupérer votre adresse IP publique actuelle et la stocker dans le device text auto créé
3. la comparer à l'IP précédente
4. vous envoyer un message d'avertissement si les deux adresses sont différentes via les notifications domoticz et mettre à jour le device text
documentation DzVents : https://www.domoticz.com/wiki/DzVents:_next_generation_LUA_scripting
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/Wan-IP-checker.lua
https://pon.fr/dzvents-changement-dip-publique/
--]]
return {
active = true,
on = {
timer = {
'every 30 minutes'
--'every minute'
},
logging = { -- La section de journalisation facultative vous permet de remplacer le paramètre de journalisation globale de dzVents
-- comme défini dans Configuration> Paramètres> Autre> Système d'événements> Niveau de journalisation dzVents.
-- Cela peut être pratique lorsque vous voulez que ce script ait une journalisation de débogage étendue pendant que le reste de votre script s'exécute en mode silencieux.
level = domoticz.LOG_ERROR, -- domoticz.LOG_INFO, domoticz.LOG_MODULE_EXEC_INFO, domoticz.LOG_DEBUG or domoticz.LOG_ERROR, domoticz.LOG_FORCE,
marker = '[WAN IP]'
},
httpResponses = {
'trigger' -- doit correspondre au callback passé à la commande openURL ne pas modifier si vous ne savez pas ce que vous faite
}
},
execute = function(domoticz, item)
--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------
local devName = 'Adresse IP publique'
local location = 'test RPI2' -- votre information de localisation: utilisé dans le sujet du message d'avertissement
local domoticzURL = 'http://127.0.0.1:8080'
local curl = '/usr/bin/curl -m 5 ' -- chemin vers curl
--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local script = 'Wan-IP-checker'
local version = '1.2'
local devIP = domoticz.devices(devName)
local getIP = 'https://4.ifcfg.me/'
local actIP = ''
local info = ''
local testIP = ''
if (item.isTimer) and devIP then -- si le device existe on exécute normalement le script
domoticz.log(script..' Version : '..version)
local currIP = devIP.text
info = assert(io.popen(curl..getIP))
actIP = info:read('*all')
info:close()
domoticz.log('Adresse IP résultante : '..actIP)
-- test validité adresse IP
local chunks = {actIP:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}
if (#chunks == 4) then
for _,v in pairs(chunks) do
if (tonumber(v) < 0 or tonumber(v) > 255) then
domoticz.log('Adresse IP résultante invalide')
testIP = false
end
end
domoticz.log('Adresse IP résultante valide')
testIP = true
else
domoticz.log('Adresse IP résultante invalide')
testIP = false
end
-- fin test validité adresse IP
if actIP == nil or testIP == false then
actIP = 'Impossible de récupérer l\'adresse IP publique'
elseif actIP ~= currIP and testIP == true then
msgTxt = 'L\'IP publique a changé : '..currIP..' ==> '..actIP
domoticz.log(msgTxt)
domoticz.notify('Attention! Changement d\'IP publique : '..location, msgTxt, domoticz.PRIORITY_EMERGENCY)
devIP.updateText(actIP)
else
domoticz.log('Adresse précédente : '..currIP)
domoticz.log('Pas de changement d\'adresse IP publique')
end
elseif (item.isTimer) and devIP == nil then-- si le device n'existe pas tente de trouver l'IDX du Hardware dummy
domoticz.openURL({
url = domoticzURL .. '/json.htm?type=hardware',
method = 'GET',
callback = 'trigger', -- voir httpResponses ci-dessus.
})
domoticz.log('Timer event')
end
if (item.isHTTPResponse) and devIP == nil then -- si le device n'existe pas on créé le device text
if (item.statusCode == 200) then
if (item.isJSON) then
domoticz.log('Fichier JSON détecté')
local jsonValeur = domoticz.utils.fromJSON(item.data)
for Index, Value in pairs( jsonValeur.result ) do
if Value.Type == 15 then -- hardware dummy = 15
id = Value.idx
domoticz.log('L\'ID du hardware Dummy est : '..id)
end
end
if id ~= nil then
os.execute(curl..'"'.. domoticzURL ..'/json.htm?type=createdevice&idx='..id..'&sensorname='..domoticz.utils.urlEncode(devName)..'&sensormappedtype=0xF313"')
domoticz.log('création du nouveau device text')
end
end
else
domoticz.log('Un problème est survenu lors de la gestion de la demande', domoticz.LOG_ERROR)
domoticz.log(item, domoticz.LOG_ERROR)
end
end
end
}