Update conf di base, test su Shelly x nuova gestione URL

This commit is contained in:
Samuele Locatelli
2025-02-24 16:48:42 +01:00
parent 9b17e116ab
commit 2a5fe80e39
4 changed files with 102 additions and 348 deletions
+5 -5
View File
@@ -58,11 +58,11 @@ namespace IOB_UT_NEXT.Config.Base
{
CurrSetup = new Dictionary<string, string>();
CurrSetup.Add("alive", "IOB");
CurrSetup.Add("Base", "IOB/input/");
//CurrSetup.Add("Base", "IOB/input/");
CurrSetup.Add("BaseJson", "IOB/evListJson/");
CurrSetup.Add("RawTransfJson", "IOB/rawTransfJson/");
CurrSetup.Add("Enabled", "IOB/enabled/");
CurrSetup.Add("Flog", "IOB/flog/");
//CurrSetup.Add("Enabled", "IOB/enabled/");
//CurrSetup.Add("Flog", "IOB/flog/");
CurrSetup.Add("FlogJson", "IOB/flogJson/");
//CurrSetup.Add("fixDailyDossier", "IOB/fixDailyDossier/");
//CurrSetup.Add("fixDailyOdl", "IOB/fixDailyOdl/");
@@ -70,8 +70,8 @@ namespace IOB_UT_NEXT.Config.Base
//CurrSetup.Add("forceCreatePOdl", "IOB/forceCreatePOdl/");
//CurrSetup.Add("forceSplitOdlFull", "IOB/forceSplitOdlFull/");
//CurrSetup.Add("getPOdlAct", "IOB/getPOdlAct/");
CurrSetup.Add("IdleTime", "IOB/getIdlePeriod/");
CurrSetup.Add("OdlStarted", "IOB/getCurrOdlStart/");
//CurrSetup.Add("IdleTime", "IOB/getIdlePeriod/");
//CurrSetup.Add("OdlStarted", "IOB/getCurrOdlStart/");
CurrSetup.Add("Reboot", "IOB/sendReboot.aspx?idxMacchina=");
//CurrSetup.Add("savePzCountInc", "IOB/savePzCountInc/");
//CurrSetup.Add("savePzCountIncAtDate", "IOB/savePzCountIncAtDate/");
+1 -1
View File
@@ -32,7 +32,7 @@ namespace IOB_UT_NEXT.Config.Base
public string ApiUrl(string CmdReq)
{
// default ad implicito con IOB...
string answ = $"{BaseAppUrl}/IOB/{CmdReq}";
string answ = $"{BaseAppUrl}IOB/{CmdReq}/";
if (Commands.ContainsKey(CmdReq))
{
answ = $"{BaseAppUrl}{Commands[CmdReq]}";
+95 -341
View File
@@ -1,6 +1,7 @@
using IOB_UT_NEXT;
using IOB_UT_NEXT.Config;
using MapoSDK;
using MathNet.Numerics;
using MathNet.Numerics.Statistics;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -625,19 +626,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetCurrOdlRow
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getCurrOdlRow/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetCurrOdlRow");
}
return answ;
}
get => $@"{urlCommandIob("getCurrOdlRow")}";
}
/// <summary>
@@ -646,19 +635,7 @@ namespace IOB_WIN_FORM.Iob
[Obsolete("Metodo obsoleto (dubbia interpretazione): sostituire con urlGetNextPODL se si vogliono PROSSIMI POdl attivabili (significato originale) o con urlGetActPODL x il POdl attualmente in produzione (per casi come Rama OPC-UA Siemens)")]
public string urlGetCurrPODL
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getCurrPODL/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetCurrPODL");
}
return answ;
}
get => $@"{urlCommandIob("getCurrPODL")}";
}
/// <summary>
@@ -666,19 +643,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetListValFasiPodl
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getListValByTable/PODL";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetListValFasiPodl");
}
return answ;
}
get => $@"{urlCommand("getListValByTable")}PODL";
}
/// <summary>
@@ -686,19 +651,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetNextPODL
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getPOdlNext/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetNextPODL");
}
return answ;
}
get => $@"{urlCommandIob("getPOdlNext")}";
}
/// <summary>
@@ -706,19 +659,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetNumArt
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getArtNum/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetNumArt");
}
return answ;
}
get => $@"{urlCommandIob("getArtNum")}";
}
/// <summary>
@@ -726,19 +667,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetNumComm
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getXdlNum/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetNumComm");
}
return answ;
}
get => $@"{urlCommandIob("getXdlNum")}";
}
/// <summary>
@@ -746,19 +675,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetNumPzCurrODL
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getCurrOdlQtaReq/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetNumPzCurrODL");
}
return answ;
}
get => $@"{urlCommandIob("getCurrOdlQtaReq")}";
}
/// <summary>
@@ -766,19 +683,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetParams2Write
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getObjItems2Write/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetParams2Write");
}
return answ;
}
get => $@"{urlCommandIob("getObjItems2Write")}";
}
/// <summary>
@@ -786,19 +691,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetPzCount
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getCounter/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetPzCount");
}
return answ;
}
get => $@"{urlCommandIob("getCounter")}";
}
/// <summary>
@@ -806,19 +699,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetPzCountRec
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getCounterTCRec/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetPzCountRec");
}
return answ;
}
get => $@"{urlCommandIob("getCounterTCRec")}";
}
/// <summary>
@@ -826,19 +707,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetTask2Exe
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getTask2Exe/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlGetTask2Exe");
}
return answ;
}
get => $@"{urlCommandIob("getTask2Exe")}";
}
/// <summary>
@@ -846,10 +715,13 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlIdleTime
{
get => $@"{urlCommandIob("getIdlePeriod")}";
#if false
get
{
return $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMD_IDLE_TIME}{IOBConfFull.GenConf.CodIOB}";
}
}
#endif
}
/// <summary>
@@ -857,10 +729,13 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlInizioOdlIob
{
get => $@"{urlCommandIob("getCurrOdlStart")}";
#if false
get
{
return $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMD_ODL_STARTED}{IOBConfFull.GenConf.CodIOB}";
}
}
#endif
}
/// <summary>
@@ -868,10 +743,13 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlIobEnabled
{
get => $@"{urlCommandIob("enabled")}";
#if false
get
{
return $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDENABLED}{IOBConfFull.GenConf.CodIOB}";
}
}
#endif
}
/// <summary>
@@ -879,19 +757,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlODLAskClose
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/askCloseODL/{IOBConfFull.GenConf.CodIOB}?idxOdl=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlODLClose");
}
return answ;
}
get => $@"{urlCommandIob("askCloseODL")}?idxOdl=";
}
/// <summary>
@@ -899,19 +765,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlODLClose
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/closeODL/{IOBConfFull.GenConf.CodIOB}?idxOdl=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlODLClose");
}
return answ;
}
get => $@"{urlCommandIob("closeODL")}/?idxOdl=";
}
/// <summary>
@@ -919,19 +773,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlOdlStartFromPOdl
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/forceStartPOdl/{IOBConfFull.GenConf.CodIOB}?idxPODL=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlStartPODL");
}
return answ;
}
get=> $@"{urlCommandIob("forceStartPOdl")}?idxPODL=";
}
/// <summary>
@@ -939,19 +781,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlPODLClose
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/closePODL/{IOBConfFull.GenConf.CodIOB}?idxPOdl=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlPODLClose");
}
return answ;
}
get=> $@"{urlCommandIob("closePODL")}?idxPOdl=";
}
/// <summary>
@@ -959,6 +789,8 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlReboot
{
get => $@"{urlCommandIob("sendReboot")}?mac={GetMACAddress()}";
#if false
get
{
string answ = "";
@@ -971,7 +803,8 @@ namespace IOB_WIN_FORM.Iob
answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDREBO}{IOBConfFull.GenConf.CodIOB}";
}
return answ;
}
}
#endif
}
/// <summary>
@@ -979,19 +812,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlRemTask2Exe
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/remTask2Exe/{IOBConfFull.GenConf.CodIOB}?taskName=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlRemTask2Exe");
}
return answ;
}
get=> $@"{urlCommandIob("remTask2Exe")}?taskName=";
}
/// <summary>
@@ -999,20 +820,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSaveAllParams
{
get
{
string answ = "";
try
{
string machineName = Environment.MachineName;
answ = $@"{urlCommand("alive")}/setObjItems/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSaveMemConf");
}
return answ;
}
get=> $@"{urlCommandIob("setObjItems")}";
}
/// <summary>
@@ -1020,19 +828,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSaveMachIobConf
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/saveMachineIobConf/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSetHashDict");
}
return answ;
}
get=> $@"{urlCommandIob("saveMachineIobConf")}";
}
/// <summary>
@@ -1040,20 +836,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSaveMemMap
{
get
{
string answ = "";
try
{
string machineName = Environment.MachineName;
answ = $@"{urlCommand("alive")}/saveConf/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSaveMemConf");
}
return answ;
}
get => $@"{urlCommandIob("saveConf")}";
}
/// <summary>
@@ -1061,19 +844,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSendAlarm
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/sendAlarmBankUpdate/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlAddPzCount");
}
return answ;
}
get => $@"{urlCommandIob("sendAlarmBankUpdate")}";
}
/// <summary>
@@ -1081,19 +852,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSetHashDict
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/setRedisHashDict/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSetHashDict");
}
return answ;
}
get => $@"{urlCommandIob("setRedisHashDict")}";
}
/// <summary>
@@ -1101,6 +860,8 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSetM2IOB
{
get => $@"{urlCommandIob("setM2IOB")}?IOB_name={Environment.MachineName}";
#if false
get
{
string answ = "";
@@ -1114,7 +875,8 @@ namespace IOB_WIN_FORM.Iob
lgError(exc, "Errore in composizione urlSetM2IOB");
}
return answ;
}
}
#endif
}
/// <summary>
@@ -1122,19 +884,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSetOptVal
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/addOptPar/{IOBConfFull.GenConf.CodIOB}?";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSetOptVal");
}
return answ;
}
get => $@"{urlCommandIob("addOptPar")}";
}
/// <summary>
@@ -1142,19 +892,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSetPzCount
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/setCounter/{IOBConfFull.GenConf.CodIOB}?counter=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlSetPzCount");
}
return answ;
}
get => $@"{urlCommandIob("setCounter")}?counter=";
}
/// <summary>
@@ -1162,6 +900,8 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlSetPzCountMAC
{
get => $@"{urlCommand("setCounter")}MAC_{IOBConfFull.GenConf.CodIOB}?counter=";
#if false
get
{
string answ = "";
@@ -1174,7 +914,8 @@ namespace IOB_WIN_FORM.Iob
lgError(exc, "Errore in composizione urlSetPzCountMAC");
}
return answ;
}
}
#endif
}
/// <summary>
@@ -1182,19 +923,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlTakeSnapshot
{
get
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/takeFlogSnapshot/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlTakeSnapshot");
}
return answ;
}
get => $@"{urlCommandIob("takeFlogSnapshot")}";
}
/// <summary>
@@ -1202,12 +931,13 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlUpdateWriteParams
{
get => $@"{urlCommandIob("upsertObjItems")}";
#if false
get
{
string answ = "";
try
{
string machineName = Environment.MachineName;
answ = $@"{urlCommand("alive")}/upsertObjItems/{IOBConfFull.GenConf.CodIOB}";
}
catch (Exception exc)
@@ -1215,7 +945,8 @@ namespace IOB_WIN_FORM.Iob
lgError(exc, "Errore in composizione urlUpdateWriteParams");
}
return answ;
}
}
#endif
}
/// <summary>
@@ -4183,7 +3914,10 @@ namespace IOB_WIN_FORM.Iob
break;
}
// URL base x input
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{tipoComando}{IOBConfFull.GenConf.CodIOB}";
string answ = $@"{urlCommandIob(tipoComando)}";
#if false
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{tipoComando}{IOBConfFull.GenConf.CodIOB}";
#endif
return answ;
}
@@ -4195,13 +3929,23 @@ namespace IOB_WIN_FORM.Iob
public string urlFLog(string queueVal)
{
// URL base x input
string answ = $@"{urlCommandIob("flog")}";
#if false
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDFLOG}";
// decodifica valore!
#endif
// decodifica valore!
string[] valori = qDecodeIN(queueVal);
// aggiungo flux e valore...
answ += $@"?flux={valori[1]}&&valore={valori[2]}";
#if false
// aggiungo macchina e valore...
answ += string.Format(@"{0}?flux={1}&&valore={2}", IOBConfFull.GenConf.CodIOB, valori[1], valori[2]);
answ += string.Format(@"{0}?flux={1}&&valore={2}", IOBConfFull.GenConf.CodIOB, valori[1], valori[2]);
#endif
// aggiondo dataOra evento e corrente + contatore...
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[3]);
answ += $@"&&dtEve={valori[0]}&&dtCurr={DateTime.Now:yyyyMMddHHmmssfff}&&cnt={valori[3]}";
#if false
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[3]);
#endif
return answ;
}
@@ -4210,15 +3954,7 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public string urlGetOdlAtDate(DateTime dtRif)
{
string answ = "";
try
{
answ = $@"{urlCommand("alive")}/getOdlAtDate/{IOBConfFull.GenConf.CodIOB}?dateRif={dtRif:yyyyMMdd}";
}
catch (Exception exc)
{
lgError(exc, $"Errore in composizione urlGetOdlAtDate per {dtRif}{Environment.NewLine}{exc}");
}
string answ = $@"{urlCommandIob("getOdlAtDate")}?dateRif={dtRif:yyyyMMdd}";
return answ;
}
@@ -4230,13 +3966,22 @@ namespace IOB_WIN_FORM.Iob
public string urlInput(string queueVal)
{
// URL base x input
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDBASE}";
#if false
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDBASE}";
#endif
string answ = $@"{urlCommandIob("input")}";
// decodifica valore!
string[] valori = qDecodeIN(queueVal);
// aggiungo macchina e valore...
answ += string.Format(@"{0}?valore={1}", IOBConfFull.GenConf.CodIOB, valori[1]);
answ += $@"?valore={valori[1]}";
#if false
answ += string.Format(@"{0}?valore={1}", IOBConfFull.GenConf.CodIOB, valori[1]);
#endif
// aggiondo dataOra evento e corrente + contatore...
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[2]);
answ += $@"&&dtEve={valori[0]}&&dtCurr={DateTime.Now:yyyyMMddHHmmssfff}&&cnt={valori[2]}";
#if false
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[2]);
#endif
return answ;
}
@@ -4248,13 +3993,22 @@ namespace IOB_WIN_FORM.Iob
public string urlULog(string queueVal)
{
// URL base x input
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDULOG}";
#if false
string answ = $@"{urlMesServer}{IOBConfFull.MapoMesConf.BaseAppUrl}{cIobConf.serverData.CMDULOG}";
#endif
string answ = $@"{urlCommandIob("ulog")}";
// decodifica valore!
string[] valori = qDecodeIN(queueVal);
// aggiungo macchina e valore...
answ += string.Format(@"{0}?flux={1}&&valore={2}", IOBConfFull.GenConf.CodIOB, valori[1], valori[2]);
answ += $@"?flux={valori[1]}&&valore={valori[2]}";
#if false
answ += string.Format(@"{0}?flux={1}&&valore={2}", IOBConfFull.GenConf.CodIOB, valori[1], valori[2]);
#endif
// aggiondo dataOra evento e corrente + contatore...
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[3]);
answ += $@"&&dtEve={valori[0]}&&dtCurr={DateTime.Now:yyyyMMddHHmmssfff}&&cnt={valori[3]}";
#if false
answ += string.Format(@"&&dtEve={0}&&dtCurr={1:yyyyMMddHHmmssfff}&&cnt={2}", valori[0], DateTime.Now, valori[3]);
#endif
return answ;
}
+1 -1
View File
@@ -30,7 +30,7 @@
"optKVP": {
"shelly_tout": 5,
"fluxLogReduce": true,
"fluxLogRedDeadBand": 2.5,
"fluxLogRedDeadBand": 3.5,
"fluxLogResendPeriod": 60
}
}