If you want to get other data you can check what each position means (not all) here:
https://powerforum.co.za/topic/6931-goo ... gineering/
Code: Select all
return {
on = {
timer = {
'every 2 minutes',function(domoticz)
end,
}
},
logging = {
level = domoticz.LOG_INFO,
marker = 'template',
},
execute = function(domoticz, timer)
package.cpath ="/usr/lib/arm-linux-gnueabihf/lua/5.3/?.so;" .. package.cpath
package.path = "/usr/share/lua/5.3/?.lua;" .. package.path
local socket = require("socket")
local udp = assert(socket.udp())
local datosrecibidos
local energiadisponible
--ponemos timeout
udp:settimeout(5)
assert(udp:setsockname("*",0))
assert(udp:setpeername("192.168.1.10",8899))
--enviamos solicitud
assert(udp:send("\xAA\x55\xc0\x7f\x01\x06\x00\x02\x45"))
--recibimos cadena de datos
datosrecibidos = udp:receive()
--Donde almacenamos los bytes recibidos
local bytes={}
--convertimos los datos Recibidos a un array hexadecimal (jugamos con el array internamente)
for i=1,datosrecibidos:len() do
bytes[#bytes+1] = ('%2x'):format(datosrecibidos:byte(i,i))
end
--Posiciones necesarias empezando de 1
print("Posicion 46: "..bytes[46])
print("Posicion 47: "..bytes[47])
print("Posicion 88: "..bytes[88])
--Exportando (Se asignará valor en positivo)
if ((tonumber(bytes[88],16)==0)or(tonumber(bytes[88],16)==1)) then
energiadisponible=tonumber(bytes[46]..bytes[47],16)
end
--Importando (Se asignara valor en negativo)
if (tonumber(bytes[88],16)==2) then
energiadisponible=tonumber(bytes[46]..bytes[47],16)*-1
end
--cerramos socket
udp:close()
--Asignamos al sensor virtual de energia el valor
if (energiadisponible~=nil) then
print("Energia disponible="..energiadisponible)
domoticz.devices('Energia Disponible').updateEnergy(energiadisponible)
end
domoticz.log('Timer event was triggered by ' .. timer.trigger, domoticz.LOG_INFO)
end
}