13 #define QUEUE_SIZE 256 42 uint8_t pseudo_data_debug_no_meter = 0;
50 char current_unix_time_string[64];
61 unsigned char kmp_unit_string[16];
62 unsigned char kmp_value_string[64];
82 os_printf(
"tried to call kmp_meter_is_ready_cb() before it was set - should not happen\n");
91 else if (current_unix_time) {
98 memset(topic, 0,
sizeof(topic));
99 tfp_snprintf(current_unix_time_string, 64,
"%u", (uint32_t)current_unix_time);
102 memset(message, 0,
sizeof(message));
106 strcat(message, key_value);
113 strcat(message, key_value);
119 strcat(message, key_value);
125 strcat(message, key_value);
131 strcat(message, key_value);
137 strcat(message, key_value);
143 strcat(message, key_value);
149 strcat(message, key_value);
155 strcat(message, key_value);
157 memset(cleartext, 0,
sizeof(message));
158 os_strncpy(cleartext, message,
sizeof(message));
168 MQTT_Publish(mqtt_client, topic, message, message_l, 2, 0);
193 mqtt_client = client;
210 unsigned char kmp_unit_string[16];
211 unsigned char kmp_value_string[64];
218 if (
strncmp(kmp_unit_string,
"MWh", 16) == 0) {
222 #ifdef DEBUG_NO_METER 223 return pseudo_data_debug_no_meter;
265 #ifdef DEBUG_NO_METER 271 uint8_t sine_wave[256] = {
272 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
273 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
274 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
275 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
276 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
277 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
278 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
279 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
280 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
281 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
282 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
283 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
284 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
285 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
286 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
287 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
288 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
289 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
290 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
291 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
292 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
293 0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
294 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
295 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
296 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
297 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
298 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
299 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
300 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
301 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
302 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
303 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D
320 #ifdef DEBUG_NO_METER 322 memset(message, 0,
sizeof(message));
323 memset(topic, 0,
sizeof(topic));
329 memset(cleartext, 0,
sizeof(cleartext));
330 tfp_snprintf(cleartext,
KMP_FRAME_L,
"heap=%u&t1=%u.00 C&t2=%u.00 C&tdif=%u.00 K&flow1=%u l/h&effect1=%u.0 kW&hr=%u h&v1=%u.00 m3&e1=%u kWh&",
332 65 + ((sine_wave[pseudo_data_debug_no_meter] * 10) >> 8),
333 45 + ((sine_wave[(pseudo_data_debug_no_meter + 128) & 0xff] * 10) >> 8),
335 100 + ((sine_wave[((pseudo_data_debug_no_meter + 64) * 7) & 0xff] * 50) >> 8),
336 15 + ((sine_wave[pseudo_data_debug_no_meter] * 10) >> 8),
337 pseudo_data_debug_no_meter / 60,
338 pseudo_data_debug_no_meter,
339 pseudo_data_debug_no_meter
341 pseudo_data_debug_no_meter++;
350 os_printf(
"tried to call kmp_meter_is_ready_cb() before it was set - should not happen\n");
359 MQTT_Publish(mqtt_client, topic, message, message_l, 2, 0);
ICACHE_FLASH_ATTR int kmp_decode_frame(unsigned char *frame, unsigned char frame_length, kmp_response_t *response)
static MQTT_Client * mqtt_client
ICACHE_FLASH_ATTR uint32_t get_unix_time(void)
ICACHE_FLASH_ATTR static void kmp_receive_timeout_timer_func()
void ICACHE_FLASH_ATTR uart0_tx_buffer(uint8 *buf, uint16 len)
uint32 system_get_free_heap_size(void)
ICACHE_FLASH_ATTR void kmp_request_send()
unsigned int kmp_fifo_in_use()
#define ICACHE_FLASH_ATTR
ICACHE_FLASH_ATTR void kmp_set_mqtt_client(MQTT_Client *client)
ICACHE_FLASH_ATTR static void kmp_get_serial_timer_func()
ICACHE_FLASH_ATTR void kmp_unit_to_string(uint8_t unit, unsigned char *unit_string)
bool system_os_task(os_task_t task, uint8 prio, os_event_t *queue, uint8 qlen)
ICACHE_FLASH_ATTR static void kmp_get_register_timer_func()
#define DEFAULT_METER_SERIAL
ICACHE_FLASH_ATTR void kmp_request_init()
ICACHE_FLASH_ATTR void kmp_value_to_string(int32_t value, uint8_t si_ex, unsigned char *value_string)
void(* meter_is_ready_cb)(void)
bool meter_is_ready_cb_called
kmp_response_register_list_t kmp_response_register_list
volatile unsigned char fifo_buffer[QUEUE_SIZE]
ICACHE_FLASH_ATTR unsigned int kmp_get_received_serial()
volatile unsigned int fifo_tail
unsigned int kmp_requests_sent
static os_timer_t kmp_receive_timeout_timer
ICACHE_FLASH_ATTR size_t encrypt_aes_hmac_combined(uint8_t *dst, uint8_t *topic, size_t topic_l, uint8_t *message, size_t message_l)
meter_is_ready_cb kmp_meter_is_ready_cb
unsigned int frame_length
unsigned char frame[KMP_FRAME_L]
static ICACHE_FLASH_ATTR void kmp_received_task(os_event_t *events)
ICACHE_FLASH_ATTR void kmp_register_meter_is_ready_cb(meter_is_ready_cb cb)
ICACHE_FLASH_ATTR int tfp_snprintf(char *str, size_t size, const char *format,...)
static os_timer_t kmp_get_register_timer
uint16_t register_list[8]
BOOL ICACHE_FLASH_ATTR MQTT_Publish(MQTT_Client *client, const char *topic, const char *data, int data_length, int qos, int retain)
MQTT publish function.
#define os_timer_arm(a, b, c)
static os_timer_t kmp_get_serial_timer
#define kmp_received_task_queue_length
ICACHE_FLASH_ATTR void mw_to_w_str(char *mw, char *w)
unsigned char kmp_fifo_snoop(unsigned char *c, unsigned int pos)
os_event_t kmp_received_task_queue[kmp_received_task_queue_length]
unsigned char kmp_fifo_get(unsigned char *c)
ICACHE_FLASH_ATTR unsigned int kmp_get_serial(unsigned char *frame)
ICACHE_FLASH_ATTR unsigned int kmp_get_register(unsigned char *frame, uint16_t *register_list, uint16_t register_list_length)
ICACHE_FLASH_ATTR unsigned int kmp_get_received_energy_kwh()
#define kmp_received_task_prio
unsigned char kmp_fifo_put(unsigned char c)
volatile unsigned int fifo_head
uint32_t current_unix_time
unsigned int kmp_response_serial