Channelwert in der UI abrufen - Update

Hallo liebes Forum,

ich update hier meine zwei Wochen alte Frage, weil ich noch immer an dem Problem hänge.
Außerdem stelle ich noch meine weiteren Ansätze vor:

ZIEL:
ich habe eine neue Komponente erstellt mit einem Channel “TOTAL_RESULT”.
Den Wert dieses Channels möchte ich in einem flat-widget in der UI anzeigen.

BEOBACHTUNG:
Der Channelwert taucht in meinem flat widget nicht auf.
Ich kann den Wert im Backend auslesen und mir auch über den Detailed Debug Log ausgeben lassen.
In der UI kann ich maximal sehen, dass es den Channel ‘TotalResult’ gibt, aber nicht seinen Wert.

BISHERIGE VERSUCHE:

  1. this.totalResult = currentData.allComponents['myComponent/totalResult'];

  2. Mit Hilfe von this.config.getComponentsImplementingNature("io.openems.edge.mycomponent.MyComponent") um die Channels als public myComponents:EdgeConfig.Component[] zu lesen.

  3. Mit Hilfe von this.config.getComponentIdsByFactory("Component.Mine") - Ich habe auch meinen Komponenten zu der Liste aus Factories listAvailableFactories() hinzugefügt.

  4. Verwendung eines Channel Mappers, der den Wert von einem Channel auf einen anderen bestehenden Channel mappen kann.

  5. Mit ngOnInit() und this.service.setCurrentComponent()... und `this.edge.subscribeChannels(…, [ new ChannelAddress(…,…) ] );

  6. Über getChannelAddresses(): ChannelAddresses {}

TL:DR:
Der Channelwert taucht in der UI nicht auf, obwohl er im Backend existiert und ich suche nach einer Möglichkeit ihn in einem flat widget anzuzeigen.
(Mein flat widget ist in der Lage andere Werte zu zeigen, also das widget selbst funktioniert)

Sind meine Ansätze an sich richtig oder muss ich das anders machen?
Vielen Dank für Eure Hilfe!

1 Like

Hallo @tafferner
es wäre schön, wenn du gleiche Themen auch in dem gleichen Thread lassen würdest :slight_smile:

Grüße

Hallo @Sn0w3y danke für deine Antwort. :slight_smile:
Wenn ich meinen alten Post bearbeite, taucht er dann gemeinsam mit den restlichen neuen Posts auf oder bleibt er weiterhin an seinem Platz, wo er seit 2 Wochen ist?
Ich frage, weil ich leider keine Antwort auf meinen ersten Post bekam und sicher gehen wollte, dass der neue Post auch dort erscheint wo man Ihn gut sehen kann, damit meine weiteren Versuche die ich inzwischen unternommen habe auch berücksichtigt werden können.

Viele Grüße

Hallo, er rutscht wieder nach oben, aber wenn jeder einen neuen Post aufmacht, nur weil er keine Antwort erhält, dann ist das Forum bald komplett voll mit neuen gleichen Threads :slight_smile:

Danke @Sn0w3y das ist gut zu wissen :slight_smile:

Jetzt hoffe ich nur noch, Jemand weiß etwas, das mir weiterhilft :sweat_smile:

Hallo, ich hänge leider immer noch an dem Problem, hat Jemand vielleicht eine Idee, die mir weiterhelfen kann?

Hallo,

um dir konkret helfen zu können müssten wir eventuell auch den Code sehen können :slight_smile:

Wäre auch toll, wenn du Ihn publishst, dass wir zusammen schauen können, was fehlt…

Grüße

Ich habe jetzt die Lösung gefunden. Es lag an der persistencePriority, die zu niedrig war.

Ich hatte gestern keine Zeit mehr, aber hier möchte ich meinen Code teilen, der letztendlich funktioniert hat. Vielleicht hilft das ja jemandem :smiley:

In der MyComponent.java war der Fix die .persistencePriority() auf HIGH zu setzen.

public interface MyComponent extends OpenemsComponent, EventHandler{

	public enum ChannelId implements io.openems.edge.common.channel.ChannelId {
		MY_CHANNEL(Doc.of(OpenemsType.MYTYPE)
				.unit(Unit.MYUNIT)
		        .persistencePriority(PersistencePriority.HIGH));

		private final Doc doc;
		private ChannelId(Doc doc) {
			this.doc = doc;
		}
		@Override
		public Doc doc() {
			return this.doc;
		}
	}
}

Im flat widget meiner UI sah es dann so aus:

protected override getChannelAddresses(): ChannelAddress[] {

    this.mycomponents = this.config.getComponentsByFactory("Mycomponent");
        for (let component of this.mycomponents) {
            this.channelAddresses.push(
                new ChannelAddress(component.id, 'MyChannel')
            );
        }
        return this.channelAddresses;
}

protected override onCurrentData(currentData: CurrentData) {

        for (let component of this.mycomponents) {
            if (currentData.allComponents[component.id + '/MyChannel']) {
                this.MyValue = currentData.allComponents[component.id + '/MyChannel'];
            }
      }
}

Und so konnte ich den Wert der von mir erstellten Komponente erfolgreich anzeigen.