1

Téma: Zobrazeni teplot na Userweb

Dobrý den, koupil jsem si SDS micro DIN E a nedaří se mi zobrazit teploty na uživatelském webu. Použil jsem upravenou demo stránku pro micro ze které ovládám jen relé. Protože k demo stránce micro není SDS-C program, zkoušel jsem jiné, ale nedaří se mi nic zobrazit.Už jsem se v tom úplně ztratil. Můj SDS program je úplně krátký, nepotřebuji nic odesílat na portál jen na svůj web.
Prostudoval jsem vše na wiki a stále to nejde. Poradí prosím někdo co s tím? Děkuji Milos

init
{
 echo('Start programu');
 sys[140]=0;
 sys[141]=0;
 sys[142]=0;
 sys[143]=0;
 sys[144]=0;
}
 main
 {

// *******  ovladani rele  **********
  
//K1-zap
  if (sys[140]==1) {
  sys[231]=255;
   //echotime();
   echo ('R1 on');
   wait(2000);
   sys[231]=0;
   }
   sys[140]==0;
 
 //K2-zap
  if (sys[141]==1) {
   sys[232]=255;
 // echotime();
   echo ('R2 on');
   wait(2000);
   sys[232]=0;
   }
   sys[141]==0;
  
 // K1 - rele1
 if (sys[493]==1) {
     wait(10000);
  sys[231]=255;
  //echotime();
  echo ('RESET - K1');
  wait(2000);
  sys[231]=0;
  }
  sys[493]==0;
 

// K2 - rele2
 if (sys[494]==1) {
     wait(10000);
  sys[232]=255;
  //echotime();
  echo ('RESET - K2');
  wait(2000);
  sys[232]=0;
  }
  sys[494]==0;
  
   //zap digital-2s
 if (sys[142]==1) {
  sys[301]=255;
  //echotime();
  echo ('DO on');
  wait(2000);
  sys[301]=0;
  }
  sys[142]==0;
  
  
 }
  

2

Re: Zobrazeni teplot na Userweb

Inspirujte se např. u vlastního webu samotného SDS, nebo tady na fóru je několik docela kompletních příkladů.

Každopádně, do webové stránky dáte např. javascript který se bude pravidelně SDS dotazovat na patřičné položky, a výsledky těchto dotazů pak nastaví určeným elementům stránky (které se tam musí připravit).

V podstatě to co dělá webová stránka vlastního webového rozhraní SDS, která ty teploty zobrazuje (stránka "Aktuální stav").

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

3

Re: Zobrazeni teplot na Userweb

Tak po dlouhém bádání to konečně začalo fungovat. Je to sice celé rozházené, ale s tím už si poradím. Je to slátané systémem pokus-omyl. Myslím JavaScript - je z různých stránek a je  tam víc kodů než je potřeba a některé jsou zdvojené. Ale to už dohromady dám. Hlavně, že už to jde. Já jsem nevěděl jestli se musí upravovat SDS-C program, to byl hlavní problém. Ale byla to dobrá škola.
Díky Miloš

4

Re: Zobrazeni teplot na Userweb

Tak všechno už to tak nějak funguje, až na spínání relátek z Uweb. Když to zkouším testovat přes google/F12/console/...,tak mi to hlásí chybu u reqCompleteR, že není definované. Tlačítko jde přes: //<input value=" Kvitace K1 "onclick="javascript:sdsc_S(140,1);" type="button">//. Zkoušel jsem kde co a stále nejde.
Ještě nevím co znamenají ta čísla v hranatých závorkách, třeba://document.getElementById("AD0").innerHTML=rE[11];//

