Ankündigung

Einklappen
Keine Ankündigung bisher.

Umrechnung m/s nach km/h mit Javascript Transformation

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

    Umrechnung m/s nach km/h mit Javascript Transformation

    Hallo zusammen,

    ich versuche gerade die Daten meiner Wetterstation von m/s in km/h umzurechnen und natürlich auch in der Sitemap anzuzeigen. Allerding habe ich jetzt schon einige Abende hiermit verbracht und es will einfach nicht funktionieren. Ich bin der Meinung, dass meine Funktion nicht aufgerufen wird - verstehe aber auch nicht warum. Was ich bisher getan habe....
    1. Javascript Transformation installiert
    2. Im Ordner "transform" eine Datei mit dem Namen "ms_to_kmh.js" angelegt
    3. Die Datei enthält folgenden Code
    (function(i) {
    var windBerechnet = i * 3.6;
    return windBerechnet;
    })(input)
    4. Und schließlich im Item in der stateDescription unter Pattern folgendes eingefügt:
    [profile=transform:JS, function=ms_to_kmh.js]
    sowie testweise
    [JS(ms_to_kmh.js):%.1f km/h]
    Im Log-Viewer bekomme ich immer noch die Werte in m/s angezeigt und die Sitemap zeigt gar nichts an.
    Hat von euch jemand eine Idee woran es liegen könnte?

    #2
    Warum zitierst Du den Code, statt ihn als Code zu markieren? (die # innerhalb des erweiteren Editors)

    Im Pattern trägst Du die Transformation so ein:
    Code:
    JS(ms_to_kmh.js):%s km/h
    Wichtig ist hier: Du übergibst den Wert als String, nicht als Float Value.

    Allerdings möchte ist zuerst noch mal auf die Bremse treten und fragen, wie der Wert EXAKT angezeigt wird. Insbesondere: wie sieht ein Update/Change im events.log aus? Kann es sein, dass der Wert mit Einheit ausgegeben wird? also so:
    Code:
    2022-02-24 20:21:59.200 [vent.ItemStateChangedEvent] - windSpeed changed from 2.3 m/s to 2.8 m/s
    Dann handelt es sich nämlich um ein UoM Item. UoM steht für Units of Measurement. Und das bedeutet dann, dass Du das JavaScript Script völlig umsonst erstellt hast, denn dann reicht Folgendes als Pattern:
    Code:
    %.1f km/h
    openHAB bekommt dann den Wert explizit mit der Einheit übergeben und rechnet in die gewünschte Einheit um. Siehe auch hier: https://www.openhab.org/docs/concept...plementing-uom

    Kommentar


      #3
      Hallo,

      schon einmal vielen dank für deine Hilfe.

      Zitat von udo1toni Beitrag anzeigen
      Warum zitierst Du den Code, statt ihn als Code zu markieren? (die # innerhalb des erweiteren Editors)
      Sorry, habe mich bei dem Button vertippt - ist mir auch noch nie vorgekommen.

      Zitat von udo1toni Beitrag anzeigen
      Insbesondere: wie sieht ein Update/Change im events.log aus?
      Habe den Typ des Items jetzt auf Number:Speed geändert und unter Pattern

      Code:
      %.1f km/h
      eingefügt. Als Einheit erhalte ich jetzt zwar km/h aber der Wert stimmt nicht (habe es mit meinem KNX-Gruppenmonitor geprüft)

      Code:
      Item 'Wetter_Wind_Ist' changed from 0 km/h to 0.5 km/h
      Hier müsst ich eigentlich 1,8 km/h angezeigt bekommen.
      Aber irgendwo muss doch auch die Umrechnung (x 3,6) eingetragen werden. Sorry, vielleicht stehe ich gerade auch etwas auf dem Schlauch.

      Kommentar


        #4
        Nein. Du kannst nicht einfach das Item als UoM Item definieren das Binding muss diese Funktion unterstützen, deshalb auch die Frage, ob der Wert im log in m/s angezeigt wird.

        Wenn das Addon UoM unterstützt, kümmert sich openHAB um die Umrechnung. Du kannst z.B. vom OpenWeatherMap Binding die Temperatur in °F anliefern lassen und dennoch wird die Temperatur korrekt in °C angezeigt, ganz ohne Dein Zutun, weil openHAB als Standard Maßeinheiten die SI-Größen (aka metrisch) eingestellt hat. das Binding liefert den Wert in °F an und übergibt diese Information auch (das ist hier natürlich nur dann der Fall, wenn Du das Binding so konfigurierst... OpenWeatherMap kann selbstverständlich auch metrisch arbeiten). Es schreibt also z.B. 32 °F in den Temperatur-Channel. Das verknüpfte Item zeigt dann 0 °C an.

        Wenn der Channel hingegen keine Einheit mit liefert, kann openHAB nicht ermitteln, wie (und ob) es umrechnen muss.

        Kommentar


          #5
          Zitat von udo1toni Beitrag anzeigen
          das Binding muss diese Funktion unterstützen
          Dann habe ich jetzt festgestellt, dass das KNX-Binding die Funktion nicht unterstützt.

          Habe es jetzt gelöst.

          Funktionsaufruf:
          Code:
          JS(ms_to_kmh.js):%s
          JS-Code
          Code:
          (function(i) {
          kmh=(i*3.6).toFixed(1);
          return kmh.toString() +" km/h";
          })(input)
          Vielen Dank für deine Hilfe

          Kommentar


            #6
            Hallo zusammen. Ich würde das gerne auch so umsetzen. Aber ich bekomme die Item-Definition nicht richtig hin. Wo genau muss ich da den Code hier eintragen?
            Code:
            JS(ms_to_kmh.js):%s​
            Könntest Du vielleicht mal Deine komplette Item-Definition posten? Danke!

            Kommentar


              #7
              Welche openHAB Version?
              Welche Art Item (also wie bekommt das Item seine Daten)?
              Geht es um die Anzeige des Wertes oder willst Du, dass der Wert dann auch als umgerechneter Wert zur Verfügung steht?

              Kommentar


                #8
                Zitat von enrico80 Beitrag anzeigen
                Könntest Du vielleicht mal Deine komplette Item-Definition posten? Danke!
                Kein Problem...
                (function(i) {
                kmh=(i*3.6).toFixed(1);
                return kmh.toString() +" km/h";
                })(input)​
                Die Datei heißt bei mir "ms_to_kmh.js"
                Zwischenablage01.jpg

                Kommentar


                  #9
                  Danke, das hat geholfen. Ich habe das jetzt rein textuell definiert, und auch als Number. Das hat den Vorteil, dass ich auch direkt eine Wert-Historie bekomme.

                  Code:
                  Number Windgeschwindigkeit "Windgeschwindigkeit [%1.f km/h]" { channel="knx:device:bridge:sensors:Windgeschwindigkeit"[profile="transform:JS", function="ms_to_kmhval.js"] }


                  JavaScript code in ms_to_kmhval.js:
                  Code:
                  (function(i) {
                   return (i*3.6).toFixed(1);
                  })(input)
                  ​
                  Das einzige, das noch nicht funktioniert ist, dass die Einheit "km/h" mit angezeigt wird. Warum nicht, verstehe ich nicht...

                  image.png

                  Kommentar


                    #10
                    Die Definition der Einheit über das Label funktioniert ausschließlich für die Sitemap. Willst Du das Ganze auch in der UI sehen, musst Du zwingend über die Metadaten gehen. Ohne Gewähr:
                    Code:
                    Number Windgeschwindigkeit "Windgeschwindigkeit" { channel="knx:device:bridge:sensors:Windgeschwindigkeit"[profile="transform:JS", function="ms_to_kmhval.js"], stateDescription=""[ pattern="%1.f km/h" ] }

                    Kommentar

                    Lädt...
                    X