You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2025/11/20 13:28:27 UTC

(plc4x) branch develop updated (407acefa42 -> 9eda95c2bb)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


    from 407acefa42 feat(plc4go): default ZerologInterfacePLCMessageFormat to JSON
     new 009fbdd0aa test(plc4go): use sync test
     new 87f5a6c229 fix(plc4go): finally fix hanging shutdown
     new a97260fd86 perf(plc4go/spi): avoid frequent recompile of ascii regex
     new 00d8afa7aa feat(plc4go/spi): add interaction id to better identify failing requests
     new fdf8e842b4 fix(plc4go/spi): TransportInstance should stop on ctx abort
     new 215605fe8a feat(plc4go/spi): add transactionInfo to RequestTransaction
     new 8281025d40 feat(plc4go/spi): add operationInfo to Submit for transaction
     new 9eda95c2bb test(plc4go/cbus): disable test temporary

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 plc4go/internal/ads/DiscoveryMessageCodec.go       |   4 +-
 plc4go/internal/ads/Interactions.go                |  12 +-
 plc4go/internal/ads/MessageCodec.go                |   4 +-
 .../bacnetip/ApplicationLayerMessageCodec.go       |   6 +-
 plc4go/internal/bacnetip/MessageCodec.go           |   4 +-
 plc4go/internal/bacnetip/Reader.go                 |   6 +-
 .../bacgopes/tests/test_bvll/test_foreign_test.go  | 373 ++++++++++----------
 .../bacgopes/tests/test_network/test_net_2_test.go | 263 ++++++++-------
 plc4go/internal/cbus/Browser_test.go               |  37 +-
 plc4go/internal/cbus/CBusMessageMapper_test.go     |  88 ++---
 plc4go/internal/cbus/Connection.go                 | 136 ++++----
 plc4go/internal/cbus/Connection_test.go            |  35 +-
 plc4go/internal/cbus/MessageCodec.go               |  11 +-
 plc4go/internal/cbus/MessageCodec_test.go          | 257 +++++++-------
 plc4go/internal/cbus/Reader.go                     |   6 +-
 plc4go/internal/cbus/Writer.go                     |   6 +-
 plc4go/internal/cbus/mocks_test.go                 |   2 +-
 plc4go/internal/eip/Connection.go                  |  10 +-
 plc4go/internal/eip/MessageCodec.go                |   4 +-
 plc4go/internal/eip/Reader.go                      |   6 +-
 .../knxnetip/ConnectionInternalOperations.go       | 375 +++++++++++----------
 plc4go/internal/knxnetip/Discoverer.go             |   2 +-
 plc4go/internal/knxnetip/MessageCodec.go           |   6 +-
 plc4go/internal/modbus/Connection.go               |   2 +-
 plc4go/internal/modbus/MessageCodec.go             |   4 +-
 plc4go/internal/modbus/Reader.go                   |   2 +-
 plc4go/internal/modbus/Writer.go                   |   2 +-
 plc4go/internal/opcua/MessageCodec.go              |   4 +-
 plc4go/internal/opcua/SecureChannel.go             |  18 +-
 plc4go/internal/s7/Connection.go                   |   6 +-
 plc4go/internal/s7/MessageCodec.go                 |   4 +-
 plc4go/internal/s7/Reader.go                       |   6 +-
 plc4go/internal/s7/Writer.go                       |   6 +-
 plc4go/spi/MessageCodec.go                         |   6 +-
 plc4go/spi/default/DefaultCodec.go                 |  22 +-
 plc4go/spi/default/DefaultCodec_test.go            |  46 +--
 plc4go/spi/default/defaultExpectation.go           |  38 ++-
 plc4go/spi/default/mocks_test.go                   | 214 +++++++-----
 plc4go/spi/mocks_test.go                           |  94 +++---
 plc4go/spi/testutils/ParserSerializerTestRunner.go |   9 +-
 plc4go/spi/transactions/RequestTransaction.go      |  30 +-
 .../spi/transactions/RequestTransactionManager.go  |   6 +-
 .../transactions/RequestTransactionManager_test.go |   2 +-
 plc4go/spi/transactions/RequestTransaction_test.go |  13 +-
 plc4go/spi/transactions/mocks_test.go              |   4 +-
 .../transactions/requestTransaction_plc4xgen.go    |   4 +
 plc4go/spi/transports/test/TransportInstance.go    |   4 +-
 plc4go/spi/utils/asciiBox.go                       |   8 +-
 48 files changed, 1177 insertions(+), 1030 deletions(-)


(plc4x) 01/08: test(plc4go): use sync test

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 009fbdd0aa6c5e30091c26729bb25fcefa6da640
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 12:00:49 2025 +0100

    test(plc4go): use sync test
---
 .../bacgopes/tests/test_bvll/test_foreign_test.go  | 373 +++++++++++----------
 .../bacgopes/tests/test_network/test_net_2_test.go | 263 ++++++++-------
 plc4go/internal/cbus/Browser_test.go               |  33 +-
 plc4go/internal/cbus/Connection_test.go            |  35 +-
 plc4go/internal/cbus/MessageCodec_test.go          | 251 +++++++-------
 plc4go/spi/testutils/ParserSerializerTestRunner.go |   9 +-
 6 files changed, 500 insertions(+), 464 deletions(-)

diff --git a/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go b/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go
index 2514426265..e620cf0f09 100644
--- a/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go
+++ b/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go
@@ -21,6 +21,7 @@ package test_bvll
 
 import (
 	"testing"
+	"testing/synctest"
 	"time"
 
 	"github.com/rs/zerolog"
@@ -121,197 +122,207 @@ func (t *TFNetwork) Run(timeLimit time.Duration) {
 
 func TestForeign(t *testing.T) {
 	t.Run("test_idle", func(t *testing.T) { //Test an idle network, nothing happens is success.
-		ExclusiveGlobalTimeMachine(t)
+		synctest.Test(t, func(t *testing.T) {
+			ExclusiveGlobalTimeMachine(t)
 
-		tnet := NewTFNetwork(t)
+			tnet := NewTFNetwork(t)
 
-		// all start state are successful
-		tnet.fd.GetStartState().Success("")
-		tnet.bbmd.GetStartState().Success("")
+			// all start state are successful
+			tnet.fd.GetStartState().Success("")
+			tnet.bbmd.GetStartState().Success("")
 
-		// run the group
-		tnet.Run(0)
+			// run the group
+			tnet.Run(0)
+		})
 	})
 	t.Run("test_registration", func(t *testing.T) {
-		ExclusiveGlobalTimeMachine(t)
-		testingLogger := testutils.ProduceTestingLogger(t)
-
-		// create a network
-		tnet := NewTFNetwork(t)
-
-		// tell the B/IP layer of the foreign device to register
-		tnet.fd.GetStartState().
-			Call(func(args Args, _ KWArgs) error {
-				return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
-			}, NA(tnet.bbmd.address, uint16(30)), NoKWArgs()).
-			Success("")
-
-		// remote sniffer node
-		remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
-		require.NoError(t, err)
-		tnet.Append(remoteSniffer)
-
-		// sniffer traffic
-		remoteSniffer.GetStartState().Doc("1-1-0").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-1-1").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-1-2").
-			SetEvent("fd-registered").Doc("1-1-3").
-			Success("")
-
-		// the bbmd is idle
-		tnet.bbmd.GetStartState().Success("")
-
-		// home snooper node
-		homeSnooper, err := NewBIPStateMachine(testingLogger, "192.168.5.2/24", tnet.vlan5)
-		tnet.Append(homeSnooper)
-
-		// snooper will read foreign device table
-		homeSnooper.GetStartState().Doc("1-2-0").
-			WaitEvent("fd-registered", nil).Doc("1-2-1").
-			Send(quick.ReadForeignDeviceTable(tnet.bbmd.address), nil).Doc("1-2-2").
-			Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-2-3").
-			Success("")
-
-		// home sniffer node
-		homeSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5)
-		require.NoError(t, err)
-		tnet.Append(homeSniffer)
-
-		// sniffer traffic
-		homeSniffer.GetStartState().Doc("1-3-0").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-3-1").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-3-2").
-			Receive(NA((*ReadForeignDeviceTable)(nil)), NoKWArgs()).Doc("1-3-3").
-			Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-3-4").
-			Success("")
-
-		//  run the group
-		tnet.Run(0)
+		synctest.Test(t, func(t *testing.T) {
+			ExclusiveGlobalTimeMachine(t)
+			testingLogger := testutils.ProduceTestingLogger(t)
+
+			// create a network
+			tnet := NewTFNetwork(t)
+
+			// tell the B/IP layer of the foreign device to register
+			tnet.fd.GetStartState().
+				Call(func(args Args, _ KWArgs) error {
+					return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
+				}, NA(tnet.bbmd.address, uint16(30)), NoKWArgs()).
+				Success("")
+
+			// remote sniffer node
+			remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
+			require.NoError(t, err)
+			tnet.Append(remoteSniffer)
+
+			// sniffer traffic
+			remoteSniffer.GetStartState().Doc("1-1-0").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-1-1").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-1-2").
+				SetEvent("fd-registered").Doc("1-1-3").
+				Success("")
+
+			// the bbmd is idle
+			tnet.bbmd.GetStartState().Success("")
+
+			// home snooper node
+			homeSnooper, err := NewBIPStateMachine(testingLogger, "192.168.5.2/24", tnet.vlan5)
+			tnet.Append(homeSnooper)
+
+			// snooper will read foreign device table
+			homeSnooper.GetStartState().Doc("1-2-0").
+				WaitEvent("fd-registered", nil).Doc("1-2-1").
+				Send(quick.ReadForeignDeviceTable(tnet.bbmd.address), nil).Doc("1-2-2").
+				Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-2-3").
+				Success("")
+
+			// home sniffer node
+			homeSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5)
+			require.NoError(t, err)
+			tnet.Append(homeSniffer)
+
+			// sniffer traffic
+			homeSniffer.GetStartState().Doc("1-3-0").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-3-1").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-3-2").
+				Receive(NA((*ReadForeignDeviceTable)(nil)), NoKWArgs()).Doc("1-3-3").
+				Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-3-4").
+				Success("")
+
+			//  run the group
+			tnet.Run(0)
+		})
 	})
 	t.Run("test_refresh_registration", func(t *testing.T) {
-		ExclusiveGlobalTimeMachine(t)
-		testingLogger := testutils.ProduceTestingLogger(t)
-
-		// create a network
-		tnet := NewTFNetwork(t)
-
-		// tell the B/IP layer of the foreign device to register
-		tnet.fd.GetStartState().
-			Call(func(args Args, _ KWArgs) error {
-				return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
-			}, NA(tnet.bbmd.address, uint16(10)), NoKWArgs()).
-			Success("")
-
-		// the bbmd is idle
-		tnet.bbmd.GetStartState().Success("")
-
-		// remote sniffer node
-		remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
-		require.NoError(t, err)
-		tnet.Append(remoteSniffer)
-
-		// sniffer traffic
-		remoteSniffer.GetStartState().Doc("2-1-0").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-1").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-1").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-3").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-4").
-			Success("")
-
-		//  run the group
-		tnet.Run(0)
+		synctest.Test(t, func(t *testing.T) {
+			ExclusiveGlobalTimeMachine(t)
+			testingLogger := testutils.ProduceTestingLogger(t)
+
+			// create a network
+			tnet := NewTFNetwork(t)
+
+			// tell the B/IP layer of the foreign device to register
+			tnet.fd.GetStartState().
+				Call(func(args Args, _ KWArgs) error {
+					return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
+				}, NA(tnet.bbmd.address, uint16(10)), NoKWArgs()).
+				Success("")
+
+			// the bbmd is idle
+			tnet.bbmd.GetStartState().Success("")
+
+			// remote sniffer node
+			remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
+			require.NoError(t, err)
+			tnet.Append(remoteSniffer)
+
+			// sniffer traffic
+			remoteSniffer.GetStartState().Doc("2-1-0").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-1").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-1").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-3").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-4").
+				Success("")
+
+			//  run the group
+			tnet.Run(0)
+		})
 	})
 	t.Run("test_unicast", func(t *testing.T) { //Test a unicast message from TD to IUT.
-		ExclusiveGlobalTimeMachine(t)
-		testingLogger := testutils.ProduceTestingLogger(t)
-
-		tnet := NewTFNetwork(t)
-
-		//make a PDU from node 1 to node 2
-		pduData, err := Xtob("dead.beef")
-		require.NoError(t, err)
-		pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, tnet.bbmd.address))
-		t.Logf("    - pdu: %s", pdu)
-
-		// register, wait for ack, send some beef
-		tnet.fd.GetStartState().Doc("3-1-0").
-			Call(func(args Args, _ KWArgs) error {
-				return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
-			}, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("3-1-1").
-			WaitEvent("3-registered", nil).Doc("3-1-2").
-			Send(pdu, nil).Doc("3-1-3").
-			Success("")
-
-		// the bbmd is happy when it gets the pdu
-		tnet.bbmd.GetStartState().
-			Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).
-			Success("")
-
-		// remote sniffer node
-		remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
-		require.NoError(t, err)
-		tnet.Append(remoteSniffer)
-
-		// sniffer traffic
-		remoteSniffer.GetStartState().Doc("3-2-0").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("3-2-1").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("3-2-2").
-			SetEvent("3-registered").Doc("3-2-3").
-			Receive(NA((*OriginalUnicastNPDU)(nil)), NoKWArgs()).Doc("3-2-4").
-			Success("")
-
-		// run the group
-		tnet.Run(0)
+		synctest.Test(t, func(t *testing.T) {
+			ExclusiveGlobalTimeMachine(t)
+			testingLogger := testutils.ProduceTestingLogger(t)
+
+			tnet := NewTFNetwork(t)
+
+			//make a PDU from node 1 to node 2
+			pduData, err := Xtob("dead.beef")
+			require.NoError(t, err)
+			pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, tnet.bbmd.address))
+			t.Logf("    - pdu: %s", pdu)
+
+			// register, wait for ack, send some beef
+			tnet.fd.GetStartState().Doc("3-1-0").
+				Call(func(args Args, _ KWArgs) error {
+					return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
+				}, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("3-1-1").
+				WaitEvent("3-registered", nil).Doc("3-1-2").
+				Send(pdu, nil).Doc("3-1-3").
+				Success("")
+
+			// the bbmd is happy when it gets the pdu
+			tnet.bbmd.GetStartState().
+				Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).
+				Success("")
+
+			// remote sniffer node
+			remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
+			require.NoError(t, err)
+			tnet.Append(remoteSniffer)
+
+			// sniffer traffic
+			remoteSniffer.GetStartState().Doc("3-2-0").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("3-2-1").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("3-2-2").
+				SetEvent("3-registered").Doc("3-2-3").
+				Receive(NA((*OriginalUnicastNPDU)(nil)), NoKWArgs()).Doc("3-2-4").
+				Success("")
+
+			// run the group
+			tnet.Run(0)
+		})
 	})
 	t.Run("test_broadcast", func(t *testing.T) { //Test a broadcast message from TD to IUT.
-		ExclusiveGlobalTimeMachine(t)
-		testingLogger := testutils.ProduceTestingLogger(t)
-
-		tnet := NewTFNetwork(t)
-
-		//make a PDU from node 1 to node 2
-		pduData, err := Xtob("dead.beef")
-		require.NoError(t, err)
-		pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, NewLocalBroadcast(nil)))
-		t.Logf("pdu: %v", pdu)
-
-		// register, wait for ack, send some beef
-		tnet.fd.GetStartState().Doc("4-1-0").
-			Call(func(args Args, _ KWArgs) error {
-				return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
-			}, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("4-1-1").
-			WaitEvent("4-registered", nil).Doc("4-1-2").
-			Send(pdu, nil).Doc("4-1-3").
-			Success("")
-
-		// the bbmd is happy when it gets the pdu
-		tnet.bbmd.GetStartState().
-			Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-2-1").
-			Success("")
-
-		// home simple node
-		homeNode, err := NewBIPSimpleStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5)
-		require.NoError(t, err)
-
-		// home node happy when getting the pdu, broadcast by the bbmd
-		homeNode.GetStartState().Doc("4-3-0").
-			Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-3-1").
-			Success("")
-
-		// remote sniffer node
-		remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
-		require.NoError(t, err)
-		tnet.Append(remoteSniffer)
-
-		// sniffer traffic
-		remoteSniffer.GetStartState().Doc("4-4-0").
-			Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("4-4-1").
-			Receive(NA((*Result)(nil)), NoKWArgs()).Doc("4-4-2").
-			SetEvent("4-registered").
-			Receive(NA((*DistributeBroadcastToNetwork)(nil)), NoKWArgs()).Doc("4-4-3").
-			Success("")
-
-		// run the group
-		tnet.Run(0)
+		synctest.Test(t, func(t *testing.T) {
+			ExclusiveGlobalTimeMachine(t)
+			testingLogger := testutils.ProduceTestingLogger(t)
+
+			tnet := NewTFNetwork(t)
+
+			//make a PDU from node 1 to node 2
+			pduData, err := Xtob("dead.beef")
+			require.NoError(t, err)
+			pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, NewLocalBroadcast(nil)))
+			t.Logf("pdu: %v", pdu)
+
+			// register, wait for ack, send some beef
+			tnet.fd.GetStartState().Doc("4-1-0").
+				Call(func(args Args, _ KWArgs) error {
+					return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16))
+				}, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("4-1-1").
+				WaitEvent("4-registered", nil).Doc("4-1-2").
+				Send(pdu, nil).Doc("4-1-3").
+				Success("")
+
+			// the bbmd is happy when it gets the pdu
+			tnet.bbmd.GetStartState().
+				Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-2-1").
+				Success("")
+
+			// home simple node
+			homeNode, err := NewBIPSimpleStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5)
+			require.NoError(t, err)
+
+			// home node happy when getting the pdu, broadcast by the bbmd
+			homeNode.GetStartState().Doc("4-3-0").
+				Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-3-1").
+				Success("")
+
+			// remote sniffer node
+			remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6)
+			require.NoError(t, err)
+			tnet.Append(remoteSniffer)
+
+			// sniffer traffic
+			remoteSniffer.GetStartState().Doc("4-4-0").
+				Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("4-4-1").
+				Receive(NA((*Result)(nil)), NoKWArgs()).Doc("4-4-2").
+				SetEvent("4-registered").
+				Receive(NA((*DistributeBroadcastToNetwork)(nil)), NoKWArgs()).Doc("4-4-3").
+				Success("")
+
+			// run the group
+			tnet.Run(0)
+		})
 	})
 }
diff --git a/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go b/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go
index b431add72a..80c693c212 100644
--- a/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go
+++ b/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go
@@ -21,6 +21,7 @@ package test_network
 
 import (
 	"testing"
+	"testing/synctest"
 	"time"
 
 	"github.com/rs/zerolog"
@@ -150,141 +151,149 @@ func (t *TNetwork2) Run(timeLimit time.Duration) {
 func TestNet2(t *testing.T) {
 	t.Run("TestSimple", func(t *testing.T) {
 		t.Run("testIdle", func(t *testing.T) {
-			// create a network
-			ExclusiveGlobalTimeMachine(t)
-			tnet := NewTNetwork2(t)
-
-			// all start states are successful
-			tnet.td.GetStartState().Success("")
-			tnet.sniffer1.GetStartState().Success("")
-			tnet.sniffer2.GetStartState().Success("")
-			tnet.sniffer3.GetStartState().Success("")
-
-			// run the group
-			tnet.Run(0)
+			synctest.Test(t, func(t *testing.T) {
+				// create a network
+				ExclusiveGlobalTimeMachine(t)
+				tnet := NewTNetwork2(t)
+
+				// all start states are successful
+				tnet.td.GetStartState().Success("")
+				tnet.sniffer1.GetStartState().Success("")
+				tnet.sniffer2.GetStartState().Success("")
+				tnet.sniffer3.GetStartState().Success("")
+
+				// run the group
+				tnet.Run(0)
+			})
 		})
 	})
 	t.Run("TestWhoIsRouterToNetwork", func(t *testing.T) {
 		t.Run("test_01", func(t *testing.T) {
-			//Test broadcast for any router.
-			ExclusiveGlobalTimeMachine(t)
-
-			// create a network
-			tnet := NewTNetwork2(t)
-
-			// test device sends request, sees response
-			whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)))
-			require.NoError(t, err)
-			tnet.td.GetStartState().Doc("1-1-0").
-				Send(whois, nil).Doc("1-1-1").
-				Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("1-1-2").
-				Success("")
-
-			// sniffer on network 1 sees the request and the response
-			tnet.sniffer1.GetStartState().Doc("1-2-0").
-				Receive(NA(PDUMatcher),
-					NKW(KWTestPDUData, xtob(
-						"01.80"+ //version, network layer
-							"00", //message type, no network
-					)),
-				).Doc("1-2-1").
-				Receive(NA(PDUMatcher),
-					NKW(KWTestPDUData, xtob(
-						"01.80"+ //version, network layer
-							"01 0002", //message type and network list
-					)),
-				).Doc("1-2-2").
-				Success("")
-
-			// nothing received on network 2
-			tnet.sniffer2.GetStartState().Doc("1-3-0").
-				Timeout(3*time.Second, nil).Doc("1-3-1").
-				Success("")
-
-			// nothing received on network 3
-			tnet.sniffer3.GetStartState().Doc("1-4-0").
-				Timeout(3*time.Second, nil).Doc("1-4-1").
-				Success("")
-
-			// run the group
-			tnet.Run(0)
+			synctest.Test(t, func(t *testing.T) {
+				//Test broadcast for any router.
+				ExclusiveGlobalTimeMachine(t)
+
+				// create a network
+				tnet := NewTNetwork2(t)
+
+				// test device sends request, sees response
+				whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)))
+				require.NoError(t, err)
+				tnet.td.GetStartState().Doc("1-1-0").
+					Send(whois, nil).Doc("1-1-1").
+					Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("1-1-2").
+					Success("")
+
+				// sniffer on network 1 sees the request and the response
+				tnet.sniffer1.GetStartState().Doc("1-2-0").
+					Receive(NA(PDUMatcher),
+						NKW(KWTestPDUData, xtob(
+							"01.80"+ //version, network layer
+								"00", //message type, no network
+						)),
+					).Doc("1-2-1").
+					Receive(NA(PDUMatcher),
+						NKW(KWTestPDUData, xtob(
+							"01.80"+ //version, network layer
+								"01 0002", //message type and network list
+						)),
+					).Doc("1-2-2").
+					Success("")
+
+				// nothing received on network 2
+				tnet.sniffer2.GetStartState().Doc("1-3-0").
+					Timeout(3*time.Second, nil).Doc("1-3-1").
+					Success("")
+
+				// nothing received on network 3
+				tnet.sniffer3.GetStartState().Doc("1-4-0").
+					Timeout(3*time.Second, nil).Doc("1-4-1").
+					Success("")
+
+				// run the group
+				tnet.Run(0)
+			})
 		})
 		t.Run("test_02", func(t *testing.T) {
-			//Test broadcast for existing router.
-			ExclusiveGlobalTimeMachine(t)
-			// create a network
-			tnet := NewTNetwork2(t)
-
-			// test device sends request, sees response
-			whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(2))
-			require.NoError(t, err)
-			tnet.td.GetStartState().Doc("2-1-0").
-				Send(whois, nil).Doc("2-1-1").
-				Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("2-1-2").
-				Success("")
-
-			tnet.sniffer1.GetStartState().Success("")
-
-			// nothing received on network 2
-			tnet.sniffer2.GetStartState().Doc("2-2-0").
-				Timeout(3*time.Second, nil).Doc("2-2-1").
-				Success("")
-
-			// nothing received on network 2
-			tnet.sniffer3.GetStartState().Doc("2-3-0").
-				Timeout(3*time.Second, nil).Doc("2-3-1").
-				Success("")
-
-			// run the group
-			tnet.Run(0)
+			synctest.Test(t, func(t *testing.T) {
+				//Test broadcast for existing router.
+				ExclusiveGlobalTimeMachine(t)
+				// create a network
+				tnet := NewTNetwork2(t)
+
+				// test device sends request, sees response
+				whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(2))
+				require.NoError(t, err)
+				tnet.td.GetStartState().Doc("2-1-0").
+					Send(whois, nil).Doc("2-1-1").
+					Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("2-1-2").
+					Success("")
+
+				tnet.sniffer1.GetStartState().Success("")
+
+				// nothing received on network 2
+				tnet.sniffer2.GetStartState().Doc("2-2-0").
+					Timeout(3*time.Second, nil).Doc("2-2-1").
+					Success("")
+
+				// nothing received on network 2
+				tnet.sniffer3.GetStartState().Doc("2-3-0").
+					Timeout(3*time.Second, nil).Doc("2-3-1").
+					Success("")
+
+				// run the group
+				tnet.Run(0)
+			})
 		})
 		t.Run("test_03", func(t *testing.T) {
-			//Test broadcast for non-existing router.
-			ExclusiveGlobalTimeMachine(t)
-			// create a network
-			tnet := NewTNetwork2(t)
-
-			// test device sends request, sees response
-			whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(4))
-			require.NoError(t, err)
-			tnet.td.GetStartState().Doc("3-1-0").
-				Send(whois, nil).Doc("3-1-1").
-				Timeout(3*time.Second, nil).Doc("3-1-2").
-				Success("")
-
-			// sniffer on network 1 sees the request and the response
-			tnet.sniffer1.GetStartState().Doc("3-2-0").
-				Receive(NA(PDUMatcher),
-					NKW(KWTestPDUData, xtob(
-						"01.80"+ //version, network layer
-							"00 0004", //message type, and network
-					)),
-				).Doc("3-2-1").
-				Success("")
-
-			// sniffer on network 2 sees request forwarded by router
-			tnet.sniffer2.GetStartState().Doc("3-3-0").
-				Receive(NA(PDUMatcher),
-					NKW(KWTestPDUData, xtob(
-						"01.88"+ //version, network layer
-							"0001 01 01"+ // snet/slen/sadr
-							"00 0004", //message type, and network
-					)),
-				).Doc("3-3-1").
-				Success("")
-
-			tnet.sniffer3.GetStartState().Doc("3-4-0").
-				Receive(NA(PDUMatcher),
-					NKW(KWTestPDUData, xtob(
-						"01.88"+ //version, network layer
-							"0001 01 01"+ // snet/slen/sadr
-							"00 0004", //message type, and network
-					)),
-				).Doc("3-4-1").
-				Success("")
-
-			// run the group
-			tnet.Run(0)
+			synctest.Test(t, func(t *testing.T) {
+				//Test broadcast for non-existing router.
+				ExclusiveGlobalTimeMachine(t)
+				// create a network
+				tnet := NewTNetwork2(t)
+
+				// test device sends request, sees response
+				whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(4))
+				require.NoError(t, err)
+				tnet.td.GetStartState().Doc("3-1-0").
+					Send(whois, nil).Doc("3-1-1").
+					Timeout(3*time.Second, nil).Doc("3-1-2").
+					Success("")
+
+				// sniffer on network 1 sees the request and the response
+				tnet.sniffer1.GetStartState().Doc("3-2-0").
+					Receive(NA(PDUMatcher),
+						NKW(KWTestPDUData, xtob(
+							"01.80"+ //version, network layer
+								"00 0004", //message type, and network
+						)),
+					).Doc("3-2-1").
+					Success("")
+
+				// sniffer on network 2 sees request forwarded by router
+				tnet.sniffer2.GetStartState().Doc("3-3-0").
+					Receive(NA(PDUMatcher),
+						NKW(KWTestPDUData, xtob(
+							"01.88"+ //version, network layer
+								"0001 01 01"+ // snet/slen/sadr
+								"00 0004", //message type, and network
+						)),
+					).Doc("3-3-1").
+					Success("")
+
+				tnet.sniffer3.GetStartState().Doc("3-4-0").
+					Receive(NA(PDUMatcher),
+						NKW(KWTestPDUData, xtob(
+							"01.88"+ //version, network layer
+								"0001 01 01"+ // snet/slen/sadr
+								"00 0004", //message type, and network
+						)),
+					).Doc("3-4-1").
+					Success("")
+
+				// run the group
+				tnet.Run(0)
+			})
 		})
 	})
 }
