Also mal ganz einfach:
postUpdate enthält das Wort
Update. Was uns dazu führt, dass eine Rule mit dem Trigger
received update davon ausgelöst wird.
changed wird nur dann triggern, wenn sich der Status
geändert hat. Das ist potenziell beim Befehl postUpdate der Fall, aber nicht zwingend.
sendCommand enthält das Wort
Command. Was uns dazu führt, dass eine Rule mit dem Trigger
received command davon ausgelöst wird.
Und jetzt kommt leider sofort ein und. eigentlich ein großes und. also ein UND

UND das normale Verhalten von openHAB ist es, bei einem sendCommand unmittelbar im Anschluss selbsttätig ein postUpdate hinterherzuschieben, wobei das postUpdate dann vom
vermuteten Resultat des sendCommand abhängt. Beispiel: MySwitch.sendCommand(ON) -> es wird ein postUpdate(ON) gesendet. 2. Beispiel: MyDimmer.sendCommand(ON) -> es wird ein postUpdate(100) gesendet, denn ein Dimmer Item kennt keinen Status ON (!!!).
Dieses Verhalten kann mit dem Parameter autoupdate="false" unterbunden werden. Der Parameter gehört zum Item, nicht zum Channel (wird regelmäßig falsch gemacht).
Also postUpdate wirkt auf den Status, sendCommand sendet einen Befehl. Da openHAB im Normalzustand übereifrig ist, wird dadurch indirekt auch der Status gesetzt.
Dasss Deine logInfo Befehle für das Item sTest1 den Status OFF ausgeben, obwohl Du doch vorher ein ON gesendet hast, liegt daran, dass openHAB asynchron arbeitet. Die Rule erteilt den Befehl postUpdate und wartet nicht darauf, dass dieser Befehl abgearbeitet wird. stattdessen macht sie sofort mit den nächsten Befehlen weiter.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte