Bompaization
Active member
Ik heb een python module waarmee je uw Growatt omvormer kan uitlezen gebruikt om een android app te maken met behulp van Beeware.
Dat is gelukt, maar Beeware/Toga is nog te beperkt om dat een beetje deftig uit te bouwen, meer dan een heel simpele GUI gaat niet.
Ik ben dan maar begonnen om de module om te zetten naar Solar2D (vroeger bekend als Corona SDK), aangezien ik hier vroeger een paar games mee ontwikkeld heb. Dit is eigenlijk LUA.
Ik denk dat ik dicht bij een oplossing zit, maar ik loop vast op een sessionId probleem. Inloggen gaat prima, maar bij het oproepen van omvormer data 'vergeet' hij mijn credentials. Corona heeft geen session.request zoals python dus daar loopt mijn 'vertaling' vast.
Nochthans matchen 'saved cookie' en 'sent cookie', maar toch wil ie niet meewerken, de response header verwijst naar een 'je-bent-niet-ingelogd'-pagina.
Ik ben zeker dat het iets stom is, maar ik vind het niet.
Dat is gelukt, maar Beeware/Toga is nog te beperkt om dat een beetje deftig uit te bouwen, meer dan een heel simpele GUI gaat niet.
Ik ben dan maar begonnen om de module om te zetten naar Solar2D (vroeger bekend als Corona SDK), aangezien ik hier vroeger een paar games mee ontwikkeld heb. Dit is eigenlijk LUA.
Ik denk dat ik dicht bij een oplossing zit, maar ik loop vast op een sessionId probleem. Inloggen gaat prima, maar bij het oproepen van omvormer data 'vergeet' hij mijn credentials. Corona heeft geen session.request zoals python dus daar loopt mijn 'vertaling' vast.
Nochthans matchen 'saved cookie' en 'sent cookie', maar toch wil ie niet meewerken, de response header verwijst naar een 'je-bent-niet-ingelogd'-pagina.
Ik ben zeker dat het iets stom is, maar ik vind het niet.
Code:
local crypto = require("crypto")
local json = require("json")
local GrowattApi = {
server_url = "https://server.growatt.com/",
agent_identifier = "Dalvik/2.1.0 (Linux; U; Android 12; https://github.com/indykoning/PyPi_GrowattServer)",
}
local function hash_password(password)
local password_md5 = crypto.digest(crypto.md5, password)
for i=1, string.len(password_md5), 2 do
if string.sub(password_md5, i, i) == '0' then
password_md5 = string.sub(password_md5, 1, i-1) .. 'c' .. string.sub(password_md5, i+1)
end
end
return password_md5
end
function GrowattApi:new(add_random_user_id, agent_identifier)
local instance = {}
if agent_identifier ~= nil then
instance.agent_identifier = agent_identifier
else
instance.agent_identifier = self.agent_identifier
end
if add_random_user_id then
print "adding random user_id"
local random_number = ""
for i=1, 5 do
random_number = random_number .. tostring(math.random(0, 9))
end
instance.agent_identifier = instance.agent_identifier .. " - " .. random_number
end
instance.request_headers = {
["User-Agent"] = instance.agent_identifier,
}
setmetatable(instance, { __index = self })
return instance
end
function GrowattApi:get_url(endpoint)
local url = self.server_url .. endpoint
return url
end
local function networkListener(event)
if (event.isError) then
print("Network error:", event.response)
else
print("Response headers:", json.encode(event.responseHeaders))
print("JSON response:", event.response) --try anyway
local contentType = event.responseHeaders["Content-Type"]
if (contentType == "application/json") then
local response = json.decode(event.response)
print("JSON response:", response)
else
print("Unknown response type:", contentType)
end
end
end
function GrowattApi:login(username, password, is_password_hashed)
is_password_hashed = is_password_hashed or false
if not is_password_hashed then
password = hash_password(password)
end
local headers = {}
headers["Content-Type"] = "application/x-www-form-urlencoded"
local params = {
headers = headers,
body = "userName=" .. username .. "&password=" .. password,
}
network.request(
self:get_url('newTwoLoginAPI.do'),
'POST',
function(response)
if response.phase == "ended" and response.status == 200 then
local data = json.decode(response.response)["back"]
if data["success"] then -- this works fine
data["userId"] = data["user"]["id"]
data["userLevel"] = data["user"]["rightlevel"]
-- Save the cookie
local cookie = response.responseHeaders["Set-Cookie"]
self.cookie = cookie
print ("saved cookie ", self.cookie)
end
print ("data = ", data, "length =", #data)
return data
else
print "there was no response to my login attempt :("
end
end,
params
)
end
-- calling this with a 1 second delay in main.lua just to make sure it is passed after login
-- will implement better when I sort out the cookie stuff
function GrowattApi:tlx_detail(tlx_id)
print("tlx_id is", tlx_id) -- check if the id is passed correctly, which it is
local url = self:get_url('newTlxApi.do')
local headers = {
["Set-Cookie"] = self.cookie
}
print ("sending cookie :", self.cookie)
local params = {
headers = headers,
params = {
op = 'getTlxDetailData',
id = tlx_id
}
}
network.request(url, 'GET', networkListener, params)
end
return GrowattApi