diff --git a/plc4go/internal/cbus/Browser_test.go b/plc4go/internal/cbus/Browser_test.go
index 699b2f0fd8..a762976fa8 100644
--- a/plc4go/internal/cbus/Browser_test.go
+++ b/plc4go/internal/cbus/Browser_test.go
@@ -27,6 +27,7 @@ import (
 	"sync"
 	"sync/atomic"
 	"testing"
+	"testing/synctest"
 	"time"
 
 	"github.com/pkg/errors"
@@ -613,21 +614,23 @@ func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if tt.setup != nil {
-				tt.setup(t, &tt.fields, &tt.args)
-			}
-			m := Browser{
-				DefaultBrowser:  tt.fields.DefaultBrowser,
-				connection:      tt.fields.connection,
-				sequenceCounter: tt.fields.sequenceCounter,
-				log:             testutils.ProduceTestingLogger(t),
-			}
-			got, err := m.getInstalledUnitAddressBytes(tt.args.ctx)
-			if !tt.wantErr(t, err, fmt.Sprintf("getInstalledUnitAddressBytes(%v)", tt.args.ctx)) {
-				return
-			}
-			assert.Equalf(t, tt.want, got, "getInstalledUnitAddressBytes(%v)", tt.args.ctx)
-			t.Log("Banananaaaa")
+			synctest.Test(t, func(t *testing.T) {
+				if tt.setup != nil {
+					tt.setup(t, &tt.fields, &tt.args)
+				}
+				m := Browser{
+					DefaultBrowser:  tt.fields.DefaultBrowser,
+					connection:      tt.fields.connection,
+					sequenceCounter: tt.fields.sequenceCounter,
+					log:             testutils.ProduceTestingLogger(t),
+				}
+				got, err := m.getInstalledUnitAddressBytes(tt.args.ctx)
+				if !tt.wantErr(t, err, fmt.Sprintf("getInstalledUnitAddressBytes(%v)", tt.args.ctx)) {
+					return
+				}
+				assert.Equalf(t, tt.want, got, "getInstalledUnitAddressBytes(%v)", tt.args.ctx)
+				t.Log("Banananaaaa")
+			})
 		})
 	}
 }
diff --git a/plc4go/internal/cbus/Connection_test.go b/plc4go/internal/cbus/Connection_test.go
index fac6c4db37..5ac09fa61f 100644
--- a/plc4go/internal/cbus/Connection_test.go
+++ b/plc4go/internal/cbus/Connection_test.go
@@ -26,6 +26,7 @@ import (
 	"sync"
 	"sync/atomic"
 	"testing"
+	"testing/synctest"
 	"time"
 
 	"github.com/stretchr/testify/assert"
@@ -1465,22 +1466,24 @@ func TestConnection_setupConnection(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if tt.setup != nil {
-				tt.setup(t, &tt.fields, &tt.args)
-			}
-			c := &Connection{
-				messageCodec:  tt.fields.messageCodec,
-				subscribers:   tt.fields.subscribers,
-				tm:            tt.fields.tm,
-				configuration: tt.fields.configuration,
-				driverContext: driverContextForTesting(),
-				connectionId:  tt.fields.connectionId,
-				tracer:        tt.fields.tracer,
-				log:           testutils.ProduceTestingLogger(t),
-			}
-			c.DefaultConnection = _default.NewDefaultConnection(c, testutils.EnrichOptionsWithOptionsForTesting(t)...)
-			err := c.setupConnection(tt.args.ctx)
-			tt.wantErr(t, err)
+			synctest.Test(t, func(t *testing.T) {
+				if tt.setup != nil {
+					tt.setup(t, &tt.fields, &tt.args)
+				}
+				c := &Connection{
+					messageCodec:  tt.fields.messageCodec,
+					subscribers:   tt.fields.subscribers,
+					tm:            tt.fields.tm,
+					configuration: tt.fields.configuration,
+					driverContext: driverContextForTesting(),
+					connectionId:  tt.fields.connectionId,
+					tracer:        tt.fields.tracer,
+					log:           testutils.ProduceTestingLogger(t),
+				}
+				c.DefaultConnection = _default.NewDefaultConnection(c, testutils.EnrichOptionsWithOptionsForTesting(t)...)
+				err := c.setupConnection(tt.args.ctx)
+				tt.wantErr(t, err)
+			})
 		})
 	}
 }
diff --git a/plc4go/internal/cbus/MessageCodec_test.go b/plc4go/internal/cbus/MessageCodec_test.go
index 86a33816e9..4668381006 100644
--- a/plc4go/internal/cbus/MessageCodec_test.go
+++ b/plc4go/internal/cbus/MessageCodec_test.go
@@ -24,6 +24,7 @@ import (
 	"fmt"
 	"net/url"
 	"testing"
+	"testing/synctest"
 	"time"
 
 	"github.com/stretchr/testify/assert"
@@ -639,148 +640,154 @@ func TestMessageCodec_Receive(t *testing.T) {
 
 func TestMessageCodec_Receive_Delayed_Response(t *testing.T) {
 	t.Run("instant data", func(t *testing.T) {
-		_options := testutils.EnrichOptionsWithOptionsForTesting(t)
-
-		transport := test.NewTransport(_options...)
-		ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
-		require.NoError(t, err)
-		require.NoError(t, ti.Connect(t.Context()))
-		codec := NewMessageCodec(ti, _options...)
-		t.Cleanup(func() {
-			assert.Error(t, codec.Disconnect())
+		synctest.Test(t, func(t *testing.T) {
+			_options := testutils.EnrichOptionsWithOptionsForTesting(t)
+
+			transport := test.NewTransport(_options...)
+			ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
+			require.NoError(t, err)
+			require.NoError(t, ti.Connect(t.Context()))
+			codec := NewMessageCodec(ti, _options...)
+			t.Cleanup(func() {
+				assert.Error(t, codec.Disconnect())
+			})
+			codec.requestContext = readWriteModel.NewRequestContext(true)
+
+			timeoutCtx := func(timeout time.Duration) context.Context {
+				withTimeout, cancelFunc := context.WithTimeout(t.Context(), timeout)
+				t.Cleanup(cancelFunc)
+				return withTimeout
+			}
+
+			var msg spi.Message
+			msg, err = codec.Receive(timeoutCtx(1 * time.Second))
+			// No data yet so this should return no error and no data
+			assert.NoError(t, err)
+			assert.Nil(t, msg)
+			// Now we add a confirmation
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
+
+			// We should wait for more data, so no error, no message
+			msg, err = codec.Receive(timeoutCtx(1 * time.Second))
+			assert.NoError(t, err)
+			assert.Nil(t, msg)
+
+			// Now we fill in the payload
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
+
+			// We should wait for more data, so no error
+			msg, err = codec.Receive(timeoutCtx(2 * time.Second))
+			assert.NoError(t, err)
+			require.NotNil(t, msg)
+
+			// The message should have a confirmation with an alpha
+			require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
+			assert.True(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha())
 		})
-		codec.requestContext = readWriteModel.NewRequestContext(true)
-
-		timeoutCtx := func(timeout time.Duration) context.Context {
-			withTimeout, cancelFunc := context.WithTimeout(t.Context(), timeout)
-			t.Cleanup(cancelFunc)
-			return withTimeout
-		}
-
-		var msg spi.Message
-		msg, err = codec.Receive(timeoutCtx(1 * time.Second))
-		// No data yet so this should return no error and no data
-		assert.NoError(t, err)
-		assert.Nil(t, msg)
-		// Now we add a confirmation
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
-
-		// We should wait for more data, so no error, no message
-		msg, err = codec.Receive(timeoutCtx(1 * time.Second))
-		assert.NoError(t, err)
-		assert.Nil(t, msg)
-
-		// Now we fill in the payload
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
-
-		// We should wait for more data, so no error
-		msg, err = codec.Receive(timeoutCtx(2 * time.Second))
-		assert.NoError(t, err)
-		require.NotNil(t, msg)
-
-		// The message should have a confirmation with an alpha
-		require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
-		assert.True(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha())
 	})
 	t.Run("data after 6 times", func(t *testing.T) {
-		_options := testutils.EnrichOptionsWithOptionsForTesting(t)
+		t.Run("instant data", func(t *testing.T) {
+			_options := testutils.EnrichOptionsWithOptionsForTesting(t)
 
-		transport := test.NewTransport(_options...)
-		ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
-		require.NoError(t, err)
+			transport := test.NewTransport(_options...)
+			ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
+			require.NoError(t, err)
 
-		require.NoError(t, ti.Connect(t.Context()))
-		codec := NewMessageCodec(ti, _options...)
-		t.Cleanup(func() {
-			assert.Error(t, codec.Disconnect())
-		})
-		codec.requestContext = readWriteModel.NewRequestContext(true)
-
-		canceledCtx := func() context.Context {
-			ctx, cancelFunc := context.WithCancel(t.Context())
-			cancelFunc()
-			return ctx
-		}
-		var msg spi.Message
-		msg, err = codec.Receive(canceledCtx())
-		// No data yet so this should return no error and no data
-		assert.NoError(t, err)
-		assert.Nil(t, msg)
-		// Now we add a confirmation
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
-
-		for i := 0; i < 8; i++ {
-			t.Logf("%d try", i+1)
-			// We should wait for more data, so no error, no message
+			require.NoError(t, ti.Connect(t.Context()))
+			codec := NewMessageCodec(ti, _options...)
+			t.Cleanup(func() {
+				assert.Error(t, codec.Disconnect())
+			})
+			codec.requestContext = readWriteModel.NewRequestContext(true)
+
+			canceledCtx := func() context.Context {
+				ctx, cancelFunc := context.WithCancel(t.Context())
+				cancelFunc()
+				return ctx
+			}
+			var msg spi.Message
 			msg, err = codec.Receive(canceledCtx())
+			// No data yet so this should return no error and no data
 			assert.NoError(t, err)
 			assert.Nil(t, msg)
-		}
+			// Now we add a confirmation
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
 
-		// Now we fill in the payload
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
+			for i := 0; i < 8; i++ {
+				t.Logf("%d try", i+1)
+				// We should wait for more data, so no error, no message
+				msg, err = codec.Receive(canceledCtx())
+				assert.NoError(t, err)
+				assert.Nil(t, msg)
+			}
 
-		// We should wait for more data, so no error, no message
-		msg, err = codec.Receive(t.Context())
-		assert.NoError(t, err)
-		assert.NotNil(t, msg)
+			// Now we fill in the payload
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
 
-		// The message should have a confirmation with an alpha
-		require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
-		cBusMessageToClient := msg.(readWriteModel.CBusMessageToClient)
-		assert.True(t, cBusMessageToClient.GetReply().GetIsAlpha())
+			// We should wait for more data, so no error, no message
+			msg, err = codec.Receive(t.Context())
+			assert.NoError(t, err)
+			assert.NotNil(t, msg)
+
+			// The message should have a confirmation with an alpha
+			require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
+			cBusMessageToClient := msg.(readWriteModel.CBusMessageToClient)
+			assert.True(t, cBusMessageToClient.GetReply().GetIsAlpha())
+		})
 	})
 	t.Run("data after 15 times", func(t *testing.T) {
-		_options := testutils.EnrichOptionsWithOptionsForTesting(t)
+		t.Run("instant data", func(t *testing.T) {
+			_options := testutils.EnrichOptionsWithOptionsForTesting(t)
 
-		transport := test.NewTransport(_options...)
-		ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
-		require.NoError(t, err)
+			transport := test.NewTransport(_options...)
+			ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...)
+			require.NoError(t, err)
 
-		require.NoError(t, ti.Connect(t.Context()))
-		codec := NewMessageCodec(ti, _options...)
-		t.Cleanup(func() {
-			assert.Error(t, codec.Disconnect())
-		})
-		codec.requestContext = readWriteModel.NewRequestContext(true)
-
-		var msg spi.Message
-		msg, err = codec.Receive(t.Context())
-		// No data yet so this should return no error and no data
-		assert.NoError(t, err)
-		assert.Nil(t, msg)
-		// Now we add a confirmation
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
-
-		for i := 0; i <= 15; i++ {
-			t.Logf("%d try", i+1)
-			// We should wait for more data, so no error, no message
+			require.NoError(t, ti.Connect(t.Context()))
+			codec := NewMessageCodec(ti, _options...)
+			t.Cleanup(func() {
+				assert.Error(t, codec.Disconnect())
+			})
+			codec.requestContext = readWriteModel.NewRequestContext(true)
+
+			var msg spi.Message
 			msg, err = codec.Receive(t.Context())
-			if i == 15 {
-				require.NoError(t, err)
-				require.NotNil(t, msg)
-				// This should be the confirmation only ...
-				reply := msg.(readWriteModel.CBusMessageToClient).GetReply()
-				assert.True(t, reply.GetIsAlpha())
-				// ... and no content
-				assert.Nil(t, reply.(readWriteModel.ReplyOrConfirmationConfirmation).GetEmbeddedReply())
-			} else {
-				assert.NoError(t, err)
-				assert.Nil(t, msg, "Got message at %d try", i+1)
+			// No data yet so this should return no error and no data
+			assert.NoError(t, err)
+			assert.Nil(t, msg)
+			// Now we add a confirmation
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("i."))
+
+			for i := 0; i <= 15; i++ {
+				t.Logf("%d try", i+1)
+				// We should wait for more data, so no error, no message
+				msg, err = codec.Receive(t.Context())
+				if i == 15 {
+					require.NoError(t, err)
+					require.NotNil(t, msg)
+					// This should be the confirmation only ...
+					reply := msg.(readWriteModel.CBusMessageToClient).GetReply()
+					assert.True(t, reply.GetIsAlpha())
+					// ... and no content
+					assert.Nil(t, reply.(readWriteModel.ReplyOrConfirmationConfirmation).GetEmbeddedReply())
+				} else {
+					assert.NoError(t, err)
+					assert.Nil(t, msg, "Got message at %d try", i+1)
+				}
 			}
-		}
 
-		// Now we fill in the payload
-		ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
+			// Now we fill in the payload
+			ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n"))
 
-		// We should wait for more data, so no error, no message
-		msg, err = codec.Receive(t.Context())
-		assert.NoError(t, err)
-		assert.NotNil(t, msg)
+			// We should wait for more data, so no error, no message
+			msg, err = codec.Receive(t.Context())
+			assert.NoError(t, err)
+			assert.NotNil(t, msg)
 
-		// The message should have a confirmation without an alpha
-		require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
-		assert.False(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha())
+			// The message should have a confirmation without an alpha
+			require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg)
+			assert.False(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha())
+		})
 	})
 }
 
diff --git a/plc4go/spi/testutils/ParserSerializerTestRunner.go b/plc4go/spi/testutils/ParserSerializerTestRunner.go
index bebef56e57..5d1359da7e 100644
--- a/plc4go/spi/testutils/ParserSerializerTestRunner.go
+++ b/plc4go/spi/testutils/ParserSerializerTestRunner.go
@@ -28,6 +28,7 @@ import (
 	"strconv"
 	"strings"
 	"testing"
+	"testing/synctest"
 
 	"github.com/pkg/errors"
 	"github.com/stretchr/testify/assert"
@@ -207,9 +208,11 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, parser Parser,
 				return
 			}
 			t.Logf("Running testcase %s", testcase.name)
-			if err := testsuite.Run(t, testcase); err != nil {
-				t.Fatalf("\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n\n", err)
-			}
+			synctest.Test(t, func(t *testing.T) {
+				if err := testsuite.Run(t, testcase); err != nil {
+					t.Fatalf("\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n\n", err)
+				}
+			})
 		})
 	}
 	t.Log("Done running testcases")


(plc4x) 04/08: feat(plc4go/spi): add interaction id to better identify failing requests

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 00d8afa7aaf7c3062f2eaa9be6ae3f90f1c2fb02
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 13:17:22 2025 +0100

    feat(plc4go/spi): add interaction id to better identify failing requests
---
 plc4go/internal/ads/DiscoveryMessageCodec.go       |   4 +-
 plc4go/internal/ads/Interactions.go                |  12 +-
 plc4go/internal/ads/MessageCodec.go                |   4 +-
 .../bacnetip/ApplicationLayerMessageCodec.go       |   6 +-
 plc4go/internal/bacnetip/MessageCodec.go           |   4 +-
 plc4go/internal/bacnetip/Reader.go                 |   2 +-
 plc4go/internal/cbus/Browser_test.go               |   2 +-
 plc4go/internal/cbus/Connection.go                 | 136 ++++----
 plc4go/internal/cbus/MessageCodec.go               |   4 +-
 plc4go/internal/cbus/MessageCodec_test.go          |   6 +-
 plc4go/internal/cbus/Reader.go                     |   2 +-
 plc4go/internal/cbus/Writer.go                     |   2 +-
 plc4go/internal/eip/Connection.go                  |  10 +-
 plc4go/internal/eip/MessageCodec.go                |   4 +-
 plc4go/internal/eip/Reader.go                      |   2 +-
 .../knxnetip/ConnectionInternalOperations.go       | 375 +++++++++++----------
 plc4go/internal/knxnetip/Discoverer.go             |   2 +-
 plc4go/internal/knxnetip/MessageCodec.go           |   6 +-
 plc4go/internal/modbus/Connection.go               |   2 +-
 plc4go/internal/modbus/MessageCodec.go             |   4 +-
 plc4go/internal/modbus/Reader.go                   |   2 +-
 plc4go/internal/modbus/Writer.go                   |   2 +-
 plc4go/internal/opcua/MessageCodec.go              |   4 +-
 plc4go/internal/opcua/SecureChannel.go             |  18 +-
 plc4go/internal/s7/Connection.go                   |   6 +-
 plc4go/internal/s7/MessageCodec.go                 |   4 +-
 plc4go/internal/s7/Reader.go                       |   2 +-
 plc4go/internal/s7/Writer.go                       |   2 +-
 plc4go/spi/MessageCodec.go                         |   6 +-
 plc4go/spi/default/DefaultCodec.go                 |  22 +-
 plc4go/spi/default/DefaultCodec_test.go            |  22 +-
 plc4go/spi/default/defaultExpectation.go           |   6 +-
 plc4go/spi/default/mocks_test.go                   | 214 +++++++-----
 plc4go/spi/mocks_test.go                           |  94 +++---
 plc4go/spi/transports/test/TransportInstance.go    |   2 +-
 35 files changed, 545 insertions(+), 450 deletions(-)

