Erste Gehversuche Bitte um Hilfe

Hallo,

ich versuche mich gerade einmal an meinen ersten Scripts. Hab die HC2 nun seit 2 Stunden.

Was will ich:

Der Schalter soll an jedem Tag zu einer bestimmten Uhrzeit angehen und wieder ausgehen.

Ich habe es versucht, aber wenn ich das Script starte geht der Schalter an und gleich wieder aus.

Würde mich freuen wenn Ihr mich da ein wenig ranführt.

Hier das Script

–[[
%% autostart
%% properties
%% events
%% globals
–]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) … “:” … string.format("%02d", currentDate.min) == “13:18”) )
)
then
fibaro:call(15, “turnOn”);
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger[“type”] == “autostart”) then
tempFunc()
else
end

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource[“type”] == “other”
)
then
fibaro:call(15, “turnOn”);
end

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) … “:” … string.format("%02d", currentDate.min) == “13:21”) )
)
then
fibaro:call(15, “turnOff”);
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger[“type”] == “autostart”) then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource[“type”] == “other”
)
then
fibaro:call(15, “turnOff”);
end
end

Schau dir mal meinen Code an.
Der macht genau das was du suchst… Vielleicht kannst du den Fehler davon ableiten

--[[
%% autostart
%% properties
%% globals
--]]

--- ### Variablen ### ---
local licht = xx
local sourceTrigger = fibaro:getSourceTrigger();
fibaro:debug(os.date("Szene wurde erstmals am %d.%m.%Y um %H:%M Uhr gestartet."))

--- ### Schleifenschutz ### ---
-------------------------------
if (fibaro:countScenes()>1) then
fibaro:abort();
end

--- ### Skript Anfang ### ---
function lichtsteuerung()
   local currentDate = os.date('*t');

--- ### Licht an ### ---
if ( ((string.format('%02d', currentDate.hour) .. ':' .. string.format('%02d', currentDate.min) == "14:00")) ) then
	fibaro:call(licht, "turnOn");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))

--- ### Licht aus ### ---
elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:05") )) then
	fibaro:call(licht, "turnOff");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))
end
--- ### Skript Ende ### ---

     setTimeout(lichtsteuerung, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 lichtsteuerung();
end

Ok es funktioniert.

Vll kannst du mir noch ein paar kurze Erläuterungen geben:

1)So wie ich es verstehe kannst du in Zeile 8 mehrere Schalter einstellen und so leichter hinzufügen, da du es nur Licht nennst und dann im Script dich darauf beziehst?

  1. Wenn ich jetzt möchte, dass das Licht dann nochmal um 18 uhr angeht und um 18:30 wieder aus, nutze ich dann ein neues Script oder kopiere ich nur die Einträge nochmal verbunden mit elseif??

Danke

Erst mal das einfache.

Lich an / Licht aus:
Wnen du möchtest das das licht wieder eingeschaltet wird ergänzt du einfach eine weitere Zeile:

elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "xx:xx") )) then
	fibaro:call(licht, "turnOn");

Wichtig ist nur, dass du am ende der if-abfragen ein end schreibst.

Um gleichzeitig mehrere Lichter zuschalten kannst du es “manuell” machen.
Sprich in der entsprechenden Zeile den gewünschten call eintragen. So wie in Zeile 24 fibaro:call(deviceID, “turnOn”)

Zu Punkt 1:
ich habe mit eine lokalen variablen local licht = xx gearbeitet damit es übersichtlich bleibt. Wenn du mehrere Lichter schalten willst kannst du entweder weitere “locals” anlegen oder du arbeitest mit einem array.
Damit kannst du dir die einzelnen calls pro device sparen.
Das würde dann so aussehen:

local lightID = {9,7,5,11,38}

for i, v in ipairs(lightID) do
fibaro:call(lightID[i], 'turnOn';
end

In der Szene würde es dann so aussehen:

--[[
%% autostart
%% properties
%% globals
--]]

--- ### Variablen ### ---
local lightID = {9,7,5,11,38}
local sourceTrigger = fibaro:getSourceTrigger();
fibaro:debug(os.date("Szene wurde erstmals am %d.%m.%Y um %H:%M Uhr gestartet."))

--- ### Schleifenschutz ### ---
-------------------------------
if (fibaro:countScenes()>1) then
fibaro:abort();
end

--- ### Skript Anfang ### ---
function lichtsteuerung()
   local currentDate = os.date('*t');

--- ### Licht an ### ---
if ( ((string.format('%02d', currentDate.hour) .. ':' .. string.format('%02d', currentDate.min) == "14:00")) ) then
	for i, v in ipairs(lightID) do
	fibaro:call(lightID[i], 'turnOn';
        end
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))

--- ### Licht aus ### ---
elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:05") )) then
	for i, v in ipairs(lightID) do
	fibaro:call(lightID[i], 'turnOff';
	end
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))

--- ### Licht an ### ---
elseif ( ((string.format('%02d', currentDate.hour) .. ':' .. string.format('%02d', currentDate.min) == "14:10")) ) then
	for i, v in ipairs(lightID) do
	fibaro:call(lightID[i], 'turnOn';
        end
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))

