Seite 1 von 1

Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 13:16
von Geko
Hallo,
leider stehe ich wieder vor einem Problem.
Ich möchte anhand der Sauna Temperatur ein Rollo herunterfahren.
Beim Sonnenuntergang funktioniert da Ganze ja ganz gut, da es ja nur einmal geschaltet wird.
Da sich die Sauna Temperatur aber ständig ändert, dachte ich es reicht ein Timer von 30 sec. der wartet bis das Rollo unten ist.
Dem ist leider nicht so, irgenwie geht es bei jeder Temperaturänderung auf und zu.

Unsere Rollos funktionieren leider nach dem AUF / STOP / ZU / STOP Prinzip.

Die Doppelte (ON) Steuerung habe ich in dem Fall, das dass Rollo evtl. beim ersten Mal nach oben fahren würde, falls es vorher z.b. halb geschlossen war.


Code: Alles auswählen

Stiemap:
Switch item=Sauna_Automatik label="Sauna Automatik" mappings=[0="AUS", 1="Nur Licht" , 2="Nur Musik" ,3="Licht & Musik"]

Das Rollo soll aber immer gesteuert werden !

Code: Alles auswählen

Rules:
var Timer Warte 

rule "Sauna Automatik"
when
Item SaunaTemp received update
then
  if ((SaunaTemp.state >= 55) && (SaunaTemp.state <= 99 )) {
  if((Sauna_Automatik.state == 1) || (Sauna_Automatik.state == 3)) {
          var State = SaunaTemp.state as DecimalType
          if ((State >= 55) && (State < 59.9)) {sendCommand(schelly_rgb_fullcolor,"white")  SaunaState.sendCommand (0)}
          if ((State >= 60) && (State < 65.9)) {sendCommand(schelly_rgb_fullcolor,"blue")   SaunaState.sendCommand (1)}
          if ((State >= 65) && (State < 70.9)) {sendCommand(schelly_rgb_fullcolor,"yellow") SaunaState.sendCommand (2)}
          if ((State >= 70) && (State < 75.9)) {sendCommand(schelly_rgb_fullcolor,"green")  SaunaState.sendCommand (3)}
          if ((State >= 75) && (State < 99.9)) {sendCommand(schelly_rgb_fullcolor,"red")    SaunaState.sendCommand (4)}
  }
  
    if((Sauna_Automatik.state == 2) || (Sauna_Automatik.state == 3)) {
      if (SaunaTemp.state >= 65) {
        if (SCLX79_Z2_Power.state !=(ON)) {
          SCLX79_Z2_Power.sendCommand(ON) {
            if (SCLX79_Z2_InputSource.state !=(38))
            SCLX79_Z2_InputSource.sendCommand(38)
            SCLX79_Z2_Volume.sendCommand(15)}
            if (SaunaTemp.state < 50) {
              if (SCLX79_Z2_Power.state !=(OFF))
              SCLX79_Z2_Power.sendCommand(OFF)
              }}}}
              
// Ab hier ist mein Problem!!

if((SaunaTemp.state >= 70) && (Sauna_Automatik.state >= 1)){
			if  (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)}
			Warte = createTimer(now.plusSeconds(30)) [|
			if (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)]
  }
end 

Vielen Dank!

Re: Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 13:44
von Darkwin101
Wenn ich dich richtig verstehe ist es so das nun das Rollo immer alle Befehle bekommt und dadurch sich ein Jojo Effekt einstellt ich würde das ganze mit einer Hilfsvariable lösen die nachdem zweiten Befehl gesetzt wird.

Code: Alles auswählen

var Timer Warte = null
var Integer Hilfsvariable = 0

if((SaunaTemp.state >= 70) && (Sauna_Automatik.state >= 1) && (Hilfsvariable == 0) && (Warte === null)){
			if  (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)}
			Warte = createTimer(now.plusSeconds(30)) [|
			if (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)
			Hilfsvariable =1
			Warte = null]
  }
  if (Sauna_Automatik.state == 0) {Hilfsvariable = 0}
Mit der Abfrage Syntax des Timers bin ich mir nicht ganz Sicher das soll verhindern das wenn der Timer Läuft und die Hilfsvariable noch nicht gesetzt ist die Rule nochmal ausgeführt wird

Re: Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 15:30
von Geko
Super vielen Dank!
Gute Idee mit der Hilfsvariable! :D

Ich musste nur eine Klammer versetzten jetzt funktioniert es!

Code: Alles auswählen

 if((SaunaTemp.state >= 70) && (Sauna_Automatik.state >= 1) && (Hilfsvariable == 0) && (Warte === null)){
			if  (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)
			Warte = createTimer(now.plusSeconds(30)) [|
			if (Rollo_FlurHinten_c.state == OPEN) 
			Rollo_Flur_Hinten.sendCommand(ON)
			Hilfsvariable =1
			Warte = null]
  }
  if (Rollo_FlurHinten_c.state == CLOSED) {Hilfsvariable = 0}             
  }


