Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Ошибка отправки Telegram сообщений  (Прочитано 3754 раз)

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Ошибка отправки Telegram сообщений
« : 27 Января 2020, 05:10:29 »
Здравствуйте.
Снова не отправляются Telegram сообщения с 27.01.2020.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Ошибка отправки Telegram сообщений
« Ответ #1 : 27 Января 2020, 09:10:00 »
Здравствуйте.

Проверили, все работает. Пояснения можно найти в этом и этом сообщениях.

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Ошибка отправки Telegram сообщений
« Ответ #2 : 27 Января 2020, 12:10:06 »
Сейчас всё заработало, а утром с трех объектов сообщения не пришли, хотя никаких изменений по проектам не делались. Возможно оператор был виноват оператор связи.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка отправки Telegram сообщений
« Ответ #3 : 27 Января 2020, 12:40:33 »
За всё время в Simple-Scada проблема с отправкой Telegram-сообщений возникала только один раз - когда отключили наш прокси-сервер. Это было 4 месяца назад. В тот же день мы изменили прокси сервер на новый. С тех пор ни одной проблемы не возникло (и скорее всего уже не возникнет). Скада для отправки telegram-сообщений не делает ничего сложного, что могло бы "сломаться" в произвольный момент. Она просто отправляет запрос на отправку сообщения на сервер Telegram. На этом работа скады заканчивается. И если на Вашем ПК интернет работает стабильно (и трафик не блокируется), то этот запрос выполнится. Если нет, то его не удастся передать на сервер и отправка не пройдёт. В будущих версия Simple-Scada мы также не планируем что-либо менять касаемо Telegram, т.к. всё что можно уже сделано и не раз проверено.

Цитировать
хотя никаких изменений по проектам не делались.
Скада ведь тоже не менялась. Значит интернет временно отсутствовал, или скорость критически снизилась на какой-то период времени.

« Изменён: 27 Января 2020, 12:42:08 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Ошибка отправки Telegram сообщений
« Ответ #4 : 14 Февраля 2020, 11:41:14 »
Добрый день.
Сегодня попробовал перейти на версию 2.3.6.7. В ней русский текст телеграм-сообщений отправляется арбой-кадаброй (скрин).
Вернулся к версии 2.3.6.3 - там всё норм.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка отправки Telegram сообщений
« Ответ #5 : 14 Февраля 2020, 12:04:14 »
Здравствуйте.

Цитировать
В ней русский текст телеграм-сообщений отправляется арбой-кадаброй (скрин).
Значит у Вас в коде отправки сообщения смешиваются разные типы строк, например UTF8String + string, что недопустимо. Нужно привести все части сообщения к какому-то одному типу данных (используя функции для работы со строками), тогда текст всегда будет отправляться правильно. Если есть желание, то вышлите пример кода отправки сообщения. Мы опишем как нужно исправить код.

Цитировать
Вернулся к версии 2.3.6.3 - там всё норм.
В 2.3.6.3 выполнялась доп. конвертация текста, но и в ней смешивание типов лучше устранить, чтобы не возникало лишних преобразований.
« Изменён: 15 Февраля 2020, 21:40:49 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Ошибка отправки Telegram сообщений
« Ответ #6 : 21 Февраля 2020, 03:54:54 »
Значит у Вас в коде отправки сообщения смешиваются разные типы строк, например UTF8String + string, что недопустимо.

Спасибо за помощь, перевел строку сообщения в UTF8String и всё заработало. Эта проблема возникла из-за того, что в сообщении присутствовали символы перевода строки: chr(10).

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Ошибка отправки Telegram сообщений
« Ответ #7 : 08 Июня 2020, 10:19:51 »
Подскажите, пожалуйста, никак не могу победить отправку Телеграм-сообщения в читабельном виде в версии 2.3.6.12.
Если вставляю в начало строки UTF8String(DateTimeToStr(Now)), то вместо сообщения кракозябры.
Код: (delphi)
// Функция возвращает статус объекта в текстовом виде
Function Get_str_state(state : integer) : UTF8String;

// Посылка аварийного Телеграм сообщения об аварии в Детском тубдиспансере
Procedure SendMess_Alarm();
var
  TubBlgChild : UTF8String;
