Aktienkurse

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
udo1toni
Beiträge: 13987
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Aktienkurse

Beitrag von udo1toni »

Ups... Ich ergänze oben...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

TomW80
Beiträge: 69
Registriert: 7. Mai 2021 19:11
Answers: 0

Re: Aktienkurse

Beitrag von TomW80 »

Ich hab leider noch nicht auf openhab 4 geupdatet, daher kann ich es so noch nicht testen.

Benutzeravatar
udo1toni
Beiträge: 13987
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Aktienkurse

Beitrag 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...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

TomW80
Beiträge: 69
Registriert: 7. Mai 2021 19:11
Answers: 0

Re: Aktienkurse

Beitrag 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

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Aktienkurse

Beitrag 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)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

TomW80
Beiträge: 69
Registriert: 7. Mai 2021 19:11
Answers: 0

Re: Aktienkurse

Beitrag 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

TomW80
Beiträge: 69
Registriert: 7. Mai 2021 19:11
Answers: 0

Re: Aktienkurse

Beitrag 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.

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Aktienkurse

Beitrag 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"
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

TomW80
Beiträge: 69
Registriert: 7. Mai 2021 19:11
Answers: 0

Re: Aktienkurse

Beitrag 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...

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Aktienkurse

Beitrag 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 ? :?: ;)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Antworten