Willkommen auf unserer neuen Forenplattform für das Bus-Profi Forum

Neue Felder für die persönlichen Daten
Man kann jetzt seine öffentlich einsehbare Daten genau bestimmen. Details findet ihr in in diesem Beitrag.

Durch die neue Forensoftware und die Portierung der Daten konnten die Passwörter aus dem alten Forum nicht übernommen werden, bitte lassen Sie sich ein neues Passwort über die Passwort vergessen Funktion zusenden. Sollte es zu Problemen kommen kontaktieren Sie das Bus-Profi Team per E-Mail.

Rollläden an Relais über Domiq positionieren

Hard- und Softwarefragen rund Domiq-Module fürs LCN-System
Benutzeravatar

Themenersteller
Beleuchtfix
Administrator
Administrator
Beiträge: 5304
Registriert: Mi 10. Jan 2007, 18:49
Kontaktdaten:
Status: Offline

#1 Rollläden an Relais über Domiq positionieren

Beitrag von Beleuchtfix »

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: Alles auswählen

-- 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)
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: Alles auswählen

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 
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: Alles auswählen

-- 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
Und die Bearbeitung, wenn sich das Relais ändert:

Code: Alles auswählen

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

Jetzt kommt die eigentliche Steuerung

Code: Alles auswählen

-- 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
Das Schalten der Relais und Abspeichern der Werte

Code: Alles auswählen

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
Für die Anzeige in Remote erzeuge ich ein Labelfeld mit

Code: Alles auswählen

VAR.roll_position_rel.text.240.1
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
Geändert: Neue Version vom 25.07.2013
Dateianhänge
522681Foto.PNG
522681Foto.PNG (36.49 KiB) 4758 mal betrachtet

koboldo
Fleißiges Mitglied
Fleißiges Mitglied
Beiträge: 324
Registriert: Do 16. Feb 2012, 15:50
Status: Offline

#2 RE: Rollläden an Relais über Domiq positionieren

Beitrag von koboldo »

Hallo Florian,
gibt es hier schon Neuigkeiten ? :blush:

Wie funktioniert das überhaupt :blush:
Müsste ich lediglich deine Scripts in Logic reinkopieren und nur die Modulnamen und Rolladenlaufzeiten anpassen ?
Anschließend würde ich die funktion z.B. über einen Button in der Visu mit LOGIC.funktionsnahme aufrufen ?

Warum ist hier einmal _2 und rechts .3 ?
roll_rel_121_2_flag = use 'LCN.relay.0.121.3'


Gruß
Jörg
Benutzeravatar

Themenersteller
Beleuchtfix
Administrator
Administrator
Beiträge: 5304
Registriert: Mi 10. Jan 2007, 18:49
Kontaktdaten:
Status: Offline

#3 RE: Rollläden an Relais über Domiq positionieren

Beitrag von Beleuchtfix »

Hi Jörg,

Das Script habe ich bei mir zu Hause angepasst, so dass auch mehrere Rollläden gleichzeitig gehen sollten (ich habe aber nur einen an einem Relais). Nachdem bis jetzt noch keine Reaktion da war, habe ich noch kein Update vorgenommen.

Bei der Nummerierung spreche ich einmal von Motor (1-4) und dann von Relais.(1-8) Natürlich könnte man das Relais auch per Script berechnen, aber ich habe es direkt im Kopf berechnet :P

Eigentlich kannst du den gesamten Code in einem Rutsch nach Logik kopieren, du musst dann nur noch die Bedienelemente für Remote bzw. Display erstellen.

Ich schau mal, ob ich heute noch den aktuellen Code einspielen kann.
Viel Erfolg
Florian

koboldo
Fleißiges Mitglied
Fleißiges Mitglied
Beiträge: 324
Registriert: Do 16. Feb 2012, 15:50
Status: Offline

#4 RE: Rollläden an Relais über Domiq positionieren

Beitrag von koboldo »

Hallo Florian,
ich habe auch nur einen Rolladen pro Relais, dann hatte ich das falsch verstanden....
Es war also gemeint, das es nicht funktioniert wenn man 2 Rolläden parallel mit einem Relais steuert oder ?

Was ist mit den Laufzeiten ? Muss ich die einmal pro Rolladen messen ?
Sind das in deinem Fall 5900 = 5,9 sec ?

Bin erst am Anfang meiner Experimente, ich hoffe ich kann später auch mal etwas zurückgeben :rolleyes:

LG
Jörg

P.s:: Wäre super wenn du dein überarbeitetes Script posten könntest ;)
Benutzeravatar

Themenersteller
Beleuchtfix
Administrator
Administrator
Beiträge: 5304
Registriert: Mi 10. Jan 2007, 18:49
Kontaktdaten:
Status: Offline

