• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Дистанционное снятие показаний с электросчетчика КАСКАД-1-МТ с дальнейшей передачей показаний в Home Assistant с помощью BLE

Slacky

Member
в прошивке 1.3 должен отображать Амперы, но в HA и на странице настройки их нет
Сделал, проверяй. Есть нюанс. Я там добавляю другие счетчики (правда код еще не активен, так как мне пока проверить не на чем). Но вроде на работу с КАСКАД-1-МТ не должно повлиять.

ha_amps.jpg
 

mega2000

Member
Сделал, проверяй. Есть нюанс. Я там добавляю другие счетчики (правда код еще не активен, так как мне пока проверить не на чем). Но вроде на работу с КАСКАД-1-МТ не должно повлиять.

Посмотреть вложение 12960
Invoking: TC32 C Linker
./out/src/app.o: In function `user_init_normal':
app.c:(.text.user_init_normal+0x32): undefined reference to `get_adc_mv'
app.c:(.text.user_init_normal+0x7c): undefined reference to `battery_mv'
./out/src/device.o: In function `set_device_type':
device.c:(.ram_code+0xcc): undefined reference to `measure_meter_mercury206'
device.c:(.ram_code+0xd0): undefined reference to `get_date_release_data_mercury206'
device.c:(.ram_code+0xd4): undefined reference to `get_serial_number_data_mercury206'
make: *** [out/electricity_meter.elf] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

ошибки посыпались при сборке.
 

mega2000

Member
Invoking: TC32 C Linker
./out/src/app.o: In function `user_init_normal':
app.c:(.text.user_init_normal+0x32): undefined reference to `get_adc_mv'
app.c:(.text.user_init_normal+0x7c): undefined reference to `battery_mv'
./out/src/device.o: In function `set_device_type':
device.c:(.ram_code+0xcc): undefined reference to `measure_meter_mercury206'
device.c:(.ram_code+0xd0): undefined reference to `get_date_release_data_mercury206'
device.c:(.ram_code+0xd4): undefined reference to `get_serial_number_data_mercury206'
make: *** [out/electricity_meter.elf] Error 1
"make all" terminated with exit code 2. Build might be incomplete.

ошибки посыпались при сборке.
ругался на эту строку. в device.c выключил меркурий
 

Slacky

Member
ругался на эту строку. в device.c выключил меркурий
А, башка моя дырявая. project.mk не обновил. Перезалей и проверь, все должно собраться.

Есть еще нюанс. Я там добавил атрибут current в app_att.c и app_att.h. Так вот при добавлении или изменении атрибутов модуль перестает соединяться. Я не разбирался в чем дело, просто очищаешь флешь, заливаешь по-новой прошивку и все начинает нормально работать. Правда MAC поменяется, но это не критично ...
 

mega2000

Member
А, башка моя дырявая. project.mk не обновил. Перезалей и проверь, все должно собраться.

Есть еще нюанс. Я там добавил атрибут current в app_att.c и app_att.h. Так вот при добавлении или изменении атрибутов модуль перестает соединяться. Я не разбирался в чем дело, просто очищаешь флешь, заливаешь по-новой прошивку и все начинает нормально работать. Правда MAC поменяется, но это не критично ...
вот чуял что что-то не так :( перезалил прошивку и он отвалился. Снимать с горячих соплей проблематично, но видимо другого выхода нет.
и ещё в исходниках всё же надо добавить умножение на 1000 power
 

Slacky

Member
вот чуял что что-то не так :( перезалил прошивку и он отвалился. Снимать с горячих соплей проблематично, но видимо другого выхода нет.
Я не знаю, как сделать по другому. Возможно Виктор подскажет :))

Вот потому я свой вариант устройства сделал быстросъемным. По большому счету это все еще конструктор ...
и ещё в исходниках всё же надо добавить умножение на 1000 power
Добавил, правда в другое место, для универсальности. Также поправил напряжение и тарифы в том же ключе.
 

pvvx

Активный участник сообщества
Есть еще нюанс. Я там добавил атрибут current в app_att.c и app_att.h. Так вот при добавлении или изменении атрибутов модуль перестает соединяться. Я не разбирался в чем дело, просто очищаешь флешь, заливаешь по-новой прошивку и все начинает нормально работать. Правда MAC поменяется, но это не критично ...
Что за "добавлении или изменении атрибутов"? На ходу UUID не меняют, а если меняют - тогда оповещают в спец. UUID.
Внешний адаптер помнит таблицу... Но это решается его сбросом, а не модуля.
И у вас там bonded или прочие шифрования? Модуль помнит только последние 4-ре кода привязки... в секторе по адресу 0x74000 (вроде)... Я не нарывался пока на это - но стираю после OTA в MJWSD05MMC.
С этими MJWSD05MMC наловил глюков с десятку. Есть особо хитрые - неделю копался, но 2 из основных глюков оказались в USB адаптере, всё в том-же RTL c BT5.1...
Теперь известна последовательность, что надо сделать чтобы у него мозги ехали. И в одном из самых диких и сложных глюков у него - выход только один - менять MAC устройства. (На других адаптерах этого не наблюдается.) Может это и есть ваша проблемс?

Гадать долго что там, у вас, без информации что "меняете"
 

Slacky

