Wechselschaltung mit neuem Double Switch 2

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

Hallo,

ich möchte darauf hinweisen, dass wir hier keine Tipps, Anschlusspläne oder sonst etwas hinterlegen wollen. Bitte wendet euch an euren Elektriker und hantiert nicht mit 230V. Es besteht Lebensgefahr und fehlender Versicherungsschutz. Den Link habe ich entfernt und das Thema geschlossen.

Danke fürs Verständnis.

Gruß