NEWS
[Neuer Adapter] LinkedDevices
-
@Scrounger sagte:
Bitte laden dir den aktuellen branch, da ist des implementiert.
Mit dem habe ich getestet mit parent "read only".
Nach Änderung auf "r/w" sehe ich jetzt die Einschränkung, dass nur Faktoren erlaubt sind, womit der Reziprokwert natürlich funktioniert. Beim Test mit dem Faktor /1.8 erfolgt allerdings keine Umrechnung, sondern der Eingabewert wird in beide Richtungen geschrieben. -
@paul53
Es gibt zwei Parameter readConversion & conversion. Wenn du jetzt ein Read only object Manuel in ein Read & write änderst, wird der Parameter conversion angezogen. Deshlab wird keine Umrechnung durchgeführt, sieht man dann auch im debug log -
convertedValue = mathjs.format(convertedValue, { notation: 'fixed', precision: obj.common.custom[this.namespace].maxDecimal });
Es wird ein String in einen Datenpunkt vom Typ "number" geschrieben. Das sollte unterbleiben !
Verwende besser mathjs.round(x, n).Dieser Test:
if (obj.common.custom[this.namespace].maxDecimal && !isParentObj) {
schließt 0 Nachkommastellen aus.
-
@paul53
Stimmt .Format gibt nen String zurück, werden ich anpassen.@paul53 sagte in [Neuer Adapter] LinkedDevices:
Beim Test mit dem Faktor /1.8 erfolgt allerdings keine Umrechnung, sondern der Eingabewert wird in beide Richtungen geschrieben.
Geht das jetzt bei dir?
-
@Scrounger sagte:
Geht das jetzt bei dir?
Nein. Ich habe mal mit einem Datenpunkt getestet, der urprünglich "r/w" ist: Es erfolgt keine Umrechnung, aber die Zahl der Nachkommastellen und die Masseinheit werden berücksichtigt.
EDIT: Habe die Instanz auf "debug" umgestellt und nun funktioniert die Umrechnung in beide Richtungen. Es war wohl erst ein Neustart der Instanz erforderlich ! Nach Rückstellung auf "info" funktioniert es weiterhin.
-
@Scrounger sagte in [Neuer Adapter] LinkedDevices:
@BBTown sagte in [Neuer Adapter] LinkedDevices:
Wo wäre der Bezug zu dem tatsächlichen Objekt/Datenpunkt?
bzw. wo findet das "Mapping" zum Original-Datenpunkt statt?!Das macht der Adpater.
Das ParentObjekt (= das zu verlinkende Objekt) sieht dann so aus:
und das verlinkte Objekt sieht dann so aus:
'state' Änderungen werden vom Adapter überwacht und dann beiden Objekte zugewiesen. D.h. ändere ich den 'state' beim verlinkten Objekt, ändert sich der 'state' beim parentObjekt. Und natürlich umgekehrt.
Die Idee hört sich gut an und ist auf nachvollziehbar. Aber so ganz verstehe ich das "Mapping" noch nicht. Du sagst, dass der Adapter das Mapping selbst übernimmt, man eine eigene Datenstruktur aufbauen kann und beim tausch von Hardware nur die Objekte auf die neue Hardware anpassen muss.
Das wiederspricht sich mir irgendwie. Angenommen ich installiere den Adapter. Dieser sucht dann alle Datenpunkte raus und packt die in die linkeddevices Instanz. Dann hat der Adapter doch schon eine Datenstruktur vorgeben oder nicht? Muss ich dann bei jedem die RAW Daten anpassen um diese in der Datenstruktur zu verschieben?
Desweiteren verstehe ich nicht wie das beim tausch von Hardware aussieht. Wenn ich Schalter/Geräte/usw. austausche, woher weiß der Adapter dann welches Gerät ich ausgetauscht habe?
Irgendwo muss man das "Mapping" doch immer selbst bearbeiten oder? -
@el_malto
Ich versuche es Dir an einem Beispiel zu erklären.
Du hast z.B. einen Homematic Lichtschalter. Dieser ist dann in der instanz des hm-rpc adapters im iobroker verfügbar. Dort gibt es z.B. den Datenpunkt zum ein bzw. ausschalten mit der ID "hm-rpc-QEQ000001.1.STATE". Das wird dann unser sog. parentObject.
Jetzt erstellst du dir ein linkedObject z.b. mit der ID "Licht.Bad.STATE". Die ID des linkedObject verwendest du dann im vis und all deinen skripten.Wenn jetzt der Lichtschalter z.b: gegen einen neuen mit der ID "hm-rpc-QEQ000002.1.STATE" getauscht wird, dann musst du nur wieder für diesen ein linkedObject anlegen das die gleiche ID "Licht.Bad.STATE" hat. Danach funktionieren wieder alle deine VIS und skripte, da dort ja die ID des linkedObject verwendet wird.
-
@Scrounger So habe ich das auch verstanden.
Also muss man das "Mapping" selbst vornehmen. Du sagstest oben ja mal, dass das der Adapter selbst macht. Deswegen war ich ein bisschen verwundert.
Ich denke also das du mit "das macht der Adapter selbst" meinst, dass der Adapter selbst die RAW Daten von den Datenpunkt den man manuell auswählt übernimmt und somit die gleichen Funktionen wie der "eigentliche" Datenpunkt hat und nicht automatisch alle Datenpunkte die man in ioBroker hat "klont" oder?
War von der Beschreibung nur ein bisschen verwirrt weil @BBTown ja auch gefragt hat wo das "Mapping" statt findet, also so wie ich es gelesen habe, wo man das in den Adapter machen muss.Aber jetzt ist es klar und es ist so wie ich es mir auch schon gedacht habe.
Die Idee ist wirklich gut und interessant. -
@el_malto sagte:
dass der Adapter selbst die RAW Daten von den Datenpunkt den man manuell auswählt übernimmt und somit die gleichen Funktionen wie der "eigentliche" Datenpunkt hat und nicht automatisch alle Datenpunkte die man in ioBroker hat "klont" oder?
Der Adapter übernimmt die Eigenschaften unter common außer den Namen. Die Zuweisung eines linked Datenpunktes erfolgt im Reiter "Objekte" ganz rechts unter "Einstellungen" (Schraubenschlüssel). In meinem Beispiel für eine Außentemperatur in °F mit Umrechnung in °C sieht es so aus:
-
@paul53 sagte in [Neuer Adapter] LinkedDevices:
Dieser Test:
if (obj.common.custom[this.namespace].maxDecimal && !isParentObj) {
schließt 0 Nachkommastellen aus.
Das Problem ist, wenn
"maxDecimal": 0
wird das genauso behandelt wie
"maxDecimal": ''
oder nicht vorhanden ist.
In beiden Fällen gibt z.B. parseInt auch NaN zurück. Wenn ich das jetzt z.B. mit obj.common.def versuche, wird eine '0' zurück gegeben.Auch JSON.stringify gibt dann nur '' anstatt einer '0' zurück.
{"enabled":true,"parentId":"virtualpowermeter.0.hue","isLinked":true,"conversion":"/15*2,4","readOnlyConversion":"","maxDecimal":""}
Ich hab keine Ahnung warum das so ist, auch meine suche hat da nix gebracht. Jemand vielleicht ne idee?
-
@Scrounger sagte:
In beiden Fällen gibt z.B. parseInt auch NaN zurück.
Wirklich ? Das kann ich mir im ersten Fall nicht vorstellen.
-
@paul53 sagte in [Neuer Adapter] LinkedDevices:
@Scrounger sagte:
In beiden Fällen gibt z.B. parseInt auch NaN zurück.
Wirklich ? Das kann ich mir im ersten Fall nicht vorstellen.
Probiers aus, ich habs jetzt ne Stunde getestet und mir nen wolf gegoogelt
Vielleicht ist das auch ein Bug im custom element?Edit: zieh dir den aktuellen branch, da hab ich log ausgabe eingebaut, die das phanomän zeigt
und die raw daten dazu - maxDecimal steht auf '0':
{ "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1558020034830, "common": { "name": "hue", "role": "", "type": "number", "desc": "Manually created", "unit": "%", "min": 0, "max": 100, "def": 0, "read": true, "write": true, "custom": { "linkeddevices.0": { "enabled": true, "unit": "%", "linkedId": "hue", "name": "", "maxDecimal": 0, "conversion": "/15*2,4", "readOnlyConversion": "" } } }, "native": {}, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "virtualpowermeter.0.hue", "type": "state" }
-
@Scrounger sagte:
Probiers aus
Ergebnis:
EDIT: Ohne parseInt() das gleiche Ergebnis. Allerdings kann man mit parseInt() auf != NaN testen.
-
Ok, das gleiche Ergebnis bekomm ich auch, wenn ich es mit nem skript im javascript adapter ausführe.
Im code von meinem Adapter bleibt das Ergebnis wie oben beschrieben ?!?
Es lebe Javascript -
@Scrounger Es wird die falsche ID an die Funktion getConvertedValue() übergeben. Es ist nicht die Quell- sondern die Ziel-ID. Im linked Objekt steht keine 0, sondern ein Leerstring.
-
@paul53
Danke für die Info, habe ich gerade eben auch festgestellt - bin also doch der schuldigeEdit: bug fix ist hochgeladen
-
-
Adapter ist jetzt im latest repository
-
@Scrounger Was hat es mit der Konvertierung auf sich ? Was muss man als Bedingung für 'true' eingeben ?
-
@paul53
Ist bis jetzt noch nicht implementiert, nur im custom dialog schon mal die inputs angelegt.Folgende Funktion soll damit realisiert werden:
-
parentObject ist 'number' read only:
Man kann das linkedObject in ein boolean umwandeln und eine Bedingung eingeben (=,<=,>=,!=), wann das linkedObject true oder false ist. -
parentObject ist number read&write / write:
Man kann das linkedObject in ein boolean umwandeln und eine Bedingung eingeben (=,<=,>=,!=), wann das linkedObject true oder false ist. Für das linkedObject kann man einen Wert für true bzw false eingeben der dann bei change des linkedObject an das parentObject übergeben wird.
-