Browse Source

Merge branch 'lumapu:development03' into development03

pull/1305/head
DanielR92 9 months ago
committed by GitHub
parent
commit
50a6e4cb80
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      README.md
  2. 6
      src/CHANGES.md
  3. 2
      src/defines.h
  4. 220
      src/web/html/grid_info.json
  5. 3
      src/web/html/visualization.html

13
README.md

@ -18,19 +18,26 @@ This work is licensed under a
# 🖐 Ahoy! # 🖐 Ahoy!
![Logo](https://github.com/grindylow/ahoy/blob/main/doc/logo1_small.png?raw=true) ![Logo](https://github.com/lumapu/ahoy/blob/main/doc/logo1_small.png?raw=true)
This repository provides hardware and software solutions for communicating with Hoymiles inverters via radio. Our system allows you to easily obtain real-time values, such as power, current, and daily energy, as well as set parameters like the power limit of your inverter to achieve zero export. You can access these functionalities through our user-friendly web interface, MQTT, or JSON. Our solutions simplify the process of monitoring and fine-tuning your solar panel system to help you achieve your goals. This repository provides hardware and software solutions for communicating with Hoymiles inverters via radio. Our system allows you to easily obtain real-time values, such as power, current, and daily energy, as well as set parameters like the power limit of your inverter to achieve zero export. You can access these functionalities through our user-friendly web interface, MQTT, or JSON. Our solutions simplify the process of monitoring and fine-tuning your solar panel system to help you achieve your goals.
## Changelog
[latest Release](https://github.com/lumapu/ahoy/blob/main/src/CHANGES.md)
[Development Version](https://github.com/lumapu/ahoy/blob/development03/src/CHANGES.md)
Table of approaches: Table of approaches:
| Board | MI | HM | HMS/HMT | comment | HowTo start | | Board | MI | HM | HMS/HMT | comment | HowTo start |
| ------ | -- | -- | ------- | ------- | ---------- | | ------ | -- | -- | ------- | ------- | ---------- |
| [ESP8266/ESP32, C++](Getting_Started.md) | ✔️ | ✔️ | ✔️ ✨ | 👈 the most effort is spent here | [create your own DTU](https://ahoydtu.de/getting_started/) | | [ESP8266/ESP32, C++](Getting_Started.md) | ✔️ | ✔️ | ✔️ | 👈 the most effort is spent here | [create your own DTU](https://ahoydtu.de/getting_started/) |
| [Arduino Nano, C++](tools/nano/NRF24_SendRcv/) | ❌ | ✔️ | ❌ | | | [Arduino Nano, C++](tools/nano/NRF24_SendRcv/) | ❌ | ✔️ | ❌ | |
| [Raspberry Pi, Python](tools/rpi/) | ❌ | ✔️ | ❌ | | | [Raspberry Pi, Python](tools/rpi/) | ❌ | ✔️ | ❌ | |
| [Others, C/C++](tools/nano/NRF24_SendRcv/) | ❌ | ✔️ | ❌ | | | [Others, C/C++](tools/nano/NRF24_SendRcv/) | ❌ | ✔️ | ❌ | |
⚠️ **Warning: HMS-XXXXW-2T WiFi inverters are not supported. They have a 'W' in their name and a DTU serial number on its sticker**
## Getting Started ## Getting Started
1. [Guide how to start with a ESP module](Getting_Started.md) 1. [Guide how to start with a ESP module](Getting_Started.md)
@ -56,3 +63,5 @@ If you encounter any problems, use the issue tracker on Github. Provide a detail
### Related Projects ### Related Projects
- [OpenDTU](https://github.com/tbnobody/OpenDTU) - [OpenDTU](https://github.com/tbnobody/OpenDTU)
<- Our sister project for Hoymiles HM- and HMS-/HMT-series (for ESP32 only!) <- Our sister project for Hoymiles HM- and HMS-/HMT-series (for ESP32 only!)
- [hms-mqtt-publisher](https://github.com/DennisOSRM/hms-mqtt-publisher)
<- a project which can handle WiFi inverters like HMS-XXXXW-2T

6
src/CHANGES.md

@ -1,5 +1,11 @@
# Development Changes # Development Changes
## 0.8.37 - 2023-12-30
* added grid profiles
* format version of grid profile
# RELEASE 0.8.36 - 2023-12-30
## 0.8.35 - 2023-12-30 ## 0.8.35 - 2023-12-30
* added dim option for LEDS * added dim option for LEDS
* changed reload time for opendtufusion after update to 5s * changed reload time for opendtufusion after update to 5s

2
src/defines.h

@ -13,7 +13,7 @@
//------------------------------------- //-------------------------------------
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 8 #define VERSION_MINOR 8
#define VERSION_PATCH 35 #define VERSION_PATCH 37
//------------------------------------- //-------------------------------------
typedef struct { typedef struct {

220
src/web/html/grid_info.json

@ -1,11 +1,24 @@
{ {
"type": [ "type": [
{"0x0100": "CN_NBT32004_2018"},
{"0x0200": "US_Rule21_240V"},
{"0x0300": "DE_VDE4105_2018"}, {"0x0300": "DE_VDE4105_2018"},
{"0x0301": "DE_VDE4105_2011"},
{"0x0604": "Germany_VDE4105"},
{"0x0800": "IT_CEI0-21"},
{"0x0807": "Netherland_EN50438"},
{"0x0908": "France_VFR2014"},
{"0x0a00": "DE NF_EN_50549-1:2019"}, {"0x0a00": "DE NF_EN_50549-1:2019"},
{"0x0c00": "AT_TOR_Erzeuger_default"}, {"0x0c00": "AT_TOR_Erzeuger_default"},
{"0x0d04": "France NF_EN_50549-1:2019"}, {"0x0d00": "FR_VFR2019"},
{"0x1200": "2.0.4 (EU_EN50438)"}, {"0x0d04": "NF_EN_50549-1:2019"},
{"0x3700": "2.0.0 (CH_NA EEA-NE7–CH2020)"} {"0x1000": "ES_RD1699"},
{"0x1200": "EU_EN50438"},
{"0x2600": "BE_C10_26"},
{"0x2900": "NL_NEN-EN50549-1_2019"},
{"0x2a00": "PL_PN-EN 50549-1:2019"},
{"0x3700": "CH_NA EEA-NE7–CH2020"}
{"0xe100": "LN_50Hz"}
], ],
"grp_codes": [ "grp_codes": [
{"0x00": "Voltage H/LVRT"}, {"0x00": "Voltage H/LVRT"},
@ -94,6 +107,52 @@
} }
] ]
}, },
{
"0x0008": [
{
"name": "Nominal Voltage",
"div": 10,
"def": 230,
"unit": "V"
},
{
"name": "Low Voltage 1",
"div": 10,
"min": 170,
"max": 184,
"def": 184,
"unit": "V"
},
{
"name": "LV1 Maximum Trip Time",
"div": 10,
"def": 0.1,
"unit": "s"
},
{
"name": "High Voltage 1",
"div": 10,
"min": 264.5,
"max": 270,
"def": 264.5,
"unit": "V"
},
{
"name": "HV1 Maximum Trip Time",
"div": 10,
"def": 0.1,
"unit": "s"
},
{
"name": "10 mins Average High Voltage",
"div": 10,
"min": 253,
"max": 260,
"def": 253,
"unit": "V"
}
]
},
{ {
"0x000a": [ "0x000a": [
{ {
@ -286,6 +345,58 @@
} }
] ]
}, },
{
"0x1002": [
{
"name": "Nominal Frequency",
"div": 100,
"def": 50,
"unit": "Hz"
},
{
"name": "Low Frequency 1",
"div": 100,
"min": 49.5,
"max": 49.9,
"def": 49.5,
"unit": "Hz"
},
{
"name": "LF1 Maximum Trip Time",
"div": 10,
"def": 700,
"unit": "s"
},
{
"name": "High Frequency 1",
"div": 100,
"max": 51,
"min": 50.1,
"def": 50.2,
"unit": "Hz"
},
{
"name": "HF1 Maximum Trip time",
"div": 10,
"def": 0.1,
"unit": "s"
},
{
"name": "Low Frequency 2",
"div": 100,
"max": 49,
"min": 47.5,
"def": 47.5,
"unit": "Hz"
},
{
"name": "LF2 Maximum Trip Time",
"div": 100,
"def": 0.1,
"unit": "s"
}
]
},
{ {
"0x1003": [ "0x1003": [
{ {
@ -415,6 +526,62 @@
} }
] ]
}, },
{
"0x3007": [
{
"name": "Reconnect Time",
"div": 10,
"min": 10,
"max": 300,
"def": 65,
"unit": "s"
},
{
"name": "Reconnect High Voltage",
"div": 10,
"min": 253,
"max": 264.5,
"def": 264.5,
"unit": "V"
},
{
"name": "Reconnect Low Voltage",
"div": 10,
"min": 184,
"max": 210,
"def": 184,
"unit": "V"
},
{
"name": "Reconnect High Frequency",
"div": 100,
"max": 52,
"min": 50.5,
"def": 51.5,
"unit": "Hz"
},
{
"name": "Reconnect Low Frequency",
"div": 100,
"min": 47,
"max": 49.9,
"def": 47.5,
"unit": "Hz"
},
{
"name": "Short Interruption Reconnect Time",
"div": 10,
"def": 8,
"unit": "s"
},
{
"name": "Short Interruption Time",
"div": 10,
"def": 3,
"unit": "s"
}
]
},
{ {
"0x4000": [ "0x4000": [
{ {
@ -435,6 +602,42 @@
} }
] ]
}, },
{
"0x5000": [
{
"name": "FW Function Activated",
"div": 1,
"min": 0,
"max": 1,
"def": 1
},
{
"name": "Start of Frequency Watt Droop",
"div": 100,
"min": 50.2,
"max": 52,
"def": 50.2,
"unit": "Hz"
},
{
"name": "FW Droop Slope",
"div": 10,
"min": 16.7,
"max": 100,
"def": 40,
"unit": "Pn%/Hz"
},
{
"name": "Recovery Ramp Rate",
"div": 100,
"min": 0.1,
"max": 50,
"def": 0.5,
"unit": "Pn%/s"
}
]
},
{ {
"0x5001": [ "0x5001": [
{ {
@ -563,6 +766,17 @@
} }
] ]
}, },
{
"0x7000": [
{
"name": "APC Function Activated",
"div": 1,
"min": 0,
"max": 1,
"def": 1
}
]
},
{ {
"0x7002": [ "0x7002": [
{ {

3
src/web/html/visualization.html

@ -356,6 +356,7 @@
var glob = {offs:0, grid:obj.grid, info: data} var glob = {offs:0, grid:obj.grid, info: data}
var content = []; var content = [];
var g = getGridType(glob.info.type, getGridIdentifier(glob)) var g = getGridType(glob.info.type, getGridIdentifier(glob))
var v = getGridValue(glob);
if(null === g) { if(null === g) {
if(0 == obj.grid.length) { if(0 == obj.grid.length) {
content.push(ml("div", {class: "row"}, ml("div", {class: "col"}, ml("p", {}, "Profile was not read until now, maybe turned off?")))) content.push(ml("div", {class: "row"}, ml("div", {class: "col"}, ml("p", {}, "Profile was not read until now, maybe turned off?"))))
@ -366,7 +367,7 @@
} }
} else { } else {
content.push(ml("div", {class: "row"}, content.push(ml("div", {class: "row"},
ml("div", {class: "col my-3"}, ml("h5", {}, g + " (Version " + getGridValue(glob).toString(16) + ")")) ml("div", {class: "col my-3"}, ml("h5", {}, g + " (Version " + (Math.round(v / 0x1000)) + "." + (Math.round((v & 0x0ff0) / 0x10)) + "." + (v & 0x0F) + ")"))
)) ))
while((glob.offs*3) < glob.grid.length) { while((glob.offs*3) < glob.grid.length) {

Loading…
Cancel
Save