Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - String Format Frage

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

    - √ - String Format Frage

    Hallo zusammen,

    ich bekomme manchmal seltsame Werte (viele Nachkommastellen) in OpenHab bezüglich Temperaturen angezeigt (siehe Bild Anhang)

    Ich bekomme via KNX die IST und Soll Temperatur und via einer Regel kombiniere beide Temperaturen in ein String um auf der UI etwas Platz zu sparen....

    Nun dachte ich. Ist ja kein Problem, formatierst du das halt mit 2 Nachkommastellen aber ich bekomme die Syntax nicht hin :-(

    Fehlermeldung im OpenHAB Log:
    Code:
    Error during the execution of rule 'UG_Hobbyraum_temperaturen': f != java.lang.String
    Anbei die Items und der Rule extract von einem Raum

    Item:
    Code:
    Number Temperatur_UG_Hobbyraum_IST 					"UG Hobbyraum IST [%.1f °C]" 				<temperature> 	(Temperaturen) { knx="<1/2/0" }
    Number Temperatur_UG_Hobbyraum_Soll 				"UG Hobbyraum Soll [%.1f °C]"				<temperature> 	(Temperaturen) { knx="<1/1/0" }
    String Temperatur_UG_Hobbyraum_komplett				"UG Hobbyraum [%s]"							<temperature> 	(Temperaturen, UG_Hobbyraum)	//Calculated via temperaturen.rule
    Rule:
    Code:
    rule UG_Hobbyraum_temperaturen
    	when
      		Item Temperatur_UG_Hobbyraum_IST received update or
      		Item Temperatur_UG_Hobbyraum_Soll received update
      	then
    		Temperatur_UG_Hobbyraum_komplett.postUpdate("Ist: " + String::format("%.2f", Temperatur_UG_Hobbyraum_IST.state.toString) + " °C , Soll: " + String::format("%.2f", Temperatur_UG_Hobbyraum_Soll.state.toString) + " °C")
        end
    Hat jemand ne Idee wie die korrekte Syntax ist ? Im Wiki wird bei den rules auf Formatter (Java Platform SE 6) verwiesen, aber diese "Dokumentation" ist doch sehr kryptisch :-)....

    Vielen lieben Dank
    bkumio
    Angehängte Dateien

    #2
    Guten Morgen,

    ich klinke mich mal hier ein. Auch ich tue mich mit den Formaten sehr schwer.
    Eine kleine Übersicht der gängigen Formatierungen wäre sehr hilfreich.

    Gruß

    Olaf

    Kommentar


      #3
      Versuche mal
      Temperatur_UG_Hobbyraum_IST.state.toString durch

      ""+Temperatur_UG_Hobbyraum_IST.state

      zu ersetzen.
      Ich glaube das geht, warum ist mir auch schleierhaft.

      Kommentar


        #4
        Ich habe jetzt das hier gefunden und komm damit erstmal ganz gut klar.http://public.beuth-hochschule.de/~g...pletHilfe.html

        Kommentar


          #5
          Ja denkste,

          in der Therorie ja (im Büro), zu Hause dann in der Item-Datei mal versucht eine linksbündige Anzeige hinzubekommen.
          Leider erfolglos.

          Kommentar


            #6
            Zitat von bkumio Beitrag anzeigen
            Nun dachte ich. Ist ja kein Problem, formatierst du das halt mit 2 Nachkommastellen aber ich bekomme die Syntax nicht hin :-(

            Code:
            rule UG_Hobbyraum_temperaturen
                when
                      Item Temperatur_UG_Hobbyraum_IST received update or
                      Item Temperatur_UG_Hobbyraum_Soll received update
                  then
                    Temperatur_UG_Hobbyraum_komplett.postUpdate("Ist: " + String::format("%.2f", Temperatur_UG_Hobbyraum_IST.state.toString) + " °C , Soll: " + String::format("%.2f", Temperatur_UG_Hobbyraum_Soll.state.toString) + " °C")
                end
            Du willst ja mit dem format-Befehl eine Zahl(!) in einen String wandeln. Dann solltest Du der Funktion format keinen String übergeben, was Du aber mit .toString gemacht hast.

            Kommentar


              #7
              Hallo udo1toni
              das macht noch Sinn. Also wenn ich aber in der Rule das .toString weglasse bekomme ich jetzt aber anstatt von einem "f != java.lang.String" Error leider einen DecimalType Error :-(
              Neuer Code in der Rule:
              Code:
                Temperatur_UG_Hobbyraum_komplett.postUpdate("Ist: " + String::format("%.2f", Temperatur_UG_Hobbyraum_IST.state) + " °C , Soll: " + String::format("%.2f", Temperatur_UG_Hobbyraum_Soll.state) + " °C")
              Neue Fehlermeldung siehe hier :
              Code:
              2015-01-08 20:33:38.160 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'UG_Hobbyraum_temperaturen': f != org.openhab.core.library.types.DecimalType
              Seltsam, den in der Items Datei:
              Code:
              Number Temperatur_UG_Hobbyraum_IST      "UG Hobbyraum IST [%.1f °C]"     <temperature>  (Temperaturen) { knx="<1/2/0" }
              funktioniert ja die Formatierung von [%.1f °C] des Number Items....ja….

              noch ne Idee ?
              Gruss
              Bkumio

              Kommentar


                #8
                versuch mal
                ("%.2f", Temperatur_UG_Hobbyraum_IST.state as DecimalType) (und natürlich beim zweiten item ebenfalls)

                Kommentar


                  #9
                  dann kommt.....

                  Code:
                  2015-01-09 08:59:38.147 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'UG_Hobbyraum_temperaturen': Cannot cast org.openhab.core.library.types.DecimalType to void
                  :-(

                  Kommentar


                    #10
                    Arrgh...

                    jetzt fällt mir erstmal nix mehr ein :-( aber ich werde mal heute abend zuhause versuchen, ob ich dahinter komme.

                    Kommentar


                      #11
                      Hallo,

                      Sorry, ich hatte Dich auf eine falsche Lösung gesetzt.
                      Versuch mal

                      String::format("%.2f ", (Temperatur_UG_Hobbyraum_IST.state as DecimalType).floatValue())

                      Theorie dabei:
                      "format" ist eine Java Methode, die nur mit Java Typen umgehen kann.
                      "state" ist eine Openhab Typ, der erst in einen Number Typ gewandelt werden muss. Number ist aber kein Standard Java Typ.
                      Für Number gibt es dann eine Methode "floatValue" der einen äquivalenten Java Typ macht.

                      Warum das alles nur mit"hinten durch die Brust ins Auge" geht, weiß ich nicht.

                      Ich hoffe es geht jetzt.

                      Kommentar


                        #12
                        Hallo zusammen,

                        Der Vorschlag
                        Code:
                        String::format("%.2f ", (Temperatur_UG_Hobbyraum_IST.state as DecimalType).floatValue())
                        von Klayer hat tatsächlich funktioniert!!! *freu*

                        ABER: erst als ich noch in dem Rules file oben noch ein
                        Code:
                        import org.openhab.core.library.types.*
                        eingefügt habe. Bin drauf gekommen als ich mit der SuFU nach "floatValue" den Post 24513 : https://knx-user-forum.de/openhab/24...schreiben.html von Thomas in reply nummer #5 und #6 gefunden hatte…..

                        Offenbar kann erst mit dem Include richtig mit den Float und Decimal Values umgegangen werden ? Wäre vieleicht was fürs Wiki , was meint ihr ?

                        Danke für eure Hilfe.

                        Bkumio

                        Kommentar


                          #13
                          Hallo,

                          also, ich hab das mal ins Wiki unter den Rules examples eingetragen. Falls ihr der Meinung seit "zu banal" auch gerne wieder löschen. Ich, als OpenHab Anfänger dachte mir aber dass das ivielleicht für den einen oder anderern doch hilfreich sein könnte.

                          https://github.com/openhab/openhab/w...string-options

                          Grüsse
                          Bkumio

                          Kommentar


                            #14
                            Perfekt, danke

                            Kommentar


                              #15
                              Hi,

                              sollte da nicht noch ein:

                              if (Item1.state != Uninitialized && Item2.state != Uninitialized) {
                              //postUpdate...
                              }

                              drum herum? Sonst gibt es sicherlich eine Exception, sollten die Items noch nicht initialisiert sein.

                              Ansonsten: prima Sache.
                              Gerade als openhab Neuling fehlt mir an ein paar Stellen noch die BestPractice, gerade zu den Typkonvertierungen. String -> DateType, String -> Number usw. Mit den Openhab Typen rechnen...
                              Das suche ich mir immer aus vielen Beispielen aus dem Forum zusammen, welche allerdings manchmal nicht einfach zu finden sind und manchmal doch nicht die beste Lösung darstellen.

                              Zum Thema Typen und Konvertierung würde sich eine eigene Seite im Wiki anbieten.

                              Gruß
                              Dennis

                              Kommentar

                              Lädt...
                              X