I dig a bit into LuaHandler.cpp. It seems to me that ID should be selected in the DB instead of DeviceID
Code: Select all
int CLuaHandler::l_domoticz_updateDevice(lua_State* lua_state)
{
int nargs = lua_gettop(lua_state);
if (nargs >= 3 && nargs <= 5)
{
// Supported format ares :
// - deviceId (integer), svalue (string), nvalue (string), [rssi(integer)], [battery(integer)]
// - deviceId (integer), svalue (string), nvalue (integer), [rssi(integer)], [battery(integer)]
if (lua_isnumber(lua_state, 1) && (lua_isstring(lua_state, 2) || lua_isnumber(lua_state, 2)) && lua_isstring(lua_state, 3))
{
// Extract the parameters from the lua 'updateDevice' function
int ideviceId = (int)lua_tointeger(lua_state, 1);
std::string nvalue = lua_tostring(lua_state, 2);
std::string svalue = lua_tostring(lua_state, 3);
if (((lua_isstring(lua_state, 3) && nvalue.empty()) && svalue.empty()))
{
_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : nvalue and svalue are empty ");
return 0;
}
// Parse
int invalue = (!nvalue.empty()) ? atoi(nvalue.c_str()) : 0;
int signallevel = 12;
if (nargs >= 4 && lua_isnumber(lua_state, 4))
{
signallevel = (int)lua_tointeger(lua_state, 4);
}
int batterylevel = 255;
if (nargs == 5 && lua_isnumber(lua_state, 5))
{
batterylevel = (int)lua_tointeger(lua_state, 5);
}
_log.Log(LOG_NORM, "CLuaHandler (updateDevice from LUA) : idx=%d nvalue=%s svalue=%s invalue=%d signallevel=%d batterylevel=%d", ideviceId, nvalue.c_str(), svalue.c_str(), invalue, signallevel, batterylevel);
// Get the raw device parameters
std::vector<std::vector<std::string> > result;
result = m_sql.safe_query("SELECT HardwareID, DeviceID, Unit, Type, SubType FROM DeviceStatus WHERE (DeviceID==%d)", ideviceId);
if (result.empty())
return 0;
std::string hid = result[0][0];
std::string did = result[0][1];
std::string dunit = result[0][2];
std::string dtype = result[0][3];
std::string dsubtype = result[0][4];
int HardwareID = atoi(hid.c_str());
std::string DeviceID = did;
int unit = atoi(dunit.c_str());
int devType = atoi(dtype.c_str());
int subType = atoi(dsubtype.c_str());
std::stringstream sstr;
unsigned long long ulIdx;
sstr << ideviceId;
sstr >> ulIdx;
m_mainworker.UpdateDevice(HardwareID, DeviceID, unit, devType, subType, invalue, svalue, signallevel, batterylevel);
}
else
{
_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : Incorrect parameters type");
}
}
else
{
_log.Log(LOG_ERROR, "CLuaHandler (updateDevice from LUA) : Not enough parameters");
}
return 0;
}
Debian buster on NUC and three RPi with buster.