Ankündigung

Einklappen
Keine Ankündigung bisher.

ERROR > Rule (now.toDateMidnight bzw. now.withTimeAtStartOfDay)

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

    ERROR > Rule (now.toDateMidnight bzw. now.withTimeAtStartOfDay)

    Hallo zusammen,

    folgende Rule versuche ich aktuell zum laufen zu bekommen.

    Code:
    import org.joda.time.*
    
    rule "Aquarium-Wof_Update Temperature Min- and Max values"
        when
            Item Temperatur_AQ_Wof_Value received update
        then
    
        //    logInfo("Aquarium-Wof_Update_Rule:", "postUpdate MinTemp to value: " + Temperatur_AQ_Wof_Value.minimumSince(now.toDateMidnight).state)
            postUpdate(Temperatur_AQ_Wof_Min_Formatted, Temperatur_AQ_Wof_Value.minimumSince(now.withTimeAtStartOfDay).state)
        //    logInfo("Aquarium-Wof_Update_Rule:", "postUpdate MinTemp new value: " + Temperatur_AQ_Wof_Min_Formatted.state)
            postUpdate(Temperatur_AQ_Wof_Max_Formatted, Temperatur_AQ_Wof_Value.maximumSince(now.withTimeAtStartOfDay).state)
        //    logInfo("Aquarium-Wof_Update_Rule:", "postUpdate MaxTemp: " + Temperatur_AQ_Wof_Value.maximumSince(now.toDateMidnight).state)
    
        end

    Ist diese Rule aktiv, erhalte ich im Log folgender Fehler:

    Code:
    2017-07-21 13:08:09.849 [COLOR=red][ERROR][/COLOR] [.script.engine.ScriptExecutionThread] - Rule 'Aquarium-Wof_Update Temperature Min- and Max values': cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null

    Hat jemand eine Idee was ich hier falsch mache?
    Ich nutze aktuell openHAB 2.1...

    Vielen Dank.
    crax

    #2
    Versuche mal, die Methode statt der Action zu nutzen. Also
    Code:
    Temperatur_AQ_Wof_Min_Formatted.postUpdate(Temperatur_AQ_Wof_Value.minimumSince(now.withTimeAtStartOfDay).state)
    Was passiert denn, wenn Du das logInfo aktivierst? So:
    Code:
    logInfo("Aquarium-Wof_Update_Rule:", "postUpdate MinTemp to value: {}°C", Temperatur_AQ_Wof_Value.minimumSince(now.toDateMidnight).state)
    Temperatur_AQ_Wof_Value hast Du in der Default Persistence eingerichtet? Du hast auch eine Default Persistence gesetzt?

    Kommentar


      #3
      Hi,

      ich habe zum test eine separate Rule erstellt.
      Code:
      import org.joda.time.*
      
      rule "Aquarium-Grund_Update Temperature Min- and Max values"
      when
      Item Temperatur_AQ_Grund_Value received update
      then
      logInfo("Aquarium-Grund_Update_Rule:", "postUpdate MinTemp to value: {}°C", Temperatur_AQ_Grund_Value.minimumSince(now.toDateMidnight).state)
      end
      Folgender Fehler erhalte ich:

      Code:
      2017-07-21 15:17:31.482 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Aquarium-Grund_Update Temperature Min- and Max values': cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null

      Eine Default Persistence habe ich in der Paper UI gesetzt, in meinem Fall RRD4J.

      Kommentar


        #4
        Und die verwendest Du auch, um das Item zu persistieren?

        Kommentar


          #5
          Du meinst ob ich in der rrd4j.persist auch diese Item eingetragen habe oder?

          Hier der Auszug aus dieser Datei:
          Temperatur_AQ_Grund_Value : strategy = everyMinute, restoreOnStartup

          Kommentar


            #6
            Eine Möglichkeit wäre noch, dass openHAB keine Werte schreibt (manchmal geht so eine Datei ja korrupt, und dann klappt es halt nicht mehr). Lässt Du Dir die Temperaturwerte als Graph ausgeben? Nur, um das auszuschließen...

            Am Rande fällt mir noch auf (sollte aber eigentlich keine Auswirkungen auf das konkrete Problem haben), dass import org.joda.time.* unter OH2 nicht funktioniert, aber auch nicht nötig sein sollte. Allgemein darf der * nicht mehr beim import benutzt werden.

            Kommentar


              #7
              Hi,

              wie du vermutet hast lag es an der korrupten Datei... da wäre ich nie darauf gekommen!

              Das dies jetzt funktioniert möchte ich gerne eine weitere Rule erstellen welche mich via Push benachrichtigt, sobald die Temperatur einen gewissen Wert über- bzw. unterschreitet.

              Dazu habe ich mir folgende Rule erstellt:

              Code:
              var boolean sentTemperature = false
              var boolean sentTemperatureCritical = false
              var int Temp_MIN_Ok = 24
              var int Temp_MIN_Alert = 23
              var int Temp_MIN_Crit = 22
              
              rule "notification_watch Aquarium Temperature_Min.rules"
              when
              Item Temperatur_AQ_Wof_Value changed
              then
              //logInfo("Notification_watch_Temp_Min_Aquarium_Rule:", Temperatur_AQ_Wof_Value.state.toString())
              
              // If Temperature drops below 23°C then send one Alarm for critical Temp.State
              if (!sentTemperature && Temperatur_AQ_Wof_Value.state < Temp_MIN_Alert) {
              logInfo("Notification_watch_Temp_Min_Aquarium_Rule:", "Min-Temperatur Aquarium zu niedrig: " + Temperatur_AQ_Wof_Value.state.toString() + "°C")
              sendNotification("mailadresse", "Temperatur Aquarium zu niedrig: " + Temperatur_AQ_Wof_Value.state + "°C")
              sentTemperature = true
              }
              // If Temperature drops below 22°C then re-send one more Alarm for critical Temp.State
              else if (sentTemperature && !sentTemperatureCritical && Temperatur_AQ_Wof_Value.state < Temp_MIN_Crit) {
              logInfo("Notification_watch_Temp_Min_Aquarium_Rule:", "Min-Temperatur Aquarium zu niedrig CRITICAL: " + Temperatur_AQ_Wof_Value.state.toString() + "°C")
              sendNotification("mailadresse", "!! Temperatur Aquarium kritisch !! - " + Temperatur_AQ_Wof_Value.state + "°C")
              sentTemperatureCritical = true
              }
              // If Temperature decreases below 24°C then Temperature seems to be okay
              else if (sentTemperature && Temperatur_AQ_Wof_Value.state > Temp_MIN_Ok) {
              logInfo("Notification_watch_Temp_Min_Aquarium_Rule:", "Min-Temperatur Aquarium OK: " +Temperatur_AQ_Wof_Value.state.toString() + "°C")
              sendNotification("mailadresse", "Temperatur Aquarium OK: " +Temperatur_AQ_Wof_Value.state + "°C")
              
              sentTemperature = false
              sentTemperatureCritical = false
              }
              end

              Das dazugehörige Item:
              Code:
              String Temperatur_AQ_Wof_Value                    "Wasseroberfläche [%s °C]"         (Temp_AQ_Graph)        [ "CurrentTemperature" ]        {channel="exec:command:Temperatur_AQ_S2:output"}
              Und das entsprechende Thing:
              Code:
              Thing exec:command:Temperatur_AQ_S2         [command="bash /etc/openhab2/scripts/ds18b20.sh 28-0415a463a0ff"]
              Hast du zufällig noch eine Idee weshalb ich diese Push nicht erhalte?

              Danke dir.




              Kommentar


                #8
                Du vergleichst einen State mit einem Primitive. Folgendes sollte funktionieren:
                Code:
                 if (!sentTemperature && [COLOR=#FF0000]([/COLOR]Temperatur_AQ_Wof_Value.state [COLOR=#FF0000]as DecimalType).intValue[/COLOR] < Temp_MIN_Alert) {
                natürlich an allen entsprechenden Stellen.
                Bei der log-Zeile empfehle ich folgende Schreibweise:
                Code:
                 logInfo("Aquarium", "Temperatur Aquarium zu niedrig: {} °C" , Temperatur_AQ_Wof_Value.state)
                Der Witz ist, dass man so auf die Typumwandlung verzichten kann. Wenn man mehrere Werte in einer Zeile ausgeben möchte, schreibt man einfach mehr {} in die Zeile und hängt die Parameter mit Kommata getrennt an.
                Der erste Teil der Logzeile ist der LoggerName, über den man umschalten kann, ob hier Debug, Info, Warn oder Error Level ausgegeben wird (dann kann man die Logzeilen im Code belassen und einfach den entsprechenden Logger zu drehen...), der sollte also möglichst kurz sein.
                Ob der Trick mit den {} Platzhaltern auch direkt bei sendNotification funktioniert, müsstest Du ausprobieren, ich rechne aber damit, das ist, wenn ich richtig liege, in den darunter liegenden Schichten implementiert.

                Kommentar


                  #9
                  Wenn ich deine Vorgaben umsetzte erhalte ich folgender Fehler im Log:

                  Rule:
                  Code:
                  var boolean sentTemperature = false
                  var boolean sentTemperatureCritical = false
                  var int Temp_MIN_Ok = 24
                  var int Temp_MIN_Alert = 23
                  var int Temp_MIN_Crit = 22
                  
                  rule "notification_watch Aquarium Temperature_Min.rules"
                  when
                  Item Temperatur_AQ_Wof_Value changed
                  then
                  //sendNotification("mailadresse", "Temperatur Aquarium hat sich geändert: " + Temperatur_AQ_Wof_Value.state + "°C")
                  //logInfo("Notification_watch_Temp_Min_Aquarium_Rule:", Temperatur_AQ_Wof_Value.state.toString())
                  
                  // If Temperature drops below 23°C then send one Alarm for critical Temp.State
                  //if (!sentTemperature && Temperatur_AQ_Wof_Value.state < Temp_MIN_Alert) {
                  if (!sentTemperature && (Temperatur_AQ_Wof_Value.state as DecimalType).intValue < Temp_MIN_Alert) {
                  logInfo("Aquarium", "Min-Temperatur Aquarium zu niedrig: {} °C" , Temperatur_AQ_Wof_Value.state)
                  sendNotification("mailadresse", "Temperatur Aquarium zu niedrig: " + Temperatur_AQ_Wof_Value.state + "°C")
                  sentTemperature = true
                  }
                  // If Temperature drops below 22°C then re-send one more Alarm for critical Temp.State
                  else if (sentTemperature && !sentTemperatureCritical && (Temperatur_AQ_Wof_Value.state as DecimalType).intValue < Temp_MIN_Crit) {
                  logInfo("Aquarium", "Min-Temperatur Aquarium zu niedrig CRITICAL: {} °C" , Temperatur_AQ_Wof_Value.state)
                  sendNotification("mailadresse", "!! Temperatur Aquarium kritisch !! - " + Temperatur_AQ_Wof_Value.state + "°C")
                  sentTemperatureCritical = true
                  }
                  // If NOC-Temperature decreases below 24°C then Temperature seems to be okay
                  else if (sentTemperature && (Temperatur_AQ_Wof_Value.state as DecimalType).intValue  > Temp_MIN_Ok) {
                  logInfo("Aquarium", "Min-Temperatur Aquarium OK: {} °C" , Temperatur_AQ_Wof_Value.state)
                  sendNotification("mailadresse", "Temperatur Aquarium OK: " +Temperatur_AQ_Wof_Value.state + "°C")
                  
                  sentTemperature = false
                  sentTemperatureCritical = false
                  }
                  end

                  Fehlermeldung:
                  Code:
                   
                   2017-07-22 14:55:48.707 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'notification_watch Aquarium Temperature_Min.rules': org.eclipse.smarthome.core.library.types.DecimalType
                  Danke dir.

                  Kommentar


                    #10
                    Das kann aber nicht die ganze Meldung sein... Vielleicht solltest Du die Rule etwas weiter auseinander dröseln:
                    Code:
                    var boolean sentTemperature = false var boolean sentTemperatureCritical = false
                      var int Temp_MIN_Ok = 24
                      var int Temp_MIN_Alert = 23
                      var int Temp_MIN_Crit = 22
                     
                    rule "notification_watch Aquarium Temperature_Min.rules"
                    when
                        Item Temperatur_AQ_Wof_Value changed
                    then
                        if(!Temperatur_AQ_Wof_Value.state instanceof DecimalType) {
                            logInfo("Aquarium", "Datenfehler! {}",Temperatur_AQ_Wof_Value.state)
                          }
                          else {
                              if (!sentTemperature) {
                                  if ((Temperatur_AQ_Wof_Value.state as DecimalType).intValue < Temp_MIN_Alert) {
                                      logInfo("Aquarium", "Min-Temperatur Aquarium zu niedrig: {} °C" , Temperatur_AQ_Wof_Value.state)
                                      sendNotification("mailadresse", "Temperatur Aquarium zu niedrig: " + Temperatur_AQ_Wof_Value.state + "°C")
                                      sentTemperature = true
                                  }
                              }
                              else {
                                  else if (!sentTemperatureCritical) {
                                      if ((Temperatur_AQ_Wof_Value.state as DecimalType).intValue < Temp_MIN_Crit) {
                                          logInfo("Aquarium", "Min-Temperatur Aquarium zu niedrig CRITICAL: {} °C" , Temperatur_AQ_Wof_Value.state)
                                          sendNotification("mailadresse", "!! Temperatur Aquarium kritisch !! - " + Temperatur_AQ_Wof_Value.state + "°C")
                                          sentTemperatureCritical = true
                                      }
                                  }
                                  else if ((Temperatur_AQ_Wof_Value.state as DecimalType).intValue > Temp_MIN_Ok) {
                                      logInfo("Aquarium", "Min-Temperatur Aquarium OK: {} °C" , Temperatur_AQ_Wof_Value.state)
                                      sendNotification("mailadresse", "Temperatur Aquarium OK: " +Temperatur_AQ_Wof_Value.state + "°C")
                                      sentTemperature = false
                                      sentTemperatureCritical = false
                                  }
                              }
                          }
                      end
                    Grundsätzlich sehe ich keinen Fehler, es könnte natürlich sein, dass irgendwo anders im Rule-File ein Fehler ist, der dann Auswirkungen hat. Nutzt Du den Designer zur Eingabe?

                    Kommentar


                      #11
                      Hi, ich habe das ganze jetzt mal gekürzt...

                      Code:
                      var boolean sentTemperature = false
                      var boolean sentTemperatureCritical = false
                      var int Temp_MIN_Ok = 24
                      var int Temp_MIN_Alert = 23
                      var int Temp_MIN_Crit = 22
                      
                      rule "debug_notification"
                      when
                          Item Temperatur_AQ_Wof_Value changed
                      then
                          if(!Temperatur_AQ_Wof_Value.state instanceof DecimalType) {
                              logInfo("Aquarium", "Datenfehler! {}", Temperatur_AQ_Wof_Value.state)
                      } end

                      Auch hier erhalte ich ein Fehler im Log...

                      Code:
                      2017-07-22 21:10:53.326 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'debug_notification': An error occurred during the script execution: The name '! <XMemberFeatureCallImplCustom>' cannot be resolved to an item or type.

                      Kommentar


                        #12
                        Na dann mit Klammern...
                        Code:
                        if(!(Temperatur_AQ_Wof_Value.state instanceof DecimalType))
                        Das könnte dann auch bei den anderen Zeilen in der eigentlichen Rule das Problem sein.

                        Kommentar


                          #13
                          Hi, so hat es nun funktioniert... Loginfo erscheint.

                          Code:
                          2017-07-22 22:51:32.464 [INFO ] [ipse.smarthome.model.script.Aquarium] - Datenfehler! 27.4
                          Dann liegt es wie du vermutet hast an den Werten, kann ich hier was ändern?

                          Kommentar


                            #14
                            Arrgh...Temperatur_AQ_Wof_Value hast Du als String definiert. Das sollte eigentlich ein Number Item sein.
                            Probier mal, ob es als Number Item geght, ansonsten müssen wir halt in der Rule von einem String ausgehen und entsprechende Typumwandlungen vornehmen.

                            Kommentar


                              #15
                              Hi, funktioniert mit einen Number Item leider nicht, Sensor liefert dann keine Daten mehr...
                              Kann man den Typ in einer Rule umwandeln?

                              Kommentar

                              Lädt...
                              X