Ankündigung

Einklappen
Keine Ankündigung bisher.

OH3 - Zahlenformat

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

    OH3 - Zahlenformat

    Hallo zusammen,

    ich steh komplett am Schlauch mit den Zahlenformaten in openhab.
    Was hab ich? - Was will ich?

    Ich bekomm von einem script einen String retour (zB. 5 (immer Ganzzahlen)
    rule:
    Code:
    rule "Zahl"
        when
            Time cron "0 0 7 ? * MON,WED,SUN *"
        then
            var String count = executeCommandLine(Duration.ofSeconds(5),"/usr/bin/python3", "/etc/openhab/scripts/scrapping.py")
              
            EG_Wohnzimmer_Zahl.postUpdate(Float::parseFloat(String::format(count)))      
        
            logInfo("Zahl", "Zahl {}" + EG_Wohnzimmer_Zahl.state)
          
    end
    ​
    Diesen output will ich ein item schreiben (Number)
    item:
    Code:
    Number EG_Wohnzimmer_Zahl "Zahl" (gEG)
    Leider bekomm ich immer wieder "nur" 5,0 zurück > Ich benötige jedoch eine Ganzzahl (ohne Nachkommastellen)

    ich häng einfach in der rule > hab schon alles möglich probiert (parseInt, parseDouble, parseFloat, ...)
    und [%f.0] und der gleichen

    Irgendwie hab ich das nen Hund drinnen > bin happy über jeden hint

    Danke im Voraus
    Zuletzt geändert von wu3mi; 17.11.2023, 07:14.

    #2
    Verwende einfach die richtige Funktion
    Code:
    rule "Zahl"
    when
        Time cron "0 0 7 ? * MON,WED,SUN" // Das Jahr ist optional, der letzte Stern ist unnötig
    then
        var String count = executeCommandLine(Duration.ofSeconds(5),"/usr/bin/python3", "/etc/openhab/scripts/scrapping.py")
        EG_Wohnzimmer_Zahl.postUpdate(Integer::parseInt(count))      
        logInfo("Zahl", "Zahl {}", EG_Wohnzimmer_Zahl.state)
    end
    Beachte auch, dass {} innerhalb des zweiten log-Strings automatisch mit nachfolgenden Objekten substituiert wird. Es muss also ein Komma da stehen, kein Plus.

    Kommentar


      #3
      udo1toni Danke für deine Antwort.

      Wie bereits eingangs geschrieben, parseInt und der gleichen habe ich ebenfalls getestet.
      Leider ohne Erfolg. Deswegen auch der Eintrag hier im Forum.

      Kommentar


        #4
        Ah... ich schaue gerade oben und da fällt mit ein Komma ins Auge... Wenn Du das Script unter Kontrolle hast, sorge dafür, dass die Zahl mit Punkt als Dezimaltrenner ausgegeben wird, also 5.0 statt 5,0. Ansonsten müsstest Du den Input über ein REGEX laufen lassen, z.B. so:
        Code:
        rule "Zahl"
        when
            Time cron "0 0 7 ? * MON,WED,SUN" // Das Jahr ist optional, der letzte Stern ist unnötig
        then
            var String count = executeCommandLine(Duration.ofSeconds(5),"/usr/bin/python3", "/etc/openhab/scripts/scrapping.py")
            logInfo("Zahl", "gelieferter String {}", count)
            count = transform("REGEX","(\d*),?.*",count)
            logInfo("Zahl", "nach dem REGEX {} - nach Integer geparst {}", count,Integer.parseInt(count))
            EG_Wohnzimmer_Zahl.postUpdate(Integer.parseInt(count))
            logInfo("Zahl", "Zahl {}", EG_Wohnzimmer_Zahl.state)
        end
        Mitsamt log Befehlen, um mal zu sehen, was denn da tatsächlich passiert.
        Das Regex Transformation Addon muss installiert sein.
        Der letzte log-Befehl (nach dem postUpdate) liefert eventuell einen veralteten Wert (openHAB arbeitet asynchron und ist nicht echtzeitfähig).

        Kommentar


          #5
          Hallo udo1toni,

          Danke für die Ergänzung.
          Ich hab das script "unter Kontrolle" und gebe auch nur Ganzzahlen aus (zB 11) ohne Punkt und Komma.
          Deine rule mit REGEX hat leider nicht geklappt (auch mit Anpassungen und tw Auskommentieren)

          Was jedoch der log der "Rohdaten " ausgibt, ist ganz klar ein String mit "11" (ohne Punkt und Komma)
          Ich kenn es auch mit Integer.parseInt(String) - deswegen finde ich das Verhalten grad etwas seltsam.

          Wollte es nun auch mit der item Konfig lösen ([%d]) doch leider auch ohne Erfolg.

          Danke trotzdem.

          Kommentar


            #6
            Wenn kein Punkt und kein Komma raus kommt, dann wird Integer.parseInt(string) Dir eine Integer Zahl liefern.
            Alternativ kannst Du auch
            Code:
            Integer::parseInt(string)
            schreiben, das läuft aufs gleiche raus.

            Kommentar


              #7
              Hallo,
              udo1toni - ich habs nun endlich geschafft.

              Ich habe nun bei beim umzuwandelnden string ein .trim eingesetzt > nun klappts.

              also:
              Code:
              Integer::parseInt(string.trim)

              Danke für deine Unterstützung

              Kommentar


                #8
                Gerne, wobei Du ja selbst auf die Lösung gekommen bist.
                Wenn .trim hier hilft, deutet das darauf hin, dass das Script nicht nur eine Zahl als String zurück liefert, sondern noch weitere (evtl. "unsichtbare") Zeichen, die parseInt nachhaltig stören

                Kommentar


                  #9
                  Dass das script mehr als nur einen string retour gibt dachte ich anfangs auch und hab es angepasst, dass wirklich "nur" ein int zurückkommt.
                  Aber hat so auch nicht geklappt.

                  Mit .trim klappts nun > manchmal einfach seltsam.

                  Kommentar

                  Lädt...
                  X