KNXnetIP v0.2.0 KNXnetIP.Telegram View Source
Encoding and decoding of KNX telegram structures in cEMI format, as used in KNXnet/IP.
The Telegram
struct is used as a model of KNX telegrams. When sending a
message to the KNX network, you create a Telegram
struct, encode it and
send it using the KNXnetIP.Tunnel
.
Examples
When you create a telegram, you must specify source
and destination
.
source
is a physical address and should always be "0.0.0"
when sent
from a tunnel client to the tunnel server. destination
is the the group
address that you want to interact with. Note: currently the library only
supports 3-level group addresses, e.g. “1/2/16” (main, middle and
subgroup).
To read the value of a group address, you’ll need a telegram of
type :request
and service :group_read
:
read_request = %Telegram{
type: :request,
service: :group_read,
source: "0.0.0",
group_address: "0/0/2" # replace with the group adress you need to read
value: <<0::6>> # a read request always has the value zero
}
Once encoded and sent to the KNX network, you will later receive a read response that contains the value of the group address:
read_response = %Telegram{
type: :indication,
service: :group_response,
source: "1.1.4",
destination: "0/0/2",
value: <<0x41, 0x46, 0x8F, 0x5C>>
}
The value
field now contains the value of the group address, encoded as a
KNX datapoint. To decode datapoints, see KNX.Datapoint
.
To send a group write, the type is still :request
but the service is now
:group_write
:
write_request = %Telegram{
type: :request,
service: :group_write,
source: "0.0.0",
destination: "0/0/2",
value: <<0x42, 0x69, 0x22, 0xD1>>
}
Again, the value
is the binary representation of a KNX datapoint with the
value you want to write. See KNX.Datapoint
for how to encode a value.
Whenever you send a telegram to the KNX bus, you will receive a telegram
back of type :confirmation
. This confirmation telegram simply echoes the
telegram you sent back to you - only the source
and type
fields will be
different. Example confirmation for a group read:
confirmation = %Telegram{
type: :confirmation,
service: :group_read,
source: "1.0.53",
destination: "0/0/2",
value: <<0::6>>
}
Link to this section Summary
Link to this section Types
Elixir datastructure that represents a KNX telegram.
The struct contains the necessary fields for encoding and decoding a telegram using cEMI.
:type
- The Data Link Layer service primitive.:service
- The Application Layer service primvite.:source
- Physical address of the device sending the telegram. Represented as a string, e.g. “1.1.1”.:destination
- Logical address (group address) that the telegram corresponds to. Represented as a string, e.g. “1/0/4”.:value
- Encoded KNX datapoint.
Link to this section Functions
Decode a telegram.
Example
iex> telegram = <<41, 0, 188, 224, 16, 3, 0, 3, 1, 0, 0>>
iex> {:ok, decoded_telegram} = KNXnetIP.Telegram.decode(telegram)
{:ok,
%KNXnetIP.Telegram{
destination: "0/0/3",
service: :group_read,
source: "1.0.3",
type: :indication,
value: <<0::size(6)>>
}}