Microwechselrichter Bosswerk MI 300 und Huayu HY-800 an Fhem anbinden

Begonnen von Decki, 18 Oktober 2021, 21:28:27

Vorheriges Thema - Nächstes Thema

Olly

Hallo Joe,

das hab ich so auch schon mal gesehen. Passiert glaube ich immer dann, wenn man die Seite direkt aufruft.
Schau dir doch mal den Seitenquelltext an, da sollten dann die gesuchten Werte zu finden sein.
z.B.:
var webdata_now_p = "281";
var webdata_today_e = "8.0";
var webdata_total_e = "8.0";
var webdata_alarm = "";
var webdata_utime = "0";


Gruß

      Olly
BananaPi 1GB;NetCSM 868MHz, miniCUL 433MHz, LaCrosseGateway, 2x SignalESP; FHEM 6.2

bismosa

Huhu!

Ich habe jetzt auch einen Deye SUN600G3-EU-230  :)

Bei der Suche nach Möglichkeiten den Wechselrichter auszulesen bin ich auch über diesen Thread gestolpert.
Danke für die Ideen und Inspirationen mit dem HTTPMOD.

Ich möchte allerdings ein wenig mehr.
Die Aktuelle Leistung wird wohl nur alle 5 Min. aktualisiert. (Trotz Abfrage jede Minute)
Auch hätte ich gerne in FHEM auch die Werte der einzelnen Module.

Ich habe dieses Projekt in Github entdeckt:
https://github.com/kbialek/deye-inverter-mqtt
Läuft und bringt einige Werte mehr. Konnte leider nur kurz testen, da die Sonne schon wieder weg war.
Benötigt leider Python 3.10 (oder 3.11 damit lief es bei mir). Die Installation auf dem Raspberry hat bei mir Stunden gedauert...und benötigt einiges an Platz auf meiner kleinen Karte.

Ich stelle mir nun die Frage, ob das nicht schon jemand direkt in FHEM mit dem ModbusAttr umgesetzt hat?
Ich kenne mich da leider nicht aus...muss erstmal lernen, wie das geht. Aber vielleicht wäre dies eine "einfache" Möglichkeit an aktuelle Daten zu kommen?

Vielleicht hat ja schon jemand ein Beispiel dafür?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

@bismosa
Ich habe ebenfalls einen Deye baugleichen WR und lese die Modbus Daten mittels "geklautem" Python Script auf einem alten RasPi aus, leider fehlt mit die Expertise, daraus ein Modul zu machen.

Was mich aber an den vom WR direkt über Modbus zur Verfügung stehenden Daten absolut stört, ist der Datenintervall.
Offiziell soll die interne Datenrate bei 60sec. liegen, und alle 5 Min in die Cloud übertragen werden, letzteres passiert auch, nur die interne Pollrate liegt statt der 60sec. bei ca. 10 Minuten! und ist somit für eine Steuerung nahezu unbrauchbar, da ist die Auswertung über einen nachgeschalten Shelly deutlich performanter.

bismosa

Hallo!

