[Модуль] Энергомера (energomera)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

ElectronicsInFocus
Сообщения: 38
Зарегистрирован: Пт апр 22, 2016 6:15 pm
Откуда: Уфа / Россия
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Re: Модуль Энергомера

Сообщение ElectronicsInFocus » Ср дек 21, 2016 10:14 pm

Поэкспериментировал ещё. Похоже, что происходит зависание в функции readPort.
СпойлерПоказать
mdm_обмен_не_идёт.png
Обмен из majordomo не идёт
mdm_обмен_не_идёт.png (163.96 КБ) 7981 просмотр
admintools_обмен_идёт.png
Обмен из admintools идёт
admintools_обмен_идёт.png (147.89 КБ) 7981 просмотр
mdm_обмен_идёт.png
Успешный обмен из majordomo после авторизации в admintools
mdm_обмен_идёт.png (158.56 КБ) 7981 просмотр
ElectronicsInFocus
Сообщения: 38
Зарегистрирован: Пт апр 22, 2016 6:15 pm
Откуда: Уфа / Россия
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Re: Модуль Энергомера

Сообщение ElectronicsInFocus » Чт дек 22, 2016 10:24 pm

Последние эксперименты:

На win7x64: Прослушал шину rs485 во время затыкания модуля в MDM (без запуска admintools) вторым таким же преобразователем на ch340. Как и ожидал, первый запрос - корректный, счётчик на него отвечает нормально, но модуль энергомера в MDM зависает где-то при приёме (в сниффере с этого порта ответ счётчика не виден).
Скрин из сниффера (со слушающего порта):
СпойлерПоказать
windows (слушаю линию вторым мостиком).png
windows (слушаю линию вторым мостиком).png (43.42 КБ) 7949 просмотров
На raspberry pi2: Собрал драйвер для ch340 по инструкции в этой теме.
В общем то, получил такой же точно результат, как и у предыдущих комрадов в этой теме.
Test.php выдаёт отсутствие связи со счётчиком. Аналогично вторым преобразователем USB-rs485 прослушал линию и увидел дублирование байта 0d. Т.е. запрос выдаётся некорректно и счётчик на него не отвечает.
Скрин из сниффера (со слушающего порта):
СпойлерПоказать
raspberry (слушаю линию вторым мостиком).png
raspberry (слушаю линию вторым мостиком).png (88 КБ) 7949 просмотров
У меня 2 предположения:
- проблема в каких-то багах в драйверах или МС CH340, специфически проявляющиеся
- проблема в php serial, который используется в модуле

В выходные постараюсь раздобыть другие USB-rs485.
У кого ещё какие идеи?
Иван, Вы тут бываете?
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Модуль Энергомера

Сообщение Ivan » Сб дек 24, 2016 12:54 am

Да. Бываю. Очень рад что у вас есть время с этим разобраться. Сам пускал эту фигню с начальным входом через админ.
Проблема скорей всего в модуле. Потому как прога написаннач на Qt отлично читает данные.
У меня после обновления ядра тоже модуль встал. А вот прога qt выдает все ок.
Буду рад если разбиретесь.
Не хватает времени. Занят сейчас производством mysensor плат. И правил модуль мажордома для них
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Модуль Энергомера

Сообщение Ivan » Сб дек 24, 2016 3:11 pm

Нашёл 1 ошибку. Получилась потому что в MySensor не нужно ждать ответа
В файле /modules/energomera/PhpSerial.php : 166 = stream_set_blocking($this->_dHandle, 1);
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
ElectronicsInFocus
Сообщения: 38
Зарегистрирован: Пт апр 22, 2016 6:15 pm
Откуда: Уфа / Россия
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Re: Модуль Энергомера

Сообщение ElectronicsInFocus » Сб дек 24, 2016 7:45 pm

Попробовал USB-rs485 на базе микросхемы SIL2104. К сожалению, всё абсолютно так же, как и с китайским USB-rs485 на CH340. На винде - зависание при первом чтении (если не запускать admintools), на raspberry - дубль байта 0x0D в запросе.
Ivan писал(а):Нашёл 1 ошибку. Получилась потому что в MySensor не нужно ждать ответа
В файле /modules/energomera/PhpSerial.php : 166 = stream_set_blocking($this->_dHandle, 1);
Внёс это изменение. Что-то разницы никакой не заметил. Вроде всё так же
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Модуль Энергомера

Сообщение Victor_S » Вт янв 24, 2017 9:29 am

Ivan, подскажи, пожалуйста, по параметрам настройки порта под линукс.
На данный момент у меня уже давно, правда с "костылями". работает опрос счетчиков(у меня их 2 - Меркурий 236) под windows7 и MD. "Костыли" в том, что во-первых мне не удалось запустить опрос из-под МД, Опрос идет через php скрипт запускаемый из планировщика, а он уже читает - пишет данные в базу МД. Второй "костыль" в проблемах с первоначальной инициализацией соединения со счетчиками, т.е. после перезапуска сервера нужно один раз "пнуть" соединение через родную прогу от счетчиков, а потом все нормально работает.
Все это меня не устраивает, но и твой модуль ставить не хочу, не потому что не нравится, а потому что считаю нужным разделить информационные и критические процессы на разные сервера, дабы не мешали друг другу. Поскольку информация со счетчиков нигде не участвует напрямую в процессах автоматического управления, хочу вынести ее на отдельный сервер. Для этих целей решил попробовать Orange Pi Zero 512M. Поставил на него armbian и LAMP. Пытаюсь организовать связь со счетчиками через USB "свисток". Их у меня парочка. Один сейчас работает(т.е. с работоспособностью и подключением все ок), он видимо FTDI, т.к. в линуксе определяется как /dev/ttyACM0. Другой на ch341, его нигде не проверял, он в линуксе определяется как /dev/ttyUSB0.
Твое сообщение о проблемах с ch341 драйвером в линукс видел. Видимо и у меня та же проблема, т.к. при попытках связи через данный "свисток" соединение зависает. Ну да бог с ним. Будем с другим работать...:)
Для проверки соединения использую вот такой php скрипт:
СпойлерПоказать

