<?xml version="1.0" encoding="utf-8"?>
<Templates format="2" protocolVersion="83">
  <Template id="7e4b9a12-8c3d-4e5f-a1b2-c9d8e7f60341" revision="1.4">
    <RevisionHistory>
      <Revision id="1.0">Prvá verzia</Revision>
      <Revision id="1.1">Pridané premenné RFID karta a Čas nabíjania relácie — logovateľné cez Grafy (história pripojených kariet a trvanie relácií)</Revision>
      <Revision id="1.2">Pracovný režim prerobený na MultiValueSwitch (STOP/FAST/ECO/GREEN) — číta deviceWorkingMode a zapisuje cez set_evc_work_mode; nahrádza akciu aj atribút</Revision>
      <Revision id="1.3">Robustná obnova tokenu: obnovuje sa len pri auth chybách (10400/10402) s okamžitým retry v tom istom cykle; rate limit (10405/10406) a prechodné chyby token nezahadzujú a hlásia sa ako varovanie</Revision>
      <Revision id="1.4">Auth-retry pri zápisoch: prepínač režimu aj všetky akcie si pri kóde 10400/10402 obnovia token a príkaz hneď zopakujú (predtým sa token obnovoval len pri čítaní a zápis padal na 10402)</Revision>
    </RevisionHistory>
    <Name>SolaX HAC EV nabíjačka (Cloud API)</Name>
    <CcuModel>PacketParserCCU</CcuModel>
    <Producer>SolaX Power</Producer>
    <Model>X1/X3-HAC, A1-HAC, C1/C3-HAC (SolaX Cloud Developer Portal API)</Model>
    <Description>Integrácia EV nabíjačiek SolaX HAC cez cloudové rozhranie Developer Portal API (openapi-eu.solaxcloud.com, OAuth2 client_credentials). Číta stav, nabíjací výkon, energiu a prúdy; ovláda štart/stop nabíjania, pracovný režim a limit prúdu. Token platí 30 dní a obnovuje sa automaticky pri zlyhaní autentifikácie. Poll interval 60 s kvôli rate limitu API.</Description>
    <Category>2</Category>
    <ImportParameters>
      <Parameter>
        <Id>ClientId</Id>
        <Name>ClientId: ID klienta z SolaX Developer Portálu</Name>
        <Value/>
      </Parameter>
      <Parameter>
        <Id>ClientSecret</Id>
        <Name>ClientSecret: Client Secret z SolaX Developer Portálu</Name>
        <Value/>
      </Parameter>
      <Parameter>
        <Id>DeviceSN</Id>
        <Name>DeviceSN: Sériové číslo nabíjačky (Device SN)</Name>
        <Value/>
      </Parameter>
    </ImportParameters>
    <Module>
      <Name>SolaX Cloud API</Name>
      <Id>-1</Id>
      <Model>PacketParserModuleHttp</Model>
      <DeviceProperties>
        <IpAddress>openapi-eu.solaxcloud.com</IpAddress>
        <Port>443</Port>
        <UseHttps>True</UseHttps>
        <HttpAuthentification>0</HttpAuthentification>
        <InternalPollInterval>60000</InternalPollInterval>
        <CustomVariables>[{&quot;Name&quot;:&quot;AccessToken&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;&quot;},{&quot;Name&quot;:&quot;RealtimeData&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;&quot;},{&quot;Name&quot;:&quot;ClientId&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;$[ClientId]&quot;},{&quot;Name&quot;:&quot;ClientSecret&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;$[ClientSecret]&quot;},{&quot;Name&quot;:&quot;DeviceSN&quot;,&quot;ValueTypeId&quot;:2,&quot;NumericValue&quot;:0,&quot;StringValue&quot;:&quot;$[DeviceSN]&quot;}]</CustomVariables>
        <ReadScriptPacketParser>IF LENGTH(AccessToken) = 0
    VAR tokenBody := &quot;client_id=&quot; + ClientId + &quot;&amp;client_secret=&quot; + ClientSecret + &quot;&amp;grant_type=client_credentials&quot;;
    VAR tokenResponse := SENDHTTPREQUEST(&quot;/openapi/auth/oauth/token&quot;, &quot;POST&quot;, tokenBody, &quot;Content-Type: application/x-www-form-urlencoded&quot;);
    IF tokenResponse.IsSuccess
        VAR newToken := PARSEJSON(tokenResponse.Content, &quot;$.result.access_token&quot;, true);
        IF !ISNULL(newToken)
            AccessToken := newToken;
        ELSE
            ADDERROR(1, &quot;SolaX auth: odpoveď bez access_token&quot;);
        END
    ELSE
        ADDERROR(1, &quot;SolaX auth zlyhala: HTTP &quot; + tokenResponse.StatusCode);
    END
