Hallo, ich glaube ich bin etwas mehr Anfänge als “marcbore”, denn ich bekomm nichts zum Laufen.
Alles was ich möchte, ist Bei Anruf, egal von wem, eine Szene zustarten.
Die Mainloop Schleife sieht so aus:
local thisdevice = fibaro:getSelfId();
local ip = fibaro:getValue(thisdevice, 'IPAddress');
local port = fibaro:getValue(thisdevice, 'TCPPort');
local loopCount = 0;
fibaro:debug("Start");
tcpSocket = Net.FTcpSocket(ip, port);
tcpSocket:setReadTimeout(60000);
result, err = tcpSocket:write("r\n");
while (err<2) do
result, err = tcpSocket:read();
result = string.upper(result or string.char());
if(result~="") then
fibaro:debug(result);
local msg={} ; i=1
for str in string.gmatch(result, "([^;]+)") do
msg[i] = str
i = i + 1
end
fibaro:call(thisdevice, "setProperty", "ui.Action.value", msg[2]);
fibaro:setGlobal("FritzBoxStatus", msg[2])
--fibaro:setGlobal("FritzBoxTelNr", msg[4])
if(msg[2]=="CALL") then
fibaro:call(thisdevice, "setProperty", "ui.Number.value", msg[6]);
end
if(msg[2]=="RING") then
fibaro:call(thisdevice, "setProperty", "ui.Number.value", " " .. msg[4]);
fibaro:debug(msg[2])
fibaro:setGlobal("FritzBoxTelNr", msg[4])
end
fibaro:call(thisdevice, "setProperty", "ui.DateTime.value", msg[1]);
fibaro:startScene(106) --Startet die Fritzbox-Szene zur Reduzierung der Sonos-Lautstärke
end
loopCount=loopCount+1;
if (loopCount==60) then -- approx 1 hour
err=1234
end;
end
fibaro:debug("Closing Connection");
tcpSocket:disconnect();
fibaro:sleep(2500);
fibaro:debug("Exit Code=" .. err);
fibaro:debug("Loop=" .. loopCount);
Die eingehende Anrufe Szene schaut so aus:
--[[
%% properties
%% events
%% globals
--]]
--Szene wird direkt durch das Fritzbox-VD getriggert
--Die GVs werrden durch den manuellen Start der Szene angelegt
--Folgende GV werden benötigt und automatisch angelegt:
--FritzBoxAnsage, FritzBoxTelNr, FritzBoxStatus,
--GV "FritzBox...." werden aus dem Fritzbox-VD befüllt
--Standard-GV des Sonos-Commanders werden benötigt
local Zulaut = 25 --Lautstärkewert, ab den die Lauststärke reduziert wird
local Leiser = 10 --Auf diesen Wert wird die Latstärke reduziert
local SonosCommander = 206 -- ID des Sonos Commanders in der Küche
local Oma = 01732763450
local OmaAnsage = "Fritz-nas/fritz.nas/Evanescence - Lost in Paradise.mp3"
local Chris = 01732763450
local ChrisAnsage = "Fritz-nas/fritz.nas/Evanescence - Lost in Paradise.mp3"
local currentDate = os.date("*t")
local var = {"FritzBoxAnsage", "FritzBoxTelNr", "FritzBoxStatus"} --benötigte GV
local Ansage = tonumber(fibaro:getGlobalValue("FritzBoxAnsage")) --aktiviert die Ansage; 0 (Aus) oder 1 (Ein)
local maxID = 1000
fibaro:debug(fibaro:getGlobalValue("FritzBoxStatus"))
fibaro:debug("Tel: "..fibaro:getGlobalValue("FritzBoxTelNr"))
fibaro:debug("Ansage-Status: "..Ansage)
if fibaro:countScenes() > 1 then
fibaro:debug("stop scene");
fibaro:abort();
end
if (tostring(fibaro:getGlobalValue("FritzBoxStatus")) == "RING") then
fibaro:debug("Eingehender Anruf")
--prüft bei eingehenden Anruf die Nummer uns "sagt" Anrufernamen über Sonos an
if Ansage == 1 then
fibaro:debug("Ansage aktiv")
if (tonumber(fibaro:getGlobalValue("FritzBoxTelNr")) == Oma
and (currentDate.wday == 1 or currentDate.wday == 7)) -- hier nur am Sa und So
then
fibaro:setGlobal("SONOS_MUSIC", OmaAnsage)
fibaro:call(SonosCommander, "pressButton", "2") -- Music-Button vom Commander
fibaro:debug("Oma Anruf")
elseif (tonumber(fibaro:getGlobalValue("FritzBoxTelNr"))) == Chris
then
fibaro:setGlobal("SONOS_MUSIC", ChrisAnsage)
fibaro:call(SonosCommander, "pressButton", "2") -- Music-Button vom Commander
fibaro:debug("Chris Anruf")
else fibaro:debug ("keine Nummer hinterlegt")
end
end
-------Sonos leiser stellen
for id = 1, maxID do
local deviceType = fibaro:getType(id)
if (deviceType == 'com.fibaro.sonosSpeaker') then
if (tonumber(fibaro:getValue(id, "volume")) >= Zulaut) then
fibaro:debug("Telefon klngelt und "..fibaro:getName(id).." ist zu laut")
fibaro:call(id,"setVolume", tonumber(Leiser))
fibaro:debug(fibaro:getName(id).." leiser gestellt")
--local room = fibaro:getRoomNameByDeviceID(id)
else
fibaro:debug("Teelfon klingelt, "..fibaro:getName(id).." ist nicht zu laut")
end
end
end
end
-- Funktion zum Anlegen einer Globalen Variablen
function globalVar(var,val)
local http = net.HTTPClient()
http:request("http://127.0.0.1:11111/api/globalVariables", {
options = {
method = 'POST',
headers = {},
data = '{"name":"'..var..'","value":"'..val..'"}',
timeout = 10000
},
success = function(response)
local result = response.data;
if response.status == 200 or response.status == 201 then
fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
else
fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
end
end,
error = function(err)
fibaro:debug('[ERROR] ' .. err)
end
})
end
local trigger = fibaro:getSourceTrigger()
if (trigger['type']=='other') then
--fibaro:debug("Script manuell gestartet; GV werden geprüft")
for i = 1,#var do
if (fibaro:getGlobal(var[i]) ~= nil) then
--fibaro:debug('Benötigte Variable ' ..var[i].. ' vorhanden.')
if (fibaro:getGlobal(var[i]) == 'NaN') then
--fibaro:debug('Inhalt: ' ..fibaro:getGlobal(var[i]).. ' erkannt. Wird korrigiert.')
fibaro:setGlobal(var[i], '0') end
else
--fibaro:debug('Benötigte Variable ' ..var[i].. ' NICHT erkannt. Wird erstellt....')
globalVar(var[i], '0')
end
end
end
Der manuelle Start der Szene wird abgebrochen mit:
[DEBUG] line29: attempt to concatenate a nil value
Wo muss ich was schrauben, damit die nötigen Variablen angelegt werden und bei einem Anruf, egal von welche Nummer, die Szene 106 gestartet wird?
Vielen Dank euch schon mal!