diff --git a/plc4go/internal/ads/DiscoveryMessageCodec.go b/plc4go/internal/ads/DiscoveryMessageCodec.go
index 2077790658..1688760948 100644
--- a/plc4go/internal/ads/DiscoveryMessageCodec.go
+++ b/plc4go/internal/ads/DiscoveryMessageCodec.go
@@ -54,8 +54,8 @@ func (m *DiscoveryMessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *DiscoveryMessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *DiscoveryMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpPaket := message.(model.AdsDiscovery)
 	// Serialize the request
diff --git a/plc4go/internal/ads/Interactions.go b/plc4go/internal/ads/Interactions.go
index 5aa02e4286..acfde00629 100644
--- a/plc4go/internal/ads/Interactions.go
+++ b/plc4go/internal/ads/Interactions.go
@@ -42,7 +42,7 @@ func (m *Connection) ExecuteAdsReadDeviceInfoRequest(ctx context.Context) (model
 			}
 		}()
 		request := m.NewAdsReadDeviceInfoRequest()
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "ads_read_device_info_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
@@ -80,7 +80,7 @@ func (m *Connection) ExecuteAdsReadRequest(ctx context.Context, indexGroup uint3
 			}
 		}()
 		request := m.NewAdsReadRequest(indexGroup, indexOffset, length)
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "ads_read_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
@@ -118,7 +118,7 @@ func (m *Connection) ExecuteAdsWriteRequest(ctx context.Context, indexGroup uint
 			}
 		}()
 		request := m.NewAdsWriteRequest(indexGroup, indexOffset, data)
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "execute_ads_write_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
@@ -156,7 +156,7 @@ func (m *Connection) ExecuteAdsReadWriteRequest(ctx context.Context, indexGroup
 			}
 		}()
 		request := m.NewAdsReadWriteRequest(indexGroup, indexOffset, readLength, items, writeData)
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "ads_read_write_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
@@ -194,7 +194,7 @@ func (m *Connection) ExecuteAdsAddDeviceNotificationRequest(ctx context.Context,
 			}
 		}()
 		request := m.NewAdsAddDeviceNotificationRequest(indexGroup, indexOffset, length, transmissionMode, maxDelay, cycleTime)
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "ads_add_device_notification_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
@@ -231,7 +231,7 @@ func (m *Connection) ExecuteAdsDeleteDeviceNotificationRequest(ctx context.Conte
 			}
 		}()
 		request := m.NewAdsDeleteDeviceNotificationRequest(notificationHandle)