--- ### Licht aus ### ---
elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:15") )) then
	for i, v in ipairs(lightID) do
	fibaro:call(lightID[i], 'turnOff';
	end
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))
end

--- ### Skript Ende ### ---

     setTimeout(lichtsteuerung, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 lichtsteuerung();
end

Jetzt möchte ich gern noch eine Meldung mit einbauen, wenn das Licht an geht.

Ich habe dazu am ende des scripts folgendes angehangen:


local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(15, "value")) > 0 )
or
startSource["type"] == "other"
)
then
	fibaro:call(2, "sendDefinedEmailNotification", "6");

sieht jetzt so aus:

--[[
%% autostart
%% properties
%% globals
15 value
--]]
 
--- ### Variablen ### ---
local licht = 15
local sourceTrigger = fibaro:getSourceTrigger();
fibaro:debug(os.date("Szene wurde erstmals am %d.%m.%Y um %H:%M Uhr gestartet."))
 
--- ### Schleifenschutz ### ---
-------------------------------
if (fibaro:countScenes()>1) then
fibaro:abort();
end
 
--- ### Skript Anfang ### ---
function lichtsteuerung()
   local currentDate = os.date('*t');
 
--- ### Licht an ### ---
if ( ((string.format('%02d', currentDate.hour) .. ':' .. string.format('%02d', currentDate.min) == "´16:13")) ) then
	fibaro:call(licht, "turnOn");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))
 
--- ### Licht aus ### ---
elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "23:49") )) then
	fibaro:call(licht, "turnOff");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))
end

if ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "04:00") )) then
	fibaro:call(licht, "turnOn");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))

elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "08:30") )) then
	fibaro:call(licht, "turnOff");
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))
end	

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(15, "value")) > 0 )
or
startSource["type"] == "other"
)
then
	fibaro:call(2, "sendDefinedEmailNotification", "6");
end
--- ### Skript Ende ### ---
 
     setTimeout(lichtsteuerung, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 lichtsteuerung();
end


leider kommt keine Meldung, was ist falsch am Script?

Danke

Hi,

nutze doch bitte die Code-Funktion, damit es übersichtlich bleibt. Danke.

Lies dir am Besten auch mal ein paar Artikel auf unserer Seite durch. Du vermischt in der Szene ziemlich viel. Es handelt sich hier um eine Autostart-Szene bei der du versucht diese auch durch eine Statusänderung zu triggern. Das funktioniert so aber nicht.

Gruß

Sorry,

alles, klar.
sagst du mir bitte wie ich die Scripte sauber poste, damit das so aussieht wie bei euch?

Danke

Hi,
oberhalb des Eingabefensters für die Posts ist der Button “code”.
Den drückst Du, fügst deinen Code ein und drückst den Button erneut.
Dann sieht das gut aus und erleichtert das durchsehen.

VG Hoggle

Mit Zeile 50 erhälst Du nur eine Mail, wenn das Script manuell gestartet wird.

Hallo Stefan,

schau dir doch mal auf der folgenden Seite den call und die dazugehörige Erklärung zu “sendDefinedEmailNotification” an.
Ich vermute was du machen möchtest ist eine E-Mail zu senden das müsstest du mit dem call “sendEmail” erledigen.
http://www.fibarouk.co.uk/support/lua/actions-use-fibarocall-api/actions-arguments-usage/

Dazu musst du die ID deines Telefons angeben. In deinem Code ist es die “2”… ob das stimmt weiß ich nicht. Du findest die ID über die API von Fibaro raus:
http://IP-HC2/api/devices

Wenn du eine Mail senden möchtest musst du einfach nur über dem jeweiligen call (zb. turnOff) folgende Zeilen erweitern:
fibaro:call(handyID, "sendEmail", Lichtsteuerung, Das Licht wurde ausgeschaltet.)

Ganzer Code:

--[[
%% autostart
%% properties
%% globals
--]]

--- ### Variablen ### ---
local licht = xx
local handyID =
local sourceTrigger = fibaro:getSourceTrigger();
fibaro:debug(os.date("Szene wurde erstmals am %d.%m.%Y um %H:%M Uhr gestartet."))

--- ### Schleifenschutz ### ---
-------------------------------
if (fibaro:countScenes()>1) then
fibaro:abort();
end

--- ### Skript Anfang ### ---
function lichtsteuerung()
   local currentDate = os.date('*t');

--- ### Licht an ### ---
if ( ((string.format('%02d', currentDate.hour) .. ':' .. string.format('%02d', currentDate.min) == "14:00")) ) then
	fibaro:call(licht, "turnOn");
        fibaro:call(handyID, "sendEmail", Lichtsteuerung, Das Licht wurde eingeschaltet.)
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr eingeschaltet.'))

--- ### Licht aus ### ---
elseif ( ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "14:05") )) then
	fibaro:call(licht, "turnOff");
        fibaro:call(handyID, "sendEmail", Lichtsteuerung, Das Licht wurde ausgeschaltet.)
	fibaro:debug(os.date('Licht wurde um %H:%M Uhr ausgeschaltet.'))
end
--- ### Skript Ende ### ---

     setTimeout(lichtsteuerung, 60*1000);
end
 
if (sourceTrigger['type'] == 'autostart') then
 lichtsteuerung();
end