ioBroker / ioBroker.node-red

Instantiate the server with node-red
Apache License 2.0
52 stars 27 forks source link

ioBorker-out nur Datenpunkt erstellen #272

Closed Bernd9000 closed 2 years ago

Bernd9000 commented 2 years ago

In der Hilfe zu ioBorker-out heißt es:

If msg.payload contains "__create__", the object will be only created, but no value will be written.

Also habe ich ein nicht existierenden Topic übergeben und als payload __create__. Der Datenpunkt wird in ioBroker erstellt aber es wird mit dem Wert __create__ gefüllt. Das heißt auf diesem Befehl wird nicht reagiert ? Oder sind weitere Voraussetzungen nötig?

Bernd9000 commented 2 years ago

Könnte das mit dieser Function zusammenhängen ? Dort wird, so wie ich das sehe, auf jeden Fall der val Wert geschrieben.

iobroker.js :

 function setState(id, val, ack, callback) {
            if (node.idChecked) {
                if (val !== undefined && val !== '__create__') {
                    // If not this adapter state
                    if (isForeignState(id)) {
                        adapter.setForeignState(id, {val, ack}, callback);
                    } else {
                        adapter.setState(id, {val, ack}, callback);
                    }
                }
            } else {
                checkState(node, id, null, {val, ack}, isOk => callback && callback(!isOk));
            }
        }
Apollon77 commented 2 years ago

... es sei denn der Wert lautet "create" ... scheinbar sind eie doppel-Unterstiche falsch und waren vllt als formatierung gedacht?

Bernd9000 commented 2 years ago

Nein, ich glaub schon das die ein nicht alltägliches Schlüsselwort benutzen wollten. Ich meinte aber viel mehr was auf die Bedingung folgt. Wenn val vom Typ oder Wert entweder "create" und undefined ist wird der Datenpunkt erstellt und auf jeden Fall als Wert val übergeben.So wird dann ein Datenpunkt erstellt mit dem Inhalt "create".

Das hat mich auf eine schöne Möglichkeit gestoßen Datenpunkte zu erstellen die noch nicht existieren und vorhandene Datenpunkte auf keinen Fall zu überschreiben.

Einfach den payload vor dem ioBroker-out löschen. Es wird zwar NULL im Datenpunkt eingetragen, aber es funktioniert erstmal.

Bernd9000 commented 2 years ago

Aber es bleibt natürlich der Fehler bestehen das auf das Zauberwort __create__ nicht richtig reagiert wird,

mickym2 commented 2 years ago

Null ist aber genau richtig - da jeder Datenpunkt, der neu erstellt wird ein (null) für undefined enthält. Insofern braucht es hier in meinen Augen keine Änderung des Verhaltens, da die Datenpunkte ohne payload korrekt angelegt werden. Das Einrichten eines leeren Datenpunktes mit dem create Datenpunkt könnte man sich somit sparen, sollte halt den entsprechenden Hilfetext ändern.

image

So der Hilfetext könnte in etwa so modifiziert werden:

GermanBluefox commented 2 years ago

Fixed in next version

Bernd9000 commented 2 years ago

Okay

mickym2 commented 2 years ago

Der Hilfetext wurde nicht überarbeitet.

Bernd9000 commented 2 years ago

Das stimmt zwar das der Hilfetext nicht bearbeitet wurde aber der eigentliche Fehler wurde behoben. Übergibt man das Zauberwort __create__ wird ein leerer Datenpunkt erstellt, vorher wurde in diesem Datenpunkt __create__ geschrieben. Also könnte der Text doch so bleiben ?

Apollon77 commented 2 years ago

In fact both works ... so "mepty" payload and also "'create' so I will update docs for both but would not push new version out directly just because of this

Apollon77 commented 2 years ago

Siehe commit, ich habe den text erweitert :-)