Seite 3 von 4

Re: Aktienkurse

Verfasst: 16. Jan 2024 22:42
von udo1toni
Ups... Ich ergänze oben...

Re: Aktienkurse

Verfasst: 22. Jan 2024 23:10
von TomW80
Ich hab leider noch nicht auf openhab 4 geupdatet, daher kann ich es so noch nicht testen.

Re: Aktienkurse

Verfasst: 23. Jan 2024 03:30
von udo1toni
Du kannst das gleiche Verhalten auch schon mit openHAB2 erreichen :) nur gibt es bis einschließlich openHAB3.4.5 keine Möglichkeit, den auszuführenden Transformation Code inline anzugeben (und die Scriptsprache ist auf JavaScript beschränkt).

Datei /etc/openhab/transform/comma2dot.js:

Code: Alles auswählen

(function(price){
    var json = JSON.parse(price);
    var retval = (json.high).replace(",",".");
    return retval;
})(input)
Und der Channel dazu:

Code: Alles auswählen

Type number : high  "High" [ stateTransformation="JS:comma2dot.js" ]
Das hätte sogar schon mit openHAB1 funktioniert, allerdings gab es da noch keine Things und Channel...

Re: Aktienkurse

Verfasst: 23. Jan 2024 11:50
von TomW80
Funktioniert irgendwie nicht. JS Transformation ist installiert.
==> /var/log/openhab/openhab.log <==

2024-01-23 11:44:30.477 [WARN ] [.transform.SingleValueTransformation] - Executing transformation ChannelStateTransformation{pattern='comma2dot.js', serviceName='JS'} failed: An error occurred while executing script. TypeError: json.high.replace is not a function in <eval> at line number 3

Re: Aktienkurse

Verfasst: 23. Jan 2024 12:10
von peter-pan
Hab die Idee von Udo auch umgesetzt und noch eine weiter "replace"-Funktion mit eingebaut, da verschiedentlich auch mal dieser Wert "./." eingefügt wird. Das sieht dann so aus:

Code: Alles auswählen

Aktien-String ist [3.48, 3.485, 3000, 3000, 0.0, 0, 0, ./., ./., ./., ./., 3.495]
Deshalb hab ich das ganz noch etwas erweitert.
Meine Things-Datei sieht jetzt so aus.
.things

Code: Alles auswählen

// Aktienkurse

Thing http:url:DE0007164600 "SAP SE" [
    baseURL="https://www.tradegate.de/refresh.php?isin=DE0007164600",
    refresh=3600 ] {
    Channels:
        Type string : aktie      "Alle Werte"  [ stateTransformation="JSONPATH:$.*" ]   // ganzer String - unbearbeitet   
        Type string : aktie1     "Alle Werte"  [ stateTransformation="DSL:|transform(\"JSONPATH\",\"$.*\",input).replace('./.','0')" ]  // ganzer String - gehübscht
        Type number : bid        "Bid"         [ stateTransformation="DSL:|transform('JSONPATH','$.bid',input).replace(',','.').replace('./.','0')" ]
        Type number : ask        "Ask"         [ stateTransformation="DSL:|transform('JSONPATH','$.ask',input).replace(',','.').replace('./.','0')" ]
        Type number : bidsize    "Bid Size"    [ stateTransformation="DSL:|transform('JSONPATH','$.bidsize',input).replace(',','.').replace('./.','0')" ]
        Type number : asksize    "Ask Size"    [ stateTransformation="DSL:|transform('JSONPATH','$.asksize',input).replace(',','.').replace('./.','0')" ]
        Type number : delta      "Delta"       [ stateTransformation="DSL:|transform('JSONPATH','$.delta',input).replace(',','.').replace('./.','0')" ]
        Type number : stueck     "Stück"       [ stateTransformation="DSL:|transform('JSONPATH','$.stueck',input).replace(',','.').replace('./.','0')" ]
        Type number : umsatz     "Umsatz"      [ stateTransformation="DSL:|transform('JSONPATH','$.umsatz',input).replace(',','.').replace('./.','0')" ]
        Type number : avg        "AVG"         [ stateTransformation="DSL:|transform('JSONPATH','$.avg',input).replace(',','.').replace('./.','0')" ]
        Type number : executions "Executions"  [ stateTransformation="DSL:|transform('JSONPATH','$.executions',input).replace(',','.').replace('./.','0')" ]
        Type number : last       "Last"        [ stateTransformation="DSL:|transform('JSONPATH','$.last',input).replace(',','.').replace('./.','0')" ]
        Type number : high       "High"        [ stateTransformation="DSL:|transform('JSONPATH','$.high',input).replace(',','.').replace('./.','0')" ]  
        Type number : low        "Low"         [ stateTransformation="DSL:|transform('JSONPATH','$.low',input).replace(',','.').replace('./.','0')" ] 
        Type number : close      "Close"       [ stateTransformation="DSL:|transform('JSONPATH','$.close',input).replace(',','.').replace('./.','0')" ]
}

