Aller au contenu

SMA Solar WebBox


jimbo007be

Messages recommandés

bonjour

 

est-ce que quelqu'un aurait de la doc sur la configuration d'un périphérique virtuel pour récupérer les infos de production photovoltaique via une Sunny WebBox (SMA)

http://www.sma-france.com/produits/surveillance-dinstallation/sunny-webbox.html

 

merci d'avance :)

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

J'ai réalisé cela pour un membre du forum Fibaro: Kuuno, cf. http://forum.fibaro.com/viewtopic.php?t=3308&highlight=sma+webbox :) , il est ok pour le partage alors:

 

Dans le principe c'est cela, remplacer avec la bonne adresse IP, le bon Port, la bonne clé Webbox etc:

-- Polling time (value in milliseconds)
local _polling = 60*60*1000;
local _trace = true;

function trace(value)
  if (_trace) then
    return fibaro:debug(tostring(value));
  end
end

function GetPlantOverview() 
 
  local payload = [[
    {
      "version": "1.0",
      "proc": "GetPlantOverview",
      "id": "1",
      "format": "JSON"
    }
  ]];

  HC2 = Net.FHttp(YOUR_IP, YOUR_PORT);
  response, status, errorCode = HC2:POST("/rpc", "RPC="..payload);

  if errorCode == 0 then
    trace("status: "..status);
    local jsonTable = json.decode(response);
    
    if (jsonTable ~= nil) then
      local proc = jsonTable.proc;
      local version = jsonTable.version;
      local id = jsonTable.id;
      trace(proc.." - id:"..id..", version:"..version);
      trace(table.getn(jsonTable.result.overview).." rows in overview");
      for key,value in pairs(jsonTable.result.overview) do    
        unit = jsonTable.result.overview[key].unit;
        meta = jsonTable.result.overview[key].meta;
        name = jsonTable.result.overview[key].name;
        value = jsonTable.result.overview[key].value;
        trace("unit:"..unit..", meta:"..meta..", name:"..name..", value:"..value);
      end
	else
    	trace("response is null");
  	end
  else
    trace("errorCode: "..errorCode);
  end
end

function GetProcessData()
  local payload = [[
    {"version": "1.0","proc": "GetProcessData","id": "1","format": "JSON","params":{"devices":[{"key": "WRTL1ECD:00000000000","channels": null},{"key": "WRTL1ECD:00000000000","key": "WRTL1ECD:0000000000","channels":["Pac"]}]}}
  ]];
  HC2 = Net.FHttp(YOUR_IP, YOUR_PORT);
  response, status, errorCode = HC2:POST("/rpc", "RPC="..payload);

  if errorCode == 0 then

    trace("status: "..status);
    local jsonTable = json.decode(response);
    
    if (jsonTable ~= nil) then
      local proc = jsonTable.proc;
      local version = jsonTable.version;
      local id = jsonTable.id;
      trace(proc.." - id:"..id..", version:"..version);
      trace(table.getn(jsonTable.result.devices).." rows in devices");
      for key,value in pairs(jsonTable.result.devices) do
        channels = jsonTable.result.devices[key].channels;
        trace(table.getn(channels).." channels in key" .. jsonTable.result.devices[key].key);
      	for keyB,valueB in pairs(channels) do
          unit = channels[keyB].unit;
          meta = channels[keyB].meta;
          name = channels[keyB].name;
          value = channels[keyB].value;
          trace("unit:"..unit..", meta:"..meta..", name:"..name..", value:"..value);
        end
      end
	else
    	trace("response is null");
  	end
  else
    trace("errorCode: "..errorCode);
  end 
  
end

function main()
  -- prepare a global counter
  if (_count == nil) then
    trace("HC2 start script at " .. os.date());
    _count = 0;
  end
  --notify begin of process
  trace("Start process #".._count..", please wait...");
  
  -- query #1
  GetPlantOverview();
  
  -- query #2
  GetProcessData();

  -- increment global counter
  _count = _count + 1;
end
-- Start main loop process
main();

-- Sleep
fibaro:sleep(_polling);

