Seite 1 von 7

Jalousien nach Sonnenstand

Verfasst: 1. Mär 2021 09:12
von Markus_JE
Guten Morgen zusammen,

ich habe eine Regle welche die Jalousien nach Sonnenstand, Strahlung etc. startet.
Nun würde ich gerne einbauen das wenn eine der Jalousien manuell verändert wurde die Regler nicht mehr angestartet wird.
Kann mir hier jemand weiterhelfen? Ich habe leider keine Idee ob und wie ich das realisieren kann.

Meine Regel lautet:

Code: Alles auswählen

var int Sonnenstand = (LokaleSonnendaten_Position_Elevation.state as QuantityType<angle>).intValue
var int Strahlung = (LokaleSonnendaten_DirekteStrahlung.state as QuantityType<intensity>).intValue
var int Azimut = (LokaleSonnendaten_Azimut.state as QuantityType<angle>).intValue
rule "Sonnenschutz Wohn/Esszimmer"
when
  Item LokaleSonnendaten_Position_Elevation changed
then
  if (Sonnenschutz_Aktiv.state == ON && Sonnenstand >= 15 && Sonnenschutz_Kernzeit.state !== "ON" && Strahlung >= 80 && Azimut >= 130)
	{
	logInfo("FILE", "Sonnenschutz EG Aktiv")
    Sonnenschutz_Kernzeit.postUpdate(ON)
	KNXDeviceTasterHauseingang1115_LeaveHome.sendCommand(1)
	} else 
			{
			Sonnenschutz_Kernzeit.postUpdate(OFF)
			}
end
Besten Dank

Re: Jalousien nach Sonnenstand

Verfasst: 1. Mär 2021 13:53
von udo1toni
Deine Rule kann so, wie Du sie hier gepostet hast, nicht funktionieren.
Du hast globale Variablen definiert, welche genau einmal einen Wert zugewiesen bekommen, nämlich wenn die Rules-Datei geladen wird.

Was auch nicht so ganz klar ist: wo werden Deine Jalousien angesteuert?

Grundsätzlich sollten Rules strukturiert sein, im besten Fall läuft es so, dass zuerst alle Werte auf Plausibilität geprüft werden, dann alle Werte in lokale Variablen oder Konstanten übernommen werden, dann alle nötigen Vergleiche getroffen werden, anhand derer dann ein Sollstand festgelegt wird und abschließend wird geprüft, ob der Sollstand bereits erfüllt ist.

Weiterhin gibt es drei Möglichkeiten, wie die Rule handelt. 1. Die Beschattung wird aktiviert, 2. Die Beschattung wird deaktiviert, 3. die Rule tut nichts. der dritte Fall tritt ein, wenn die Jalousien bereits die Sollposition haben oder aber die Position manuell festgelegt wurde.

Wenn ein bestimmter Wert nur einmalig gebraucht wird, kann man natürlich auf eine Variable verzichten.

Beispiel: Die Jalousien sollen nur verfahren werden, wenn die Elevation zwischen h1 und h2 liegt, der Azimut zwischen w1 und w2 liegt sowie die Bewölkung unter p ist. Also fragen wir Elevation, Azimut sowie Bewölkungsgrad ab. JEder der drei Werte kann theoretisch statt einer Zahl auch den Wert NULL oder UNDEF liefern, also muss zunächst eine Prüfung erolgen, ob ein gültige Zahl vorliegt.
An dieser Stelle kommt schon die Frage, was die Rule tun soll, wenn kein gültiger Wert geliefert wird. Soll sie abbrechen? Soll sie in diesem Fall von einem default Wert ausgehen? Soll sie einen Ersatzwert auf anderem Weg gewinnen?

Anschließend (nehmen wir an, die Rule läuft noch und wir haben nun Zahlen zum testen) geht es darum, den Sollwert festzulegen. Der kommt also in eine Variable, wobei der Defaultwert hineingeschrieben wird (in diesem Fall wäre das die aktuelle Position der Jalousie, default tu die Rule nichts).