Member
Что за "добавлении или изменении атрибутов"?
Ну, например было так
C:
_attribute_data_retention_ attribute_t my_Attributes[] = {
    
    ...
        
    {16,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID),(u8*)(&my_emeterServiceUUID), 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff1CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff1CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_1),(u8*)(&my_tariff1CharUUID),(u8*)(&meter.tariff_1), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff1ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff1ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff2CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff2CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_2),(u8*)(&my_tariff2CharUUID),(u8*)(&meter.tariff_2), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff2ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff2ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff3CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff3CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_3),(u8*)(&my_tariff3CharUUID),(u8*)(&meter.tariff_3), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff3ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff3ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_powerCharVal),(u8*)(&my_characterUUID),(u8*)(my_powerCharVal), 0},                //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.power),(u8*)(&my_powerCharUUID),(u8*)(&meter.power), 0},         //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(powerValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&powerValueInCCC), 0},         //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_voltageCharVal),(u8*)(&my_characterUUID),(u8*)(my_voltageCharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.voltage),(u8*)(&my_voltageCharUUID),(u8*)(&meter.voltage), 0},   //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(voltageValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&voltageValueInCCC), 0
        
        ...
     };

Стало так
C:
_attribute_data_retention_ attribute_t my_Attributes[] = {
    
    ...

    {19,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID),(u8*)(&my_emeterServiceUUID), 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff1CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff1CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_1),(u8*)(&my_tariff1CharUUID),(u8*)(&meter.tariff_1), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff1ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff1ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff2CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff2CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_2),(u8*)(&my_tariff2CharUUID),(u8*)(&meter.tariff_2), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff2ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff2ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_tariff3CharVal),(u8*)(&my_characterUUID),(u8*)(my_tariff3CharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.tariff_3),(u8*)(&my_tariff3CharUUID),(u8*)(&meter.tariff_3), 0}, //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(tariff3ValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&tariff3ValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_powerCharVal),(u8*)(&my_characterUUID),(u8*)(my_powerCharVal), 0},                //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.power),(u8*)(&my_powerCharUUID),(u8*)(&meter.power), 0},         //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(powerValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&powerValueInCCC), 0},         //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_voltageCharVal),(u8*)(&my_characterUUID),(u8*)(my_voltageCharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.voltage),(u8*)(&my_voltageCharUUID),(u8*)(&meter.voltage), 0},   //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(voltageValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&voltageValueInCCC), 0},     //value

    {0,ATT_PERMISSIONS_READ,2,sizeof(my_ampereCharVal),(u8*)(&my_characterUUID),(u8*)(my_ampereCharVal), 0},            //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(meter.amps),(u8*)(&my_ampereCharUUID),(u8*)(&meter.amps), 0},   //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(ampereValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&ampereValueInCCC), 0},     //value

...

};
 

pvvx

Активный участник сообщества
Это решается сбросом адаптера или перезагрузкой. И то необязательно.
Когда переписывается термометр на альтернативную прошивку, там все атрибуты меняются. Иногда и у некоторых есть проблемы, но обычно всё проходит гладко. Даже если был pin-code.
При отладке я это сотни раз произвожу и всё ok на всех имеющихся для теста адаптерах.
Что-то ещё надо - может ваш принцип привязки?
 

Slacky

Member
ещё в исходниках всё же надо добавить умножение на 1000 power
Я тут подумал (ну типа того :)). Я наверно делитель/множитель вынесу в отдельно настраиваемую через web-интерфейс переменную для power, volts, amps и tariffs. Можно будет опретивно подстроить под разные счетчики ...
 

mega2000

Member
Я тут подумал (ну типа того :)). Я наверно делитель/множитель вынесу в отдельно настраиваемую через web-интерфейс переменную для power, volts, amps и tariffs. Можно будет опретивно подстроить под разные счетчики ...
Не уверен что это нужно. Это не импульсные счётчики с разным весом импульса. А для видимой мощности вместо лампочки лучшие сделать "мнимую нагрузку" из Тор трансформатора
 

Slacky

Member
Не уверен что это нужно. Это не импульсные счётчики с разным весом импульса. А для видимой мощности вместо лампочки лучшие сделать "мнимую нагрузку" из Тор трансформатора
Тут дело все в том, что я параллельно пишу код для каскад-11 и меркурия-206. Не хочу заморачиваться. При наличие таких множителей ты сам подправил оперативно, чтобы HA правильно отображал данные и все.
 

Slacky

Member
В общем добавил, проверил и активировал возможность считывать с двух других счетчиков - КАСКАД-11-С1 и Энергомера СЕ-102М.

Проблема вылезла на третьем счетчике - Энергомера СЕ-102 (без буквы). Схема оптопорта не читает этот счетчик. Т.е. проверил, первая команда правильная, точно такая же, какую посылает оригинальная программа от энергомеры. Но счетчик молчит, точнее я не знаю, что что лажает - он не принимает или он отвечает, а моя схема не принимает.

Головка VR-005 работает с этим счетчиком. Правда позиционирование очень жесткое, чуть в сторону и все, не работает.

Разобрал ее. Там вот такая схема -




5-ти ногий чип, это скорей всего TL331IDBVR, на нем видна маркировка T1IG. А вот что они за светодиод и фототранзистор использовали не понятно.
 

mega2000

Member
А энергомера СЕ-301 не планируется?
Тут обнаружил что блок питания hkl-03 оказался или подделкой или китайской поделкой. Считыватель может проработать на нем и 10 мин, и 2-3 часа. Потом уходит в небытие и так-же рандомно все оживает
 

Slacky

Member
А энергомера СЕ-301 не планируется?
Не-а, но Вы сами можете это сделать :)) Судя по тому, что шлет в порт AdminTools, там точно такой же протокол, как у CE-102M. Уже сейчас, если выбрать CE-102M должно тарифы показать. А вот с напряжением, мощностью и силой тока придется немного код переписать ...
 
Сверху Снизу