Page 1 of 1
LUA-script + virtual sensor + temperature + humidity
Posted: Wednesday 20 January 2016 14:34
by Gusten58
Can someone please help me understand how I should make a working LUA-script so the temperature and humidity will show up in a virtual sensor?
I’m importing temperature and humidity from a Tellstick Net sensor and store them in a file on my Raspberry Pi, then I want a LUA-script to place these values in to a virtual sensor, but I cannot figure out how to make this happen. I’m not so familiar with LUA-programming, but I have modifyed another LUA-script that I use for a wheather station where I only "scraping" the temperature as an referens.
I have installed a virtual sensor for temperature and humidity (Idx=45) and the file with temperature and humidity data contains the values “21;45” (+21 degrees Celsius and 45 % humidity).
Then I use a LUA-script that reads the file with the semicolon separated temperature and humidity data and place these values into variables that is sent to the virtual sensor “idxt” and “idxh”. I use another “real” temperature sensor (“Utetemp”) as an trigger for the script :
Code: Select all
--
--The following need updated for your environment get the 'Idx' or 'Name' off the Device tab. By default only the Temp is 'uncommented or enabled' in this script.
local sensorwu = 'Utetemp' --name of the sensor that gets created when you add the WU device (and that contains multiple values like temperature, humidity, barometer etc)
local idxt = 45 --idx of the virtual temperature sensor you need to change this to your own Device IDx
local idxh = 45 --idx of the virtual humidity sensor you need to change this to your own Device IDx
--
commandArray = {}
if devicechanged[sensorwu] then
f = assert (io.open ("/home/pi/tellstick/data/temp-temp+hum.txt", "r")) -- open the file with the temperature and humidity informatiom
sTempHum = f:read ("*a") -- read all data in file
print (sTempHum) -- print out temperature and humidity (separated by a semicolon)
f:close () -- close file
sWeatherTemp, sWeatherHumidity = sTempHum:match("([^;]+);([^;]+)")
sWeatherTemp = tonumber(sWeatherTemp)
sWeatherHumidity = tonumber(sWeatherHumidity)
print(sWeatherTemp) -- print temperature
print(sWeatherHumidity) -- print humidity
commandArray[1] = {['UpdateDevice'] = idxt .. '|0|' .. sWeatherTemp}
commandArray[2] = {['UpdateDevice'] = idxh .. '|' .. tostring(sWeatherHumidity)}
end
return commandArray
The log is showing this:

- logg.jpg (23.38 KiB) Viewed 20446 times
The virtual sensor is showing nothing:

- no_temp_or_hum.jpg (27.15 KiB) Viewed 20446 times
The actual virtual sensor values after running LUA-script (from “show current states”):

- idx45_current_state.jpg (15.46 KiB) Viewed 20446 times
What could be wrong in LUA-script?
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Wednesday 20 January 2016 23:55
by jmleglise
Did you use the Temp+Humidity virtual sensor ? So it's only 1 sensor and you must send Temp & humidity in the same svalue like explained here :
https://www.domoticz.com/wiki/Domoticz_ ... 2Fhumidity
What you have in log : 21;45 is exactly what you need to send to the sensor. No need to get strings to convert them to numbers to convert them back to strings
This will be done with only 1 command. Something like that :
Code: Select all
local idx = 45
commandArray = {}
if devicechanged[sensorwu] then
f = assert (io.open ("/home/pi/tellstick/data/temp-temp+hum.txt", "r")) -- open the file with the temperature and humidity informatiom
sTempHum = f:read ("*a") -- read all data in file
print (sTempHum) -- print out temperature and humidity (separated by a semicolon)
f:close () -- close file
commandArray[1] = {['UpdateDevice'] = idx .. '|0|' .. sTempHum..';0'}
end
return commandArray
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 21 January 2016 0:02
by jmleglise
oh ! by the way, you will have more chance to get answer , in the this SubForum :
http://www.domoticz.com/forum/viewforum.php?f=23
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 21 January 2016 9:49
by bologni
Bonjour jmleglise, excusez mon français.
Je vous écris d'Italie et je voyais que vous "IP vidéo sonnette ATZ-DBV01P« Je voudrais connaître votre opinion sur ce Videophone. Il fonctionne bien avec Internet Phone?
Je ne pouvais trouver aucune vidéo de démonstration de cela, ce serait trop demander à une vidéo de démonstration à court de la vôtre? Je serais très reconnaissant.
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 21 January 2016 21:36
by Gusten58
Many thank's jmleglise