<script type="text/javascript">
  var t;
  var reqR=true;
  var req=false;
  var reqTemp =null;
  var boolNames =true;
  var timeout = 2000
  
  
  function reqComplete(){
   if(req.readyState == 4){
    if(req.status == 200){
     var rE=req.responseText.split("|");
     document.getElementById("AD0").innerHTML=rE[11];
     document.getElementById("AD1").innerHTML=rE[12];
      if(rE[10]=='bez senzorĹŻ'){
      document.getElementById("pocetcidel").innerHTML=rE[10];
      
     } else {
      var rACU=rE[10].split(" ");
      document.getElementById("pocetcidel").innerHTML=((rACU.length-1)/2)+" &nbsp;(16)";
     }

     var xx;
     xx=((5*(59 - 30*((3/1024)*rE[9])))/2);
     xx=xx.toFixed(1);
     document.getElementById("SoC").innerHTML=xx+" &deg;C";
    }
   }
  }

   
      function fceCidla(){
       if(reqTemp.readyState == 4 && reqTemp.status == 200){
           if(reqTemp.responseText != ''){
             var cidlaTeploty = reqTemp.responseText.split("|");
             for(i = 1; i <= cidlaTeploty.length; i++){
                 objTemp = document.getElementById('temp' + i);
                 pom = cidlaTeploty[i-1] / 100;
                    if(pom > 200){
                    objTemp.innerHTML = '-';
                    pom=0;
                    }else{
                      //objTemp.innerHTML = pom.toFixed(2) + " °C";
                      objTemp.innerHTML = pom.toFixed(1) + " °C";
                    }
                   }
              }
          }
        }

  var reqE=false;
  function reqCompleteE(){
   if(reqE.readyState == 4){
    if(reqE.status == 200){
     var rE=reqE.responseText.split("|");
     document.getElementById("vykon").innerHTML=rE[8];
     document.getElementById("vykon2").innerHTML=rE[15];
     document.getElementById("vykon3").innerHTML=rE[22];

    }
   }
  }
  var reqE2=false;
  function reqCompleteE2(){
      if(reqE2.readyState == 4 && reqE2.status == 200){
         
             var rE2 = reqE2.responseText.split("|");
              document.getElementById("tmin").innerHTML=rE2[3] ;
              document.getElementById("tmax").innerHTML=rE2[4] ;
              document.getElementById("bojlitr").innerHTML=rE2[5] +" %";
              document.getElementById("maxL1").innerHTML=rE2[7] +" W";
              document.getElementById("maxL2").innerHTML=rE2[8] +" W";
              document.getElementById("maxL3").innerHTML=rE2[9] +" W";
              document.getElementById("max3f").innerHTML=rE2[6] +" W";
             
              document.getElementById("suma2").innerHTML=rE2[14]/1000 +" kW";
              document.getElementById("hodL1").innerHTML=rE2[16] +" Wh";
              document.getElementById("hodL2").innerHTML=rE2[17] +" Wh";
              document.getElementById("hodL3").innerHTML=rE2[18] +" Wh";
              document.getElementById("hodLV").innerHTML=rE2[19] +" Wh";
              document.getElementById("hod24").innerHTML=rE2[20] +" Wh";
      }
  }
 
  function sdsps(){
   req=false;
   regE=false;
   reqE2=false;
   reqR=false;
   reqTemp=false;
  
   
   if(window.XMLHttpRequest){
    reqTemp = new XMLHttpRequest();
    req=new XMLHttpRequest();
    reqE=new XMLHttpRequest();
    reqR=new XMLHttpRequest();
    reqE2=new XMLHttpRequest();
   }
   else if (window.ActiveXObject){
    reqTemp = new ActiveXObject("Microsoft.XMLHTTP");
    req=new ActiveXObject("Microsoft.XMLHTTP");
    reqE=new ActiveXObject("Microsoft.XMLHTTP");
    reqE2=new ActiveXObject("Microsoft.XMLHTTP");
    reqR=new ActiveXObject("Microsoft.XMLHTTP");
   }
   if (req){
   //opto
    req.open("GET", "cgi_dys?rand="+Math.random(), true);
    req.onreadystatechange = reqComplete;
    req.send(null);
   }
   if (reqE){
    reqE.open("GET", "cgi_dyeA?rand="+Math.random(), true);
    reqE.onreadystatechange = reqCompleteE;
    reqE.send(null);
   }
   if(reqE2){
     reqE2.open("GET", "get_ram[10]?rn=21&rand="+Math.random(), true)
     reqE2.onreadystatechange = reqCompleteE2;
     reqE2.send(null);
    }
    
    if(reqTemp){
    //teploty
     reqTemp.open("GET", "http://192.168.1.250/get_sys[310]?rn=16&rand="+Math.random(), true);
     reqTemp.onreadystatechange = fceCidla;
     reqTemp.send(null);
    }

    if(reqR){
    //rele
     reqR.open("GET", "http://192.168.1.250/get_sys[231]?rn=2&rand="+Math.random(), true);
     reqR.onreadystatechange = reqCompleteR; //.............................................tady to hlásí chybu
     reqR.send(null);
    }

   t=setTimeout("sdsps()",2000);
  };

 
  </script>            

