Подскажите, пожалуйста, никак не могу победить отправку Телеграм-сообщения в читабельном виде в версии 2.3.6.12.
Если вставляю в начало строки UTF8String(DateTimeToStr(Now)), то вместо сообщения кракозябры.
// Функция возвращает статус объекта в текстовом виде
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;
Вот правильный код, здесь все преобразования делаются в типом string и разные типы не смешиваются:
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, но её код Вы не предоставили.
Таким способом я уже пробовал - не работает: выводит дату и время, а всё что дальше нечитабельно.
Функцию Function Get_str_state переделал на:
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;
Функцию Вы переделали правильно.
Таким способом я уже пробовал - не работает: выводит дату и время, а всё что дальше нечитабельно.
Вы писали что пробовали так:
UTF8String(DateTimeToStr(Now)) + chr(10) +
Это неправильно и конечно нечитабельно, ведь Вы складываете разные типы данных.
Мы написали Вам как надо сделать (UTF8ToString), просто возьмите наш код, скопируйте его целиком, вставьте в редактор кода и всё будет работать (с переделанной функцией Get_str_state). После внесения изменений не забудьте перезапустить проект на сервере.
Ребята, у меня наверное проблема с похожими корнями. Но у меня задача вставить в сообщение этот смайл ❌ :
https://apps.timwhitlock.info/unicode/inspect/hex/274C (https://apps.timwhitlock.info/unicode/inspect/hex/274C)
на скриншоте у меня два сообщения. Первый - без преобразований UTF8ToString, второй - с ним. Смайл не отображается ни на одном из них, подскажите, пожалуйста, где я прокололся?
(https://i.ibb.co/jZSzjSn/image.png)
Прилагаю код:
// скрипт вызывается по нажатию кнопки сброса
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;
То есть по нажатию кнопки я передаю в глобальный скрипт строку с названием счётчика и его значением. В том скрипте я формирую уведомление о сбросе, состоящее из имени счетчика и его значения, а также, если требуется, и имени пользователя, который его сбросил, и передаю сформированное уведомление в следующий скрипт. В нем я добавляю к сообщению штамп даты/времени и передаю готовое сообщение в скрипт, который отправляет его в телеграм.
В скрипте Вы смешали несовместимые типы string и UTF8String. Вот правильный код глобального модуля:
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.