can't get domoticz_updateDevice working

Moderator: leecollings

Post Reply
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

can't get domoticz_updateDevice working

Post by Number8 »

Hello,
I setup a LUA script as explained here: https://www.domoticz.com/wiki/Inserting ... ua_parsers.
The callback works fine, domoticz log file reports:

Code: Select all

2016-08-05 08:18:25.194 CLuaHandler (updateDevice from LUA) : idx=266 nvalue=0 svalue=228.4 invalue=0 signallevel=12 batterylevel=255
which is what is expected.
However the dummy voltage sensor never gets updated.
If I use the following json command, it is updated

Code: Select all

http://192.168.21.240:8080/json.htm?type=command&param=udevice&idx=266&nvalue=0&svalue=200
Here is the LUA parser code:

Code: Select all

local tensionAC = uri['tensionAC']
domoticz_updateDevice(266,0,tensionAC)
Thank you
Debian buster on NUC and three RPi with buster.
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

Should have added I'm running v3.5259 on a RaspPI. Just updated to the last beta 5406. No change
Debian buster on NUC and three RPi with buster.
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

Anybody?
Thanks
Debian buster on NUC and three RPi with buster.
SweetPants

Re: can't get domoticz_updateDevice working

Post by SweetPants »

The example in the documentation talks about:

Callback : http://<domoticz ip>:<domoticz port>/json.htm?type=command&param='''udevices'''&script='''yoctopuce_meteo.lua'''&

If domoticz_updateDevice uses that, it won;t work.

Domoticz needs &param=udevice (no s), and as you already noticed, that works.
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

Thanks SweetPants.
Indeed the Wiki is wrong. The callback that I setup is not as per Wiki, it is the following and so far is correct. To me the "s" is needed

Code: Select all

IPAddress:port/json.htm?type=command&param=udevices&script=yoctopuce.lua&
since Domoticz log reports

Code: Select all

2016-08-05 08:18:25.194 CLuaHandler (updateDevice from LUA) : idx=266 nvalue=0 svalue=228.4 invalue=0 signallevel=12 batterylevel=255
However the idx device 266 never gets updated.
Is it a bug of domoticz_updateDevice function, or am I missing something?
Debian buster on NUC and three RPi with buster.
SweetPants

Re: can't get domoticz_updateDevice working

Post by SweetPants »

Well i still see the extra 's' in your callback.(IPAddress:port/json.htm?type=command&param=udevices&script=yoctopuce.lua&).
And as the JSON works, i tend to believe it's a problem of domoticz_updateDevice
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

it is indeed needed, or the callback is not fired.
Debian buster on NUC and three RPi with buster.
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

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.
Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

Is anyboby willing to have a look at what seems to be a bug? (reported also here : http://www.domoticz.com/forum/viewtopic ... 604#p92604
Thank you
Debian buster on NUC and three RPi with buster.
FrBoulli
Posts: 1
Joined: Wednesday 19 October 2016 19:38
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: can't get domoticz_updateDevice working

Post by FrBoulli »

Number8
Posts: 374
Joined: Friday 23 May 2014 7:55
Target OS: Linux
Domoticz version: 2022.1
Location: Saint Pierre de Jards
Contact:

Re: can't get domoticz_updateDevice working

Post by Number8 »

Thanks FrBoulli. Does that mean that it will be fixed in the next build?
Debian buster on NUC and three RPi with buster.
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest