/** * WEB client interface StromLog * Version 5.00 * 04.11.2022 P. Rebesky * author Creator P.Rebesky * Copyright (©): 2022-2024 by Peter Rebesky * This code can use in private cases only. Every business or companies using of this codes or codes parts is required an approval of us (me) * Every private using can exchange some parts of code or modify some code-lines. This code is allowed change for private use only. * This software is basicly owned by Peter Rebesky and any comercial using is forbidden without approval of us (me). **/ #ifndef WEB_CLIENT_H_ #define WEB_CLIENT_H_ //#include "strings.h" #include "global.h" #include "configDTZ.h" #ifdef SML_DIN #include "decodeMeterSML.h" #endif #ifdef ISKRA_MT174 #include "decodeMeterMT174.h" #endif #ifdef VDE_DIN #include "decodeMeterDIN.h" #endif #ifdef ZE311_DR #include "decodeMeterZE311.h" #endif #ifdef LG_E350 #include "decodeMeterE350.h" #endif extern configDTZ cDTZ; extern decodeMeter dMETER; extern String sendConsumptionValue(); extern String getValuesAsJSON(); extern String prepareSendValuesAsJSON(); extern String getFilesFromServer(IPAddress ip,String actVersion, String updateServer); extern String getTime2String(int hour,int minute,int second); extern String getDate2String(int year,int month,int day); extern bool syncron_NTP_Time(); extern void getTime2Value(); //*** set build type **************************// String Version = "5.01"; String LoggerVersion = "Build "+dMETER.getProtocolType()+Version+" 20.11.2022"; //*** end ***********************************// //*** declarations *** String prepareRefreshJSON(); String getValuesAsJSON(); String sendConsumptionValue(); String prepareSendValuesAsJSON(); String showSetup(); //*** declaration end ***// String webConsumption(){ String ret = HTTP_ANSWERJSON; ret += sendConsumptionValue(); return ret; } //*** end *** String webCurrentData(){ String ret = HTTP_ANSWERJSON; ret += getValuesAsJSON(); return ret; } //*** end *** String webAllData(){ String ret = HTTP_ANSWERJSON; ret += prepareSendValuesAsJSON(); return ret; } //*** end *** String webSave(String PostValues){ cDTZ.savePostValues(PostValues); String ret = HTTP_ANSWER; ret += HTTP_HEAD_DTZ; ret += ""; ret += cDTZ.getNameDTZ(); ret += ""; ret += HTTP_BODYSTYLE_DTZ; ret += ""; ret += HTTP_DIV_FIELD; ret += "

Ihre Eingaben wurden gespeichert.

"; ret += "

"; ret += HTTP_TEXT_END; return ret; } //*** end *** String webSetup(){ String ret = HTTP_ANSWER; ret += HTTP_HEAD_DTZ; ret += ""; ret += cDTZ.getNameDTZ(); ret += ""; ret += HTTP_BODYSTYLE_DTZ; ret += ""; ret += HTTP_DIV_FIELD; ret += "

Grundeinstellungen

"; ret += "
"; ret += "


"; ret += "


"; ret += "


"; ret += "


"; ret += "


"; #ifdef VDE_DIN ret += "


"; ret += "


"; #endif ret += "


"; ret += "
Show Protokoll an LED:"; else ret += ">"; ret += "

"; ret += "

"; ret += "
StromLog-Version: "; ret += LoggerVersion; ret += "
Check for update firmware"; ret += "

Hilfe & Impressum