begin
  TubBlgChild := '';
  TubBlgChild := //UTF8String(DateTimeToStr(Now)) + chr(10) +
                 'Авария на объекте: *Тубдиспансер детский*' + chr(10) + '`' +
                 'Темпер-ра ЭК1 : ' + TubBlgChild_DT1.AsUTF8String + ',' + chr(10) +
                 'Темпер-ра ЭК2 : ' + TubBlgChild_DT2.AsUTF8String + ',' + chr(10) +
                 'Темпер-ра ГВС : ' + TubBlgChild_DT3.AsUTF8String + ',' + chr(10) + '`' +
                 'Состояние оборудования:' + chr(10) + '`' +
                 '  Контур ГВС:' + chr(10) +
                 '    - СН3 = ' + Get_str_state(TubBlgChild_CH3_state.AsInt) + chr(10) +
                 '    - СН4 = ' + Get_str_state(TubBlgChild_CH4_state.AsInt) + chr(10) +
                 '  Котловой контур:' + chr(10) +
                 '    - СН1 = ' + Get_str_state(TubBlgChild_CH1_state.AsInt) + chr(10) +
                 '    - СН2 = ' + Get_str_state(TubBlgChild_CH2_state.AsInt) + chr(10) +
                 '    - ЭК1 = ' + Get_str_state(TubBlgChild_EK1_state.AsInt) + chr(10) +
                 '    - ЭК2 = ' + Get_str_state(TubBlgChild_EK2_state.AsInt) + '`' ;

  // Отправка Телеграм сообщений
  SendTelegram(TubBlgChild, Alarm_SendMess_Recipient_ID.AsStr, tpmMarkdown);
end;
« Изменён: 08 Июня 2020, 10:24:15 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка отправки Telegram сообщений
« Ответ #8 : 08 Июня 2020, 10:31:07 »
Вот правильный код, здесь все преобразования делаются в типом string и разные типы не смешиваются:
Код: (delphi)
procedure SendMess_Alarm;
var
  TubBlgChild: string;
begin
  TubBlgChild :=
    UTF8ToString(DateTimeToStr(Now)) + chr(10) +
    'Авария на объекте: *Тубдиспансер детский*' + chr(10) + '`' +
    'Темпер-ра ЭК1 : ' + TubBlgChild_DT1.AsStr + ',' + chr(10) +
    'Темпер-ра ЭК2 : ' + TubBlgChild_DT2.AsStr + ',' + chr(10) +
    'Темпер-ра ГВС : ' + TubBlgChild_DT3.AsStr + ',' + chr(10) + '`' +
    'Состояние оборудования:' + chr(10) + '`' +
    '  Контур ГВС:' + chr(10) +
    '    - СН3 = ' + Get_str_state(TubBlgChild_CH3_state.AsInt) + chr(10) +
    '    - СН4 = ' + Get_str_state(TubBlgChild_CH4_state.AsInt) + chr(10) +
    '  Котловой контур:' + chr(10) +
    '    - СН1 = ' + Get_str_state(TubBlgChild_CH1_state.AsInt) + chr(10) +
    '    - СН2 = ' + Get_str_state(TubBlgChild_CH2_state.AsInt) + chr(10) +
    '    - ЭК1 = ' + Get_str_state(TubBlgChild_EK1_state.AsInt) + chr(10) +
    '    - ЭК2 = ' + Get_str_state(TubBlgChild_EK2_state.AsInt) + '`' ;

  // отправка телеграм сообщения
  SendTelegram(TubBlgChild, Alarm_SendMess_Recipient_ID.AsStr, tpmMarkdown);
end;
Также нужно перевести функцию Get_str_state на тип string, но её код Вы не предоставили.
« Изменён: 08 Июня 2020, 10:33:22 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Ошибка отправки Telegram сообщений
« Ответ #9 : 08 Июня 2020, 10:51:39 »
Таким способом я уже пробовал - не работает: выводит дату и время, а всё что дальше нечитабельно.

Функцию Function Get_str_state переделал на:
Код: (delphi)
Function Get_str_state(state : integer) : string;
begin
  case state of
    0 : Get_str_state := 'местный';
    1 : Get_str_state := 'отключен';
    2 : Get_str_state := 'включен';
    3 : Get_str_state := 'авария';
  end;
end;

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка отправки Telegram сообщений
« Ответ #10 : 08 Июня 2020, 12:54:55 »
Функцию Вы переделали правильно.

Цитировать
Таким способом я уже пробовал - не работает: выводит дату и время, а всё что дальше нечитабельно.
Вы писали что пробовали так:
Код
UTF8String(DateTimeToStr(Now)) + chr(10) +
Это неправильно и конечно нечитабельно, ведь Вы складываете разные типы данных.