// "DSL:|transform(\"JSONPATH\",\"$.executions\",input).replace(\",\",\".\")" ]  // 1. Möglichkeit
// "DSL:|transform('JSONPATH','$.executions',input).replace(',','.')" ]          // 2. Möglichkeit
Die Fehlermeldung kann ich nicht so richtig interpretieren, aber hängt wohl mit json.high.replace zusammen. Hast du schon mal

Code: Alles auswählen

var retval = (json).replace(",",".").replace('./.','0');
probiert ? (ohne Gewähr)

Re: Aktienkurse

Verfasst: 25. Jan 2024 23:11
von TomW80
peter-pan hat geschrieben: 23. Jan 2024 12:10 Die Fehlermeldung kann ich nicht so richtig interpretieren, aber hängt wohl mit json.high.replace zusammen. Hast du schon mal

Code: Alles auswählen

var retval = (json).replace(",",".").replace('./.','0');
probiert ? (ohne Gewähr)
Funktioniert, danke

Re: Aktienkurse

Verfasst: 26. Jan 2024 18:48
von TomW80
Leider habe ich immer noch solche Ausreißer nach oben. Funktioniert da dann das replace nicht?
Muss mir morgen mal die Logdatei anschauen.

Re: Aktienkurse

Verfasst: 27. Jan 2024 00:11
von peter-pan
TomW80 hat geschrieben: 26. Jan 2024 18:48 Leider habe ich immer noch solche Ausreißer nach oben. Funktioniert da dann das replace nicht?
...das replace funktioniert normalerweise schon. Es kommt halt auf den Ausreisser an.

Ich habe die Idee von Udo nochmal aufgenommen und damit herum experimentiert.
comma2dot.js

Code: Alles auswählen

(function(i){
     var retval = parseFloat(i.replace(",",".").replace('./.','0')); 
    return retval;
})(input)
.things

Code: Alles auswählen

Thing http:url:kurs1 "Mercedes-Benz Group AG" [
    baseURL="https://www.tradegate.de/refresh.php?isin=DE0007100000",   // DE0007100000
    refresh=3600 ] {
    Channels:
        Type number : bid2        "Bid"         [ stateTransformation="JSONPATH:$.bid∩JS:comma2dot.js"]
        Type number : ask2        "Ask"         [ stateTransformation="JSONPATH:$.ask∩JS:comma2dot.js"]
        Type number : bidsize2    "Bid Size"    [ stateTransformation="JSONPATH:$.bidsize∩JS:comma2dot.js"]
        Type number : asksize2    "Ask Size"    [ stateTransformation="JSONPATH:$.asksize∩JS:comma2dot.js"]
        Type number : delta2      "Delta"       [ stateTransformation="JSONPATH:$.delta∩JS:comma2dot.js"]
        Type number : stueck2     "Stück"       [ stateTransformation="JSONPATH:$.stueck∩JS:comma2dot.js"]
        Type number : umsatz2     "Umsatz"      [ stateTransformation="JSONPATH:$.umsatz∩JS:comma2dot.js"]
        Type number : avg2        "AVG"         [ stateTransformation="JSONPATH:$.avg∩JS:comma2dot.js"]
        Type number : executions2 "Executions"  [ stateTransformation="JSONPATH:$.executions∩JS:comma2dot.js"]
        Type number : last2       "Last"        [ stateTransformation="JSONPATH:$.last∩JS:comma2dot.js"]
        Type number : high2       "High"        [ stateTransformation="JSONPATH:$.high∩JS:comma2dot.js"]
        Type number : low2        "Low"         [ stateTransformation="JSONPATH:$.low∩JS:comma2dot.js" ]
        Type number : close2      "Close"       [ stateTransformation="JSONPATH:$.close∩JS:comma2dot.js"]
}
.items