Re: Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 16:21
von udo1toni
Aber...

Nur so am Rande...

1. Die Variable Warte im Code (der Name ist etwas unglücklich...) muss als globale Variable definiert sein, also außerhalb jeder Rule und zu Beginn der Datei, in der sie verwendet wird.
2. Einen Rollladen steuert man über ein Rollershutter Item. Mag sein, dass Deine Hardware das nicht direkt unterstützt (dann mein Mitleid ;) ), aber Du solltest dann lieber ein Proxy Item anlegen, welches mittels Rules die Steuerung so umsetzt. Du hast dann ein Item, welches mindestens über seinen Status die Information offen (0) und geschlossen (100) liefert, sowie auf die Befehle UP,DOWN,STOP reagieren kann. Dann kannst Du in Deiner Rule dieses Proxy Item ansteuern, in der Form

Code: Alles auswählen

if((ProxyRollladen.state as Number) != 100) ProxyRollladen.sendCommand(DOWN)
Das Proxy Item kümmert sich dann darum, dass der Rollladen entsprechend gesteuert wird.

Warum so? Weil Du vielleicht den Rollladen auch an anderer Stelle steuern möchtest. Du solltest also die Steuerlogik so auslagern, dass Du sie nur einmal brauchst.

Wenn Du Dinge steuerst, schau immer nach, ob sie nicht vielleicht schon ihr Soll erreicht haben. Falls es sich um Dinge handelt, die einige Zeit brauchen um ein Soll zu erreichen, musst Du die Prüfung so auslegen, dass sie eventuell gesendete Befehle berücksichtigt, also in der Form
"Falls der Rollladen nicht geschlossen ist und in den letzten 30 Sekunden noch keinen Befehl zum Schließen erhalten hat, sende den Schließbefehl".

Dein Rule triggert auf received update, es wäre sinnvoller, auf changed zu triggern.

Re: Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 19:12
von Geko
Hallo Udo1toni,
Danke für dein Mitleid ! :? :)
Klingt Logisch mit dem Proxy, nur sprengt mir das als Anfänger noch den Kopf :!:
Ich habe leider (noch) keine Ahnung wie ich das für mehrere Rollos machen soll.

Gibt es irgendwo Beispiele dafür? :roll:

Danke!

Re: Warte bis Rollo geschlossen ist.

Verfasst: 30. Mär 2020 23:03
von udo1toni
Was nutzt Du für Hardware?

Re: Warte bis Rollo geschlossen ist.

Verfasst: 31. Mär 2020 11:02
von Geko
Hallo Udo,
die Rolladenmotoren sind von Jarolift, diese sind Funkgesteuert, und verrichten ihren Dienst schon viele Jahre.
Zu dieser Zeit hatte ich noch nicht an ein System wie OpenHab gedacht.
Die Motoren haben aber ein verschlüsseltes Funkprotokoll welches sich ständig ändert, so sagt es der Hersteller.
Da es mich aber schon immer genervt hat, das diese nur nach einer festen Uhrzeit gesteuert werden können, habe ich nach einer günstigen Lösung gesucht, diese etwas smarter zu machen.
Dazu habe ich in die Rolladenkästen jeweils ein mit Tasmota geflashten Sonoff Basic gepackt,
da ich dort von den Motoren die 230V und die beiden Kabel für den Taster anzapfen kann.
Die Sonoff's habe ich auf Potentialfreies schalten umgerüstet, und nutze einen Magnetkontakt als Switch2 an den GPIO Pins, um zu Kontrollieren, ob das Rollo geschlossen ist.

Etwas besseres ist mir leider nicht eingefallen.

Grüße

Re: Warte bis Rollo geschlossen ist.

Verfasst: 31. Mär 2020 15:25
von udo1toni
Die Bedienung über die Wandtaster ist aber immer mit fester Richtung, oder? Eine andere Variante wäre dann, einen Taster so umzubauen, dass openHAB tatsächlich die Tasten "drücken" kann, vorzugsweise jeweils über einen Transistor oder ein DIL Reed Relais. Dann hättest Du zumindest nicht das Problem mit der Richtung.
Mit nur einem Taster ist die Tastenfolge ja vermutlich Richtung1 - Stopp - Richtung 2 - Stopp - ... wobei das Stopp natürlich auch durch Erreichen der Endlage oben oder unten ausgelöst werden kann.
Man könnte versuchen, eine entsprechende Rule im Sonoff zu hinterlegen, aber die ist auch nicht eben trivial, wenn sie vernünftig arbeiten soll.

Re: Warte bis Rollo geschlossen ist.

Verfasst: 31. Mär 2020 16:31
von Geko
Genau richtig.
Am Taster geht leider nur AUF /STOP /ZU /STOP usw.
Endlagen sind im Motor gespeichert.