So, ich habe eine Lösung gefunden und schreibe das hier einfach mal rein, vielleicht hilft es irgendwann nochmal jemandem.
Eine in OpenEMS eingebaute Funktion die das einfach so tut habe ich nicht gefunden, aber man kann über die jeweilige ModbusBridge mit der Funktion removeProtocol(componentId) das Modbus Protokoll entfernen, sodass es nicht mehr ausgeführt wird:
getBridgeModbus().removeProtocol(this.config.id());
Und dann nach der entsprechenden gewünschten Zeit vieder hinzufügen:
getBridgeModbus().addProtocol(this.config.id(), getModbusProtocol());
Dabei ändert sich das Modbus Protokoll nicht, auch wenn man in der defineModbusProtocol() das return von bestimten Dingen abhängig macht. Das liegt daran dass das Protokoll in der ModbusBridge in einer private Variable gespeichert wird. So wird beim ausführer der getModbusProtocol() einfach der gespeicherte Wert zurückgegeben:
/**
* Gets the {@link ModbusProtocol}. Creates it via
* {@link #defineModbusProtocol()} if it does not yet exist.
*
* @return the {@link ModbusProtocol}
* @throws OpenemsException on error
*/
protected ModbusProtocol getModbusProtocol() throws OpenemsException {
ModbusProtocol protocol = this.protocol;
if (protocol != null) {
return protocol;
}
this.protocol = this.defineModbusProtocol();
return this.protocol;
}
In meinem Fall wollte ich aber das Protokoll dahingehend ändern, dass ich immer Werte Lesen, aber nur unter bestimmten bedingungen Werte schreiben wollte. Das habe ich gelöst, indem ich bewusst über die setNextWriteValue den Wert auf null gesetzt habe:
try {
this.get_temp_heat_target_write_channel().setNextWriteValue(null);
} catch (OpenemsNamedException e) {
e.printStackTrace();
}
In diesem Fall werden die Write Tasks nicht ausgeführt, obwohl sie im Modbus Protokoll drin sind. Ich habe nicht nachgeforscht woran das liegt, aber es funktioniert zuverlässig.
Das ist vermutlich keine Awendung, wie sie von den Entwicklern vorgesehen war, aber wie gesagt, es funktioniert in meinen Tests zuverlässig.
Viele Grüße
Tobi