Aller au contenu

Erreur 503 suite json Hc2:put du panneau arrosage


Messages recommandés

Posté(e)

bonjour, j'ai mis en place l'année dernière le vd de lolomail sur Gestion des délais d'arrosage qui fonctionnait très bien.

entre temps je suis passé en 4.120 et en voulant remettre l'arrosage en service cette semaine j'ai retesté le module.

Je me suis retrouvé en erreur 503 j'ai du faire un recovry car plus possible d'acceder à la hc2.

Apres restauration complète , rebelotte après quelques heures de prise de tête , j'ai réussi a identifier d'ou provenais le problème en isolant a ligne

--response ,status, errorCode = HC2:PUT("/api/panels/drenchers", json); et la plus de problème erreur 503 ouf!!

Mais le module ne fonctionne plus , ci-joint le code idem tous les bouton

 

HC2 = Net.FHttp("127.0.0.1",11111)
response ,status, errorCode = HC2:GET("/api/panels/drenchers")
if tonumber(status) == 200 then
   jsonTable = json.decode(response)
   fibaro:debug("lecture "..response) 
else
    fibaro:debug("Status:" .. status .. " err: " .. errorCode )
end
-- change table in Lua for 0 hours delay
--jsonTable.rainDelay = 0
-- send back
json = json.encode(jsonTable)
--response ,status, errorCode = HC2:PUT("/api/panels/drenchers", json);
 fibaro:debug("ecriture "..json) 

 en utilisant le debug je m'apercois que la lecture et l’écriture sont différents ce qui devait bloquer la Hc2 en 503

Du coup je ne sais plus quoi faire. Quelqu'un a déjà eu un problème similaire avec le Json et le put ? 

Comment arriver a refaire fonctionner ce module très pratique .

merci de votre aide

 

 

ecriture.PNG

lecture.PNG

Posté(e)

Bonsoir, 

 

Essaie cela, j'ai mis le rainDelay à 2

A tester sans certitude

 

local reponse, status, errorCode = api.get("/api/panels/drenchers")
     if tonumber(status) == 200 then
         fibaro:debug("Lecture de REPONSE avant modification: " ..reponse)
         reponse.rainDelay = 2
         api.put("/api/panels/drenchers", reponse)
         fibaro:debug("Lecture de REPONSE après modification: " ..reponse)
     else
         fibaro:debug("Status : " ..status.. " - Erreur : "..errorCode)
     end

 

Posté(e)

Bonsoir pepite et merci

je vient de faire l'essai pas de plantage 503 mais erreur sur la ligne reponse.rainDelay = 2 => "attemp to index global 'reponse' (a nil value)

Posté(e)

Ah, bizarre ;-) je dois me tromper  ;-) 

 

tu as quelquechose dans le début pour "avant modification" ??

Tape ça dans un navigateur : 

 

http://IPHC2/api/panels/drenchers

 

Et copie colle le résultat stp

 

 

 

 

Posté(e)

A tester encore, je n'utilise pas le panneau d'arrosage ;-)

 

local json = api.get("/api/panels/drenchers")
fibaro:debug("Lecture de json.rainDelay avant modification: " ..json.rainDelay)
json.rainDelay = 2
fibaro:debug("json RainDelay : "..json.rainDelay)
api.put(api.put("/api/panels/drenchers", json)

 

Posté(e)
ca correspond bien a mes copie d'ecran de lecture
{"adjustWater":0,"rainDelay":6171,"cycles":1,"drenchers":[{"id":187,"name":"Haie Laurier","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":2,"minute":10,"duration":3}],"nextDrenching":0,"state":"false"},{"id":188,"name":"Bute","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":2,"minute":20,"duration":3}],"nextDrenching":0,"state":"false"},{"id":201,"name":"Pelouse Etendoir","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":2,"minute":30,"duration":5}],"nextDrenching":0,"state":"false"},{"id":202,"name":"Fleurs Etendoir","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":2,"minute":40,"duration":3}],"nextDrenching":0,"state":"false"},{"id":205,"name":"Pelouse Bassin","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":2,"minute":50,"duration":5}],"nextDrenching":0,"state":"false"},{"id":206,"name":"Haie Cloture","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":3,"minute":0,"duration":3}],"nextDrenching":0,"state":"false"},{"id":329,"name":"Cuisine","mode":"off","dead":"false","manualTime":0,"days":[],"cycles":[{"hour":3,"minute":10,"duration":2}],"nextDrenching":0,"state":"false"}]}
Posté(e)