Nun vergleichen wir auf einhalten der Grenzwerte und setzen gegebenenfalls einen neuen Sollwert. Abschließend muss die Rule nur prüfen, ob die Ist Position von der Soll Position abweicht und gegebenfalls den Steuerbefehl senden.

Diese Struktur hat mehrere Vorteile:

1. Die Rule ist leicht um weitere Bedingungen erweiterbar.
2. Die Rule wird leichter lesbar.
3. Die Rule senden nur dann Steuerbefehle, wenn dies auch wirklich notwendig ist.

Der letzte Punkt ist dabei fast der wichtigste. ;)

So wie beschrieben kann die Rule sich um alle Jalousien des ganzen Hauses kümmern, es müssen lediglich die Sollwerte für die verschiedenen Bereiche getrennt berechnet werden.

Re: Jalousien nach Sonnenstand

Verfasst: 1. Mär 2021 15:14
von Markus_JE
Hallo Udo,

die Jalousien fahre ich auf einen Sollwert welcher in einer Szene fest definiert sind.
Ausgelöst wird das durch ein send command an ein KNX Taster der ebenso am Hausausgang sitzt.

Code: Alles auswählen

KNXDeviceTasterHauseingang1115_LeaveHome.sendCommand(1)
Deine Aussagen sind genau die Punkte welche ich nicht genau weiß wie ich diese anpacken kann.
Das mit den Werten NULL oder UNDEF habe ich schon festgestellt und habe auch schon einiges im Internet gestöbert aber komme auf keinen grünen Zweig. Ich bin hier wirklich ein Anfänger daher fällt mir das erst mal so ziemlich schwer.

Deine Ausführungen und Vorschläge sind wie immer top.
Wäre toll wenn du mir hier ein Beispiel hättest das ich dann auf meine Bedürfnisse erweitern bzw. anpassen könnte.
Wie gesagt ich finde kein richtigen Einstieg.

Re: Jalousien nach Sonnenstand

Verfasst: 1. Mär 2021 19:05
von udo1toni
Ja, gerne.

Die Szene ist in diesem Fall aber wenig hilfreich, denn die Rule soll ja "magisch" herausfinden, ob sie arbeiten darf. das geht im Zweifel nur über die direkte Rückmeldung der Positionen. Lassen sich die Jalousien direkt auf Position fahren, oder geht das nur über die Szenen?

Die knx Szenen haben einen großen Nachteil: es gibt keinen gültigen Status für eine knx Szene. Wer soll einen Aussage darüber treffen, ob eine Szene aktiv ist? Deshalb ist hier eine Rückmeldung nicht vorgesehen. Entsprechend funktioniert auch die Auswertung nicht, was den Teil der Rule eigentlich überflüssig macht. Zum Verständnis dennoch mit drin (funktioniert aber nicht mit Szenen, aber damit Du eine Vorstellung bekommst...)

Ich tue hier so, als sei eine manuell erreichte Position immer durch eine Szene > 1 gekennzeichnet. Wie gesagt, das klappt so nicht.

Code: Alles auswählen

