Page 1 of 1
LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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 ?
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
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')
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
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?
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
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.
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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?
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
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.
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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?
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Re: LUA för MIMOLite och ZNet Light
Posted: Fri Mar 17, 2023 9:45 am
by careskou
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