-- EOF Main loop

:)

Lien vers le commentaire
Partager sur d’autres sites

Le code posté doit être placé dans le main loop d'un périphérique virtuel. Pour afficher les informations, vous devez remplacer les "trace" par un fibaro:log par exemple qui affiche des informations dans le bas de la petite vignette du P.Virtuel ;) ou alors ajouter des "labels" qui seront mis àjour avec des fibaro:call

Lien vers le commentaire
Partager sur d’autres sites

Exemple:

 

Si par exemple tu veux afficher cela: 22°C - 67% h - 1020 mB en bas de la vignette + la meme choses dans un label.

 

1 - Ajouter un label avec comme ID: lblValue

2 - Puis le code derrière c'est:

local _refreshTimer = 5000;
local _selfId = fibaro:getSelfId();
local _logTemplate = "22°C - 67% h - 1020 mB";
fibaro:call(_selfId, "setProperty", "ui.lblValue.value", _logTemplate);
fibaro:log(_logTemplate);
fibaro:sleep(_refreshTimer);

Après c'est une histoire de faire tout rentrer dans l'espace disponible....

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bon j'essaie aussi de rajouter ma sunny webbox dans HC2 mais ou trouver la clé webbox?

Perso j'ai une erreur en debug:

[DEBUG] 00:13:55: Home Center 2 start script at Sat Feb 22 00:13:55 2014
[DEBUG] 00:13:55: Start process #0, please wait...
[DEBUG] 00:13:55: status: 200
[DEBUG] 00:13:55: GetPlantOverview - id:1, version:1.0
[DEBUG] 00:13:55: 5 rows in overview
[DEBUG] 00:13:55: unit:W, meta:GriPwr, name:Puissance, value:0
[DEBUG] 00:13:55: unit:kWh, meta:GriEgyTdy, name:Énergie dégagée jour actuel, value:0
[DEBUG] 00:13:55: unit:kWh, meta:GriEgyTot, name:Rendement total, value:16352.272
[ERROR] 00:13:55: line 42: attempt to concatenate global 'unit' (a nil value)

 
 
Merci d'avance
Christophe
Lien vers le commentaire
Partager sur d’autres sites

pour être sur que le script ne plante pas ici tu peux modifier la ligne

unit = channels[keyB].unit;

par

unit = channels[keyB].unit or "";

Faire la même chose pour les autres: meta, name, value ...

Lien vers le commentaire
Partager sur d’autres sites

HUm il doit y avoir quelque chose que je configure mal:

j'ai du modifier toutes les valeurs récupérées avec le or ""

 
-- Polling time (value in milliseconds)
local _polling = 60*60*1000;
local _trace = true;
 
function trace(value)
  if (_trace) then
    return fibaro:debug(tostring(value));
  end
end
 
function GetPlantOverview() 
 
  local payload = [[
    {
      "version": "1.0",
      "proc": "GetPlantOverview",
      "id": "1",
      "format": "JSON"
    }
  ]];
 
  HC2 = Net.FHttp("192.168.1.50", "80");
  response, status, errorCode = HC2:POST("/rpc", "RPC="..payload);
 
  if errorCode == 0 then
    trace("status: "..status);
    local jsonTable = json.decode(response);
 
    if (jsonTable ~= nil) then
      local proc = jsonTable.proc;
      local version = jsonTable.version;
      local id = jsonTable.id;
      trace(proc.." - id:"..id..", version:"..version);
      trace(table.getn(jsonTable.result.overview).." rows in overview");
      for key,value in pairs(jsonTable.result.overview) do    
        unit = jsonTable.result.overview[key].unit or "";
        meta = jsonTable.result.overview[key].meta or "";
        name = jsonTable.result.overview[key].name or "";
        value = jsonTable.result.overview[key].value or "";
        trace("unit:"..unit..", meta:"..meta..", name:"..name..", value:"..value);
      end
	else
    	trace("response is null");
  	end
  else
    trace("errorCode: "..errorCode);
  end
end
 
