Co-authored-by: Thomas Rupprecht <rupprecht.thomas@gmail.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
70 lines
3.4 KiB
C++
70 lines
3.4 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
|
|
namespace esphome::dlms_meter {
|
|
|
|
/*
|
|
+----------------------------------------------------+ -
|
|
| Start Character [0x68] | \
|
|
+----------------------------------------------------+ |
|
|
| Data Length (L) | |
|
|
+----------------------------------------------------+ |
|
|
| Data Length Repeat (L) | |
|
|
+----------------------------------------------------+ > M-Bus Data link layer
|
|
| Start Character Repeat [0x68] | |
|
|
+----------------------------------------------------+ |
|
|
| Control/Function Field (C) | |
|
|
+----------------------------------------------------+ |
|
|
| Address Field (A) | /
|
|
+----------------------------------------------------+ -
|
|
| Control Information Field (CI) | \
|
|
+----------------------------------------------------+ |
|
|
| Source Transport Service Access Point (STSAP) | > DLMS/COSEM M-Bus transport layer
|
|
+----------------------------------------------------+ |
|
|
| Destination Transport Service Access Point (DTSAP) | /
|
|
+----------------------------------------------------+ -
|
|
| | \
|
|
~ ~ |
|
|
Data > DLMS/COSEM Application Layer
|
|
~ ~ |
|
|
| | /
|
|
+----------------------------------------------------+ -
|
|
| Checksum | \
|
|
+----------------------------------------------------+ > M-Bus Data link layer
|
|
| Stop Character [0x16] | /
|
|
+----------------------------------------------------+ -
|
|
|
|
Data_Length = L - C - A - CI
|
|
Each line (except Data) is one Byte
|
|
|
|
Possible Values found in publicly available docs:
|
|
- C: 0x53/0x73 (SND_UD)
|
|
- A: FF (Broadcast)
|
|
- CI: 0x00-0x1F/0x60/0x61/0x7C/0x7D
|
|
- STSAP: 0x01 (Management Logical Device ID 1 of the meter)
|
|
- DTSAP: 0x67 (Consumer Information Push Client ID 103)
|
|
*/
|
|
|
|
// MBUS start bytes for different telegram formats:
|
|
// - Single Character: 0xE5 (length=1)
|
|
// - Short Frame: 0x10 (length=5)
|
|
// - Control Frame: 0x68 (length=9)
|
|
// - Long Frame: 0x68 (length=9+data_length)
|
|
// This component currently only uses Long Frame.
|
|
static constexpr uint8_t START_BYTE_SINGLE_CHARACTER = 0xE5;
|
|
static constexpr uint8_t START_BYTE_SHORT_FRAME = 0x10;
|
|
static constexpr uint8_t START_BYTE_CONTROL_FRAME = 0x68;
|
|
static constexpr uint8_t START_BYTE_LONG_FRAME = 0x68;
|
|
static constexpr uint8_t MBUS_HEADER_INTRO_LENGTH = 4; // Header length for the intro (0x68, length, length, 0x68)
|
|
static constexpr uint8_t MBUS_FULL_HEADER_LENGTH = 9; // Total header length
|
|
static constexpr uint8_t MBUS_FOOTER_LENGTH = 2; // Footer after frame
|
|
static constexpr uint8_t MBUS_MAX_FRAME_LENGTH = 250; // Maximum size of frame
|
|
static constexpr uint8_t MBUS_START1_OFFSET = 0; // Offset of first start byte
|
|
static constexpr uint8_t MBUS_LENGTH1_OFFSET = 1; // Offset of first length byte
|
|
static constexpr uint8_t MBUS_LENGTH2_OFFSET = 2; // Offset of (duplicated) second length byte
|
|
static constexpr uint8_t MBUS_START2_OFFSET = 3; // Offset of (duplicated) second start byte
|
|
static constexpr uint8_t STOP_BYTE = 0x16;
|
|
|
|
} // namespace esphome::dlms_meter
|