END

IF LENGTH(AccessToken) &gt; 0
    VAR rtResponse := SENDHTTPREQUEST(&quot;/openapi/v2/device/realtime_data?snList=&quot; + DeviceSN + &quot;&amp;deviceType=4&amp;businessType=1&quot;, &quot;GET&quot;, &quot;&quot;, &quot;Authorization: bearer &quot; + AccessToken);
    IF rtResponse.IsSuccess
        VAR rtCode := PARSEJSON(rtResponse.Content, &quot;$.code&quot;, true);
        IF rtCode = 10000
            RealtimeData := rtResponse.Content;
        ELSEIF rtCode = 10400 | rtCode = 10402
            VAR tokenBody2 := &quot;client_id=&quot; + ClientId + &quot;&amp;client_secret=&quot; + ClientSecret + &quot;&amp;grant_type=client_credentials&quot;;
            VAR tokenResponse2 := SENDHTTPREQUEST(&quot;/openapi/auth/oauth/token&quot;, &quot;POST&quot;, tokenBody2, &quot;Content-Type: application/x-www-form-urlencoded&quot;);
            AccessToken := &quot;&quot;;
            IF tokenResponse2.IsSuccess
                VAR newToken2 := PARSEJSON(tokenResponse2.Content, &quot;$.result.access_token&quot;, true);
                IF !ISNULL(newToken2)
                    AccessToken := newToken2;
                    rtResponse := SENDHTTPREQUEST(&quot;/openapi/v2/device/realtime_data?snList=&quot; + DeviceSN + &quot;&amp;deviceType=4&amp;businessType=1&quot;, &quot;GET&quot;, &quot;&quot;, &quot;Authorization: bearer &quot; + AccessToken);
                    IF rtResponse.IsSuccess
                        rtCode := PARSEJSON(rtResponse.Content, &quot;$.code&quot;, true);
                        IF rtCode = 10000
                            RealtimeData := rtResponse.Content;
                        ELSE
                            ADDERROR(2, &quot;SolaX API kód &quot; + rtCode + &quot; aj po obnove tokenu&quot;);
                        END
                    END
                END
            END
        ELSEIF rtCode = 10405 | rtCode = 10406
            ADDWARNING(&quot;SolaX limit volaní API (kód &quot; + rtCode + &quot;), zobrazujú sa dáta z minulého cyklu&quot;);
        ELSE
            ADDWARNING(&quot;SolaX prechodná chyba, kód &quot; + rtCode);
        END
    ELSE
        ADDERROR(3, &quot;Chyba čítania dát: HTTP &quot; + rtResponse.StatusCode);
    END
END</ReadScriptPacketParser>
      </DeviceProperties>
      <Devices>
        <Device>
          <Name>Nabíjací výkon</Name>
          <Id>-2</Id>
          <Model>PacketParserElectricityMeter</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <Calibration>0</Calibration>
            <ReadDemandScriptPacketParser>PARSEJSON(RealtimeData, &quot;$.result[0].chargingPower&quot;, true) / 1000</ReadDemandScriptPacketParser>
            <ReadTotalConsumptionScriptPacketParser>PARSEJSON(RealtimeData, &quot;$.result[0].totalChargeEnergy&quot;, true)</ReadTotalConsumptionScriptPacketParser>
            <ServiceAttributesScriptsPacketParser>[{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Energia aktuálnej relácie [kWh]&quot;},&quot;ReadFormula&quot;:&quot;PARSEJSON(RealtimeData, \&quot;$.result[0].chargingEnergyThisSession\&quot;, true)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Prúd L1 [A]&quot;},&quot;ReadFormula&quot;:&quot;PARSEJSON(RealtimeData, \&quot;$.result[0].l1Current\&quot;, true)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Prúd L2 [A]&quot;},&quot;ReadFormula&quot;:&quot;PARSEJSON(RealtimeData, \&quot;$.result[0].l2Current\&quot;, true)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Prúd L3 [A]&quot;},&quot;ReadFormula&quot;:&quot;PARSEJSON(RealtimeData, \&quot;$.result[0].l3Current\&quot;, true)&quot;},{&quot;AttributeDefinition&quot;:{&quot;Name&quot;:&quot;Jednofázový prúd [A]&quot;},&quot;ReadFormula&quot;:&quot;PARSEJSON(RealtimeData, \&quot;$.result[0].singlePhaseCurrent\&quot;, true)&quot;}]</ServiceAttributesScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Nabíjanie prebieha</Name>
          <Id>-3</Id>
          <Model>PacketParserReedContact</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <OnStateIconId>39</OnStateIconId>
            <OffStateIconId>40</OffStateIconId>
            <OnStateName>Nabíja</OnStateName>
            <OffStateName>Nenabíja</OffStateName>
            <ReadStateScriptPacketParser>VAR status := PARSEJSON(RealtimeData, &quot;$.result[0].deviceStatus&quot;, true);
IF ISNULL(status)
    RETURN(0);
END
IF status = 2
    RETURN(1);
END
RETURN(0);</ReadStateScriptPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Stav nabíjačky</Name>
          <Id>-4</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadStateScriptPacketParser>PARSEJSON(RealtimeData, &quot;$.result[0].deviceStatus&quot;, true)</ReadStateScriptPacketParser>
            <ServiceActionsScriptsPacketParser>[{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;Spustiť nabíjanie&quot;,&quot;NumericParameters&quot;:[],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[]},&quot;Script&quot;:&quot;VAR body := \&quot;{\\\&quot;snList\\\&quot;:[\\\&quot;\&quot; + DeviceSN + \&quot;\\\&quot;],\\\&quot;workCmd\\\&quot;:2,\\\&quot;workMode\\\&quot;:2,\\\&quot;businessType\\\&quot;:1}\&quot;;\nVAR r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\nVAR c := 0;\nIF r.IsSuccess\n    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n    IF c = 10400 | c = 10402\n        VAR tb := \&quot;client_id=\&quot; + ClientId + \&quot;&amp;client_secret=\&quot; + ClientSecret + \&quot;&amp;grant_type=client_credentials\&quot;;\n        VAR tr := SENDHTTPREQUEST(\&quot;/openapi/auth/oauth/token\&quot;, \&quot;POST\&quot;, tb, \&quot;Content-Type: application/x-www-form-urlencoded\&quot;);\n        IF tr.IsSuccess\n            VAR nt := PARSEJSON(tr.Content, \&quot;$.result.access_token\&quot;, true);\n            IF !ISNULL(nt)\n                AccessToken := nt;\n                r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\n                IF r.IsSuccess\n                    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n                END\n            END\n        END\n    END\n    IF c = 10000\n        RETURN(\&quot;OK, príkaz odoslaný\&quot;);\n    END\n    RETURN(\&quot;SolaX API kód \&quot; + c);\nEND\nADDERROR(r.StatusCode);\nRETURN(\&quot;Chyba\&quot;);&quot;},{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;Zastaviť nabíjanie&quot;,&quot;NumericParameters&quot;:[],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[]},&quot;Script&quot;:&quot;VAR body := \&quot;{\\\&quot;snList\\\&quot;:[\\\&quot;\&quot; + DeviceSN + \&quot;\\\&quot;],\\\&quot;workCmd\\\&quot;:3,\\\&quot;workMode\\\&quot;:3,\\\&quot;businessType\\\&quot;:1}\&quot;;\nVAR r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\nVAR c := 0;\nIF r.IsSuccess\n    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n    IF c = 10400 | c = 10402\n        VAR tb := \&quot;client_id=\&quot; + ClientId + \&quot;&amp;client_secret=\&quot; + ClientSecret + \&quot;&amp;grant_type=client_credentials\&quot;;\n        VAR tr := SENDHTTPREQUEST(\&quot;/openapi/auth/oauth/token\&quot;, \&quot;POST\&quot;, tb, \&quot;Content-Type: application/x-www-form-urlencoded\&quot;);\n        IF tr.IsSuccess\n            VAR nt := PARSEJSON(tr.Content, \&quot;$.result.access_token\&quot;, true);\n            IF !ISNULL(nt)\n                AccessToken := nt;\n                r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\n                IF r.IsSuccess\n                    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n                END\n            END\n        END\n    END\n    IF c = 10000\n        RETURN(\&quot;OK, príkaz odoslaný\&quot;);\n    END\n    RETURN(\&quot;SolaX API kód \&quot; + c);\nEND\nADDERROR(r.StatusCode);\nRETURN(\&quot;Chyba\&quot;);&quot;},{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;Zamknúť / sprístupniť nabíjačku&quot;,&quot;NumericParameters&quot;:[],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[{&quot;FriendlyName&quot;:&quot;Stav&quot;,&quot;Abbreviation&quot;:&quot;lockCmd&quot;,&quot;Values&quot;:[{&quot;Item1&quot;:0,&quot;Item2&quot;:&quot;Zamknúť&quot;},{&quot;Item1&quot;:1,&quot;Item2&quot;:&quot;Sprístupniť&quot;}]}]},&quot;Script&quot;:&quot;VAR body := \&quot;{\\\&quot;snList\\\&quot;:[\\\&quot;\&quot; + DeviceSN + \&quot;\\\&quot;],\\\&quot;workCmd\\\&quot;:\&quot; + lockCmd + \&quot;,\\\&quot;workMode\\\&quot;:\&quot; + lockCmd + \&quot;,\\\&quot;businessType\\\&quot;:1}\&quot;;\nVAR r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\nVAR c := 0;\nIF r.IsSuccess\n    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n    IF c = 10400 | c = 10402\n        VAR tb := \&quot;client_id=\&quot; + ClientId + \&quot;&amp;client_secret=\&quot; + ClientSecret + \&quot;&amp;grant_type=client_credentials\&quot;;\n        VAR tr := SENDHTTPREQUEST(\&quot;/openapi/auth/oauth/token\&quot;, \&quot;POST\&quot;, tb, \&quot;Content-Type: application/x-www-form-urlencoded\&quot;);\n        IF tr.IsSuccess\n            VAR nt := PARSEJSON(tr.Content, \&quot;$.result.access_token\&quot;, true);\n            IF !ISNULL(nt)\n                AccessToken := nt;\n                r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_charge_command\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\n                IF r.IsSuccess\n                    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n                END\n            END\n        END\n    END\n    IF c = 10000\n        RETURN(\&quot;OK, príkaz odoslaný\&quot;);\n    END\n    RETURN(\&quot;SolaX API kód \&quot; + c);\nEND\nADDERROR(r.StatusCode);\nRETURN(\&quot;Chyba\&quot;);&quot;},{&quot;ActionDefinition&quot;:{&quot;Name&quot;:&quot;Nastaviť limit prúdu&quot;,&quot;NumericParameters&quot;:[{&quot;FriendlyName&quot;:&quot;Limit prúdu [A] (7/22 kW: 6-32, 11 kW: 6-16)&quot;,&quot;Abbreviation&quot;:&quot;iLim&quot;,&quot;IsFloat&quot;:false,&quot;MinValue&quot;:6,&quot;MaxValue&quot;:32}],&quot;BoolParameters&quot;:[],&quot;EnumParameters&quot;:[]},&quot;Script&quot;:&quot;VAR body := \&quot;{\\\&quot;snList\\\&quot;:[\\\&quot;\&quot; + DeviceSN + \&quot;\\\&quot;],\\\&quot;currentLimit\\\&quot;:\&quot; + iLim + \&quot;,\\\&quot;businessType\\\&quot;:1}\&quot;;\nVAR r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_current_limit\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\nVAR c := 0;\nIF r.IsSuccess\n    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n    IF c = 10400 | c = 10402\n        VAR tb := \&quot;client_id=\&quot; + ClientId + \&quot;&amp;client_secret=\&quot; + ClientSecret + \&quot;&amp;grant_type=client_credentials\&quot;;\n        VAR tr := SENDHTTPREQUEST(\&quot;/openapi/auth/oauth/token\&quot;, \&quot;POST\&quot;, tb, \&quot;Content-Type: application/x-www-form-urlencoded\&quot;);\n        IF tr.IsSuccess\n            VAR nt := PARSEJSON(tr.Content, \&quot;$.result.access_token\&quot;, true);\n            IF !ISNULL(nt)\n                AccessToken := nt;\n                r := SENDHTTPREQUEST(\&quot;/openapi/v2/device/evc_control/set_evc_current_limit\&quot;, \&quot;POST\&quot;, body, \&quot;Authorization: bearer \&quot; + AccessToken, \&quot;Content-Type: application/json\&quot;);\n                IF r.IsSuccess\n                    c := PARSEJSON(r.Content, \&quot;$.code\&quot;, true);\n                END\n            END\n        END\n    END\n    IF c = 10000\n        RETURN(\&quot;OK, príkaz odoslaný\&quot;);\n    END\n    RETURN(\&quot;SolaX API kód \&quot; + c);\nEND\nADDERROR(r.StatusCode);\nRETURN(\&quot;Chyba\&quot;);&quot;}]</ServiceActionsScriptsPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>RFID karta</Name>
          <Id>-5</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadStateScriptPacketParser>VAR rfid := PARSEJSON(RealtimeData, &quot;$.result[0].rfidnumber&quot;, true);