Zitat von: uli-bs am 21 Februar 2023, 11:47:12
Was mich aber an den vom WR direkt über Modbus zur Verfügung stehenden Daten absolut stört, ist der Datenintervall.
:( Stimmt. Hab ich selbst gerade getestet. Nach 5Min. gab es erst ein Update.

Das ist mir auch deutlich zu langsam. Aber immerhin kommt man so an ein paar Werte mehr. Ich finde es auch interessant zu wissen, wie viel die einzelnen Module machen.
Jetzt bekomme ich zusätzlich:
freq
l1_current
l1_power
l1_voltage
pv1_current
pv1_day_energy
pv1_power
pv1_total_energy
pv1_voltage
pv2_current
pv2_day_energy
pv2_power
pv2_total_energy
pv2_voltage
radiator_temp

Aber der Intervall stört mich ebenfalls. Hat mit aktuellen Werten nichts zu tun  :(

Dann werde ich mir auch ein Shelly o.ä. besorgen für eine Echtzeitanzeige.

Trotzdem würde mich es interessieren, wie ich die Werte mit FHEM und dem ModbusAttr auslesen kann. Vielleicht verstehe ich das ja noch irgendwann...

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

Wie angedeutet, die Daten holt aktuell ein alter Pi1 mit Raspian OS und einem Python Script und sendet sie per MQTT an den Pi mit der FHEM Instanz.
Meine Readings entsprechen dabei etwa deinen, nur dass ich eben 4 PV Eingänge habe. Ich vermute AC Current bleibt bei dir auch leer?
Das Listing ist praktisch der Zustand "Licht gerade weg", also Logger gerade abgeschaltet.
Bei Gelegenheit werde ich mal die SD Karte vom FHEM clonen und dann sehen, ob sich Script und Pythonversion mit dem normalen FHEM Host vertragen.

TYPE       MQTT2_DEVICE
   READINGS:
     2023-02-21 17:48:07   AC_Current_A_   0
     2023-02-21 17:48:07   AC_Frequency_Hz_ 0
     2023-02-21 17:48:07   AC_Power_Output_W_ 0
     2023-02-21 17:48:07   AC_Production_today_kWh_ 1.0
     2023-02-21 17:48:07   AC_Production_total_kWh_ 1234.5
     2023-02-21 17:48:07   AC_System_Power_W_ 1600.0
     2023-02-21 17:48:07   AC_Voltage_V_   0
     2023-02-21 17:48:07   PV1_DC_Current_A_ 0
     2023-02-21 17:48:08   PV1_DC_Power_W  0
     2023-02-21 17:48:07   PV1_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV1_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV1_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV2_DC_Current_A_ 0
     2023-02-21 17:48:08   PV2_DC_Power_W  0
     2023-02-21 17:48:07   PV2_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV2_Production_today_kWh_ 0.3
     2023-02-21 17:48:07   PV2_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV3_DC_Current_A_ 0
     2023-02-21 17:48:08   PV3_DC_Power_W  0
     2023-02-21 17:48:07   PV3_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV3_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV3_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV4_DC_Current_A_ 0
     2023-02-21 17:48:08   PV4_DC_Power_W  0
     2023-02-21 17:48:07   PV4_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV4_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV4_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   Radiator_Temp_dC_ 0
     2023-02-21 17:48:07   Set_Inverter_ON-OFF__ 1
     2023-02-21 17:48:07   Set_Islanding_Protection_Enable__ 1
     2023-02-21 17:48:07   Set_Power_Limiter__ 100
     2023-02-21 17:48:08   online          0
     2023-02-21 17:48:08   state           offline
     2023-02-21 17:48:07   timeout         11

loetmeister

Zitat von: bismosa am 21 Februar 2023, 14:00:11
Trotzdem würde mich es interessieren, wie ich die Werte mit FHEM und dem ModbusAttr auslesen kann. Vielleicht verstehe ich das ja noch irgenll.dwann...

Hi,

glaube da passen die Protokolle nicht überein... welche Modbus ID sollte der Wechselrichter haben? Ich hatte mal einen Modbus ID scan versucht... glaube das ist aber vergebens.
Soweit ich die Pyhthon scripte verstehe (z.B. https://github.com/jlopez77/DeyeInverter) wird eine spezielle Anfrage an den Wechselrichter geschickt - welcher u.a. die Seriennummer enthält. Das scheint mir sehr speziell.
Grundsätzlich müsste man aber den Python code in Perl für FHEM umschreiben können, ohne MQTT Teil sieht es relativ übersichtlich aus... FEHM Module wäre leider Neuland für mich  :-[

Gruß,
Thomas

bismosa

Hallo!

Zitat von: loetmeister am 27 Februar 2023, 20:11:56
glaube da passen die Protokolle nicht überein...

Ja. Das denke ich auch. Habe mich da auch dran versucht. Siehe auch hier:
https://forum.fhem.de/index.php/topic,75638.msg1265091.html#msg1265091

Ich habe es für mich aufgegeben, das direkt mit FHEM zu machen. Ich nutze nun
https://github.com/kbialek/deye-inverter-mqtt

Ich musste ein aktuelleres Python installieren (habe 3.11 genommen). Starten kann man dann mit
bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py" bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py"

Habe mir dafür dann noch ein init.d Script gebastelt, damit es auf meinem Raspberry automatisch gestartet wird:
#!/bin/sh

### BEGIN INIT INFO
# Provides:          deye
# Required-Start:   
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Deye to MQTT
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/root/deye
DAEMON=$DIR/start.sh
DAEMON_NAME=deye

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid
# start-stop-daemon --start --background --pidfile /var/run/deye.pid --make-pidfile --user root --chuid root --startas /root/deye/start.sh
. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
pkill -f deye_docker_entrypoint.py
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
pkill -f deye_docker_entrypoint.py
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;

    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0


Dafür noch die start.sh:
#!/bin/sh
bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py" bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py"


Geht bestimmt auch einfacher/besser.  ;)
Ich glaube die readingList musste ich beim MQTT2 Device auch leicht anpassen, damit alle ein eigenes Reading bekommen.

Läuft die letzten Tage gut :)


Zitat von: uli-bs am 21 Februar 2023, 18:08:39
Ich vermute AC Current bleibt bei dir auch leer?
...
Das Listing ist praktisch der Zustand "Licht gerade weg", also Logger gerade abgeschaltet.
AC Current nennt sich bei mir L1_current und enthält bei mir Daten.

Online/Offline gibt es bei mir leider derzeit noch nicht. Vielleicht wird das ja irgendwann hinzugefügt.

Nutzt Du ein selbst geschriebenes Script? Oder ist das irgendwo verfügbar?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

"Mein" Script stammt aus einem anderen Forum und ist dort im ersten Beitrag verlinkt (google: "loxone Deye") es beruht auf einer Entwicklung von jlopez77 (github) .
Ich lasse es aus /opt/name mit einem kleinen Bash Script über chrontab laufen.
Gefühlter Vorteil: es ist nur ein einzelnes Python Script und soll auch schon ab Py 3.08 laufen. Libraries müssen allerdings auch nachinstalliert werden.
Die Namen für die MQTT Parameter/Readings habe ich auch etwas angepasst.

neobiker

Hallo,
ich habe meinen Microwechselrichter von DEYE (identisch Bosswerk) jetzt auch erfolgreich mit dem deye_inverter_mqtt Skript in FHEM mittels MQTT eingebunden.

Die Attribute habe ich wie folgt definiert (_12345678 mit der Seriennummer des WR-Logger ersetzen):

########################
### MQTT2 Deye SUN Micro
########################
define MQTT2_deye_inverter_12345678 MQTT2_DEVICE deye_inverter_12345678
attr MQTT2_deye_inverter_12345678 readingList deye_inverter_12345678:deye/status:.* status\
deye_inverter_12345678:deye/logger_status:.* logger_status\
deye_inverter_12345678:deye/day_energy:.* day_energy\
deye_inverter_12345678:deye/total_energy:.* total_energy\
deye_inverter_12345678:deye/ac/l1/voltage:.* AC_L1_voltage\
deye_inverter_12345678:deye/ac/l1/current:.* AC_L1_current\
deye_inverter_12345678:deye/ac/l1/power:.* AC_L1_power\
deye_inverter_12345678:deye/ac/l2/power:.* AC_L2_power\
deye_inverter_12345678:deye/ac/l3/power:.* AC_L3_power\
deye_inverter_12345678:deye/ac/freq:.* freq\
deye_inverter_12345678:deye/uptime:.* uptime\
deye_inverter_12345678:deye/dc/pv1/voltage:.* PV1_voltage\
deye_inverter_12345678:deye/dc/pv1/current:.* PV1_current\
deye_inverter_12345678:deye/dc/pv1/power:.* PV1_power\
deye_inverter_12345678:deye/dc/pv2/voltage:.* PV2_voltage\
deye_inverter_12345678:deye/dc/pv2/current:.* PV2_current\
deye_inverter_12345678:deye/dc/pv2/power:.* PV2_power\
deye_inverter_12345678:deye/dc/pv3/voltage:.* PV3_voltage\
deye_inverter_12345678:deye/dc/pv3/current:.* PV3_current\
deye_inverter_12345678:deye/dc/pv3/power:.* PV3_power\
deye_inverter_12345678:deye/dc/pv4/voltage:.* PV4_voltage\
deye_inverter_12345678:deye/dc/pv4/current:.* PV4_current\
deye_inverter_12345678:deye/dc/pv4/power:.* PV4_power\
deye_inverter_12345678:deye/operating_power:.* operating_power\
deye_inverter_12345678:deye/ac/active_power:.* active_power\
deye_inverter_12345678:deye/radiator_temp:.* radiator_temp\
deye_inverter_12345678:deye/dc/pv1/day_energy:.* PV1_day_energy\
deye_inverter_12345678:deye/dc/pv1/total_energy:.* PV1_total_energy\
deye_inverter_12345678:deye/dc/pv2/day_energy:.* PV2_day_energy\
deye_inverter_12345678:deye/dc/pv2/total_energy:.* PV2_total_energy\
deye_inverter_12345678:deye/dc/pv3/day_energy:.* PV3_day_energy\
deye_inverter_12345678:deye/dc/pv3/total_energy:.* PV3_total_energy\
deye_inverter_12345678:deye/dc/pv4/day_energy:.* PV4_day_energy\
deye_inverter_12345678:deye/dc/pv4/total_energy:.* PV4_total_energy\
deye_inverter_12345678:deye/dc/total_power:.* total_power
attr MQTT2_deye_inverter_12345678 room MQTT2_DEVICE

define FileLog_MQTT2_deye_inverter_12345678 FileLog ./log/MQTT2_deye_inverter_12345678-%Y.log MQTT2_deye_inverter_12345678
attr FileLog_MQTT2_deye_inverter_12345678 logtype text
attr FileLog_MQTT2_deye_inverter_12345678 room MQTT2_DEVICE


Unter Debian habe ich die Software ebenfalls unter /opt installiert, weil ich dafür nicht extra docker verwenden will:
cd /opt
git clone https://github.com/kbialek/deye-inverter-mqtt
pip install paho-mqtt
cd deye-inverter-mqtt


Die Configdatei anpassen (IP-Adressen und WR-Seriennummer)
config.env
DEYE_LOGGER_IP_ADDRESS=192.168.xxx.yyy
DEYE_LOGGER_PORT=8899
DEYE_LOGGER_SERIAL_NUMBER=12345678

MQTT_HOST=192.168.yyy.zzz
MQTT_PORT=1883
MQTT_USERNAME=
MQTT_PASSWORD=
MQTT_TOPIC_PREFIX=deye

LOG_LEVEL=ERROR
DEYE_DATA_READ_INTERVAL=120
DEYE_METRIC_GROUPS=micro


Das vorhandene Skript deye_cli.sh habe ich nur geringfügig angepasst:
deye_daemon.sh
#!/bin/bash
cd $(dirname $0)
set -a; source config.env; set +a
python3 deye_docker_entrypoint.py "$@"


Mein Startskript sieht jetzt so aus:

#!/bin/sh

screen -d -m /opt/deye-inverter-mqtt/deye_daemon.sh

exit 0


Damit bekomme ich die WR-Daten mittels MQTT in FHEM integriert. Ich schiebe sämtliche MQTT Infos direkt an eine InfluxDB weiter.

cruser1800

Hallo neobiker,

ich bin absoluter Neuling was MQTT angeht. Daher noch ein paar Fragen.

1. Muss ich zusätzlich den MQTT2_CLIENT definieren?
2.  MQTT_USERNAME= / MQTT_PASSWORD=   - muss hier etwas gefüllt werden. Die Zugangsdaten vom Deye?
3. Gibt es unter Debian eine Möglichkeit den MQTT - Server und die Daten zu prüfen?

Leider ist es Nacht und ich weis nicht, ob alles richtig installiert ist.

Danke Gruß Lutz

cruser1800

Ich habe Heute ein bisschen probiert. Habe jetzt bei Debian folgendes Problem.

  File "/usr/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused


Hat jemand eine Lösung für mich?

Danke

bismosa

Hallo!

@neobiker

Danke für die Beschreibung. Das sieht etwas einfacher aus als bei mir  :)

@cruser1800
ZitatMuss ich zusätzlich den MQTT2_CLIENT definieren?
Du musst einen MQTT2 Server haben. Siehe https://wiki.fhem.de/wiki/MQTT2_DEVICE und/oder https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt
Wenn dieser Zugangsdaten benötigt, musst du diese auch in die Konfiguration eintragen.
Wenn autocreate in FHEM aktiv ist, sollte das Device automatisch angelegt werden.

ZitatConnectionRefusedError: [Errno 111] Connection refused
Das sieht für mich nach falscher IP oder falschem Port aus. Stimmt die Konfiguration? Ist der Wechselrichter unter der angegbenen IP erreichbar?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

cruser1800

@bismosa

Danke, jetzt habe ich es verstanden und einen Server installiert und es klappt.

Gruß Lutz

neobiker

So,
ich habe jetzt den WR vom Internet in meiner Fritzbox abgeklemmt. Damit wird der tägliche Ertrag allerdings nicht mehr auf Null gesetzt. Damit er trotzdem den täglichen Ertrag zurücksetzt, habe ich folgendes Skript erstellt. Ich starte es jeden Morgen um 4 Uhr per Cron. Habe das aus einem Python-Skript im PV Forum adaptiert.

Beim schreiben des Datum/Urhzeit in die Register 22-24 erfolgt der Reset des taglichen Ertrages im WR.

Bei mir hat es heute schonmal funktioniert  8)

