Aller au contenu
jimbo007be

SMA Solar WebBox

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Peut tu mettre un exemple de format de données lorsque tu te connecte àta webbox ? Csv?

Peut tu te connecter àta webbox en lan ou faut que tu passes par le portail ?

Partager ce message


Lien à poster
Partager sur d’autres sites

les données sont accessibles via RPC (en JSON) ou via un portail web mais je pense que Krikroff a déjàfait cette config ... :)

j'espère juste qu'il passera par ici et me filera un coup de main :)

Partager ce message


Lien à poster
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

:)

Partager ce message


Lien à poster
Partager sur d’autres sites

j'allais poster un suivi sur ce point car j'ai bien avancé :)

 

webbox.jpg

 

webbox2.jpg

 

j'ai donc bien un device qui répond mais je ne sais pas si il y a moyen d'avoir directement l'affichage des données sans devoir cliquer sur le device ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Voir main loop des périphériques virtuels

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

ok mais je suppose qu'on peut avoir une seule valeur affichée sur la vignette, le label qui est défini par "principal" ... ?

 

Merci de ne pas citer le message précédent.

Modifié par moicphil
Suppression de la citation

Partager ce message


Lien à poster
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....

Partager ce message


Lien à poster
Partager sur d’autres sites

ok merci ! ca marche nickel ainsi :)

 

Merci de ne pas citer le message précédent.

Modifié par moicphil
Suppression de la citation

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
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 ...

Partager ce message


Lien à poster
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)

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

×