Aller au contenu
jjacques68

Help api.get api.put

Recommended Posts

Bonjour à tous !

 

Je suis confronté à problème complètement délirent.

J'ai un bout de code qui veut pas fonctionner dans une scène alors qu'il fonctionne très bien dans une autre !!! :15:

 

voila le bout de code qui fonctionne très bien : (il met à jour le wakeUpTime d'un module)

local device = api.get("/devices")

for i,v in ipairs(device) do
	if device[i].id == 48 then
		local Value=api.get("/devices/"..device[i].id)
		Value.properties.wakeUpTime = 18000
		api.put("/devices/"..device[i].id, Value)    
	end
end

et voila celui qui ne fonctionne pas : (dans une autre scène, plus complexe, que j'ai simplifié pour le sujet...)

local device = api.get("/devices") --liste tous les devices

local typeDevice = {
  {type = "com.fibaro.remoteController", zwaveCompany = "ID-RF", 	  up = 0, maxTime = 0},
  {type = "com.fibaro.doorSensor",		 zwaveCompany = "Fibargroup", up = 1, maxTime = 64800},
  --je raccourcie la liste...
}

--pour tous les device
for i,v in ipairs(device) do
    
	-- filtre que les device à pile et visible
	if device[i].properties.wakeUpTime and device[i].visible == true then 
    	
		--pour tous les éléments de typeDevice
		for j,v in ipairs(typeDevice) do
      		
			--si le type et zwaveCompany sont identiques
			if device[i].type == typeDevice[j].type
				and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then
				
				local Value=api.get("/devices/"..device[i].id)
				Value.wakeUpTime = typeDevice[j].maxTime
				api.put("/devices/"..device[i].id, Value) ------> BLOQUE ICI !!!!

il me dit :

 

[DEBUG] 11:08:41: [1;31m2017-09-24 11:08:41.463993 [ fatal] Runtime error: [string " return function(composite, ret, encode, sta..."]:4: attempt to call global 'type' (a string value)

 

J'ai tout essayé et rien y fait...

 

merci pour vos conseils !!!!

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème c'est pas parce que tu utilises 2 fois la même variable v ???

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 24/09/2017 à 11:25, jjacques68 a dit :

attempt to call global 'type' (a string value)

 

Salut messieurs,

 

Ca viendrait pas plutot du type non ? Ce qui explquerait pourquoi dans ton 1er exemple cela fonctionne ;-)

 

avec un tostring non ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors j’ai tout essayé !!! Tostring to number...

 

et dans le premier exemple, c’est bien un chiffre que j’envoie et non une chaîne !!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Y a pourtant bien un "type" qu'il n' pas l'air d'aimer vu le retour lua.

 

je ne parle pas de la valeur que tu envoies, mais bien de device.type ou celui de typeDevice[j]

 

Dans ton 1er exemple, tu ne testes pas par type

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de faire l’essai en ajoutant cette condition dans mon premier exemple, et veux toujours rien savoir...

:(:(:( 

ça commence à m’enerver Se truc...

Partager ce message


Lien à poster
Partager sur d’autres sites

Voici exactement le code de ma première scène qui est quasi identique à ma seconde scene, alors la je pige plus...

 

local device = api.get("/devices")
local typeDevice = {
  {type = "com.fibaro.FGFS101", zwaveCompany = "Fibargroup", up = 1, maxTime = 20000},
}

for i,v in ipairs(device) do
  
if device[i].properties.wakeUpTime and device[i].visible == true then
    
    for j,v in ipairs(typeDevice) do 
      
      if device[i].type == typeDevice[j].type
        		and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then
      
        if device[i].properties.wakeUpTime ~= typeDevice[j].maxTime then
          
          if tonumber(typeDevice[j].up) == 1 then
          
			local Value=api.get("/devices/"..device[i].id)
			Value.properties.wakeUpTime = typeDevice[j].maxTime
			api.put("/devices/"..device[i].id, Value)    
        	print("ok")
            
          end
        end
      end
	end
end
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors la:-)

Envoyé de mon Nexus 5X en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

1ère scène :

Value.properties.wakeUpTime = 18000

2ème scène :

Value.wakeUpTime = typeDevice[j].maxTime

 

 

Cherché l'erreur :-)

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Ahah, j'ai relu lusieurs fois, je n'avais pas remarqué ;-)

 

l'oeil de lynx master ;-)

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourtant ça sautait aux yeux non ? ;)

 

 

	if device[i].properties.wakeUpTime and device[i].visible == true then 
    	
		--pour tous les éléments de typeDevice
		for j,v in ipairs(typeDevice) do
      		
			--si le type et zwaveCompany sont identiques
			if device[i].type == typeDevice[j].type
				and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then
				
				local Value=api.get("/devices/"..device[i].id)
				Value.wakeUpTime = typeDevice[j].maxTime
				api.put("/devices/"..device[i].id, Value) ------> BLOQUE ICI !!!!
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Il manque le .properties ?!

 

je pense que ça viens du copier coller... 

je vérifie ce soir, mais quasi sur qu’il est présent dans le code qui fonctionne pas.

 

si vous regarder le 3 eme code posté, qui est un clone de celui qui marche pas,  vous verrez...

et pourtant ce clone fonctionne...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon alors, que je le prévoyais, ".properties" est bien présent.

Donc désolé les gars, mais c'est pas ça :(

(je modifie le premier post pour ne pas tromper quelqu'un d'autre)

 

C'est désepérant...

Je poste la scène compléte qui bug (un peu long mais pas compliquée)

 

--[[
%% properties
%% events
%% globals
--]]

--[[
Scène qui met à jour les WakeUpTime des modules au maximum,
suivant les infos trouvés dans la notice
--]]

--décalration des variables*************************************************
local debug = true --true/false  variable pour afficher le debug
local simul = false --true/false   permet de simuler avant de modifier

local device = api.get("/devices/") --liste tous les devices
local texte = "" --texte pour le debug
local nbDevice = 0 --compteur de device à pile total
local nbDeviceUpdateOK = 0 --compteur de device mis à jour OK
local nbDeviceUpdateNOK = 0 --compteur de device mis à jour NOK
local nbDeviceOK = 0 --compteur de device OK
local nbDeviceNOK = 0 --compteur de device NOK

local typeDevice = {
  {type = "com.fibaro.remoteController", zwaveCompany = "ID-RF", 	  up = 0, maxTime = 0},
  {type = "com.fibaro.doorSensor",		 zwaveCompany = "Fibargroup", up = 1, maxTime = 64800},
  {type = "com.fibaro.FGMS001v2",		 zwaveCompany = "Fibargroup", up = 1, maxTime = 65535},
  {type = "com.fibaro.FGFS101",		 	 zwaveCompany = "Fibargroup", up = 1, maxTime = 18000},
  {type = "com.fibaro.thermostatDanfoss",zwaveCompany = "Danfoss", 	  up = 1, maxTime = 600},
  {type = "com.fibaro.FGMS001",			 zwaveCompany = "Fibargroup", up = 1, maxTime = 65535},
  {type = "com.fibaro.temperatureSensor",zwaveCompany = "Horstmann Controls Limited", up = 1, maxTime = 86400},
  {type = "com.fibaro.temperatureSensor",zwaveCompany = "Everspring", 				  up = 1, maxTime = 16056000},
  {type = "com.fibaro.motionSensor",	 zwaveCompany = "Philio Technology Corp", 	  up = 1, maxTime = 432000}
}

--fonction pour afficher le debug*******************************************
function afficheDebug(message, color, afficheDebug)
  if afficheDebug == true then
    if message and color then
      print("<font color = '"..color.."'>"..message.."</font>")
    else
      print("<font color = 'yellow'>afficheDebug : error</font>")
    end
  end
end

--MAIN**********************************************************************
--entête de debug
if simul == true then
  	afficheDebug("MODE SIMULATION : AUCUNE MODIFICATION EST APPLIQUEE.", "yellow", true)
end
afficheDebug("DEFINITIONS : id, name, wakeUpTime, type, zwaveCompany", "white", debug)

--pour tous les device
for i,v in ipairs(device) do
    
  	-- filtre que les device à pile et visible
	if device[i].properties.wakeUpTime and device[i].visible == true then 
    	
    	--pour tous les éléments de typeDevice
        for j,w in ipairs(typeDevice) do
      		
			--si le type et zwaveCompany sont identiques
			if device[i].type == typeDevice[j].type
        		and device[i].properties.zwaveCompany == typeDevice[j].zwaveCompany then
        
        		--récupère les infos du device
        		id = device[i].id
        		name = device[i].name
 				type = device[i].type    			
    			zwaveCompany = device[i].properties.zwaveCompany
        		
        		--construit le texte pour le debug
        		if debug == true then
        			texte=id..", "..name..", "..device[i].properties.wakeUpTime.." s, "..type..", "..zwaveCompany
          		end
        		
        		--si wakeUpTime différent de maxTime du tableau
        		if device[i].properties.wakeUpTime ~= typeDevice[j].maxTime then
    				afficheDebug(texte,"red", debug)
          			nbDeviceNOK=nbDeviceNOK+1  --inc compteur NOK
          		
					--si le champ UP est à 1 alors mise à jour
					if tonumber(typeDevice[j].up) == 1 then				
																
						--mise à jour du wakeUpTime avec valeur du tableau
						if simul == false then -- pas executée en mode simulation							
							local Value=api.get("/devices/"..device[i].id)
							Value.properties.wakeUpTime = typeDevice[j].maxTime
							api.put("/devices/"..device[i].id, Value)
						end
						fibaro:abort()
            
						--construit le texte pour le debug de mise à jour
						if debug == true then 
							texte="Device "..device[i].id.." ("..device[i].name..") wakeUpTime mis à jour avec "..typeDevice[j].maxTime.." s."          				
						end
					
						afficheDebug(texte, "orange", debug)          					
						nbDeviceUpdateOK=nbDeviceUpdateOK+1 --inc compteur update OK
					
					else --si pas de mise à jour demandée (up = 0)
						
						--construit le texte pour le debug de mise à jour
						if debug == true then 
							texte="Device "..device[i].id.." ("..device[i].name..") wakeUpTime non mis à jour."
						end
						
						afficheDebug(texte, "Magenta", debug)          					
						nbDeviceUpdateNOK=nbDeviceUpdateNOK+1 --inc compteur update	NOK
					end          			
          
          		else --sinon OK (wakeUpTime différent de maxTime du tableau)
          			afficheDebug(texte, "green", debug)
          			nbDeviceOK=nbDeviceOK+1  --inc compteur OK
          		end
        
        		nbDevice=nbDevice+1 --inc compteur device
			end
		end
	end
end

--affichage résultat
print("------------------------------")
afficheDebug("Total device détectés = "..nbDevice, "white", true)
afficheDebug("Total device OK = "..nbDeviceOK, "green", true)
afficheDebug("Total device NOK = "..nbDeviceNOK, "red", true)
afficheDebug("Total device mis à jour OK = "..nbDeviceUpdateOK, "orange", true)
afficheDebug("Total device mis à jour NOK = "..nbDeviceUpdateNOK, "Magenta", true)

On retrouve le api.put qui m....

Partager ce message


Lien à poster
Partager sur d’autres sites

J'AI TROUVE !!

 

enfin!!!!

p... de b... de m... c'était long !

ça vient pas du tout de mes api.put, api.get...

 

voilà ce qui est en défaut (présent dans le 2ème script et pas dans le 1er):

--récupère les infos du device
	id = device[i].id
	name = device[i].name
	type = device[i].type
	zwaveCompany = device[i].properties.zwaveCompany

la variable "type" qui est un mot clé réservé : type = device.type

 

J'ai remplacé par ceci :

idDev = device[i].id
nameDev = device[i].name
typeDev = device[i].type    			
zwaveCompanyDev = device[i].properties.zwaveCompany

et ça a marché du premier coup :) 

... ... pourri le debug lua !!!!

bref,

 

merci pour votre participation !

 

PS: question bête on peut réveiller un module sans avoir a se déplacer vers lui pour triple cliquer sur le bouton ?

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Felicitations. J'avais bien parlé du type :-)

Baisse le wakeuptime en lua non?

Envoyé de mon Nexus 5X en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

mouai...  ;) 

 

Le but de la scène sera de mettre les wakeuptime à leur maximum en une fois.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×