/opt/deye-inverter-mqtt/deye_reset_daily_power.sh
#!/bin/bash
# reset Daily_Power of DEYE Inverters
#   via deye_inverter_mqtt python package
#   https://github.com/kbialek/deye-inverter-mqtt

# locate script in package location!
cd $(dirname $0)

deye_read ()
{
    [ $# = 1 ] || return
    check=0
    while ! (( $check )); do
        result="$(./deye_cli.sh r $1)"
        result=$(echo "$result" | grep 'int: ')
        if [ -n "$result" ]; then
            echo "$result"
            check=1
            logger -t DEYE_read ./deye_cli.sh r $1
        else
            sleep 10
        fi
    done
}

deye_write ()
{
    [ $# = 2 ] || return
    check=0
    while ! (( $check )); do
        result="$(./deye_cli.sh w $1 $2)"
        if [ $result = "Ok" ]; then
            check=1
            logger -t DEYE_write ./deye_cli.sh w $1 $2
        else
            sleep 10
        fi
    done
}

# the 1.st read waits until inverter wakes up
val22_read=$(deye_read 22 | sed 's/int: //g' | cut -d, -f1)
val23_read=$(deye_read 23 | sed 's/.*h: //g' | cut -d, -f1)

# read actual date + time
year=$(date +%y)
month=$(date +%m | sed 's/^0//g')
day=$(date +%d | sed 's/^0//g')
hour=$(date +%H | sed 's/^0//g')
minute=$(date +%m | sed 's/^0//g')
second=$(date +%S | sed 's/^0//g')

# actual register 22-24 values
val22=$(($year * 256 + $month))
val23=$(($day * 256 + $hour))
val24=$(($minute * 256 + $second))

# reset daily_power only once a day
[ "$val22_read" = "$val22" -a "$val23_read" = "$day" ] && exit 0

# reset daily_power by setting register 22-24 with actual date + time
deye_write 22 $val22
deye_write 23 $val23
deye_write 24 $val24

cruser1800

@neobiker

der WR schaltet sich jeden Tag nach Sonnenuntergang ab und erst wieder zum Sonnenaufgang zu. In dieser Zeit ist er nicht erreichbar.

Wartet den Script die paar Stunden bis er antwortet?

Gruß