Мы написали Вам как надо сделать (UTF8ToString), просто возьмите наш код, скопируйте его целиком, вставьте в редактор кода и всё будет работать (с переделанной функцией Get_str_state). После внесения изменений не забудьте перезапустить проект на сервере.
« Изменён: 08 Июня 2020, 12:56:45 от Simple-Scada »

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Ошибка отправки Telegram сообщений
« Ответ #11 : 23 Февраля 2021, 10:03:43 »
Ребята, у меня наверное проблема с похожими корнями. Но у меня задача вставить в сообщение этот смайл ❌ :
https://apps.timwhitlock.info/unicode/inspect/hex/274C

на скриншоте у меня два сообщения. Первый - без преобразований UTF8ToString, второй - с ним. Смайл не отображается ни на одном из них, подскажите, пожалуйста, где я прокололся?



Прилагаю код:

Код: (delphi)
// скрипт вызывается по нажатию кнопки сброса
notifyReset('Счётчик коробок', sl800_boxes_count_from_PLC.Value, true, true, true); // вызов глобального скрипта
// команда сброса счётчика


// глобальные скрипты

// notify about counters reset
procedure notifyReset(parameterName: String; counter: LongWord; printUserName, scada, telegram: Boolean);
begin
    if printUserName then begin
        if scada then AddMessage(Now, mkMessage, 'Пользователем ' + GetUserName + ' был сброшен ' + parameterName + ' на значении ' + IntToStr(counter), True, True);
        if telegram then sendDated(#$274C + 'Пользователем ' + GetUserName + ' был сброшен ' + parameterName + ' на значении ' + IntToStr(counter));
    end
    else begin
        if scada then AddMessage(Now, mkMessage, parameterName + ' был сброшен на значении ' + IntToStr(counter), True, True);
        if telegram then sendDated(#$274C + parameterName + ' был сброшен на значении ' + IntToStr(counter));
    end;
end;


// send message with current date/time to Telegram
procedure sendDated(message: String);
begin
    SendDirect('[' + DateTimeToStr(Now) + ']' + char(10) + message);
end;


// send message to Telegram
procedure sendDirect(message: String);
begin
    SendTelegram(message, '-569566543'); // приведение UTF8 к String у сообщения выполнялось на этом уровне
end;


То есть по нажатию кнопки я передаю в глобальный скрипт строку с названием счётчика и его значением. В том скрипте я формирую уведомление о сбросе, состоящее из имени счетчика и его значения, а также, если требуется, и имени пользователя, который его сбросил, и передаю сформированное уведомление в следующий скрипт. В нем я добавляю к сообщению штамп даты/времени и передаю готовое сообщение в скрипт, который отправляет его в телеграм.
« Изменён: 23 Февраля 2021, 10:47:21 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Ошибка отправки Telegram сообщений
« Ответ #12 : 23 Февраля 2021, 10:46:37 »
В скрипте Вы смешали несовместимые типы string и UTF8String. Вот правильный код глобального модуля:
Код: (delphi)
interface

procedure notifyReset(const parameterName: string; counter: LongWord; printUserName, scada, telegram: Boolean);

implementation

procedure notifyReset(const parameterName: string; counter: LongWord; printUserName, scada, telegram: Boolean);
var
  aText: string;
begin
  if printUserName then
    aText := 'Пользователем ' + UTF8ToString(GetUserName) + ' был сброшен ' + parameterName +
      ' на значении ' + IntToStr(counter)
  else
    aText := parameterName + ' был сброшен на значении ' + IntToStr(counter);

  if scada then AddMessage(Now, mkMessage, aText, True, True);
  if telegram then sendDated(#$274C + ' ' + aText);
end;
 
 
// send message with current date/time to Telegram
procedure sendDated(const message: string);
begin
  SendDirect('[' + UTF8ToString(DateTimeToStr(Now)) + ']' + char(10) + message);
end;


// send message to Telegram
procedure sendDirect(const message: string);
begin
  SendTelegram(message, '-569566543');
end;

end.

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Ошибка отправки Telegram сообщений
« Ответ #13 : 23 Февраля 2021, 12:34:30 »
Вас понял. Спасибо большое, работает, как часы. Запутался в обилии составляющих. Изучу ваш вариант и сделаю выводы. У вас превосходный продукт!