Deye Nachts ausschalten wenn Akku leer ist | HA&ESPHome& HA Automatisierungen

Nachdem mir hier so viele Leute mir geholfen haben mit Antworten und dem gesamten Wissen aus den Diskussionen,wollte ich auch mal was zurückgeben.

Es gibt bereits ein Thread der sich mit der Effizienz des Deye WRs beschäftig, wobei @laasa den WR ausschaltet und dafür ein Skript geschrieben hat. Er macht es jedoch nicht mithilfe von HomeAssistant, wobei ich das nun realisiert habe und euch zur Verfügung stellen wollte( Danke @laasa für deine Code in C der mir geholfen hat das Biepen zu deaktivieren)

Ich lese über einen ESP32 den Deye aus und das wird dann in HA übergeben. Den Code und die Anleitung findet ihr bei GitHub, wie viele das bereits nutzen. Damit ihr den Deye auschalten könnt, musst ihr noch das Register 80 bei switch: hinzufügen. Da die Software vom Deye (meines Erachtens teilweise recht schlecht programmiert wurde) beim Ausschalten des WR einen Fehler meldet, muss der Alarmton abgeschaltet werden. Dafür muss noch das Register 228 ausgelesen werden unter number:

Für die ESPHome Konfiguration einmal einen Ausschnitt für die benötigten Register:

#Hier der Code für den Schalter
switch:
- platform: modbus_controller
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
name: ${device_type}_Power_On
register_type: holding
address: 80
bitmask: 1
entity_category: config
icon: "mdi:toggle-switch"
#Zum Einschalten und Ausschalten des Alarmtones müssen bestimmte werde gesendet werden
number:
- platform: modbus_controller
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
id: ${device_type}_Beep1
name: "${device_type}-Beep1"
address: 228
bitmask: 2
value_type: U_WORD

Um den Alarmton ein-/auschalten zu können müssen dem Deye bestimmte Nummer geschickt werden. Zum auschalten eine “8” und zum einschalten eine “13” (HEX=0xD).

Das Ein- und Ausschalten erfolgt über eine Automatisierung. Dabei sind die Auslöser zum Ausschalten:

  • wenn die Batterie eine Spannung von unter 51,3V erreicht (mein LOW BAT)
  • Monate Oktober bis März
  • Batterieouput kleiner als 200W ist (für mich ist die Effizienz da schon zu gering)
  • Zwischen 18 und 7 Uhr. Die Zeitbedingung ist einfach für die Dunkelheit, wobei ich auch darüber nachdenke dies über die PV Spannung zu steuern (bspw wenn sie unter 50V ist).
