29#ifndef PROTOCORE_MBUS_H
30#define PROTOCORE_MBUS_H
39#define MBUS_START_SHORT 0x10u
40#define MBUS_START_LONG 0x68u
41#define MBUS_STOP 0x16u
45#define MBUS_C_SND_NKE 0x40u
46#define MBUS_C_REQ_UD2 0x5Bu
47#define MBUS_C_REQ_UD1 0x5Au
48#define MBUS_C_SND_UD 0x53u
49#define MBUS_C_RSP_UD 0x08u
52#define MBUS_CI_DATA_SEND 0x51u
53#define MBUS_CI_SELECT 0x52u
54#define MBUS_CI_RSP_VARIABLE 0x72u
55#define MBUS_CI_RSP_FIXED 0x73u
57#define MBUS_MAX_DATA 252u
60enum class MbusFrameType : uint8_t
80enum class MbusDifCoding : uint8_t
87 MBUS_DIF_REAL32 = 0x5,
90 MBUS_DIF_READOUT = 0x8,
95 MBUS_DIF_VARIABLE = 0xD,
97 MBUS_DIF_SPECIAL = 0xF,
113size_t pc_mbus_build_ack(uint8_t *buf,
size_t cap);
116size_t pc_mbus_build_short(uint8_t *buf,
size_t cap, uint8_t c, uint8_t a);
119size_t pc_mbus_build_long(uint8_t *buf,
size_t cap, uint8_t c, uint8_t a, uint8_t ci,
const uint8_t *data,
123size_t pc_mbus_build_snd_nke(uint8_t *buf,
size_t cap, uint8_t a);
126size_t pc_mbus_build_req_ud2(uint8_t *buf,
size_t cap, uint8_t a,
bool fcb);
130size_t pc_mbus_build_req_ud1(uint8_t *buf,
size_t cap, uint8_t a,
bool fcb);
138bool pc_mbus_parse(
const uint8_t *buf,
size_t len, MbusFrame *out,
size_t *consumed);
143uint8_t pc_mbus_dif_data_len(uint8_t coding);
150bool pc_mbus_record_next(
const uint8_t *body,
size_t len,
size_t *pos, MbusRecord *out);
161bool pc_mbus_record_value_int(
const MbusRecord *r, int64_t *out);
164bool pc_mbus_record_value_real(
const MbusRecord *r,
float *out);
167enum class MbusUnit : uint8_t
169 MBUS_UNIT_UNKNOWN = 0,
189bool pc_mbus_vif_decode(uint8_t vif, MbusUnit *unit, int8_t *exp10);
197#define MBUS_VAR_HEADER_LEN 12u
200#define MBUS_MEDIUM_OTHER 0x00u
201#define MBUS_MEDIUM_OIL 0x01u
202#define MBUS_MEDIUM_ELECTRICITY 0x02u
203#define MBUS_MEDIUM_GAS 0x03u
204#define MBUS_MEDIUM_HEAT_OUTLET 0x04u
205#define MBUS_MEDIUM_STEAM 0x05u
206#define MBUS_MEDIUM_WARM_WATER 0x06u
207#define MBUS_MEDIUM_WATER 0x07u
208#define MBUS_MEDIUM_HEAT_COST 0x08u
209#define MBUS_MEDIUM_HEAT_INLET 0x0Cu
210#define MBUS_MEDIUM_HEAT_COOLING 0x0Du
211#define MBUS_MEDIUM_COLD_WATER 0x16u
217 char manufacturer[4];
218 uint16_t manufacturer_raw;
231bool pc_mbus_parse_var_header(
const uint8_t *body,
size_t len, MbusVarHeader *out);
User-facing configuration for ProtoCore.