Das sehe ich auch so. Neuerdings ist es aber wohl so, dass man bei einem Binding die entsprechenden Einheiten mit erzeugt, diese werden dann von den Items übernommen. Oder?
Für das
Lesen der Werte aus der Wärmepumpe habe ich im Code des StiebelEltronBindings eine getScaled-Funktion gefunden und damit eine entsprechende getUnscaled-Funktion geschrieben:
Code: Alles auswählen
protected State getScaled(Number value, Unit<?> unit) {
return QuantityType.valueOf(value.doubleValue() / 10, unit);
}
protected State getUnscaled(Number value, Unit<?> unit) {
return QuantityType.valueOf(value.doubleValue(), unit);
}
Bei meiner Wärmepumpe werden Temperaturwerte in 1/10 °C geführt, dort rufe ich dann getScaled auf:
Code: Alles auswählen
updateState(channelUID(GROUP_GENERAL_AMBIENT, CHANNEL_ACTUAL_AMBIENT_TEMPERATURE),
getScaled(block.actualAmbientTemperature, CELSIUS));
resetCommunicationError();
Leistungswerte werden als "ganze" Watt geführt, dort rufe ich dann getUnscaled auf:
Code: Alles auswählen
updateState(channelUID(GROUP_GENERAL_EMANAGER, CHANNEL_ACTUAL_POWER_CONSUMPTION),
getUnscaled(block.actualPowerConsumption, WATT));
Beim
Schreiben habe ich bisher nur Leistungen (Überschuss der PV-Anlage) geschrieben, das geht im Binding mit den Funktionen:
Code: Alles auswählen
private short getInt16Value(Command command) throws LambdaException {
if (command instanceof QuantityType quantityCommand) {
QuantityType<?> c = quantityCommand.toUnit(WATT);
if (c != null) {
return c.shortValue();
} else {
throw new LambdaException("Unsupported unit");
}
}
if (command instanceof DecimalType c) {
return c.shortValue();
}
throw new LambdaException("Unsupported command type");
}
und
Code: Alles auswählen
protected void writeInt16(int address, short shortValue) {
LambdaConfiguration myconfig = LambdaHandler.this.config;
ModbusCommunicationInterface mycomms = LambdaHandler.this.comms;
if (myconfig == null || mycomms == null) {
throw new IllegalStateException("registerPollTask called without proper configuration");
}
// big endian byte ordering
byte hi = (byte) (shortValue >> 8);
byte lo = (byte) shortValue;
ModbusRegisterArray data = new ModbusRegisterArray(hi, lo);
ModbusWriteRegisterRequestBlueprint request = new ModbusWriteRegisterRequestBlueprint(slaveId, address, data,
true, myconfig.getMaxTries());
// 15.8.24 13:40 war:
// false, myconfig.getMaxTries());
mycomms.submitOneTimeWrite(request, result -> {
if (hasConfigurationError()) {
return;
}
logger.trace("Successful write, matching request {}", request);
LambdaHandler.this.updateStatus(ThingStatus.ONLINE);
}, failure -> {
LambdaHandler.this.handleWriteError(failure);
logger.trace("Unsuccessful write, matching request {}", request);
});
}
Da ich auch Temperturwerte schreiben möchte (z.Bsp: Zieltemperatur des Brauchwassers), muss ich da wohl weitere Funktionen schreiben oder Einheit und Faktor als weitere Parameter an die beiden Funktionen übergeben.
Wie könnte der Code dann aussehen?
Oder ich versuche, den Code von modbus:gainOffset zu finden und den zu verwenden. Eine Diskussion dazu lese ich mir dann durch:
https://community.openhab.org/t/modbus- ... its/110814