@sigi234 Danke, hat geklappt
NEWS
Latest posts made by iob69
-
RE: [gelöst] Typkonvertierung in Typescript
@ticaki
Ah, ok, da ist also offenbar eine iobJS-Library dahinter. Gibt es dazu eine Dok? -
RE: [gelöst] Typkonvertierung in Typescript
@tt-tom
Stimmt. Ich weiss nicht, was ich da gemacht hab, damit es nicht funktioniert hat. Hab dann vergebens nach anderen Lösungen gesucht.
Es funktioniert sogar die intellisense! -
[gelöst] Typkonvertierung in Typescript
Hallo,
als Programmierer in anderen typisierten Sprachen bevorzuge ich typescript weil es einfach weniger Fehleranfällig ist.
Dazu folgende Fragen an (Typescript)-Spezialisten:
Ich hab mehrere Datenpunkte auf die ich triggern will. In der Funktion will ich nun herausfinden, welcher Datenpunkt getriggert wurde, und was dieser z.B. vorher für einen State hatte.
Achtung! Dies ist ein fiktives Beispiel um zu verstehen, wie das mit den Objekten respektive Klassen funktioniert.
Ich könnte natürlich auf jeden Datenpunkt einzeln triggern, aber es geht darum zu verstehen, ob ich auf Daten des Objektes das ich da bekomme - wenn ich weiss was es für eine Struktur hat - zugreifen kann.
Das Beispiel:const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber']; on(MyDPs, async (data) => { console.log(data); });
liefert mir folgenden output:
script.js.Eigene_Scripte.Test.DPTest: EventObj { id: '0_userdata.0.testNumber', newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' } }
Ich sehe also die Struktur. Nur kann ich in typescript nicht einfach auf data.oldstate.val zugreifen, da für typescript der Datentyp nicht klar ist. Ich hab also versucht das Objekt nachzubilden:
type EventObj = { id: '0_userdata.0.testNumber', newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' } } //console.log(getState('0_userdata.0.testNumber')); const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber']; on(MyDPs, async (data) => { console.log(data); console.log((data as EventObj).newState.val); });
Was mir folgenden Compilerfehler gibt:
script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as EventObj).newState.val); ^ ERROR: Conversion of type 'ChangedStateObject<any, any>' to type 'EventObj' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Types of property 'newState' are incompatible. Property 'user' is missing in type 'State<any>' but required in type '{ val: number; ts: number; ack: false; lc: number; from: string; q: number; c: undefined; user: string; }'.
Offenbar kennt er die Klasse ChangedStateObject<any, any>
Also hab ich auf diesen Typen gecastet:console.log((data as ChangedStateObject<any, any>).newState.val);
Und jetzt kennt er ihn plötzlich nicht mehr?
script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as ChangedStateObject<any, any>).newState.val); ^ ERROR: Cannot find name 'ChangedStateObject'.
Hab's auch mit Klassen versucht:
class State { val: number; ts: number; ack: false; lc: number; from: string; q: number; c: undefined; user: string; } class EventObj { id: string; newState: State; oldState: State; state: State; } //console.log(getState('0_userdata.0.testNumber')); const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber']; on(MyDPs, async (data) => { console.log(data); console.log((data as EventObj).newState.val); });
gleiche Fehlermeldungen, obwohl "user" in "State" existiert.
Wie kann ich auf die einzelnen Inhalte von "data" zugreifen?
-
RE: [gelöst] nodejs update windows
@sigi234
Danke. Ist diese Version aktuell? Ist ja schon zwei Jahre alt. Sorry, ich frag nur so dumm :-). Solange sie stable ist und die neue 20 nodejs installiert ist es ja ok.
Soll, muss ich den fixer anwählen?
Einfach "drüber" installieren? -
[gelöst] nodejs update windows
Hallo,
ich bin relativ neu hier. Leider hab ich zum Thema nichts gefunden, was mir weiterhilft, relativ, was ich verstehe.
Möchte in iob nodejs updaten (Windows), da ich den Alias-Manager updaten will der Nodejs 20 braucht. Kann mir jemand etwas detailliert helfen das zu tun? Ich hab da ein bisschen schiss. Gibt es da kein Update-Verfahren das man im iobroker (Gui) anstossen kann? -
RE: [Gelöst] Javascript in vis mit button triggern
@oliverio
@BananaJoe
Ok, jetzt klappt es auch mit meinem Button, vielen DankMusste noch eine Abfrage einbauen, damit die funktion auch nur auf die set-Action reagiert und nicht zweimal:
on(DPTestPunkt, async (data) => { if (getState(DPTestPunkt).val) { console.log('button pressed'); setTimeout(function() { setState(DPTestPunkt , false); }, 400); } });
-
RE: [Gelöst] Javascript in vis mit button triggern
@oliverio
@BananaJoe
Ja ich versuch das mal mit dem zurückschreiben. Muss da nur noch mal sehen, wie das mit der Zeitverzögerung geht. -
RE: [Gelöst] Javascript in vis mit button triggern
@oliverio
Also ich hab in vis (nicht vis2) einen Button JQui Button State reingepackt und unter allgemein folgendes eingetragen:
Object ID: den Datenpunkt auf den ich triggern will
Wert: '1' Irgendwas muss man ja schreiben, wenn man den Datenpunkt verändern will?
Dann hab ich in Javascript (nicht in vis) auf diesen Datenpunkt getriggert eben wie folgt:
on(DP, async (data) => { console.log('button pressed'); });
Eigentlich funktioniert es ja auch aber nur einmal, (ich nehme an, weil sich der Wert 1 nicht mehr ändert, kriege ich kein event mehr). Ändere ich den Datenpunk von Hand (in den Objekten) auf 0 wird wieder getriggert, (und nochmal beim click auf den Button auf 1) danach ist wieder schluss. Deshalb die Frage, ob man auch eben auf "Zuletzt geändert" oder "Zeitstempel"
triggern kann. In den Objekten kann man diese Werte doch abfragen und soviel ich weiss, wenn man einen wert eines DP abfragen will muss man das mit getState(DP).val; tun. gibt es auch einen getState(DP).changed ?Aber vielleicht muss ich beim Button was anderes oder woanders was noch eintragen? Oder ich hab den falschen button?
Betreffend Javascript in vis und im Adapter:
Bin relativ neu hier und ich hab auch schon in der vis zu scripten versucht, aber ich glaube, dort ist alles global, also auch unter den verschiedenen views. Da gibt es wohl wie keine Kapselung? Aber als Programmierer in anderen Sprachen fühl ich mich im Adapter wohler, obwohl da für mich auch nicht ganz klar ist, ob und wie da Kapselung existiert. Manchmal krieg ich eine Meldung (rot unterstrichen), dass eine Variable schon existiert, aber teilweise selbst dann, wenn ich die in keinem anderen Script verwende. Da bin ich sehr unsicher.Jedenfalls war mir der Unterschied nicht klar, dass im Adapter die sache auf dem Server und in der vis auf dem client/browser ausgeführt wird. Ist ja eigentlich logisch. Und ich nehme an, die Schnittstelle sind dann eben die Datenpunkte... Jedenfalls wieder was gelernt.
-
RE: [Gelöst] Javascript in vis mit button triggern
@martinp
Hallo,
natürlich hab ich als DP den Datenpunkt hinterlegt. Das ist eine konstante:
const DPTestPunkt = '0_userdata.0.DPTestPunkt';const DPTestPunkt = '0_userdata.0.DPTestPunkt';
Es funktioniert ja auch, aber nur beim ersten mal, wenn der Datenpunkt geändert wird.
Was für ein Knopf-Widget hast du denn verwendet und wo has du den Datenpunkt eingetragen?