Virtuelles Device - SelfID geht nicht!

Hallo Ihr Lieben,
Ich programmiere gerade an einem Virtuellen Device und habe im Feld “TCPPort” die Device ID (562)des Gerätes stehen das ich bearbeiten möchte.
Der Coder einer der Tasten lautet:


local selfId = fibaro:getSelfId()
local DeviceID = fibaro:get(selfId, 'TCPPort') --ID auslesen aus dem TCPPort Feld

local DeviceValue = tonumber(fibaro:getValue(DeviceID,"value"))
local DeviceName = fibaro:getName(DeviceID)
local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)

if (DeviceValue > 0) then
  fibaro:call(DeviceID, "turnOff")
  fibaro:debug(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde ausgeschaltet"))
elseif (DeviceValue == 0) then
  fibaro:call(DeviceID, "turnOn")
  fibaro:setGlobal('PushOver',"Ventilator ausgeschaltet (T4),"..DeviceRoom.. " " ..DeviceName.. ",-1,none")
end

Da es nicht funktioniert hat, habe ich einen Debug für die Taste generiert und bekomme die Fehlermeldung im Anhang.
Ich habe diese Art in anderen VDs eingesetzt dort klappt das mit dem selben Code.

Hat jemand für mich einen Tipp?

2.Frage: Kann man die Felder der VD “ID:” und “Label:” eventuell auslesen und in Variablen speichern um zu Melden Welche Taste gedrückt wurde??

VD-Vent-Error.jpg

Kann sein das Du einen String bekommst und noch auf number ändern musst?
tonumber()

@mdietinger
Danke für den Tipp, das war es leider nicht. Hab es allerdings inzwischen durch langes Probieren gelöst!
Der Syntax “SelfID” darf nicht als Variable verwendet werden. Habe die Variable auf “ModulId” umbenannt, jetzt läufts!
Spannend dass es in allen LUA Skripten bis jetzt funktioniert hat, nur im VD läufts nicht.
Offensichtlich gelten im VD eigene Regeln :wink:

Bleibt nur noch die Frage:
Kann man die Felder „ID:“ und „Label:“ der jeweiligen Tasten des Virtuellen Device eventuell auslesen und in Variablen speichern?
Hast du da eventuell auch eine Ahnung?

Schade mein Poblem ist schon wieder da!!
Ich bin echt verzweifelt, gerade eben gings noch, nun bekomm ich trotz Umbenennen der Variable schon wieder die Meldung

Hab hier mal im Forum gestöbert und viele Skriptbeispiele gefunden wo
selfId = fibaro:getSelfId()
funktioniert, meine Idee zur Lösung was also falsch!!

Ich meinte

local DeviceID = tonumber(fibaro:get(selfId, 'TCPPort')) --ID auslesen aus dem TCPPort Feld

Keine Ahnung ob du Labels auslesen kannst. (beim Drücken)

Habe mein Skript nun mal auf das Wesentliche beschränkt um das besser zu verstehen!
Im TCPORT Feld steht “562”

SelfId = fibaro:getSelfId()
local DeviceID = tonumber(fibaro:get(selfId, 'TCPPort'))
fibaro:debug(os.date("%d.%m.%Y - "..DeviceID.." - VDid:"..SelfId))

Führt zu einer leeren Varaible DeviceID! vermutlich wird die Zahl “562” eh schon als Zahl erkannt.

Seit ich BEIDE Variablen auf “local” gesetzt hab, funktioniert es nun wieder

local SelfId = fibaro:getSelfId()
local DeviceID = fibaro:get(SelfId,'TCPPort')
fibaro:debug(DeviceID.." - "..SelfId)

Sehr eigenartig, vielleicht MUSS man im Virtuellen Device lokale Variablen zwingend verwenden !?..
Danke jedenfalls für deinen Tipp!

So nun hab ich das Geheimnis gelüftet, den Fehler aber noch nicht behoben!
In einem virtuellen Device sieht eine LUA Fehlermeldung anders aus!

[ERROR] 15:30:05: line getSelfId()…"]:4
Bedeutet also das in der Zeile 4 des Codes DIESER Taste ein Fehler ist.
Ich habe also konkret in meinem VD einen Fehler in Zeile “4”

local SelfId = fibaro:getSelfId()
local DeviceID = fibaro:get(SelfId,'TCPPort')
local DeviceValue = tonumber(fibaro:getValue(DeviceID,"value"))
local DeviceName = fibaro:getName(DeviceID)
local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)

if (DeviceValue == 0) then
  fibaro:call(DeviceID,"turnOn")
  fibaro:debug(" "..DeviceRoom.." - "..DeviceName.." wurde eingeschaltet")
end

Da ich diesen Syntax genau so in vielen LUA Skripten verwende, kann es nur bedeuten, dass er speziell in einem VD nicht läuft, oder anders lautet.
Hat irgendjemand von euch ein VD mit Variablen laufen?
Ich bin gerade ziemlich ratlos!!

Ich glaub ich weiss wo Dein Fehler liegt.
Am get(
Sollte getValue( sein.

Unten ein Beispiel vom Fibaro Forum:

local device = fibaro:getSelfId();
local ipaddress = fibaro:getValue(device, "IPAddress");
local port = fibaro:getValue(device, "TCPPort");
FIBARO = Net.FHttp(ipaddress, port)

Also offenbar steh ich gerade am Schlauch :wink:

Wenn ich das ausprobiere:

local SelfId = fibaro:getSelfId()
local DeviceID = fibaro:get(SelfId,'TCPPort')
local DeviceID2 = fibaro:getValue(SelfId, "TCPPort")
fibaro:debug(DeviceID.." - "..DeviceID2)

Dann haben BEIDE Variablen den selben Inhalt!

Wenn ich danach folgendes abwechselnd in Zeile “4” Dazubaue:

local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID2)
local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)

kommt in beiden Fällen
[ERROR] 16:19:32: line 4: Assertion failed

Oder habe ich bei der Raumnamen Variable den Fehler??

Sonderbar.
Hast du den Raum schon mal geändert und keine Leerzeichen oder Sonderzeichen verwendet?
Wenn es hilft, kann ich später probieren das VD Nachzubauen.

Ich habe in fast allen Räumen Punkte in den Namen, aber das habe ich gerade getestet!
Auch ohne Sonderzeichen im RFaum kommt der Fehler

Wenn Du magst, kannst du gerne das VD von mir verwenden. Einfach die Datei Ventilator.txt im Anhang in
Ventilator.vfib umbenennen :wink:
Das VD ist sehr simpel, es liest die Device ID aus dem TCPPort Feld aus und schaltet das Gerät mit dieser ID ein und aus.
Die Knöpfe 4 und 5 sind zum Testen.
Ich habe dir auf Knopf 5 das Skript MIT Raumnamen gelegt, dort machts den Fehler.
Die Knöpfe 1-3 funktionieren OHNE Raum bestens, daher gehe ich davon aus, dass der Fehler NICHT bei der ID Übernahme stattfindet.

Wenn du das mit einem Device in deiner Anlage testen könntest wärs toll!!
Dann weiß ich zumindest ob es an meinen Devices liegt :wink:
Aber bitte keinen übermässigen Aufwand, ich bin schon sehr dankbar, wenn du mir mit deinen Tipps immer wieder hilfst!!!

Folgender Code geht.
Mit Debug.
wie vermutet brauchts du: DeviceID = tonumber( fibaro:getValue(SelfId,'TCPPort'))

local SelfId = fibaro:getSelfId()
fibaro:debug(SelfId)
--local DeviceID=350
DeviceID = tonumber( fibaro:getValue(SelfId,'TCPPort'))
fibaro:debug(DeviceID)
local DeviceValue = tonumber(fibaro:getValue(DeviceID,"value"))
fibaro:debug(DeviceValue)
local DeviceName = fibaro:getName(DeviceID)
fibaro:debug(DeviceName)

local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)

if (DeviceValue > 0) then
  fibaro:call(DeviceID, "turnOff")
  fibaro:debug(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde ausgeschaltet"))
  --fibaro:setGlobal('PushOver',"Ventilator AUS (T3),"..DeviceRoom.. " " ..DeviceName.. ",-1,none")
elseif (DeviceValue == 0) then
  fibaro:call(DeviceID, "turnOn")
  fibaro:debug(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde eingeschaltet"))
  --fibaro:setGlobal('PushOver',"Ventilator EIN (T3),"..DeviceRoom.. " " ..DeviceName.. ",-1,none")
end

Offensichtlich hattest du recht mit dem Fehler bei der Übernahme von “DeviceId” mit “tonumber”.
Interessant dabei ist, dass die Abfrage des “DeviceValue” zwar ohne “tonumber” geklappt hat, aber “DeviceRoom” und “DeviceName” nicht.
Dadurch hab ichs nicht gleich geschnallt, sorry!

Jedenfalls vielen Dank!!!

Hab das virtuelle Device angepasst und nochmal angehängt, falls es wer haben möchte.
Es schaltet das Device ein und schickt eine Pushover Nachricht mit dem Status!
Anhang einfach in VD_Ventilator.vfib umbenennen und importieren.

@mdietinger
Danke nochmal fürs testen und helfen!