Javascript - help

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

BigSandy
Level 2.5
Level 2.5
Příspěvky: 252
Registrován: prosinec 06
Pohlaví: Nespecifikováno
Stav:
Offline

Javascript - help

Příspěvekod BigSandy » 19 kvě 2023 20:13

Zdar tu všici.
Pokračovaní.
viewtopic.php?f=61&t=226534
Jsem netušil, že když napišu vyřešene, tak to někdo zamkne :-(

Takže uplna lama.

Kód: Vybrat vše

<script>
      setInterval(function() {
        getData();
      }, 2000);
      function getData() {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
          if (this.readyState == 4 && this.status == 200) {
            document.getElementById("PanelyNapeti").innerHTML =
              this.responseText;
          }
        };
        xhttp.open("GET", "adcread", true);
        xhttp.send();
      }
 </script>


V ESP je toto.

Kód: Vybrat vše

server.on("/adcread", OdesliData);

void OdesliData()
{
 String PanelyNapeti_data = String(PanelyNapeti);
 server.send(200, "text/plane", PanelyNapeti_data);
}


Chapu jak to funguje.
Potřebují však odeslat nejmeně 15 načtených dat.
Jak v jazyce Wiring pro arduino ID, který je frameworkem jazyka C++, tak PHP a i v delphi je funkce delimiter.
Nebude lepši tyto data odeslat najednou?
String data = String(PanelyNapeti|PanelyProud|PanelyVykon|BaterieNapeti);
A pak to rozkouskovat.

Jaky je nej zpusob?
Děkují.

Reklama
Uživatelský avatar
Clorky
Moderátor / člen HW týmu
Master Level 8.5
Master Level 8.5
Příspěvky: 7032
Registrován: květen 10
Bydliště: Moravskoslezský kraj
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod Clorky » 19 kvě 2023 20:26

No myslím, že to můžeš poslat klidně najednou, ideálně možná jako mapu nebo jako list, záleží co s tím pak chceš dělat.

Pokud to chceš poslat najednou a pak rozkouskovat, tak si to ulož do mapy, kde klíče budou názvy (panely_napeti, panely_proud...) a hodnoty můžou být buď ta daná 1 hodnota, nebo si to mimo tu funkci OdesliData() hoď do listů (třeba těch 15 dat?) a do OdesliData si to pošli jako parametr tam, kde to chceš volat.

Předpokládám, že ty hodnoty PanelyNapeti, PanelyProud atp. se někde naplňují, možná v nějakém whilu nebo for loopu? A ty chceš historické data, tak tam kde tenhle loop běží si to appenduj do listu a vrať to (dáš si tam podmínku, že pokud má daný list délku 15, tak return list). Pak si udělej třeba metodu SpojData(list: panely_napeti_lst, list:panely_proud_lst ...) a v té si z těch všech listů udělej mapu.

BigSandy
Level 2.5
Level 2.5
Příspěvky: 252
Registrován: prosinec 06
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Javascript - help

Příspěvekod BigSandy » 19 kvě 2023 20:39

Děkují za rychlou reakci, ale jste přehledl to uplna lama. :D
Takto to vypisuje odeslane hodnoty a ty chci přepisovat.

Kód: Vybrat vše

<table class="hodnoty">
        <tr>
          <td>Panely Napětí: </td>
          </td><td></td><td></td><td></td><td></td><td></td><td><td><span id="PanelyNapeti">0</span></td>
        </tr>
        <tr>
          <td>Panely Proud: </td>
          </td><td></td><td></td><td></td><td></td><td></td><td><td><span id="PanelyProud">0</span></td>
        </tr>
        <tr>
          <td>Panely Výkon: </td>
          </td><td></td><td></td><td></td><td></td><td></td><td><td><span id="PanelyVykon">0</span></td>
        </tr>
      </table>

Uživatelský avatar
Clorky
Moderátor / člen HW týmu
Master Level 8.5
Master Level 8.5
Příspěvky: 7032
Registrován: květen 10
Bydliště: Moravskoslezský kraj
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod Clorky » 19 kvě 2023 21:29

Tomu rozumím, mě zajímá, odkud a jakým způsobem získáváš ty hodnoty předtím, než je odesíláš na frontend. Tzn. odkud jdou do metody OdesliData.

Proč máš mimochodem tolik <td> tagů v té tabulce? Navíc jeden z nich je neukončený, ale to asi tolik nevadí, protože pokud si tam chceš poslat několik dat, tak ty buňky tabulky stejně budeš muset plnit v nějakém cyklu.

Uživatelský avatar
mmmartin
Moderátor
Elite Level 10
Elite Level 10
Příspěvky: 9504
Registrován: srpen 04
Bydliště: Praha
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod mmmartin » 19 kvě 2023 23:06