val nElevationMin = 10
val nElevationMax = 45
val nAzimutMin = 130
val nAzimutMax = 210
val nIntensityMin = 80
val nCloudynessMax = 40

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    if(!(LokaleSonnendaten_Position_Elevation.state instanceof Number)) {               // gültige Zahl? Falls nicht, Abbruch!
        logWarn("shade","Elevation ungültig! Abbruch!")
        return;
    }
    if(!(LokaleSonnendaten_Azimut.state instanceof Number)) {                           // gültige Zahl? Falls nicht, Abbruch!
        logWarn("shade","Azimut ungültig! Abbruch!")
        return;
    }
    val nElevation = (LokaleSonnendaten_Position_Elevation.state as Number).floatValue  // Elevation in Konstante sichern
    val nAzimut = (LokaleSonnendaten_Azimut.state as Number).floatValue                 // Azimut in Konstante sichern

    var nIntens = 100                                                                   // Default Wert für Strahlung
    if(LokaleSonnendaten_DirekteStrahlung.state instanceof Number)                      // Falls gültiger Wert geliefert wird
        nIntens = LokaleSonnendaten_DirekteStrahlung.state as Number                    // übernehmen

    var nCloud = 0                                                                      // Default Wert für Bewölkung
    if(LokaleWetterdaten_Wolken.state instanceof Number)                                // Falls gültiger Wert geliefert wird
        nCloud = LokaleWetterdaten_Wolken.state as Number                               // übernehmen

    var Soll = 0                                                                        // Default ist Beschattung Ende
    var Boolean bOk = true                                                              // Default ist es gibt einen gültigen Wert
    if(KNXDeviceTasterHauseingang1115_LeaveHome.state instanceof Number)                // Falls gültiger Wert geliefert wird
        Soll = (KNXDeviceTasterHauseingang1115_LeaveHome.state as Number).intValue      // übernehmen
    else
        bOk = false                                                                     // ansonsten bOk auf false setzen

    if(Soll < 2) {                                                                      // keine manuelle Fahrt?
        if(nElevation < nElevationMin || nElevation > nElevationMin ||
           nAzimut < nAzimutMin || nAzimut > nAzimutMax || 
           nIntens < nIntensityMin || 
           nCloud > nCloudynessMax) {                                                   // Dann Soll bestimmen
            logInfo("shade","Jalousien Beschattung aus!")
            Soll = 0
        } else {
            logInfo("shade","Jalousien Beschattung an!")
            Soll = 1
        }
    }
    if(bOk) {                                                                           // Falls gültiger Wert geliefert wird
        if((KNXDeviceTasterHauseingang1115_LeaveHome.state as Number).intValue != Soll) // Prüfen ob Soll von Ist abweicht 
            KNXDeviceTasterHauseingang1115_LeaveHome.sendCommand(Soll)                  // und nur dann senden
    } else                                                                              // Falls Istwert nicht feststellbar
        KNXDeviceTasterHauseingang1115_LeaveHome.sendCommand(Soll)                      // Befehl senden
end

Re: Jalousien nach Sonnenstand

Verfasst: 2. Mär 2021 08:16
von Markus_JE
Hallo Udo,

uiuiuiuiuiu. Das ist ja Mega
Lassen sich die Jalousien direkt auf Position fahren, oder geht das nur über die Szenen?
Ja die Jalousien lassen sich auch auf die Position direkt fahren. Ich denke das das dann das anfahren der Jalousien wie sie du beschrieben hast besser ist bzw. die richtige Herangehensweise ist.

Die items hierfür lauten:

Code: Alles auswählen

EGBalkontuere
EGBlumenfenster
EGSchiebetuere
EGWohnzimmer
Die Channels wie sie angelegt sind als Beispiel:

Code: Alles auswählen

channels:
  - id: EG_Schiebetuere
    channelTypeUID: knx:rollershutter
    label: Terassentüre
    description: ""
    configuration:
      upDown: 2/0/0
      stopMove: 2/1/0
      position: 2/2/0+<2/3/0
  - id: EG_Balkontuere
    channelTypeUID: knx:rollershutter
    label: Balkontüre
    description: ""
    configuration:
      upDown: 2/0/1
      stopMove: 2/1/1
      position: 2/2/1+<2/3/1
  - id: EG_Blumenfenster
    channelTypeUID: knx:rollershutter
    label: Blumenfenster
    description: ""
    configuration:
      upDown: 2/0/2
      stopMove: 2/1/2
      position: 2/2/2+<2/3/2
  - id: EG_Wohnzimmer
    channelTypeUID: knx:rollershutter
    label: Wohnzimmer
    description: ""
    configuration:
      upDown: 2/0/9
      stopMove: 2/1/9
      position: 2/2/9+<2/3/9
Kannst du mir die Regel hierfür umbauen?
Für die Verstellung der Lamellen habe ich gelesen werden separate items benötigt. Diese würden wie folgt lauten:

