jimbo007be Posté(e) le 31 décembre 2013 Signaler Posté(e) le 31 décembre 2013 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 1
Moicphil Posté(e) le 31 décembre 2013 Signaler Posté(e) le 31 décembre 2013 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 ?
jimbo007be Posté(e) le 31 décembre 2013 Auteur Signaler Posté(e) le 31 décembre 2013 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
Krikroff Posté(e) le 2 janvier 2014 Signaler Posté(e) le 2 janvier 2014 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
jimbo007be Posté(e) le 2 janvier 2014 Auteur Signaler Posté(e) le 2 janvier 2014 j'allais poster un suivi sur ce point car j'ai bien avancé 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 ...
i-magin Posté(e) le 2 janvier 2014 Signaler Posté(e) le 2 janvier 2014 Voir main loop des périphériques virtuels
Krikroff Posté(e) le 2 janvier 2014 Signaler Posté(e) le 2 janvier 2014 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
jimbo007be Posté(e) le 2 janvier 2014 Auteur Signaler Posté(e) le 2 janvier 2014 (modifié) 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é le 2 janvier 2014 par moicphil Suppression de la citation
Krikroff Posté(e) le 2 janvier 2014 Signaler Posté(e) le 2 janvier 2014 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....
jimbo007be Posté(e) le 2 janvier 2014 Auteur Signaler Posté(e) le 2 janvier 2014 (modifié) ok merci ! ca marche nickel ainsi Merci de ne pas citer le message précédent. Modifié le 2 janvier 2014 par moicphil Suppression de la citation
labomatik Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 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
Krikroff Posté(e) le 21 février 2014 Signaler Posté(e) le 21 février 2014 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 ...
labomatik Posté(e) le 22 février 2014 Signaler Posté(e) le 22 février 2014 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)
labomatik Posté(e) le 25 février 2014 Signaler Posté(e) le 25 février 2014 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... 1
Messages recommandés