IF ISNULL(rfid)
    RETURN(0);
END
RETURN(rfid);</ReadStateScriptPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Čas nabíjania relácie</Name>
          <Id>-6</Id>
          <Model>PacketParserVariable</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <IsReadOnly>True</IsReadOnly>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadStateScriptPacketParser>VAR t := PARSEJSON(RealtimeData, &quot;$.result[0].chargingTimeThisSession&quot;, true);
IF ISNULL(t)
    RETURN(0);
END
RETURN(t / 60);</ReadStateScriptPacketParser>
          </DeviceProperties>
        </Device>
        <Device>
          <Name>Pracovný režim</Name>
          <Id>-7</Id>
          <Model>PacketParserMultiValueSwitch</Model>
          <DeviceProperties>
            <DeviceType>0</DeviceType>
            <InternalPollInterval>60000</InternalPollInterval>
            <ShouldDoPeriodicWrite>False</ShouldDoPeriodicWrite>
            <ReadSwitchStateScriptPacketParser>VAR mode := PARSEJSON(RealtimeData, &quot;$.result[0].deviceWorkingMode&quot;, true);
IF ISNULL(mode)
    RETURN(0);
END
RETURN(mode);</ReadSwitchStateScriptPacketParser>
            <WriteSwitchStateScriptPacketParser>VAR body := &quot;{\&quot;snList\&quot;:[\&quot;&quot; + DeviceSN + &quot;\&quot;],\&quot;workMode\&quot;:&quot; + Mu + &quot;,\&quot;businessType\&quot;:1}&quot;;