5

Re: Zobrazeni teplot na Userweb

Proměnná rE je pole, které vznikne tím, že se použila funkce split. Tato funkce, podle kódu který vidím, si bere vstup z responseText a vydává výstup jako položky pole [0] až [n], kde každá položka je kus textu vybraný z responseText proměnné, přičemž jednotlivé kusy jsou odlišeny právě znamek svislítka |

var responseText = "abc|1234|bee";

var rE=req.responseText.split("|");

potom:

rE[0] je "abc" , rE[1] je 1234 a rE[2] je "bee" .

Tohle je čistě záležitost programování v javascriptu, a SDS na to nemá vliv.


Dále, druhý dotaz: reqCompleteR

V uvedeném kódu to není, proto to "háže tu chybu".

Posíláte požadavek na server (SDS), a než to pošlete tak javascriptu nastavíte, že při každé změně stavu provádění požadavku, má zavolat vaši funkci. Toto se děje právě nastavením reqR.onreadystatechange, na hodnotu reqCompleteR což je vaše funkce. A proto ji musíte někde definovat, a dát si do ní svůj kód. Nebo ji nechat prázdnou, pokud s průběhem a výsledkem už nic  dále nechcete dělat (pak lze i to celé přiřazení rovnou smazat).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

6

Re: Zobrazeni teplot na Userweb

Děkuji za vysvětlení. Na tu záležitost s rE"[0]... " se mi podarilo přijít jak to asi funguje. S tím "reqCompleteR" je to už horší. Já asi chápu jak by to mělo fungovat, ale nejsem programátor a navíc už jsem důchodce čekatel, takže mi nezbývá než se pořád vyptávat. Už to do hlavy nejde jako dřív.
Jinak zařízení už je plně funkční. Došel jsem k tomu, jak už tu někdo psal, postupným přidáváním a umazáváním kodu.
Zbývá mi už jen vymyslet funkci "když sepne OPTO1/OPTO2, tak at se na uwebu zmení barva tlačítka, nebo nějakého políčka " porucha " z bílé na červenou". Nebo tak něco, aby bylo vidět, že je porucha.
Kdyby to navíc ještě blikalo bude super. V lidštině to umím, ale napsat to do kodu bude o poznání horší.
Tak jdu na to, snad to vyřeším.

7

Re: Zobrazeni teplot na Userweb

Jasné.

Všechno tohle je jako učit se cizí řeč - někdo to už vymyslel, více nebo méně kvalitně popsal, a každý kdo chce cizí řečí mluvit se to musí nakonec sám naučit.
Programování v javascriptu je právě tento případ. Někdo to vymyslel (javascript) a také určil jak se to má chovat (integrace a použití ve webovém prohlížeči = funkce DOM). No a tohle je potřeba si nastudovat, a vyzkoušet ideálně na malých příkladech.
Nakonec člověk zjistí že je to velice jednoduché, a prakticku mu stačí několik řádků kódu které pak s různými drobnými úpravami opakuje ve svých projektech.

