LUA för MIMOLite och ZNet Light

Moderator: Telldus

Post Reply
careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Har ett projekt för att övervaka en tank via min ZNet. Har en MIMOLight som med funktioner som BinarySwitch och Multilevelsensor. Allt funkar fint och jag kan avläsa mätvärden ( fyra siffror, ingen speciell typ) och jag kan manövrera switchen allt via Telldus live. I appen visas dock inget sensorvärde.

Mitt problem/önskan jag vill översätta mätvärdet till % och få det att visas i appen.

Jag har skapat ett första försök till LUA kod och kan manövrera switchen men när jag skall försöka läsa av mätvärdet har jag problem. Jag utgår från LUA exemplet att ändra temeraturvärdet utifrån vindvärdet.
Jag kan se i Live att sensorn har ID 4

Code: Select all

local tankSensor = 4
local deviceManager = require "telldus.DeviceManager"
local trigger = "Tank_level" -- Name of the device
local tankValue = deviceManager:device(tankSensor).sensorValue()
Ovanstående kod ger följande felmeddelande:
Could not load lua script Tanklevel.lua: unbound method sensorValue() must be called with DeviceNode instance as first argument (got nothing instead)

Hur skall en "DeviceNode instance" programmeras ?

micke.prag
Site Admin
Posts: 2235
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: LUA för MIMOLite och ZNet Light

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Börja med att testa att ändra . till :

Code: Select all

local tankValue = deviceManager:device(tankSensor):sensorValue()
Sen tror jag att deviceManager:device() returnerar tomt i ditt fall. Du bör ha en koll på detta:

Code: Select all

local tankDevice = deviceManager:device(tankSensor)
if tankDevice == nil then
  return
end
Slutligen finns det en smidigare funktion att plocka ut enheterna än att använda device id.

Code: Select all

local tankDevice = deviceManager:findByName('Namnet på din tanksensor')
Micke Prag
Software
Telldus Technologies

careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

Re: LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Med koden nedan får jag inget felmeddelande men heller ingen utdata när jag ändrar sensorns läge, vad är det jag missar?

Code: Select all

local deviceManager = require "telldus.DeviceManager"
local tankSensor = deviceManager:findByName('Tank_level')

local tankDevice = deviceManager:device(tankSensor)
if tankDevice == nil then
  return
end

local tankValue = deviceManager:device(tankSensor):sensorValue()

function onSensorValueUpdated(device, valueType, value, scale)
	print(tankValue)
end

micke.prag
Site Admin
Posts: 2235
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: LUA för MIMOLite och ZNet Light

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Om det är hela scriptet så ser det inte så rätt ut. Du bör väl inte hämta värdet innan funktionen har körts?
Micke Prag
Software
Telldus Technologies

careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

Re: LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Jag har lite problem att förstå logiken, svårt att läsa sig till i LUA tutorials.

Jag har en device som heter "Tank_level"

Code: Select all

local deviceManager = require "telldus.DeviceManager"
local tankSensor = deviceManager:findByName('Tank_level')
Detta funkar och jag kan manövrera switchen

När jag skall försöka avläsa sensorns värde definierar jag

Code: Select all

local tankDevice = deviceManager:device(tankSensor)
Fråga: Hur vet jag som skall stå inom parentesen? det är en multilevelsensor på device "Tank_Level" jag vill avläsa.
I Telldus Live har både Switchen och Sensorn samma namn

När jag sedan vill hämta värdet är detta rätt kod?

Code: Select all

tankValue = deviceManager:device(tankSensor):sensorValue()
Och sedan visa värdet

Code: Select all

Print(sensorValue)

micke.prag
Site Admin
Posts: 2235
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: LUA för MIMOLite och ZNet Light

Post by micke.prag » Thu Jan 18, 2018 11:08 am

careskou wrote:När jag skall försöka avläsa sensorns värde definierar jag

Code: Select all

local tankDevice = deviceManager:device(tankSensor)
Detta är ju lite redundant. Du har ju redan hämtat ut devicen ovan med findByName.
I Telldus Live har både Switchen och Sensorn samma namn
I Telldus Live! är sensorer och enheter uppdelade. I lua är det en och samma enhet.
Micke Prag
Software
Telldus Technologies

careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

Re: LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Fortfarande svårt att få några värden ur sensorn

Code: Select all

 local deviceManager = require "telldus.DeviceManager"
    local tankSensor = deviceManager:findByName('Tank_level')

    function onSensorValueUpdated(device, valueType, value, scale)
    local tankValue = deviceManager:device(tankSensor):sensorValue()  
		print(tankValue, tankSensor)
    end
Ovanstående kod går igång utan fel men vid första uppdatering av sensorn får jag nedanstående felmeddelande
"Could not execute function onSensorValueUpdated: [string "<python>"]:5: attempt to index a nil value"
Något tips vad det är som är fel?

micke.prag
Site Admin
Posts: 2235
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: LUA för MIMOLite och ZNet Light

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Det verkar inte som du läste mitt inlägg ovan. DeviceManager:device() tar endast ett id som parameter. Du kan inte skicka in en device. Vet inte riktigt vad det skulle returnera då?
Funktionen är till för att få ut en device. Det behöver du inte göra två gånger.

Sen borde du också ha en koll på vilken sensor som uppdateras i metoden, det är inte säkert att det alltid är din tank sensor som uppdaterats.
Micke Prag
Software
Telldus Technologies

careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

Re: LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Läst men inte förstått..
Det är uppenbart att jag behöver studera hur LUA är implementerat i Znet. Har läst en del LUA tutorials men inte hittat något som hjälper för denna applikation, förutom när man väl har hämtat ut data sensorer etc.
Finns det något tips hur man bäst lär sig?

micke.prag
Site Admin
Posts: 2235
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Re: LUA för MIMOLite och ZNet Light

Post by micke.prag » Thu Jan 18, 2018 11:08 am

Micke Prag
Software
Telldus Technologies

careskou
Posts: 6
Joined: Thu Jan 18, 2018 11:08 am

Re: LUA för MIMOLite och ZNet Light

Post by careskou » Thu Jan 18, 2018 11:08 am

Tack för tipsen nu ramlade poletten ned. Med nedanstående kod fick jag ut sensorvärdet och kan börja räkna om värdet till % mm

Code: Select all

local deviceManager = require "telldus.DeviceManager"

	function onSensorValueUpdated()
	local device = deviceManager:findByName('Tank_level') 
	if device == nil then
		return
	end
	if device:name() ~= 'Tank_level' then
		return
	end
	local Tankvalue = device:sensorValue(0,1)
	local TankPCT = Tankvalue/150 
	
	print("Sensor uppdatering %s %s ",  Tankvalue , TankPCT )
		
end
utdata
Script Tanklevel.lua loaded

Sensor uppdatering 1670 11.1333333333

Post Reply