"; ret += HTTP_TEXT_END; return ret; } //*** end *** String webShowSetup(){ String ret = HTTP_ANSWER; ret += HTTP_BODYSTYLE_DTZ; ret += ""; ret += HTTP_DIV_FIELD; ret += showSetup(); //debug ret += HTTP_TEXT_END; return ret; } //*** end *** String webFavicon(){ String ret = HTTP_ANSWER; ret += "none"; return ret; } //*** end *** String webSearchStromLog(String payload) { String ret = HTTP_ANSWER; int argBegin = payload.indexOf("?"); if (argBegin != -1){ int valueEnd = payload.indexOf("HTTP"); int idEx = payload.substring(argBegin+1,valueEnd-1).toInt(); if(idEx == cDTZ.getUserID() || cDTZ.getUserID() == 0){ ret += "{\"DTZLOGGER\":\"" + LoggerVersion + "\"}"; } } return ret; } //*** end *** String webMain(String payload){ // Prepare the response main screen float DispValue; String ret = HTTP_ANSWER; ret += HTTP_HEAD_DTZ_REFRESH; ret += ""; ret += cDTZ.getNameDTZ(); ret += ""; ret += HTTP_BODYSTYLE_DTZ; ret += ""; ret += HTTP_DIV_FIELD; ret += "

"; ret+=cDTZ.getNameDTZ(); ret+="

"; ret += getDate2String(_act_date_time[_YEAR],_act_date_time[_MONTH],_act_date_time[_DAY]); ret += " - "; ret += getTime2String(_act_date_time[_HOUR],_act_date_time[_MINUTE],_act_date_time[_SECOND]); ret+=""; ret += "🔄

"; ret += payload; ret += "
"; ret += "1.8.0 Bezug Summe:

"; if(dMETER.MeterKWH[_FROMGRID_1]>0){ ret += "1.8.1 Bezug Tarif 1:

"; } if(dMETER.MeterKWH[_FROMGRID_2]>0){ ret += "1.8.2 Bezug Tarif 2:

"; } if(dMETER.MeterKWH[_FEEDIN]>0){ ret += "2.8.0 Einspeisung:

"; } ret += "
"; if(dMETER.Electric_data[_CONSUMPTION]!=0){ ret += "Summen-Leistung:

"; } if(dMETER.Electric_data[_P_L1]!=0 || dMETER.Electric_data[_P_L2]!=0 || dMETER.Electric_data[_P_L3]!=0){ ret += "Leistung L1:

"; ret += "Leistung L2:

"; ret += "Leistung L3:

"; } if(dMETER.Electric_data[_I_L1]>0 || dMETER.Electric_data[_I_L2]>0 || dMETER.Electric_data[_I_L3]>0){ ret += "Strom L1:

"; ret += "Strom L2:

"; ret += "Strom L3:

"; } if(dMETER.Electric_data[_U_L1]>0 || dMETER.Electric_data[_U_L2]>0 || dMETER.Electric_data[_U_L3]>0){ ret += "Spannung L1:

"; ret += "Spannung L2:

"; ret += "Spannung L3:

"; } if(dMETER.Electric_data[_FREQ]>0){ ret += "Netzfrequenz:

"; } ret += "

StromLog & Zähler

"; ret += "

Stromlog-IP:

"; ret += "(Zähler) Hersteller-ID:

"; ret += "(Zähler) Server-ID:

"; ret += "Received protocols:

"; #ifdef SML_DIN ret += "Protocol errors:

"; #endif #ifdef VDE_DIN if(dMETER.MeterTime.length()>5){ ret += "(Zähler) Datum Zeit:

"; } #endif if(_sendingOK == false)ret += "🔴"; // show a red bubble when StromLog not connect on server at the first time ret += "Saved protocols:"; ret += "

"; ret += "

"; ret += HTTP_SETUP_BUTTON; ret += "

Hilfe & Impressum

"; ret += HTTP_TEXT_END; return ret; } //*** end *** String webMemory(){ String ret = HTTP_ANSWER; ret += "Free space: "; ret += cDTZ.FREESPACE; ret += "
"; if(cDTZ.saveCounter > 0){ for(int i=1;i<=cDTZ.saveCounter;i++){ ret += cDTZ.readSavedValues(i); ret += "
"; } } else ret += "No saved data.
"; ret += HTTP_TEXT_END; return ret; } //*** end *** String webSendProtocols(){ dMETER.SendProtocols = 10; String ret = HTTP_ANSWER; ret += "10 RAW Protocols will be send to server now.
"; ret += HTTP_TEXT_END; return ret; } //*** end *** String webSetTime(){ String ret = HTTP_ANSWER; ret += HTTP_BODYSTYLE_DTZ; ret += ""; ret += HTTP_DIV_FIELD; ret += "