Das Einschalten erfolgt morgens um 7:30 Uhr (auch hier möglich über die PV Spannung zu gehen) und in Abhängigkeit ob der Deye überhaupt aus ist, sowie die Monatsüberprüfung. Beim Einschalten ist die Besonderheit, dass der Alarmton erst nach dem vollständigen Hochfahren eingeschaltet wird, da es sonst bis zum Start biepen würden. Deshalb ein Delay von 2 Minuten (Der Deye braucht 1min 45sek um hochzufahren. Über die Programmierung des Delays müssen wir uns nicht streiten, ich weiß das geht besser, aber es funktioniert so ohne Probleme.

Automatisierung:

alias: Deye Ein-/Ausschalten Low Batt
description: ""
trigger:
- platform: numeric_state
entity_id:
- sensor.deye_battery_voltage
below: 51.3
id: Voltage_Low
- platform: time
at: "07:30:00"
id: DeyePower_Off
condition: []
action:
#Power Off und zuvor den Alarmton ausschalten
- if:
- condition: and
conditions:
- condition: trigger
id: Voltage_Low
- condition: time
after: "18:00:00"
before: "7:00:00"
- condition: template
value_template: |
{{states("sensor.deye_battery_output_power") | float(0) < 200 }}
- condition: template
value_template: |
{{ now().month in [1,2,3,10,11,12] }}
then:
- service: number.set_value
data:
value: "8"
target:
entity_id: number.deye_beep1
- service: switch.turn_off
data: {}
target:
entity_id: switch.deye_power_on
else: []
#Deye morgens anschalten und danach den Alarmton reaktivieren
- if:
- condition: and
conditions:
- condition: trigger
id: DeyePower_Off
- condition: template
value_template: |
{{is_state("switch.deye_power_on", "off") }}
- condition: template
value_template: |
{{ now().month in [1,2,3,10,11,12] }}
then:
- service: switch.turn_on
data: {}
target:
entity_id: switch.deye_power_on
- delay: "00:02"
- service: input_boolean.turn_on
data: {}
target:
entity_id: input_boolean.beep
- service: number.set_value
data:
value: "13"
target:
entity_id: number.deye_beep1
else: []
mode: single

Ich hoffe, dass das euch helfen kann.

Achja das Problem ist nur: Ist der WR aus, sendet er keine Verbrauchsdaten mehr. Mein WR ist parallel und LOAD wird nur im Stromausfall genutzt sonst nie. Finde ich ein bisschen komisch, weil die Daten vom eastron sdm630 kommen eigentlich weiter an. Falls da jemand eine Lösung hat, gerne her damit.

7 „Gefällt mir“

Genau sowas suche ich schon lange, leider fehlt es mir am know how…

Weisst du event. ob das auch in Verbindung mit SolarAssistant geht? SA hab ich in HomeAssistant über mqtt eingebunden. Oder ist ESPHome zwingend notwendig?

@totti1001 also wenn du über mqtt und SA die Register abfragen kannst, dann sollte das wohl gehen, aber mit SA kenne ich mich nicht aus (Anfangs wollte ich es auch darüber Monitoren, aber bin dann doch direkt zu esphome gekommen)

Vielleicht kann dir da jemand anderes weiter helfen.

1 „Gefällt mir“

würde mich auch brennend interessieren.

Hab auch nen ESP32 hier, aber ich möchte nicht auf SolarAssistant verzichten. Kann man an den RS485 vom Deye auch 2 Auslesegeräte hängen? Also SA und ESP?

@dingsdada nutzt du den bms Port? Soweit ich weiß kannst du den auch für Modbus verwenden. Bei vielen ging der Modbus Port nicht (erst nach FW Update) und die haben dann den BMS Port als Alternative genutzt. Ansonsten kann man doch SA auch über den RS232 Anschluss nutzen, soweit ich das noch in Erinnerung habe.

Ich muss die Automatisierung noch anpassen, denn sollte am 31.3 der Deye ausgeschaltet werden, so würde er am 1.4 nicht wieder eingeschaltet werden. Deshalb müsste im zweiten Teil des Codes bei den Conditions stehen:

          - condition: template
value_template: |
{{ now().month in [1,2,3,4, 10,11,12] }}

Außerdem muss ich noch eine ID einfügen, damit der Wechselrichter nur eingeschaltet wird, wenn zuvor die Automatisierung den Deye - wegen dem leeren Akku - ausgeschaltet hat. Das soll nämlich verhindern, dass der WR einschaltet, obwohl man ihn manuell ausgeschaltet hat. Könnte bei einer “Wartung” zu Problemen führen. Entweder mache ich das über eine ID oder über einen in HA eingeführten Helfer-Switch. Wobei ich die erste Variante bevorzuge, mal gucken wie ich es implementiert bekomme.

Erstmal vielen Dank! Danach habe ich schon lange gesucht und es nun auch mit dem Power-On/Off + ESP32 per HomeAssistant umgesetzt.

Deine Automatisierung fand ich nicht ganz optimal und habe mir nun meine eigene erstellt. Statt auf Zeiten und Monate zu gehen, nutze ich die “Sun” Entität mit Sonnenauf- und Untergang.

Die Logik ist dann recht simpel: Wenn Sonne untergeht und Battery “low” und PV-Leistung unter 50W dann schalte den Wechselrichter ab. Umgekehrt ähnlich: Wenn Sonne aufgeht und WR ist “off” dann schalte ihn ein. Vorteil davon ist, dass die Automatisierung sich dynamisch an die Sonnenzeiten anpasst.

Als weiteren Auslöser habe ich noch Battery Low genutzt, also wenn Battery Low und PV Leistung unter 50W (ob die Sonne unter dem Horizon ist, prüfe ich hier jetzt nicht) schalte den WR aus. Damit fange ich ab, wenn die Batterie nach Sonnenuntergang (oder davor) auf “low” springt.

Die Alarm-Beeps am WR habe ich grundsätzlich deaktiviert, daher habe ich die Aktionen auch entfernt. Bei der Batterie nutze ich die SOC (nicht Volt).

alias: Deye Ein-/Ausschalten Low Batt
description: ""
trigger:
- platform: numeric_state
id: Battery_Low
entity_id:
- sensor.sun12k_battery_capacity
below: 15.1
- platform: sun
id: sunset
event: sunset
offset: 0
- platform: sun
id: sunrise
event: sunrise
offset: 0
condition: []
action:
- if:
- condition: and
conditions:
- condition: trigger
id:
- Battery_Low
- condition: numeric_state
entity_id: sensor.pv_aktuelle_leistung
below: 50
then:
- type: turn_off
device_id: a1cefb247b5b2cba6cab0a209a95b454
entity_id: 9f16a4d5c4e034f212507df107559dbc
domain: switch
- if:
- condition: and
conditions:
- condition: trigger
id:
- sunset
- condition: numeric_state
entity_id: sensor.sun12k_battery_capacity
below: 15.1
- condition: numeric_state
entity_id: sensor.pv_aktuelle_leistung
below: 50
then:
- type: turn_off
device_id: a1cefb247b5b2cba6cab0a209a95b454
entity_id: 9f16a4d5c4e034f212507df107559dbc
domain: switch
- if:
- condition: trigger
id:
- sunrise
- condition: state
entity_id: switch.sun12k_power_on
state: "off"
then:
- type: turn_on
device_id: a1cefb247b5b2cba6cab0a209a95b454
entity_id: 9f16a4d5c4e034f212507df107559dbc
domain: switch
mode: single
2 „Gefällt mir“

Cool dass ihr was bait was eigentlich ein FW feature seim sollte?

Was ist dann der standby oder hybernate Strom des deye? Er muss ja irgendetwas laufen haben damit man ihn einschaltern kann. Oder habe ich da was falsch verstanden?

1 „Gefällt mir“

@edom also bei mir zeigt er am Deye an: ca. 30watt. Laut BMS zieht er aber gar nichts… Also der SOC ändert sich bei mir nicht.

Heißt also: Würde er durchgängig 30W ziehen müsste sich- bei mir - der SOC um mind. 1% verändern. Demnach ist es wohl eher im Bereich um die 10W-20W. Aber vielleicht hat jemand das schonmal richtig nachgemessen.

Dann ist also ein Hardware abschelten des Deyes über einen steuerbaren Leistungsschalter und zB. eine Hausatomatisierung auch nicht erforderlich. Das wäre nicht ganz unaufwändig.
Das vereinfacht den HW Aufwand. - (Bin grad in der Planung)
Danke!

Das müssen die User doch nicht verbreiten, das steht doch schon alles hier drin.

https://www.akkudoktor.net/forum/postid/150090/

Weil das hier ein Forum ist wo sich Leute infos über WR holen. Da sollten sie Stärken und Schwächen kennen um sich entscheiden können.

Du fühlst dich aber angegriffen weil jemand schlecht über dein Spielzeug schreibt.

Was glaubst du denn warum es diesen oder andere Threads zum abschalten des DEYE gibt? Weil er so sparsam ist?

Oder warum sich Laasa die Mühe gemacht hat seinen Deye zu messen und seine Messwerte hier zu veröffentlichen?

Laasa würde sich die Kiste sicher nicht mehr kaufen, und wenn er vorm Kauf diese Infos gehabt hätte, wäre es wohl kein Deye geworden.

Hast du seinen Thread überhaupt gelesen?

Ich bin in dem Thema auch nur aktiv, weil ich im Bekanntenkreis jemand habe der total frustriert ist. Er hat im Frühjahr seinen Fronius 8.0 durch einen 12K Deye ersetzt weil er nur gutes gelesen hatte. Im Dezember kommt sein Elektriker und klemmt den Fronius wieder dran. Der Deye wird dann nur noch als BatterieWR genutzt und im Winter deaktiviert.

2 „Gefällt mir“

Hallo,

super Arbeit von Euch dass man den Deye abschalten kann. Hatte mich damit auch schon mal beschäftigt und das Register 80 gefunden um ihn abzuschalten.

Jetzt habe ich aber zwei Deye im Parallel-mode am Laufen und würde gerne in der Nacht um Energie aus dem Akku zu sparen nur den Salve abschalten. Da habe ich das Problem dass der Master dann jammert und auf Störung geht weil ihm der Slave fehlt. Also müsste ich per Register am Master den Parallel-mode deaktivieren. Leider finde ich kein Register im Modbus-manual um das umzustellen. Hat da jemand von Euch evtl. was gefunden?

Gruß Max

Aber dann verschenkt er ja im Winter seine Erträge weil er dann nur einen Bruchteil direkt Nutzen kann. Mit entsprechender PV Leistung gibt es auch an nicht ganz so schönen Tagen einiges an Ertrag der nicht direkt verbraucht wird. (Zumindest bei mir so) Da könnte man mit etwas Automation ja auch Nachts abschalten und am Tag jede kWh nutzen die von der Sonne kommt. Auch wenn einige Tage sind, wo nicht mal ein Tagesverbrauch von der PV kommt, sind doch auch sonnige Tage dabei, da könnte ich 3 Akkus füllen.
Aber du wirst ihn da schon ordentlich beraten haben. Zum Frühling werde ich mal auswerten an wie vielen Tagen der Deye mehr Verbraucht hat als Erzeugt.

Ausschalten ist jetzt nicht so mein Ding, dann fehlen mir auch die Daten die ich ja auslese. In Standy schicken wäre toll. Diesen Modus scheint es ja zu geben.

1 „Gefällt mir“

@linuxdep wo hast du das mit dem Standby her? Vielleicht habe ich das überlesen oder habe ich da was falsch verstanden.

Weil so wie ich es realisiert habe, kriege ich nämlich auch keine Werte mehr… Das würde ich jedoch gerne ändern, das stört mich nämlich genauso.

Da kam er ganz alleine drauf. Hätte ich ihn beraten können, dann hätte er zu seinem Fronius einen Multiplus2 installiert und keinen Deye.

Bei entsprechender PV Leistung?

Ich habe 14 kW auf dem Dach und der Monatsertrag im Dez liegt bei unter 80kWh im letzten Jahr, seit 1 Woche ist bei mir 0 Ertrag und solange Schnee liegt bleibt es auch bei 0, selbst wenn ich verdoppeln würde auf 28kW, es bleibt bei 0.

Wohnt Ihr im Ausland oder wo scheint angeblich die Sonne???

Gruß

1 „Gefällt mir“

@solartester an deiner Stelle würde ich umziehen… ?

Habe auch nur 14kWp auf dem dach, aber 45° und leicht Südost… gestern ist schon der meiste Schnee runter gesaust, heute die Reste, die an dem Übergang der Module hängen geblieben sind. aber 3kWp sind auch noch teilweise mit Schnee, weil die Gaube das blockiert am runter rutschen. Da aber nur alle 5 Jahre mal wirklich so viel Schnee kommt, kann ich mit leben.

Na ja, ist eine Lösung, aber halt abgespeckt. Dafür hätte er dann aber dauerhaft die Verluste AC–>DC–>AC. die ihren Akku per Tibber laden berichten was von 20-30%, wenn man andere AC Systeme so liest, sind die ja auch nicht effektiv. Nur das du da die Verluste nicht angezeigt bekommst wie beim Deye. Weg sind sie deshalb ja nicht.

1 „Gefällt mir“

Setzen kann man den nicht, aber diesen Status gibt es neben dem Normal Modus. Wie man diesen aber aktivieren kann oder wann der Zustand ist, keinen Plan. Darum bleibt meiner auch erst mal an. Ohne Daten ist das schon blöd. Mal schauen wie der Winter wird, dann wird entscheiden ob der Aufwand lohnt.
Laut Prognose vom PV Tool hier, wäre der Netzbezug zu vernachlässigen im Winter, selbst da wäre noch was zum einspeisen über. Mal schauen wie genau die Prognose dann wirklich passt.

grafik.png

1 „Gefällt mir“

@firen456

Ich habe auch mehrere Deye parallel und ich schalte auch bei Sonnenuntergang den Parallel-Mode beim Master per Home Assistant mit einem ESP32 und TTL to RS485 Adapter ( https://github.com/klatremis/esphome-for-deye ) aus.
Dann gehen die Slaves auf Standby mit einsprechend niedrigem Verbrauch.
Wenn die Sonne aufgeht, schalte ich den Parallel-Mode wieder ein.
Die benötigten Register habe ich mir von Deye zusenden lassen.

5C286F96-B6A1-4362-9976-404195D63891.png

So sieht das in ESPhome aus:

- platform: modbus_controller # Parallel Mode 1 ON/OFF
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
name: ${device_type}-Parallel Mode 1
register_type: holding
address: 336
bitmask: 0x1
entity_category: config
icon: "mdi:toggle-switch"
- platform: modbus_controller # Master/Slave
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
name: ${device_type}-Master
register_type: holding
address: 336
bitmask: 0x2
entity_category: config
icon: "mdi:toggle-switch"
- platform: modbus_controller # Modbus SN
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
name: ${device_type}-Modbus SN 01
register_type: holding
address: 336
bitmask: 0x00000400
entity_category: config
icon: "mdi:toggle-switch"
Das Problem ist, dass das morgendliche Aktivieren nicht ganz einfach ist, denn wenn man den Parallel-Mode per Modbus Befehl ausschaltet, der Deye automatisch von Master auf Slave wechselt und auch die Modbus ID gelöscht wird.

Das muss man morgens alles nacheinander wieder anschalten, was aber leider auch nicht trivial ist, denn ein Bug in ESPhome sorgt dafür, dass wenn man ein Bit im Rregiter 336 ändert, alle anderen Bits wieder auf 0 gesetzt werden.

Um das Verhalten zu umgehen, habe ich folgende Lösung über ein Auswahlfeld gefunden, adaptiert und in ESPhome eingebaut:

- platform: modbus_controller
use_write_multiple: true
modbus_controller_id: ${modbus_controller_id}
name: "Parallelbetrieb"
id: parallelbetrieb
address: 336
entity_category: config
value_type: U_WORD
optionsmap:
"Parallel": 0x1
"Master": 0x2
"Modbus ID 1": 0x00000400
"GIMMEALL": 4
lambda: |-
// we are only interested in the 2 bits binary 0011 need to map the options 00 , 01 , 10 , 11 in select
//ESP_LOGE("main","Modbus Number incoming value = %d",x);
//ESP_LOGE("main","Modbus eval value = %d",(x & 0x0004));
if ((x & 0x0004) == 0x1)
return std::string("Parallel");
if ((x & 0x0004) == 0x2)
return std::string("Master");
if ((x & 0x0004) == 0x00000400)
return std::string("Modbus ID 1");
if ((x & 0x0004) == 4)
return std::string("GIMMEALL");
return {};
write_lambda: |-
//ESP_LOGE("main","Modbus write gets = %d",value);
uint16_t unmodified = id(parallelbetrieb_raw).state;
//ESP_LOGE("main","Modbus write unmodified = %d", unmodified);
// optionsmap should only return 3 values... 00 , 01 , 11 so bitmask with complement 0x0003 to ensure we keep the original values in register. then appply or with the value that was chosen
uint16_t modified = ((unmodified & ~0x0004) | value);
//ESP_LOGE("main","Modbus write to write = %d", modified);
return modified;
Ich rufe alle Register generell alle 3 Sekunden ab.

Ich habe dann eine Automatisierung erstellt, die zu Sonnenaufgang in dem Auswahlfeld die Modbus ID auf 1 setzt, dann 10 Sekunden wartet und dann den Master Mode aktiviert, wieder 10 Sekunden wartet und dann dem Parallel-Mode aktiviert.
Wenn man die Register zu schnell hintereinander schreibt, funktioniert es seltsamerweise nicht zuverlässig, daher die 10 Sekunden Pause nach den jeweiligen Eingaben.

Das funktioniert tadellos, die genaue Funktionsweise des Skriptes ist mir allerdings nicht ganz klar.
Habe das per Trial and Error hingebastelt bis es funktioniert hat.

Ich hoffe das hilft dir weiter.