Page 1 sur 4

speedtest interrogation

Publié : 01 déc. 2022, 18:59
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

Re: speedtest interrogation

Publié : 01 déc. 2022, 19:22
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.

Re: speedtest interrogation

Publié : 01 déc. 2022, 20:53
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

Re: speedtest interrogation

Publié : 01 déc. 2022, 20:57
par Neutrino
On peut faire de l'asynchrone avec dzvents.
Ça marche plutôt bien.

Re: speedtest interrogation

Publié : 01 déc. 2022, 21:00
par pierrotori
Tu fais comment pour executer la commande os.exécute en asynchrone ?

Re: speedtest interrogation

Publié : 01 déc. 2022, 21:04
par Keros
J'en parle dans les petits guides qui sont dans ma présentation : https://easydomoticz.com/forum/viewtopi ... 672#p84672

Re: speedtest interrogation

Publié : 01 déc. 2022, 21:06
par Neutrino

speedtest interrogation

Publié : 01 déc. 2022, 21:20
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

Re: speedtest interrogation

Publié : 01 déc. 2022, 23:29
par Neutrino
Essaye avec un double antislash au lieu d'un seul antislash devient

Re: speedtest interrogation

Publié : 02 déc. 2022, 00:12
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é 2892 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 ?