Pro javascript a DOM jsou výborné online kurzy od w3 konzorcia, specificky záležitosti kolem toho requestu: https://www.w3schools.com/js/js_ajax_http_send.asp
Prakticky je tam skutečně vše dostatečně vysvětleno, i s příklady.

Naroubovat to na SDS je pak už jednoduché. SDS všechny své dynamická data (odpověď na request) předává jako dlouhý text (string), ve kterém jsou prvky odděleny svislítkem - a to se pak rozpadne na pole pomocí funkce split. Viz příspěvek výše.

Změna barva tlačítka - to je práce s DOM v javascriptu, tedy opět viz další návod na w3.

Praktická realizace popsaného úkolu bude taková:
- udělat funkci (timer) která vyvolá dotaz na SDS, např. co 1 sekundu (viz hotová řešení v sds web stránkách)
- na základě zpracování odpovědi změnit DOM parametry nějakého prvku (např. style pro button)
- nebo aby to blikalo, udělat si další timer, který bude volat svou funkci v rytmu blikání, ale v této funkci dojde ke změně DOM paramterů prvku (tlačítka) jen když je nastavena nějaká vlastní proměnná (která se nastaví právě v té obsluze přijaté odpovědi ze SDS, namísto přímé sahání na parametry tlačítka)

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

8

Re: Zobrazeni teplot na Userweb

Dík za vše, ale já už se v tom naprosto ztrácím. Celý den se snažím něco vymyslet, ale nejde mi to .Jsem v bludném kruhu a nejde s toho ven, něco dělám a nevím co.  Mám určitou představu, že to budu z Uwebu volat podobně jako teplotní čidla jen tam zadám sys[pro OPTO] a pak to i podobně zobrazím. Nechápu, proč by u toho měl být timer, ten bych viděl až na to blikání. Na vstupu OPTO je kontakt relé, který ho sepne. To sepnutí potřebuju vyhodnotit jako poruchu rozsvícením červeného prvku a nápisem porucha a nemusí ani blikat. Ráno to ještě zkusím a pokud se nepohnu, tak to vzdávám. Jak jsem psal je to první a asi i poslední akce. Nemůžu tomu věnovat tolik času, prostě na tohle nemám.
To co jsem chtěl, tak funguje. Osadím to vše do rozvaděče a odzkouším na stole. V týdnu to namontuju oživím a hotovo. Až bude čas a budu se nudit, tak to můžu zase zkusit.

9

Re: Zobrazeni teplot na Userweb

OPTO 0 je sys[151], viz http://wiki.merenienergie.cz/index.php/ … Drobky_SDS

Takže pro čtení stavu je potřeba zavolat (vzor zde:) 192.168.1.250/get_sys[151]

Toto volání je potřeba na webové stránce opakovat např. co 1 sekundu, protože jinak se samo od sebe nestane.
To se řeší v javascriptu ideálné právě timerem.

V obslužné vlastní funkci, která se provede vždy po přijetí odpovědi na každý dotaz, se pak zpracuje výsledek, a podle něj se nastaví DOM parametry např. tlačítku nebo buňce v tabulce atd. (červená / zelená).

Je to fakt velice jednoduché, zde je hotový příklad:

<!DOCTYPE html>
<html>