Code: Alles auswählen

  - id: EG_Schiebetuere_Lamellen
    channelTypeUID: knx:dimmer
    label: Terassentüre Lamellen
    description: ""
    configuration:
      increaseDecrease: <2/7/0
      position: 2/1/0
      switch: 2/6/0
  - id: EG_Balkontuere_Lamellen
    channelTypeUID: knx:dimmer
    label: Balkontüre Lamellen
    description: ""
    configuration:
      increaseDecrease: <2/7/1
      position: 2/1/1
      switch: 2/6/1
  - id: EG_Blumenfenster_Lamellen
    channelTypeUID: knx:dimmer
    label: Blumenfenster Lamellen
    description: ""
    configuration:
      increaseDecrease: <2/7/2
      position: 2/1/0
      switch: 2/6/2
  - id: EG_Wohnzimmer_Lamellen
    channelTypeUID: knx:dimmer
    label: Wohnzimmer Lamellen
    description: ""
    configuration:
      increaseDecrease: <2/7/9
      position: 2/1/9
      switch: 2/6/9
      
Grüße Markus

Re: Jalousien nach Sonnenstand

Verfasst: 2. Mär 2021 12:04
von udo1toni
Fahren alle Jalousien auf die gleiche Beschattungsposition oder sind diese individuell pro Jalousie? Wie verhält sich der Aktor, wenn während der Positionsfahrt ein Befehl für die Lamellenposition kommt? Wird dieser dann anschließend ausgeführt, oder stoppt die Jalousie und die Lamellen werden direkt auf den Winkel gestellt? (ich habe keine Jalousien, nur Rollläden)

Re: Jalousien nach Sonnenstand

Verfasst: 2. Mär 2021 12:22
von Markus_JE
Hi Udo,

nein die Jalousien haben unterschiedliche Sollpositionen zum Sonnenschutz. Die Lamellen habe ich noch gar nicht mit drin bei der Verstellung
was mich auch schon gestört hat.
EGSchiebetuere.sendCommand(48)
EGBlumenfenster.sendCommand(70)
EGWohnzimmer.sendCommand(86)
EGBalkontuere.sendCommand(48)

Der Aktor verhält sich so dass wenn eine Positionsfahrt angefahren wird, und ich im währenden die Lamellen verstellen möchte bzw. tue, wird die Positionsfahrt unterbrochen.
Ich denke das ist so auch richtig da die Lamellen beim hoch fahren in die eine Richtung verstellen und beim runter fahren in die andere Richtung. Eigentlich wäre die richtige Lösung zuerst die Position anfahren und danach die Lamellen in die richtige Position stellen.

Gruß Markus

Re: Jalousien nach Sonnenstand

Verfasst: 2. Mär 2021 13:37
von int5749
udo1toni hat geschrieben: 2. Mär 2021 12:04 Fahren alle Jalousien auf die gleiche Beschattungsposition oder sind diese individuell pro Jalousie?
Hallo Udo,
ich habe auch nur Rollläden und derzeit 3 Regeln für die drei Sonnenseiten (denn im Norden ist sie nie zu sehen 8-) )
Morgens startet es entprechend mit der Nord-Ost Seite (das Haus steht etwas schief), wo die Rollladen dann (abhängig von der erwarteten Temperatur) nur von 100 auf eine entsprechende Position anfährt. Später fahren dann die anderen Rollladen runter, kurz bevor die Sonne um die Hausecke kommt und wenn die Sonne rum ist, die entsprechende Seite auch hoch.

Hier wäre neben erwarteter Temperatur ggfs auch die Bewölkung hilfreich, wobei es auch bei Wolken warm sein kann.

Hier wäre mir ein Review der Rule SEHR recht, würde aber ungerne die threads vermischen. Wäre ein eigener thread OK, oder dürfte ich Dir die Rule mal als PN senden?

VG Jörg

Re: Jalousien nach Sonnenstand

Verfasst: 2. Mär 2021 15:03
von udo1toni
Mach doch lieber einen eigenen Thread auf, das ist ja auch für andere User sehr interessant.

Re: Jalousien nach Sonnenstand

Verfasst: 4. Mär 2021 11:13
von Markus_JE
Hi Udo,

jetzt scheint mir gerade die Sonne auf die Rübe.
Kannst du mir die Regel auf die Sollwerte der einzelnen Jalousien ummodeln bzw. mir dabei helfen?

Grüße Markus