Simple-Scada forum

Simple-Scada 2 => Ошибки => Тема начата: Миханик от 27 Января 2020, 05:10:29

Название: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 27 Января 2020, 05:10:29
Здравствуйте.
Снова не отправляются Telegram сообщения с 27.01.2020.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple_Scada от 27 Января 2020, 09:10:00
Здравствуйте.

Проверили, все работает. Пояснения можно найти в этом (https://simple-scada.com/forum/index.php?topic=63.msg7698#msg7698) и этом (https://simple-scada.com/forum/index.php?topic=63.msg7785#msg7785) сообщениях.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 27 Января 2020, 12:10:06
Сейчас всё заработало, а утром с трех объектов сообщения не пришли, хотя никаких изменений по проектам не делались. Возможно оператор был виноват оператор связи.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple-Scada от 27 Января 2020, 12:40:33
За всё время в Simple-Scada проблема с отправкой Telegram-сообщений возникала только один раз - когда отключили наш прокси-сервер. Это было 4 месяца назад. В тот же день мы изменили прокси сервер на новый. С тех пор ни одной проблемы не возникло (и скорее всего уже не возникнет). Скада для отправки telegram-сообщений не делает ничего сложного, что могло бы "сломаться" в произвольный момент. Она просто отправляет запрос на отправку сообщения на сервер Telegram. На этом работа скады заканчивается. И если на Вашем ПК интернет работает стабильно (и трафик не блокируется), то этот запрос выполнится. Если нет, то его не удастся передать на сервер и отправка не пройдёт. В будущих версия Simple-Scada мы также не планируем что-либо менять касаемо Telegram, т.к. всё что можно уже сделано и не раз проверено.

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

Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 14 Февраля 2020, 11:41:14
Добрый день.
Сегодня попробовал перейти на версию 2.3.6.7. В ней русский текст телеграм-сообщений отправляется арбой-кадаброй (скрин).
Вернулся к версии 2.3.6.3 - там всё норм.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple-Scada от 14 Февраля 2020, 12:04:14
Здравствуйте.

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

Цитировать
Вернулся к версии 2.3.6.3 - там всё норм.
В 2.3.6.3 выполнялась доп. конвертация текста, но и в ней смешивание типов лучше устранить, чтобы не возникало лишних преобразований.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 21 Февраля 2020, 03:54:54
Значит у Вас в коде отправки сообщения смешиваются разные типы строк, например UTF8String + string, что недопустимо.

Спасибо за помощь, перевел строку сообщения в UTF8String и всё заработало. Эта проблема возникла из-за того, что в сообщении присутствовали символы перевода строки: chr(10).
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 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;
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple-Scada от 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, но её код Вы не предоставили.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Миханик от 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;
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple-Scada от 08 Июня 2020, 12:54:55
Функцию Вы переделали правильно.

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

Мы написали Вам как надо сделать (UTF8ToString), просто возьмите наш код, скопируйте его целиком, вставьте в редактор кода и всё будет работать (с переделанной функцией Get_str_state). После внесения изменений не забудьте перезапустить проект на сервере.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: metamorphogenesis от 23 Февраля 2021, 10:03:43
Ребята, у меня наверное проблема с похожими корнями. Но у меня задача вставить в сообщение этот смайл ❌ :
https://apps.timwhitlock.info/unicode/inspect/hex/274C (https://apps.timwhitlock.info/unicode/inspect/hex/274C)

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

(https://i.ibb.co/jZSzjSn/image.png)

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

Код: (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;


То есть по нажатию кнопки я передаю в глобальный скрипт строку с названием счётчика и его значением. В том скрипте я формирую уведомление о сбросе, состоящее из имени счетчика и его значения, а также, если требуется, и имени пользователя, который его сбросил, и передаю сформированное уведомление в следующий скрипт. В нем я добавляю к сообщению штамп даты/времени и передаю готовое сообщение в скрипт, который отправляет его в телеграм.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: Simple-Scada от 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.
Название: Re: Ошибка отправки Telegram сообщений
Отправлено: metamorphogenesis от 23 Февраля 2021, 12:34:30
Вас понял. Спасибо большое, работает, как часы. Запутался в обилии составляющих. Изучу ваш вариант и сделаю выводы. У вас превосходный продукт!