<script>
 var t;
 var req = false;

 function showAlarm() 
 {
   // prvek td tabulky viz html kod dole
   document.getElementById("td1").style.color = "#ffffff";
   document.getElementById("td1").style.background = "#ff0000";
   document.getElementById("td1").innerHTML = " OPTO AKTIVNI ";
 }
 
 function showKlid() 
 {
   document.getElementById("td1").style.color = "#000000";
   document.getElementById("td1").style.background = "#00ff00";
   document.getElementById("td1").innerHTML = " OPTO KLID ";
 } 
 
 function reqComplete()
 {  
  // volano prubezne jak je postupne dotaz na sds zpracovavan
  if (req.readyState == 4)
  {
    // dotaz je hotovy
    //
    // jaky je http vysledek
    if (req.status == 200)
    {
      // ok je to 200, takze mame response
      //
      // opto je aktivni kdyz je v nule
      if (req.responseText == "0")
      {
        showAlarm();
      } else
      {
        showKlid();
      }
    }
  }
 }
 
 function sdsps()
 {
   // init - nachystat komponentu pro odeslani dotazu
   req = false;
   if (window.XMLHttpRequest)
   {
    req=new XMLHttpRequest();    
   }
   else if (window.ActiveXObject)
   {
    req=new ActiveXObject("Microsoft.XMLHTTP");   
   }   
   
   // start
   if (req) 
   {
    // posleme HTTP GET dotaz na SDS, budeme se ptat na stav sys[151] coz vime ze je OPTO0
    req.open("GET", "get_sys[151]?rand="+Math.random(), true);
    req.onreadystatechange = reqComplete;
    req.send(null);
   } else
   {
     alert("prohlizec neni kompatibilni s timto skriptem");
   }
   
   // dotazy na SDS opakovat co 1000 msec
   t = setTimeout("sdsps()", 1000);
 }
 
</script>

<body onLoad="sdsps()">

<div>
 SDS OPTO0<br>
 <table><tr height="32"><td>stav:</td><td id="td1"> CEKAM NA SDS </td></tr></table>
</div>

<br>

</body>
</html>

Důležité upozornění - toto vše se děje jen, pokud má někdo takovou webovou stránku otevřenou v prohlížeči.
Pokud to má mít i nějakou skutečnou funkci, např. něco i ovládat, pak se taková věc musí naprogramovat do SDS-C programu (který trvale běží na SDS) a web využít jen pro (v podstatě občasné) sledování stavu.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

10

Re: Zobrazeni teplot na Userweb

No jednoduché jak pro koho. Já jsem se za dopoledne zmohl jen na něco, co se tomu podobá jen vzdáleně. Raději to tu nebudu publikovat. Ale v pár věcech jsem se trefil. Když jsem to testoval s doplněnou IP adresou jen na PC nedělalo to nic. Zkusím to nahrát do SDS a uvidím. Stejně to ještě nebude konec mého utrpení. V každém případě děkuji, je fajn, že jste tam dal ty komentáře, bude se mi to líp studovat. Ozvu se jak to dopadlo, ale nevím jestli to bude ještě dnes. Manželce už se to moc nelíbí.Díky

Předpokládám, že když tento kod nahraju do čistého SDS jako Uweb, tak by to mělo fungovat, nebo se mýlím?
Bohužel to nedělá nic. Myslím, že je chyba na ř.36 //if (reqE2.responseText == "0")// že by tam nemělo být E2.
Další chybu to vyhazuje na ř. 66 //req.send(null);//. Po sepnuti OPTO1 by se měla změnit barva toho nápisu?

Naposledy upravil: samsonite44 (2020-12-13 17:25:56)

11

Re: Zobrazeni teplot na Userweb

Ano, to reqE2 je překlep, opravil jsem to - req.

Ano má se změnit barva (color) a pozadí (background) nápisu, i jeho obsah (innerHTML).

Z toho PC to nefunguje protože tomu brání váš prohlížeč (funkce "cross-site scripting"). Je potřeba buď použít prohlížeč který tomu nebrání (tahat data z jiné adresy než odkud je otevřena stránka), nebo nahrát stránku do SDS (jako userweb) a otevřít ji z adresy na které je i SDS (např. ta 192.168.1.250).

Doufám že se vám to podaří dotáhnout.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

12

Re: Zobrazeni teplot na Userweb

Podívám se na to jakmile se k tomu dostanu.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

13

Re: Zobrazeni teplot na Userweb

Vše je vyřešeno, tentokrát doopravdy. Funguje to tak jak má, včetně odesílání dat na portál. Děkuji za pomoc.