#1 Rollläden an Relais über Domiq positionieren
Verfasst: Mi 10. Jul 2013, 19:27
Vor einiger Zeit habe ich ein Script für die Positionierung von Rollläden an Ausgängen geschrieben, hier ein weiteres Modul, um Rollläden an Relais ohne BS4 zu positionieren.
Version vom 25.07.2013
Das Script ist relativ ähnlich aufgebaut, allerdings ist jeder Abschnitt trotzdem anders geworden.
Für jeden Rollladen wird der Zustand des Netzrelais überwacht, und bei einer Änderung etwas gerechnet. Dabei muss dann natürlich auch das Richtungsrelais ausgewertet werden. Das Richtungsrelais wird nach dem Stoppen auch abgeschaltet, wodurch man etwas Strom, sparen kann. Eine Steuerung von Außen wird erkannt, bei "Zwischenstellungen" wird die Position mit "n/a" ausgewertet, fährt der Rollladen lang genug (Laufzeit + eine Sicherheitsreserve) wird davon ausgegangen, dass er in der entsprechenden Endposition ist.
Beim Modul wird unter Ausgängen:Relais und Rollladen auf Relais eingestellt, zusätzlich sollte die Zeitbegrenzung aktiviert sein.
[code=cpp-qt]-- Laufzeiten der Rollläden
startzeit = {} -- Startzeit bei Rollladenstart
set ('t_auf.rel.121.3',5900) --an Relais Angabe in ms
set ('t_ab.rel.121.3',5000)
set ('t_auf.rel.240.1',27000) --OG Balkon
set ('t_ab.rel.240.1',25000)
[/code]
Hiermit wird das Netzrelais überwacht. Die Bezeichnung links ist Modul_Motor rechts Modul.Relais. Diese Funktion wird für jeden Rollladen einmal benötigt.
[code=cpp-qt]roll_rel_121_2_flag = use 'LCN.relay.0.121.3'
roll_rel_240_1_flag = use 'LCN.relay.0.240.1'
function roll_rel_121_2_flag:onchange(new) -- Relais 3
roll_rel_na(121,2,3,new) --Modul, Motor, Relais, Relaisstatus
end
function roll_rel_240_1_flag:onchange(new) -- Relais 1
roll_rel_na(240,1,1,new) --Modul, Motor, Relais, Relaisstatus
end
[/code]
Hier sind die Strings untergebracht, nach denen die Relais gesteuert werden. Ist z.B. das Richtungsrelais anders angeschlossen, kann man hier die Änderung eintragen.
[code=cpp-qt]-- Rollläden Relais String
down = {'11------';'--11----';'----11--';'------11'}
up = {'10------';'--10----';'----10--';'------10'}
stop = {'00------';'--00----';'----00--';'------00'} -- Richtungsrelais wird aus stromspargründen abgeschaltet
[/code]
Und die Bearbeitung, wenn sich das Relais ändert:
[code=cpp-qt]
function roll_rel_na(mod,motor,relay, new) -- Bei Änderung des Power Relais
-- On, Zeit starten und n/a setzen
local t_auf = get('t_auf.rel.'..mod..'.'..motor)
local t_ab = get('t_ab.rel.'..mod..'.'..motor)
local position = get ('VAR.roll_position_rel.'..mod..'.'..motor)
local position_alt = position
local richtung
if (new == 1) then
richtung = get('LCN.relay.0.'..mod..'.'..(relay + 1))
startzeit[mod .. '.' .. motor] = systime()
-- print(startzeit[mod][motor])
set ('VAR.roll_position_rel.'..mod..'.'..motor,"n/a")
set ('VAR.roll_start_rel.'..mod..'.'..motor,"n/a")
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"n/a")
elseif (new ==0) then
local stopzeit = systime()
if startzeit[mod .. '.' .. motor] then
laufzeit = math.floor((stopzeit - startzeit[mod .. '.' .. motor])*1000) -- ms
startzeit[mod .. '.' .. motor] = null
else print('Fehler Startzeit')
end
-- Endlage?
if richtung == 1 then -- ab
if laufzeit > (t_ab + 2000)then
set ('VAR.roll_position_rel.'..mod..'.'..motor,100)
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"unten")
--Richtungsrelais ausschalten
value = stop[motor]
command ('C.LCN.relays.0.'..mod..'='..value)
else -- Zwischenposition
-- -- Off Zeit messen und Position berechnen.
end
else -- auf
if laufzeit > (t_auf + 2000)then
set ('VAR.roll_position_rel.'..mod..'.'..motor,0)
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"oben")
--Richtungsrelais ausschalten
value = stop[motor]
command ('C.LCN.relays.0.'..mod..'='..value)
else -- Zwischenposition
-- -- Off Zeit messen und Position berechnen.
end
end
end
end
[/code]
Jetzt kommt die eigentliche Steuerung
[code=cpp-qt]
-- Rollläden an Relais
function roll_rel_pos(mod,motor,pos,force) -- motor 1-4, position 100 = geschlossen, 0 = offen, modul , Zwangssteuerung über Endlage
local t_auf = get('t_auf.rel.'..mod..'.'..motor)
local t_ab = get('t_ab.rel.'..mod..'.'..motor)
local position = get ('VAR.roll_position_rel.'..mod..'.'..motor)
local position_alt = position
local b = type(position_alt)
if (b ~= 'number' or force > 0) then
position_alt = 'n/a'
end
if pos == 0 then -- Bei Endlage immer bis zum Anschlag volle LAufzeit fahren
position_alt = 100
roll_rel_pos_absolut(mod,motor,pos)
set ('VAR.roll_position_rel.'..mod..'.'..motor,pos)
elseif pos == 100 then
position_alt = 0
roll_rel_pos_absolut(mod,motor,pos)
set ('VAR.roll_position_rel.'..mod..'.'..motor,pos)
elseif position_alt == "n/a" then
roll_rel_pos_absolut(mod,motor,pos)
else -- Zwischenposition direkt anfahren
relpos = pos - position_alt
if relpos >0 then
delay_ab = ((t_ab/100)*(relpos))
roll_rel_run(mod,motor,'down',pos)
-- command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",..'pos')')
command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')')
elseif relpos = 96 then -- unten
roll_rel_run(mod,motor,'down',100)
command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",100)')
elseif pos =40 then
roll_rel_run(mod,motor,'down',100)
command('DELAY.'..(t_ab+1000)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"up",'..pos..')') -- unten
command('DELAY.'..(t_ab+1000+delay_auf)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')') -- Position
else -- über oberen Stop
roll_rel_run(mod,motor,'up',0)
command('DELAY.'..(t_auf+1000)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"down",'..pos..')') -- unten
command('DELAY.'..(t_auf+1000+delay_ab)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')') -- Position
end
end
[/code]
Das Schalten der Relais und Abspeichern der Werte
[code=cpp-qt]
function roll_rel_run(mod,motor,_task,pos) --
local position_text
if _task == 'up' then
value = up[motor]
elseif _task == 'down' then
value = down[motor]
elseif _task == 'stop' then -- stop
value = stop[motor]
end
if value then
command ('C.LCN.relays.0.'..mod..'='..value)
if _task == 'stop' then
-- command('DELAY.2000ms.C.set('VAR.roll_position_rel.'..mod..'.'..motor,pos)') --Wert abspeichern
set('VAR.roll_position_rel.'..mod..'.'..motor,pos) --Wert abspeichern
if pos == 0 then
position_text = 'oben'
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"n/a")
elseif pos == 100 then
position_text = 'unten'
else
position_text = pos
end
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,position_text)
else
-- set ('VAR.roll_position_rel.'..mod..'.'..motor,"n/a") --Wert abspeichern
end
end
end
[/code]
Für die Anzeige in Remote erzeuge ich ein Labelfeld mit
[code=cpp-qt]VAR.roll_position_rel.text.240.1[/code]
Für die Positionierung einen Pushbutton mit C.LOGIC und als Wert roll_rel_pos(240,1,80,0)
Wenn ich ein Fahrt über die Endlagen erzwingen will, dann einfach den Force Wert mit 1 angeben.
C.LOGIC und als Wert roll_rel_pos(240,1,80,1)
In Remote nehme ich ein Langkommando mit Position erzwingen, das Kurz-Kommando für eine normale Fahrt.
[img]1[/img]
Ich wünsche Euch viel Spaß damit. Jetzt fehlt nur noch, auch Fahrten von außen auszuwerten und daraus eine Position zu errechnen.
Gruß
Florian
[edit]Neue Version vom 25.07.2013[/edit]
Version vom 25.07.2013
Das Script ist relativ ähnlich aufgebaut, allerdings ist jeder Abschnitt trotzdem anders geworden.
Für jeden Rollladen wird der Zustand des Netzrelais überwacht, und bei einer Änderung etwas gerechnet. Dabei muss dann natürlich auch das Richtungsrelais ausgewertet werden. Das Richtungsrelais wird nach dem Stoppen auch abgeschaltet, wodurch man etwas Strom, sparen kann. Eine Steuerung von Außen wird erkannt, bei "Zwischenstellungen" wird die Position mit "n/a" ausgewertet, fährt der Rollladen lang genug (Laufzeit + eine Sicherheitsreserve) wird davon ausgegangen, dass er in der entsprechenden Endposition ist.
Beim Modul wird unter Ausgängen:Relais und Rollladen auf Relais eingestellt, zusätzlich sollte die Zeitbegrenzung aktiviert sein.
[code=cpp-qt]-- Laufzeiten der Rollläden
startzeit = {} -- Startzeit bei Rollladenstart
set ('t_auf.rel.121.3',5900) --an Relais Angabe in ms
set ('t_ab.rel.121.3',5000)
set ('t_auf.rel.240.1',27000) --OG Balkon
set ('t_ab.rel.240.1',25000)
[/code]
Hiermit wird das Netzrelais überwacht. Die Bezeichnung links ist Modul_Motor rechts Modul.Relais. Diese Funktion wird für jeden Rollladen einmal benötigt.
[code=cpp-qt]roll_rel_121_2_flag = use 'LCN.relay.0.121.3'
roll_rel_240_1_flag = use 'LCN.relay.0.240.1'
function roll_rel_121_2_flag:onchange(new) -- Relais 3
roll_rel_na(121,2,3,new) --Modul, Motor, Relais, Relaisstatus
end
function roll_rel_240_1_flag:onchange(new) -- Relais 1
roll_rel_na(240,1,1,new) --Modul, Motor, Relais, Relaisstatus
end
[/code]
Hier sind die Strings untergebracht, nach denen die Relais gesteuert werden. Ist z.B. das Richtungsrelais anders angeschlossen, kann man hier die Änderung eintragen.
[code=cpp-qt]-- Rollläden Relais String
down = {'11------';'--11----';'----11--';'------11'}
up = {'10------';'--10----';'----10--';'------10'}
stop = {'00------';'--00----';'----00--';'------00'} -- Richtungsrelais wird aus stromspargründen abgeschaltet
[/code]
Und die Bearbeitung, wenn sich das Relais ändert:
[code=cpp-qt]
function roll_rel_na(mod,motor,relay, new) -- Bei Änderung des Power Relais
-- On, Zeit starten und n/a setzen
local t_auf = get('t_auf.rel.'..mod..'.'..motor)
local t_ab = get('t_ab.rel.'..mod..'.'..motor)
local position = get ('VAR.roll_position_rel.'..mod..'.'..motor)
local position_alt = position
local richtung
if (new == 1) then
richtung = get('LCN.relay.0.'..mod..'.'..(relay + 1))
startzeit[mod .. '.' .. motor] = systime()
-- print(startzeit[mod][motor])
set ('VAR.roll_position_rel.'..mod..'.'..motor,"n/a")
set ('VAR.roll_start_rel.'..mod..'.'..motor,"n/a")
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"n/a")
elseif (new ==0) then
local stopzeit = systime()
if startzeit[mod .. '.' .. motor] then
laufzeit = math.floor((stopzeit - startzeit[mod .. '.' .. motor])*1000) -- ms
startzeit[mod .. '.' .. motor] = null
else print('Fehler Startzeit')
end
-- Endlage?
if richtung == 1 then -- ab
if laufzeit > (t_ab + 2000)then
set ('VAR.roll_position_rel.'..mod..'.'..motor,100)
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"unten")
--Richtungsrelais ausschalten
value = stop[motor]
command ('C.LCN.relays.0.'..mod..'='..value)
else -- Zwischenposition
-- -- Off Zeit messen und Position berechnen.
end
else -- auf
if laufzeit > (t_auf + 2000)then
set ('VAR.roll_position_rel.'..mod..'.'..motor,0)
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"oben")
--Richtungsrelais ausschalten
value = stop[motor]
command ('C.LCN.relays.0.'..mod..'='..value)
else -- Zwischenposition
-- -- Off Zeit messen und Position berechnen.
end
end
end
end
[/code]
Jetzt kommt die eigentliche Steuerung
[code=cpp-qt]
-- Rollläden an Relais
function roll_rel_pos(mod,motor,pos,force) -- motor 1-4, position 100 = geschlossen, 0 = offen, modul , Zwangssteuerung über Endlage
local t_auf = get('t_auf.rel.'..mod..'.'..motor)
local t_ab = get('t_ab.rel.'..mod..'.'..motor)
local position = get ('VAR.roll_position_rel.'..mod..'.'..motor)
local position_alt = position
local b = type(position_alt)
if (b ~= 'number' or force > 0) then
position_alt = 'n/a'
end
if pos == 0 then -- Bei Endlage immer bis zum Anschlag volle LAufzeit fahren
position_alt = 100
roll_rel_pos_absolut(mod,motor,pos)
set ('VAR.roll_position_rel.'..mod..'.'..motor,pos)
elseif pos == 100 then
position_alt = 0
roll_rel_pos_absolut(mod,motor,pos)
set ('VAR.roll_position_rel.'..mod..'.'..motor,pos)
elseif position_alt == "n/a" then
roll_rel_pos_absolut(mod,motor,pos)
else -- Zwischenposition direkt anfahren
relpos = pos - position_alt
if relpos >0 then
delay_ab = ((t_ab/100)*(relpos))
roll_rel_run(mod,motor,'down',pos)
-- command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",..'pos')')
command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')')
elseif relpos = 96 then -- unten
roll_rel_run(mod,motor,'down',100)
command('DELAY.'..delay_ab..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",100)')
elseif pos =40 then
roll_rel_run(mod,motor,'down',100)
command('DELAY.'..(t_ab+1000)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"up",'..pos..')') -- unten
command('DELAY.'..(t_ab+1000+delay_auf)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')') -- Position
else -- über oberen Stop
roll_rel_run(mod,motor,'up',0)
command('DELAY.'..(t_auf+1000)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"down",'..pos..')') -- unten
command('DELAY.'..(t_auf+1000+delay_ab)..'ms.C.LOGIC=roll_rel_run('..mod..','..motor..',"stop",'..pos..')') -- Position
end
end
[/code]
Das Schalten der Relais und Abspeichern der Werte
[code=cpp-qt]
function roll_rel_run(mod,motor,_task,pos) --
local position_text
if _task == 'up' then
value = up[motor]
elseif _task == 'down' then
value = down[motor]
elseif _task == 'stop' then -- stop
value = stop[motor]
end
if value then
command ('C.LCN.relays.0.'..mod..'='..value)
if _task == 'stop' then
-- command('DELAY.2000ms.C.set('VAR.roll_position_rel.'..mod..'.'..motor,pos)') --Wert abspeichern
set('VAR.roll_position_rel.'..mod..'.'..motor,pos) --Wert abspeichern
if pos == 0 then
position_text = 'oben'
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,"n/a")
elseif pos == 100 then
position_text = 'unten'
else
position_text = pos
end
set ('VAR.roll_position_rel.text.'..mod..'.'..motor,position_text)
else
-- set ('VAR.roll_position_rel.'..mod..'.'..motor,"n/a") --Wert abspeichern
end
end
end
[/code]
Für die Anzeige in Remote erzeuge ich ein Labelfeld mit
[code=cpp-qt]VAR.roll_position_rel.text.240.1[/code]
Für die Positionierung einen Pushbutton mit C.LOGIC und als Wert roll_rel_pos(240,1,80,0)
Wenn ich ein Fahrt über die Endlagen erzwingen will, dann einfach den Force Wert mit 1 angeben.
C.LOGIC und als Wert roll_rel_pos(240,1,80,1)
In Remote nehme ich ein Langkommando mit Position erzwingen, das Kurz-Kommando für eine normale Fahrt.
[img]1[/img]
Ich wünsche Euch viel Spaß damit. Jetzt fehlt nur noch, auch Fahrten von außen auszuwerten und daraus eine Position zu errechnen.
Gruß
Florian
[edit]Neue Version vom 25.07.2013[/edit]