Mets en forme le retour de ton json avec un plugin json viewer dans ton navigateur stp, ça simplifie la lecture. surtout que ton json est complexe :-). Tu vas voir ça change la vie ;-)

 

Que souhaites tu modifier alors ? 

Posté(e)

J'ai vue impeccable.

Je modifiais le raindelay mais cela fonctionnait nickel l'an passé, ils ont du changer qque chose nos amis de fibaro

{

  • adjustWater: 0,
  • rainDelay: 0,
  • cycles: 1,
  • drenchers: 
     
    [
    •  
      {
      • id: 187,
      • name: "Haie Laurier",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 2,
          • minute: 10,
          • duration: 3
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 188,
      • name: "Bute",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 2,
          • minute: 20,
          • duration: 3
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 201,
      • name: "Pelouse Etendoir",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 2,
          • minute: 30,
          • duration: 5
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 202,
      • name: "Fleurs Etendoir",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 2,
          • minute: 40,
          • duration: 3
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 205,
      • name: "Pelouse Bassin",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 2,
          • minute: 50,
          • duration: 5
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 206,
      • name: "Haie Cloture",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 3,
          • minute: 0,
          • duration: 3
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      },
    •  
      {
      • id: 329,
      • name: "Cuisine",
      • mode: "off",
      • dead: "false",
      • manualTime: 0,
      • days: [ ],
      • cycles: 
         
        [
        •  
          {
          • hour: 3,
          • minute: 10,
          • duration: 2
          }
        ],
      • nextDrenching: 0,
      • state: "false"
      }
    ]

}

Posté(e)

sur le second test encore une erreur ligne 3  'attempt to concatenate field 'raindelay'( a nil value)

iIl ne faut decoder le json afin de modifier un champs.

le problème de j'ai constaté c'est qu'en encodant la structure est différente 

Posté(e)

Pourtant json.rainDelay devrait renvoyer 0 ou 6171 d apres tes copies d ecran

Envoyé de mon Nexus 5X en utilisant Tapatalk

Posté(e)

j'ai legerement modifier le code : et j'ai maintenant une erreur fttp

 

HC2 = Net.FHttp("127.0.0.1",11111)
local response = HC2:GET("/api/panels/drenchers")
jsontable = json.decode(response)
fibaro:debug("Lecture de json.rainDelay avant modification: " ..jsontable.rainDelay)
jsontable.rainDelay = 24
fibaro:debug("json RainDelay : "..jsontable.rainDelay)
HC2.PUT("/api/panels/drenchers", jsontable)

Capture.PNG

Posté(e)

ca a replanté restart service a suffit, mais a priori on vois bien le changement de raindelay à 24  mais il n'est pas placé ou il faut après l'encodage

HC2 = Net.FHttp("127.0.0.1",11111)
local response = HC2:GET("/api/panels/drenchers")
jsontable = json.decode(response)
fibaro:debug("Lecture de json.rainDelay avant modification: " ..jsontable.rainDelay)
jsontable.rainDelay = 24
fibaro:debug("json RainDelay : "..jsontable.rainDelay)
ecriture = json.encode(jsontable)
fibaro:debug("apres encodage : "..ecriture)
--HC2.PUT("/api/panels/drenchers", ecriture)

Capture.PNG

Posté(e)