Your script code example works great. Now I can combine the temp and humidity values in the same virtual sensor instead of having separate virtual sensors for each one I've had before.
Yes, I used a Temp + Humidity virtual sensor when I tried to get the LUA code to work and was a bit desperate to make it work
Also thank you for your proposal to me to continue ask additional questions in the subforum "Board Index -> Functionalities and Protocols -> Scripts".
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 21 January 2016 23:08
by jmleglise
@bologni : look, You have a whole thread especially for you
http://www.domoticz.com/forum/viewtopic.php?f=4&t=10118
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Monday 25 April 2016 23:48
by chatainsim
Hello,
I alsoe have the same issue with the virtual device.
He doesn't display temp or humidity.
I'm using a NodeMCU to call the json api of Domoticz.
Update is working fine and graph also but there is no value display in the temp tab.

- display.PNG (12.54 KiB) Viewed 19782 times
Here is the graph:

- graph.PNG (113.67 KiB) Viewed 19782 times
And the device row:

- device.PNG (12.6 KiB) Viewed 19782 times
Thank you.
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Monday 25 April 2016 23:56
by chatainsim
Ok, I figure out why.
In my API call, I haven't set the HUM_SAT parameter.
So that's why.
I used this:
http://192.168.1.254:3434/json.htm?type ... alue=23;35
Instead of:
http://192.168.1.254:3434/json.htm?type ... ue=23;35;0
Do you know how to get the HUM_SAT value ? Is it a calcul or something ?
Thanks
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Monday 20 June 2016 14:57
by elmortero
Hi all,
I have a simular issue.
The humidity gets scrapped correctly from the actual sensor (and diplayed in the log)
But when it comes to writing the value to a virtual Humidity sensor it fails.
The logs show that the sensor gets updated, but with a 0 instead of the earlier read value.
any suggestions anyone?
Code: Select all
commandArray = {}
bodem = 'soil1'
vsenshum = 'humsoil1'
vsenshum_id = '338'
smoistsensorTemp, smoistsensorHumidity = otherdevices_svalues[bodem]:match("([^;]+);([^;]+);([^;]+)")
smoistsensorTemp = tonumber(smoistsensorTemp);
smoistsensorHumidity = tonumber(smoistsensorHumidity);
print("xt300: Humidity is " .. smoistsensorHumidity .. " ");
commandArray['UpdateDevice'] = vsenshum_id .. "|0|" ..smoistsensorHumidity
return commandArray
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Friday 09 September 2016 15:25
by marmachine
Any luck yet?
I was actually looking into a similar issue...
- My virtual device, named 'Luchtvochtigheid' displays a value of 75%
- In devices, i see the exact variables: IDX 85 Virtual Weather Devices 140A4 1 Luchtvochtigheid Humidity LaCrosse TX3 Humidity 75 %
- When i am trying to read the value from LUA: print("humidity: "..otherdevices_svalues["Luchtvochtigheid"])
- This prints: 2016-09-09 15:24:02.957 LUA: humidity: 3
Am i missing something here or what?
Version: 3.4834 | Build Hash: 8398125 | Compile Date: 2016-03-02 08:43:51
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Friday 09 September 2016 21:59
by marmachine
Lisa wrote:viewtopic.php?f=12&t=13280
Thanks for your reply!
Maybe i am missing your point, but i already have a value in my virtual device.
It displays correct in Domoticz, however when i try to do something with it's current value in a LUA event script, it comes up with an incorrect value.
I am using
otherdevices_svalues["Luchtvochtigheid"] to get it, this works for all other devices, just this specific one doesn't!
Actually, looking at this again i think it returns 2 instead of 72, earlier i had 3 instead of 73.
Json data works just fine:
Code: Select all
{
"ActTime" : 1473451006,
"ServerTime" : "2016-09-09 21:56:46",
"Sunrise" : "07:04",
"Sunset" : "20:05",
"result" : [
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 0,
"Data" : "Humidity 72 %",
"Description" : "",
"Favorite" : 0,
"HardwareID" : 20,
"HardwareName" : "Virtual Weather Devices",
"HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
"HardwareTypeVal" : 15,
"HaveTimeout" : false,
"Humidity" : 72,
"HumidityStatus" : "Wet",
"ID" : "140A4",
"LastUpdate" : "2016-09-09 21:51:04",
"Name" : "Luchtvochtigheid",
"Notifications" : "false",
"PlanID" : "0",
"PlanIDs" : [ 0 ],
"Protected" : false,
"ShowNotifications" : true,
"SignalLevel" : "-",
"SubType" : "LaCrosse TX3",
"Timers" : "false",
"Type" : "Humidity",
"TypeImg" : "temperature",
"Unit" : 1,
"Used" : 1,
"XOffset" : "0",
"YOffset" : "0",
"idx" : "85"
}
],
"status" : "OK",
"title" : "Devices"
}
So i am wondering if we are looking at a bug here!?
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Saturday 10 September 2016 23:46
by marmachine
Lisa wrote:It's a virtual device, how do you set it?
Here's how i set it, using a LUA (event) script;
Code: Select all
if ((idxHumidity) and (humidity)) then
-- Average values per season, depend on location. (Found my values here: http://www.klimaatatlas.nl/klimaatatlas.php)
-- Winter: 88-90%
-- Spring: 78-80%
-- Summer: 78-80%
-- Aughtum: 86-88%
-- Mapping for Humidity_status:
-- 0 = Normal
-- 1 <> 46-70% = Comfortable
-- 2 < 46 = Dry
-- 3 > 70% = Wet
hum_num = humidity:gsub('%W','') -- get numeric value from string
hum_num = tonumber(hum_num) -- make it a numeric value
if hum_num == nil then humidity_status = nil
else
if ((hum_num >= 46) and (hum_num <= 70)) then humidity_status = "1" -- comfortable
elseif (hum_num < 46) then humidity_status = "2" -- dry
elseif (hum_num > 70) then humidity_status = "3" -- wet
else humidity_status = "0" end
end
commandArray[indexArray] = {['UpdateDevice'] = tostring(idxHumidity)..'|'..humidity..'|'..humidity_status}
indexArray=indexArray+1
if( DEBUG == 1) then print("| Humidity device updated with value: "..tostring(humidity).." and status: "..tostring(humidity_status)) end
end
So, looking at my log and the above scripting again, i am probably getting the status value instead of the percentage.
However, i still don't see how i can get the percentage value... i'd expect to receive a string like "72;2"
Is there any documentation about this? It's a bugger since all other sensors report as expected.
(i'm working on a script to update value 'trend' (up/no change/down) for temp and humidity sensors)
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Tuesday 13 September 2016 13:42
by marmachine
Hi Lisa,
Thanks again for your response.
This 'strange' way of updating devices is something that i've found on the forum here.
Intended to prevent command overwriting.
Anyhow, the following command:
Code: Select all
commandArray[indexArray] = {['UpdateDevice'] = tostring(idxHumidity)..'|'..humidity..'|'..humidity_status}
is basically the same as:
Code: Select all
commandArray['UpdateDevice'] = tostring(idxHumidity)..'|'..humidity..'|'..humidity_status
So i don't see any relation between my issue and this command.
When i do this (within the same script) with the variables in the commandArray above:
Code: Select all
print("| Humidity device updated with value: "..tostring(humidity).." and status: "..tostring(humidity_status))
My log shows:
2016-09-13 12:52:03.745 LUA: | Humidity device updated with value: 75% and status: 3
<< At this point, the virtual device in Domoticz shows the correct value: 'Luchtvochtigheid 75%, condition: wet' >>
Now since i require the current value, i do this (in another event script) to get the values from the (virtual) device which has been set:
Code: Select all
print('> otherdevices_svalues["Luchtvochtigheid"] = '..tostring(otherdevices_svalues["Luchtvochtigheid"]))
Now my log shows the result:
2016-09-13 12:55:03.720 LUA: > otherdevices_svalues["Luchtvochtigheid"] = 3
So, where has my humidity percentage gone?
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Wednesday 14 September 2016 11:19
by marmachine
Well, as i wrote earlier, my 'setter' log shows the values i set (between 'quotes'):
2016-09-13 12:52:03.745 LUA: | Humidity device updated with value: '75%' and status: '3'
The result of the commandArray line in my script is that the virtual device is updated every time the script runs, so over time the values change up and down. The device logging also displays a nice diagram of the values over time, so what i am trying to say is that i don't see why my script would be wrong.
Adding your 'print' line however, results in: 2016-09-14 11:15:04.013 LUA: Debug: 85|73%|3
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 15 September 2016 9:40
by marmachine
Lisa wrote:And the svalues in the 'show current states'?
Don't look good either, the percentage seems to be missing there as well:
85 Luchtvochtigheid 2016-09-15 09:35:04
1
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Friday 16 September 2016 23:30
by marmachine
Lisa wrote:and when you hardcode it?
You mean this;
In my
Wunderground script -
Code: Select all
print ('Debug: '..tostring(idxHumidity)..'|'..humidity..'|'..humidity_status)
commandArray['Luchtvochtigheid'] = tostring(idxHumidity)..'|'..humidity..'|'..humidity_status
if(DEBUG == 1) then print("| Humidity device set with command: commandArray['Luchtvochtigheid'] = "..tostring(idxHumidity).."|"..humidity.."|"..humidity_status) end
log:
2016-09-16 23:22:04.024 LUA: Debug: 85|76|3
2016-09-16 23:22:04.024 LUA: | Humidity device set with command: commandArray['Luchtvochtigheid'] = 85|76|3
In my
Trend script -
Code: Select all
print('> otherdevices_svalues["Luchtvochtigheid"] = '..tostring(otherdevices_svalues["Luchtvochtigheid"]))
log:
2016-09-16 23:25:03.413 LUA: > otherdevices_svalues["Luchtvochtigheid"] = 3
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Thursday 06 April 2017 22:27
by marmachine
Well... i'm back at the subject i guess... for my previous issue i've found a workaround, but now i don't and would like to sort this out:
My values:
HUM = 70 (%)
STATUS = 3 (wet)
I set my (virtual) humidity device through a json command, like:
http://192.168.2.100:8080/json.htm?type ... lue=STATUS
Then, i want to use the value HUM, by reading from the (virtual) humidity device in a LUA (event) script.
I do that with the following code for my temperature device:
Code: Select all
otherdevices_svalues[temp_device];
This will return the current temperature value
However, for the humidity device, there is also STATUS, this tells us something about the value, like DRY, NORMAL, WET...
When i try to get the value, i mean the humidity (HUM) value, not the STATUS, i am lost when i use the above method.
I call the svalue, i get the STATUS value
I call the nvalue, i get an error:
attempt to index global 'otherdevices_nvalues' (a nil value)
So, how do i get the HUM value?
Thanks.
Re: LUA-script + virtual sensor + temperature + humidity
Posted: Friday 07 April 2017 11:51
by marmachine
Found my answer folks!
My values:
HUMIDITY = 70 (%)
STATUS = 3 (wet)
Set values through json
I set my (virtual) humidity device from an external (Arduino) source through a json command, like:
http:// 192.168.2.100:8080/json.htm?type=command¶m=udevice&idx=IDX&nvalue=HUMIDITY&svalue=STATUS
Read values in a LUA (event) script
Then, i want to use the value HUMIDITY, by reading from the (virtual) humidity device in a LUA (event) script.
I do that with the following code for my
temperature device:
Code: Select all
TEMPERATURE = otherdevices_svalues[temp_device];
This will return the current temperature value
However, for a
humidity device, there is also STATUS, this tells us something about the value, like DRY, NORMAL, WET...
When i try to get the value, i mean the humidity (HUMIDITY) value, not the STATUS which you get when you use the above method.
So, to get the HUMIDITY (nvalue) and STATUS (svalue) through a LUA script, this is how to:
Code: Select all
HUMIDITY = otherdevices_humidity["humidity_device"];
STATUS = otherdevices_svalues["humidity_device"];
Big thanks to aleph0!