Trochu :offtopic: : Pokud potřebuješ dál pokračovat v zamčeném tématu, stačí kliknutím na ikonku s vykřičníkem vpravo nahoře příspěvek nahlásit a jako důvod nahlášení vybrat Žádost o odemknutí.
ASUS Prime Z390-P / Hexa Core Intel core i5 Coffee Lake-S / Gigabyte GeForce GTX 650 Ti / FORTRON BlueStorm Bronze 80PLUS / W 11

BigSandy
Level 2.5
Level 2.5
Příspěvky: 252
Registrován: prosinec 06
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Javascript - help

Příspěvekod BigSandy » 20 kvě 2023 08:15

Tak první dotaz.
https://i.postimg.cc/9Mmyjq5B/EPsolar-XTRA4210-N.png
https://forum.arduino.cc/t/arduino-modbus-issues/470715
https://forum.arduino.cc/t/serial-port/648783
https://forum.arduino.cc/t/epever-registers/1097048

a druhý.
Nelibilo se mi že to vypisovane čislo bylo přilepene hned za :, tak jsem hledal řešení, jak to posunout. :-)
Obrázek

Něco takoveho jsem myslel.
https://developer.mozilla.org/en-US/doc ... ring/split
Pomuže někdo?

Uživatelský avatar
Karrex
Elite Level 10
Elite Level 10
Příspěvky: 9596
Registrován: listopad 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod Karrex » 20 kvě 2023 09:24

BigSandy píše: <td>Panely Napětí: </td>
</td><td></td><td></td><td></td><td></td><td></td><td><td><span id="PanelyNapeti">0</span></td>
....
Nelibilo se mi že to vypisovane čislo bylo přilepene hned za :, tak jsem hledal řešení, jak to posunout.

Třeba:

Kód: Vybrat vše

table.hodnoty > tbody > tr > td:nth-child(2) {
  position: relative;
  left: 50%;
  text-align: right;
}
Funguji už jen přes SZ. Sestava v profilu.
Watercooling Club EXOverclocker@HWBot league rank#1 Aprilia Shiver Club BMW ///M Club

BigSandy
Level 2.5
Level 2.5
Příspěvky: 252
Registrován: prosinec 06
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Javascript - help

Příspěvekod BigSandy » 20 kvě 2023 09:54

Karrex - děkují, funguje :thumbup:

Dodatečně přidáno po 21 minutách 45 vteřinách:
Co to stahovaní dat? Je to jedno, nebo některa varianta je lepší?
Jedna funkce setInterval a do ní 15 funkci function getData. (toto bych i možna zvlad sam)

Nebo přes ESP odeslat najednou všechna data.
String PanelyNapeti_data = String(PanelyNapeti|PanelyProud|PanelyVzkon); atd.
Na te strance bych měl v adcread mit 74,44|45,12|23,25
A pak je na te web strance v javascript rozporcovat
https://developer.mozilla.org/en-US/doc ... ring/split

Uživatelský avatar
Clorky
Moderátor / člen HW týmu
Master Level 8.5
Master Level 8.5
Příspěvky: 7032
Registrován: květen 10
Bydliště: Moravskoslezský kraj
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod Clorky » 20 kvě 2023 10:40

Jak říkám, tam kde se ti plní data - pošli úryvek kódu. Někde si zavoláš getData(), tu metodu chci vidět, chci vidět co to vrací.
Potom si to někde naparsuješ do mapy a tu si pošleš na front, obvykle se to posílá jako json. Nevím jak se to posílá přímo v tvém případě. Každopádně tak jak to píšu se to běžně dělá.

BigSandy
Level 2.5
Level 2.5
Příspěvky: 252
Registrován: prosinec 06
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Javascript - help

Příspěvekod BigSandy » 20 kvě 2023 20:07

Clorky píše:Jak říkám, tam kde se ti plní data - pošli úryvek kódu. Někde si zavoláš getData(), tu metodu chci vidět, chci vidět co to vrací.
Potom si to někde naparsuješ do mapy a tu si pošleš na front, obvykle se to posílá jako json. Nevím jak se to posílá přímo v tvém případě. Každopádně tak jak to píšu se to běžně dělá.


On je problem, že to běži na ESP8266, i ten web server.
Kde se to plní jsem tu už daval.
https://i.postimg.cc/9Mmyjq5B/EPsolar-XTRA4210-N.png
https://forum.arduino.cc/t/arduino-modbus-issues/470715
https://forum.arduino.cc/t/serial-port/648783
https://forum.arduino.cc/t/epever-registers/1097048

Třeba ten 2 odkaz.
https://forum.arduino.cc/t/serial-port/648783

Kód: Vybrat vše