VAR r := SENDHTTPREQUEST(&quot;/openapi/v2/device/evc_control/set_evc_work_mode&quot;, &quot;POST&quot;, body, &quot;Authorization: bearer &quot; + AccessToken, &quot;Content-Type: application/json&quot;);
VAR c := 0;
IF r.IsSuccess
    c := PARSEJSON(r.Content, &quot;$.code&quot;, true);
    IF c = 10400 | c = 10402
        VAR tb := &quot;client_id=&quot; + ClientId + &quot;&amp;client_secret=&quot; + ClientSecret + &quot;&amp;grant_type=client_credentials&quot;;
        VAR tr := SENDHTTPREQUEST(&quot;/openapi/auth/oauth/token&quot;, &quot;POST&quot;, tb, &quot;Content-Type: application/x-www-form-urlencoded&quot;);
        IF tr.IsSuccess
            VAR nt := PARSEJSON(tr.Content, &quot;$.result.access_token&quot;, true);
            IF !ISNULL(nt)
                AccessToken := nt;
                r := SENDHTTPREQUEST(&quot;/openapi/v2/device/evc_control/set_evc_work_mode&quot;, &quot;POST&quot;, body, &quot;Authorization: bearer &quot; + AccessToken, &quot;Content-Type: application/json&quot;);
                IF r.IsSuccess
                    c := PARSEJSON(r.Content, &quot;$.code&quot;, true);
                END
            END
        END
    END
    IF c != 10000
        ADDERROR(1, &quot;SolaX API kód &quot; + c);
    END
ELSE
    ADDERROR(r.StatusCode);
END</WriteSwitchStateScriptPacketParser>
            <Value0>0</Value0>
            <Value0Index>0</Value0Index>
            <Value0Name>STOP</Value0Name>
            <Value0IconId>215</Value0IconId>
            <Value1>1</Value1>
            <Value1Index>1</Value1Index>
            <Value1Name>FAST</Value1Name>
            <Value1IconId>222</Value1IconId>
            <Value2>2</Value2>
            <Value2Index>2</Value2Index>
            <Value2Name>ECO</Value2Name>
            <Value2IconId>226</Value2IconId>
            <Value3>3</Value3>
            <Value3Index>3</Value3Index>
            <Value3Name>GREEN</Value3Name>
            <Value3IconId>2022</Value3IconId>
            <Value4Index>68</Value4Index>
            <Value5Index>69</Value5Index>
            <Value6Index>70</Value6Index>
            <Value7Index>71</Value7Index>
            <Value8Index>72</Value8Index>
            <Value9Index>73</Value9Index>
          </DeviceProperties>
        </Device>
      </Devices>
    </Module>
  </Template>
</Templates>
