Return an eine Function

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())


Vielen dank im voraus.

Hallo,

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…

Gruß

Matthias

hier findest du auch noch wertvolle Informationen:

https://www.siio.de/connected-home/so-steuerst-du-dein-vu-mit-dem-fibaro-homecenter-und-andersrum/#comment-7334

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… :wink:

Hi,

sieht der Debug deiner Szene so aus (wenn ON)?

[DEBUG] 22:50:41:
[DEBUG] 22:50:41: Vu+ Duo2 ist an.

Gruß

An wen ging die Frage?

Hi boomx
Ja der sieht so aus. Der erste Eintrag bleibt leer. Ich brauche aber true oder false.

Gruß

Hi,

hier scheinen mehrere Probleme zusammenzukommen:

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.

Gruß

Und noch ein Problem :frowning:

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.

Gruß

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.

Gruß

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.

Vielen dank im voraus.

Hi,

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.

VG Hoggle

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”.

Danke erstmal.

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

danke im voraus