Seite 2 von 2

Re: Komm nicht weiter

Verfasst: 16. Jun 2021 08:57
von Snatsch
Wenn ich in einer Rule die nur in der Nacht von 1 bis 6 Uhr triggern soll " if(now.getHour<1 || now.getHour > 6) return;" wird sie bis um 7 Uhr getriggert, Habe ich einen Denkfehler ?

Re: Komm nicht weiter

Verfasst: 16. Jun 2021 13:21
von peter-pan
Die If-Anweisung ist kein Trigger !!! Wie sieht denn die Rule aus ?

Re: Komm nicht weiter

Verfasst: 16. Jun 2021 15:04
von Snatsch
Sie hier........

var Timer TuerNachtPartyraum = null

rule "Nacht Türe Partyraum geöffnet"

when Item AussentuerePartyraum_TurFensterstatus changed

then
(if (AussentuerePartyraum_TurFensterstatus.state == OPEN){
if(now.getHour <1 || now.getHour >6) return;
MeldungTelegran.sendpostUpdate ("Die Außentüre im Partyraum ist geöffnet wurden")
LEDLeisteTreppenhaus_Schalter.sendCommand (ON)
LEDLeisteKuche_Schalter.sendCommand (ON)
StehleuchteWohnzimmer_Schalter.sendCommand (ON)

}
)
if (AussentuerePartyraum_TurFensterstatus.state == CLOSED){
if(now.getHour <1 || now.getHour >6) return;
TuerNachtPartyraum = createTimer(ZonedDateTime.now.plusMinutes(10),[|
LEDLeisteTreppenhaus_Schalter.sendCommand (OFF)
LEDLeisteKuche_Schalter.sendCommand (OFF)
StehleuchteWohnzimmer_Schalter.sendCommand (OFF)
])
}

end

Re: Komm nicht weiter

Verfasst: 16. Jun 2021 18:19
von peter-pan
Bitte Code immer in Code-Fenster, das ist einfach besser lesbar:

Code: Alles auswählen

var Timer TuerNachtPartyraum = null

rule "Nacht Türe Partyraum geöffnet"

when Item AussentuerePartyraum_TurFensterstatus changed

then
(if (AussentuerePartyraum_TurFensterstatus.state == OPEN){
if(now.getHour <1 || now.getHour >6) return;
MeldungTelegran.sendpostUpdate ("Die Außentüre im Partyraum ist geöffnet wurden")
LEDLeisteTreppenhaus_Schalter.sendCommand (ON)
LEDLeisteKuche_Schalter.sendCommand (ON)
StehleuchteWohnzimmer_Schalter.sendCommand (ON)

}
)
if (AussentuerePartyraum_TurFensterstatus.state == CLOSED){
if(now.getHour <1 || now.getHour >6) return;
TuerNachtPartyraum = createTimer(ZonedDateTime.now.plusMinutes(10),[|
LEDLeisteTreppenhaus_Schalter.sendCommand (OFF)
LEDLeisteKuche_Schalter.sendCommand (OFF)
StehleuchteWohnzimmer_Schalter.sendCommand (OFF)
])
}

end
Also, ohne den Code eingehender untersucht zu haben, fällt mir die (komplette) Klammerung der ersten IF-Anweisung auf. Außerdem fragst du 2-mal den Zeitraum ab. Das sollte eigentlich einmal, und zwar direkt nach "then" reichen.

Code: Alles auswählen

var Timer TuerNachtPartyraum = null

rule "Nacht Türe Partyraum geöffnet"

when 
  Item AussentuerePartyraum_TurFensterstatus changed

then
  if(now.getHour <1 || now.getHour >6) return;
  if (AussentuerePartyraum_TurFensterstatus.state == OPEN){
  MeldungTelegran.sendpostUpdate ("Die Außentüre im Partyraum ist geöffnet worden")
  LEDLeisteTreppenhaus_Schalter.sendCommand (ON)
  LEDLeisteKuche_Schalter.sendCommand (ON)
  StehleuchteWohnzimmer_Schalter.sendCommand (ON)
  }
  if (AussentuerePartyraum_TurFensterstatus.state == CLOSED){
  TuerNachtPartyraum = createTimer(ZonedDateTime.now.plusMinutes(10),[|
  LEDLeisteTreppenhaus_Schalter.sendCommand (OFF)
  LEDLeisteKuche_Schalter.sendCommand (OFF)
  StehleuchteWohnzimmer_Schalter.sendCommand (OFF)
  ])
  }
end
Der Trigger/Auslöser für die Regel ist hier die Statusänderung des Items AussentuerePartyraum_TurFensterstatus

Re: Komm nicht weiter

Verfasst: 16. Jun 2021 22:49
von udo1toni
Ja, Du hast einen Denkfehler. Die Grenze soll 6 Uhr sein, also um 6 Uhr nicht mehr ausführen, aber um 05:59:59 soll noch ausgeführt werden. Die zweite Abbruchbedingung muss also >5 heißen, now.getHour liefert einen Integer Wert, das ist exakt die Zahl vor dem ersten Doppelpunkt (um 05:59:59 also eine 5, um 06:00:00 eine 6)

Ansonsten hat peter-pan es ja schon erläutert...

Im ersten Teil hast Du außerdem ein sendpostUpdate drin stehen, das gibt es natürlich nicht. Sauber (und um unnötige Teile erleichtert) sieht die Rule so aus:

Code: Alles auswählen

var Timer TuerNachtPartyraum = null

rule "Nacht Türe Partyraum geöffnet"
when
    Item AussentuerePartyraum_TurFensterstatus changed
then
    if(now.getHour == 0 || now.getHour > 5) return;       // Abbruch vor 1 Uhr und nach 6 Uhr
    TuerNachtPartyraum?.cancel            // Falls ein Timer läuft: Abbruch
    if(AussentuerePartyraum_TurFensterstatus.state == OPEN) {  // Kontakt offen:
        MeldungTelegran.postUpdate("Die Außentüre im Partyraum ist geöffnet worden")
        LEDLeisteTreppenhaus_Schalter.sendCommand(ON)
        LEDLeisteKuche_Schalter.sendCommand(ON)
        StehleuchteWohnzimmer_Schalter.sendCommand(ON)
    } else                                 // Kontakt nicht offen (also geschlossen):
        TuerNachtPartyraum = createTimer(ZonedDateTime.now.plusMinutes(10), [|
            LEDLeisteTreppenhaus_Schalter.sendCommand(OFF)
            LEDLeisteKuche_Schalter.sendCommand(OFF)
            StehleuchteWohnzimmer_Schalter.sendCommand(OFF)
        ])
end
Achte bitte auch auf die Leerzeichen. Es mag an einigen Stellen keine Auswirkungen haben, hilft aber dabei, die Zusammenhänge zu verstehen.
Die Sache mit den Klammern...
eine bedingte Verzweigung wirkt nur auf den nächsten Befehl. Damit mehrere Befehle bedingt ausgeführt werden, muss man sie also "gruppieren", das geschieht mit den geschweiften Klammern. Alles von { bis } wird also als Block betrachtet. Der else-Teil wirkt ebenfalls nur auf den ersten Befehl. Dieser Befehl ist aber das createTimer(). Der Codeblock ist ein Parameter von createTimer, für else spielt dieser Teil also keine Rolle.

Re: Komm nicht weiter

Verfasst: 13. Mär 2022 18:44
von udi
Hallo,

ich lesen und lerne hier im Forum begeistert mit! Wirklich klasse :)

Bei diesen Szenario hier komme ich leider nicht weiter. Ich arbeite mit VC Code und lege dort eine Rule für den Callmebot an. VS meckert bei "import java.net.URLEncoder". Missing EOF. Ich habe keine Ahnung und keinen Ansatz, wo das Problem liegt. Könnt ihr mir vielleicht einen Tipp geben?

Re: Komm nicht weiter

Verfasst: 13. Mär 2022 21:25
von int5749
udi hat geschrieben: 13. Mär 2022 18:44 Hallo,

ich lesen und lerne hier im Forum begeistert mit! Wirklich klasse :)

Bei diesen Szenario hier komme ich leider nicht weiter. Ich arbeite mit VC Code und lege dort eine Rule für den Callmebot an. VS meckert bei "import java.net.URLEncoder". Missing EOF. Ich habe keine Ahnung und keinen Ansatz, wo das Problem liegt. Könnt ihr mir vielleicht einen Tipp geben?
Hallo und willkommen.

Ein anderes Thema zu anektieren ist meist nicht so optimal, gerade wenn der Titel so allgemein gültig ist.
Evtl. machst Du einen neuen Thread auf, und beschreibst in Titel und Text Dein Problem??
z.B. auch warum Du eine Java Libary importieren möchtest?

Re: Komm nicht weiter

Verfasst: 14. Mär 2022 12:10
von udi
dsa gebe ich dir auch Recht. Da die Ausgangssituation für diesen Thread genau meiner entsprache, dachte ich aber ich klinke mich mal eben ein :)

Ich konnte das Problem heute Nacht nun nach 10 Stunden suchen und probieren selber lösen. Meine rules Datei beinhaltet eine Vielzahl an Regeln. Die betroffene Regel steht am Ende (zuletzt hinzugefügt). Die Zeile import java... darf nicht direkt über der betroffenen Regel stehen, sondern muss an den Anfang der Datei. Ich hoffe, ich bin der Einzige, der damit so viel Zeit verschwendet hat :D

Re: Komm nicht weiter

Verfasst: 14. Mär 2022 13:09
von int5749
udi hat geschrieben: 14. Mär 2022 12:10 Die Zeile import java... darf nicht direkt über der betroffenen Regel stehen, sondern muss an den Anfang der Datei.
Genau, und ebenso globale Variblen ;-)

Re: Komm nicht weiter

Verfasst: 14. Mär 2022 15:53
von udi
Danke acuh für den Tipp! Ich stelle alle rules gerade um auf Anlage per Text Datei. Durch die Erstellung im Frontend von OH hat man ja nicht wirklich viel mit Java zu tun. Ich hoffe, ich quäle mich da erfolgreich durch :P