Ik probeer onze stadsverwarming uit te lezen, een Kamstrup MULTICAL 66C02F1386.
Dit gaat dmv de aanwezige IR poort. Na het sturen van een start signaal ('/#1') met 300 baud geeft de meter antwoord op 1200 baud. In dit antwoord zitten o.a. huidige meterstand.
Deze waarden wil ik dus uitlezen met een esp32 en ESPHome en zo deze tonen/verwerken in Home Assistant.
Hier onder heb ik de code toegevoegd, maar het probleem is als volgt. Elke keer als ik antwoord krijg zijn de waarden 'verschoven', Ik heb geen idee waarom..
De eerste keer en zoals het zou moeten zijn:
Maar vervolgens wordt het een paar keer achter elkaar:
Het verloopt dus als het waren. Ik heb alleen geen idee waarom, voor zover ik het snap beginnen alle variabelen schoon bij elke run. Dus zou er niks zijn dat blijft 'hangen'.?
Deel van de YAML waar de UART poorten zijn gedefinieerd.
Iemand een idee? Ik heb dit eerder werkend gehad met een arduino, maar daar had ik het zelfde probleem. Daar opgelost door na elke run een reset te doen
Dit gaat dmv de aanwezige IR poort. Na het sturen van een start signaal ('/#1') met 300 baud geeft de meter antwoord op 1200 baud. In dit antwoord zitten o.a. huidige meterstand.
Deze waarden wil ik dus uitlezen met een esp32 en ESPHome en zo deze tonen/verwerken in Home Assistant.
Hier onder heb ik de code toegevoegd, maar het probleem is als volgt. Elke keer als ik antwoord krijg zijn de waarden 'verschoven', Ik heb geen idee waarom..
De eerste keer en zoals het zou moeten zijn:
code:
1
| 00000 xxxxxx02372461575342 0164560 0006941 0002496 0004445 0000000 0000000 000 |
Maar vervolgens wordt het een paar keer achter elkaar:
code:
1
2
3
| 0093 0000000 xxxxxx0237246 1575342 0164560 0006442 0002519 0003923 0000000 0000 000 0000093 0000000 xxxxxx0237246 1575342 0164560 0006442 0002519 0003923 0000 00 0000000 0000093 0000000 xxxxxx0237246 1575342 0164560 0006442 0002519 000392 |
Het verloopt dus als het waren. Ik heb alleen geen idee waarom, voor zover ik het snap beginnen alle variabelen schoon bij elke run. Dus zou er niks zijn dat blijft 'hangen'.?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
| #include "esphome.h" #include <iostream> #include <string> class Multical602 : public PollingComponent, public UARTDevice { public: Sensor *sensor_energy{nullptr}; Sensor *sensor_volume{nullptr}; Sensor *sensor_tempin{nullptr}; Sensor *sensor_tempout{nullptr}; Sensor *sensor_tempdiff{nullptr}; Sensor *sensor_power{nullptr}; Sensor *sensor_flow{nullptr}; TextSensor *textsensor_status{nullptr}; Multical602(uint32_t update_interval, UARTComponent *uart_tx, UARTComponent *uart_rx, Sensor *m__energy, Sensor *m__volume, Sensor *m__tin, Sensor *m__tout, Sensor *m__tdiff, Sensor *m__power, Sensor *m__flow, TextSensor *m__status) : PollingComponent(update_interval), sensor_energy(m__energy), sensor_volume(m__volume), sensor_tempin(m__tin), sensor_tempout(m__tout), sensor_tempdiff(m__tdiff), sensor_power(m__power), sensor_flow(m__flow), textsensor_status(m__status) { _tx = new UARTDevice(uart_tx); _rx = new UARTDevice(uart_rx); } void setup() override { } std::string convertToString(char *a, int size) { int i; std::string s = ""; for (i = 0; i < size; i++) { s = s + a[i]; } return s; } void update() override { byte sendmsg1[] = {175, 163, 177}; // /#1 with even parity byte r = 0; byte to = 0; byte i; byte j; char message[255]; int parityerrors; to = 0; r = 0; i = 0; j = 0; parityerrors = 0; char *tmpstr; float m_energy, m_volume, m_tempin, m_tempout, m_tempdiff, m_power; long m_hours, m_flow; std::string m_status; for (int x = 0; x < 3; x++) { _tx->write(sendmsg1[x]); } _tx->flush(); _rx->flush(); ESP_LOGD("multical", "Start while loop"); bool mag = true; while (r != 0x0A) { if (_rx->available()) { // receive byte r = _rx->read(); r = r & 127; // Mask MSB to remove parity Serial.print(char(r)); message[i++] = char(r); } else { to++; delay(25); } if (i >= 81) { Serial.println(""); ESP_LOGD("multical", "OK"); Serial.println("OK: "); Serial.println(message); m_status = "OK"; break; } if (to > 100) { message[i] = 0; ESP_LOGD("multical", "ERR(TIMEOUT): %f", message); m_status = "ERR(TIMEOUT)"; break; } } textsensor_status->publish_state(m_status); } UARTDevice *_tx; UARTDevice *_rx; }; |
Deel van de YAML waar de UART poorten zijn gedefinieerd.
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
| uart: - rx_pin: 16 baud_rate: 1200 data_bits: 7 parity: EVEN stop_bits: 1 id: uart_rx - tx_pin: 17 baud_rate: 300 data_bits: 7 parity: EVEN stop_bits: 1 id: uart_tx |
Iemand een idee? Ik heb dit eerder werkend gehad met een arduino, maar daar had ik het zelfde probleem. Daar opgelost door na elke run een reset te doen
