Stránka 1 z 1
Javascript - help
Napsal: 19 kvě 2023 20:13
od BigSandy
Zdar tu všici.
Pokračovaní.
viewtopic.php?f=61&t=226534Jsem 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í.
Re: Javascript - help
Napsal: 19 kvě 2023 20:26
od Clorky
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.
Re: Javascript - help
Napsal: 19 kvě 2023 20:39
od BigSandy
Děkují za rychlou reakci, ale jste přehledl to uplna lama.
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>
Re: Javascript - help
Napsal: 19 kvě 2023 21:29
od Clorky
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.
Re: Javascript - help
Napsal: 19 kvě 2023 23:06
od mmmartin
Trochu
: 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í.
Re: Javascript - help
Napsal: 20 kvě 2023 08:15
od BigSandy
Re: Javascript - help
Napsal: 20 kvě 2023 09:24
od Karrex
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;
}
Re: Javascript - help
Napsal: 20 kvě 2023 09:54
od BigSandy
Karrex - děkují, funguje
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
Re: Javascript - help
Napsal: 20 kvě 2023 10:40
od Clorky
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á.
Re: Javascript - help
Napsal: 20 kvě 2023 20:07
od BigSandy
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.pnghttps://forum.arduino.cc/t/arduino-modbus-issues/470715https://forum.arduino.cc/t/serial-port/648783https://forum.arduino.cc/t/epever-registers/1097048Třeba ten 2 odkaz.
https://forum.arduino.cc/t/serial-port/648783Kó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);
}
}
Re: Javascript - help
Napsal: 20 kvě 2023 20:32
od Clorky
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.