Hallo
habe mal wieder eine Frage.
Habe versucht eine Function zu schreiben und bin nicht in der Lage den return an die function zurück zu geben.
Wie kann ich das an meinem Skript machen. Es ist eine Scene
Es funktioniert nur der return schafe ich nicht.
--[[
%% properties
%% events
%% globals
--]]
function statusVU();
local http = net.HTTPClient()
http:request('http://192.168.11.11:80/web/powerstate', {success = function(resp)
local vuStatusAus = (string.find(resp.data, "true"))
if vuStatusAus == nil then
fibaro:debug("Vu+ Duo2 ist an.")
return true
else
fibaro:debug("Vu+ Duo2 ist aus.")
return false
end
end })
end
print(statusVU())
an einem ähnlichen Problem habe ich auch schonmal gebastelt… Immer wenn mein vu+ im Standby war und eine Pushnachricht vom HC2 bekommen hat, war der vu+ verreckt… Daher habe ich in einem VD mir Button angelegt, bei denen vor der Meldung abgefragt wird, ob der vu+ an ist… wenn nicht, dann wird eben keine Meldung geschickt:
local selfId = fibaro:getSelfId();
local ip = fibaro:get(selfId, “IPAddress”)
local ws = Net.FHttp(ip, 80)
dane = ws:GET("/web/powerstate");
data = string.find(dane,"<e2instandby>");
datatxt = string.sub(dane, data+14, data+15);
if datatxt == “fa”
then
local url = “/web/message?text=Waschmaschine%20ist%20fertig!&type=1&timeout=10”
local resp = ws:GET(url)
fibaro:debug(“on”)
fibaro:debug(datatxt)
fibaro:debug(resp)
fibaro:log(“Vu+ Duo2 ist an”)
else
fibaro:debug(“off”)
fibaro:debug(datatxt)
fibaro:log(“Vu+ Duo2 ist aus”)
end
Damit funzt es einwandfrei… Vieleicht kannst du damit ja was anfangen…
Hallo Matthias
das mit der Waschmaschine habe ich ähnlich gelöst ich wollte das script für eine scene umbauen(anpassen).
Wollte nur wegen der function nachfragen und dem return. Wollte es verstehen lernen.
Dank passt schon.
wie gesagt, ich bin an deiner Scene auch verzweifelt, darum habe ich es wie oben beschrieben gelöst… Wenn Waschmischine fertig, dann löst mein VD (siehe oben) aus und ich (bzw. meine Frau) bekomme die Meldung auf dem Fernseher angezeigt…
Problem 1: Die XML-Response vom VU+ kommt nicht sauber zurück, bzw. wird vom HC2 nicht richtig interpretiert. Dadurch funktioniert das Abfragen des Status nicht korrekt.
Problem 2: Der fibaro:debug-Befehl ist zu schnell und die Abfrage zu langsam. Dadurch kann der Status nicht debuggt werden.
Problem 3: Der VU+ Receiver kann 3 verschiedene Zustände haben. On, Standby, Off.
Um alle Probleme zu umgehen, muss das skript ein wenig anders aufgebaut werden. Poste hier später einen möglichen Lösungsansatz, welcher auf einer anderen Schnittstelle zum VU+ basiert. Da wird eine JSON zurückgefordert, welche sauber getrennt werden kann.
Der HTTP-Call scheint wirklich um einiges zu langsam zu sein, um diesen in eine Funktion auszulagern. Wäre dir eine Umsetzung mit globalen Variablen recht? Ich bin der Meinung, dass das funktionieren könnte.
Hi
Vielen Dank für die Mühe. Das auslagern habe ich schon gemacht über die primäre stelle der VD von der VU+.
Primär ging es mir darum das alles zu verstehen und vor allem den return weiter zu reichen an die function.
Hallo
habe keine ruhe gehabt und mehrere tage rum getestet, leider ohne erfolg.
Kann mann das return nicht in eine locale Variable übergeben.
Habe den Code etwas verentert.
Eine frage wo landet in der Syntax der return?
function statusVU();
local http = net.HTTPClient()
http:request('http://192.168.11.33:80/web/powerstate', {success = function(resp)
local vuStatusAus = (string.match (resp.data, "true"))
return vuStatusAus
end})
end;
print(statusVU())
ich hoffe das doch eine lösung gefunden werden kann da ich nur bei bedarf in verschiedene scenen abfrage.
warum tust Du “vuStatusAus” nicht gleich in eine globale Var?
Oder du definierst “vuStatusAus” außerhalb/vor der Funktion und befüllst sie innerhalb der Funktion.
Hi
Das habe ich alles schon probiert Leider geht das nicht. Mit globale variablen wolte ich nicht da man das beschreiben muß und wider einlesen muß. Ich habe aus dem französischen Forum das.
Sorry, it won’t work.
The net.HTTPClient is an asynchronous function, so the content is executed after the end of your main LUA script.
So you will never be able to get the return value, that is why you always get nil.
If you use the net.HTTPClient() fonction, you have to put the remaining LUA instructions inside your success() function.
There are many net.HTTPClient in this forum (have a look at my Watchdog script) and on the official Fibaro forum.
Ich muß nur noch schauen wie ich das einbaue mit der “put”.
Hallo
Leider kann ich keine lösung finden für mein problem finden. Habe schon wochen gelesen.
Gibt es eine “get” oder “request” Möglichkeit wie weiter unten nur für scene, aber ohne fonktion so wie unten nur für eine scene.
local selfId = fibaro:getSelfId();
local ip = fibaro:get(selfId, "IPAddress")
local url = "/web/powerstate"
local ws = Net.FHttp(ip, 80)
local resp = ws:GET(url)
--fibaro:debug(resp)
if (string.find(resp, "true") == NIL) then
fibaro:debug('AN')
else
fibaro:debug('AUS')
end