Код: Выделить всё

#!/usr/bin/env php
<?php
// Read answer from device with 500ms timeout
function rd($fp)
{
$result = '';
$c = '';
stream_set_blocking($fp,0);
$timeout=microtime(1)+0.5;
while (microtime(1)<$timeout) {
        $c=fgetc($fp);
        if($c === false){
                        usleep(5);
                        continue;
        }
        $result .= $c;
}
return $result;
}
// Parameters for port
#======================================================
exec('/bin/stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -parenb -cstopb -clocal');
#======================================================*
#  Open port                                           *
#======================================================*
$fp = fopen("/dev/ttyACM0", "r+");
if (!$fp) {
    echo "Error opening port";
    die();
}
#========================================================*
# Инициализация соединения, передача пароля              *
# 0x5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xc7,0xe2 *
#========================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x01\x01\x01\x01\x01\x01\x01\x01\xc7\xe2");      
$result = rd($fp);
echo "Init:".$result;
#======================================================*
# Частота, Гц                                          *
# 0x5e,0x08,0x16,0x40,0x9d,0x9e                        *
#======================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x08\x16\x40\x9d\x9e");      
$result = rd($fp);
echo "F:".$result;
#======================================================*
# Завершение соединения  //0x5e,0x02,0xb8,0x11                                                        *
#======================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x02\xb8\x11");      
$result = rd($fp);
echo "Close:".$result;
fclose($fp);
?>
В результате выполнения скрипта вижу на экране:
Init: F: Close:
Как я понимаю, скрипт выполняется, порт открывается и данные отправляются, нету ответа счетчика. Полагаю проблема в каком то из многочисленных параметров настройки порта.
Сам я и с Линукс, и с PHP что называется "на Вы"...:) Скрипт - некая компиляция разных вариантов из интернета.
Коды, что я отправляю счетчику - правильные, с учетом пароля, адреса и crc. Тупо забил из работающей системы. Может разве в синтаксисе где-то напартачил...
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Модуль Энергомера

Сообщение Chainik » Вт янв 24, 2017 10:48 am

Victor_S писал(а):Ivan, подскажи, пожалуйста, по параметрам настройки порта под линукс.
"Костыли" в том, что во-первых мне не удалось запустить опрос из-под МД, Опрос идет через php скрипт запускаемый из планировщика, а он уже читает - пишет данные в базу МД.
А если написать php-скрипт не посредственно в МД и в конце скрипта его перезапускать с помощью SetTimeout. В качестве команды указать runScript [указать имя текущего скрпита] и выставить необходимое время перезапуска. А для первоначального старта скрипта дополнить OnNewMinut командой на запуск runScript [указать имя скрпита].
Может тогда первые "костыли" удастся отбросить?
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Модуль Энергомера

Сообщение Victor_S » Вт янв 24, 2017 12:04 pm

Chainik, я занимался этой темой пару лет назад. Написал класс со своими свойствами и методами. При запуске одного из методов МД вываливал системную ошибку в своем модуле. При этом просто в браузере код нормально выполнялся. Тогда без помощи Сергея эту проблему решить не смог, а ему видимо было не слишком интересно. Я немного "подергался" и решил вопрос консольным скриптом из планировщика. Сейчас мне не нужно этого в МД. Я хочу убрать эту задачу на другой сервер.
SolarW
Сообщения: 179
Зарегистрирован: Вс июл 31, 2016 11:24 pm
Благодарил (а): 35 раз
Поблагодарили: 24 раза

Re: Модуль Энергомера

Сообщение SolarW » Вт янв 24, 2017 2:50 pm

Victor_S писал(а):Для этих целей решил попробовать Orange Pi Zero 512M. Поставил на него armbian и LAMP. Пытаюсь организовать связь со счетчиками через USB "свисток". Их у меня парочка. Один сейчас работает(т.е. с работоспособностью и подключением все ок), он видимо FTDI, т.к. в линуксе определяется как /dev/ttyACM0. Другой на ch341, его нигде не проверял, он в линуксе определяется как /dev/ttyUSB0.
Вроде как на этой апельсине уже есть UART?
http://linux-sunxi.org/Xunlong_Orange_P ... g_the_UART
Не получится применить его чтобы с USB-переходниками не заморачиваться?
Jack Mas
Сообщения: 5
Зарегистрирован: Вт фев 07, 2017 2:28 pm
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Модуль Энергомера

Сообщение Jack Mas » Вт фев 07, 2017 4:37 pm

Здесь реализация для Меркурия 230
на Python и C.
На Linux тоже будет работать.
viewtopic.php?f=5&t=3686
Ответить