Aktienkurse
- udo1toni
- Beiträge: 14057
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Aktienkurse
Ups... Ich ergänze oben...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet
-
- Beiträge: 70
- Registriert: 7. Mai 2021 19:11
Re: Aktienkurse
Ich hab leider noch nicht auf openhab 4 geupdatet, daher kann ich es so noch nicht testen.
- udo1toni
- Beiträge: 14057
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Aktienkurse
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:
Und der Channel dazu:
Das hätte sogar schon mit openHAB1 funktioniert, allerdings gab es da noch keine Things und Channel...
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)
Code: Alles auswählen
Type number : high "High" [ stateTransformation="JS:comma2dot.js" ]
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet
-
- Beiträge: 70
- Registriert: 7. Mai 2021 19:11
Re: Aktienkurse
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
- peter-pan
- Beiträge: 2578
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Aktienkurse
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:
Deshalb hab ich das ganz noch etwas erweitert.
Meine Things-Datei sieht jetzt so aus.
.things
Die Fehlermeldung kann ich nicht so richtig interpretieren, aber hängt wohl mit json.high.replace zusammen. Hast du schon mal
probiert ? (ohne Gewähr)
Code: Alles auswählen
Aktien-String ist [3.48, 3.485, 3000, 3000, 0.0, 0, 0, ./., ./., ./., ./., 3.495]
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
Code: Alles auswählen
var retval = (json).replace(",",".").replace('./.','0');
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 70
- Registriert: 7. Mai 2021 19:11
Re: Aktienkurse
Funktioniert, dankepeter-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 malprobiert ? (ohne Gewähr)Code: Alles auswählen
var retval = (json).replace(",",".").replace('./.','0');
-
- Beiträge: 70
- Registriert: 7. Mai 2021 19:11
Re: Aktienkurse
Leider habe ich immer noch solche Ausreißer nach oben. Funktioniert da dann das replace nicht?
Muss mir morgen mal die Logdatei anschauen.
Muss mir morgen mal die Logdatei anschauen.
- peter-pan
- Beiträge: 2578
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Aktienkurse
...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)
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"]
}
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"}
Code: Alles auswählen
"JSONPATH:$.close∩JS:comma2dot.js"
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 70
- Registriert: 7. Mai 2021 19:11
Re: Aktienkurse
Ich teste und werde berichten...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:
- peter-pan
- Beiträge: 2578
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Aktienkurse
Ab und an bekomme ich auch noch eine Fehlermeldung, wenn ein Wert für "Thing-Channel" nicht vorhanden ist (JSON). Fehlermeldung:
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:
Hat jemand eine Idee ?
Code: Alles auswählen
Executing transformation ChannelStateTransformation{pattern='$.executions', serviceName='JSONPATH'} failed: Invalid path '$.executions' in
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"]
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian