Hallo,
Ich hatte in der Vergangenheit hier im Forum bereits berichtet, dass ich Probleme mit der Umsetzung einer Lichtsteuerung bei Wechsel- bzw. Kreuzschaltungen habe. Bei uns im Haus sind in 70% der Räume Kreuzschaltungen verkabelt mit teilweise bis zu 5 Schaltern in Reihe. Entgegen den im Netz meist verfügbaren Schaltplänen sind bei uns KEINE COM Leitungen verlegt, sondern alle Wechselschaltungen sind als Kreuzschaltung realisiert. Dies führt leider dazu, dass wenn an einem Schalter ein Fibaro-Switch verbaut ist und manuell ein anderer Schalter der Reihe betätigt wird, der Fibaro-Switch nicht merkt, dass das Licht woanders geschaltet wurde. Dies liegt leider in der Natur der Kreuzschaltung und stellt keinen Fehler des Fibaro-Switch dar.
Ich hatte dann zunächst versucht über LUX Abfragen des Motion Sensors zu erkennen, ob Licht = AN und dann entsprechend zu reagieren. Dies hat aber in einigen Räumen mit stark wechselndem Lichteinfall von Draußen nie wirklich zuverlässig funktioniert.
Die Lösung habe ich jetzt mit den neuen Double Switch 2 gefunden, da diese jetzt auch den Strom messen können. Auf diese Weise erkennt der Fibaro-Switch auch wenn ein anderer Schalter in der Kreuzschaltung manuell betätigt wurde, da durch den Fibaro-Switch dann ja auch Strom fließt bzw. kein Strom mehr fließt. Ich habe meine Kreuzschaltungen daher im Haus alle auf die neuen Switch 2 umgestellt und es läuft seit einigen Wochen ohne Probleme.
Die Kabel habe ich entsprechend folgendem Plan verbunden:
– LINK ENTFERNT –
Dazu habe ich 2 Szenen angelegt. Eine Szene hat nur den Zweck beim Double-Switch die Schalter S1 + S2 immer genau entgegengesetzt zu schalten. Wird also S1 auf AN gesetzt, dann schaltet die Szene S2 = AUS und umgekehrt.
Szene: S1 + S2 entgegengesetzt schalten:
--[[
%% properties
362 value
363 value
%% globals
--]]
-- local scene = 82 -- ID der Szene
local S1 = 362 -- ID Switch 1
local S2 = 363 -- ID Switch 2
local statusS1 = fibaro:getValue(S1, "value");
local statusS2 = fibaro:getValue(S2, "value");
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1)
then
fibaro:debug("Abbruch wegen doppelter Szene");
fibaro:abort();
end
-- Ermitteln welches Device Auslöser der Szene war
local startSource = fibaro:getSourceTrigger();
local trigger = 0;
if (startSource['type'] == 'property')
then
trigger = startSource["deviceID"]
elseif (startSource["type"] == "global")
then
trigger = startSource["name"]
else
trigger = "other"
end
fibaro:debug("Auslöser der Szene ="..trigger);
-- Zeige aktuellen Status S1 + S2 an
print("Status S1 = "..statusS1);
print("Status S2 = "..statusS2);
-- Schalte S1 + S2 je nach Status
print("Beginne Script");
if (trigger == S1)
then
if ((tonumber(statusS1) > 0 )
or startSource["type"] == "other")
then
fibaro:call(S2, "turnOff");
print("Auslöser S1 = ON "..statusS1);
print("S2 = OFF");
-- fibaro:abort();
else
fibaro:call(S2, "turnOn");
print("Auslöser S1 = OFF "..statusS1);
print("S2 = ON");
-- fibaro:abort();
end
end
if (trigger == S2)
then
if ((tonumber(statusS2) > 0 )
or startSource["type"] == "other")
then
fibaro:call(S1, "turnOff");
print("Auslöser S2 = ON "..statusS1);
print("S1 = OFF");
-- fibaro:abort();
else
fibaro:call(S1, "turnOn");
print("Auslöser S2 = OFF "..statusS1);
print("S1 = ON");
-- fibaro:abort();
end
end
print("Kurze Pause...");
fibaro:sleep(1000); -- Verhindern, dass sofort rückwärts geschaltet wird
print("Ende Script");
In der 2. Szene erfolgt die eigentliche Lichtschaltung bei Bewegung, wenn ein definierter LUX Wert unterschritten ist. Manuelle Schalterbetätigungen werden auch erkannt.
Szene Autolicht:
--[[
%% properties
235 value
362 power
363 power
%% globals
--]]
local scene = 126 -- ID der Szene
local motion = 235 -- ID des Bewegungssensors
local lux = 237 --ID des Lichtsensors
local switchS1 = 362 -- ID des Relay Switches S1
local switchS2 = 363 -- ID des Relay Switches S2
local manuell = 0 -- Variable für manuelle Schaltung
local LuxMin = 10 -- Lichtwert <= ab dem geschaltet wird
local wait = 30 -- Variable für Warteschleife bis Ausschalten ohne Bewegung
-----------------------------------------------------------------------------
-- Ab hier keine Änderungen mehr vornehmen
-----------------------------------------------------------------------------
---------------------------------------------------------------------------
-- Lösche doppelte Szene(n)
---------------------------------------------------------------------------
print("Anzahl Szenen = "..fibaro:countScenes());
if (fibaro:countScenes() > 1)
then
fibaro:debug("Abbruch wegen doppelter Szene");
fibaro:abort();
end
---------------------------------------------------------------------------
-- Ermitteln welches Device Auslöser der Szene war
---------------------------------------------------------------------------
local startSource = fibaro:getSourceTrigger();
local trigger = 0;
if (startSource['type'] == 'property')
then
trigger = startSource["deviceID"]
elseif (startSource["type"] == "global")
then
trigger = startSource["name"]
else
trigger = "other"
end
print("Auslöser der Szene ="..trigger);
---------------------------------------------------------------------------
-- Variablen Power und Urlaubsstatus
---------------------------------------------------------------------------
-- fibaro:sleep(2000); -- Pause für Power Wert Aktualisierung
local S1Power = tonumber(fibaro:getValue(switchS1, "power"))
local S2Power = tonumber(fibaro:getValue(switchS2, "power"))
local Urlaubsstatus = fibaro:getGlobalValue("UrlaubsModus")
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
---------------------------------------------------------------------------
-- Schalte Licht ein wenn Bewegung, Licht und Nacht
---------------------------------------------------------------------------
local motionvalue = fibaro:getValue(motion, "value");
local luxvalue = fibaro:getValue(lux, "value");
print("Bewegung = "..motionvalue.." / Lux = "..luxvalue);
print("Urlaubsstatus = "..Urlaubsstatus);
if (( tonumber(motionvalue) > 0 )
and ( tonumber(luxvalue) <= LuxMin )
and (S1Power == 0)
and (S2Power == 0)
and (Urlaubsstatus == "AUS")
or startSource["type"] == "other")
then
print("Ausgelöst mit Bewegung = "..motionvalue.." / Lux = "..luxvalue);
local deviceValue1 = tonumber(fibaro:getValue(switchS1, "value"));
if (deviceValue1 > 0)
then
fibaro:call(switchS1, "turnOff");
fibaro:debug("Schalter S1 = OFF");
fibaro:sleep(6000); -- Pause für Lux Wert Aktualisierung
else
fibaro:call(switchS1, "turnOn");
fibaro:debug("Schalter S1 = ON");
fibaro:sleep(6000); -- Pause für Lux Wert Aktualisierung
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
local starttimer = wait;
local timer = (starttimer);
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000);
-- Stopp wenn Schalter manuell betätigt wird und warte 5 Sekunden, um ein
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
local luxwert = fibaro:getValue(lux, "value");
print("Timer = "..timer.." / Luxwert = "..luxwert);
S1Power = tonumber(fibaro:getValue(switchS1, "power"))
S2Power = tonumber(fibaro:getValue(switchS2, "power"))
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
if (S1Power + S2Power) == 0
then
timer=1;
print("Licht manuell ausgeschaltet / Lux = "..luxwert);
manuell = 1;
fibaro:sleep(5000);
fibaro:debug("Abbruch wegen manueller Schaltung");
fibaro:abort();
end
timer = timer - 1;
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if ((tonumber(fibaro:getValue(motion, "value"))) > 0 and (manuell < 1))
then
timer=starttimer;
print("Resete Time...");
end
until (timer < 1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
local deviceValue3 = tonumber(fibaro:getValue(switchS1, "value"));
if (manuell < 1)
then
if (deviceValue3 > 0)
then
fibaro:call(switchS1, "turnOff");
print("Schalter S1 = OFF");
else
fibaro:call(switchS1, "turnOn");
print("Schalter S1 = ON");
end
print("Timer abgelaufen / Schalte Licht aus");
end
print("Ende der Szene");
manuell = 0;
fibaro:sleep(6000); -- Warten auf Lux Wert Anpassung
S1Power = tonumber(fibaro:getValue(switchS1, "power"))
S2Power = tonumber(fibaro:getValue(switchS2, "power"))
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
-- fibaro:killScenes(scene);
fibaro:abort();
end
-------------------------------------------------------------------------------
-- Ausschalten wenn Licht anderweitig angeschaltet wurde
-------------------------------------------------------------------------------
if ((( S1Power > 0 ) or (S2Power > 0)) and (Urlaubsstatus == "AUS"))
then
fibaro:sleep(6000); -- warten auf Luxwert Anpassung
S1Power = tonumber(fibaro:getValue(switchS1, "power"))
S2Power = tonumber(fibaro:getValue(switchS2, "power"))
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
local starttimer2 = wait;
local timer = (starttimer2);
print("Starte Timer");
repeat
fibaro:sleep(1000);
-- Stopp wenn Schalter manuell betätigt wird und warte 5 Sekunden, um ein
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
local luxwert = fibaro:getValue(lux, "value");
print("Timer = "..timer.." / Luxwert = "..luxwert);
S1Power = tonumber(fibaro:getValue(switchS1, "power"))
S2Power = tonumber(fibaro:getValue(switchS2, "power"))
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
if (S1Power + S2Power) == 0
then
timer=1;
print("Licht manuell ausgeschaltet / Lux = "..luxwert);
manuell = 1;
fibaro:sleep(5000);
print("Abbruch wegen manueller Schaltung");
fibaro:abort();
end
timer = timer - 1;
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if ((tonumber(fibaro:getValue(motion, "value"))) > 0 and (manuell < 1))
then
timer=starttimer2;
print("Resete Time...");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
local deviceValue3 = tonumber(fibaro:getValue(switchS1, "value"));
if (manuell < 1)
then
if (deviceValue3 > 0)
then
fibaro:call(switchS1, "turnOff");
print("Schalter S1 = OFF");
else
fibaro:call(switchS1, "turnOn");
print("Schalter S1 = ON");
end
print("Timer abgelaufen / Schalte Licht aus");
end
print("Ende der Szene");
fibaro:sleep(6000);
S1Power = tonumber(fibaro:getValue(switchS1, "power"))
S2Power = tonumber(fibaro:getValue(switchS2, "power"))
print("S1 Power = "..S1Power.."/ S2 Power = "..S2Power);
manuell = 0;
-- fibaro:killScenes(scene);
fibaro:abort();
end
Grüße
Arno