Wechselschaltung mit neuem Double Switch 2

Hallo,

mein Beitrag von Gestern jetzt ohne Link zum Schaltplan und mit Kommentarfunktion…ist vielleicht auch für andere interessant…

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.

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 
---------------------------------------------------------------------------
local S1Power = tonumber(fibaro:getValue(switchS1, "power"))
local S2Power = tonumber(fibaro:getValue(switchS2, "power"))
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);

if (( tonumber(motionvalue) > 0 )
and ( tonumber(luxvalue) <= LuxMin )
and (S1Power == 0)
and (S2Power == 0)
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

Die Schaltung nach o.a. Szenen funktioniert bei mir in mehreren Räumen seit einigen Wochen zuverlässig und problemlos.

Grüße
Arno

Hi Arno,

vielen Dank für das Skript.

Ich habe auch im Haus sehr viele Kreuzschaltungen - allesamt ohne COM Leitung. Nichts desto trotz kann man auch die Wechsel / Kreuzschaltungen mit neuem und altem Fibaro Relais so installieren, dass der HC2 IMMER den richtigen Status der Beleuchtung erkennt. In meinem Falle habe ich eine Kreuzschaltung mit 4 Schaltern. 2* normal, 2* Kreuz. Der “Trick” besteht nun darin, dass der Relay Switch am letzten Schalter (dies kann per Definition kein Kreuzschalter sein, sondern ist ein “normaler” innerhalb der Kreuzschaltung) VOR (nicht räumlich - obwohl es meist so ist - sondern logisch) der Leuchte sein muß, also der letzte bevor das Leuchtmittel kommt. Ist eigentlich auch recht leicht rauszufinden, welcher das ist (möchte aber nicht weiter hier beschreiben, da man das dem Elektriker überlassen sollte).

So funktioniert es bei mir ohne Probleme.

Aber Dein Skript ist super, da kann man sich die Sucherei sparen :slight_smile:

VG

kandetvara

Hallo,

ich versteh die ursprüngliche Problematik auch nicht so ganz. Der erste und letzte Schalter in einer Kreuzschaltung ist, wie schon erwähnt, grundsätzlich ein Wechselschalter. Auf der einen Seite wird die Phase angeschlossen, auf der anderen die Lampe. Legt man den geschalteten Kontakt statt auf die Lampe auf den S1 bzw. S2 des Relay Switch, dann funktioniert alles wie bei einem normalen Aus/Wechsel/Serienschalter.

Also ihr habt beide den Nulleiter bei Eurem Fibaro switch. Ich habe das anders gelöst. Am 1. Wechselschalter liegt die Phase an. Habe einen Draht der KreuzSchaltung verwendet um die Phase über alle Schalter zu führen. Alle Schalter gegen Taster getauscht und den 2. Draht zum Fibaro Switch durchgeschliffen. Somit sind alle Taster parallel und schalten den Fibaro Switch Wunderbar.

Auch ne elegante Lösung. So ähnlich werde ich vorgehen, wenn die Kreuzschaltung rausfliegt und MCOHome Touchpanel reinkommen. Da brauch ich L und N in jeder Dose. Aber da muss ich erstmal noch ein wenig sparen, Design kostet… ^^

Hallo,

die ursprüngliche Problematik ist nicht die Lampe in Wechselschaltung mit dem Switch zu schalten - die kann man über unterschiedliche Verdrahtungen realisieren. Die Problematik ist, dass die HC2 bzw. der verbaute Relay Switch mitbekommt, dass das Licht an ist wenn an einem anderen Schalter als demjenigen geschaltet wird in dessen Dose der Relay Switch verbaut ist. Für ein smartes Home ist das wohl erforderlich, damit man eine intelligente Lichtsteuerung realisieren kann.

Die Version 1 des Switch konnte keinen Strom messen und daher per Definition nicht anzeigen, ob Strom fließt oder nicht. Bei Version 2 des Switch geht das, eine entsprechende Verdrahtung vorausgesetzt, jetzt.

Grüße
Arno

Hi Arno,

das stimmt so nicht. Wenn man es richtig einbaut / verdrahtet, bekommt der HC2 immer mit, ganz egal wo geschaltet wird, ob das Licht an oder aus ist. Auch ohne COM Leitung. Es geht wirklich, ich habe es am Laufen mit 4 Wechselschaltern (2*normal, 2 *kreuz).

VG

kandetvara

Hi,

richtig, wenn man den Switch eben statt der Lampe an den Schalter hängt. Lampenzuleitung vom Schalter ab und auf O1/2 und dann vom Schaltkontakt auf dem die Lampenzuleitung war eine Verbindung zum S1/2. Ich würde das gerne mal grafisch aufbereiten, aber Schaltpläne sind leider unerwünscht.
@Arno:
In welcher Dose ist der Switch denn verbaut und warum? Kreuz oder Wechselschaltung ist egal, wenn der Switch an der richtigen Position ist, bekommt er mit, wenn geschaltet wird.

Grüße

Hi,

Also ich habe bei mir den Switch in der ersten Dose verbaut, weil dort Leitung L dauerhaft Strom hat. Ich hatte im Netz auch Schaltpläne gefunden nach denen der Switch in der letzten Dose vor der Lampe verbaut werden soll. Voraussetzung ist dann aber, dass man L + N von irgendwo anders zur Versorgung des Switch verlegt. Da dies bei mir nicht bei allen Wechsel-/Kreuzschaltungen möglich ist, habe ich diese Variante noch nicht ausprobiert.

Ich bin zwar kein Elektriker, aber ich habe schon einige Verkabelungen in unserem Haus erfolgreich vorgenommen und kann mir ehrlich gesagt nicht so recht vorstellen wie der Switch, wenn er keinen Strom messen kann, mitbekommen soll, wenn an einer anderen Dose ein Schalter umgelegt wurde. Letztlich kennt der Switch der Version 1 ja nur die interne Schalterstellung AN oder AUS. Ob aber auch tatsächlich Strom fließt kann der Switch und damit auch die HC2 doch eigentlich gar nicht wissen.

Etwas anderes ist es wenn man Taster verwendet. Dies sollte ich vielleicht noch explizit erwähnen: Ich rede hier von “Toggle Switches” - also permanenten Kippschaltern.

Grüße
Arno

Hi,

ok, das erklärt alles. Wenn in der Dose vor der Lampe kein L und N verfügbar ist, geht es natürlich nicht.
Zwischen den Schaltern liegen vermutlich auch nur 2 nutzbare Adern? Sonst könnte man es auf die Variante mit COM umbauen.

Grüße

Hi Arno,

wie Muehle schon schreibt - jetzt haben wir es verstanden. Wenn Du in der Dose vor der Lampe keinen separaten L&N hast dann geht es wirklich nicht.

@Muehle: Es gab mal eine gute Schweizer Seite, welche alle Schaltpläne online hatte. Auch die haben jedoch alle Pläne runtergenommen und alle Installationshinweise entfernt. Das ist wohl echt ein Haftungsthema…

VG

kandetvara

Hi,

ich denke auch. Wenn wirklich mal was abfackelt, will am Ende keiner Schuld sein…
Es gibt immer noch eine Seite mit vielen Beispielen, man muss nur die richtigen Suchbegriffe verwenden, z.B. eine häufig verbaute Schaltung mit 2 Schaltern und den poln. Z-Wave-Lieferanten.

Grüße