Eigenen Channel in Edge definieren

Hallo Community

Meine Frage ist vieleicht etwas dumm, aber wie erzeuge ich in meiner Edge-Komponente einen eigenen Channel, der im UI lesbar oder schreibbar ist. Und wie lausche ich auf diesem Channel in der Edge-Komponente.

Konkret habe ich ‘FixDigitalOutput’ mit dem Channel “TEST_CHANNEL” konfiguriert und ich sehe in UI auch das Widget, aber natürlich wirft die Edge-Konsole eine Fehlermeldung, dass “TEST_CHANNEL” unbekannt ist.

Wie kann ich in meiner Edge-Komponente (ESS) diesen Channel definieren und dann darauf lauschen.

Vielen Dank!
Sebastian

Moin,

Normalerweise wird, wenn eigene Channels verwendet werden sollen, ein Interface dazu erzeugt. Dieses heißt i.d.R. wie Deine Komponente - ohne die Erweiterung Impl. Also z.B. meinModulImpl.java mit dem Interface meinModul.java.
Beispiel:
https://github.com/OpenEMS/openems/blob/develop/io.openems.edge.ess.fenecon.commercial40/src/io/openems/edge/ess/fenecon/commercial40/EssFeneconCommercial40.java

Dort kannst Du Deine Channels als Enums definieren und get/getChannel/set-Methoden implementieren.

Gruß,
klinki

Guten Morgen

Danke für die Antwort. Mir war bereits klar, dass die Channels in Interface.java definiert werden als:

public enum ChannelId implements io.openems.edge.common.channel.ChannelId {

und dann in Implemenation.java an den Konstruktor der super Klasse übergeben werden als:

public Implematatation() {
		super(
			Interface.ChannelId.values() //
		);
	}

Mir war aber nicht nicht klar, dass der Bezeichner am Anfang der Declaration in Interface beliebig ist. Jetzt habe ich es verstanden - Danke.

Ist also folgendes die kürzest mögliche Implementierung eines Kanals CELL_42_VOLTAGE ?
Und braucht man den Schlaweng ab private final doc abwärts oder erbt man das bereits von common.channel.ChannelId?

public enum ChannelId implements io.openems.edge.common.channel.ChannelId {
	
	CELL_42_VOLTAGE(Doc.of(OpenemsType.INTEGER) //
		.unit(Unit.MILLIVOLT)), //
	;

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

Oh, und ich bin ürbigens der Fragesteller wie man am Benutzernamen erkennt.
Aber unter einem andere Accout, dessen Aktivierungs-Email 5 Tage zu mir benötigt hat :-/

Hallo,

ja, das wäre eine mögliche Implementierung eines Channels. Wir arbeiten hier gerne mit Java enums, da man damit schön Eindeutigkeit sicherstellen kann. Der Enum Name in UPPERCASE_UNDERSCORE wird dann in die Channel-ID im Format UpperCamel umgewandelt (hier → openems/ChannelId.java at develop · OpenEMS/openems · GitHub).

Den “Schlaweng” kann man dabei leider nicht vermeiden, weil Java Enums nicht erben können. Die Hilfsklasse doc ist deshalb schon die kürzest mögliche Form.

Alternativ können Channels auch ohne Enum instantiiert werden. Das ist immer dann sinnvoll, wenn erst zur Laufzeit klar ist, welche Channels es tatsächlich gibt. Hier ein Beispiel einer Batterie mit variabler Anzahl and Türmen und Batteriemodulen: Die Channels für Zell-Spannungen je Modul etc. werden dynamisch angelegt: openems/FeneconHomeBatteryImpl.java at develop · OpenEMS/openems · GitHub.

Gruß,
Stefan

1 Like

Herzlichen Dank Stefan
Ich war einigen Woche verreist, daher meine sehr späte Antwort.