mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-09 14:11:39 +02:00
Redesign, Bugfix, RestApi root size
This commit is contained in:
parent
6188731f7f
commit
2780b9ff33
6 changed files with 176 additions and 114 deletions
|
@ -302,6 +302,7 @@ typedef struct {
|
||||||
// Advanced
|
// Advanced
|
||||||
int16_t setPoint;
|
int16_t setPoint;
|
||||||
uint8_t refresh;
|
uint8_t refresh;
|
||||||
|
int32_t power;
|
||||||
uint8_t powerTolerance;
|
uint8_t powerTolerance;
|
||||||
uint16_t powerMax;
|
uint16_t powerMax;
|
||||||
//
|
//
|
||||||
|
@ -740,6 +741,7 @@ class settings {
|
||||||
mCfg.plugin.zeroExport.groups[group].pm_P3 = 0;
|
mCfg.plugin.zeroExport.groups[group].pm_P3 = 0;
|
||||||
|
|
||||||
mCfg.plugin.zeroExport.groups[group].battSwitch = false;
|
mCfg.plugin.zeroExport.groups[group].battSwitch = false;
|
||||||
|
mCfg.plugin.zeroExport.groups[group].power = 0;
|
||||||
}
|
}
|
||||||
// snprintf(mCfg.plugin.zeroExport.monitor_url, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT);
|
// snprintf(mCfg.plugin.zeroExport.monitor_url, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT);
|
||||||
// snprintf(mCfg.plugin.zeroExport.tibber_pw, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT);
|
// snprintf(mCfg.plugin.zeroExport.tibber_pw, ZEXPORT_ADDR_LEN, "%s", DEF_ZEXPORT);
|
||||||
|
|
|
@ -258,48 +258,6 @@ class powermeter {
|
||||||
* @param logObj
|
* @param logObj
|
||||||
* @param group
|
* @param group
|
||||||
* @returns true/false
|
* @returns true/false
|
||||||
*
|
|
||||||
* Vorlage:
|
|
||||||
* http://IP/cm?cmnd=Status0
|
|
||||||
* {
|
|
||||||
* "Status":{
|
|
||||||
* "Module":1,
|
|
||||||
* "DeviceName":"Tasmota",
|
|
||||||
* "FriendlyName":["Tasmota"],
|
|
||||||
* "Topic":"Tasmota",
|
|
||||||
* "ButtonTopic":"0",
|
|
||||||
* "Power":0,
|
|
||||||
* "PowerOnState":3,
|
|
||||||
* "LedState":1,
|
|
||||||
* "LedMask":"FFFF",
|
|
||||||
* "SaveData":1,
|
|
||||||
* "SaveState":1,
|
|
||||||
* "SwitchTopic":"0",
|
|
||||||
* "SwitchMode":[0,0,0,0,0,0,0,0],
|
|
||||||
* "ButtonRetain":0,
|
|
||||||
* "SwitchRetain":0,
|
|
||||||
* "SensorRetain":0,
|
|
||||||
* "PowerRetain":0,
|
|
||||||
* "InfoRetain":0,
|
|
||||||
* "StateRetain":0},
|
|
||||||
* "StatusPRM":{"Baudrate":9600,"SerialConfig":"8N1","GroupTopic":"tasmotas","OtaUrl":"http://ota.tasmota.com/tasmota/release/tasmota.bin.gz","RestartReason":"Software/System restart","Uptime":"202T01:24:51","StartupUTC":"2023-08-13T15:21:13","Sleep":50,"CfgHolder":4617,"BootCount":27,"BCResetTime":"2023-02-04T16:45:38","SaveCount":150,"SaveAddress":"F5000"},
|
|
||||||
* "StatusFWR":{"Version":"11.1.0(tasmota)","BuildDateTime":"2022-05-05T03:23:22","Boot":31,"Core":"2_7_4_9","SDK":"2.2.2-dev(38a443e)","CpuFrequency":80,"Hardware":"ESP8266EX","CR":"378/699"},
|
|
||||||
* "StatusLOG":{"SerialLog":0,"WebLog":2,"MqttLog":0,"SysLog":0,"LogHost":"","LogPort":514,"SSId":["Odyssee2001",""],"TelePeriod":300,"Resolution":"558180C0","SetOption":["00008009","2805C80001000600003C5A0A190000000000","00000080","00006000","00004000"]},
|
|
||||||
* "StatusMEM":{"ProgramSize":658,"Free":344,"Heap":17,"ProgramFlashSize":1024,"FlashSize":1024,"FlashChipId":"14325E","FlashFrequency":40,"FlashMode":3,"Features":["00000809","87DAC787","043E8001","000000CF","010013C0","C000F989","00004004","00001000","04000020"],"Drivers":"1,2,3,4,5,6,7,8,9,10,12,16,18,19,20,21,22,24,26,27,29,30,35,37,45,56,62","Sensors":"1,2,3,4,5,6,53"},
|
|
||||||
* "StatusNET":{"Hostname":"Tasmota","IPAddress":"192.168.100.81","Gateway":"192.168.100.1","Subnetmask":"255.255.255.0","DNSServer1":"192.168.100.1","DNSServer2":"0.0.0.0","Mac":"4C:11:AE:11:F8:50","Webserver":2,"HTTP_API":1,"WifiConfig":4,"WifiPower":17.0},
|
|
||||||
* "StatusMQT":{"MqttHost":"192.168.100.80","MqttPort":1883,"MqttClientMask":"Tasmota","MqttClient":"Tasmota","MqttUser":"mqttuser","MqttCount":156,"MAX_PACKET_SIZE":1200,"KEEPALIVE":30,"SOCKET_TIMEOUT":4},
|
|
||||||
* "StatusTIM":{"UTC":"2024-03-02T16:46:04","Local":"2024-03-02T17:46:04","StartDST":"2024-03-31T02:00:00","EndDST":"2024-10-27T03:00:00","Timezone":"+01:00","Sunrise":"07:29","Sunset":"18:35"},
|
|
||||||
* "StatusSNS":{
|
|
||||||
* "Time":"2024-03-02T17:46:04",
|
|
||||||
* "PV":{
|
|
||||||
* "Bezug":0.364,
|
|
||||||
* "Einspeisung":3559.439,
|
|
||||||
* "Leistung":-14
|
|
||||||
* }
|
|
||||||
* },
|
|
||||||
* "StatusSTS":{"Time":"2024-03-02T17:46:04","Uptime":"202T01:24:51","UptimeSec":17457891,"Heap":16,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":156,"POWER":"OFF","Wifi":{"AP":1,"SSId":"Odyssee2001","BSSId":"34:31:C4:22:92:74","Channel":6,"Mode":"11n","RSSI":100,"Signal":-50,"LinkCount":15,"Downtime":"0T00:08:22"}
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*/
|
*/
|
||||||
PowermeterBuffer_t getPowermeterWattsTasmota(JsonObject logObj, uint8_t group) {
|
PowermeterBuffer_t getPowermeterWattsTasmota(JsonObject logObj, uint8_t group) {
|
||||||
PowermeterBuffer_t result;
|
PowermeterBuffer_t result;
|
||||||
|
@ -526,10 +484,7 @@ class powermeter {
|
||||||
* @param group
|
* @param group
|
||||||
* @returns true/false
|
* @returns true/false
|
||||||
* @TODO: Username & Passwort wird mittels base64 verschlüsselt. Dies wird für die Authentizierung benötigt. Wichtig diese im WebUI unkenntlich zu machen und base64 im eeprom zu speichern, statt klartext.
|
* @TODO: Username & Passwort wird mittels base64 verschlüsselt. Dies wird für die Authentizierung benötigt. Wichtig diese im WebUI unkenntlich zu machen und base64 im eeprom zu speichern, statt klartext.
|
||||||
* @TODO: Abfrage Interval einbauen. Info: Datei-Size kann auch mal 0-bytes sein!
|
* @TODO: Abfrage Interval einbauen. Info: Datei-Size kann auch mal 0-bytes sein?
|
||||||
* Quelle: https://cms.shrdzm.com
|
|
||||||
* Abfrage: http://IP/getLastData?user=XXXXXX&password=YYYYYY
|
|
||||||
* Ergebnis: {"1.8.0":"21561001","2.8.0":"44477","3.8.1":"64037","4.8.1":"6021512","1.7.0":"277","2.7.0":"0","3.7.0":"0","4.7.0":"184","1.128.0":"0","16.7.0":"277","uptime":"0000:07:35:38"}
|
|
||||||
*/
|
*/
|
||||||
PowermeterBuffer_t getPowermeterWattsShrdzm(JsonObject logObj, uint8_t group) {
|
PowermeterBuffer_t getPowermeterWattsShrdzm(JsonObject logObj, uint8_t group) {
|
||||||
PowermeterBuffer_t result;
|
PowermeterBuffer_t result;
|
||||||
|
@ -588,38 +543,4 @@ class powermeter {
|
||||||
short mPowermeterBufferPos[ZEROEXPORT_MAX_GROUPS] = {0};
|
short mPowermeterBufferPos[ZEROEXPORT_MAX_GROUPS] = {0};
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Vorlagen für Powermeter-Analyse
|
|
||||||
|
|
||||||
/** Shelly Pro 3EM
|
|
||||||
* Stand: 02.04.2024
|
|
||||||
* Analysiert: tictrick
|
|
||||||
* /rpc/EM.GetStatus?id=0
|
|
||||||
* {"id":0,"a_current":1.275,"a_voltage":228.8,"a_act_power":243.2,"a_aprt_power":291.6,"a_pf":0.86,"a_freq":50.0,"b_current":0.335,"b_voltage":228.2,"b_act_power":24.5,"b_aprt_power":76.6,"b_pf":0.59,"b_freq":50.0,"c_current":0.338,"c_voltage":227.6,"c_act_power":34.9,"c_aprt_power":76.9,"c_pf":0.65,"c_freq":50.0,"n_current":null,"total_current":1.949,"total_act_power":302.554,"total_aprt_power":445.042, "user_calibrated_phase":[]}
|
|
||||||
* /rpc/Shelly.GetStatus
|
|
||||||
* {"ble":{},"cloud":{"connected":true},"em:0":{"id":0,"a_current":1.269,"a_voltage":228.5,"a_act_power":239.8,"a_aprt_power":289.7,"a_pf":0.86,"a_freq":50.0,"b_current":0.348,"b_voltage":227.5,"b_act_power":24.7,"b_aprt_power":79.0,"b_pf":0.58,"b_freq":50.0,"c_current":0.378,"c_voltage":228.5,"c_act_power":42.3,"c_aprt_power":86.3,"c_pf":0.66,"c_freq":50.0,"n_current":null,"total_current":1.995,"total_act_power":306.811,"total_aprt_power":455.018, "user_calibrated_phase":[]},"emdata:0":{"id":0,"a_total_act_energy":648103.86,"a_total_act_ret_energy":0.00,"b_total_act_energy":142793.47,"b_total_act_ret_energy":171396.02,"c_total_act_energy":493778.01,"c_total_act_ret_energy":0.00,"total_act":1284675.34, "total_act_ret":171396.02},"eth":{"ip":null},"modbus":{},"mqtt":{"connected":false},"script:1":{"id":1,"running":true,"mem_used":1302,"mem_peak":3094,"mem_free":23898},"sys":{"mac":"3CE90E6EBE5C","restart_required":false,"time":"18:09","unixtime":1712074162,"uptime":3180551,"ram_size":240004,"ram_free":96584,"fs_size":524288,"fs_free":176128,"cfg_rev":23,"kvs_rev":9104,"schedule_rev":0,"webhook_rev":0,"available_updates":{},"reset_reason":3},"temperature:0":{"id": 0,"tC":46.2, "tF":115.1},"wifi":{"sta_ip":"192.168.0.69","status":"got ip","ssid":"Riker","rssi":-70},"ws":{"connected":false}}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Shelly 1pm
|
|
||||||
Der Shelly 1pm verfügt über keine eigene Spannungsmessung sondern geht von 220V * Korrekturfaktor aus. Dadurch wird die Leistungsmessung verfälscht und der Shelly ist ungeeignet.
|
|
||||||
|
|
||||||
|
|
||||||
http://192.168.xxx.xxx/status
|
|
||||||
Shelly 3em (oder em3) :
|
|
||||||
ok
|
|
||||||
{"wifi_sta":{"connected":true,"ssid":"Odyssee2001","ip":"192.168.100.85","rssi":-23},"cloud":{"enabled":false,"connected":false},"mqtt":{"connected":true},"time":"17:13","unixtime":1709223219,"serial":27384,"has_update":false,"mac":"3494547B94EE","cfg_changed_cnt":1,"actions_stats":{"skipped":0},"relays":[{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"overpower":false,"is_valid":true,"source":"input"}],"emeters":[{"power":51.08,"pf":0.27,"current":0.78,"voltage":234.90,"is_valid":true,"total":1686297.2,"total_returned":428958.4},{"power":155.02,"pf":0.98,"current":0.66,"voltage":235.57,"is_valid":true,"total":878905.6,"total_returned":4.1},{"power":6.75,"pf":0.26,"current":0.11,"voltage":234.70,"is_valid":true,"total":206151.1,"total_returned":0.0}],"total_power":212.85,"emeter_n":{"current":0.00,"ixsum":1.29,"mismatch":false,"is_valid":false},"fs_mounted":true,"v_data":1,"ct_calst":0,"update":{"status":"idle","has_update":false,"new_version":"20230913-114244/v1.14.0-gcb84623","old_version":"20230913-114244/v1.14.0-gcb84623","beta_version":"20231107-165007/v1.14.1-rc1-g0617c15"},"ram_total":49920,"ram_free":30192,"fs_size":233681,"fs_free":154616,"uptime":13728721}
|
|
||||||
|
|
||||||
|
|
||||||
Shelly plus 2pm :
|
|
||||||
ok
|
|
||||||
{"ble":{},"cloud":{"connected":false},"input:0":{"id":0,"state":false},"input:1":{"id":1,"state":false},"mqtt":{"connected":true},"switch:0":{"id":0, "source":"MQTT", "output":false, "apower":0.0, "voltage":237.0, "freq":50.0, "current":0.000, "pf":0.00, "aenergy":{"total":62758.285,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223337},"temperature":{"tC":35.5, "tF":96.0}},"switch:1":{"id":1, "source":"MQTT", "output":false, "apower":0.0, "voltage":237.1, "freq":50.0, "current":0.000, "pf":0.00, "aenergy":{"total":61917.211,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223337},"temperature":{"tC":35.5, "tF":96.0}},"sys":{"mac":"B0B21C10A478","restart_required":false,"time":"17:15","unixtime":1709223338,"uptime":8746115,"ram_size":245016,"ram_free":141004,"fs_size":458752,"fs_free":135168,"cfg_rev":7,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.2.2"}}},"wifi":{"sta_ip":"192.168.100.87","status":"got ip","ssid":"Odyssee2001","rssi":-62},"ws":{"connected":false}}
|
|
||||||
|
|
||||||
http://192.168.xxx.xxx/rpc/Shelly.GetStatus
|
|
||||||
Shelly plus 1pm :
|
|
||||||
nok keine negativen Leistungswerte
|
|
||||||
{"ble":{},"cloud":{"connected":false},"input:0":{"id":0,"state":false},"mqtt":{"connected":true},"switch:0":{"id":0, "source":"MQTT", "output":false, "apower":0.0, "voltage":235.9, "current":0.000, "aenergy":{"total":20393.619,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223441},"temperature":{"tC":34.6, "tF":94.3}},"sys":{"mac":"FCB467A66E3C","restart_required":false,"time":"17:17","unixtime":1709223443,"uptime":8644483,"ram_size":246256,"ram_free":143544,"fs_size":458752,"fs_free":147456,"cfg_rev":9,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.2.2"}}},"wifi":{"sta_ip":"192.168.100.88","status":"got ip","ssid":"Odyssee2001","rssi":-42},"ws":{"connected":false}}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /*__POWERMETER_H__*/
|
#endif /*__POWERMETER_H__*/
|
||||||
|
|
124
src/plugins/zeroExport/powermeter.txt
Normal file
124
src/plugins/zeroExport/powermeter.txt
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// 2024 Ahoy, https://ahoydtu.de
|
||||||
|
// Creative Commons - https://creativecommons.org/licenses/by-nc-sa/4.0/deed
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Shelly
|
||||||
|
======
|
||||||
|
|
||||||
|
Shelly 3EM
|
||||||
|
----------
|
||||||
|
|
||||||
|
Shelly pro 3EM
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Stand: 02.04.2024
|
||||||
|
|
||||||
|
Abfrage:
|
||||||
|
/rpc/EM.GetStatus?id=0
|
||||||
|
|
||||||
|
Ergebnis:
|
||||||
|
{"id":0,"a_current":1.275,"a_voltage":228.8,"a_act_power":243.2,"a_aprt_power":291.6,"a_pf":0.86,"a_freq":50.0,"b_current":0.335,"b_voltage":228.2,"b_act_power":24.5,"b_aprt_power":76.6,"b_pf":0.59,"b_freq":50.0,"c_current":0.338,"c_voltage":227.6,"c_act_power":34.9,"c_aprt_power":76.9,"c_pf":0.65,"c_freq":50.0,"n_current":null,"total_current":1.949,"total_act_power":302.554,"total_aprt_power":445.042, "user_calibrated_phase":[]}
|
||||||
|
|
||||||
|
Abfrage:
|
||||||
|
/rpc/Shelly.GetStatus
|
||||||
|
|
||||||
|
Ergebnis:
|
||||||
|
{"ble":{},"cloud":{"connected":true},"em:0":{"id":0,"a_current":1.269,"a_voltage":228.5,"a_act_power":239.8,"a_aprt_power":289.7,"a_pf":0.86,"a_freq":50.0,"b_current":0.348,"b_voltage":227.5,"b_act_power":24.7,"b_aprt_power":79.0,"b_pf":0.58,"b_freq":50.0,"c_current":0.378,"c_voltage":228.5,"c_act_power":42.3,"c_aprt_power":86.3,"c_pf":0.66,"c_freq":50.0,"n_current":null,"total_current":1.995,"total_act_power":306.811,"total_aprt_power":455.018, "user_calibrated_phase":[]},"emdata:0":{"id":0,"a_total_act_energy":648103.86,"a_total_act_ret_energy":0.00,"b_total_act_energy":142793.47,"b_total_act_ret_energy":171396.02,"c_total_act_energy":493778.01,"c_total_act_ret_energy":0.00,"total_act":1284675.34, "total_act_ret":171396.02},"eth":{"ip":null},"modbus":{},"mqtt":{"connected":false},"script:1":{"id":1,"running":true,"mem_used":1302,"mem_peak":3094,"mem_free":23898},"sys":{"mac":"3CE90E6EBE5C","restart_required":false,"time":"18:09","unixtime":1712074162,"uptime":3180551,"ram_size":240004,"ram_free":96584,"fs_size":524288,"fs_free":176128,"cfg_rev":23,"kvs_rev":9104,"schedule_rev":0,"webhook_rev":0,"available_updates":{},"reset_reason":3},"temperature:0":{"id": 0,"tC":46.2, "tF":115.1},"wifi":{"sta_ip":"192.168.0.69","status":"got ip","ssid":"Riker","rssi":-70},"ws":{"connected":false}}
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Tasmota
|
||||||
|
=======
|
||||||
|
|
||||||
|
* Vorlage:
|
||||||
|
* http://IP/cm?cmnd=Status0
|
||||||
|
* {
|
||||||
|
* "Status":{
|
||||||
|
* "Module":1,
|
||||||
|
* "DeviceName":"Tasmota",
|
||||||
|
* "FriendlyName":["Tasmota"],
|
||||||
|
* "Topic":"Tasmota",
|
||||||
|
* "ButtonTopic":"0",
|
||||||
|
* "Power":0,
|
||||||
|
* "PowerOnState":3,
|
||||||
|
* "LedState":1,
|
||||||
|
* "LedMask":"FFFF",
|
||||||
|
* "SaveData":1,
|
||||||
|
* "SaveState":1,
|
||||||
|
* "SwitchTopic":"0",
|
||||||
|
* "SwitchMode":[0,0,0,0,0,0,0,0],
|
||||||
|
* "ButtonRetain":0,
|
||||||
|
* "SwitchRetain":0,
|
||||||
|
* "SensorRetain":0,
|
||||||
|
* "PowerRetain":0,
|
||||||
|
* "InfoRetain":0,
|
||||||
|
* "StateRetain":0},
|
||||||
|
* "StatusPRM":{"Baudrate":9600,"SerialConfig":"8N1","GroupTopic":"tasmotas","OtaUrl":"http://ota.tasmota.com/tasmota/release/tasmota.bin.gz","RestartReason":"Software/System restart","Uptime":"202T01:24:51","StartupUTC":"2023-08-13T15:21:13","Sleep":50,"CfgHolder":4617,"BootCount":27,"BCResetTime":"2023-02-04T16:45:38","SaveCount":150,"SaveAddress":"F5000"},
|
||||||
|
* "StatusFWR":{"Version":"11.1.0(tasmota)","BuildDateTime":"2022-05-05T03:23:22","Boot":31,"Core":"2_7_4_9","SDK":"2.2.2-dev(38a443e)","CpuFrequency":80,"Hardware":"ESP8266EX","CR":"378/699"},
|
||||||
|
* "StatusLOG":{"SerialLog":0,"WebLog":2,"MqttLog":0,"SysLog":0,"LogHost":"","LogPort":514,"SSId":["Odyssee2001",""],"TelePeriod":300,"Resolution":"558180C0","SetOption":["00008009","2805C80001000600003C5A0A190000000000","00000080","00006000","00004000"]},
|
||||||
|
* "StatusMEM":{"ProgramSize":658,"Free":344,"Heap":17,"ProgramFlashSize":1024,"FlashSize":1024,"FlashChipId":"14325E","FlashFrequency":40,"FlashMode":3,"Features":["00000809","87DAC787","043E8001","000000CF","010013C0","C000F989","00004004","00001000","04000020"],"Drivers":"1,2,3,4,5,6,7,8,9,10,12,16,18,19,20,21,22,24,26,27,29,30,35,37,45,56,62","Sensors":"1,2,3,4,5,6,53"},
|
||||||
|
* "StatusNET":{"Hostname":"Tasmota","IPAddress":"192.168.100.81","Gateway":"192.168.100.1","Subnetmask":"255.255.255.0","DNSServer1":"192.168.100.1","DNSServer2":"0.0.0.0","Mac":"4C:11:AE:11:F8:50","Webserver":2,"HTTP_API":1,"WifiConfig":4,"WifiPower":17.0},
|
||||||
|
* "StatusMQT":{"MqttHost":"192.168.100.80","MqttPort":1883,"MqttClientMask":"Tasmota","MqttClient":"Tasmota","MqttUser":"mqttuser","MqttCount":156,"MAX_PACKET_SIZE":1200,"KEEPALIVE":30,"SOCKET_TIMEOUT":4},
|
||||||
|
* "StatusTIM":{"UTC":"2024-03-02T16:46:04","Local":"2024-03-02T17:46:04","StartDST":"2024-03-31T02:00:00","EndDST":"2024-10-27T03:00:00","Timezone":"+01:00","Sunrise":"07:29","Sunset":"18:35"},
|
||||||
|
* "StatusSNS":{
|
||||||
|
* "Time":"2024-03-02T17:46:04",
|
||||||
|
* "PV":{
|
||||||
|
* "Bezug":0.364,
|
||||||
|
* "Einspeisung":3559.439,
|
||||||
|
* "Leistung":-14
|
||||||
|
* }
|
||||||
|
* },
|
||||||
|
* "StatusSTS":{"Time":"2024-03-02T17:46:04","Uptime":"202T01:24:51","UptimeSec":17457891,"Heap":16,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":156,"POWER":"OFF","Wifi":{"AP":1,"SSId":"Odyssee2001","BSSId":"34:31:C4:22:92:74","Channel":6,"Mode":"11n","RSSI":100,"Signal":-50,"LinkCount":15,"Downtime":"0T00:08:22"}
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Tibber
|
||||||
|
======
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Shrdzm
|
||||||
|
======
|
||||||
|
|
||||||
|
Stand: 03.04.2024
|
||||||
|
|
||||||
|
Quelle:
|
||||||
|
https://cms.shrdzm.com
|
||||||
|
|
||||||
|
Abfrage:
|
||||||
|
http://IP/getLastData?user=XXXXXX&password=YYYYYY
|
||||||
|
|
||||||
|
Ergebnis:
|
||||||
|
{"1.8.0":"21561001","2.8.0":"44477","3.8.1":"64037","4.8.1":"6021512","1.7.0":"277","2.7.0":"0","3.7.0":"0","4.7.0":"184","1.128.0":"0","16.7.0":"277","uptime":"0000:07:35:38"}
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sortieren:
|
||||||
|
|
||||||
|
Shelly 1pm
|
||||||
|
Der Shelly 1pm verfügt über keine eigene Spannungsmessung sondern geht von 220V * Korrekturfaktor aus. Dadurch wird die Leistungsmessung verfälscht und der Shelly ist ungeeignet.
|
||||||
|
|
||||||
|
|
||||||
|
http://192.168.xxx.xxx/status
|
||||||
|
Shelly 3em (oder em3) :
|
||||||
|
ok
|
||||||
|
{"wifi_sta":{"connected":true,"ssid":"Odyssee2001","ip":"192.168.100.85","rssi":-23},"cloud":{"enabled":false,"connected":false},"mqtt":{"connected":true},"time":"17:13","unixtime":1709223219,"serial":27384,"has_update":false,"mac":"3494547B94EE","cfg_changed_cnt":1,"actions_stats":{"skipped":0},"relays":[{"ison":false,"has_timer":false,"timer_started":0,"timer_duration":0,"timer_remaining":0,"overpower":false,"is_valid":true,"source":"input"}],"emeters":[{"power":51.08,"pf":0.27,"current":0.78,"voltage":234.90,"is_valid":true,"total":1686297.2,"total_returned":428958.4},{"power":155.02,"pf":0.98,"current":0.66,"voltage":235.57,"is_valid":true,"total":878905.6,"total_returned":4.1},{"power":6.75,"pf":0.26,"current":0.11,"voltage":234.70,"is_valid":true,"total":206151.1,"total_returned":0.0}],"total_power":212.85,"emeter_n":{"current":0.00,"ixsum":1.29,"mismatch":false,"is_valid":false},"fs_mounted":true,"v_data":1,"ct_calst":0,"update":{"status":"idle","has_update":false,"new_version":"20230913-114244/v1.14.0-gcb84623","old_version":"20230913-114244/v1.14.0-gcb84623","beta_version":"20231107-165007/v1.14.1-rc1-g0617c15"},"ram_total":49920,"ram_free":30192,"fs_size":233681,"fs_free":154616,"uptime":13728721}
|
||||||
|
|
||||||
|
|
||||||
|
Shelly plus 2pm :
|
||||||
|
ok
|
||||||
|
{"ble":{},"cloud":{"connected":false},"input:0":{"id":0,"state":false},"input:1":{"id":1,"state":false},"mqtt":{"connected":true},"switch:0":{"id":0, "source":"MQTT", "output":false, "apower":0.0, "voltage":237.0, "freq":50.0, "current":0.000, "pf":0.00, "aenergy":{"total":62758.285,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223337},"temperature":{"tC":35.5, "tF":96.0}},"switch:1":{"id":1, "source":"MQTT", "output":false, "apower":0.0, "voltage":237.1, "freq":50.0, "current":0.000, "pf":0.00, "aenergy":{"total":61917.211,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223337},"temperature":{"tC":35.5, "tF":96.0}},"sys":{"mac":"B0B21C10A478","restart_required":false,"time":"17:15","unixtime":1709223338,"uptime":8746115,"ram_size":245016,"ram_free":141004,"fs_size":458752,"fs_free":135168,"cfg_rev":7,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.2.2"}}},"wifi":{"sta_ip":"192.168.100.87","status":"got ip","ssid":"Odyssee2001","rssi":-62},"ws":{"connected":false}}
|
||||||
|
|
||||||
|
http://192.168.xxx.xxx/rpc/Shelly.GetStatus
|
||||||
|
Shelly plus 1pm :
|
||||||
|
nok keine negativen Leistungswerte
|
||||||
|
{"ble":{},"cloud":{"connected":false},"input:0":{"id":0,"state":false},"mqtt":{"connected":true},"switch:0":{"id":0, "source":"MQTT", "output":false, "apower":0.0, "voltage":235.9, "current":0.000, "aenergy":{"total":20393.619,"by_minute":[0.000,0.000,0.000],"minute_ts":1709223441},"temperature":{"tC":34.6, "tF":94.3}},"sys":{"mac":"FCB467A66E3C","restart_required":false,"time":"17:17","unixtime":1709223443,"uptime":8644483,"ram_size":246256,"ram_free":143544,"fs_size":458752,"fs_free":147456,"cfg_rev":9,"kvs_rev":0,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.2.2"}}},"wifi":{"sta_ip":"192.168.100.88","status":"got ip","ssid":"Odyssee2001","rssi":-42},"ws":{"connected":false}}
|
||||||
|
*/
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
template <class HMSYSTEM>
|
template <class HMSYSTEM>
|
||||||
|
|
||||||
|
// TODO: groupAufteilen und groupSetLimit ... 4W Regel? für alle Parameter
|
||||||
|
|
||||||
class ZeroExport {
|
class ZeroExport {
|
||||||
public:
|
public:
|
||||||
/** ZeroExport
|
/** ZeroExport
|
||||||
|
@ -63,7 +65,7 @@ class ZeroExport {
|
||||||
unsigned long Tsp = millis();
|
unsigned long Tsp = millis();
|
||||||
|
|
||||||
mPowermeter.loop(&Tsp, &DoLog);
|
mPowermeter.loop(&Tsp, &DoLog);
|
||||||
// if (DoLog) sendLog();
|
// if (DoLog) sendLog();
|
||||||
clearLog();
|
clearLog();
|
||||||
DoLog = false;
|
DoLog = false;
|
||||||
|
|
||||||
|
@ -247,7 +249,7 @@ class ZeroExport {
|
||||||
// Select all Inverter to reboot
|
// Select all Inverter to reboot
|
||||||
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
for (uint8_t group = 0; group < ZEROEXPORT_MAX_GROUPS; group++) {
|
||||||
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
||||||
// mCfg->groups[group].inverters[inv].doReboot = 1;
|
// mCfg->groups[group].inverters[inv].doReboot = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -289,7 +291,7 @@ class ZeroExport {
|
||||||
mLog["D"] = eTsp - bTsp;
|
mLog["D"] = eTsp - bTsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(DoLog) sendLog();
|
if (DoLog) sendLog();
|
||||||
clearLog();
|
clearLog();
|
||||||
DoLog = false;
|
DoLog = false;
|
||||||
}
|
}
|
||||||
|
@ -332,7 +334,7 @@ class ZeroExport {
|
||||||
mLog["D"] = eTsp - bTsp;
|
mLog["D"] = eTsp - bTsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(DoLog) sendLog();
|
if (DoLog) sendLog();
|
||||||
clearLog();
|
clearLog();
|
||||||
DoLog = false;
|
DoLog = false;
|
||||||
}
|
}
|
||||||
|
@ -375,7 +377,7 @@ class ZeroExport {
|
||||||
mLog["D"] = eTsp - bTsp;
|
mLog["D"] = eTsp - bTsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(DoLog) sendLog();
|
if (DoLog) sendLog();
|
||||||
clearLog();
|
clearLog();
|
||||||
DoLog = false;
|
DoLog = false;
|
||||||
}
|
}
|
||||||
|
@ -669,11 +671,13 @@ class ZeroExport {
|
||||||
|
|
||||||
mCfg->groups[group].lastRun = *tsp;
|
mCfg->groups[group].lastRun = *tsp;
|
||||||
|
|
||||||
*doLog = true;
|
mCfg->groups[group].power = 0;
|
||||||
|
|
||||||
|
// *doLog = true;
|
||||||
|
|
||||||
// Get Data
|
// Get Data
|
||||||
JsonArray logArr = mLog.createNestedArray("ix");
|
JsonArray logArr = mLog.createNestedArray("ix");
|
||||||
bool wait = false;
|
/// bool wait = false;
|
||||||
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
for (uint8_t inv = 0; inv < ZEROEXPORT_GROUP_MAX_INVERTERS; inv++) {
|
||||||
JsonObject logObj = logArr.createNestedObject();
|
JsonObject logObj = logArr.createNestedObject();
|
||||||
logObj["i"] = inv;
|
logObj["i"] = inv;
|
||||||
|
@ -681,12 +685,12 @@ class ZeroExport {
|
||||||
// Inverter not enabled or not selected -> ignore
|
// Inverter not enabled or not selected -> ignore
|
||||||
if (NotEnabledOrNotSelected(group, inv)) continue;
|
if (NotEnabledOrNotSelected(group, inv)) continue;
|
||||||
|
|
||||||
if (!mIv[group][inv]->isAvailable()) continue;
|
// if (!mIv[group][inv]->isAvailable()) continue;
|
||||||
|
|
||||||
// Get Pac
|
// Get Pac
|
||||||
record_t<> *rec;
|
record_t<> *rec;
|
||||||
rec = mIv[group][inv]->getRecordStruct(RealTimeRunData_Debug);
|
rec = mIv[group][inv]->getRecordStruct(RealTimeRunData_Debug);
|
||||||
float p = mIv[group][inv]->getChannelFieldValue(CH0, FLD_PAC, rec);
|
mCfg->groups[group].power += mIv[group][inv]->getChannelFieldValue(CH0, FLD_PAC, rec);
|
||||||
|
|
||||||
// TODO: Save Hole Power für die Webanzeige
|
// TODO: Save Hole Power für die Webanzeige
|
||||||
}
|
}
|
||||||
|
@ -1009,10 +1013,18 @@ class ZeroExport {
|
||||||
|
|
||||||
*doLog = true;
|
*doLog = true;
|
||||||
|
|
||||||
float y = mCfg->groups[group].y;
|
int32_t y = mCfg->groups[group].y;
|
||||||
float y1 = mCfg->groups[group].y1;
|
int32_t y1 = mCfg->groups[group].y1;
|
||||||
float y2 = mCfg->groups[group].y2;
|
int32_t y2 = mCfg->groups[group].y2;
|
||||||
float y3 = mCfg->groups[group].y3;
|
int32_t y3 = mCfg->groups[group].y3;
|
||||||
|
|
||||||
|
if (mCfg->groups[group].power > mCfg->groups[group].powerMax) {
|
||||||
|
int32_t diff = mCfg->groups[group].power - mCfg->groups[group].powerMax;
|
||||||
|
y = y - diff;
|
||||||
|
y1 = y1 - (diff * y1 / y);
|
||||||
|
y1 = y1 - (diff * y2 / y);
|
||||||
|
y1 = y1 - (diff * y3 / y);
|
||||||
|
}
|
||||||
|
|
||||||
// TDOD: nochmal durchdenken ... es muss für Sum und L1-3 sein
|
// TDOD: nochmal durchdenken ... es muss für Sum und L1-3 sein
|
||||||
// uint16_t groupPmax = 0;
|
// uint16_t groupPmax = 0;
|
||||||
|
@ -1047,14 +1059,14 @@ class ZeroExport {
|
||||||
rec = mIv[group][inv]->getRecordStruct(RealTimeRunData_Debug);
|
rec = mIv[group][inv]->getRecordStruct(RealTimeRunData_Debug);
|
||||||
cfgGroupInv->power = mIv[group][inv]->getChannelFieldValue(CH0, FLD_PAC, rec);
|
cfgGroupInv->power = mIv[group][inv]->getChannelFieldValue(CH0, FLD_PAC, rec);
|
||||||
|
|
||||||
if (cfgGroupInv->power < ivPmin[cfgGroupInv->target]) {
|
if ((cfgGroupInv->power < ivPmin[cfgGroupInv->target]) && (cfgGroupInv->limit < cfgGroupInv->powerMax) && (cfgGroupInv->limit < mIv[group][inv]->getMaxPower())) {
|
||||||
grpTarget[cfgGroupInv->target] = true;
|
grpTarget[cfgGroupInv->target] = true;
|
||||||
ivPmin[cfgGroupInv->target] = cfgGroupInv->power;
|
ivPmin[cfgGroupInv->target] = cfgGroupInv->power;
|
||||||
ivId_Pmin[cfgGroupInv->target] = inv;
|
ivId_Pmin[cfgGroupInv->target] = inv;
|
||||||
// Hier kein return oder continue sonst dauerreboot
|
// Hier kein return oder continue sonst dauerreboot
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfgGroupInv->power > ivPmax[cfgGroupInv->target]) {
|
if ((cfgGroupInv->power > ivPmax[cfgGroupInv->target]) && (cfgGroupInv->limit > cfgGroupInv->powerMin) && (cfgGroupInv->limit > (mIv[group][inv]->getMaxPower() * 2 / 100))) {
|
||||||
grpTarget[cfgGroupInv->target] = true;
|
grpTarget[cfgGroupInv->target] = true;
|
||||||
ivPmax[cfgGroupInv->target] = cfgGroupInv->power;
|
ivPmax[cfgGroupInv->target] = cfgGroupInv->power;
|
||||||
ivId_Pmax[cfgGroupInv->target] = inv;
|
ivId_Pmax[cfgGroupInv->target] = inv;
|
||||||
|
@ -1377,7 +1389,7 @@ class ZeroExport {
|
||||||
|
|
||||||
// Calculate
|
// Calculate
|
||||||
uint16_t power100proz = mIv[group][inv]->getMaxPower();
|
uint16_t power100proz = mIv[group][inv]->getMaxPower();
|
||||||
uint16_t power2proz = (power100proz *2) / 100;
|
uint16_t power2proz = (power100proz * 2) / 100;
|
||||||
|
|
||||||
// if isOff -> Limit Pmin
|
// if isOff -> Limit Pmin
|
||||||
if (!mIv[group][inv]->isProducing()) {
|
if (!mIv[group][inv]->isProducing()) {
|
||||||
|
@ -1394,10 +1406,10 @@ class ZeroExport {
|
||||||
cfgGroupInv->limitNew = power2proz;
|
cfgGroupInv->limitNew = power2proz;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restriction Power + 10% < Limit
|
/// // Restriction Power + 10% < Limit
|
||||||
if ((cfgGroupInv->power + (power100proz * 10 / 100)) < cfgGroupInv->limit) {
|
/// if ((cfgGroupInv->power + (power100proz * 10 / 100)) < cfgGroupInv->limit) {
|
||||||
cfgGroupInv->limitNew += (power100proz * 10 / 100);
|
/// cfgGroupInv->limitNew += (power100proz * 10 / 100);
|
||||||
}
|
/// }
|
||||||
|
|
||||||
// Restriction LimitNew > Pmax
|
// Restriction LimitNew > Pmax
|
||||||
if (cfgGroupInv->limitNew > cfgGroupInv->powerMax) {
|
if (cfgGroupInv->limitNew > cfgGroupInv->powerMax) {
|
||||||
|
@ -1411,10 +1423,10 @@ class ZeroExport {
|
||||||
|
|
||||||
// Restriction modulo 4 bzw 2
|
// Restriction modulo 4 bzw 2
|
||||||
cfgGroupInv->limitNew = cfgGroupInv->limitNew - (cfgGroupInv->limitNew % 4);
|
cfgGroupInv->limitNew = cfgGroupInv->limitNew - (cfgGroupInv->limitNew % 4);
|
||||||
// TODO: HM-800 kann vermutlich nur in 4W Schritten ... 20W -> 16W ... 100W -> 96W
|
// TODO: HM-800 kann vermutlich nur in 4W Schritten ... 20W -> 16W ... 100W -> 96W
|
||||||
|
|
||||||
// Restriction deltaLimitNew < 5 W
|
// Restriction deltaLimitNew < 5 W
|
||||||
/*
|
/*
|
||||||
if (
|
if (
|
||||||
(cfgGroupInv->limitNew > (cfgGroupInv->powerMin + ZEROEXPORT_GROUP_WR_LIMIT_MIN_DIFF)) &&
|
(cfgGroupInv->limitNew > (cfgGroupInv->powerMin + ZEROEXPORT_GROUP_WR_LIMIT_MIN_DIFF)) &&
|
||||||
(cfgGroupInv->limitNew > (cfgGroupInv->limit + ZEROEXPORT_GROUP_WR_LIMIT_MIN_DIFF)) &&
|
(cfgGroupInv->limitNew > (cfgGroupInv->limit + ZEROEXPORT_GROUP_WR_LIMIT_MIN_DIFF)) &&
|
||||||
|
@ -1424,7 +1436,7 @@ class ZeroExport {
|
||||||
*doLog = true;
|
*doLog = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (cfgGroupInv->limit != cfgGroupInv->limitNew) {
|
if (cfgGroupInv->limit != cfgGroupInv->limitNew) {
|
||||||
cfgGroupInv->doLimit = 1;
|
cfgGroupInv->doLimit = 1;
|
||||||
|
|
|
@ -80,7 +80,7 @@ class RestApi {
|
||||||
mHeapFrag = ESP.getHeapFragmentation();
|
mHeapFrag = ESP.getHeapFragmentation();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
AsyncJsonResponse* response = new AsyncJsonResponse(false, 6000);
|
AsyncJsonResponse* response = new AsyncJsonResponse(false, 10000);
|
||||||
JsonObject root = response->getRoot();
|
JsonObject root = response->getRoot();
|
||||||
|
|
||||||
String path = request->url().substring(5);
|
String path = request->url().substring(5);
|
||||||
|
@ -860,6 +860,7 @@ class RestApi {
|
||||||
// Advanced
|
// Advanced
|
||||||
objGroup[F("setPoint")] = (int16_t)mConfig->plugin.zeroExport.groups[group].setPoint;
|
objGroup[F("setPoint")] = (int16_t)mConfig->plugin.zeroExport.groups[group].setPoint;
|
||||||
objGroup[F("refresh")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].refresh;
|
objGroup[F("refresh")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].refresh;
|
||||||
|
objGroup[F("power")] = (int32_t)mConfig->plugin.zeroExport.groups[group].power;
|
||||||
objGroup[F("powerTolerance")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].powerTolerance;
|
objGroup[F("powerTolerance")] = (uint8_t)mConfig->plugin.zeroExport.groups[group].powerTolerance;
|
||||||
objGroup[F("powerMax")] = (uint16_t)mConfig->plugin.zeroExport.groups[group].powerMax;
|
objGroup[F("powerMax")] = (uint16_t)mConfig->plugin.zeroExport.groups[group].powerMax;
|
||||||
objGroup[F("Kp")] = ah::round3((float)mConfig->plugin.zeroExport.groups[group].Kp);
|
objGroup[F("Kp")] = ah::round3((float)mConfig->plugin.zeroExport.groups[group].Kp);
|
||||||
|
|
|
@ -1629,6 +1629,7 @@
|
||||||
// Advanced
|
// Advanced
|
||||||
o.setPoint = 0;
|
o.setPoint = 0;
|
||||||
o.refresh = 10;
|
o.refresh = 10;
|
||||||
|
o.power = 0;
|
||||||
o.powerTolerance = 10;
|
o.powerTolerance = 10;
|
||||||
o.powerMax = 600;
|
o.powerMax = 600;
|
||||||
o.Kp = -1;
|
o.Kp = -1;
|
||||||
|
@ -1683,7 +1684,8 @@
|
||||||
ml("td", {style: "text-align: left;", }, badge(obj.groups[group].enabled, (obj.groups[group].enabled) ? "{#ENABLED}" : "{#DISABLED}")),
|
ml("td", {style: "text-align: left;", }, badge(obj.groups[group].enabled, (obj.groups[group].enabled) ? "{#ENABLED}" : "{#DISABLED}")),
|
||||||
ml("td", {style: "text-align: center;", }, String(obj.groups[group].id)),
|
ml("td", {style: "text-align: center;", }, String(obj.groups[group].id)),
|
||||||
ml("td", {style: "text-align: left;", }, String(obj.groups[group].name)),
|
ml("td", {style: "text-align: left;", }, String(obj.groups[group].name)),
|
||||||
ml("td", {style: "text-align: right;", id: "groupPowerTotal"+group}, "n/a"),
|
// ml("td", {style: "text-align: right;", id: "groupPowerTotal"+group}, "n/a"),
|
||||||
|
ml("td", {style: "text-align: right;", id: "groupPower"+group}, String(obj.groups[group].power)),
|
||||||
ml("td", {style: "text-align: center;", onclick: function() {
|
ml("td", {style: "text-align: center;", onclick: function() {
|
||||||
function zeroGetIvList(ivObj) {
|
function zeroGetIvList(ivObj) {
|
||||||
ZeroExportGroup_Modal(obj.groups[group], ivObj)
|
ZeroExportGroup_Modal(obj.groups[group], ivObj)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue