Ankündigung

Einklappen
Keine Ankündigung bisher.

rules und mehrere oder

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    rules und mehrere oder

    wie kann ich in rules lösen, Bedingung und mehrere oder ?
    ich möche eine variable von RWE Smarthome abfragen wenn die da ist und ein von den 4 Schalter ausgeschaltet wird möchte ich ne mail bekommen
    Code:
    rule "licht aus"
    when
    Item rweVariablebe8495 changed from OFF to ON
    Item rweSwitch4bca31 changed from ON to OFF or
    Item rweSwitch544302 changed from ON to OFF or
    Item rweSwitchd6a135 changed from ON to OFF or
    Item hue4 changed from ON to OFF or
    
    
    
    
    then
    
    sendMail("smart@gmail.com","Licht würde aus geschaltet" )
        end
    r
    wenn ich so schreibe bekomme ich bei dem ersten Item Felermeldung
    Zuletzt geändert von djuscha; 29.05.2016, 11:12.

    #2
    dur fragst die variable nicht schon bei den trioggern ab sondern vor dem mail senden...

    ca so. (nur zusammen koipert)


    rule "licht aus"
    when
    Item rweSwitch4bca31 changed from ON to OFF or
    Item rweSwitch544302 changed from ON to OFF or
    Item rweSwitchd6a135 changed from ON to OFF or
    Item hue4 changed from ON to OFF
    then

    if (rweVariablebe8495.state==ON) {
    sendMail("smart@gmail.com","Licht würde aus geschaltet" )
    }

    end

    Kommentar


      #3

      Kommentar


        #4
        Danke schön

        Kommentar


          #5
          @Ea Sy die Version funktioniert soweit, aber ich bekomme mehrere Mails z.B 3 Schalter betätigt drei Mails kann man das irgendwie begrenzen sobald einer betätigt wurde ne Mail und das war's .?

          Kommentar


            #6
            Es kommt natürlich darauf an, welches Verhalten Du genau möchtest. Beim 1. Aus-Befehl soll die Mail ausgelöst werden, aber wie lange dann nicht mehr, also welches Ereignis soll eintreten, damit doch wieder eine Mail kommt?

            Am einfachsten baust Du eine weitere Bedingung ein und setzt nach dem Versenden der Mail den betreffenden Marker:

            Code:
            var boolean mailSent = false
            
            rule "send Mail"
            when
               Item MyItem changed from ON to OFF
            then
                if (rweVariablebe8495.state==ON && !(mailSent)) {
                    sendMail("smart@gmail.com","Licht würde aus geschaltet" )
                    mailSent=true
                }
            end
            Wichtig ist, dass Du die Variable außerhalb der Rule am Beginn des Rulefiles definierst. Alternativ kannst Du auch ein Item dafür verwenden, welches kein Binding hat, dann kannst Du auf Wunsch in der UI sehen, ob eine Mail verschickt wurde. Dann müsstest Du statt der Zuweisung natürlich sentMail.postUpdate(ON) verwenden, und auf sentMail.state != ON testen - wenn Du auf == OFF testest, muss das Item initialisiert werden, wenn openHAB startet, ist der Inhalt der Items zunächst unintialized (OH1) bzw. NULL (OH2)

            Dazu brauchst Du natürlich noch eine weitere Rule, die die Variable wieder zurücksetzt.

            Eine andere Variante wäre, eine weitere Mail frühestens nach 30 Minuten zu schicken, dann solltest Du (nach dem mailSent=true) zusätzlich noch einen Timer starten:
            Code:
            createTimer(now.plusMinutes(30))[|mailSent=false]
            Diese Zeile legt im openHAB Scheduler einen Timer an, der 30 Minuten in der Zukunft endet. Wenn der Timer abgelaufen ist, wird der Befehl ausgeführt (die Variable zurückgesetzt)

            Kommentar


              #7
              Ach, glatt vergessen: Um now.plusMinutes() verwenden zu können, brauchst Du diesen import zu Beginn des Rulefiles:
              Code:
              import org.joda.time.DateTime

              Kommentar


                #8
                eine Mail und dann erst wieder wenn variable von RWE Smarthome rweVariablebe8495 wieder von off on geschaltet wird.

                Kommentar


                  #9
                  meinst du das so?
                  Code:
                  
                  var boolean mailSent = false
                  
                  
                  
                  
                  rule "Licht aus"
                  when
                  Item rweSwitch4bca31 changed from ON to OFF or
                  Item rweSwitch544302 changed from ON to OFF or
                  Item rweSwitchd6a135 changed from ON to OFF or
                  Item hue4 changed from ON to OFF
                  then
                     if (rweVariablebe8495.state==ON && !(mailSent)) {
                          sendMail("smart@gmail.com","licht aus" ,"licht aus")
                          mailSent=true
                  createTimer(now.plusMinutes(10))[|mailSent=false]
                      end

                  Kommentar


                    #10
                    Ja, genau. Nur hast Du jetzt die schließende geschweifte Klammer gelöscht (die muss hinter die createTimer-Zeile) {} kennzeichnen einen Codeblock als Block, alle Anweisungen werden im Ablauf als eine zusammenhängende Anweisung betrachtet. die If() Anweisung verzweigt ja, aber sie führt genau einen Befehl aus, wenn sie erfüllt ist, bzw. überspringt genau einen Befehl, wenn sie nicht erfüllt ist.

                    Wenn Du lieber auf den Zustandswechsel von rweVariablebe8495 warten möchtest, kannst Du es noch simpler haben, setze einfach dieses Item auf OFF, wenn Die Mail raus geht, schließlich willst Du dann ohnehin erst wieder scharf schalten. Ansonsten kannst Du natürlich trotzdem meine Variante nehmen, und dann eine zweite rule anlegen, die auf rweVariablebe8495 changed from ON to OFF triggert und nur mailSent=false setzt, je nach Geschmack...

                    Kommentar


                      #11
                      rweVariablebe8495 kann ich nicht auf off schalten ist ne Variable für denn Alarm in RWE. Ich probiere erstmal deine Variante. Viele Dank!

                      Kommentar


                        #12
                        Zitat von udo1toni Beitrag anzeigen

                        Code:
                        var boolean mailSent = false
                        mal ne frage am rande, wie lange wäre denn so ein satus einer variable gültig ?
                        ich war immer der meinung um einen 2. zylus der rule zu schaffen müsse man ein item verwenden ?


                        Kommentar


                          #13
                          Ea Sy : Wenn die Variable außerhalb der Rule definiert ist, gilt sie innerhalb dieses Rulefiles, solange openHAB nicht neu gestartet wird. Wenn die Variable innerhalb einer Rule definiert ist, gilt sie nur zur Laufzeit der Rule, wird also pro Aufruf der Rule neu initialisiert.

                          djuscha : Ich kenne mich mit dem rwe Binding nicht aus. Werden die Items regelmäßig aufgefrischt, also immer wieder mit demselben Wert gefüllt, auch wenn dieser sich nicht ändert?
                          Falls nur Änderungen des Wertes übertragen werden, kannst Du das Item mit rweVariablebe8495.postUpdate(OFF) trotzdem auf OFF setzen. Sobald das Item auf rwe-Seite auch auf OFF wechselt, bekommt openHAB das als Befehl, macht aber nichts, der Wert bleibt OFF. Ansonsten, wie schon erwähnt, löschst Du die Variable halt mit einer eigenen Rule:
                          Code:
                          rule "Mailversand aktivieren"
                          when
                              Item rweVariablebe8495 changed to OFF
                          then
                              mailSent=false
                          end

                          Kommentar


                            #14
                            @udo1toni
                            Items werden regelmäßig aufgefrischt, also nicht nur Änderung.


                            bekomme im Designer immer die Fehlermeldung in der Zeile
                            Code:
                            createTimer(now.plusMinutes(15))[|mailSent=false] }
                            Code:
                            Multiple markers at this line
                            - Couldn't resolve reference to JvmIdentifiableElement 'plusMinutes'.
                            - The word 'fehler' is not correctly spelled
                            - Couldn't resolve reference to JvmIdentifiableElement 'now'.
                            warum?

                            Kommentar


                              #15
                              das ist "normal", der designer kennt die "now" anweisung nicht, bei manchen soll es wohl aber dennoch funktionieren.
                              ich bin auch noch nicht lang genug dabei um zu wissen ob das früher mal besser ging.

                              ist eben schon merkwürdig weil diese anweisung in jedem 3. forenbeitrag erscheint als wäre es ein normaler befehl.
                              nur der designer (zumindes ab version 1.8.x die habe ich durch) kennst diesen befehl nicht.

                              selbst die zeile:
                              Code:
                              import org.joda.time.*
                              die am anfang der rule-datei stehen muss ändern leider an der fehlermeldung nichts.

                              teste einfach ob die funktion dennoch das macht was sie soll

                              Kommentar

                              Lädt...
                              X