-		if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+		if err := m.messageCodec.SendRequest(ctx, "ads_delete_device_notification_request", request, func(message spi.Message) bool {
 			amsTcpPacket, ok := message.(model.AmsTCPPacket)
 			if !ok {
 				return false
diff --git a/plc4go/internal/ads/MessageCodec.go b/plc4go/internal/ads/MessageCodec.go
index 5bf9e1801d..b263adb443 100644
--- a/plc4go/internal/ads/MessageCodec.go
+++ b/plc4go/internal/ads/MessageCodec.go
@@ -67,8 +67,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpPaket := message.(model.AmsTCPPacket)
 	// Serialize the request
diff --git a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
index e99f31c184..77491c3e53 100644
--- a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
+++ b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
@@ -112,7 +112,7 @@ func (m *ApplicationLayerMessageCodec) IsRunning() bool {
 	return m.messageCode.IsRunning()
 }
 
-func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, message spi.Message) error {
+func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
 	address, err := pdu.NewAddress(comp.NewArgs(m.remoteAddress))
 	if err != nil {
 		return err
@@ -141,12 +141,12 @@ func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, message spi.Mes
 	return nil
 }
 
-func (m *ApplicationLayerMessageCodec) Expect(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+func (m *ApplicationLayerMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
 	// TODO: implement me
 	panic("not yet implemented")
 }
 
-func (m *ApplicationLayerMessageCodec) SendRequest(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+func (m *ApplicationLayerMessageCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
 	address, err := pdu.NewAddress(comp.NewArgs(m.remoteAddress))
 	if err != nil {
 		return err
diff --git a/plc4go/internal/bacnetip/MessageCodec.go b/plc4go/internal/bacnetip/MessageCodec.go
index d1ae617be2..f94e3f2bff 100644
--- a/plc4go/internal/bacnetip/MessageCodec.go
+++ b/plc4go/internal/bacnetip/MessageCodec.go
@@ -50,8 +50,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	bvlcPacket := message.(model.BVLC)
 	// Serialize the request
diff --git a/plc4go/internal/bacnetip/Reader.go b/plc4go/internal/bacnetip/Reader.go
index f9604aea46..dc55115712 100644
--- a/plc4go/internal/bacnetip/Reader.go
+++ b/plc4go/internal/bacnetip/Reader.go
@@ -140,7 +140,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 			context.AfterFunc(transactionContext, cancel)
 			// Send the  over the wire
 			m.log.Trace().Msg("Send ")
-			if err := m.messageCodec.SendRequest(ctx, apdu, func(message spi.Message) bool {
+			if err := m.messageCodec.SendRequest(ctx, "read", apdu, func(message spi.Message) bool {
 				bvlc, ok := message.(readWriteModel.BVLC)
 				if !ok {
 					m.log.Debug().Type("bvlc", bvlc).Msg("Received strange type")
diff --git a/plc4go/internal/cbus/Browser_test.go b/plc4go/internal/cbus/Browser_test.go
index a762976fa8..860463a1af 100644
--- a/plc4go/internal/cbus/Browser_test.go
+++ b/plc4go/internal/cbus/Browser_test.go
@@ -538,7 +538,7 @@ func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) {
 				currentState.Store(RESET)
 				stateChangeMutex := sync.Mutex{}
 				transportInstance.(*test.TransportInstance).SetWriteInterceptor(func(transportInstance *test.TransportInstance, data []byte) {
-					t.Logf("reacting to\n%s", hex.Dump(data))
+					t.Logf("reacting to \n%s", hex.Dump(data))
 					t.Logf("current state %d", currentState.Load())
 					stateChangeMutex.Lock()
 					defer stateChangeMutex.Unlock()
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 0c94af79a9..fd8c631629 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -261,80 +261,84 @@ func (c *Connection) setupConnection(ctx context.Context) error {
 
 func (c *Connection) startSubscriptionHandler() {
 	c.log.Debug().Msg("Starting SAL handler")
-	c.handlerWaitGroup.Go(func() {
-		salLogger := c.log.With().Str("handlerType", "SAL").Logger()
-		defer func() {
-			if err := recover(); err != nil {
-				salLogger.Error().
-					Str("stack", string(debug.Stack())).
-					Interface("err", err).
-					Msg("panic-ed")
+	c.handlerWaitGroup.Go(c.handleSAL)
+	c.log.Debug().Msg("Starting MMI handler")
+	c.handlerWaitGroup.Go(c.handleMMI)
+}
+
+func (c *Connection) handleSAL() {
+	salLogger := c.log.With().Str("handlerType", "SAL").Logger()
+	defer func() {
+		if err := recover(); err != nil {
+			salLogger.Error().
+				Str("stack", string(debug.Stack())).
+				Interface("err", err).
+				Msg("panic-ed")
+		}
+	}()
+	salLogger.Debug().Msg("SAL handler started")
+	for c.IsConnected() && c.messageCodec.IsRunning() {
+		for monitoredSal := range c.messageCodec.monitoredSALs {
+			if monitoredSal == nil {
+				salLogger.Trace().Msg("monitoredSal chan closed")
+				break
 			}
-		}()
-		salLogger.Debug().Msg("SAL handler started")
-		for c.IsConnected() && c.messageCodec.IsRunning() {
-			for monitoredSal := range c.messageCodec.monitoredSALs {
-				if monitoredSal == nil {
-					salLogger.Trace().Msg("monitoredSal chan closed")
-					break
-				}
-				salLogger.Trace().
-					Stringer("monitoredSal", monitoredSal).
-					Msg("got a SAL")
-				handled := false
-				for _, subscriber := range c.subscribers {
-					if ok := subscriber.handleMonitoredSAL(monitoredSal); ok {
-						salLogger.Debug().
-							Stringer("monitoredSal", monitoredSal).
-							Stringer("subscriber", subscriber).
-							Msg("handled")
-						handled = true
-					}
-				}
-				if !handled {
+			salLogger.Trace().
+				Stringer("monitoredSal", monitoredSal).
+				Msg("got a SAL")
+			handled := false
+			for _, subscriber := range c.subscribers {
+				if ok := subscriber.handleMonitoredSAL(monitoredSal); ok {
 					salLogger.Debug().
 						Stringer("monitoredSal", monitoredSal).
-						Msg("SAL was not handled")
+						Stringer("subscriber", subscriber).
+						Msg("handled")
+					handled = true
 				}
 			}
+			if !handled {
+				salLogger.Debug().
+					Stringer("monitoredSal", monitoredSal).
+					Msg("SAL was not handled")
+			}
 		}
-		salLogger.Info().Msg("handler ended")
-	})
-	c.log.Debug().Msg("Starting MMI handler")
-	c.handlerWaitGroup.Go(func() {
-		mmiLogger := c.log.With().Str("handlerType", "MMI").Logger()
-		defer func() {
-			if err := recover(); err != nil {
-				mmiLogger.Error().
-					Str("stack", string(debug.Stack())).
-					Interface("err", err).
-					Msg("panic-ed")
+	}
+	salLogger.Info().Msg("handler ended")
+}
+
+func (c *Connection) handleMMI() {
+	mmiLogger := c.log.With().Str("handlerType", "MMI").Logger()
+	defer func() {
+		if err := recover(); err != nil {
+			mmiLogger.Error().
+				Str("stack", string(debug.Stack())).
+				Interface("err", err).
+				Msg("panic-ed")
+		}
+	}()
+	mmiLogger.Debug().Msg("default MMI started")
+	for c.IsConnected() && c.messageCodec.IsRunning() {
+		for calReply := range c.messageCodec.monitoredMMIs {
+			if calReply == nil {
+				mmiLogger.Trace().Msg("channel closed")
+				break
 			}
-		}()
-		mmiLogger.Debug().Msg("default MMI started")
-		for c.IsConnected() && c.messageCodec.IsRunning() {
-			for calReply := range c.messageCodec.monitoredMMIs {
-				if calReply == nil {
-					mmiLogger.Trace().Msg("channel closed")
-					break
-				}
-				mmiLogger.Trace().Msg("got a MMI")
-				handled := false
-				for _, subscriber := range c.subscribers {
-					if ok := subscriber.handleMonitoredMMI(calReply); ok {
-						mmiLogger.Debug().
-							Stringer("subscriber", subscriber).
-							Msg("handled")
-						handled = true
-					}
-				}
-				if !handled {
-					mmiLogger.Debug().Msg("MMI was not handled")
+			mmiLogger.Trace().Msg("got a MMI")
+			handled := false
+			for _, subscriber := range c.subscribers {
+				if ok := subscriber.handleMonitoredMMI(calReply); ok {
+					mmiLogger.Debug().
+						Stringer("subscriber", subscriber).
+						Msg("handled")
+					handled = true
 				}
 			}
+			if !handled {
+				mmiLogger.Debug().Msg("MMI was not handled")
+			}
 		}
-		mmiLogger.Info().Msg("handler ended")
-	})
+	}
+	mmiLogger.Info().Msg("handler ended")
 }
 
 func (c *Connection) sendReset(ctx context.Context) error {
@@ -355,7 +359,7 @@ func (c *Connection) sendReset(ctx context.Context) error {
 
 	receivedResetEchoChan := make(chan bool, 1)
 	receivedResetEchoErrorChan := make(chan error, 1)
-	if err := c.messageCodec.SendRequest(ctx, cBusMessage, func(message spi.Message) bool {
+	if err := c.messageCodec.SendRequest(ctx, "send_reset", cBusMessage, func(message spi.Message) bool {
 		c.log.Trace().Msg("Checking message")
 		switch message := message.(type) {
 		case readWriteModel.CBusMessageToClient:
@@ -505,7 +509,7 @@ func (c *Connection) sendCalDataWrite(ctx context.Context, paramNo readWriteMode
 
 	directCommandAckChan := make(chan bool, 1)
 	directCommandAckErrorChan := make(chan error, 1)
-	if err := c.messageCodec.SendRequest(ctx, cBusMessage, func(message spi.Message) bool {
+	if err := c.messageCodec.SendRequest(ctx, "send_cal_data_write", cBusMessage, func(message spi.Message) bool {
 		switch message := message.(type) {
 		case readWriteModel.CBusMessageToClient:
 			switch reply := message.GetReply().(type) {
diff --git a/plc4go/internal/cbus/MessageCodec.go b/plc4go/internal/cbus/MessageCodec.go
index bfe8b17bd2..55783800ff 100644
--- a/plc4go/internal/cbus/MessageCodec.go
+++ b/plc4go/internal/cbus/MessageCodec.go
@@ -98,8 +98,8 @@ func (m *MessageCodec) Disconnect() error {
 	return err
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Interface("message", message).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Interface("message", message).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	cbusMessage, ok := message.(readWriteModel.CBusMessage)
 	if !ok {
diff --git a/plc4go/internal/cbus/MessageCodec_test.go b/plc4go/internal/cbus/MessageCodec_test.go
index 4668381006..100c058932 100644
--- a/plc4go/internal/cbus/MessageCodec_test.go
+++ b/plc4go/internal/cbus/MessageCodec_test.go
@@ -48,7 +48,9 @@ func TestMessageCodec_Send(t *testing.T) {
 		monitoredSALs  chan readWriteModel.MonitoredSAL
 	}
 	type args struct {
-		message spi.Message
+		ctx           context.Context
+		interactionId string
+		message       spi.Message
 	}
 	tests := []struct {
 		name    string
@@ -105,7 +107,7 @@ func TestMessageCodec_Send(t *testing.T) {
 				monitoredMMIs:  tt.fields.monitoredMMIs,
 				monitoredSALs:  tt.fields.monitoredSALs,
 			}
-			tt.wantErr(t, m.Send(t.Context(), tt.args.message), fmt.Sprintf("Send(%v)", tt.args.message))
+			tt.wantErr(t, m.Send(t.Context(), t.Name(), tt.args.message), fmt.Sprintf("Send(%v)", tt.args.message))
 		})
 	}
 }
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index ae000b785b..0639e33462 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -142,7 +142,7 @@ func (m *Reader) createMessageTransactionAndWait(ctx context.Context, messageToS
 func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transactions.RequestTransaction, messageToSend readWriteModel.CBusMessage, addResponseCode func(name string, responseCode apiModel.PlcResponseCode), tagName string, addPlcValue func(name string, plcValue apiValues.PlcValue)) {
 	// Send the over the wire
 	m.log.Trace().Msg("send over the wire")
-	if err := m.messageCodec.SendRequest(ctx, messageToSend, func(cbusMessage spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_generic_read_message", messageToSend, func(cbusMessage spi.Message) bool {
 		m.log.Trace().Type("cbusMessageType", cbusMessage).Msg("Checking")
 		messageToClient, ok := cbusMessage.(readWriteModel.CBusMessageToClient)
 		if !ok {
diff --git a/plc4go/internal/cbus/Writer.go b/plc4go/internal/cbus/Writer.go
index 27bbbd737e..fa8b225fb8 100644
--- a/plc4go/internal/cbus/Writer.go
+++ b/plc4go/internal/cbus/Writer.go
@@ -118,7 +118,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 				context.AfterFunc(transactionContext, cancel)
 				// Send the  over the wire
 				m.log.Trace().Msg("Send ")
-				if err := m.messageCodec.SendRequest(ctx, messageToSend, func(receivedMessage spi.Message) bool {
+				if err := m.messageCodec.SendRequest(ctx, "write", messageToSend, func(receivedMessage spi.Message) bool {
 					cbusMessage, ok := receivedMessage.(readWriteModel.CBusMessage)
 					if !ok {
 						return false
diff --git a/plc4go/internal/eip/Connection.go b/plc4go/internal/eip/Connection.go
index b0b8926b6b..f960aef0ac 100644
--- a/plc4go/internal/eip/Connection.go
+++ b/plc4go/internal/eip/Connection.go
@@ -157,7 +157,7 @@ func (c *Connection) Close() error {
 	ctx, cancelFunc := context.WithTimeout(ctx, 5*time.Second)
 	defer cancelFunc()
 	c.log.Debug().Msg("Sending UnregisterSession EIP Packet")
-	if err := c.messageCodec.SendRequest(ctx, readWriteModel.NewEipDisconnectRequest(c.sessionHandle, 0, []byte(DefaultSenderContext), 0), func(message spi.Message) bool {
+	if err := c.messageCodec.SendRequest(ctx, "close_eip_disconnect_request", readWriteModel.NewEipDisconnectRequest(c.sessionHandle, 0, []byte(DefaultSenderContext), 0), func(message spi.Message) bool {
 		return true
 	}, func(message spi.Message) error {
 		return nil
@@ -203,7 +203,7 @@ func (c *Connection) listServiceRequest(ctx context.Context) error {
 	c.log.Debug().Msg("Sending ListServices Request")
 	listServicesResultChan := make(chan readWriteModel.ListServicesResponse, 1)
 	listServicesResultErrorChan := make(chan error, 1)
-	if err := c.messageCodec.SendRequest(ctx, readWriteModel.NewListServicesRequest(
+	if err := c.messageCodec.SendRequest(ctx, "list_service_request", readWriteModel.NewListServicesRequest(
 		EmptySessionHandle,
 		uint32(readWriteModel.CIPStatus_Success),
 		[]byte(DefaultSenderContext),
@@ -251,7 +251,7 @@ func (c *Connection) connectRegisterSession(ctx context.Context) error {
 	c.log.Debug().Msg("Sending EipConnectionRequest")
 	connectionResponseChan := make(chan readWriteModel.EipConnectionResponse, 1)
 	connectionResponseErrorChan := make(chan error, 1)
-	if err := c.messageCodec.SendRequest(ctx, readWriteModel.NewEipConnectionRequest(
+	if err := c.messageCodec.SendRequest(ctx, "connect_register_session", readWriteModel.NewEipConnectionRequest(
 		EmptySessionHandle,
 		uint32(readWriteModel.CIPStatus_Success),
 		[]byte(DefaultSenderContext),
@@ -299,7 +299,7 @@ func (c *Connection) connectRegisterSession(ctx context.Context) error {
 				0,
 				typeIds,
 			)
-			if err := c.messageCodec.SendRequest(ctx, eipWrapper, func(message spi.Message) bool {
+			if err := c.messageCodec.SendRequest(ctx, "todo_what_is_this", eipWrapper, func(message spi.Message) bool {
 				eipPacket := message.(readWriteModel.EipPacket)
 				if eipPacket == nil {
 					return false
@@ -364,7 +364,7 @@ func (c *Connection) listAllAttributes(ctx context.Context) error {
 	listAllAttributesErrorChan := make(chan error, 1)
 	classSegment := readWriteModel.NewLogicalSegment(readWriteModel.NewClassID(uint8(0), uint8(2)))
 	instanceSegment := readWriteModel.NewLogicalSegment(readWriteModel.NewInstanceID(uint8(0), uint8(1)))
-	if err := c.messageCodec.SendRequest(ctx, readWriteModel.NewCipRRData(
+	if err := c.messageCodec.SendRequest(ctx, "list_all_attributes", readWriteModel.NewCipRRData(
 		c.sessionHandle,
 		uint32(readWriteModel.CIPStatus_Success),
 		c.senderContext,
diff --git a/plc4go/internal/eip/MessageCodec.go b/plc4go/internal/eip/MessageCodec.go
index eb7fa8cf16..0ca7459d79 100644
--- a/plc4go/internal/eip/MessageCodec.go
+++ b/plc4go/internal/eip/MessageCodec.go
@@ -55,8 +55,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	eipPacket := message.(model.EipPacket)
 	// Serialize the request
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index 5cc4d6c49d..70f0628e0e 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -110,7 +110,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 			transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 				ctx, cancel := context.WithCancel(ctx)
 				context.AfterFunc(transactionContext, cancel)
-				if err := m.messageCodec.SendRequest(ctx, request, func(message spi.Message) bool {
+				if err := m.messageCodec.SendRequest(ctx, "read", request, func(message spi.Message) bool {
 					eipPacket := message.(readWriteModel.EipPacket)
 					if eipPacket == nil {
 						return false
diff --git a/plc4go/internal/knxnetip/ConnectionInternalOperations.go b/plc4go/internal/knxnetip/ConnectionInternalOperations.go
index 7eda53bfba..34f0a872ce 100644
--- a/plc4go/internal/knxnetip/ConnectionInternalOperations.go
+++ b/plc4go/internal/knxnetip/ConnectionInternalOperations.go
@@ -57,7 +57,7 @@ func (m *Connection) sendGatewaySearchRequest(ctx context.Context) (driverModel.
 
 	result := make(chan driverModel.SearchResponse, 1)
 	errorResult := make(chan error, 1)
-	if err = m.messageCodec.SendRequest(ctx, searchRequest, func(message spi.Message) bool {
+	if err = m.messageCodec.SendRequest(ctx, "gateway_search_request", searchRequest, func(message spi.Message) bool {
 		_, ok := message.(driverModel.SearchResponse)
 		return ok
 	}, func(message spi.Message) error {
@@ -102,7 +102,7 @@ func (m *Connection) sendGatewayConnectionRequest(ctx context.Context) (driverMo
 
 	result := make(chan driverModel.ConnectionResponse, 1)
 	errorResult := make(chan error, 1)
-	if err = m.messageCodec.SendRequest(ctx, connectionRequest, func(message spi.Message) bool {
+	if err = m.messageCodec.SendRequest(ctx, "gateway_connection_request", connectionRequest, func(message spi.Message) bool {
 		_, ok := message.(driverModel.ConnectionResponse)
 		return ok
 	}, func(message spi.Message) error {
@@ -147,7 +147,7 @@ func (m *Connection) sendGatewayDisconnectionRequest(ctx context.Context) (drive
 
 	result := make(chan driverModel.DisconnectResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, disconnectRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "disconnect_request", disconnectRequest, func(message spi.Message) bool {
 		_, ok := message.(driverModel.DisconnectResponse)
 		return ok
 	}, func(message spi.Message) error {
@@ -189,7 +189,7 @@ func (m *Connection) sendConnectionStateRequest(ctx context.Context) (driverMode
 
 	result := make(chan driverModel.ConnectionStateResponse, 1)
 	errorResult := make(chan error, 1)
-	err = m.messageCodec.SendRequest(ctx, connectionStateRequest, func(message spi.Message) bool {
+	err = m.messageCodec.SendRequest(ctx, "connection_state_request", connectionStateRequest, func(message spi.Message) bool {
 		_, ok := message.(driverModel.ConnectionStateResponse)
 		return ok
 	}, func(message spi.Message) error {
@@ -246,7 +246,7 @@ func (m *Connection) sendGroupAddressReadRequest(ctx context.Context, groupAddre
 
 	result := make(chan driverModel.ApduDataGroupValueResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, groupAddressReadRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_group_address_read_request", groupAddressReadRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -326,7 +326,7 @@ func (m *Connection) sendDeviceConnectionRequest(ctx context.Context, targetAddr
 
 	result := make(chan driverModel.ApduControlConnect, 1)
 	errorResult := make(chan error, 1)
-	err := m.messageCodec.SendRequest(ctx, deviceConnectionRequest, func(message spi.Message) bool {
+	err := m.messageCodec.SendRequest(ctx, "send_device_connection_request", deviceConnectionRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -415,7 +415,7 @@ func (m *Connection) sendDeviceDisconnectionRequest(ctx context.Context, targetA
 
 	result := make(chan driverModel.ApduControlDisconnect, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, deviceDisconnectionRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_device_disconnection_request", deviceDisconnectionRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -514,7 +514,7 @@ func (m *Connection) sendDeviceAuthentication(ctx context.Context, targetAddress
 
 	result := make(chan driverModel.ApduDataExtAuthorizeResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, deviceAuthenticationRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_device_authentication", deviceAuthenticationRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -624,7 +624,7 @@ func (m *Connection) sendDeviceDeviceDescriptorReadRequest(ctx context.Context,
 
 	result := make(chan driverModel.ApduDataDeviceDescriptorResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, deviceDescriptorReadRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_device_descriptor_read_request", deviceDescriptorReadRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -727,7 +727,7 @@ func (m *Connection) sendDevicePropertyReadRequest(ctx context.Context, targetAd
 
 	result := make(chan driverModel.ApduDataExtPropertyValueResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, propertyReadRequest, func(message spi.Message) bool {
+	if err := m.messageCodec.SendRequest(ctx, "send_device_property_read_request", propertyReadRequest, func(message spi.Message) bool {
 		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
 		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
 			return false
@@ -835,70 +835,77 @@ func (m *Connection) sendDevicePropertyDescriptionReadRequest(ctx context.Contex
 
 	result := make(chan driverModel.ApduDataExtPropertyDescriptionResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, propertyReadRequest, func(message spi.Message) bool {
-		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
-		if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
-			return false
-		}
-		lDataInd, ok := tunnelingRequest.GetCemi().(driverModel.LDataInd)
-		if !ok {
-			return false
-		}
-		dataFrameExt, ok := lDataInd.GetDataFrame().(driverModel.LDataExtended)
-		if !ok {
-			return false
-		}
-		// Check if the address matches
-		if dataFrameExt.GetSourceAddress() != targetAddress {
-			return false
-		}
-		// Check if the counter matches
-		if dataFrameExt.GetApdu().GetCounter() != counter {
-			return false
-		}
-		dataContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
-		if !ok {
-			return false
-		}
-		dataApduOther, ok := dataContainer.GetDataApdu().(driverModel.ApduDataOther)
-		if !ok {
-			return false
-		}
-		propertyDescriptionResponse, ok := dataApduOther.GetExtendedApdu().(driverModel.ApduDataExtPropertyDescriptionResponse)
-		if !ok {
-			return false
-		}
-		return propertyDescriptionResponse.GetObjectIndex() == objectId && propertyDescriptionResponse.GetPropertyId() == propertyId
-	}, func(message spi.Message) error {
-		tunnelingRequest := message.(driverModel.TunnelingRequest)
-		lDataInd := tunnelingRequest.GetCemi().(driverModel.LDataInd)
-		dataFrameExt := lDataInd.GetDataFrame().(driverModel.LDataExtended)
-		dataContainer := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
-		dataApduOther := dataContainer.GetDataApdu().(driverModel.ApduDataOther)
-		propertyDescriptionResponse := dataApduOther.GetExtendedApdu().(driverModel.ApduDataExtPropertyDescriptionResponse)
-
-		// Acknowledge the receipt
-		_ = m.sendDeviceAck(ctx, targetAddress, dataFrameExt.GetApdu().GetCounter(), func(err error) {
-			// If the error flag is set, there was an error authenticating
-			if lDataInd.GetDataFrame().GetErrorFlag() {
-				errorResult <- errors.Errorf("error reading property description from device: %s", KnxAddressToString(targetAddress))
-			} else if err != nil {
-				errorResult <- errors.Wrapf(err, "error sending ack to device: %s", KnxAddressToString(targetAddress))
-			} else {
-				result <- propertyDescriptionResponse
+	if err := m.messageCodec.SendRequest(
+		ctx,
+		"send_device_property_description_read_request",
+		propertyReadRequest,
+		func(message spi.Message) bool {
+			tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
+			if !ok || tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
+				return false
 			}
-		})
-
-		return nil
-	}, func(err error) error {
-		// If this is a timeout, do a check if the connection requires a reconnection
-		var timeoutError utils.TimeoutError
-		if errors.As(err, &timeoutError) {
-			m.handleTimeout()
-		}
-		errorResult <- errors.Wrapf(err, "got error processing request")
-		return nil
-	}); err != nil {
+			lDataInd, ok := tunnelingRequest.GetCemi().(driverModel.LDataInd)
+			if !ok {
+				return false
+			}
+			dataFrameExt, ok := lDataInd.GetDataFrame().(driverModel.LDataExtended)
+			if !ok {
+				return false
+			}
+			// Check if the address matches
+			if dataFrameExt.GetSourceAddress() != targetAddress {
+				return false
+			}
+			// Check if the counter matches
+			if dataFrameExt.GetApdu().GetCounter() != counter {
+				return false
+			}
+			dataContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
+			if !ok {
+				return false
+			}
+			dataApduOther, ok := dataContainer.GetDataApdu().(driverModel.ApduDataOther)
+			if !ok {
+				return false
+			}
+			propertyDescriptionResponse, ok := dataApduOther.GetExtendedApdu().(driverModel.ApduDataExtPropertyDescriptionResponse)
+			if !ok {
+				return false
+			}
+			return propertyDescriptionResponse.GetObjectIndex() == objectId && propertyDescriptionResponse.GetPropertyId() == propertyId
+		},
+		func(message spi.Message) error {
+			tunnelingRequest := message.(driverModel.TunnelingRequest)
+			lDataInd := tunnelingRequest.GetCemi().(driverModel.LDataInd)
+			dataFrameExt := lDataInd.GetDataFrame().(driverModel.LDataExtended)
+			dataContainer := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
+			dataApduOther := dataContainer.GetDataApdu().(driverModel.ApduDataOther)
+			propertyDescriptionResponse := dataApduOther.GetExtendedApdu().(driverModel.ApduDataExtPropertyDescriptionResponse)
+
+			// Acknowledge the receipt
+			_ = m.sendDeviceAck(ctx, targetAddress, dataFrameExt.GetApdu().GetCounter(), func(err error) {
+				// If the error flag is set, there was an error authenticating
+				if lDataInd.GetDataFrame().GetErrorFlag() {
+					errorResult <- errors.Errorf("error reading property description from device: %s", KnxAddressToString(targetAddress))
+				} else if err != nil {
+					errorResult <- errors.Wrapf(err, "error sending ack to device: %s", KnxAddressToString(targetAddress))
+				} else {
+					result <- propertyDescriptionResponse
+				}
+			})
+
+			return nil
+		},
+		func(err error) error {
+			// If this is a timeout, do a check if the connection requires a reconnection
+			var timeoutError utils.TimeoutError
+			if errors.As(err, &timeoutError) {
+				m.handleTimeout()
+			}
+			errorResult <- errors.Wrapf(err, "got error processing request")
+			return nil
+		},
+	); err != nil {
 		return nil, errors.Wrap(err, "got error sending property description read request")
 	}
 
@@ -942,67 +949,74 @@ func (m *Connection) sendDeviceMemoryReadRequest(ctx context.Context, targetAddr
 
 	result := make(chan driverModel.ApduDataMemoryResponse, 1)
 	errorResult := make(chan error, 1)
-	if err := m.messageCodec.SendRequest(ctx, propertyReadRequest, func(message spi.Message) bool {
-		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
-		if !ok ||
-			tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
-			return false
-		}
-		lDataInd, ok := tunnelingRequest.GetCemi().(driverModel.LDataInd)
-		if !ok {
-			return false
-		}
-		dataFrameExt, ok := lDataInd.GetDataFrame().(driverModel.LDataExtended)
-		if !ok {
-			return false
-		}
-		dataContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
-		if !ok {
-			return false
-		}
-		dataApduMemoryResponse, ok := dataContainer.GetDataApdu().(driverModel.ApduDataMemoryResponse)
-		if !ok {
-			return false
-		}
-
-		// Check if the address matches
-		if dataFrameExt.GetSourceAddress() != targetAddress {
-			return false
-		}
-		// Check if the counter matches
-		if dataFrameExt.GetApdu().GetCounter() != counter {
-			return false
-		}
-		return dataApduMemoryResponse.GetAddress() == address
-	}, func(message spi.Message) error {
-		tunnelingRequest := message.(driverModel.TunnelingRequest)
-		lDataInd := tunnelingRequest.GetCemi().(driverModel.LDataInd)
-		dataFrameExt := lDataInd.GetDataFrame().(driverModel.LDataExtended)
-		dataContainer := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
-		dataApduMemoryResponse := dataContainer.GetDataApdu().(driverModel.ApduDataMemoryResponse)
-
-		// Acknowledge the receipt
-		_ = m.sendDeviceAck(ctx, targetAddress, dataFrameExt.GetApdu().GetCounter(), func(err error) {
-			// If the error flag is set, there was an error authenticating
-			if lDataInd.GetDataFrame().GetErrorFlag() {
-				errorResult <- errors.Errorf("error reading memory from device: %s", KnxAddressToString(targetAddress))
-			} else if err != nil {
-				errorResult <- errors.Errorf("error sending ack to device: %s", KnxAddressToString(targetAddress))
-			} else {
-				result <- dataApduMemoryResponse
+	if err := m.messageCodec.SendRequest(
+		ctx,
+		"send_device_memory_read_request",
+		propertyReadRequest,
+		func(message spi.Message) bool {
+			tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
+			if !ok ||
+				tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
+				return false
+			}
+			lDataInd, ok := tunnelingRequest.GetCemi().(driverModel.LDataInd)
+			if !ok {
+				return false
+			}
+			dataFrameExt, ok := lDataInd.GetDataFrame().(driverModel.LDataExtended)
+			if !ok {
+				return false
+			}
+			dataContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
+			if !ok {
+				return false
+			}
+			dataApduMemoryResponse, ok := dataContainer.GetDataApdu().(driverModel.ApduDataMemoryResponse)
+			if !ok {
+				return false
 			}
-		})
 
-		return nil
-	}, func(err error) error {
-		// If this is a timeout, do a check if the connection requires a reconnection
-		var timeoutError utils.TimeoutError
-		if errors.As(err, &timeoutError) {
-			m.handleTimeout()
-		}
-		errorResult <- errors.Wrap(err, "got error processing request")
-		return nil
-	}); err != nil {
+			// Check if the address matches
+			if dataFrameExt.GetSourceAddress() != targetAddress {
+				return false
+			}
+			// Check if the counter matches
+			if dataFrameExt.GetApdu().GetCounter() != counter {
+				return false
+			}
+			return dataApduMemoryResponse.GetAddress() == address
+		},
+		func(message spi.Message) error {
+			tunnelingRequest := message.(driverModel.TunnelingRequest)
+			lDataInd := tunnelingRequest.GetCemi().(driverModel.LDataInd)
+			dataFrameExt := lDataInd.GetDataFrame().(driverModel.LDataExtended)
+			dataContainer := dataFrameExt.GetApdu().(driverModel.ApduDataContainer)
+			dataApduMemoryResponse := dataContainer.GetDataApdu().(driverModel.ApduDataMemoryResponse)
+
+			// Acknowledge the receipt
+			_ = m.sendDeviceAck(ctx, targetAddress, dataFrameExt.GetApdu().GetCounter(), func(err error) {
+				// If the error flag is set, there was an error authenticating
+				if lDataInd.GetDataFrame().GetErrorFlag() {
+					errorResult <- errors.Errorf("error reading memory from device: %s", KnxAddressToString(targetAddress))
+				} else if err != nil {
+					errorResult <- errors.Errorf("error sending ack to device: %s", KnxAddressToString(targetAddress))
+				} else {
+					result <- dataApduMemoryResponse
+				}
+			})
+
+			return nil
+		},
+		func(err error) error {
+			// If this is a timeout, do a check if the connection requires a reconnection
+			var timeoutError utils.TimeoutError
+			if errors.As(err, &timeoutError) {
+				m.handleTimeout()
+			}
+			errorResult <- errors.Wrap(err, "got error processing request")
+			return nil
+		},
+	); err != nil {
 		return nil, errors.Wrap(err, "got error sending memory read request")
 	}
 
@@ -1035,51 +1049,58 @@ func (m *Connection) sendDeviceAck(ctx context.Context, targetAddress driverMode
 		),
 	)
 
-	if err := m.messageCodec.SendRequest(ctx, ack, func(message spi.Message) bool {
-		tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
-		if !ok ||
-			tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
-			return false
-		}
-		lDataCon, ok := tunnelingRequest.GetCemi().(driverModel.LDataCon)
-		if !ok {
-			return false
-		}
-		dataFrameExt, ok := lDataCon.GetDataFrame().(driverModel.LDataExtended)
-		if !ok {
-			return false
-		}
-		// Check if the addresses match
-		if dataFrameExt.GetSourceAddress() != m.ClientKnxAddress {
-			return false
-		}
-		ctxForModel := options.GetLoggerContextForModel(ctx, m.log, options.WithPassLoggerToModel(m.passLogToModel))
-		curTargetAddress := ByteArrayToKnxAddress(ctxForModel, dataFrameExt.GetDestinationAddress())
-		if curTargetAddress != targetAddress {
-			return false
-		}
-		// Check if the counter matches
-		if dataFrameExt.GetApdu().GetCounter() != counter {
-			return false
-		}
-		controlContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduControlContainer)
-		if !ok {
-			return false
-		}
-		_, ok = controlContainer.GetControlApdu().(driverModel.ApduControlAck)
-		return ok
-	}, func(message spi.Message) error {
-		callback(nil)
-		return nil
-	}, func(err error) error {
-		// If this is a timeout, do a check if the connection requires a reconnection
-		var timeoutError utils.TimeoutError
-		if errors.As(err, &timeoutError) {
-			m.handleTimeout()
-		}
-		callback(errors.Wrap(err, "got error processing request"))
-		return nil
-	}); err != nil {
+	if err := m.messageCodec.SendRequest(
+		ctx,
+		"send_device_ack",
+		ack,
+		func(message spi.Message) bool {
+			tunnelingRequest, ok := message.(driverModel.TunnelingRequest)
+			if !ok ||
+				tunnelingRequest.GetTunnelingRequestDataBlock().GetCommunicationChannelId() != m.CommunicationChannelId {
+				return false
+			}
+			lDataCon, ok := tunnelingRequest.GetCemi().(driverModel.LDataCon)
+			if !ok {
+				return false
+			}
+			dataFrameExt, ok := lDataCon.GetDataFrame().(driverModel.LDataExtended)
+			if !ok {
+				return false
+			}
+			// Check if the addresses match
+			if dataFrameExt.GetSourceAddress() != m.ClientKnxAddress {
+				return false
+			}
+			ctxForModel := options.GetLoggerContextForModel(ctx, m.log, options.WithPassLoggerToModel(m.passLogToModel))
+			curTargetAddress := ByteArrayToKnxAddress(ctxForModel, dataFrameExt.GetDestinationAddress())
+			if curTargetAddress != targetAddress {
+				return false
+			}
+			// Check if the counter matches
+			if dataFrameExt.GetApdu().GetCounter() != counter {
+				return false
+			}
+			controlContainer, ok := dataFrameExt.GetApdu().(driverModel.ApduControlContainer)
+			if !ok {
+				return false
+			}
+			_, ok = controlContainer.GetControlApdu().(driverModel.ApduControlAck)
+			return ok
+		},
+		func(message spi.Message) error {
+			callback(nil)
+			return nil
+		},
+		func(err error) error {
+			// If this is a timeout, do a check if the connection requires a reconnection
+			var timeoutError utils.TimeoutError
+			if errors.As(err, &timeoutError) {
+				m.handleTimeout()
+			}
+			callback(errors.Wrap(err, "got error processing request"))
+			return nil
+		},
+	); err != nil {
 		return errors.Wrap(err, "got error sending ack request")
 	}
 
diff --git a/plc4go/internal/knxnetip/Discoverer.go b/plc4go/internal/knxnetip/Discoverer.go
index d63501e901..af96d746b7 100644
--- a/plc4go/internal/knxnetip/Discoverer.go
+++ b/plc4go/internal/knxnetip/Discoverer.go
@@ -232,7 +232,7 @@ func (d *Discoverer) createDeviceScanDispatcher(ctx context.Context, udpTranspor
 			driverModel.HostProtocolCode_IPV4_UDP, localAddr, uint16(localAddress.Port))
 		searchRequestMessage := driverModel.NewSearchRequest(discoveryEndpoint)
 		// Send the search request.
-		if err := codec.Send(ctx, searchRequestMessage); err != nil {
+		if err := codec.Send(ctx, "device_scan_search_request", searchRequestMessage); err != nil {
 			d.log.Debug().Err(err).Interface("searchRequestMessage", searchRequestMessage).Msg("Error sending message")
 			return
 		}
diff --git a/plc4go/internal/knxnetip/MessageCodec.go b/plc4go/internal/knxnetip/MessageCodec.go
index 57d609ed46..c7778606ac 100644
--- a/plc4go/internal/knxnetip/MessageCodec.go
+++ b/plc4go/internal/knxnetip/MessageCodec.go
@@ -62,8 +62,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	knxMessage := message.(model.KnxNetIpMessage)
 	// Serialize the request
@@ -134,7 +134,7 @@ func CustomMessageHandling(localLog zerolog.Logger) _default.CustomMessageHandle
 					tunnelingRequest.GetTunnelingRequestDataBlock().GetSequenceCounter(),
 					model.Status_NO_ERROR),
 			)
-			err := codec.Send(ctx, response) // TODO: where is a good place to get this timeout from?
+			err := codec.Send(ctx, "tunneling_request", response) // TODO: where is a good place to get this timeout from?
 			if err != nil {
 				localLog.Warn().Err(err).Msg("got an error sending ACK from transport")
 			}
diff --git a/plc4go/internal/modbus/Connection.go b/plc4go/internal/modbus/Connection.go
index 329d4c140f..2deb222122 100644
--- a/plc4go/internal/modbus/Connection.go
+++ b/plc4go/internal/modbus/Connection.go
@@ -110,7 +110,7 @@ func (c *Connection) Ping(ctx context.Context) error {
 	successChan := make(chan struct{}, 1)
 	diagnosticRequestPdu := readWriteModel.NewModbusPDUDiagnosticRequest(0, 0x42)
 	pingRequest := readWriteModel.NewModbusTcpADU(1, c.unitIdentifier, diagnosticRequestPdu)
-	if err := c.messageCodec.SendRequest(ctx, pingRequest, func(message spi.Message) bool {
+	if err := c.messageCodec.SendRequest(ctx, "ping", pingRequest, func(message spi.Message) bool {
 		responseAdu, ok := message.(readWriteModel.ModbusTcpADU)
 		if !ok {
 			return false
diff --git a/plc4go/internal/modbus/MessageCodec.go b/plc4go/internal/modbus/MessageCodec.go
index ded3d67aad..8ccdebb235 100644
--- a/plc4go/internal/modbus/MessageCodec.go
+++ b/plc4go/internal/modbus/MessageCodec.go
@@ -58,8 +58,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpAdu := message.(model.ModbusTcpADU)
 	// Serialize the request
diff --git a/plc4go/internal/modbus/Reader.go b/plc4go/internal/modbus/Reader.go
index dcd13c85e0..e34066cf52 100644
--- a/plc4go/internal/modbus/Reader.go
+++ b/plc4go/internal/modbus/Reader.go
@@ -131,7 +131,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 
 		// Send the ADU over the wire
 		m.log.Trace().Msg("Send ADU")
-		if err = m.messageCodec.SendRequest(ctx, requestAdu, func(message spi.Message) bool {
+		if err = m.messageCodec.SendRequest(ctx, "read", requestAdu, func(message spi.Message) bool {
 			responseAdu := message.(readWriteModel.ModbusTcpADU)
 			return responseAdu.GetTransactionIdentifier() == uint16(transactionIdentifier) &&
 				responseAdu.GetUnitIdentifier() == requestAdu.UnitIdentifier
diff --git a/plc4go/internal/modbus/Writer.go b/plc4go/internal/modbus/Writer.go
index 75e336cbce..e669a90947 100644
--- a/plc4go/internal/modbus/Writer.go
+++ b/plc4go/internal/modbus/Writer.go
@@ -120,7 +120,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 		requestAdu := readWriteModel.NewModbusTcpADU(uint16(transactionIdentifier), m.unitIdentifier, pdu)
 
 		// Send the ADU over the wire
-		if err = m.messageCodec.SendRequest(ctx, requestAdu, func(message spi.Message) bool {
+		if err = m.messageCodec.SendRequest(ctx, "write", requestAdu, func(message spi.Message) bool {
 			responseAdu := message.(readWriteModel.ModbusTcpADU)
 			return responseAdu.GetTransactionIdentifier() == uint16(transactionIdentifier) &&
 				responseAdu.GetUnitIdentifier() == requestAdu.UnitIdentifier
diff --git a/plc4go/internal/opcua/MessageCodec.go b/plc4go/internal/opcua/MessageCodec.go
index 49d54f9e4c..596014abd5 100644
--- a/plc4go/internal/opcua/MessageCodec.go
+++ b/plc4go/internal/opcua/MessageCodec.go
@@ -60,8 +60,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Interface("message", message).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Interface("message", message).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	opcuaApu, ok := message.(readWriteModel.OpcuaAPU)
 	if !ok {
diff --git a/plc4go/internal/opcua/SecureChannel.go b/plc4go/internal/opcua/SecureChannel.go
index ae2be89df2..cf78f22bd0 100644
--- a/plc4go/internal/opcua/SecureChannel.go
+++ b/plc4go/internal/opcua/SecureChannel.go
@@ -214,7 +214,7 @@ func (s *SecureChannel) submit(ctx context.Context, codec *MessageCodec, errorDi
 
 	requestConsumer := func(transactionId int32) {
 		var messageBuffer []byte
-		if err := codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := codec.SendRequest(ctx, "submis", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -298,7 +298,7 @@ func (s *SecureChannel) onConnect(ctx context.Context, connection *Connection) e
 	errChan := make(chan error, 1)
 	requestConsumer := func(transactionId int32) {
 		s.log.Trace().Int32("transactionId", transactionId).Msg("request consumer called")
-		if err := s.codec.SendRequest(ctx, hello, func(message spi.Message) bool {
+		if err := s.codec.SendRequest(ctx, "hello", hello, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -425,7 +425,7 @@ func (s *SecureChannel) onConnectOpenSecureChannel(ctx context.Context, connecti
 	}
 
 	requestConsumer := func(transactionId int32) {
-		if err := s.codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := s.codec.SendRequest(ctx, "open_secure_channel", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -834,7 +834,7 @@ func (s *SecureChannel) onDisconnectCloseSecureChannel(ctx context.Context, conn
 	apu := readWriteModel.NewOpcuaAPU(closeRequest)
 
 	requestConsumer := func(transactionId int32) {
-		if err := connection.messageCodec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := connection.messageCodec.SendRequest(ctx, "disconnect_secure_channel", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -886,7 +886,7 @@ func (s *SecureChannel) onDiscover(ctx context.Context, codec *MessageCodec) {
 	apu := readWriteModel.NewOpcuaAPU(hello)
 
 	requestConsumer := func(transactionId int32) {
-		if err := codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := codec.SendRequest(ctx, "on_discover_hello", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -977,7 +977,7 @@ func (s *SecureChannel) onDiscoverOpenSecureChannel(ctx context.Context, codec *
 	apu := readWriteModel.NewOpcuaAPU(openRequest)
 
 	requestConsumer := func(transactionId int32) {
-		if err := codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := codec.SendRequest(ctx, "on_discover_open_secure_channes", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -1093,7 +1093,7 @@ func (s *SecureChannel) onDiscoverGetEndpointsRequest(ctx context.Context, codec
 	apu := readWriteModel.NewOpcuaAPU(messageRequest)
 
 	requestConsumer := func(transactionId int32) {
-		if err := codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := codec.SendRequest(ctx, "get_endpoints_request", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -1196,7 +1196,7 @@ func (s *SecureChannel) onDiscoverCloseSecureChannel(ctx context.Context, codec
 	apu := readWriteModel.NewOpcuaAPU(closeRequest)
 
 	requestConsumer := func(transactionId int32) {
-		if err := codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+		if err := codec.SendRequest(ctx, "on_discover_close_secure_channel", apu, func(message spi.Message) bool {
 			opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 			if !ok {
 				s.log.Debug().Type("type", message).Msg("Not relevant")
@@ -1324,7 +1324,7 @@ func (s *SecureChannel) keepAlive() {
 			}
 
 			requestConsumer := func(transactionId int32) {
-				if err := s.codec.SendRequest(ctx, apu, func(message spi.Message) bool {
+				if err := s.codec.SendRequest(ctx, "keep_alive", apu, func(message spi.Message) bool {
 					opcuaAPU, ok := message.(readWriteModel.OpcuaAPU)
 					if !ok {
 						s.log.Debug().Type("type", message).Msg("Not relevant")
diff --git a/plc4go/internal/s7/Connection.go b/plc4go/internal/s7/Connection.go
index 7b58b3f0fc..69e4a9d638 100644
--- a/plc4go/internal/s7/Connection.go
+++ b/plc4go/internal/s7/Connection.go
@@ -158,7 +158,7 @@ func (c *Connection) setupConnection(ctx context.Context) error {
 	// Open the session on ISO Transport Protocol first.
 	cotpConnectionResult := make(chan readWriteModel.COTPPacketConnectionResponse, 1)
 	cotpConnectionErrorChan := make(chan error, 1)
-	if err := c.messageCodec.SendRequest(ctx, readWriteModel.NewTPKTPacket(c.createCOTPConnectionRequest()), func(message spi.Message) bool {
+	if err := c.messageCodec.SendRequest(ctx, "setup_connection", readWriteModel.NewTPKTPacket(c.createCOTPConnectionRequest()), func(message spi.Message) bool {
 		tpktPacket := message.(readWriteModel.TPKTPacket)
 		if tpktPacket == nil {
 			return false
@@ -190,7 +190,7 @@ func (c *Connection) setupConnection(ctx context.Context) error {
 		// Send an S7 login message.
 		s7ConnectionResult := make(chan readWriteModel.S7ParameterSetupCommunication, 1)
 		s7ConnectionErrorChan := make(chan error, 1)
-		if err := c.messageCodec.SendRequest(ctx, c.createS7ConnectionRequest(cotpPacketConnectionResponse), func(message spi.Message) bool {
+		if err := c.messageCodec.SendRequest(ctx, "setup_connection_connection_request", c.createS7ConnectionRequest(cotpPacketConnectionResponse), func(message spi.Message) bool {
 			tpktPacket, ok := message.(readWriteModel.TPKTPacket)
 			if !ok {
 				return false
@@ -254,7 +254,7 @@ func (c *Connection) setupConnection(ctx context.Context) error {
 			c.log.Debug().Msg("Sending S7 Identification Request")
 			s7IdentificationResult := make(chan readWriteModel.S7PayloadUserData, 1)
 			s7IdentificationErrorChan := make(chan error, 1)
-			if err := c.messageCodec.SendRequest(ctx, c.createIdentifyRemoteMessage(), func(message spi.Message) bool {
+			if err := c.messageCodec.SendRequest(ctx, "setup_connection_identify_remote_message", c.createIdentifyRemoteMessage(), func(message spi.Message) bool {
 				tpktPacket, ok := message.(readWriteModel.TPKTPacket)
 				if !ok {
 					return false
diff --git a/plc4go/internal/s7/MessageCodec.go b/plc4go/internal/s7/MessageCodec.go
index fa2b1edc64..67a5b28974 100644
--- a/plc4go/internal/s7/MessageCodec.go
+++ b/plc4go/internal/s7/MessageCodec.go
@@ -55,8 +55,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, message spi.Message) error {
-	m.log.Trace().Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tpktPacket := message.(model.TPKTPacket)
 	// Serialize the request
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index 7463f45f56..f9f3943e77 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -120,7 +120,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 
 			// Send the  over the wire
 			m.log.Trace().Msg("Send ")
-			if err := m.messageCodec.SendRequest(ctx, tpktPacket, func(message spi.Message) bool {
+			if err := m.messageCodec.SendRequest(ctx, "read", tpktPacket, func(message spi.Message) bool {
 				tpktPacket, ok := message.(readWriteModel.TPKTPacket)
 				if !ok {
 					return false
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index ef14b3acd4..be58225801 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -111,7 +111,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
 			// Send the over the wire
-			if err := m.messageCodec.SendRequest(ctx, tpktPacket, func(message spi.Message) bool {
+			if err := m.messageCodec.SendRequest(ctx, "write", tpktPacket, func(message spi.Message) bool {
 				tpktPacket, ok := message.(readWriteModel.TPKTPacket)
 				if !ok {
 					return false
diff --git a/plc4go/spi/MessageCodec.go b/plc4go/spi/MessageCodec.go
index 279e75a048..fcc0eadb7e 100644
--- a/plc4go/spi/MessageCodec.go
+++ b/plc4go/spi/MessageCodec.go
@@ -55,12 +55,12 @@ type MessageCodec interface {
 	IsRunning() bool
 
 	// Send is sending a given message
-	Send(ctx context.Context, message Message) error
+	Send(ctx context.Context, interactionId string, message Message) error
 	// Expect Wait for a given timespan (defined by ctx or defaulting to default receive timeout) for a message to come
 	// in, which returns 'true' for 'acceptMessage' and is then forwarded to the 'handleMessage' function
-	Expect(ctx context.Context, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)
+	Expect(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)
 	// SendRequest A combination that sends a message first and then waits for a response. !!!Important note: the callbacks are blocking calls
-	SendRequest(ctx context.Context, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error
+	SendRequest(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error
 
 	// GetDefaultIncomingMessageChannel gives back the chan where unexpected messages arrive
 	GetDefaultIncomingMessageChannel() chan Message
diff --git a/plc4go/spi/default/DefaultCodec.go b/plc4go/spi/default/DefaultCodec.go
index 30b0bf9e4e..a80bf6a305 100644
--- a/plc4go/spi/default/DefaultCodec.go
+++ b/plc4go/spi/default/DefaultCodec.go
@@ -41,7 +41,7 @@ import (
 // DefaultCodecRequirements adds required methods to MessageCodec that are needed when using DefaultCodec
 type DefaultCodecRequirements interface {
 	GetCodec() spi.MessageCodec
-	Send(ctx context.Context, message spi.Message) error
+	Send(ctx context.Context, interactionId string, message spi.Message) error
 	Receive(ctx context.Context) (spi.Message, error)
 }
 
@@ -206,16 +206,16 @@ func (m *defaultCodec) IsRunning() bool {
 	return m.running.Load()
 }
 
-func (m *defaultCodec) Expect(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+func (m *defaultCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
 	m.expectationsChangeMutex.Lock()
 	defer m.expectationsChangeMutex.Unlock()
 	ttl := m.receiveTimeout
 	if deadline, ok := ctx.Deadline(); ok {
 		ttl = time.Until(deadline)
 	}
-	expectation := newDefaultExpectation(ctx, ttl, acceptsMessage, handleMessage, handleError)
+	expectation := newDefaultExpectation(ctx, interactionId, ttl, acceptsMessage, handleMessage, handleError)
 	m.expectations = append(m.expectations, expectation)
-	m.log.Debug().Interface("expectation", expectation).Msg("Added expectation")
+	m.log.Debug().Str("interactionId", interactionId).Stringer("expectation", expectation).Msg("Added expectation")
 	select {
 	case m.notifyExpireWorker <- struct{}{}:
 	default:
@@ -226,13 +226,13 @@ func (m *defaultCodec) Expect(ctx context.Context, acceptsMessage spi.AcceptsMes
 	}
 }
 
-func (m *defaultCodec) SendRequest(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+func (m *defaultCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
 	if err := ctx.Err(); err != nil {
 		return errors.Wrap(err, "Not sending message as context is aborted")
 	}
-	m.Expect(ctx, acceptsMessage, handleMessage, handleError) // We register the expectation first to avoid getting a response between sending and adding the expect
-	m.log.Trace().Msg("Sending request")
-	return m.Send(ctx, message)
+	m.Expect(ctx, interactionId, acceptsMessage, handleMessage, handleError) // We register the expectation first to avoid getting a response between sending and adding the expect
+	m.log.Trace().Str("interactionId", interactionId).Msg("Sending request")
+	return m.Send(ctx, interactionId, message)
 }
 
 func (m *defaultCodec) TimeoutExpectations(now time.Time) time.Duration {
@@ -281,12 +281,12 @@ func (m *defaultCodec) HandleMessages(message spi.Message) bool {
 	messageHandled := false
 	m.log.Trace().Int("nExpectations", len(m.expectations)).Msg("Current number of expectations")
 	m.expectations = slices.DeleteFunc(m.expectations, func(expectation spi.Expectation) bool {
-		expectationLog := m.log.With().Interface("expectation", expectation).Logger()
+		expectationLog := m.log.With().Stringer("expectation", expectation).Logger()
 		expectationLog.Trace().Msg("Checking expectation")
 		// Check if the current message matches the expectations
 		// If it does, let it handle the message.
 		if accepts := expectation.GetAcceptsMessage()(message); accepts {
-			expectationLog.Debug().Msg("accepts message")
+			expectationLog.Trace().Interface("handleMessage", message).Msg("accepts message")
 			// TODO: decouple from worker thread
 			if err := expectation.GetHandleMessage()(message); err != nil {
 				expectationLog.Debug().Err(err).Msg("errored handling the message")
@@ -302,7 +302,7 @@ func (m *defaultCodec) HandleMessages(message spi.Message) bool {
 			messageHandled = true
 			return true
 		} else {
-			expectationLog.Trace().Msg("doesn't accept message")
+			expectationLog.Trace().Interface("handleMessage", message).Msg("doesn't accept message")
 			return false
 		}
 	})
diff --git a/plc4go/spi/default/DefaultCodec_test.go b/plc4go/spi/default/DefaultCodec_test.go
index 79fa9f826d..2918ba97c5 100644
--- a/plc4go/spi/default/DefaultCodec_test.go
+++ b/plc4go/spi/default/DefaultCodec_test.go
@@ -498,6 +498,7 @@ func Test_defaultCodec_Expect(t *testing.T) {
 	}
 	type args struct {
 		ctx            context.Context
+		interactionId  string
 		acceptsMessage spi.AcceptsMessage
 		handleMessage  spi.HandleMessage
 		handleError    spi.HandleError
@@ -513,6 +514,7 @@ func Test_defaultCodec_Expect(t *testing.T) {
 			name: "expect it",
 			setup: func(t *testing.T, fields *fields, args *args) {
 				args.ctx = testutils.TestContext(t)
+				args.interactionId = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -534,7 +536,7 @@ func Test_defaultCodec_Expect(t *testing.T) {
 				customMessageHandling:         tt.fields.customMessageHandling,
 				log:                           testutils.ProduceTestingLogger(t),
 			}
-			m.Expect(tt.args.ctx, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError)
+			m.Expect(tt.args.ctx, tt.args.interactionId, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError)
 		})
 	}
 }
@@ -916,6 +918,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 	}
 	type args struct {
 		ctx            context.Context
+		interactionId  string
 		message        spi.Message
 		acceptsMessage spi.AcceptsMessage
 		handleMessage  spi.HandleMessage
@@ -933,10 +936,11 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 			name: "send it",
 			setup: func(t *testing.T, fields *fields, args *args) {
 				requirements := NewMockDefaultCodecRequirements(t)
-				requirements.EXPECT().Send(mock.Anything, mock.Anything).Return(nil)
+				requirements.EXPECT().Send(mock.Anything, mock.Anything, mock.Anything).Return(nil)
 				fields.DefaultCodecRequirements = requirements
 
 				args.ctx = testutils.TestContext(t)
+				args.interactionId = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -951,6 +955,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				ctx, cancelFunc := context.WithCancel(testutils.TestContext(t))
 				cancelFunc()
 				args.ctx = ctx
+				args.interactionId = t.Name()
 			},
 			wantErr: assert.Error,
 		},
@@ -958,10 +963,11 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 			name: "send it errors",
 			setup: func(t *testing.T, fields *fields, args *args) {
 				requirements := NewMockDefaultCodecRequirements(t)
-				requirements.EXPECT().Send(mock.Anything, mock.Anything).Return(errors.New("nope"))
+				requirements.EXPECT().Send(mock.Anything, mock.Anything, mock.Anything).Return(errors.New("nope"))
 				fields.DefaultCodecRequirements = requirements
 
 				args.ctx = testutils.TestContext(t)
+				args.interactionId = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -984,7 +990,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				customMessageHandling:         tt.fields.customMessageHandling,
 				log:                           testutils.ProduceTestingLogger(t),
 			}
-			tt.wantErr(t, m.SendRequest(tt.args.ctx, tt.args.message, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError), fmt.Sprintf("SendRequest(%v, %v, func(), func(), func(), %v)", tt.args.ctx, tt.args.message, tt.args.ttl))
+			tt.wantErr(t, m.SendRequest(tt.args.ctx, tt.args.interactionId, tt.args.message, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError), fmt.Sprintf("SendRequest(%v, %v, func(), func(), func(), %v)", tt.args.ctx, tt.args.message, tt.args.ttl))
 		})
 	}
 }
@@ -1622,7 +1628,7 @@ func Test_defaultCodec_integration(t *testing.T) {
 	})
 	// First expect
 	var firstHandled bool
-	sut.Expect(t.Context(), func(message spi.Message) bool {
+	sut.Expect(t.Context(), "first", func(message spi.Message) bool {
 		t.Log("accepts message", message)
 		return true
 	}, func(message spi.Message) error {
@@ -1635,7 +1641,7 @@ func Test_defaultCodec_integration(t *testing.T) {
 	})
 	// Second expect
 	var secondHandled bool
-	sut.Expect(t.Context(), func(message spi.Message) bool {
+	sut.Expect(t.Context(), "second", func(message spi.Message) bool {
 		t.Log("accepts message", message)
 		return true
 	}, func(message spi.Message) error {
@@ -1648,7 +1654,7 @@ func Test_defaultCodec_integration(t *testing.T) {
 	})
 	// Third expect
 	var thridErrorCalled bool
-	sut.Expect(t.Context(), func(message spi.Message) bool {
+	sut.Expect(t.Context(), "third", func(message spi.Message) bool {
 		t.Log("does not accept message", message)
 		return false
 	}, func(message spi.Message) error {
@@ -1660,7 +1666,7 @@ func Test_defaultCodec_integration(t *testing.T) {
 	})
 	// Fourth expect
 	var fourthHandled bool
-	sut.Expect(t.Context(), func(message spi.Message) bool {
+	sut.Expect(t.Context(), "fourth", func(message spi.Message) bool {
 		t.Log("accepts message", message)
 		return true
 	}, func(message spi.Message) error {
diff --git a/plc4go/spi/default/defaultExpectation.go b/plc4go/spi/default/defaultExpectation.go
index db9af30d17..627c9589dd 100644
--- a/plc4go/spi/default/defaultExpectation.go
+++ b/plc4go/spi/default/defaultExpectation.go
@@ -31,6 +31,7 @@ import (
 
 type defaultExpectation struct {
 	Uuid           uuid.UUID
+	InteractionId  string
 	Ctx            context.Context
 	CancelFunc     context.CancelCauseFunc
 	CreationTime   time.Time
@@ -40,10 +41,11 @@ type defaultExpectation struct {
 	HandleError    spi.HandleError
 }
 
-func newDefaultExpectation(ctx context.Context, ttl time.Duration, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) *defaultExpectation {
+func newDefaultExpectation(ctx context.Context, interactionId string, ttl time.Duration, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) *defaultExpectation {
 	ctx, cancelFunc := context.WithCancelCause(ctx)
 	return &defaultExpectation{
 		Uuid:           uuid.New(),
+		InteractionId:  interactionId,
 		Ctx:            ctx,
 		CancelFunc:     cancelFunc,
 		CreationTime:   time.Now(),
@@ -83,5 +85,5 @@ func (d *defaultExpectation) GetHandleError() spi.HandleError {
 }
 
 func (d *defaultExpectation) String() string {
-	return fmt.Sprintf("Expectation %s (expires at %v in %s)", d.Uuid, d.Expiration, time.Until(d.Expiration))
+	return fmt.Sprintf("Expectation '%s' %s (expires at %v in %s)", d.InteractionId, d.Uuid, d.Expiration, time.Until(d.Expiration))
 }
diff --git a/plc4go/spi/default/mocks_test.go b/plc4go/spi/default/mocks_test.go
index 2373d14683..51af0b4f34 100644
--- a/plc4go/spi/default/mocks_test.go
+++ b/plc4go/spi/default/mocks_test.go
@@ -431,16 +431,16 @@ func (_c *MockDefaultCodecRequirements_Receive_Call) RunAndReturn(run func(ctx c
 }
 
 // Send provides a mock function for the type MockDefaultCodecRequirements
-func (_mock *MockDefaultCodecRequirements) Send(ctx context.Context, message spi.Message) error {
-	ret := _mock.Called(ctx, message)
+func (_mock *MockDefaultCodecRequirements) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionId, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, spi.Message) error); ok {
-		r0 = returnFunc(ctx, message)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
+		r0 = returnFunc(ctx, interactionId, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -454,24 +454,30 @@ type MockDefaultCodecRequirements_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message spi.Message
-func (_e *MockDefaultCodecRequirements_Expecter) Send(ctx interface{}, message interface{}) *MockDefaultCodecRequirements_Send_Call {
-	return &MockDefaultCodecRequirements_Send_Call{Call: _e.mock.On("Send", ctx, message)}
+func (_e *MockDefaultCodecRequirements_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockDefaultCodecRequirements_Send_Call {
+	return &MockDefaultCodecRequirements_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
 }
 
-func (_c *MockDefaultCodecRequirements_Send_Call) Run(run func(ctx context.Context, message spi.Message)) *MockDefaultCodecRequirements_Send_Call {
+func (_c *MockDefaultCodecRequirements_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockDefaultCodecRequirements_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.Message)
+			arg1 = args[1].(string)
+		}
+		var arg2 spi.Message
+		if args[2] != nil {
+			arg2 = args[2].(spi.Message)
 		}
 		run(
 			arg0,
 			arg1,
+			arg2,
 		)
 	})
 	return _c
@@ -482,7 +488,7 @@ func (_c *MockDefaultCodecRequirements_Send_Call) Return(err error) *MockDefault
 	return _c
 }
 
-func (_c *MockDefaultCodecRequirements_Send_Call) RunAndReturn(run func(ctx context.Context, message spi.Message) error) *MockDefaultCodecRequirements_Send_Call {
+func (_c *MockDefaultCodecRequirements_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockDefaultCodecRequirements_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
@@ -610,8 +616,8 @@ func (_c *MockDefaultCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) Expect(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
-	_mock.Called(ctx, acceptsMessage, handleMessage, handleError)
+func (_mock *MockDefaultCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -622,36 +628,42 @@ type MockDefaultCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockDefaultCodec_Expecter) Expect(ctx interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_Expect_Call {
-	return &MockDefaultCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, acceptsMessage, handleMessage, handleError)}
+func (_e *MockDefaultCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_Expect_Call {
+	return &MockDefaultCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockDefaultCodec_Expect_Call) Run(run func(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
+func (_c *MockDefaultCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.AcceptsMessage
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.AcceptsMessage)
+			arg1 = args[1].(string)
 		}
-		var arg2 spi.HandleMessage
+		var arg2 spi.AcceptsMessage
 		if args[2] != nil {
-			arg2 = args[2].(spi.HandleMessage)
+			arg2 = args[2].(spi.AcceptsMessage)
 		}
-		var arg3 spi.HandleError
+		var arg3 spi.HandleMessage
 		if args[3] != nil {
-			arg3 = args[3].(spi.HandleError)
+			arg3 = args[3].(spi.HandleMessage)
+		}
+		var arg4 spi.HandleError
+		if args[4] != nil {
+			arg4 = args[4].(spi.HandleError)
 		}
 		run(
 			arg0,
 			arg1,
 			arg2,
 			arg3,
+			arg4,
 		)
 	})
 	return _c
@@ -662,7 +674,7 @@ func (_c *MockDefaultCodec_Expect_Call) Return() *MockDefaultCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockDefaultCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
+func (_c *MockDefaultCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -804,16 +816,16 @@ func (_c *MockDefaultCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockDe
 }
 
 // Send provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) Send(ctx context.Context, message spi.Message) error {
-	ret := _mock.Called(ctx, message)
+func (_mock *MockDefaultCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionId, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, spi.Message) error); ok {
-		r0 = returnFunc(ctx, message)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
+		r0 = returnFunc(ctx, interactionId, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -827,24 +839,30 @@ type MockDefaultCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message spi.Message
-func (_e *MockDefaultCodec_Expecter) Send(ctx interface{}, message interface{}) *MockDefaultCodec_Send_Call {
-	return &MockDefaultCodec_Send_Call{Call: _e.mock.On("Send", ctx, message)}
+func (_e *MockDefaultCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockDefaultCodec_Send_Call {
+	return &MockDefaultCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
 }
 
-func (_c *MockDefaultCodec_Send_Call) Run(run func(ctx context.Context, message spi.Message)) *MockDefaultCodec_Send_Call {
+func (_c *MockDefaultCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockDefaultCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.Message)
+			arg1 = args[1].(string)
+		}
+		var arg2 spi.Message
+		if args[2] != nil {
+			arg2 = args[2].(spi.Message)
 		}
 		run(
 			arg0,
 			arg1,
+			arg2,
 		)
 	})
 	return _c
@@ -855,22 +873,22 @@ func (_c *MockDefaultCodec_Send_Call) Return(err error) *MockDefaultCodec_Send_C
 	return _c
 }
 
-func (_c *MockDefaultCodec_Send_Call) RunAndReturn(run func(ctx context.Context, message spi.Message) error) *MockDefaultCodec_Send_Call {
+func (_c *MockDefaultCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockDefaultCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) SendRequest(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
-	ret := _mock.Called(ctx, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockDefaultCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
-		r0 = returnFunc(ctx, message, acceptsMessage, handleMessage, handleError)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
+		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -884,35 +902,40 @@ type MockDefaultCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message spi.Message
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockDefaultCodec_Expecter) SendRequest(ctx interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_SendRequest_Call {
-	return &MockDefaultCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockDefaultCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_SendRequest_Call {
+	return &MockDefaultCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockDefaultCodec_SendRequest_Call) Run(run func(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_SendRequest_Call {
+func (_c *MockDefaultCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.Message)
+			arg1 = args[1].(string)
 		}
-		var arg2 spi.AcceptsMessage
+		var arg2 spi.Message
 		if args[2] != nil {
-			arg2 = args[2].(spi.AcceptsMessage)
+			arg2 = args[2].(spi.Message)
 		}
-		var arg3 spi.HandleMessage
+		var arg3 spi.AcceptsMessage
 		if args[3] != nil {
-			arg3 = args[3].(spi.HandleMessage)
+			arg3 = args[3].(spi.AcceptsMessage)
 		}
-		var arg4 spi.HandleError
+		var arg4 spi.HandleMessage
 		if args[4] != nil {
-			arg4 = args[4].(spi.HandleError)
+			arg4 = args[4].(spi.HandleMessage)
+		}
+		var arg5 spi.HandleError
+		if args[5] != nil {
+			arg5 = args[5].(spi.HandleError)
 		}
 		run(
 			arg0,
@@ -920,6 +943,7 @@ func (_c *MockDefaultCodec_SendRequest_Call) Run(run func(ctx context.Context, m
 			arg2,
 			arg3,
 			arg4,
+			arg5,
 		)
 	})
 	return _c
@@ -930,7 +954,7 @@ func (_c *MockDefaultCodec_SendRequest_Call) Return(err error) *MockDefaultCodec
 	return _c
 }
 
-func (_c *MockDefaultCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockDefaultCodec_SendRequest_Call {
+func (_c *MockDefaultCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockDefaultCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
@@ -3706,8 +3730,8 @@ func (_c *MockMessageCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Expect(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
-	_mock.Called(ctx, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -3718,36 +3742,42 @@ type MockMessageCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
-	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
+	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.AcceptsMessage
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.AcceptsMessage)
+			arg1 = args[1].(string)
 		}
-		var arg2 spi.HandleMessage
+		var arg2 spi.AcceptsMessage
 		if args[2] != nil {
-			arg2 = args[2].(spi.HandleMessage)
+			arg2 = args[2].(spi.AcceptsMessage)
 		}
-		var arg3 spi.HandleError
+		var arg3 spi.HandleMessage
 		if args[3] != nil {
-			arg3 = args[3].(spi.HandleError)
+			arg3 = args[3].(spi.HandleMessage)
+		}
+		var arg4 spi.HandleError
+		if args[4] != nil {
+			arg4 = args[4].(spi.HandleError)
 		}
 		run(
 			arg0,
 			arg1,
 			arg2,
 			arg3,
+			arg4,
 		)
 	})
 	return _c
@@ -3758,7 +3788,7 @@ func (_c *MockMessageCodec_Expect_Call) Return() *MockMessageCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -3900,16 +3930,16 @@ func (_c *MockMessageCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockMe
 }
 
 // Send provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Send(ctx context.Context, message spi.Message) error {
-	ret := _mock.Called(ctx, message)
+func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionId, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, spi.Message) error); ok {
-		r0 = returnFunc(ctx, message)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
+		r0 = returnFunc(ctx, interactionId, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -3923,24 +3953,30 @@ type MockMessageCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message spi.Message
-func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, message interface{}) *MockMessageCodec_Send_Call {
-	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, message)}
+func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockMessageCodec_Send_Call {
+	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
 }
 
-func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, message spi.Message)) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockMessageCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.Message)
+			arg1 = args[1].(string)
+		}
+		var arg2 spi.Message
+		if args[2] != nil {
+			arg2 = args[2].(spi.Message)
 		}
 		run(
 			arg0,
 			arg1,
+			arg2,
 		)
 	})
 	return _c
@@ -3951,22 +3987,22 @@ func (_c *MockMessageCodec_Send_Call) Return(err error) *MockMessageCodec_Send_C
 	return _c
 }
 
-func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, message spi.Message) error) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockMessageCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) SendRequest(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
-	ret := _mock.Called(ctx, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
-		r0 = returnFunc(ctx, message, acceptsMessage, handleMessage, handleError)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
+		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -3980,35 +4016,40 @@ type MockMessageCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message spi.Message
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
-	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
+	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 spi.Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(spi.Message)
+			arg1 = args[1].(string)
 		}
-		var arg2 spi.AcceptsMessage
+		var arg2 spi.Message
 		if args[2] != nil {
-			arg2 = args[2].(spi.AcceptsMessage)
+			arg2 = args[2].(spi.Message)
 		}
-		var arg3 spi.HandleMessage
+		var arg3 spi.AcceptsMessage
 		if args[3] != nil {
-			arg3 = args[3].(spi.HandleMessage)
+			arg3 = args[3].(spi.AcceptsMessage)
 		}
-		var arg4 spi.HandleError
+		var arg4 spi.HandleMessage
 		if args[4] != nil {
-			arg4 = args[4].(spi.HandleError)
+			arg4 = args[4].(spi.HandleMessage)
+		}
+		var arg5 spi.HandleError
+		if args[5] != nil {
+			arg5 = args[5].(spi.HandleError)
 		}
 		run(
 			arg0,
@@ -4016,6 +4057,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, m
 			arg2,
 			arg3,
 			arg4,
+			arg5,
 		)
 	})
 	return _c
@@ -4026,7 +4068,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Return(err error) *MockMessageCodec
 	return _c
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/plc4go/spi/mocks_test.go b/plc4go/spi/mocks_test.go
index 56348c89bd..9cb4800577 100644
--- a/plc4go/spi/mocks_test.go
+++ b/plc4go/spi/mocks_test.go
@@ -1489,8 +1489,8 @@ func (_c *MockMessageCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Expect(ctx context.Context, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) {
-	_mock.Called(ctx, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) {
+	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -1501,36 +1501,42 @@ type MockMessageCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - acceptsMessage AcceptsMessage
 //   - handleMessage HandleMessage
 //   - handleError HandleError
-func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
-	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
+	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 AcceptsMessage
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(AcceptsMessage)
+			arg1 = args[1].(string)
 		}
-		var arg2 HandleMessage
+		var arg2 AcceptsMessage
 		if args[2] != nil {
-			arg2 = args[2].(HandleMessage)
+			arg2 = args[2].(AcceptsMessage)
 		}
-		var arg3 HandleError
+		var arg3 HandleMessage
 		if args[3] != nil {
-			arg3 = args[3].(HandleError)
+			arg3 = args[3].(HandleMessage)
+		}
+		var arg4 HandleError
+		if args[4] != nil {
+			arg4 = args[4].(HandleError)
 		}
 		run(
 			arg0,
 			arg1,
 			arg2,
 			arg3,
+			arg4,
 		)
 	})
 	return _c
@@ -1541,7 +1547,7 @@ func (_c *MockMessageCodec_Expect_Call) Return() *MockMessageCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -1637,16 +1643,16 @@ func (_c *MockMessageCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockMe
 }
 
 // Send provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Send(ctx context.Context, message Message) error {
-	ret := _mock.Called(ctx, message)
+func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, message Message) error {
+	ret := _mock.Called(ctx, interactionId, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, Message) error); ok {
-		r0 = returnFunc(ctx, message)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, Message) error); ok {
+		r0 = returnFunc(ctx, interactionId, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -1660,24 +1666,30 @@ type MockMessageCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message Message
-func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, message interface{}) *MockMessageCodec_Send_Call {
-	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, message)}
+func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockMessageCodec_Send_Call {
+	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
 }
 
-func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, message Message)) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message Message)) *MockMessageCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(Message)
+			arg1 = args[1].(string)
+		}
+		var arg2 Message
+		if args[2] != nil {
+			arg2 = args[2].(Message)
 		}
 		run(
 			arg0,
 			arg1,
+			arg2,
 		)
 	})
 	return _c
@@ -1688,22 +1700,22 @@ func (_c *MockMessageCodec_Send_Call) Return(err error) *MockMessageCodec_Send_C
 	return _c
 }
 
-func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, message Message) error) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message Message) error) *MockMessageCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) SendRequest(ctx context.Context, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error {
-	ret := _mock.Called(ctx, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error {
+	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
 	}
 
 	var r0 error
-	if returnFunc, ok := ret.Get(0).(func(context.Context, Message, AcceptsMessage, HandleMessage, HandleError) error); ok {
-		r0 = returnFunc(ctx, message, acceptsMessage, handleMessage, handleError)
+	if returnFunc, ok := ret.Get(0).(func(context.Context, string, Message, AcceptsMessage, HandleMessage, HandleError) error); ok {
+		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -1717,35 +1729,40 @@ type MockMessageCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
+//   - interactionId string
 //   - message Message
 //   - acceptsMessage AcceptsMessage
 //   - handleMessage HandleMessage
 //   - handleError HandleError
-func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
-	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
+	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
 			arg0 = args[0].(context.Context)
 		}
-		var arg1 Message
+		var arg1 string
 		if args[1] != nil {
-			arg1 = args[1].(Message)
+			arg1 = args[1].(string)
 		}
-		var arg2 AcceptsMessage
+		var arg2 Message
 		if args[2] != nil {
-			arg2 = args[2].(AcceptsMessage)
+			arg2 = args[2].(Message)
 		}
-		var arg3 HandleMessage
+		var arg3 AcceptsMessage
 		if args[3] != nil {
-			arg3 = args[3].(HandleMessage)
+			arg3 = args[3].(AcceptsMessage)
 		}
-		var arg4 HandleError
+		var arg4 HandleMessage
 		if args[4] != nil {
-			arg4 = args[4].(HandleError)
+			arg4 = args[4].(HandleMessage)
+		}
+		var arg5 HandleError
+		if args[5] != nil {
+			arg5 = args[5].(HandleError)
 		}
 		run(
 			arg0,
@@ -1753,6 +1770,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, m
 			arg2,
 			arg3,
 			arg4,
+			arg5,
 		)
 	})
 	return _c
@@ -1763,7 +1781,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Return(err error) *MockMessageCodec
 	return _c
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/plc4go/spi/transports/test/TransportInstance.go b/plc4go/spi/transports/test/TransportInstance.go
index 2ed45e9af9..ffc21b3997 100644
--- a/plc4go/spi/transports/test/TransportInstance.go
+++ b/plc4go/spi/transports/test/TransportInstance.go
@@ -355,7 +355,7 @@ func (m *TransportInstance) transferFromChannel(ctx context.Context) (totalAvail
 	case <-ctx.Done():
 		m.log.Trace().Msg("Context done")
 	case newBytes := <-m.readChannel:
-		m.log.Trace().Dur("time", time.Since(start)).Msg("Got new bytes")
+		m.log.Trace().Dur("time", time.Since(start)).Int("nBytes", len(newBytes)).Msg("Got new bytes")
 		totalAvailableBytes = m.appendRead(newBytes...)
 	}
 	return totalAvailableBytes


(plc4x) 06/08: feat(plc4go/spi): add transactionInfo to RequestTransaction

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 215605fe8ad9846f46d42fd898edc2c8bedd1d91
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 14:12:18 2025 +0100

    feat(plc4go/spi): add transactionInfo to RequestTransaction
---
 plc4go/internal/ads/DiscoveryMessageCodec.go       |   4 +-
 plc4go/internal/ads/MessageCodec.go                |   4 +-
 .../bacnetip/ApplicationLayerMessageCodec.go       |   6 +-
 plc4go/internal/bacnetip/MessageCodec.go           |   4 +-
 plc4go/internal/bacnetip/Reader.go                 |   2 +-
 plc4go/internal/cbus/CBusMessageMapper_test.go     |  44 ++++-----
 plc4go/internal/cbus/MessageCodec.go               |   4 +-
 plc4go/internal/cbus/MessageCodec_test.go          |   6 +-
 plc4go/internal/cbus/Reader.go                     |   2 +-
 plc4go/internal/cbus/Writer.go                     |   2 +-
 plc4go/internal/eip/MessageCodec.go                |   4 +-
 plc4go/internal/eip/Reader.go                      |   2 +-
 plc4go/internal/knxnetip/MessageCodec.go           |   4 +-
 plc4go/internal/modbus/MessageCodec.go             |   4 +-
 plc4go/internal/opcua/MessageCodec.go              |   4 +-
 plc4go/internal/s7/MessageCodec.go                 |   4 +-
 plc4go/internal/s7/Reader.go                       |   2 +-
 plc4go/internal/s7/Writer.go                       |   2 +-
 plc4go/spi/MessageCodec.go                         |   6 +-
 plc4go/spi/default/DefaultCodec.go                 |  16 +--
 plc4go/spi/default/DefaultCodec_test.go            |  38 ++++----
 plc4go/spi/default/defaultExpectation.go           |  40 ++++----
 plc4go/spi/default/mocks_test.go                   | 108 ++++++++++-----------
 plc4go/spi/mocks_test.go                           |  46 ++++-----
 plc4go/spi/transactions/RequestTransaction.go      |  14 +--
 .../spi/transactions/RequestTransactionManager.go  |   6 +-
 .../transactions/RequestTransactionManager_test.go |   2 +-
 plc4go/spi/transactions/mocks_test.go              |   2 +-
 .../transactions/requestTransaction_plc4xgen.go    |   4 +
 29 files changed, 196 insertions(+), 190 deletions(-)

diff --git a/plc4go/internal/ads/DiscoveryMessageCodec.go b/plc4go/internal/ads/DiscoveryMessageCodec.go
index 1688760948..5315de9473 100644
--- a/plc4go/internal/ads/DiscoveryMessageCodec.go
+++ b/plc4go/internal/ads/DiscoveryMessageCodec.go
@@ -54,8 +54,8 @@ func (m *DiscoveryMessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *DiscoveryMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *DiscoveryMessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpPaket := message.(model.AdsDiscovery)
 	// Serialize the request
diff --git a/plc4go/internal/ads/MessageCodec.go b/plc4go/internal/ads/MessageCodec.go
index b263adb443..14fe68c2e7 100644
--- a/plc4go/internal/ads/MessageCodec.go
+++ b/plc4go/internal/ads/MessageCodec.go
@@ -67,8 +67,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpPaket := message.(model.AmsTCPPacket)
 	// Serialize the request
diff --git a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
index 77491c3e53..2685e3a202 100644
--- a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
+++ b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
@@ -112,7 +112,7 @@ func (m *ApplicationLayerMessageCodec) IsRunning() bool {
 	return m.messageCode.IsRunning()
 }
 
-func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
+func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
 	address, err := pdu.NewAddress(comp.NewArgs(m.remoteAddress))
 	if err != nil {
 		return err
@@ -141,12 +141,12 @@ func (m *ApplicationLayerMessageCodec) Send(ctx context.Context, interactionId s
 	return nil
 }
 
-func (m *ApplicationLayerMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+func (m *ApplicationLayerMessageCodec) Expect(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
 	// TODO: implement me
 	panic("not yet implemented")
 }
 
-func (m *ApplicationLayerMessageCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+func (m *ApplicationLayerMessageCodec) SendRequest(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
 	address, err := pdu.NewAddress(comp.NewArgs(m.remoteAddress))
 	if err != nil {
 		return err
diff --git a/plc4go/internal/bacnetip/MessageCodec.go b/plc4go/internal/bacnetip/MessageCodec.go
index f94e3f2bff..09faf9c1af 100644
--- a/plc4go/internal/bacnetip/MessageCodec.go
+++ b/plc4go/internal/bacnetip/MessageCodec.go
@@ -50,8 +50,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	bvlcPacket := message.(model.BVLC)
 	// Serialize the request
diff --git a/plc4go/internal/bacnetip/Reader.go b/plc4go/internal/bacnetip/Reader.go
index dc55115712..2ae7e3c650 100644
--- a/plc4go/internal/bacnetip/Reader.go
+++ b/plc4go/internal/bacnetip/Reader.go
@@ -134,7 +134,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 		)
 
 		// Start a new request-transaction (Is ended in the response-handler)
-		transaction := m.tm.StartTransaction()
+		transaction := m.tm.StartTransaction("read")
 		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/internal/cbus/CBusMessageMapper_test.go b/plc4go/internal/cbus/CBusMessageMapper_test.go
index f542c78d73..da609e5870 100644
--- a/plc4go/internal/cbus/CBusMessageMapper_test.go
+++ b/plc4go/internal/cbus/CBusMessageMapper_test.go
@@ -1423,7 +1423,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				t.Logf("Submitting No-Op to transaction\n%v", transaction)
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
@@ -1500,7 +1500,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				t.Logf("Submitting No-Op to transaction %v", transaction)
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
@@ -1594,7 +1594,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -1677,7 +1677,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -1743,7 +1743,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -1812,7 +1812,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -1900,7 +1900,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2006,7 +2006,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2076,7 +2076,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2142,7 +2142,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2208,7 +2208,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2274,7 +2274,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2340,7 +2340,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2426,7 +2426,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2492,7 +2492,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2558,7 +2558,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2624,7 +2624,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2690,7 +2690,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2756,7 +2756,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2838,7 +2838,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2904,7 +2904,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
@@ -2970,7 +2970,7 @@ func TestMapEncodedReply(t *testing.T) {
 				t.Cleanup(func() {
 					assert.NoError(t, transactionManager.Close())
 				})
-				transaction := transactionManager.StartTransaction()
+				transaction := transactionManager.StartTransaction(t.Name())
 				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
diff --git a/plc4go/internal/cbus/MessageCodec.go b/plc4go/internal/cbus/MessageCodec.go
index 10b65ea2c8..68210bd707 100644
--- a/plc4go/internal/cbus/MessageCodec.go
+++ b/plc4go/internal/cbus/MessageCodec.go
@@ -98,8 +98,8 @@ func (m *MessageCodec) Disconnect() error {
 	return err
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Interface("message", message).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Interface("message", message).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	cbusMessage, ok := message.(readWriteModel.CBusMessage)
 	if !ok {
diff --git a/plc4go/internal/cbus/MessageCodec_test.go b/plc4go/internal/cbus/MessageCodec_test.go
index 100c058932..70797cc52a 100644
--- a/plc4go/internal/cbus/MessageCodec_test.go
+++ b/plc4go/internal/cbus/MessageCodec_test.go
@@ -48,9 +48,9 @@ func TestMessageCodec_Send(t *testing.T) {
 		monitoredSALs  chan readWriteModel.MonitoredSAL
 	}
 	type args struct {
-		ctx           context.Context
-		interactionId string
-		message       spi.Message
+		ctx             context.Context
+		interactionInfo string
+		message         spi.Message
 	}
 	tests := []struct {
 		name    string
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 0639e33462..442ad46edb 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -126,7 +126,7 @@ func (m *Reader) readSync(ctx context.Context, readRequest apiModel.PlcReadReque
 
 func (m *Reader) createMessageTransactionAndWait(ctx context.Context, messageToSend readWriteModel.CBusMessage, addResponseCode func(name string, responseCode apiModel.PlcResponseCode), tagName string, addPlcValue func(name string, plcValue apiValues.PlcValue)) {
 	// Start a new request-transaction (Is ended in the response-handler)
-	transaction := m.tm.StartTransaction()
+	transaction := m.tm.StartTransaction("read")
 	transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 		ctx, cancel := context.WithCancel(ctx)
 		context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/internal/cbus/Writer.go b/plc4go/internal/cbus/Writer.go
index fa8b225fb8..3e595fa349 100644
--- a/plc4go/internal/cbus/Writer.go
+++ b/plc4go/internal/cbus/Writer.go
@@ -112,7 +112,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 			}
 			tagNameCopy := tagName
 			// Start a new request-transaction (Is ended in the response-handler)
-			transaction := m.tm.StartTransaction()
+			transaction := m.tm.StartTransaction("write")
 			transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 				ctx, cancel := context.WithCancel(ctx)
 				context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/internal/eip/MessageCodec.go b/plc4go/internal/eip/MessageCodec.go
index 0ca7459d79..68cfaec457 100644
--- a/plc4go/internal/eip/MessageCodec.go
+++ b/plc4go/internal/eip/MessageCodec.go
@@ -55,8 +55,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	eipPacket := message.(model.EipPacket)
 	// Serialize the request
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index 70f0628e0e..37703f8e9a 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -106,7 +106,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 				0,
 				typeIds,
 			)
-			transaction := m.tm.StartTransaction()
+			transaction := m.tm.StartTransaction("read")
 			transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 				ctx, cancel := context.WithCancel(ctx)
 				context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/internal/knxnetip/MessageCodec.go b/plc4go/internal/knxnetip/MessageCodec.go
index c7778606ac..f5aa902781 100644
--- a/plc4go/internal/knxnetip/MessageCodec.go
+++ b/plc4go/internal/knxnetip/MessageCodec.go
@@ -62,8 +62,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	knxMessage := message.(model.KnxNetIpMessage)
 	// Serialize the request
diff --git a/plc4go/internal/modbus/MessageCodec.go b/plc4go/internal/modbus/MessageCodec.go
index 8ccdebb235..90c82cbe73 100644
--- a/plc4go/internal/modbus/MessageCodec.go
+++ b/plc4go/internal/modbus/MessageCodec.go
@@ -58,8 +58,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tcpAdu := message.(model.ModbusTcpADU)
 	// Serialize the request
diff --git a/plc4go/internal/opcua/MessageCodec.go b/plc4go/internal/opcua/MessageCodec.go
index 596014abd5..a2f307a526 100644
--- a/plc4go/internal/opcua/MessageCodec.go
+++ b/plc4go/internal/opcua/MessageCodec.go
@@ -60,8 +60,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Interface("message", message).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Interface("message", message).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	opcuaApu, ok := message.(readWriteModel.OpcuaAPU)
 	if !ok {
diff --git a/plc4go/internal/s7/MessageCodec.go b/plc4go/internal/s7/MessageCodec.go
index 67a5b28974..924cf45908 100644
--- a/plc4go/internal/s7/MessageCodec.go
+++ b/plc4go/internal/s7/MessageCodec.go
@@ -55,8 +55,8 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 	return m
 }
 
-func (m *MessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending message")
+func (m *MessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending message")
 	// Cast the message to the correct type of struct
 	tpktPacket := message.(model.TPKTPacket)
 	// Serialize the request
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index f9f3943e77..04a6a22cef 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -113,7 +113,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 			),
 		)
 		// Start a new request-transaction (Is ended in the response-handler)
-		transaction := m.tm.StartTransaction()
+		transaction := m.tm.StartTransaction("read")
 		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index be58225801..13796ec2d9 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -106,7 +106,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 		)
 
 		// Start a new request-transaction (Is ended in the response-handler)
-		transaction := m.tm.StartTransaction()
+		transaction := m.tm.StartTransaction("write")
 		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
diff --git a/plc4go/spi/MessageCodec.go b/plc4go/spi/MessageCodec.go
index fcc0eadb7e..dc59382ff4 100644
--- a/plc4go/spi/MessageCodec.go
+++ b/plc4go/spi/MessageCodec.go
@@ -55,12 +55,12 @@ type MessageCodec interface {
 	IsRunning() bool
 
 	// Send is sending a given message
-	Send(ctx context.Context, interactionId string, message Message) error
+	Send(ctx context.Context, interactionInfo string, message Message) error
 	// Expect Wait for a given timespan (defined by ctx or defaulting to default receive timeout) for a message to come
 	// in, which returns 'true' for 'acceptMessage' and is then forwarded to the 'handleMessage' function
-	Expect(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)
+	Expect(ctx context.Context, interactionInfo string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)
 	// SendRequest A combination that sends a message first and then waits for a response. !!!Important note: the callbacks are blocking calls
-	SendRequest(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error
+	SendRequest(ctx context.Context, interactionInfo string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error
 
 	// GetDefaultIncomingMessageChannel gives back the chan where unexpected messages arrive
 	GetDefaultIncomingMessageChannel() chan Message
diff --git a/plc4go/spi/default/DefaultCodec.go b/plc4go/spi/default/DefaultCodec.go
index a80bf6a305..11f7d6c4aa 100644
--- a/plc4go/spi/default/DefaultCodec.go
+++ b/plc4go/spi/default/DefaultCodec.go
@@ -41,7 +41,7 @@ import (
 // DefaultCodecRequirements adds required methods to MessageCodec that are needed when using DefaultCodec
 type DefaultCodecRequirements interface {
 	GetCodec() spi.MessageCodec
-	Send(ctx context.Context, interactionId string, message spi.Message) error
+	Send(ctx context.Context, interactionInfo string, message spi.Message) error
 	Receive(ctx context.Context) (spi.Message, error)
 }
 
@@ -206,16 +206,16 @@ func (m *defaultCodec) IsRunning() bool {
 	return m.running.Load()
 }
 
-func (m *defaultCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+func (m *defaultCodec) Expect(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
 	m.expectationsChangeMutex.Lock()
 	defer m.expectationsChangeMutex.Unlock()
 	ttl := m.receiveTimeout
 	if deadline, ok := ctx.Deadline(); ok {
 		ttl = time.Until(deadline)
 	}
-	expectation := newDefaultExpectation(ctx, interactionId, ttl, acceptsMessage, handleMessage, handleError)
+	expectation := newDefaultExpectation(ctx, interactionInfo, ttl, acceptsMessage, handleMessage, handleError)
 	m.expectations = append(m.expectations, expectation)
-	m.log.Debug().Str("interactionId", interactionId).Stringer("expectation", expectation).Msg("Added expectation")
+	m.log.Debug().Str("interactionInfo", interactionInfo).Stringer("expectation", expectation).Msg("Added expectation")
 	select {
 	case m.notifyExpireWorker <- struct{}{}:
 	default:
@@ -226,13 +226,13 @@ func (m *defaultCodec) Expect(ctx context.Context, interactionId string, accepts
 	}
 }
 
-func (m *defaultCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+func (m *defaultCodec) SendRequest(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
 	if err := ctx.Err(); err != nil {
 		return errors.Wrap(err, "Not sending message as context is aborted")
 	}
-	m.Expect(ctx, interactionId, acceptsMessage, handleMessage, handleError) // We register the expectation first to avoid getting a response between sending and adding the expect
-	m.log.Trace().Str("interactionId", interactionId).Msg("Sending request")
-	return m.Send(ctx, interactionId, message)
+	m.Expect(ctx, interactionInfo, acceptsMessage, handleMessage, handleError) // We register the expectation first to avoid getting a response between sending and adding the expect
+	m.log.Trace().Str("interactionInfo", interactionInfo).Msg("Sending request")
+	return m.Send(ctx, interactionInfo, message)
 }
 
 func (m *defaultCodec) TimeoutExpectations(now time.Time) time.Duration {
diff --git a/plc4go/spi/default/DefaultCodec_test.go b/plc4go/spi/default/DefaultCodec_test.go
index 2918ba97c5..d55ea4a578 100644
--- a/plc4go/spi/default/DefaultCodec_test.go
+++ b/plc4go/spi/default/DefaultCodec_test.go
@@ -497,12 +497,12 @@ func Test_defaultCodec_Expect(t *testing.T) {
 		customMessageHandling         CustomMessageHandler
 	}
 	type args struct {
-		ctx            context.Context
-		interactionId  string
-		acceptsMessage spi.AcceptsMessage
-		handleMessage  spi.HandleMessage
-		handleError    spi.HandleError
-		ttl            time.Duration
+		ctx             context.Context
+		interactionInfo string
+		acceptsMessage  spi.AcceptsMessage
+		handleMessage   spi.HandleMessage
+		handleError     spi.HandleError
+		ttl             time.Duration
 	}
 	tests := []struct {
 		name   string
@@ -514,7 +514,7 @@ func Test_defaultCodec_Expect(t *testing.T) {
 			name: "expect it",
 			setup: func(t *testing.T, fields *fields, args *args) {
 				args.ctx = testutils.TestContext(t)
-				args.interactionId = t.Name()
+				args.interactionInfo = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -536,7 +536,7 @@ func Test_defaultCodec_Expect(t *testing.T) {
 				customMessageHandling:         tt.fields.customMessageHandling,
 				log:                           testutils.ProduceTestingLogger(t),
 			}
-			m.Expect(tt.args.ctx, tt.args.interactionId, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError)
+			m.Expect(tt.args.ctx, tt.args.interactionInfo, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError)
 		})
 	}
 }
@@ -917,13 +917,13 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 		customMessageHandling         CustomMessageHandler
 	}
 	type args struct {
-		ctx            context.Context
-		interactionId  string
-		message        spi.Message
-		acceptsMessage spi.AcceptsMessage
-		handleMessage  spi.HandleMessage
-		handleError    spi.HandleError
-		ttl            time.Duration
+		ctx             context.Context
+		interactionInfo string
+		message         spi.Message
+		acceptsMessage  spi.AcceptsMessage
+		handleMessage   spi.HandleMessage
+		handleError     spi.HandleError
+		ttl             time.Duration
 	}
 	tests := []struct {
 		name    string
@@ -940,7 +940,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				fields.DefaultCodecRequirements = requirements
 
 				args.ctx = testutils.TestContext(t)
-				args.interactionId = t.Name()
+				args.interactionInfo = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -955,7 +955,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				ctx, cancelFunc := context.WithCancel(testutils.TestContext(t))
 				cancelFunc()
 				args.ctx = ctx
-				args.interactionId = t.Name()
+				args.interactionInfo = t.Name()
 			},
 			wantErr: assert.Error,
 		},
@@ -967,7 +967,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				fields.DefaultCodecRequirements = requirements
 
 				args.ctx = testutils.TestContext(t)
-				args.interactionId = t.Name()
+				args.interactionInfo = t.Name()
 				var cancelFunc context.CancelFunc
 				args.ctx, cancelFunc = context.WithTimeout(args.ctx, 20*time.Second)
 				t.Cleanup(cancelFunc)
@@ -990,7 +990,7 @@ func Test_defaultCodec_SendRequest(t *testing.T) {
 				customMessageHandling:         tt.fields.customMessageHandling,
 				log:                           testutils.ProduceTestingLogger(t),
 			}
-			tt.wantErr(t, m.SendRequest(tt.args.ctx, tt.args.interactionId, tt.args.message, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError), fmt.Sprintf("SendRequest(%v, %v, func(), func(), func(), %v)", tt.args.ctx, tt.args.message, tt.args.ttl))
+			tt.wantErr(t, m.SendRequest(tt.args.ctx, tt.args.interactionInfo, tt.args.message, tt.args.acceptsMessage, tt.args.handleMessage, tt.args.handleError), fmt.Sprintf("SendRequest(%v, %v, func(), func(), func(), %v)", tt.args.ctx, tt.args.message, tt.args.ttl))
 		})
 	}
 }
diff --git a/plc4go/spi/default/defaultExpectation.go b/plc4go/spi/default/defaultExpectation.go
index 627c9589dd..fa1e0a3bd3 100644
--- a/plc4go/spi/default/defaultExpectation.go
+++ b/plc4go/spi/default/defaultExpectation.go
@@ -30,29 +30,29 @@ import (
 )
 
 type defaultExpectation struct {
-	Uuid           uuid.UUID
-	InteractionId  string
-	Ctx            context.Context
-	CancelFunc     context.CancelCauseFunc
-	CreationTime   time.Time
-	Expiration     time.Time
-	AcceptsMessage spi.AcceptsMessage
-	HandleMessage  spi.HandleMessage
-	HandleError    spi.HandleError
+	Uuid            uuid.UUID
+	interactionInfo string
+	Ctx             context.Context
+	CancelFunc      context.CancelCauseFunc
+	CreationTime    time.Time
+	Expiration      time.Time
+	AcceptsMessage  spi.AcceptsMessage
+	HandleMessage   spi.HandleMessage
+	HandleError     spi.HandleError
 }
 
-func newDefaultExpectation(ctx context.Context, interactionId string, ttl time.Duration, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) *defaultExpectation {
+func newDefaultExpectation(ctx context.Context, interactionInfo string, ttl time.Duration, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) *defaultExpectation {
 	ctx, cancelFunc := context.WithCancelCause(ctx)
 	return &defaultExpectation{
-		Uuid:           uuid.New(),
-		InteractionId:  interactionId,
-		Ctx:            ctx,
-		CancelFunc:     cancelFunc,
-		CreationTime:   time.Now(),
-		Expiration:     time.Now().Add(ttl),
-		AcceptsMessage: acceptsMessage,
-		HandleMessage:  handleMessage,
-		HandleError:    handleError,
+		Uuid:            uuid.New(),
+		interactionInfo: interactionInfo,
+		Ctx:             ctx,
+		CancelFunc:      cancelFunc,
+		CreationTime:    time.Now(),
+		Expiration:      time.Now().Add(ttl),
+		AcceptsMessage:  acceptsMessage,
+		HandleMessage:   handleMessage,
+		HandleError:     handleError,
 	}
 }
 
@@ -85,5 +85,5 @@ func (d *defaultExpectation) GetHandleError() spi.HandleError {
 }
 
 func (d *defaultExpectation) String() string {
-	return fmt.Sprintf("Expectation '%s' %s (expires at %v in %s)", d.InteractionId, d.Uuid, d.Expiration, time.Until(d.Expiration))
+	return fmt.Sprintf("Expectation '%s' %s (expires at %v in %s)", d.interactionInfo, d.Uuid, d.Expiration, time.Until(d.Expiration))
 }
diff --git a/plc4go/spi/default/mocks_test.go b/plc4go/spi/default/mocks_test.go
index 51af0b4f34..96cbeece1b 100644
--- a/plc4go/spi/default/mocks_test.go
+++ b/plc4go/spi/default/mocks_test.go
@@ -431,8 +431,8 @@ func (_c *MockDefaultCodecRequirements_Receive_Call) RunAndReturn(run func(ctx c
 }
 
 // Send provides a mock function for the type MockDefaultCodecRequirements
-func (_mock *MockDefaultCodecRequirements) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	ret := _mock.Called(ctx, interactionId, message)
+func (_mock *MockDefaultCodecRequirements) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionInfo, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
@@ -440,7 +440,7 @@ func (_mock *MockDefaultCodecRequirements) Send(ctx context.Context, interaction
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
-		r0 = returnFunc(ctx, interactionId, message)
+		r0 = returnFunc(ctx, interactionInfo, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -454,13 +454,13 @@ type MockDefaultCodecRequirements_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message spi.Message
-func (_e *MockDefaultCodecRequirements_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockDefaultCodecRequirements_Send_Call {
-	return &MockDefaultCodecRequirements_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
+func (_e *MockDefaultCodecRequirements_Expecter) Send(ctx interface{}, interactionInfo interface{}, message interface{}) *MockDefaultCodecRequirements_Send_Call {
+	return &MockDefaultCodecRequirements_Send_Call{Call: _e.mock.On("Send", ctx, interactionInfo, message)}
 }
 
-func (_c *MockDefaultCodecRequirements_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockDefaultCodecRequirements_Send_Call {
+func (_c *MockDefaultCodecRequirements_Send_Call) Run(run func(ctx context.Context, interactionInfo string, message spi.Message)) *MockDefaultCodecRequirements_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -488,7 +488,7 @@ func (_c *MockDefaultCodecRequirements_Send_Call) Return(err error) *MockDefault
 	return _c
 }
 
-func (_c *MockDefaultCodecRequirements_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockDefaultCodecRequirements_Send_Call {
+func (_c *MockDefaultCodecRequirements_Send_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message spi.Message) error) *MockDefaultCodecRequirements_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
@@ -616,8 +616,8 @@ func (_c *MockDefaultCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
-	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
+func (_mock *MockDefaultCodec) Expect(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+	_mock.Called(ctx, interactionInfo, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -628,15 +628,15 @@ type MockDefaultCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockDefaultCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_Expect_Call {
-	return &MockDefaultCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
+func (_e *MockDefaultCodec_Expecter) Expect(ctx interface{}, interactionInfo interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_Expect_Call {
+	return &MockDefaultCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionInfo, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockDefaultCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
+func (_c *MockDefaultCodec_Expect_Call) Run(run func(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -674,7 +674,7 @@ func (_c *MockDefaultCodec_Expect_Call) Return() *MockDefaultCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockDefaultCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
+func (_c *MockDefaultCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -816,8 +816,8 @@ func (_c *MockDefaultCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockDe
 }
 
 // Send provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	ret := _mock.Called(ctx, interactionId, message)
+func (_mock *MockDefaultCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionInfo, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
@@ -825,7 +825,7 @@ func (_mock *MockDefaultCodec) Send(ctx context.Context, interactionId string, m
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
-		r0 = returnFunc(ctx, interactionId, message)
+		r0 = returnFunc(ctx, interactionInfo, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -839,13 +839,13 @@ type MockDefaultCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message spi.Message
-func (_e *MockDefaultCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockDefaultCodec_Send_Call {
-	return &MockDefaultCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
+func (_e *MockDefaultCodec_Expecter) Send(ctx interface{}, interactionInfo interface{}, message interface{}) *MockDefaultCodec_Send_Call {
+	return &MockDefaultCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionInfo, message)}
 }
 
-func (_c *MockDefaultCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockDefaultCodec_Send_Call {
+func (_c *MockDefaultCodec_Send_Call) Run(run func(ctx context.Context, interactionInfo string, message spi.Message)) *MockDefaultCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -873,14 +873,14 @@ func (_c *MockDefaultCodec_Send_Call) Return(err error) *MockDefaultCodec_Send_C
 	return _c
 }
 
-func (_c *MockDefaultCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockDefaultCodec_Send_Call {
+func (_c *MockDefaultCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message spi.Message) error) *MockDefaultCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockDefaultCodec
-func (_mock *MockDefaultCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
-	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockDefaultCodec) SendRequest(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+	ret := _mock.Called(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
@@ -888,7 +888,7 @@ func (_mock *MockDefaultCodec) SendRequest(ctx context.Context, interactionId st
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
-		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+		r0 = returnFunc(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -902,16 +902,16 @@ type MockDefaultCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message spi.Message
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockDefaultCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_SendRequest_Call {
-	return &MockDefaultCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockDefaultCodec_Expecter) SendRequest(ctx interface{}, interactionInfo interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockDefaultCodec_SendRequest_Call {
+	return &MockDefaultCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockDefaultCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_SendRequest_Call {
+func (_c *MockDefaultCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockDefaultCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -954,7 +954,7 @@ func (_c *MockDefaultCodec_SendRequest_Call) Return(err error) *MockDefaultCodec
 	return _c
 }
 
-func (_c *MockDefaultCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockDefaultCodec_SendRequest_Call {
+func (_c *MockDefaultCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockDefaultCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
@@ -3730,8 +3730,8 @@ func (_c *MockMessageCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
-	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) {
+	_mock.Called(ctx, interactionInfo, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -3742,15 +3742,15 @@ type MockMessageCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
-	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionInfo interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
+	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionInfo, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -3788,7 +3788,7 @@ func (_c *MockMessageCodec_Expect_Call) Return() *MockMessageCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -3930,8 +3930,8 @@ func (_c *MockMessageCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockMe
 }
 
 // Send provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, message spi.Message) error {
-	ret := _mock.Called(ctx, interactionId, message)
+func (_mock *MockMessageCodec) Send(ctx context.Context, interactionInfo string, message spi.Message) error {
+	ret := _mock.Called(ctx, interactionInfo, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
@@ -3939,7 +3939,7 @@ func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, m
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message) error); ok {
-		r0 = returnFunc(ctx, interactionId, message)
+		r0 = returnFunc(ctx, interactionInfo, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -3953,13 +3953,13 @@ type MockMessageCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message spi.Message
-func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockMessageCodec_Send_Call {
-	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
+func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionInfo interface{}, message interface{}) *MockMessageCodec_Send_Call {
+	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionInfo, message)}
 }
 
-func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message)) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionInfo string, message spi.Message)) *MockMessageCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -3987,14 +3987,14 @@ func (_c *MockMessageCodec_Send_Call) Return(err error) *MockMessageCodec_Send_C
 	return _c
 }
 
-func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message) error) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message spi.Message) error) *MockMessageCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
-	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error {
+	ret := _mock.Called(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
@@ -4002,7 +4002,7 @@ func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId st
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, spi.Message, spi.AcceptsMessage, spi.HandleMessage, spi.HandleError) error); ok {
-		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+		r0 = returnFunc(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -4016,16 +4016,16 @@ type MockMessageCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message spi.Message
 //   - acceptsMessage spi.AcceptsMessage
 //   - handleMessage spi.HandleMessage
 //   - handleError spi.HandleError
-func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
-	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionInfo interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
+	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError)) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -4068,7 +4068,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Return(err error) *MockMessageCodec
 	return _c
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError) error) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/plc4go/spi/mocks_test.go b/plc4go/spi/mocks_test.go
index 9cb4800577..fdc4bbc88d 100644
--- a/plc4go/spi/mocks_test.go
+++ b/plc4go/spi/mocks_test.go
@@ -1489,8 +1489,8 @@ func (_c *MockMessageCodec_Disconnect_Call) RunAndReturn(run func() error) *Mock
 }
 
 // Expect provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) {
-	_mock.Called(ctx, interactionId, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) Expect(ctx context.Context, interactionInfo string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) {
+	_mock.Called(ctx, interactionInfo, acceptsMessage, handleMessage, handleError)
 	return
 }
 
@@ -1501,15 +1501,15 @@ type MockMessageCodec_Expect_Call struct {
 
 // Expect is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - acceptsMessage AcceptsMessage
 //   - handleMessage HandleMessage
 //   - handleError HandleError
-func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionId interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
-	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionId, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) Expect(ctx interface{}, interactionInfo interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_Expect_Call {
+	return &MockMessageCodec_Expect_Call{Call: _e.mock.On("Expect", ctx, interactionInfo, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) Run(run func(ctx context.Context, interactionInfo string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -1547,7 +1547,7 @@ func (_c *MockMessageCodec_Expect_Call) Return() *MockMessageCodec_Expect_Call {
 	return _c
 }
 
-func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionId string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
+func (_c *MockMessageCodec_Expect_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_Expect_Call {
 	_c.Run(run)
 	return _c
 }
@@ -1643,8 +1643,8 @@ func (_c *MockMessageCodec_IsRunning_Call) RunAndReturn(run func() bool) *MockMe
 }
 
 // Send provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, message Message) error {
-	ret := _mock.Called(ctx, interactionId, message)
+func (_mock *MockMessageCodec) Send(ctx context.Context, interactionInfo string, message Message) error {
+	ret := _mock.Called(ctx, interactionInfo, message)
 
 	if len(ret) == 0 {
 		panic("no return value specified for Send")
@@ -1652,7 +1652,7 @@ func (_mock *MockMessageCodec) Send(ctx context.Context, interactionId string, m
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, Message) error); ok {
-		r0 = returnFunc(ctx, interactionId, message)
+		r0 = returnFunc(ctx, interactionInfo, message)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -1666,13 +1666,13 @@ type MockMessageCodec_Send_Call struct {
 
 // Send is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message Message
-func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionId interface{}, message interface{}) *MockMessageCodec_Send_Call {
-	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionId, message)}
+func (_e *MockMessageCodec_Expecter) Send(ctx interface{}, interactionInfo interface{}, message interface{}) *MockMessageCodec_Send_Call {
+	return &MockMessageCodec_Send_Call{Call: _e.mock.On("Send", ctx, interactionInfo, message)}
 }
 
-func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionId string, message Message)) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) Run(run func(ctx context.Context, interactionInfo string, message Message)) *MockMessageCodec_Send_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -1700,14 +1700,14 @@ func (_c *MockMessageCodec_Send_Call) Return(err error) *MockMessageCodec_Send_C
 	return _c
 }
 
-func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message Message) error) *MockMessageCodec_Send_Call {
+func (_c *MockMessageCodec_Send_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message Message) error) *MockMessageCodec_Send_Call {
 	_c.Call.Return(run)
 	return _c
 }
 
 // SendRequest provides a mock function for the type MockMessageCodec
-func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error {
-	ret := _mock.Called(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionInfo string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error {
+	ret := _mock.Called(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 
 	if len(ret) == 0 {
 		panic("no return value specified for SendRequest")
@@ -1715,7 +1715,7 @@ func (_mock *MockMessageCodec) SendRequest(ctx context.Context, interactionId st
 
 	var r0 error
 	if returnFunc, ok := ret.Get(0).(func(context.Context, string, Message, AcceptsMessage, HandleMessage, HandleError) error); ok {
-		r0 = returnFunc(ctx, interactionId, message, acceptsMessage, handleMessage, handleError)
+		r0 = returnFunc(ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -1729,16 +1729,16 @@ type MockMessageCodec_SendRequest_Call struct {
 
 // SendRequest is a helper method to define mock.On call
 //   - ctx context.Context
-//   - interactionId string
+//   - interactionInfo string
 //   - message Message
 //   - acceptsMessage AcceptsMessage
 //   - handleMessage HandleMessage
 //   - handleError HandleError
-func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionId interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
-	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionId, message, acceptsMessage, handleMessage, handleError)}
+func (_e *MockMessageCodec_Expecter) SendRequest(ctx interface{}, interactionInfo interface{}, message interface{}, acceptsMessage interface{}, handleMessage interface{}, handleError interface{}) *MockMessageCodec_SendRequest_Call {
+	return &MockMessageCodec_SendRequest_Call{Call: _e.mock.On("SendRequest", ctx, interactionInfo, message, acceptsMessage, handleMessage, handleError)}
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) Run(run func(ctx context.Context, interactionInfo string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError)) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Run(func(args mock.Arguments) {
 		var arg0 context.Context
 		if args[0] != nil {
@@ -1781,7 +1781,7 @@ func (_c *MockMessageCodec_SendRequest_Call) Return(err error) *MockMessageCodec
 	return _c
 }
 
-func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionId string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error) *MockMessageCodec_SendRequest_Call {
+func (_c *MockMessageCodec_SendRequest_Call) RunAndReturn(run func(ctx context.Context, interactionInfo string, message Message, acceptsMessage AcceptsMessage, handleMessage HandleMessage, handleError HandleError) error) *MockMessageCodec_SendRequest_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/plc4go/spi/transactions/RequestTransaction.go b/plc4go/spi/transactions/RequestTransaction.go
index 4b0aa6467b..f006de1bc1 100644
--- a/plc4go/spi/transactions/RequestTransaction.go
+++ b/plc4go/spi/transactions/RequestTransaction.go
@@ -56,8 +56,9 @@ type RequestTransaction interface {
 
 //go:generate go tool plc4xGenerator -type=requestTransaction
 type requestTransaction struct {
-	parent        *requestTransactionManager `ignore:"true"`
-	transactionId int32
+	parent          *requestTransactionManager `ignore:"true"`
+	transactionId   int32
+	transactionInfo string
 
 	/** The initial operation to perform to kick off the request */
 	operation        pool.Runnable `ignore:"true"` // TODO: maybe we can treat this as a function some day if we are able to check the definition in gen
@@ -69,11 +70,12 @@ type requestTransaction struct {
 	log zerolog.Logger
 }
 
-func newRequestTransaction(localLog zerolog.Logger, parent *requestTransactionManager, transactionId int32) *requestTransaction {
+func newRequestTransaction(localLog zerolog.Logger, parent *requestTransactionManager, transactionId int32, transactionInfo string) *requestTransaction {
 	return &requestTransaction{
-		parent:        parent,
-		transactionId: transactionId,
-		log:           localLog.With().Int32("transactionId", transactionId).Logger(),
+		parent:          parent,
+		transactionId:   transactionId,
+		transactionInfo: transactionInfo,
+		log:             localLog.With().Int32("transactionId", transactionId).Str("transactionInfo", transactionInfo).Logger(),
 	}
 }
 
diff --git a/plc4go/spi/transactions/RequestTransactionManager.go b/plc4go/spi/transactions/RequestTransactionManager.go
index 71ce3485a6..5d94b2649d 100644
--- a/plc4go/spi/transactions/RequestTransactionManager.go
+++ b/plc4go/spi/transactions/RequestTransactionManager.go
@@ -70,7 +70,7 @@ type RequestTransactionManager interface {
 	// SetNumberOfConcurrentRequests sets the number of concurrent requests that will be sent out to a device
 	SetNumberOfConcurrentRequests(numberOfConcurrentRequests int)
 	// StartTransaction starts a RequestTransaction
-	StartTransaction() RequestTransaction
+	StartTransaction(transactionInfo string) RequestTransaction
 }
 
 // NewRequestTransactionManager creates a new RequestTransactionManager
@@ -198,7 +198,7 @@ func (r *requestTransactionManager) processWorklog() {
 	}
 }
 
-func (r *requestTransactionManager) StartTransaction() RequestTransaction {
+func (r *requestTransactionManager) StartTransaction(transactionInfo string) RequestTransaction {
 	r.transactionMutex.Lock()
 	defer r.transactionMutex.Unlock()
 	currentTransactionId := r.currentTransactionId
@@ -207,7 +207,7 @@ func (r *requestTransactionManager) StartTransaction() RequestTransaction {
 	if !r.traceTransactionManagerTransactions {
 		transactionLogger = zerolog.Nop()
 	}
-	transaction := newRequestTransaction(transactionLogger, r, currentTransactionId)
+	transaction := newRequestTransaction(transactionLogger, r, currentTransactionId, transactionInfo)
 	if r.shutdown.Load() {
 		transaction.completed = true
 		transaction.setCompletionFuture(&completedFuture{errors.New("request transaction manager in shutdown")})
diff --git a/plc4go/spi/transactions/RequestTransactionManager_test.go b/plc4go/spi/transactions/RequestTransactionManager_test.go
index 52164fec0a..383992e9e8 100644
--- a/plc4go/spi/transactions/RequestTransactionManager_test.go
+++ b/plc4go/spi/transactions/RequestTransactionManager_test.go
@@ -218,7 +218,7 @@ func Test_requestTransactionManager_StartTransaction(t *testing.T) {
 			if tt.manipulator != nil {
 				tt.manipulator(t, r)
 			}
-			if got := r.StartTransaction(); !assert.True(t, tt.wantAssert(t, got)) {
+			if got := r.StartTransaction("defaultTransation"); !assert.True(t, tt.wantAssert(t, got)) {
 				t.Errorf("StartTransaction() = %v", got)
 			}
 		})
diff --git a/plc4go/spi/transactions/mocks_test.go b/plc4go/spi/transactions/mocks_test.go
index 986d16a3c9..31afd727d1 100644
--- a/plc4go/spi/transactions/mocks_test.go
+++ b/plc4go/spi/transactions/mocks_test.go
@@ -495,7 +495,7 @@ func (_c *MockRequestTransactionManager_SetNumberOfConcurrentRequests_Call) RunA
 }
 
 // StartTransaction provides a mock function for the type MockRequestTransactionManager
-func (_mock *MockRequestTransactionManager) StartTransaction() RequestTransaction {
+func (_mock *MockRequestTransactionManager) StartTransaction(string) RequestTransaction {
 	ret := _mock.Called()
 
 	if len(ret) == 0 {
diff --git a/plc4go/spi/transactions/requestTransaction_plc4xgen.go b/plc4go/spi/transactions/requestTransaction_plc4xgen.go
index f49954786b..5922dbe8d6 100644
--- a/plc4go/spi/transactions/requestTransaction_plc4xgen.go
+++ b/plc4go/spi/transactions/requestTransaction_plc4xgen.go
@@ -53,6 +53,10 @@ func (d *requestTransaction) SerializeWithWriteBuffer(ctx context.Context, write
 		return err
 	}
 
+	if err := writeBuffer.WriteString("transactionInfo", uint32(len(d.transactionInfo)*8), d.transactionInfo); err != nil {
+		return err
+	}
+
 	if completionFutureLoaded := d.completionFuture.Load(); completionFutureLoaded != nil && *completionFutureLoaded != nil {
 		completionFuture := *completionFutureLoaded
 		if serializableField, ok := completionFuture.(utils.Serializable); ok {


(plc4x) 07/08: feat(plc4go/spi): add operationInfo to Submit for transaction

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 8281025d402f362cef62b4d1ea3ef6081f7d5834
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 14:17:14 2025 +0100

    feat(plc4go/spi): add operationInfo to Submit for transaction
---
 plc4go/internal/bacnetip/Reader.go                 |  2 +-
 plc4go/internal/cbus/CBusMessageMapper_test.go     | 44 +++++++++++-----------
 plc4go/internal/cbus/Reader.go                     |  2 +-
 plc4go/internal/cbus/Writer.go                     |  2 +-
 plc4go/internal/cbus/mocks_test.go                 |  2 +-
 plc4go/internal/eip/Reader.go                      |  2 +-
 plc4go/internal/s7/Reader.go                       |  2 +-
 plc4go/internal/s7/Writer.go                       |  2 +-
 plc4go/spi/default/DefaultCodec_test.go            |  2 +-
 plc4go/spi/transactions/RequestTransaction.go      | 16 ++++----
 plc4go/spi/transactions/RequestTransaction_test.go | 13 ++++---
 plc4go/spi/transactions/mocks_test.go              |  2 +-
 12 files changed, 46 insertions(+), 45 deletions(-)

diff --git a/plc4go/internal/bacnetip/Reader.go b/plc4go/internal/bacnetip/Reader.go
index 2ae7e3c650..4c38b39c84 100644
--- a/plc4go/internal/bacnetip/Reader.go
+++ b/plc4go/internal/bacnetip/Reader.go
@@ -135,7 +135,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 
 		// Start a new request-transaction (Is ended in the response-handler)
 		transaction := m.tm.StartTransaction("read")
-		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+		transaction.Submit("readOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
 			// Send the  over the wire
diff --git a/plc4go/internal/cbus/CBusMessageMapper_test.go b/plc4go/internal/cbus/CBusMessageMapper_test.go
index da609e5870..bae60ec94e 100644
--- a/plc4go/internal/cbus/CBusMessageMapper_test.go
+++ b/plc4go/internal/cbus/CBusMessageMapper_test.go
@@ -1425,7 +1425,7 @@ func TestMapEncodedReply(t *testing.T) {
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
 				t.Logf("Submitting No-Op to transaction\n%v", transaction)
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -1502,7 +1502,7 @@ func TestMapEncodedReply(t *testing.T) {
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
 				t.Logf("Submitting No-Op to transaction %v", transaction)
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 					t.Log("No op-ing")
 				})
@@ -1595,7 +1595,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -1678,7 +1678,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -1744,7 +1744,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -1813,7 +1813,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -1901,7 +1901,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2007,7 +2007,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2077,7 +2077,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2143,7 +2143,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2209,7 +2209,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2275,7 +2275,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2341,7 +2341,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2427,7 +2427,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2493,7 +2493,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2559,7 +2559,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2625,7 +2625,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2691,7 +2691,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2757,7 +2757,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2839,7 +2839,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2905,7 +2905,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
@@ -2971,7 +2971,7 @@ func TestMapEncodedReply(t *testing.T) {
 					assert.NoError(t, transactionManager.Close())
 				})
 				transaction := transactionManager.StartTransaction(t.Name())
-				transaction.Submit(func(context.Context, transactions.RequestTransaction) {
+				transaction.Submit(t.Name(), func(context.Context, transactions.RequestTransaction) {
 					// NO-OP
 				})
 				args.transaction = transaction
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 442ad46edb..b1b21ef2d4 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -127,7 +127,7 @@ func (m *Reader) readSync(ctx context.Context, readRequest apiModel.PlcReadReque
 func (m *Reader) createMessageTransactionAndWait(ctx context.Context, messageToSend readWriteModel.CBusMessage, addResponseCode func(name string, responseCode apiModel.PlcResponseCode), tagName string, addPlcValue func(name string, plcValue apiValues.PlcValue)) {
 	// Start a new request-transaction (Is ended in the response-handler)
 	transaction := m.tm.StartTransaction("read")
-	transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+	transaction.Submit("readOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 		ctx, cancel := context.WithCancel(ctx)
 		context.AfterFunc(transactionContext, cancel)
 		m.log.Trace().Interface("transaction", transaction).Msg("Transaction getting handled")
diff --git a/plc4go/internal/cbus/Writer.go b/plc4go/internal/cbus/Writer.go
index 3e595fa349..ef60b1820c 100644
--- a/plc4go/internal/cbus/Writer.go
+++ b/plc4go/internal/cbus/Writer.go
@@ -113,7 +113,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 			tagNameCopy := tagName
 			// Start a new request-transaction (Is ended in the response-handler)
 			transaction := m.tm.StartTransaction("write")
-			transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+			transaction.Submit("writeOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 				ctx, cancel := context.WithCancel(ctx)
 				context.AfterFunc(transactionContext, cancel)
 				// Send the  over the wire
diff --git a/plc4go/internal/cbus/mocks_test.go b/plc4go/internal/cbus/mocks_test.go
index ca376f276c..47067a7820 100644
--- a/plc4go/internal/cbus/mocks_test.go
+++ b/plc4go/internal/cbus/mocks_test.go
@@ -4236,7 +4236,7 @@ func (_c *MockRequestTransaction_String_Call) RunAndReturn(run func() string) *M
 }
 
 // Submit provides a mock function for the type MockRequestTransaction
-func (_mock *MockRequestTransaction) Submit(operation transactions.RequestTransactionRunnable) {
+func (_mock *MockRequestTransaction) Submit(operationInfo string, operation transactions.RequestTransactionRunnable) {
 	_mock.Called(operation)
 	return
 }
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index 37703f8e9a..77c9acccad 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -107,7 +107,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 				typeIds,
 			)
 			transaction := m.tm.StartTransaction("read")
-			transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+			transaction.Submit("readOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 				ctx, cancel := context.WithCancel(ctx)
 				context.AfterFunc(transactionContext, cancel)
 				if err := m.messageCodec.SendRequest(ctx, "read", request, func(message spi.Message) bool {
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index 04a6a22cef..d3a0326d21 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -114,7 +114,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 		)
 		// Start a new request-transaction (Is ended in the response-handler)
 		transaction := m.tm.StartTransaction("read")
-		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+		transaction.Submit("readOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
 
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index 13796ec2d9..0563989f3c 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -107,7 +107,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 
 		// Start a new request-transaction (Is ended in the response-handler)
 		transaction := m.tm.StartTransaction("write")
-		transaction.Submit(func(transactionContext context.Context, transaction transactions.RequestTransaction) {
+		transaction.Submit("writeOperation", func(transactionContext context.Context, transaction transactions.RequestTransaction) {
 			ctx, cancel := context.WithCancel(ctx)
 			context.AfterFunc(transactionContext, cancel)
 			// Send the over the wire
diff --git a/plc4go/spi/default/DefaultCodec_test.go b/plc4go/spi/default/DefaultCodec_test.go
index d55ea4a578..80a07ef41b 100644
--- a/plc4go/spi/default/DefaultCodec_test.go
+++ b/plc4go/spi/default/DefaultCodec_test.go
@@ -231,7 +231,7 @@ func TestDefaultExpectation_String(t *testing.T) {
 	}{
 		{
 			name: "string it",
-			want: "Expectation 00000000-0000-0000-0000-000000000000 (expires at 0001-01-01 00:00:00 +0000 UTC in -2562047h47m16.854775808s)",
+			want: "Expectation '' 00000000-0000-0000-0000-000000000000 (expires at 0001-01-01 00:00:00 +0000 UTC in -2562047h47m16.854775808s)",
 		},
 	}
 	for _, tt := range tests {
diff --git a/plc4go/spi/transactions/RequestTransaction.go b/plc4go/spi/transactions/RequestTransaction.go
index f006de1bc1..9895b44824 100644
--- a/plc4go/spi/transactions/RequestTransaction.go
+++ b/plc4go/spi/transactions/RequestTransaction.go
@@ -41,7 +41,7 @@ type RequestTransaction interface {
 	// EndRequest signals that this transaction is done
 	EndRequest() error
 	// Submit submits a RequestTransactionRunnable to the RequestTransactionManager
-	Submit(operation RequestTransactionRunnable)
+	Submit(operationInfo string, operation RequestTransactionRunnable)
 	// AwaitCompletion wait for this RequestTransaction to finish. Returns an error if it finished unsuccessful
 	AwaitCompletion(ctx context.Context) error
 	// IsCompleted indicates that the that this RequestTransaction is completed
@@ -120,7 +120,7 @@ func (t *requestTransaction) EndRequest() error {
 	return t.parent.endRequest(t)
 }
 
-func (t *requestTransaction) Submit(operation RequestTransactionRunnable) {
+func (t *requestTransaction) Submit(operationInfo string, operation RequestTransactionRunnable) {
 	t.stateChangeMutex.Lock()
 	defer t.stateChangeMutex.Unlock()
 	if t.completed {
@@ -130,17 +130,17 @@ func (t *requestTransaction) Submit(operation RequestTransactionRunnable) {
 	if t.operation != nil {
 		t.log.Warn().Msg("Operation already set")
 	}
-	t.log.Trace().Int32("transactionId", t.transactionId).Msg("Submission")
+	t.log.Trace().Msg("Submission")
 	t.operation = func(ctx context.Context) {
-		t.log.Trace().Int32("transactionId", t.transactionId).Msg("Start operation")
+		t.log.Trace().Str("operationInfo", operationInfo).Msg("Start operation")
 		operation(ctx, t)
-		t.log.Trace().Int32("transactionId", t.transactionId).Msg("Completed operation")
+		t.log.Trace().Str("operationInfo", operationInfo).Msg("Completed operation")
 	}
 	t.parent.submitTransaction(t)
 }
 
 func (t *requestTransaction) AwaitCompletion(ctx context.Context) error {
-	t.log.Trace().Int32("transactionId", t.transactionId).Msg("Awaiting completion")
+	t.log.Trace().Msg("Awaiting completion")
 	timeout, cancelFunc := context.WithTimeout(ctx, time.Minute*30) // This is intentionally set very high
 	defer cancelFunc()
 	for t.getCompletionFuture() == nil {
@@ -151,7 +151,7 @@ func (t *requestTransaction) AwaitCompletion(ctx context.Context) error {
 		}
 	}
 	if err := t.getCompletionFuture().AwaitCompletion(ctx); err != nil {
-		t.log.Trace().Int32("transactionId", t.transactionId).Msg("Errored")
+		t.log.Trace().Msg("Errored")
 		return err
 	}
 	stillActive := true
@@ -166,7 +166,7 @@ func (t *requestTransaction) AwaitCompletion(ctx context.Context) error {
 		}
 		t.parent.runningRequestMutex.RUnlock()
 	}
-	t.log.Trace().Int32("transactionId", t.transactionId).Msg("Completed")
+	t.log.Trace().Msg("Completed")
 	return nil
 }
 
diff --git a/plc4go/spi/transactions/RequestTransaction_test.go b/plc4go/spi/transactions/RequestTransaction_test.go
index 16dbaf07e7..c95863d394 100644
--- a/plc4go/spi/transactions/RequestTransaction_test.go
+++ b/plc4go/spi/transactions/RequestTransaction_test.go
@@ -35,9 +35,10 @@ import (
 
 func Test_newRequestTransaction(t *testing.T) {
 	type args struct {
-		localLog      zerolog.Logger
-		parent        *requestTransactionManager
-		transactionId int32
+		localLog        zerolog.Logger
+		parent          *requestTransactionManager
+		transactionId   int32
+		transactionInfo string
 	}
 	tests := []struct {
 		name string
@@ -47,13 +48,13 @@ func Test_newRequestTransaction(t *testing.T) {
 		{
 			name: "create it",
 			want: &requestTransaction{
-				log: zerolog.Logger{}.With().Int32("transactionId", 0).Logger(),
+				log: zerolog.Logger{}.With().Int32("transactionId", 0).Str("transactionInfo", "").Logger(),
 			},
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			assert.Equalf(t, tt.want, newRequestTransaction(tt.args.localLog, tt.args.parent, tt.args.transactionId), "newRequestTransaction(%v, %v, %v)", tt.args.localLog, tt.args.parent, tt.args.transactionId)
+			assert.Equalf(t, tt.want, newRequestTransaction(tt.args.localLog, tt.args.parent, tt.args.transactionId, tt.args.transactionInfo), "newRequestTransaction(%v, %v, %v, %v)", tt.args.localLog, tt.args.parent, tt.args.transactionId, tt.args.transactionInfo)
 		})
 	}
 }
@@ -275,7 +276,7 @@ func Test_requestTransaction_Submit(t1 *testing.T) {
 				log:           tt.fields.transactionLog,
 				completed:     tt.fields.completed,
 			}
-			rt.Submit(tt.args.operation)
+			rt.Submit(t.Name(), tt.args.operation)
 			rt.operation(t.Context())
 		})
 	}
diff --git a/plc4go/spi/transactions/mocks_test.go b/plc4go/spi/transactions/mocks_test.go
index 31afd727d1..c223abb423 100644
--- a/plc4go/spi/transactions/mocks_test.go
+++ b/plc4go/spi/transactions/mocks_test.go
@@ -293,7 +293,7 @@ func (_c *MockRequestTransaction_String_Call) RunAndReturn(run func() string) *M
 }
 
 // Submit provides a mock function for the type MockRequestTransaction
-func (_mock *MockRequestTransaction) Submit(operation RequestTransactionRunnable) {
+func (_mock *MockRequestTransaction) Submit(operationInfo string, operation RequestTransactionRunnable) {
 	_mock.Called(operation)
 	return
 }


(plc4x) 02/08: fix(plc4go): finally fix hanging shutdown

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 87f5a6c229be4fbed011b2360abec8c543b7b906
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 12:01:04 2025 +0100

    fix(plc4go): finally fix hanging shutdown
---
 plc4go/internal/cbus/Connection.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 34e080290c..0c94af79a9 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -272,7 +272,7 @@ func (c *Connection) startSubscriptionHandler() {
 			}
 		}()
 		salLogger.Debug().Msg("SAL handler started")
-		for c.IsConnected() {
+		for c.IsConnected() && c.messageCodec.IsRunning() {
 			for monitoredSal := range c.messageCodec.monitoredSALs {
 				if monitoredSal == nil {
 					salLogger.Trace().Msg("monitoredSal chan closed")
@@ -312,7 +312,7 @@ func (c *Connection) startSubscriptionHandler() {
 			}
 		}()
 		mmiLogger.Debug().Msg("default MMI started")
-		for c.IsConnected() {
+		for c.IsConnected() && c.messageCodec.IsRunning() {
 			for calReply := range c.messageCodec.monitoredMMIs {
 				if calReply == nil {
 					mmiLogger.Trace().Msg("channel closed")


(plc4x) 08/08: test(plc4go/cbus): disable test temporary

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 9eda95c2bb69db6a5fb3a8161b84cda5a56caa21
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 14:28:19 2025 +0100

    test(plc4go/cbus): disable test temporary
---
 plc4go/internal/cbus/Browser_test.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/plc4go/internal/cbus/Browser_test.go b/plc4go/internal/cbus/Browser_test.go
index f3f7443d99..ce06c97443 100644
--- a/plc4go/internal/cbus/Browser_test.go
+++ b/plc4go/internal/cbus/Browser_test.go
@@ -496,6 +496,7 @@ func TestBrowser_extractAttributes(t *testing.T) {
 }
 
 func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) {
+	t.Skip("skipping test because for some reason it is getting stuck") // TODO: fix this test
 	type fields struct {
 		DefaultBrowser  _default.DefaultBrowser
 		connection      plc4go.PlcConnection


(plc4x) 05/08: fix(plc4go/spi): TransportInstance should stop on ctx abort

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit fdf8e842b42e858795c5e08439b1d71d8ff3bd25
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 14:01:53 2025 +0100

    fix(plc4go/spi): TransportInstance should stop on ctx abort
---
 plc4go/internal/cbus/Browser_test.go            | 3 +--
 plc4go/internal/cbus/MessageCodec.go            | 7 +++++--
 plc4go/spi/transports/test/TransportInstance.go | 2 ++
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/plc4go/internal/cbus/Browser_test.go b/plc4go/internal/cbus/Browser_test.go
index 860463a1af..f3f7443d99 100644
--- a/plc4go/internal/cbus/Browser_test.go
+++ b/plc4go/internal/cbus/Browser_test.go
@@ -519,7 +519,7 @@ func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) {
 
 				transport := test.NewTransport(_options...)
 				transportUrl := url.URL{Scheme: "test"}
-				transportInstance, err := transport.CreateTransportInstance(transportUrl, map[string][]string{"simulatedLatency": {"10ms"}}, _options...)
+				transportInstance, err := transport.CreateTransportInstance(transportUrl, map[string][]string{"simulatedLatency": {"0ms"}}, _options...)
 				require.NoError(t, err)
 				t.Cleanup(func() {
 					t.Log(transportInstance.Close())
@@ -629,7 +629,6 @@ func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) {
 					return
 				}
 				assert.Equalf(t, tt.want, got, "getInstalledUnitAddressBytes(%v)", tt.args.ctx)
-				t.Log("Banananaaaa")
 			})
 		})
 	}
diff --git a/plc4go/internal/cbus/MessageCodec.go b/plc4go/internal/cbus/MessageCodec.go
index 55783800ff..10b65ea2c8 100644
--- a/plc4go/internal/cbus/MessageCodec.go
+++ b/plc4go/internal/cbus/MessageCodec.go
@@ -134,7 +134,7 @@ func (m *MessageCodec) Receive(ctx context.Context) (spi.Message, error) {
 	// Fill the buffer
 	{
 		fillCtx, fillCtxCancel := context.WithTimeout(ctx, 100*time.Millisecond)
-		if err := ti.FillBuffer(fillCtx, func(pos uint, currentByte byte, reader transports.ExtendedReader) bool {
+		if err := ti.FillBuffer(fillCtx, func(pos uint, currentByte byte, reader transports.ExtendedReader) (keepGoing bool) {
 			switch currentByte {
 			case
 				readWriteModel.ResponseTermination_CR,
@@ -144,7 +144,10 @@ func (m *MessageCodec) Receive(ctx context.Context) (spi.Message, error) {
 				confirmation = true
 				// In case we have directly more data in the buffer after a confirmation
 				_, err := reader.Peek(int(pos + 1))
-				return err == nil
+				if err != nil {
+					return false
+				}
+				return true
 			case
 				byte(readWriteModel.ConfirmationType_NOT_TRANSMITTED_TO_MANY_RE_TRANSMISSIONS),
 				byte(readWriteModel.ConfirmationType_NOT_TRANSMITTED_CORRUPTION),
diff --git a/plc4go/spi/transports/test/TransportInstance.go b/plc4go/spi/transports/test/TransportInstance.go
index ffc21b3997..70a39b504f 100644
--- a/plc4go/spi/transports/test/TransportInstance.go
+++ b/plc4go/spi/transports/test/TransportInstance.go
@@ -166,6 +166,8 @@ func (m *TransportInstance) FillBuffer(ctx context.Context, until func(pos uint,
 		timer := time.NewTimer(m.simulatedLatency)
 		select {
 		case <-ctx.Done():
+			m.log.Trace().Msg("Context done")
+			return ctx.Err()
 		case <-timer.C:
 		}
 		m.log.Trace().Uint32("nBytes", nBytes).Msg("Peeking bytes")


(plc4x) 03/08: perf(plc4go/spi): avoid frequent recompile of ascii regex

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit a97260fd866111626ee1af8d43ac526f61a2ce79
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Nov 20 12:23:09 2025 +0100

    perf(plc4go/spi): avoid frequent recompile of ascii regex
---
 plc4go/spi/utils/asciiBox.go | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/plc4go/spi/utils/asciiBox.go b/plc4go/spi/utils/asciiBox.go
index dc2e3edde6..7a42cf919b 100644
--- a/plc4go/spi/utils/asciiBox.go
+++ b/plc4go/spi/utils/asciiBox.go
@@ -488,10 +488,14 @@ func countChars(s string) int {
 	return len([]rune(ANSI_PATTERN.ReplaceAllString(s, "")))
 }
 
+var controlStripRegex = regexp.MustCompile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
+
 // cleanString returns the strings minus the control sequences
 func cleanString(s string) string {
-	regex, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
-	return regex.ReplaceAllString(s, "")
+	if s == "" {
+		return s
+	}
+	return controlStripRegex.ReplaceAllString(s, "")
 }
 
 //