Code: Alles auswählen

Number   Kurs1_Bid                  "Angebot Preis"          {channel="http:url:kurs1:bid2"}
Number   Kurs1_Ask                  "Nachfrag Preis"         {channel="http:url:kurs1:ask2"}
Number   Kurs1_Bidsize              "Angebot Menge"          {channel="http:url:kurs1:bidsize2"}
Number   Kurs1_Asksize              "Nachfrage Menge"        {channel="http:url:kurs1:asksize2"}
Number   Kurs1_Delta                "Delta"                  {channel="http:url:kurs1:delta2"}
Number   Kurs1_Stueck               "Stück"                  {channel="http:url:kurs1:stueck2"}
Number   Kurs1_Umsatz               "Umsatz"                 {channel="http:url:kurs1:umsatz2"}
Number   Kurs1_Avg                  "Ø-Preis"                {channel="http:url:kurs1:avg2"}
Number   Kurs1_Executions           "Executions"             {channel="http:url:kurs1:executions2"}
Number   Kurs1_Last                 "Letzter Preis"          {channel="http:url:kurs1:last2"}
Number   Kurs1_High                 "Höchster Preis"         {channel="http:url:kurs1:high2"}
Number   Kurs1_Low                  "Niedrigster Preis"      {channel="http:url:kurs1:low2"}
Number   Kurs1_Close                "Schlusskurs"            {channel="http:url:kurs1:close2"}
Ich habe seither keine Probleme mehr. Vor allem habe ich die parseFloat Funktion wieder in das Script aufgenommen und die Channel-Beschreibung im Thing angepasst. Da habe JSONPATH und JS mit diesem Schnittmengensymbol ( ∩ ) aneinandergekettet:

Code: Alles auswählen

"JSONPATH:$.close∩JS:comma2dot.js"

Re: Aktienkurse

Verfasst: 30. Jan 2024 17:56
von TomW80
peter-pan hat geschrieben: 27. Jan 2024 00:11 ...das replace funktioniert normalerweise schon. Es kommt halt auf den Ausreisser an.

Ich habe die Idee von Udo nochmal aufgenommen und damit herum experimentiert.

...

Ich habe seither keine Probleme mehr. Vor allem habe ich die parseFloat Funktion wieder in das Script aufgenommen und die Channel-Beschreibung im Thing angepasst. Da habe JSONPATH und JS mit diesem Schnittmengensymbol ( ∩ ) aneinandergekettet:
Ich teste und werde berichten...

Re: Aktienkurse

Verfasst: 1. Feb 2024 11:31
von peter-pan
Ab und an bekomme ich auch noch eine Fehlermeldung, wenn ein Wert für "Thing-Channel" nicht vorhanden ist (JSON). Fehlermeldung:

Code: Alles auswählen

Executing transformation ChannelStateTransformation{pattern='$.executions', serviceName='JSONPATH'} failed: Invalid path '$.executions' in
Ich weiss zwar, dass für das Feld (path) $.executions kein Wert geliefert wurde, aber ich weiss nicht wie ich das abfangen kann. Ich benutze zwei Channel-Varianten:

Code: Alles auswählen

Type number : executions "Executions"  [ stateTransformation="DSL:|transform('JSONPATH','$.executions',input).replace(',','.').replace('./.','0').replace('+','')" ]
    und
Type number : executions2 "Executions" [ stateTransformation="JSONPATH:$.executions∩JS:comma2dot.js"]
Hat jemand eine Idee ? :?: ;)