[DzVents] Changement d'IP publique avec création automatique du device

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.
Répondre
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

[DzVents] Changement d'IP publique avec création automatique du device

Message par papoo »

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

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
}

domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
totof60
Messages : 373
Inscription : 29 avr. 2016, 09:31

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par totof60 »

Comme d'habitude avec les scripts de papoo ça fonctionne du premier coup et toujours bien documentés . Merci

Juste une petite question : pour choisir le service de notification je suppose que c'est la ligne suivante qu'il faut modifier ?

Code : Tout sélectionner

domoticz.notify('Attention! Changement d\'IP publique : '..location, msgTxt, domoticz.PRIORITY_EMERGENCY)
Mais comment imposer un service au lieu de tous ?

j'ai essayé cette syntaxe mais sans succés :

Code : Tout sélectionner

domoticz.notify('Attention! Changement d\'IP publique : '..location, msgTxt, domoticz.PRIORITY_EMERGENCY, domoticz.NSS_PUSHOVER)
Edit: la bonne syntaxe :

Code : Tout sélectionner

domoticz.notify(subject, message, priority, sound, extra, subsystem)
"Extra" est le l'appareil sur lequel la notification sera reçue
exemple:

Code : Tout sélectionner

domoticz.notify('Attention! Changement d\'IP publique : '..location, msgTxt, domoticz.PRIORITY_EMERGENCY,'','iphonechris', domoticz.NSS_PUSHOVER)
Dernière modification par totof60 le 23 févr. 2018, 14:38, modifié 2 fois.
Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par papoo »

peut être comme cela
https://www.domoticz.com/forum/viewtopic.php?p=140227
dis nous si tu réussi
je vais essayer de mon coté
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
totof60
Messages : 373
Inscription : 29 avr. 2016, 09:31

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par totof60 »

Oui c'est bon j’étais en train d’éditer mon message ;)

tiré du wiki :
notify(subject, message, priority, sound, extra, subsystem): Function. Send a notification (like Prowl). Priority can be like domoticz.PRIORITY_LOW, PRIORITY_MODERATE, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_EMERGENCY. For sound see the SOUND constants below. subsystem can be a table containing one or more notification subsystems. See domoticz.NSS_xxx types
Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par papoo »

j'arrive à n'envoyer qu'a pushbullet
avec la commande

Code : Tout sélectionner

domoticz.notify('test notification pushbullet ', "message test", domoticz.PRIORITY_EMERGENCY,'','',domoticz.NSS_PUSHBULLET)
j'ai seulement ajouté
' ',' '
sans espace

entredomoticz.PRIORITY_EMERGENCY et ,domoticz.NSS_PUSHBULLET

le premier ' ' sert apparemment pour definir un son de notification
le deuxième ' ' sert apparemment pour envoyer a un seul device paramétré dans le système de notification choisi (exemple 'smartphone')
par contre je n'ai pas trouvé comment n'envoyer les notifications que sur telegram

Code : Tout sélectionner

domoticz.NSS_TELEGRAM
ne fonctionne pas
Dernière modification par papoo le 13 mai 2018, 17:13, modifié 1 fois.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
totof60
Messages : 373
Inscription : 29 avr. 2016, 09:31

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par totof60 »

telegram ne semble pas être dans la liste

Code : Tout sélectionner

NSS_GOOGLE_CLOUD_MESSAGING, NSS_HTTP, NSS_KODI, NSS_LOGITECH_MEDIASERVER, NSS_NMA,NSS_PROWL, NSS_PUSHALOT, NSS_PUSHBULLET, NSS_PUSHOVER, NSS_PUSHSAFER: for notification subsystem
Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par papoo »

la syntaxe pour les notifications
NSS_GOOGLE_CLOUD_MESSAGING
NSS_HTTP
NSS_KODI
NSS_LOGITECH_MEDIASERVER
NSS_NMA
NSS_PROWL
NSS_PUSHALOT
NSS_PUSHBULLET
NSS_PUSHOVER
NSS_PUSHSAFER
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par papoo »

tu as été plus rapide que moi
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
totof60
Messages : 373
Inscription : 29 avr. 2016, 09:31

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par totof60 »

Le site : https://4.ifcfg.me semble hors service

Celui ci fonctionne en ce moment : http://whatismyip.akamai.com/
A remplacer à la ligne 53 du script

Code : Tout sélectionner

 local getIP         = 'http://whatismyip.akamai.com/'
Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Changement d'IP publique avec création automatique du device

Message par papoo »

Merci totof60 pour l'url de substitution
petite info, les notifications telegram fonctionnent désormais avec DZVents depuis les dernières mises à jour bêta
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
Répondre