Ankündigung

Einklappen
Keine Ankündigung bisher.

String in DateTime umwandeln

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

    String in DateTime umwandeln

    Moin Zusammen,
    das Thema gibt es hier in Ähnlicher Form mehrfach aber ich habe mein Problem einfach nicht lösen können da die Kombination von zwei Daten in einem String doch ne Harte Nuss zu sein scheint.
    Ich lande entweder immer bei dem Error-Log:
    Code:
    'state' is not a member of 'java.lang.String' 
    oder
    Code:
    split' is not a member of 'org.eclipse.smarthome.core.library.items.StringItem'
    Ich habe ein String-Item mit dem Inhalt:
    Code:
    2020-02-15/2020-02-25
    Ich benötige die beiden Daten aber in zwei getrennten DateTime-Items um in einer Rules ebzuprüfen ob ich mich in diesem Zeitraum (zwischen den beiden Daten) befinde.
    Leider bekomme ich das nicht hin.
    Zunächst habe ich versucht den String mittels "split" aufzutrennen und die beiden Zeile dann in zwei DateTime-Items zu übertragen.
    Mein Ansatz:
    Code:
    rule"Buderus Therme - Urlaubszeitraum 1 aufsplitten"
    when
    System started or
    ItemBuderus_hm1_startStop changed
    then
    valhm1TimeSplit_Start = Buderus_hm1_startStop.name.split("/").get(0)
    valhm1TimeSplit_Stop = Buderus_hm1_startStop.name.split("/").get(1)
    Buderus_hm1_Start.postUpdate(parse("" + hm1TimeSplit_Start.state))
    Buderus_hm1_Stop.postUpdate(parse("" + hm1TimeSplit_Stop.state))
    end
    Aber ich bekomme immer nur Fehlermeldungen.

    Hat jemand eine Idee wie ich das am intelligentesten umsetzen kann?

    Danke und Gruß
    Florian
    Zuletzt geändert von Demion; 14.02.2020, 08:37.

    #2
    Servus Florian,

    gleich der erste Eintrag bei einer Google-Suche nach "openhab split string": https://community.openhab.org/t/solv...in-rules/36235

    Demnach
    Code:
    Buderus_hm1_startStop.state.toString.split('/').get(0)
    statt
    Code:
    Buderus_hm1_startStop.name.split("/").get(0)
    Zumindest glaube ich nicht, dass du den gewünschten Wert im .name property findest.

    Erklärung: .split() ist eine Funktion, die nur auf Strings funktioniert, nicht auf StringItem (sagt dir auch die Fehlermeldung). Also musst du aus deinem StringItem einen String machen.

    Das gleiche gilt für die andere Fehlermeldung.
    Code:
    'state' is not a member of 'java.lang.String' 
    Du hast da ja eh schon einen String in der Hand. Und der hat dann keinen state mehr.

    Also:
    Code:
    Buderus_hm1_Start.postUpdate(parse(hm1TimeSplit_Start))
    Alles ungetestet und damit als Hilfestellung zu verstehen.
    LG Stefan

    Kommentar


      #3
      Moin Zusammen,
      moin Stefan,

      der erste Teil hat schon mal funktioniert. ...Vielen Dank.

      Ich bekomme die aufgetrennten Strings aber nicht als DateTime-Items abgelegt.
      Code:
      Buderus_hm1_Start.postUpdate(parse(hm1TimeSplit_Start))
      Sollte doch funktionieren wenn ich die Items in der XXX.item als DateTime deklariert habe oder müssen die Variablen in der XXX.items trotzdem als String deklariert werden.

      Nun habe ich sie erst mal als Strings abgelegt - das funktioniert

      In der Auswertungs-Rules wollte ich foldgende Methode benutzen:
      Code:
      if (now.isBefore(Buderus_hm1_Stop) && now.isAfter(Buderus_hm1_Start))
      ...aber dazu muss ich den String doch in ein DateTime-Format brindgen oder sehe ich das falsch?

      Danke und Gruß
      Florian

      Kommentar


        #4
        Siehst du richtig. Ich vermute stark, dir fehlt die Zeitangabe, darum kann er das reine Datum nicht parsen. Weiß grad ohne nachschauen nicht, ob es ein reines Date Objekt in OH gibt.
        Lesestoff: https://community.openhab.org/t/date...nversion/54266

        Das müsste quick and dirty funktionieren:
        Code:
        Buderus_hm1_Start.postUpdate(parse(hm1TimeSplit_Start + "'T'00:00:00"))
        Wahrscheinlich wirst du das Hochkomma noch escapen müssen, also
        Code:
        Buderus_hm1_Start.postUpdate(parse(hm1TimeSplit_Start + "\'T\'00:00:00"))

        Kommentar


          #5
          hmmm...
          In das Item bekomme ich den DateTime-Inhalt nicht übertragen.
          Code:
          2020-02-14 11:14:21.172 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Error during the execution of startup rule 'Buderus Therme - Urlaubszeitraum 1 aufsplitten': Invalid format: "2020-02-15'T'00:00:00" is malformed at "'T'00:00:00"
          Werden den Ansatz mit der Ergänzung um die Uhrzeit aber in der Rule für den Vergleich mit der Aktuellen Zeit aber verwenden.

          Ergänzung:
          Ich werte wie folgt aus und es schein zu funktionieren...
          Code:
          rule "Buderus Therme - Liegt Heute im Zeitraum der Abwesenheit?"
          when
          //Time cron "*/30 * * * * ?" or
          System started or
          Time cron "5 0 * * * ?"
          then
          if (now.isBefore(parse(Buderus_hm1_Stop + "\'T\'00:00:00")) && now.isAfter(parse(Buderus_hm1_Start + "\'T\'00:00:00")))
          {
          sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
          }
          end
          Danke und Gruß
          Florian
          Zuletzt geändert von Demion; 14.02.2020, 12:25.

          Kommentar


            #6
            Probier es bitte nochmal ganz ohne die Hochkomma, also:
            Code:
            Buderus_hm1_Start.postUpdate(parse(hm1TimeSplit_Start + "T00:00:00"))

            Kommentar


              #7
              Schau mal hier: https://community.openhab.org/t/date...nversion/54266

              Da sind die verschiedenen notwendigen Wandlungen sehr übersichtlich aufgeführt. Wenn die Daten als Datum in DateTime Items gespeichert werden sollen, müssen die beiden Strings nach DateTimeType konvertiert werden (ob nun mit parse(string) oder DateTimeType.valueOf(string) dürfte sich gleich bleiben)
              Zum Vergleich müssen die Status der DateTimeItems leider nach DateTime gewandelt werden (DateTime != DateTimeType)
              Sehr interessant ist auch der Codeschnipsel von 5iver: https://community.openhab.org/t/date...rsion/54266/23 aus dem gleichen Thread, denn joda bringt auch Zeiträume mit (man definiert also einen Interval und prüft, ob now in diesem Interval enthalten ist, statt zu prüfen, ob now nach der Untergrenze und vor der Obergrenze liegt. Man könnte mittels withDate(y,m,d) auch das Datum direkt setzen, allerdings müsste man dann die beiden Datumsstrings nochmals splitten - das scheint unnötig umständlich. Eigentlich müsste es auch eine Funktion zum parsen reiner Datumsangaben geben.

              Kommentar


                #8
                Moin Zusammen,

                danke für die Hilfestellung aber irgendwie komme ich nich weiter.
                Habe jetzt schon dieverse Varianten durchprobiert:

                "T00:00:00"
                "T00:00:00+00:00"
                "T00:00:00.000Z"
                "
                T00:00:00.000+0000
                "'T'00:00:00"
                "'T'00:00:00+00:00""
                "'T'00:00:00.000Z"
                "
                'T'00:00:00.000+0000"
                "\'T\'00:00:00""
                "\'T\'00:00:00+00:00"
                "\'T\'00:00:00.000Z"
                "
                \'T\'00:00:00.000+0000"

                Aber ich komme nicht zum gewünschten ergebnis.
                Der Inhalt der Variablen Buderus_hm1_Start_DT bleibt immer NULL.

                Der erste Teil funktioniert schon mal (bis zum Kommentar // ********** Ab hier stockt es **********)
                Code:
                rule"Buderus Therme - Urlaubszeitraum 1 aufsplitten"
                when
                Timecron"*/30 * * * * ?"or
                System started or
                ItemBuderus_hm1_StartStop changed
                then
                // ------------------- Start-Datum --------------------------
                // Time-String von Buderus YYYY-MM-DD/YYY-MM-DD aufsplitten in Start YYYY-MM-DD
                valhm1TimeSplitStart = Buderus_hm1_StartStop.state.toString.split('/').get(0)
                Buderus_hm1_Start.postUpdate(hm1TimeSplitStart + "T00:00:00+00:00")
                // Time-String von Start YYYY-MM-DD umwandeln in DD.MM.YYYY
                varBuderus_hm1_Start_Day = hm1TimeSplitStart.toString.split('-').get(2)
                varBuderus_hm1_Start_Month = hm1TimeSplitStart.toString.split('-').get(1)
                varBuderus_hm1_Start_Year = hm1TimeSplitStart.toString.split('-').get(0)
                Buderus_hm1_Start_Datum.postUpdate(Buderus_hm1_Start_Day + "." + Buderus_hm1_Start_Month + "." + Buderus_hm1_Start_Year)
                // ------------------- Stop-Datum --------------------------
                // Time-String von Buderus YYYY-MM-DD/YYY-MM-DD aufsplitten in Stop YYYY-MM-DD
                valhm1TimeSplitStop = Buderus_hm1_StartStop.state.toString.split('/').get(1)
                Buderus_hm1_Stop.postUpdate(hm1TimeSplitStop + "T00:00:00+00:00")
                // Time-String von Start YYYY-MM-DD umwandeln in DD.MM.YYYY
                varBuderus_hm1_Stop_Day = hm1TimeSplitStop.toString.split('-').get(2)
                varBuderus_hm1_Stop_Month = hm1TimeSplitStop.toString.split('-').get(1)
                varBuderus_hm1_Stop_Year = hm1TimeSplitStop.toString.split('-').get(0)
                Buderus_hm1_Stop_Datum.postUpdate(Buderus_hm1_Stop_Day + "." + Buderus_hm1_Stop_Month + "." + Buderus_hm1_Stop_Year)
                // *************** Ab hier stockt es **********************
                varDateTimeJDT_time_hm1_Start = parse(Buderus_hm1_Start.toString)                     // Parse JDT object from timestring
                varDateTimeTypeDTT_time_hm1_Start = new DateTimeType(JDT_time_hm1_Start.toString)     // Convert JodaDateTime to DateTimeType 
                Buderus_hm1_Start_DT.postUpdate(DTT_time_hm1_Start)                                     // CarTripStart item changed to TestTime for the purpose of this test
                end
                Ich möchte am Ende abfraben ob das aktuelle Datum im Zeitraum liegt...

                Code:
                if (now.isBefore(parse(Buderus_hm2_Stop.toString)) && now.isAfter(parse(Buderus_hm2_Start.toString)))
                {
                    sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                }
                Vielleicht fehlt auch ein AddOn ???

                die openhab.log ist jedenfalls beschnitten...
                2020-02-28 20:47:35.024 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Buderus Therme - Urlaubszeitraum 1 aufsplitten': Invalid format: "Buderus_hm1_Start (Type=StringIt..."
                Danke und Gruß
                Florian

                Kommentar


                  #9
                  Du hast das .state vergessen.
                  Allerdings möchte ich noch zu bedenken geben, dass das postUpdate oben in der Rule asynchron abläuft. Das bedeutet, es gibt keinerlei Garantie dafür, dass der Status des Items schon mit dem neuen Wert gefüllt ist. Es wäre also besser, auf die Variable zuzugreifen

                  Kommentar


                    #10
                    Ahhh...
                    Das mit dem postUpdate verstehe ich, sollte aber wärend des Testens mit dem 30 Sekunden cron spätestens nach einer Minute ein Ergebnis ergeben.
                    Aber wo habe ich das .state vergessen?

                    Bis
                    // *************** Ab hier stockt es **********************
                    funktioniert aber alles einwandfrei!!!

                    Danke und Gruß

                    ERGÄNZUNG!!!

                    Es funktioniert :-)
                    Code:
                    rule"Buderus Therme - Urlaubszeitraum 1 aufsplitten"
                    when
                    Timecron"*/30 * * * * ?"or
                    System started or
                    ItemBuderus_hm1_StartStop changed
                    then
                    // ------------------- Start-Datum --------------------------
                    // Time-String von Buderus YYYY-MM-DD/YYY-MM-DD aufsplitten in Start YYYY-MM-DD
                    valhm1TimeSplitStart = Buderus_hm1_StartStop.state.toString.split('/').get(0)
                    //Buderus_hm1_Start.postUpdate(hm1TimeSplitStart + "T00:00:00+00:00")
                    // Time-String von Start YYYY-MM-DD umwandeln in DD.MM.YYYY
                    varBuderus_hm1_Start_Day = hm1TimeSplitStart.toString.split('-').get(2)
                    varBuderus_hm1_Start_Month = hm1TimeSplitStart.toString.split('-').get(1)
                    varBuderus_hm1_Start_Year = hm1TimeSplitStart.toString.split('-').get(0)
                    Buderus_hm1_Start_Datum.postUpdate(Buderus_hm1_Start_Day + "." + Buderus_hm1_Start_Month + "." + Buderus_hm1_Start_Year)
                    varDateTimeJDT_time_hm1_Start = parse(hm1TimeSplitStart.toString + "T00:00:00+00:00")     // Parse JDT object from timestring
                    varDateTimeTypeDTT_time_hm1_Start = new DateTimeType(JDT_time_hm1_Start.toString)         // Convert JodaDateTime to DateTimeType 
                    Buderus_hm1_Start_DT.postUpdate(DTT_time_hm1_Start)                                         // CarTripStart item changed to TestTime for the purpose of this test
                    // ------------------- Stop-Datum --------------------------
                    // Time-String von Buderus YYYY-MM-DD/YYY-MM-DD aufsplitten in Stop YYYY-MM-DD
                    valhm1TimeSplitStop = Buderus_hm1_StartStop.state.toString.split('/').get(1)
                    //Buderus_hm1_Stop.postUpdate(hm1TimeSplitStop + "T00:00:00+00:00")
                    // Time-String von Start YYYY-MM-DD umwandeln in DD.MM.YYYY
                    varBuderus_hm1_Stop_Day = hm1TimeSplitStop.toString.split('-').get(2)
                    varBuderus_hm1_Stop_Month = hm1TimeSplitStop.toString.split('-').get(1)
                    varBuderus_hm1_Stop_Year = hm1TimeSplitStop.toString.split('-').get(0)
                    Buderus_hm1_Stop_Datum.postUpdate(Buderus_hm1_Stop_Day + "." + Buderus_hm1_Stop_Month + "." + Buderus_hm1_Stop_Year)
                    varDateTimeJDT_time_hm1_Stop = parse(hm1TimeSplitStop.toString + "T00:00:00+00:00")       // Parse JDT object from timestring
                    varDateTimeTypeDTT_time_hm1_Stop = new DateTimeType(JDT_time_hm1_Stop.toString)           // Convert JodaDateTime to DateTimeType 
                    Buderus_hm1_Stop_DT.postUpdate(DTT_time_hm1_Stop)                                           // CarTripStart item changed to TestTime for the purpose of this test
                    end
                    Der Tipp von udo1toni hat geholfen.
                    Zitat von udo1toni Beitrag anzeigen
                    Es wäre also besser, auf die Variable zuzugreifen
                    Danke und Gruß
                    Florian
                    Zuletzt geändert von Demion; Gestern, 22:56.

                    Kommentar


                      #11
                      hmmm.
                      jetzt bekomme ich die Auswertung nicht hin.
                      Code:
                      rule"Buderus Therme - Liegt Heute im Zeitraum der Abwesenheit?"
                      when
                      Timecron"*/30 * * * * ?"or
                      ItemBuderus_hm1_Start_DT changed or
                      ItemBuderus_hm2_Start_DT changed or
                      ItemBuderus_hm3_Start_DT changed or
                      ItemBuderus_hm4_Start_DT changed or
                      ItemBuderus_hm5_Start_DT changed
                      then
                      if (new Interval(newDateTime(Buderus_hm1_Start_DT),newDateTime(Buderus_hm1_Stop_DT)).contains(now))
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                                      sendCommand(Buderus_hm1_Urlaub_aktiv,ON)
                                  }
                      elseif (new Interval(newDateTime(Buderus_hm2_Start_DT),newDateTime(Buderus_hm2_Stop_DT)).contains(now))
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                                      sendCommand(Buderus_hm2_Urlaub_aktiv,ON)
                                  }
                      elseif (new Interval(newDateTime(Buderus_hm3_Start_DT),newDateTime(Buderus_hm3_Stop_DT)).contains(now))
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                                      sendCommand(Buderus_hm3_Urlaub_aktiv,ON)
                                  }
                      elseif (new Interval(newDateTime(Buderus_hm4_Start_DT),newDateTime(Buderus_hm4_Stop_DT)).contains(now))
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                                      sendCommand(Buderus_hm4_Urlaub_aktiv,ON)
                                  }
                      elseif (new Interval(newDateTime(Buderus_hm5_Start_DT),newDateTime(Buderus_hm5_Stop_DT)).contains(now))
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,2.0)
                                      sendCommand(Buderus_hm5_Urlaub_aktiv,ON)
                                  }
                      else
                                  {
                                      sendCommand(Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige,4.0)
                                      sendCommand(Buderus_hm1_Urlaub_aktiv,OFF)
                                      sendCommand(Buderus_hm2_Urlaub_aktiv,OFF)
                                      sendCommand(Buderus_hm3_Urlaub_aktiv,OFF)
                                      sendCommand(Buderus_hm4_Urlaub_aktiv,OFF)
                                      sendCommand(Buderus_hm5_Urlaub_aktiv,OFF)
                                  }
                      end
                      Jetzt müsste Heizung_Schmiede_Arbeit_Urlaub_Verreist_Anzeige doch auf 4.0 und Buderus_hm1_Urlaub_aktiv (bis hm5) auf OFF gesetzt werden da kein Zeitraum aktiv ist.

                      Im LOG steht
                      Error during the execution of rule 'Buderus Therme - Liegt Heute im Zeitraum der Abwesenheit?': No instant converter found for type: org.eclipse.smarthome.core.library.items.DateTimeI tem
                      Ein
                      Code:
                      import org.joda.time.Interval
                      hat nicht geholfen.

                      Kommentar

                      Lädt...
                      X