Die Uhr wird jetzt neu synchronisiert.

"; ret += "

Zeit:

"; ret += "Unix-Time: "; ret += _timestamp; ret +="
"; if (syncron_NTP_Time() == true){ getTime2Value(); ret += "Neue Zeit:

"; ret += "Unix-Time: "; ret += _timestamp; ret +="
"; } else { ret += "NTP Serverfehler! Aktuallisierung nicht erfolgt.
Bitte eine Wartezeit von 2 Minuten,
bis zur wiederholten, manuellen Aktuallisierung einhalten.
"; } ret += "


"; ret += HTTP_TEXT_END; return ret; } //**** update firmware part info to user interface *********// String getUpdateFiles(IPAddress userIP){ String ret=HTTP_ANSWER; ret += "Your StromLog versions number: "+dMETER.getProtocolType()+Version+"
"; ret += "Check for new firmware now.
"; ret += getFilesFromServer(userIP,dMETER.getProtocolType()+Version,cDTZ.getTargetServer()); ret += HTTP_TEXT_END; return ret; } String prepareUpdate(String line){ String ret = HTTP_ANSWER; int valueBegin = line.indexOf("?"); if(valueBegin > 0){ int valueEnd = line.indexOf("HTTP"); String argumentValue = line.substring(valueBegin+1,valueEnd-1); ret += "Update will be start now.
"; ret += "Update-file: "+argumentValue+"
"; ret += "Don't turn off power during update!

"; ret += "After update, the reconnection only via IP, without arguments behind it!

"; ret += "Click here for reconnect after update
"; } else { ret += "Error: Missing name of update file!
"; ret += "Update canceled.
"; line =""; } ret += HTTP_TEXT_END; return ret; } String getRefreshJSON(){ String ret = HTTP_ANSWERJSON; ret += prepareRefreshJSON(); return ret; } //***** get return json for refresh display on browser or *****// String prepareRefreshJSON(){ String json = "{\"time\":\""; json+=getTime2String(_act_date_time[_HOUR],_act_date_time[_MINUTE],_act_date_time[_SECOND]); json+="\","; json += "\"vL1\":"; json+=dMETER.Electric_data[_U_L1]; json+=","; json += "\"vL2\":"; json+=dMETER.Electric_data[_U_L2]; json+=","; json += "\"vL3\":"; json+=dMETER.Electric_data[_U_L3]; json+=","; json += "\"cL1\":"; json+=dMETER.Electric_data[_I_L1]; json+=","; json += "\"cL2\":"; json+=dMETER.Electric_data[_I_L2]; json+=","; json += "\"cL3\":"; json+=dMETER.Electric_data[_I_L3]; json+=","; json += "\"pL1\":"; json+=dMETER.Electric_data[_P_L1]; json+=","; json += "\"pL2\":"; json+=dMETER.Electric_data[_P_L2]; json+=","; json += "\"pL3\":"; json+=dMETER.Electric_data[_P_L3]; json+=","; json += "\"frq\":"; json+=dMETER.Electric_data[_FREQ]; json+=","; json += "\"psum\":"; json+=dMETER.Electric_data[_CONSUMPTION]; json+="}"; return json; } //*********** build an JSON code of values and return it *****************/ String getValuesAsJSON(){ String json = "{\"timestamp\":"; json += _timestamp; json += ",\"meterData\":"; json += "{\"consumption\":{\"value\":"; json += dMETER.Electric_data[_CONSUMPTION]; json += ",\"unit\":\"W\"},"; json += "\"FromGridSum\":{\"value\":"; json+= dMETER.MeterKWH[_FROMGRID_0]; json += ",\"unit\":\"dWh\"},"; json += "\"FromGridA\":{\"value\":"; json+= dMETER.MeterKWH[_FROMGRID_1]; json += ",\"unit\":\"dWh\"},"; json += "\"FromGridB\":{\"value\":"; json+= dMETER.MeterKWH[_FROMGRID_2]; json += ",\"unit\":\"dWh\"},"; json += "\"FeedIn\":{\"value\":"; json+= dMETER.MeterKWH[_FEEDIN]; json += ",\"unit\":\"dWh\"}"; json += "},\"electricsData\":{"; json += "\"voltageL1\":{\"value\":"; json+= dMETER.Electric_data[_U_L1]; json += ",\"unit\":\"dV\"},"; json += "\"voltageL2\":{\"value\":"; json+= dMETER.Electric_data[_U_L2]; json += ",\"unit\":\"dV\"},"; json += "\"voltageL3\":{\"value\":"; json+= dMETER.Electric_data[_U_L3]; json += ",\"unit\":\"dV\"},"; json += "\"currentL1\":{\"value\":"; json+= dMETER.Electric_data[_I_L1]; json += ",\"unit\":\"cI\"},"; json += "\"currentL2\":{\"value\":"; json+= dMETER.Electric_data[_I_L2]; json += ",\"unit\":\"cI\"},"; json += "\"currentL3\":{\"value\":"; json+= dMETER.Electric_data[_I_L3]; json += ",\"unit\":\"cI\"},"; json += "\"powerL1\":{\"value\":"; json+= dMETER.Electric_data[_P_L1]; json += ",\"unit\":\"W\"},"; json += "\"powerL2\":{\"value\":"; json+= dMETER.Electric_data[_P_L1]; json += ",\"unit\":\"W\"},"; json += "\"powerL3\":{\"value\":"; json+= dMETER.Electric_data[_P_L1]; json += ",\"unit\":\"W\"},"; json += "\"freq\":{\"value\":"; json+= dMETER.Electric_data[_FREQ]; json += ",\"unit\":\"dHz\"}"; json += "}}"; return json; } //*********** send consumption only **************************************/ String sendConsumptionValue(){ String json = "{\"consumption\":{\"value\":"; json += dMETER.Electric_data[_CONSUMPTION]; json += ",\"unit\":\"W\"}}"; return json; } //*********** prepare values for sending as JSON *************************/ String prepareSendValuesAsJSON(){ String Data = "{\"userid\":"; Data += cDTZ.getUserID(); Data += ",\"meter\":{"; Data += "\"localip\":\""+ WiFi.localIP().toString()+"\","; Data += "\"metername\":\""+cDTZ.getNameDTZ()+"\","; Data += "\"manufracturer\":\""+dMETER.MeterType+"\","; Data += "\"meterid\":\""; Data += dMETER.getMeterID(); Data += "\"},\"currentData\":"; Data += getValuesAsJSON(); Data += "}"; return Data; } //*********** show intern setup data for support *************************/ String showSetup(){ String ret = "

StromLog Einstellungen


"; ret += "

User: -"; ret += cDTZ.getUser(); ret +="-
"; ret += "PW: -"; ret += cDTZ.getPassw(); ret +="-
"; ret += "UserID: -"; ret += cDTZ.getUserID(); ret +="-
"; ret += "URL: -"; ret += cDTZ.getTargetURL(); ret +="-
"; // ret += "URLclean: -"; ret += cDTZ.getTargetURLclean(); ret +="-
"; ret += "Update-Server: -"; ret += cDTZ.getTargetServer(); ret+="-
"; ret += "HTTPCode: -"; ret +=_httpMarker; ret +="-
"; ret += "AdjustSec: -"; ret +=_secAdjust; ret +="-

"; return ret; } //*** end *** #endif //*** WEB_CLIENT_H_