void Dati ()
{
    uint8_t resultMain;
    resultMain = node.readInputRegisters(0x3300,19);
  if (resultMain == node.ku8MBSuccess)
  {
    Serial.println("------------");
    //Serial.print("Maximum input volt(PV) today: ");
    MaximumInputVoltPVToday = (node.getResponseBuffer(0x00)/100.0f);
    Serial.println(MaximumInputVoltPVToday);
    //-----------------------------------------------
    //Serial.print("Minimum input volt(PV) today: ");
    MinimumInputVoltPVToday = (node.getResponseBuffer(0x01)/100.0f);
    Serial.println(MinimumInputVoltPVToday);
    //---------------------------------------------
    //Serial.print("Maximum battery volt today: ");
    MaximumBatteryVoltToday = (node.getResponseBuffer(0x02)/100.0f);
    Serial.println(MaximumBatteryVoltToday);
    //-----------------------------------------------
    //Serial.print("Minimum battery volt today: ");
    MinimumBatteryVoltToday = (node.getResponseBuffer(0x03)/100.0f);
    Serial.println(MinimumBatteryVoltToday);
    //-----------------------------------------------
    //Serial.print("Consumed energy today: ");
    ConsumedEnergyToday = (node.getResponseBuffer(0x04)/100.0f);
    Serial.println(ConsumedEnergyToday);
    //-----------------------------------------------
   // Serial.print("Generated energy today: ");
    GeneratedEnergyToday = (node.getResponseBuffer(0x0C)/100.0f);
    Serial.println(GeneratedEnergyToday);
    //-----------------------------------------------
    //Serial.print("Total consumed: ");
    TotalConsumed = (node.getResponseBuffer(0x0A)/100.0f);
    Serial.println(TotalConsumed);
    //-----------------------------------------------
    //Serial.print("Total generated: ");
    TotalGenerated = (node.getResponseBuffer(0x12)/100.0f);
    Serial.println(TotalGenerated);
  }
}

Uživatelský avatar
Clorky
Moderátor / člen HW týmu
Master Level 8.5
Master Level 8.5
Příspěvky: 7032
Registrován: květen 10
Bydliště: Moravskoslezský kraj
Pohlaví: Muž
Stav:
Offline

Re: Javascript - help

Příspěvekod Clorky » 20 kvě 2023 20:32

Super. Takže tady v té metodě si vrať hodnoty.

Kód: Vybrat vše

MaximumInputVoltPVToday
MinimumInputVoltPVToday
MaximumBatteryVoltToday
MinimumBatteryVoltToday
ConsumedEnergyToday
GeneratedEnergyToday
TotalConsumed
TotalGenerated


Myslím, že by to mohlo fungovat nějak takhle. ArduinoJson.h knihovnu si možná budeš muset přidat/nainstalovat pro ten projekt (?). Názvy jednotlivých klíčů mapy si můžeš změnit, pokud to pro tebe bude pohodlnější.

Kód: Vybrat vše

#include <map>
#include <ArduinoJson.h>

String Dati()
{
    std::map<String, float> dataMap;
   
    uint8_t resultMain;
    resultMain = node.readInputRegisters(0x3300, 19);
   
    if (resultMain == node.ku8MBSuccess)
    {
        dataMap["MaximumInputVoltPVToday"] = node.getResponseBuffer(0x00) / 100.0f;
        dataMap["MinimumInputVoltPVToday"] = node.getResponseBuffer(0x01) / 100.0f;
        dataMap["MaximumBatteryVoltToday"] = node.getResponseBuffer(0x02) / 100.0f;
        dataMap["MinimumBatteryVoltToday"] = node.getResponseBuffer(0x03) / 100.0f;
        dataMap["ConsumedEnergyToday"] = node.getResponseBuffer(0x04) / 100.0f;
        dataMap["GeneratedEnergyToday"] = node.getResponseBuffer(0x0C) / 100.0f;
        dataMap["TotalConsumed"] = node.getResponseBuffer(0x0A) / 100.0f;
        dataMap["TotalGenerated"] = node.getResponseBuffer(0x12) / 100.0f;
    }
   
    DynamicJsonDocument jsonDoc(1024);
    JsonObject jsonObj = jsonDoc.to<JsonObject>();
    for (const auto& pair : dataMap)
    {
        jsonObj[pair.first] = pair.second;
    }
   
    String jsonString;
    serializeJson(jsonObj, jsonString);
   
    return jsonString;
}


Takhle potom bude vypadat kód, který posílá ty data na front. Tzn. tvoje metoda OdesliData().

Kód: Vybrat vše

void handleDataRequest()
{
    String jsonData = Dati();
    server.send(200, "application/json", jsonData);
}


Jak potom rozkouskovat json Javascriptem si najdeš bez problému. Tohle ti pošle mapu v tomhle tvaru:

Kód: Vybrat vše

{"MaximumInputVoltPVToday" : 123.456,
"MinimumInputvoltPVToday" : 456.123,
.
.
.}


V jiném místě se asi řeší, jak často jsou ty hodnoty ze senzorů aktualizovány.

Takhle bys měl ale bez problému poslat json s hodnotami těch senzorů na front.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti