has been running for more than 10 seconds

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Rhum1x56
Messages : 40
Inscription : 05 nov. 2017, 18:05

has been running for more than 10 seconds

Message par Rhum1x56 »

Salut,
j'ai 2 script qui m'affiche sans arret ce message.
un script de bande passante. et un script de présence wifi/Bluetooth

le problème c'est que vue qu'il met trop longtemps a répondre pour la présence, mon 3 eme téléphone reste tout le temps présent même quand il n'est pas la.

j'ai pense remplacer mes téléphone par des ibeacons, mais je ne sais pas si c'est compatible android et a mon avis j'aurais le même problème. je réfléchi a mettre un clavier code zwave rfid, mais en attendant j'aimerais que je script fonctionne correctement.

Vaut il mieux faire 2 script et mettre uniquement 2 téléphone par script, car je dois ajouter un 4 eme téléphone. ou y a t'il une autre solution.

Code : Tout sélectionner

-- Title: script_time_ping.lua
-- Date:  14-07-2015

commandArray={}

debug=false

prefixe="(PING) "

local ping={}
local ping_success
local bt_success

ping[1]={'192.168.1.30', 'Motion Rhum1', 'TelephoneRhum1', '9C:E0:63:F1:82:40', 5}                 -- android
ping[2]={'192.168.1.31', 'Motion Lauriana', 'TelephoneLauriana', '68:FB:7E:E0:65:42', 5}   -- iphone
ping[3]={'192.168.1.33', 'Motion Invite', 'TelephoneMaman', '', 5}                 -- android

for ip = 1, #ping do
  
	f = assert (io.popen ("hcitool names "..ping[ip][4]))
    bt = f:read()
    if bt==nil then
		bt_success=false
		ping_success=os.execute('ping -c 1 -w 1 '..ping[ip][1])
  
    else
		bt_success=true
    end
    f:close()
  
	if ping_success or bt_success then
		if (debug==true) then
			print(prefixe.."ping success "..ping[ip][2])
		end
		if (otherdevices[ping[ip][2]]=='Off') then
			commandArray[ping[ip][2]]='On'
		end
		if (uservariables[ping[ip][3]]) ~= 1 then
			commandArray['Variable:'..ping[ip][3]]= tostring(1)
		end
	else
		if (debug==true) then
			print(prefixe.."ping fail "..ping[ip][2])
		end
		if (otherdevices[ping[ip][2]]=='On') then
			if (uservariables[ping[ip][3]])==ping[ip][5] then
				commandArray[ping[ip][2]]='Off'
			else
				commandArray['Variable:'..ping[ip][3]]= tostring((uservariables[ping[ip][3]]) + 1)
		  end
		end
	end
end

return commandArray
oredin
Messages : 68
Inscription : 31 août 2018, 19:13

Re: has been running for more than 10 seconds

Message par oredin »

Bonjour,

A priori, ce qui doit prendre le plus de temps est l'interrogation BT via hcitool puisque vous avez limité le ping à 1s.

En l'état, les seules solutions simples que je vois sont :
1. Ne pas faire l'interrogation BT
2. Limiter le nombre de téléphone à interroger en BT (essayez de tracer la durée des appels hcitool pour savoir combien de fois vous pouvez l'appeler en 10s sans oublier le temps du ping)

Une solution plus durable mais plus complexe serait de rendre asynchrone l'appel BT. Si c'était une requête HTTP, je vous aurais conseiller de regarder du côté de dzEvent mais, pour l'exécution d'une commande système, je ne vois pas de solution intégrée à DZ actuellement.

Bon courage !
Domoticz Beta - ZStickGen5 - RFP1000 - Alexa
433 : Sondes Oregon - Prises Chacon - Sonnette Chacon - VR Somfy RTS
ZW : Modules Qubino - HRT4/ASR
Rhum1x56
Messages : 40
Inscription : 05 nov. 2017, 18:05

Re: has been running for more than 10 seconds

Message par Rhum1x56 »

Mercin se n'est pas mon code, et je ne comprend pas tout dans ce code.
j'ai donc enlever le Bluetooth du telephone 1 qui est le mien car mon wifi est toujours actif. et j'ai laisser le Bluetooth de ma femme car elle le désactive sans arrêt.
je vais voir se que ca donne
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: has been running for more than 10 seconds

Message par lost »

oredin a écrit : 29 oct. 2018, 13:48 Une solution plus durable mais plus complexe serait de rendre asynchrone l'appel BT.
Interroger plusieurs tel avec la contrainte d'avoir un script qui finisse en moins de 10s, sinon le système d'event de Domoticz gueule, risque de ne pas fonctionner.

De plus, via un script time, on a un temps de réaction d'une minute. Ca peut être beaucoup pour changer un état d'alarme avant qu'on entre par exemple.

Cela peut se faire, mais plutôt via un service externe (écrit en python qui propose des imports BT par exemple) qui alimente (via l'API http JSON de Domoticz) des switch individuels de présence et un global.

Téléphones ou tags, ca ne changera pas la durée de scan BT... C'est juste qu'il faut faire cela en dehors de Domoticz. Je l'ai fait et ca fonctionne depuis plus de 2 ans, mais c'est délicat à intégrer pour un néophyte. Il y aurait sans doute moyen désormais de faire cela sous forme de plugin désormais (automatisant la création des switch etc) mais je n'ai pas le temps de m'y coller... Surtout que j'aime pas trop le python!
Rhum1x56
Messages : 40
Inscription : 05 nov. 2017, 18:05

Re: has been running for more than 10 seconds

Message par Rhum1x56 »

Je vasi regarder cote python, bonne idee.
j'ai une bonne portée wifi donc souvent dans le jardin je suis deja connecter, l'alarme est désactiver avant que j'arrive a la porte meme avec le delais d'une minute en script_time
oredin
Messages : 68
Inscription : 31 août 2018, 19:13

Re: has been running for more than 10 seconds

Message par oredin »

Bonjour,

Une autre option serait de réorganiser vos tests de la manière suivante :
- Tests wifi avec ping
- Si wifi OK, Update des devices correspondants
- Si KO, tests BT (uniquement des devices KO via wifi)
- Si BT OK, Update des devices correspondants

Lorsqu'aucun de vos téléphones n'est présent, vous aurez toujours le timeout dû au temps d'exécution du script. En revanche, ça devrait fiabiliser la détection de vos téléphones via wifi, au moins.

Bon courage !
Domoticz Beta - ZStickGen5 - RFP1000 - Alexa
433 : Sondes Oregon - Prises Chacon - Sonnette Chacon - VR Somfy RTS
ZW : Modules Qubino - HRT4/ASR
Répondre