ich mache gerade meine ersten Schritte mit LUA und probiere jetzt hier schon ein Weilchen herum. Letztendlich möchte ich was meiner Meinung nach relativ simples erreichen.
Ich habe an mehreren Wandschaltern statt des Einfach Tasters, Doppeltaster angebracht und die 2. Taste möchte ich jetzt nutzen um andere Geräte, in diesem Fall eine Lampe zu schalten (Hinter den Wandschalter sitzen natürlich Dimmer 2 bzw. Double Switch 2). Die Lampe soll von insgesamt 3 Tastern aus geschaltet werden können.
Mit meinem Script bekommt das Ganze ein ungewünschtes Eigenleben, die Polizei wäre stolz auf mich (Blinklicht).
Ich habe schon die Suchfunktion bemüht, versucht ähnliche Scripte wie “Licht abhängig von mehreren Lichtmessern schalten” zu adaptieren, bin aber gescheitert. Da nun meine Frau aber gerne die Lampe im Esszimmer hin und wieder anmachen möchte, wäre es toll, wenn “ich” das irgendwie hinbekäme.
Hier mal mein Script, Lösungen müssen aber, wenn es elegantere Wege gibt, nicht auf diesem aufbauen.
--[[
%% properties
65 value
118 value
13 value
%% weather
%% events
%% globals
--]]
switchID1 = 65 -- ID des ersten Schalters
switchID2 = 118 -- ID des zweiten Schalters
lampID = 13 -- ID der Lampe
SwitchValue1 = tonumber(fibaro:getValue(switchID1, "value"))
SwitchValue2 = tonumber(fibaro:getValue(switchID2, "value"))
LampState = tonumber(fibaro:getValue(lampID, "value"))
if LampState == 0 then
if SwitchValue1 == 0 and SwitchValue2 == 0 then
fibaro:debug("Licht bleibt aus")
else
fibaro:call(lampID, "turnOn")
end
elseif LampState == 1 then
if SwitchValue1 == 1 or SwitchValue2 == 1 then
fibaro:debug("Licht ist bereits eingeschaltet")
else
fibaro:call(lampID, "turnOff")
fibaro:debug("Licht ausgeschaltet")
end
end
danke dir, ich habe mir nochmal bei fibaro im Learning Center das LUA Kapitel angeschaut, kann ich mehrere if then Abfragen hintereinanderstellen?
1 --[[ </br>
2 %% properties </br>
3 %% globals </br>
4 --]] </br>
5 </br>
6 local myVar1 = fibaro:getValue(145, 'value') –-state of the sensor </br>
7 fibaro:debug('value = ' .. myVar1) –-prints value of variable1 </br>
8 local myVar2 = fibaro:getValue(2, 'value') –-state of on/off switch </br>
9 fibaro:debug('value = ' .. myVar2) –-prints value of variable2 </br>
10 </br>
11 if (myVar1 == '1') then </br>
12 </br>
13 if (myVar2 == '0') then </br>
14 fibaro:call(2, 'turnOn') </br>
15 else </br>
16 fibaro:call(2, 'turnOff') </br>
17 end </br>
18 </br>
19 end
das ist das Beispiel von dort
Könnte ich dann auch das so lösen:
--[[
%% properties
65 value
118 value
%% weather
%% events
%% globals
--]]
switchID1 = 65 -- ID des ersten Schalters
switchID2 = 118 -- ID des zweiten Schalters
lampID = 13 -- ID der Lampe
SwitchValue1 = tonumber(fibaro:getValue(switchID1, "value"))
SwitchValue2 = tonumber(fibaro:getValue(switchID2, "value"))
if Switchvalue1 == 0 then
if Switchvalue2 == 0 then
fibaro:debug("Licht bleibt aus")
else
fibaro:call(lampID, "turnOn")
fibaro:debug("Licht angeschaltet")
end
end
Das Problem ist jetzt, wenn ich am ersten Schalter anschalte, dann steht der ja auf 1 und dann kann ich am 2. Schalter machen was ich will, dann geht die Lampe nicht aus. Und wenn ich mit dem 2. die Lampe anschalte, kriege ich sie nicht wieder aus, bzw. nur über Schalter 1, den ich dann erst auf 1 und zurück auf 0 stellen muss.
Hmpf… also das ist wohl nix so…
Mal weiter grübeln… oder vielleicht kann mir jemand auf die Sprünge helfen…
Im Prinzip müsste ich sowieso den Wert des jeweils anderen Schalters bei Betätigung des ersten mit umstellen oder? Oder das ganze vom Status der Lampe abhängig machen…
ja ich habe da noch ein bisschen weiter herumprobiert, aber leider trotzdem nichts funktionierendes hinbekommen.
--[[
%% properties
65 value
118 value
%% weather
%% events
%% globals
--]]
switchID1 = 65 -- ID des ersten Schalters
switchID2 = 118 -- ID des zweiten Schalters
lampID = 13 -- ID der Lampe
SwitchValue1 = tonumber(fibaro:getValue(switchID1, "value"))
SwitchValue2 = tonumber(fibaro:getValue(switchID2, "value"))
if SwitchValue1 > 0 then
fibaro:call(lampID, "turnOn")
fibaro:debug("lamp turned on because of switch 1")
else
if SwitchValue2 > 0 then
fibaro:call(lampID, "turnOn")
fibaro:debug("lamp turned on because of switch 2")
else
fibaro:call(lampID, "turnOff")
fibaro:call(switchID2, "turnOff")
fibaro:call(switchID1, "turnOff")
fibaro:debug("lamp turned off because both switches are off")
end
end
SwitchValue1 = tonumber(fibaro:getValue(switchID1, "value"))
SwitchValue2 = tonumber(fibaro:getValue(switchID2, "value"))
if SwitchValue1 > 0 or SwitchValue2 > 0 then
fibaro:call(switchID2, "turnOn")
fibaro:call(switchID1, "turnOn")
end
Vielleicht könnte das funktionieren, wenn das umstellen des Zustands des jeweils anderen Schalters nicht dazu führen würde das das Script direkt erneut ausgelöst wird. (Zumindest denke ich, dass das das Problem ist. Bin irgendwie am Ende meines Lateins.
Hi,
ich gehe mal davon aus, dass das Leuchtmittel an einem Switch hängt? und an diesem auf S1 ein (1 Stück) Taster? hängt. Auf S2 ist nichts? Keine Assotiationen?
Dann muss man mal wissen wie du diesen Switch konfiguriert hast.
Parameter 9-13?
Parameter 20?
Deine anderen Taster(oben hast du mal von Doppeltaster gesprochen) haben keine Kabelverbindung zum Switch?
das Leuchtmittel sind LEDs die an einem Fibaro RGBW Controller angeschlossen sind. Keine Kabelverbindung zu den Tastern.
Die Taster hängen jeweils an einem Double Switch, also je ein Doppeltaster an je einem Double Switch, von den beiden Doppeltastern sind beide Taster an S1 und S2 des jeweiligen Double Switch angeschlossen. S1 schaltet jeweils physisch per Stromkreis eine andere Lampe. An Q2 hängt nichts.
Assoziationen habe ich keine, die Double Switches stehen auf Default Parametern, aber 9-13 sind ja für S1 und die Taster die ich für die Lampe benutzen will sind beide auf S2.
Ok dann schaltest du die LED-Leuchte praktisch nicht zusätzlich manuell über einen Schalter. Das sind aber keine RGBW LEDs bei denn du Farben willst dimmen etc?
ALso fibaro:call(lampID, “turnOn”) schaltet an und fibaro:call(lampID, “turnOff”) schaltet aus, genau so wie du willst? Die RGBWs haben glaube ich Standard ein fading, aber das ist nicht dein Problem?
Ich dachte die Leuchte hängt am Switch. Es ist eben nicht nur das Script was den gewünschten Effekt erzeugt bzw für unerwünschte Reaktion zuständig ist sondern auch der Aktor. Ich hab da keinen Testaufbau.
--[[
%% properties
65 value
118 value
%% weather
%% events
%% globals
--]]
switchID1 = 65 -- ID des ersten Schalters
switchID2 = 118 -- ID des zweiten Schalters
lampID = 13 -- ID der Lampe
SwitchValue1 = tonumber(fibaro:getValue(switchID1, "value"))
SwitchValue2 = tonumber(fibaro:getValue(switchID2, "value"))
AnAus = 0
if AnAus = 0 then
fibaro:call(lampID, "turnOff")
else
fibaro:call(lampID, "turnOn")
end
Dann definierst du AnAus als 1, und lässt das Script laufen.
Wenn es tust was du willst, änderst du durch Abfrage eines Switchzustandes den Wert der Variablen. Die kannst du dir auch erstmal mit debug nur anzeigen lassen, dann veranstaltest du auch keine Lichtspiele im Gang.
Ich muss jetzt leider aufhören. Wenn dir die herangehensweise nicht zu langsam ist können wir ich ja noch weiter machen.
danke für deine Hilfe, ja also derzeit schalte ich das von einem Schalter aus und es funktioniert, die Farben passe ich nicht über den Lichtschalter an sondern per Handy oder später ggf. mit extra Szenen. Mein Problem ist halt das hinzufügen des zweiten Schalters.
Dein Script sieht ja schon sehr interessant aus, ich bins wohl viel zu kompliziert angegangen (und unfähig^^). Allerdings verstehe ich noch nicht wie die Variable “AnAus” mit einem Wert versehen wird? Hier wird der ja in Zeile 15 fest auf 0 gesetzt und dann ist die Lampe immer aus… Müsste AnAus nicht irgendwie durch die Schalter verändert werden?
Edit da war ich wohl zu schnell, ich schau mir das mal an mit der Variablen und melde mich auf jeden Fall mit Erfolg oder Misserfolg. Und der Zeitfaktor ist nicht so entscheidend, bin ja dankbar das mir geholfen wird!
Hm… habe ich aber jetzt nicht dasselbe Problem wie vorher? Wenn ich abhängig davon, ob Schalter 1 oder Schalter 2 “On” sind, das Licht anschalte, dann geht das Licht nur wieder aus, wenn beide Schalter “Off” sind. Das ist aber doch nicht das Ziel, ich möchte ja das, egal welchen Schalter ich betätige, das Licht den Zustand wechselt. Das würde m.E. nur funktionieren, wenn ich den jeweils anderen Schalter den Zustand des ersten Schalters “spiegeln” lasse. Das führt dann aber immer dazu das die Szene erneut gestartet würde.
Andere Methode wäre, einfach jedes Mal wenn einer der Schalter betätigt wird den Zustand der Lampe zu “togglen”, da hab ich aber keinen Plan wie ich das anstellen könnte.
Evtl. einfach nur die beiden Schalter oben als Trigger eintragen, wie es ja bereits drin ist und dann abzufragen welchen Zustand die Lampe hat und wenn sie an ist, dann ausschalten und wenn sie aus ist dann anschalten. Kann das so simpel funktionieren?
--[[
%% properties
153 value
92 value
%% weather
%% events
%% globals
--]]
lampID = 144 -- ID der Lampe
LampValue1 = tonumber(fibaro:getValue(lampID, "value"))
if LampValue1 > 0 then
fibaro:call(lampID, "turnOff")
else
fibaro:call(lampID, "turnOn")
end
Eins muss ich noch schnell los werden. Das Ganze ist zwar eine schöne Fingerübung aber nicht sehr praxisnah.
Wir machen aus einem Aktor einen Sensor. Da du ja nicht 10 Sekunden auf Licht AN warten willst müssen wir permanent die Schalter abfragen und sorgen damit für einen Wahnsinns Traffic im Netz. Ich weiß nicht wie wir es hinbekommen sollen, dass der Switch einen Zustand meldet und nicht nach seinem Zustand gefragt werden muss.
Eigentlich löst man so etwas über Assotiationen, aber dann brauchst du keinen LUA Code und dann wäre das der falsche Forumsbereich.
Andere Methode wäre, einfach jedes Mal wenn einer der Schalter betätigt wird den Zustand der Lampe zu „togglen“, da hab ich aber keinen Plan wie ich das anstellen könnte.
Genau! Gute Idee das war auch mein Plan. Aber wir toggeln nicht den Zustand der Lampe sondern den der Variablen. If AnAus=0 then AnAus = 1 else AnAus= 0 end. Damit erreicht ANAus immer nur die Werte 0 oder 1. Den Rest vom Script haben wir ja schon.
das verstehe ich jetzt nicht, so wie ich das verstanden habe, melden sich die Schalter beim Gateway sobald ihr Status sich ändert. Der Gateway schaut dann ob irgendwelche Funktionen damit verbunden sind. In diesem Fall das Script. Das Script wird gestartet und läuft durch, danach ist wieder Schweigen im Netz. Es kommt nur zu Traffic wenn einer der Schalter betätigt wird und das nur zwischen Schalter und Gateway und Gateway und Lampe. Mit Assoziationen könnte man das direkt von Schalter zu Lampe machen. Würde aber sagen der Traffic ist vernachlässigbar, oder?
Vielleicht habe ich das aber auch falsch verstanden?
Das geht auch nämlich mit Scenen Aktivierung:
Activating scenes: The Switch 2 can activate scenes in the Z-Wave controller by sending
scene ID and attribute of a specific action using Central Scene Command
Class.
By default scenes are not activated, set parameters 28 and 29 to enable
scene activation for selected actions.
und dann fibaro:debug("change from turn on to turn off s1 "…name);
elseif (tonumber(fibaro:getValue(id, “sceneActivation”))==20)
aber das hier LampValue1 = tonumber(fibaro:getValue(lampID, “value”))
fragt den Zustand der Lampe permanent ab und wird nicht erst angestoßen wenn der Schalter betätigt wird.
Wenn deine Schalter alle die gleiche scene anstoßen ist der Code auch ganz einfach.
Erst fragst du AnAus ab, AnAus ist dann eine globale Variable
dann änderst du den Wert von AnAus von 0->1 oder 1->0
und dann schaltest du die Lampe in Abhängigkeit von AnAUs.
Ich denke das Mittel der Wahl für einen praktischen Einsatz wären aber doch Assotiationen.
Aber vielleicht hat da jemand, außer uns beiden noch ein Meinung dazu?