Seite 4 von 4

Re: Aktienkurse

Verfasst: 1. Feb 2024 18:32
von Harka
Moin,
ich werfe mal diesen AllInOne-Lösungsvorschlag für die stateTransformation in den Raum

Code: Alles auswählen

JS:|var kurs =JSON.parse(input).executions;if(typeof kurs !== 'undefined'){parseFloat(kurs.toString().replace(",",".").replace('./.','0'))};
Bin seit ein paar Tagen am mit der JS-Transformationen rumexperimentieren :geek:

Re: Aktienkurse

Verfasst: 1. Feb 2024 18:58
von peter-pan
Harka hat geschrieben: 1. Feb 2024 18:32 Bin seit ein paar Tagen am mit der JS-Transformationen rumexperimentieren :geek:
Ich kenn mich mit JS nicht aus, aber was passiert, wenn der JSON-String gar nicht vorhanden/ausgegeben wird ? Muss ich das im Thing-Channel setzen oder was mach mit der Variablen var. Ich kann mir's gerade nicht erklären :oops: :?

Re: Aktienkurse

Verfasst: 1. Feb 2024 19:44
von Harka
im Prinzip (ich selbst arbeite mit der UI)

Code: Alles auswählen

Type number : executions "Executions"  [ stateTransformation="JS:|var kurs =JSON.parse(input).executions;if(typeof kurs !== 'undefined'){parseFloat(kurs.toString().replace(",",".").replace('./.','0'))};" ]
JS:|JSON.parse(input).executions entspricht JSONPATH:$.executions. In dem Inlinescript wird der zurückgegebene Wert in der Variable zwischengespeichert und mit typeof auf Existenz geprüft bevor die Weiterverarbeitung beginnt.
Ich kann Dir NICHT sagen ob ALLE Eventualitäten abgefangen werden, aber ein Schreibfehler in executions führt zu keinem Log-Fehler. In den Foren konnte ich bisher nur wenig Infos zu dieser Vorgehensweise finden. Möglicher weise ja sogar aus gutem Grund? Probiere es ruhig mal aus und mal schauen ob noch jemand was bzgl. für/wider beiträgt.

Re: Aktienkurse

Verfasst: 1. Feb 2024 19:48
von peter-pan
Harka hat geschrieben: 1. Feb 2024 19:44 Probiere es ruhig mal aus
Mach ich. Danke

Re: Aktienkurse

Verfasst: 8. Feb 2024 19:41
von TomW80
TomW80 hat geschrieben: 30. Jan 2024 17:56
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...
Aktuell hab ich keine Probleme mehr.
Danke!

Re: Aktienkurse

Verfasst: 8. Feb 2024 20:20
von peter-pan
TomW80 hat geschrieben: 8. Feb 2024 19:41 Aktuell hab ich keine Probleme mehr.
... eigentlich klappt das Ganze ja, aber ich "bastle" immer noch etwas an den "things".
Grund: Das Abfangen einer Fehlermeldung, wenn das JSON-Objekt ($.executions) nicht im JSON-String vorhanden ist.

Code: Alles auswählen

{
    "bid": 3.225,
    "ask": 3.275,
    "bidsize": 1000,
    "asksize": 1000,
    "delta": 0.0,
    "stueck": 0,
    "umsatz": 0,
    "avg": "./.",
    "last": "./.",
    "high": "./.",
    "low": "./.",
    "close": 3.245
}
Ich habe zwar das Modell von @Harka im Einsatz, aber ich bin immer noch am Testen, ob das evtl. auch noch anders geht.

Code: Alles auswählen

Type number : execution  "Executions"  [ stateTransformation="DSL:|Integer.parseInt(transform('JSONPATH','$.executions',input).replace(',','.').replace('./.','0').replace('+',''))" ]  // Test
 //  https://community.openhab.org/t/is-it-possible-to-combine-two-transformations/152550/6
Type number : executions "Executions"  [ stateTransformation="JS:|var kurs =JSON.parse(input).executions;if(typeof kurs !== 'undefined'){parseInt(kurs.toString().replace(',','.').replace('./.','0'))};" ]
Das erste Thing (DSL) ist an einen Thread aus dem Internationalen Forum (von Udo) angelehnt, das ich heute gefunden habe. Das zweite Thing (JS) ist von Harka.
Ich verstehe aber in beiden Beispielen, den Code noch nicht so ganz. :oops: :?:
Da die Fehlermeldungen nur sehr selten auftreten, dauert das natürlich (bei mir) bis ich mir wieder ein entsprechendes Testszenario "ausgedacht" habe (Halbwissen :lol: ).
Eigentlich mach ich ja gar nichts in dieser Richtung, aber irgendwie hat es mich gepackt, das "Problemchen" mittels einer DSL-Inline-Rule zu lösen.
Vielleicht bin aber auch auf dem Holzweg.

Bei der Version mit den "verketteten" Funktionen scheint es zu klappen.

Code: Alles auswählen

Type number : executions2 "Executions"  [ stateTransformation="JSONPATH:$.executions∩JS:comma2dot.js"]
Sollte ich (oder wer anders) etwas herausfinden, werde ich mich wieder melden.