speedtest interrogation

Forum dédié à l'accès à DomoticZ depuis l'extérieur de chez vous : routage de ports, VPN, VPS ...
La sécurité, c'est important !!
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

speedtest interrogation

Message par pierrotori »

Bonjour

je voulais mettre en place le speedtest pour monitorer mon internet

je vois que speedtest-cli n'est plus opérationnel et que le plugin speedtest a aussi des problème de fonctionnement
J'ai donc fait des test en script lua et je vois aussi que d'appeler speedtest dans le script dépasse les 10 secondes d'exécution

cela m'oblige donc à scheduler un shell dans le crontab , ce que je ne voulais plus faire en terme de traitement fonctionnel
De plus ma domotique tournant sur un RPI2 je serais limité à 100Mo via le port éthernet

Est-ce la seule solution ?
Bonne soirée
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: speedtest interrogation

Message par Keros »

Le principe étant de transférer un gros fichier et regarder le temps nécessaire, un P2 avec une connexion 100M, c'est à mon avis court.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

Re: speedtest interrogation

Message par pierrotori »

Oui du coup je le ferais bien de mon nas le fichier
Sinon sur le rpi2 via dzvents ca dure plus de 10secondes l’execution du test
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: speedtest interrogation

Message par Neutrino »

On peut faire de l'asynchrone avec dzvents.
Ça marche plutôt bien.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

Re: speedtest interrogation

Message par pierrotori »

Tu fais comment pour executer la commande os.exécute en asynchrone ?
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: speedtest interrogation

Message par Keros »

J'en parle dans les petits guides qui sont dans ma présentation : https://easydomoticz.com/forum/viewtopi ... 672#p84672
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: speedtest interrogation

Message par Neutrino »

Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

speedtest interrogation

Message par pierrotori »

Merci a tous els 2 pour le shell asynchrone je lis ca et je mets en place

par contre je fais un sed dans le dzvents et il est en erreur
os.execute("sudo grep 'Latency:' "..dir_speed..speed_file.." |sed 's/\"s\"+/;/g' > "..dir_speed..speed_tmp)

je fais en shell sed 's/\s\+/;/g' qui permet de remplacer le premier caractère du zone avec des espaces avec un ; mais en dzvents le \ ne passe pas et j'ai cette erreur : 2022-12-01 17:23:28.064 /home/pi/domoticz/scripts/dzVents/scripts/t_speedtest.lua:70: invalid escape sequence near '" |sed s/\s'

Avez vous une idée ? j'ai essayé avec une " aprèds le \ mais rien y fait, je n'ai plus d'erreur mais ca ne fait le job
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: speedtest interrogation

Message par Neutrino »

Essaye avec un double antislash au lieu d'un seul antislash devient
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

Re: speedtest interrogation

Message par pierrotori »

je m'en rappelais plus, merci
vérifier l'architecture dans mon cas armhf avec

Code : Tout sélectionner

dpkg --print-architecture
telecharger speedtest dans un repertoire à partir du lien https://www.speedtest.net/fr/apps/cli et ajouter les autorisation d'execution
tout fonctionne sans timeout en asynchrone, voici le code

Code : Tout sélectionner

-- Authors  ----------------------------------------------------------------
-- https://www.domoticz.com/forum/viewtopic.php?f=21&t=13814
-- v1.0 pierrotori 20220212 transformation shell en dzvents

local scriptName        = 'SPEEDTEST'
local scriptVersion     = '1.0'

local download_idx 	= 251 	-- idx du dummy custom 
local upload_idx	= 252	-- idx du dummy custom
local ping_idx	    = 253 	-- idx du dummy custom

local f_dry_run = 'N'                -- (Y) pour tester le script de protection solaire sans activer réellement le store
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 hour' },
		shellCommandResponses = { 'speedtestsh' },
		customEvents = { 't_speedtest' }
	},
	
    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,item)
    
	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
	
	--fichier et chemin por resultat
	local dir_speed="/temp/"
	local speed_file="speedtest.txt"
	local speed_tmp="speedtest_new.txt"
	local nbre=0
	
	-- PROGRAM STARTS
	dz.log('============== SPEEDTEST ==================', dz.LOG_INFO)
	if item.isTimer then
		dz.log('Déclenchement timer', dz.LOG_DEBUG)
		dz.executeShellCommand(
		{
        command = "sudo /home/pi/speedtest/speedtest --accept-gdpr > "..dir_speed..speed_file,
        callback = 'speedtestsh',
        timeout = 20                      
		}
		)
	elseif item.isCustomEvent then
		dz.log('Déclenchement CustomEvents', dz.LOG_DEBUG)
		dz.executeShellCommand(
		{
        command = "sudo /home/pi/speedtest/speedtest --accept-gdpr > "..dir_speed..speed_file,
        callback = 'speedtestsh',
        timeout = 20                      
		}
		)
	elseif (item.isShellCommandResponse) then
        if (item.statusCode==0) then
            dz.log('Déclenchement shell asynchrone', dz.LOG_DEBUG)
			-- specifique de la command il faut mettre une " apres le \
			os.execute("sudo grep 'Latency:' "..dir_speed..speed_file.." |sed 's/\\s\\+/;/g' > "..dir_speed..speed_tmp)
			os.execute("sudo grep 'Download:' "..dir_speed..speed_file.." |sed 's/\\s\\+/;/g' >> "..dir_speed..speed_tmp)
			os.execute("sudo grep 'Upload:' "..dir_speed..speed_file.." |sed 's/\\s\\+/;/g' >> "..dir_speed..speed_tmp)
			-- lecture fichier des script a notifier
			-- on monte le fichier parametrage en ram
			local record_speed = {}
			record_speed = file_ram(dir_speed..speed_tmp)
			
			for k,line_speed in ipairs(record_speed) do
			
				r_speed = dz.utils.stringSplit(line_speed,";")
				nbre = nbre + 1
				dz.log('value:'..r_speed[2], dz.LOG_DEBUG)

				if r_speed[2] == "Latency:" then 
					dz.devices(ping_idx).updateCustomSensor(r_speed[3]) 
					message = "Latence:"..r_speed[3]
					end
				if r_speed[1] == "Download:" then 
					dz.devices(download_idx).updateCustomSensor(r_speed[2])
					message = message.." Download:"..r_speed[2]
					end
				if r_speed[1] == "Upload:" then 
					dz.devices(upload_idx).updateCustomSensor(r_speed[2]) 
					message = message.." Upload:"..r_speed[2]
				end

			end -- function

			if f_notification == "Y" then
				if SubSystem == nil then
					dz.notify('Info', message)
					dz.helpers.notify_general(scriptName,scriptName..';sms;'..message..';')
				else
					dz.notify('Info', message, '', '', '', SubSystem)
					dz.helpers.notify_general(scriptName,scriptName..';sms;'..message..';')
				end
			end			
        end
	else
		return
	end
end -- execute
} -- return
voici le resultat sur un RPI2 limité à 100Mo
speedtest.PNG
speedtest.PNG (14.99 Kio) Consulté 2896 fois
@keros ou @neutrino, peut-être je pourrais basculer ce topic dans les scripts Dzvents ?
Ma latence oscille entre 4 et 8ms
vous avez quoi comme latence en fibre ?
Répondre