:(. je vais essayer de reconstruit le tableau json !! pour remettre dans l'ordre du type 

local Message='{"adjustWater"'..":"..''..jsontable.adjustWater..',"rainDelay"'..":"..''..jsontable.rainDelay..',"cycles"'..":"..''..jsontable.cycles..'}'
 

 

Posté(e)
Il y a 5 heures, tibo789 a dit :

:(. je vais essayer de reconstruit le tableau json !! pour remettre dans l'ordre du type 

local Message='{"adjustWater"'..":"..''..jsontable.adjustWater..',"rainDelay"'..":"..''..jsontable.rainDelay..',"cycles"'..":"..''..jsontable.cycles..'}'
 

 

voilà un morceau de code à mettre dans un VD et qui permet de modifier tous les devices compris dans un panneau en étendant le temps d'arrosage suivant les constantes choisies. (base à développer mais le moteur marche parfaitement, je viens de le tester en 4.120

 

 

function SecondsToClock(seconds)
  local seconds = tonumber(seconds)

  if seconds <= 0 then
    return "00:00:00";
  else
    hours = string.format("%02.f", math.floor(seconds/3600));
    mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
    secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60));
    return hours..":"..mins..":"..secs
  end
end

local localhost = '127.0.0.1';
local port = 11111;
HC2 = Net.FHttp(localhost, port)
response ,status, errorCode = HC2:GET("/api/panels/drenchers")
jsonTable = json.decode(response)
-- données entêtre du panneau
rd = jsonTable.rainDelay
aw = jsonTable.adjustWater
dr = jsonTable.drenchers
-- valeur en provenance du VD
pa = 1 -- pause entre les cycles en minute (max 60)
dun = 1 -- durée d'arrosage (max15)  si da = 0
hh = 20 -- heure  début du cycle 1
mm = 10 -- minute début du cycle 1
ds = 1 -- 1 : enchaine les arroseurs 0 : tous en même temps
da = 0 -- 1 : garde la durée d'arrosage définie dans le module

hhn = hh 
mmn = mm  
for i = 1, #dr do
      fibaro:debug("Device : " .. i)
     id = jsonTable.drenchers.id
    nd = jsonTable.drenchers.nextDrenching
    md = jsonTable.drenchers.mode
      fibaro:call(id, "setDrenchingMode", "auto")
    cy = jsonTable.drenchers.cycles
    -- si pas d'enchainage entre les arroseurs alors remise du temps de départ
      if ds == 0  then
      hhn = hh -- début du cycle 1
      mmn = mm  
    end
      -- modification de chaque ligne de cycle
      for c = 1, #cy do
        jsonTable.drenchers.cycles[c].hour = hhn
           jsonTable.drenchers.cycles[c].minute = mmn
        if da == 0 or jsonTable.drenchers.cycles[c].duration == 0 then
            jsonTable.drenchers.cycles[c].duration = dun
        end
          du = jsonTable.drenchers.cycles[c].duration
        if aw > 0 then
              awn = math.floor(du * (aw/100) + .5)
           else
              awn = 0
        end
          fibaro:debug("Cycle : " .. c .. " H " .. hhn .. ":" .. mmn .. " dur " .. du .. " pause " .. pa .. " tps add " .. awn)
        mmn = mmn + du + pa + awn
        if (mmn > 59) then
              mmn = mmn - 60
              hhn = hhn + 1
        end
        if hhn > 23 then
              hhn = 0
        end
      end
end
-- Enregistrement des modifications
-- Ajouter le raindelay auto en fonction de la pluie
-- Ajouter le message comme dans le bouton off
response = json.encode(jsonTable)
response2 ,status2, errorCode2 = HC2:PUT("/api/panels/drenchers", response)
if errorCode2 == 0
then
  fibaro:debug(status2.." success on PUT")
else
  fibaro:debug("error" .. errorCode2)
end

 

Posté(e)

