Да уж куда мне, понимать то.
Да уж куда мне, понимать то.
Код: Выделить всё
- name: t1
unique_id: mirtek_XXXX_t1
device:
identifiers: mirtek_XXXX_t1
name: mirtek_XXXX_t1
state_topic: mirtek/XXXX/T1
unit_of_measurement: kWh
device_class: energy
state_class: total
value_template: "{{ value }}"
- name: t2
unique_id: mirtek_XXXX_t2
device:
identifiers: mirtek_XXXX_t2
name: mirtek_XXXX_t2
state_topic: mirtek/XXXX/T2
unit_of_measurement: kWh
device_class: energy
state_class: total
value_template: "{{ value }}"
Изначально цикл получения показаний по таймеру построен таким образом, что проверяется подключены ли мы к MQTT серверу или нет. Уберите следующее примерно:Сэр Вант писал(а):1. Без подключения к MQTT счетчик не опрашивается, что ли? Ибо если заработает, планирую прикрутить дисплей.
Код: Выделить всё
mqttClient.loop();
if (needMqttConnect)
{
if (connectMqtt())
{
needMqttConnect = false;
}
}
else if ((iotWebConf.getState() == iotwebconf::OnLine) && (!mqttClient.connected()))
{
Serial.println("MQTT reconnect");
connectMqtt();
}Код: Выделить всё
//Запрос показаний по таймеру
if ((iotWebConf.getState() == iotwebconf::OnLine) && (mqttClient.connected())) {Код: Выделить всё
&& (mqttClient.connected()))Код: Выделить всё
#include "./My_Mirtek_GW_func.h"
PIN_GDO0=2;
METER_ADDR=12345;
CC1101_init();
MIRT_update(0);
Код: Выделить всё
Packet sent:
10 73 55 21 0 XX XX FE FF 2B 0 0 0 0 0 76 55
Packets received: 4
73 55 1C 0 FE FF XX XX 2B 98 1 C7 0 0 1 0 1 0 A3 1 22 1 8A 13 35 3 F1 59 0 0 0 0 A8 8 0 0 0 0 A8 8 0 76 F7 55
Packet lengt: 44
1C 0 FE FF XX XX 2B 98 1 C7 0 0 1 0 1 0 A3 1 22 1 8A 13 35 3 F1 59 0 0 0 0 A8 8 0 0 0 0 A8 8 0 76
Calculate myCRC: A5
P: 419.00
Q: 0.29
Freq: 50.02
Cos: 0.82
V1: 230.25
V2: 0.00
V3: 0.00
I1 2.22
I2 0.00
I3 2.22Код: Выделить всё
void packetReceiver() //функция приёма пакета (помещает его в resultbuffer[])
{
for (int i = 0; i < 50; i++) {
resultbuffer[i] = 0x00;
tempbuffer[i] = 0x00;
}
tmr.start();
packet = ""; //переменная для вывода полученного пакета в MQTT
int PackCount = 0; //счётчик принятых из эфира пакетов
bytecount = 0; //указатель байтов в результирующем буфере
bytecounttemp = 0; //указатель байтов в промежуточном буфере
while (!tmr.tick() && PackCount != packetType) {
if (ELECHOUSE_cc1101.CheckReceiveFlag()) {
PackCount++;
/*
//Rssi Level in dBm
Serial.print("Rssi: ");
Serial.println(ELECHOUSE_cc1101.getRssi());
//Link Quality Indicator
Serial.print("LQI: ");
Serial.println(ELECHOUSE_cc1101.getLqi());
*/
//Get received Data and calculate length
int len = ELECHOUSE_cc1101.ReceiveData(buffer);
//подшиваем 1/3 или 1/4 пакета в общий пакет
for (int i = 1; i < len; i++) {
tempbuffer[bytecounttemp] = buffer[i];
bytecounttemp++; //Считаем длину промежуточного буфера
}
ELECHOUSE_cc1101.SpiStrobe(0x36); // Exit RX / TX, turn off frequency synthesizer and exit
ELECHOUSE_cc1101.SpiStrobe(0x3A); // Flush the RX FIFO buffer
ELECHOUSE_cc1101.SpiStrobe(0x3B); // Flush the TX FIFO buffer
//delay(1);
ELECHOUSE_cc1101.SpiStrobe(0x34); // Enable RX
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
// Обработка байтстаффингом полученного пакета перед парсингом
///////////////////////////////////////////////////////////////////////////////////////////////
int j = 0; //Значение компенсирующего смещения индекса
for (int i = 0; i < bytecounttemp; i++)
{
resultbuffer [i - j] = tempbuffer[i]; //Записываем текущее значение байта из временного буфера в выходной
bytecount++; //Считаем длину результирующего буфера
if (tempbuffer[i] == 0x73 and (i + 1 < bytecounttemp))
{
if (tempbuffer[i + 1] == 0x11) //Проверяем что последовательность 0x73 0x11
{
resultbuffer[i - j] = 0x55; //Меняем последовательность 0x73 0x11 на 0x55
i++; //Пропускаем следующий байт
j++; //Компенсируем индекс результирующего буфера при пропуске байта
}
if (tempbuffer[i + 1] == 0x22) //Проверяем что последовательность 0x73 0x22
{
i++; //В результирующем буфере уже лежит 0x73 вместо 0x73 0x22, пропускаем следующий байт
j++; //Компенсируем индекс результирующего буфера при пропуске байта
}
}
/* //Add by DigiBoy
if (tempbuffer[i] == 0x55 and tempbuffer[i - 1] != 0x73) {
break;
}*/
}
Serial.print("Packets received: ");
Serial.println(PackCount);
//Печатаем общий пакет
for (int i = 0; i < bytecount; i++)
{
Serial.print(resultbuffer[i], HEX); //исходный пакет
Serial.print(" ");
packet += String(resultbuffer[i], HEX); //собираем пакет для вывода в MQTT
packet += " ";
}
Serial.println();
Serial.print("Packet lengt: ");
Serial.println(bytecount);
// Считаем свою CRC ------------------------------
crc.reset();
crc.setPolynome(0xA9);
for (int i = 2; i < (bytecount - 2); i++)
{
crc.add(resultbuffer[i]);
Serial.print(resultbuffer[i], HEX);
Serial.print(" ");
}
Serial.println();
myCRC = crc.getCRC();
Serial.print("Calculate myCRC: ");
Serial.println(myCRC, HEX);
//-----------------------------------------
//Вывод полученного пакета в MQTT
packet.toUpperCase(); //Приводим все значения к верхнему регистру
mqttClient.publish("mirtek/" + (String)MeterAdressValue + "/Packet_recive", packet);
}