#5 RE: Rollläden an Relais über Domiq positionieren

Beitrag von Beleuchtfix »

Das Script ist oben aktualisiert. (Ne, es geht nicht um die Anzahl der Rollläden pro Relais, sondern wie viele überhaupt Rollläden an Relais angeschlossen sind.) Das gleiche script wird von jedem Rollladen angesprochen, und da muss natürlich jedesmal eine andere Variable abgespeichert werden. Das hatte ich mir bei der Zeitmessung gespart, sollte jetzt aber gehen. Ansonsten wieder melden. ;)

Ja, die Zeiten sind Millisekunden, und zwar getrennt für auf und ab. Übrigens ist das Script nur für Segment 0 ausgelegt, aber das dürfte wahrscheinlich nicht ein Problem sein.

Viel Erfolg
Florian

koboldo
Fleißiges Mitglied
Fleißiges Mitglied
Beiträge: 324
Registriert: Do 16. Feb 2012, 15:50
Status: Offline

#6 RE: Rollläden an Relais über Domiq positionieren

Beitrag von koboldo »

Ich hänge gedanklich irgendwie immer noch an der Zeile:

Code: Alles auswählen

roll_rel_121_2_flag = use 'LCN.relay.0.121.3'
Ich muss leider noch mal fragen....
Warum hast du hier 121_2 genommen und nicht 121_3 ?
Das roll_rel_121_2_flag ist doch nur eine Variable, die du dort gerade in dem Moment erstellst oder nicht ?
Gruß
Jörg
Benutzeravatar

Themenersteller
Beleuchtfix
Administrator
Administrator
Beiträge: 5304
Registriert: Mi 10. Jan 2007, 18:49
Kontaktdaten:
Status: Offline

#7 RE: Rollläden an Relais über Domiq positionieren

Beitrag von Beleuchtfix »

Es sieht so aus, als ob deine Lösung auch geht. Grundsätzlich zu meinen Bezeichnungen:
roll_rel steht Für Rollladen an Relais, dann kommt das Modul und anschließend der Motor. Für den Motor 2 ist das Netzrelais die Nr. 3. öfters wird die passende Variable per String zusammengesetzt um sie abzufragen, deshalb habe ich da den Motor gewählt. Allerdings wird hier die Variable sonst nicht mehr benutzt, sondern sie startet selbst die entsprechende Funktion, da ist der Name egal.

Viel Erfolg
Florian

koboldo
Fleißiges Mitglied
Fleißiges Mitglied
Beiträge: 324
Registriert: Do 16. Feb 2012, 15:50
Status: Offline

#8 RE: Rollläden an Relais über Domiq positionieren

Beitrag von koboldo »

Danke schon mal für Deine Hilfe :thumbup:
Werde das heute abend vielleicht mal austesten....

Wie rufe ich denn dann das ganze aus der Visu auf ?

Einfach ein dein C.LOGIC.roll_rel_pos(240,1,80,0) ohne C. und mit meinen Modulnr. etc.

Also LOGIC.roll_rel_pos(19,3,80,0) bei einem Switch unter Befehl eingeben oder bei einem light und Channel ?
Gruß
Jörg

koboldo
Fleißiges Mitglied
Fleißiges Mitglied
Beiträge: 324
Registriert: Do 16. Feb 2012, 15:50
Status: Offline

#9 RE: Rollläden an Relais über Domiq positionieren

Beitrag von koboldo »

Hallo Florian,
ich habe das mal soweit eingetragen und bekomme Fehlermeldungen.....

Code: Alles auswählen

R: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:130: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:130: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:130: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:130: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
ERROR: [string "-- *******************..."]:137: attempt to index global 'startzeit' (a nil value)
INFO: SCRIPT RELOADED AT 04:58
Im Anhang ist der entsprechende Code Ausschnitt...

Wobei auch noch die Frage offen ist, wie ich das in der Visu aufrufen kann ?
Gruß
Jörg
Dateianhänge
524501code.JPG
524501code.JPG (48.51 KiB) 4758 mal betrachtet
Benutzeravatar

Themenersteller
Beleuchtfix
Administrator
Administrator
Beiträge: 5304
Registriert: Mi 10. Jan 2007, 18:49
Kontaktdaten:
Status: Offline

#10 RE: Rollläden an Relais über Domiq positionieren

Beitrag von Beleuchtfix »

Da fehlte noch eine Zeile, sorry:

Code: Alles auswählen

startzeit = {} -- Startzeit bei Rollladenstart
Viel Erfolg
Florian
(bin jetzt die nächsten 2 Tage nicht erreichbar ...
Antworten