Bonjour Loizauc et merci pour ce code je l'ai testé telque avant de modifier quoique ce soit mais ca m'a planté encore en erreur 503:( j'ai bloquer pour le moment le Put

sinon iil trouve bien mes 7 arroseurs avec #dr =7 mais il ne trouve pas l'   id = jsonTable.drenchers.id qui devrait être 187 pour le premier donc il plante sur  fibaro:call(id, "setDrenchingMode", "auto")
 

Posté(e)

Re, 

 

C'est quand même bizarre ce qui se passe. 

 

tu devrais avoir un retour au moins de jsonTable.rainDelay

 

Tu as rebooté depuis ? 

Posté(e)

J'ai bien un retour quand je lis jsonTable.rainDelay . j'arrive a l’écrire jsonTable.rainDelay =24 mais quand je fais l'encodage ecriture = json.encode(jsontable) je vois bien jsonTable.rainDelay à 24 mais pas au bonne endroit.

C'est pour cela je pense que je pars en erreur 503 . Je n'ai rien trouvé sur internet montrant un decode et encodage different

Posté(e)

oui j'ai vu, mais je ne comprends pas bien ;-), enfin, plutôt pas du tout

 

Avec ce code tu as quelquechose ? 

local json = api.get("/api/panels/drenchers") 
fibaro:debug("Lecture de json.rainDelay avant modification: " ..json.rainDelay.. " Cycles : " ..json.cycles)
fibaro:debug("Nom  187 : " ..json.drenchers[1].name)

 

Posté(e)

avec ton code Capture.PNG.d62b51c35ea63a239dd7a8ff5667232e.PNG

j'ai donc modifier le code pour ajouter le decode 

 

local response = HC2:GET("/api/panels/drenchers")
json = json.decode(response)
fibaro:debug("Lecture de json.rainDelay avant modification: " ..json.rainDelay.. " Cycles : " ..json.cycles)
fibaro:debug("Nom  187 : " ..json.drenchers[1].name)
j'ai l'erreurCapture.PNG.a7043c449491f50882482f710403128a.PNGsinon delay et cycles sont ok

Comme si json.drenchers était comme un tableau. j'ai trouvé un script qui décode en texte et le résultat est interresant ;)

 

local response = HC2:GET("/api/panels/drenchers")
monTableau = json.decode(response)
fibaro:debug("api:get "..response)
function table.val_to_str ( v )
  if "string" == type( v ) then
    v = string.gsub( v, "\n", "\\n" )
    if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
      return "'" .. v .. "'"
    end
    return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
  else
    return "table" == type( v ) and table.tostring( v ) or
      tostring( v )
  end
end

function table.key_to_str ( k )
  if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
    return k
  else
    return "[" .. table.val_to_str( k ) .. "]"
  end
end

function table.tostring( tbl )
  local result, done = {}, {}
  for k, v in ipairs( tbl ) do
    table.insert( result, table.val_to_str( v ) )
    done[ k ] = true
  end
  for k, v in pairs( tbl ) do
    if not done[ k ] then
      table.insert( result,
        table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
    end
  end
  return "{" .. table.concat( result, "," ) .. "}"
end
fibaro:debug(table.tostring(monTableau))

Capture.PNG.8dae3c57311a9c63dec829f535c79de4.PNG

Posté(e)

Bonsoir,

 

je dois me tromper dans la lecture des sous objets/elements du tableau. 

Je vais me créer un panneau d'arrosage ;-) .

faudrait qu'un expert passe par là ,-) C'est quand même très bizarre ce qu'il t'arrive :-)

Posté(e)

Bonsoir, je n'arrive pas non plus a lire correctement les sous elements. Je vais faire un mail a fibaro car cela marchais bien avant ,il doit y a avoir un bug car erreur 503 a chaque fois que je fait un put sur l'arrosage pas normal. Je me fais operé des cervicales demain donc je mets en stanby quelques jour cela m'occupera pour la convalescence ;)

×
×
  • Créer...