function GetProcessData()
  local payload = [[
    {"version": "1.0","proc": "GetProcessData","id": "1","format": "JSON","params":{"devices":[{"key": "WRTL1ECD:00000000000","channels": null},{"key": "WRTL1ECD:00000000000","key": "WRTL1ECD:0000000000","channels":["Pac"]}]}}
  ]];
  HC2 = Net.FHttp("192.168.1.50", "80");
  response, status, errorCode = HC2:POST("/rpc", "RPC="..payload);
 
  if errorCode == 0 then
 
    trace("status: "..status);
    local jsonTable = json.decode(response);
 
    if (jsonTable ~= nil) then
      local proc = jsonTable.proc;
      local version = jsonTable.version;
      local id = jsonTable.id;
      trace(proc.." - id:"..id..", version:"..version);
      trace(table.getn(jsonTable.result.devices).." rows in devices");
      for key,value in pairs(jsonTable.result.devices) do
        channels = jsonTable.result.devices[key].channels;
        trace(table.getn(channels).." channels in key" .. jsonTable.result.devices[key].key);
      	for keyB,valueB in pairs(channels) do
          unit = channels[keyB].unit or "";
          meta = channels[keyB].meta or "";
          name = channels[keyB].name or "";
          value = channels[keyB].value or "";
          trace("unit:"..unit..", meta:"..meta..", name:"..name..", value:"..value);
        end
      end
	else
    	trace("response is null");
  	end
  else
    trace("errorCode: "..errorCode);
  end 
 
end
 
function main()
  -- prepare a global counter
  if (_count == nil) then
    trace("Home Center 2 start script at " .. os.date());
    _count = 0;
  end
  --notify begin of process
  trace("Start process #".._count..", please wait...");
 
  -- query #1
  GetPlantOverview();
 
  -- query #2
  GetProcessData();
 
  -- increment global counter
  _count = _count + 1;
end
-- Start main loop process
main();
 
-- Sleep
fibaro:sleep(_polling);
 
-- EOF Main loop
 

Mais un message plus embetant:

 

[DEBUG] 10:46:11: Home Center 2 start script at Sat Feb 22 10:46:11 2014
[DEBUG] 10:46:11: Start process #0, please wait...
[DEBUG] 10:46:11: status: 200
[DEBUG] 10:46:11: GetPlantOverview - id:1, version:1.0
[DEBUG] 10:46:11: 5 rows in overview
[DEBUG] 10:46:11: unit:W, meta:GriPwr, name:Puissance, value:229
[DEBUG] 10:46:11: unit:kWh, meta:GriEgyTdy, name:Énergie dégagée jour actuel, value:0.732
[DEBUG] 10:46:11: unit:kWh, meta:GriEgyTot, name:Rendement total, value:16353.005
[DEBUG] 10:46:11: unit:, meta:OpStt, name:État, value:Ok, Ok
[DEBUG] 10:46:11: unit:, meta:Msg, name:Message, value:
[DEBUG] 10:46:11: status: 200
[DEBUG] 10:46:11: GetProcessData - id:1, version:1.0
[ERROR] 10:46:11: line 69: attempt to index field 'result' (a nil value)

Lien vers le commentaire
Partager sur d’autres sites

Bon j'ai bien avancé de mon coté, j'ai débuggé avec Postman (qui permet d'effectuer des requetes HTTP Post,GET,... sous chrome.

J'ai identifié que le probleme vient d'ici:

local payload = [[
    {"version": "1.0","proc": "GetProcessData","id": "1","format": "JSON","params":{"devices":[{"key": "WRTL1ECD:00000000000","channels": null},{"key": "WRTL1ECD:00000000000","key": "WRTL1ECD:0000000000","channels":["Pac"]}]}}
  ]];

En fait key doit correspondre à  la clé d'un des éléments des panneaux (soit Sunny web box soit panneaux)

Pour la trouver:

Dans postman: 

ipdevotresunnywebbox/rpc POST

format RAW

puis coller ceci:

RPC={
 "version": "1.0",
 "proc": "GetDevices",
 "id": "1",
 "format": "JSON"
}

là  vous aurez la liste des devices...

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...