christian1980nrw / Spotmarket-Switcher

Shell script that manages Victron Venus OS ESS-Systems and/or Shelly Plug S and/or AVM Fritz!DECT200 and 210 switchable sockets so that it charges/switches, when spot-market prices are low.
Other
49 stars 8 forks source link

Victron charge activation maybe not working at newer Spotmarket-Switcher versions #81

Closed alex90alex closed 11 months ago

alex90alex commented 1 year ago

Hallo zusammen,

ich habe vor einigen Tagen die neue Firmware Venus OS 3.1 bzw. 3.11 aufgespielt. Das dynamische ESS verhält sich bei mir leider nicht so intelligent wie ich es gerne hätte. Mit aktivem dynamischen ESS wird unnötig der Akku entladen oder teilweise der Akku in der Nacht voll gehalten, trotz hohen Stromkosten (Tibber). Die Logik vom dynamischen ESS scheint aktuell noch nicht für mich zu passen. Daher würde ich gerne wieder die Funktionen vom Spotmarketswitcher verwenden. Wenn ich die Einstellung von dynamic ESS wieder auf "off" stelle, erfolgt leider die Ladeplanung über den Spotmarketswitcher nicht mehr. Hat jemand hierfür eine Problemlösung? In den letzten Monaten hat der Spotmarketswitcher super funktioniert. :-)

Danke für eure Hilfe.

Viele Grüße Alex

christian1980nrw commented 12 months ago

Die Entso-E Preise sind nur in EUR/MWh netto, ansonsten aber identisch. Ja, Failover der 3 API´s untereinander wäre ein tolles Feature. Entso-E bringt noch ganz viele andere Länder mit. Aber für Deutschland kann man alle 3 API´s aktivieren. Für Österreich 2. Die Besonderheit bei Tibber wäre das Entso-E nur ein echtes Failover bei den Nettopreisen ist. Wenn man bei Tibber Bruttopreise verwendet, müsste beim Failover zumindest eine Warnung kommen im Log. Gruß! Christian

christian1980nrw commented 12 months ago

@ckvsoft Wie war jetzt nochmal der letzte Stand mit dem Economic Check? Läuft er so wie in der Excel Tabelle? Ich müsste nämlich noch am Wochenende das Readme überarbeiten und dann ein neues Release erstellen wenn wir soweit sauber sind. Es sind jetzt wichtige Fixes im Master die auf jeden Fall in ein Release sollten, da ich das letzte zurückgezogen habe.

ckvsoft commented 12 months ago

@christian1980nrw

Ja ich denke das es jetzt passt.

vorausgesetzt eines der conditions ist wahr dann kommt der check

wenn der check auf 0 eingestellt ist dann ladeplan ein

Höchstpreis kleiner als die kosten ladeplan ein
Höchstpreis größer als die kosten ladeplan aus

Durchschnitt-preis kleiner als die kosten ladeplan ein
Durchschnitt-preis größer als die kosten ladeplan aus

wenn keines der beiden zutrifft dann ladeplan aus

wenn keines der conditions wahr ist dann ladeplan aus

Alles Möglichkeiten habe ich noch nicht ausprobiert, aber es schaut mal Gut aus

ckvsoft commented 12 months ago

Aber vor der Release sollte noch der installer angepasst werden, sodas die config nicht überschrieben wird

christian1980nrw commented 12 months ago

Wir müssen die Logik dann auch noch mit der Einspeisevergütung verwursten (entgangener Gewinn bei Ladung in den Akku), sollen wir das vor dem Release noch tun? Vermutlich werden wir aber danach traurig sein wie selten der Charger anspringt. Wie man das am besten macht, muss ich auch nochmal drüber nachdenken, da man ja tagsüber mehr einspeisen kann wenn der Akku nachts vorgeladen wird. Mit dem Installer achte ich drauf. Mal schauen wie ich das schaffe, da ich noch in anderen Projekten feststecke.

ckvsoft commented 12 months ago

Wir müssen die Logik dann auch noch mit der Einspeisevergütung verwursten (entgangener Gewinn bei Ladung in den Akku), sollen wir das vor dem Release noch tun? Vermutlich werden wir aber danach traurig sein wie selten der Charger anspringt. Wie man das am besten macht, muss ich auch nochmal drüber nachdenken, da man ja tagsüber mehr einspeisen kann wenn der Akku nachts vorgeladen wird. Mit dem Installer achte ich drauf. Mal schauen wie ich das schaffe, da ich noch in anderen Projekten feststecke.

Da bin ich mir nicht sicher ob das bis zum Wochenende :-) nicht ein Schnellschuss wird der nach hinten los geht.

Installer: ich hab die copy info aus der englisch beschreibung mal raus getan und im installer copier ich automatisch die sample.config.txt nach config.txt mit der option -n Mit dieser Option wird die Datei nicht überschrieben, falls sie bereits existiert. Es gibt keine Ausgabe oder Fehlermeldung, wenn die Datei nicht kopiert wird, der Befehl wird einfach stillschweigend beendet. Wenn die Ziel-Datei nicht existiert, wird sie wie gewohnt erstellt.

christian1980nrw commented 12 months ago

Wie gehen wir denn mit zukünftigen Config Versionen um? Sollen wir die Config versionieren und eine Fehlermeldung ausgeben wenn sie nicht mehr supported ist?

ckvsoft commented 12 months ago

Evtl. reicht es ja die Änderungen in die release Beschreibung zu schreiben New, deprecated und removed Allerdings müssten wir eine parser schreiben und dann darauf hinweisen das ein fehler in der config ist

ca. sowas in der art

declare -A valid_vars=(
  ["use_fritz_dect_sockets"]="0 1"
  ["use_shelly_wlan_sockets"]="0 1"
  ["fbox"]=""  # Leeres Feld bedeutet, dass die Wertprüfung übersprungen wird
)

Parser

while IFS="=" read -r name value; do
  # Entferne Leerzeichen und Kommentare
  name=$(echo "$name" | sed 's/ //g')
  value=$(echo "$value" | cut -d' ' -f1)

  # Überprüfe, ob der Variablenname gültig ist
  if [[ ${valid_vars[$name]+_} ]]; then
    # Überprüfe, ob der Wert gültig ist, wenn es definierte gültige Werte gibt
    if [[ -n "${valid_vars[$name]}" && ! "${valid_vars[$name]}" =~ (^| )$value($| ) ]]; then
      echo "WARNUNG: $name hat einen ungültigen Wert: $value"
    else
      echo "$name hat einen gültigen Wert: $value"
    fi
  else
    echo "ERROR: Unbekannte Variable: $name"
  fi
done < config.txt
alex90alex commented 12 months ago

Ihr könnt gerne wieder die DVE Version testen. Sollte jetzt passen wget "https://raw.githubusercontent.com/ckvsoft/Spotmarket-Switcher/dev/scripts/controller.sh"

ich habe eben mal das Skript geladen und getestet.

Erster durchlauf mit folgenden Bedingungen: (Nach dem Ausführen des Skriptes wurde der Ladeplan gestartet) stop_price=29.0 # stop above this price start_price=29.0 # start below this price feedin_price=18.5 # your feed-in-tariff of your solar system energy_fee=15.3 # proofs of origin, allocations, duties and taxes (in case if stock price is at 0 Cent/kWh) abort_price=29.0 # abort and never charge or switch if actual price is same or higher than this (Energy fees not included)

Den zweiten Durchlauf mit folgenden Bedingungen: (leider wurde hier wieder mal der Ladeplan nicht gestoppt) stop_price=19.0 # stop above this price start_price=19.0 # start below this price feedin_price=18.5 # your feed-in-tariff of your solar system energy_fee=15.3 # proofs of origin, allocations, duties and taxes (in case if stock price is at 0 Cent/kWh) abort_price=19.0 # abort and never charge or switch if actual price is same or higher than this (Energy fees not included)

I: Current price is 0.258 EUR/kWh total price. Lowest price will be 0.192 EUR/kWh total price. The average price will be 0.268367 EUR/kWh total price. Highest price will be 0.313 EUR/kWh total price. Second lowest price will be 0.2065 EUR/kWh total price. Third lowest price will be 0.2142 EUR/kWh total price. Fourth lowest price will be 0.2255 EUR/kWh total price. Fifth lowest price will be 0.2317 EUR/kWh total price. Sixth lowest price will be 0.2403 EUR/kWh total price. D: condition_evaluation [ ( charge_at_second_lowest_price (0) == 1 && second_lowest_price_integer (2065000 0000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( charge_at_fourth_lowest_price (0) == 1 && fourth_lowest_price_integer (2255000 0000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( charge_at_solar_breakeven_logic (1) == 1 && feedin_price_integer (185000000000 00000) > current_price_integer (25800000000000000) + energy_fee_integer (15300000000000000) ) evaluates to false ]. D: condition_evaluation [ ( charge_at_third_lowest_price (0) == 1 && third_lowest_price_integer (214200000 00000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( charge_at_sixth_lowest_price (0) == 1 && sixth_lowest_price_integer (240300000 00000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( charge_at_fifth_lowest_price (0) == 1 && fifth_lowest_price_integer (231700000 00000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( use_start_stop_logic (1) == 1 && start_price_integer (29000000000000000) > cur rent_price_integer (25800000000000000) ) evaluates to true ]. D: condition_evaluation [ ( switchablesockets_at_solar_breakeven_logic (0) == 1 && feedin_price_integer (1 8500000000000000) > current_price_integer (25800000000000000) + energy_fee_integer (15300000000000000) ) e valuates to false ]. D: condition_evaluation [ ( switchablesockets_at_fifth_lowest_price (0) == 1 && fifth_lowest_price_integer (23170000000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_lowest_price (0) == 1 && lowest_price_integer (1920000000 0000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_third_lowest_price (0) == 1 && third_lowest_price_integer (21420000000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_sixth_lowest_price (0) == 1 && sixth_lowest_price_integer (24030000000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_second_lowest_price (0) == 1 && second_lowest_price_integ er (20650000000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_start_stop (0) == 1 && start_price_integer (2900000000000 0000) > current_price_integer (25800000000000000) ) evaluates to false ]. D: condition_evaluation [ ( switchablesockets_at_fourth_lowest_price (0) == 1 && fourth_lowest_price_integ er (22550000000000000) == current_price_integer (25800000000000000) ) evaluates to false ]. I: Victron scheduled charging is ON. Battery SOC is at 35 %. Charging based on condition met of: use_start _stop_logic. D: [ OK ] root@raspberrypi4:/data/etc/Spotmarket-Switcher# DEBUG=1 bash ./controller.sh I: Tibber today-data is up to date. D: Variable: lowest_price | Original: 0.192 | Integer: 19200000000000000 | Len: 17 D: Variable: average_price | Original: 0.268367 | Integer: 26836700000000004 | Len: 17 D: Variable: highest_price | Original: 0.313 | Integer: 31300000000000000 | Len: 17 D: Variable: second_lowest_price | Original: 0.2065 | Integer: 20650000000000000 | Len: 17 D: Variable: third_lowest_price | Original: 0.2142 | Integer: 21420000000000000 | Len: 17 D: Variable: fourth_lowest_price | Original: 0.2255 | Integer: 22550000000000000 | Len: 17 D: Variable: fifth_lowest_price | Original: 0.2317 | Integer: 23170000000000000 | Len: 17 D: Variable: sixth_lowest_price | Original: 0.2403 | Integer: 24030000000000000 | Len: 17 D: Variable: current_price | Original: 0.258 | Integer: 25800000000000000 | Len: 17 D: Variable: stop_price | Original: 19.0 | Integer: 19000000000000000 | Len: 17 D: Variable: start_price | Original: 19.0 | Integer: 19000000000000000 | Len: 17 D: Variable: feedin_price | Original: 18.5 | Integer: 18500000000000000 | Len: 17 D: Variable: energy_fee | Original: 15.3 | Integer: 15300000000000000 | Len: 17 D: Variable: abort_price | Original: 19.0 | Integer: 19000000000000000 | Len: 17 D: Variable: battery_lifecycle_costs_cent_per_kwh | Original: 0.0 | Integer: 0 | Len: 1 I: Please verify correct system time and timezone: Fri Oct 20 22:48:52 CEST 2023

I: Current price is 0.258 EUR/kWh total price. Lowest price will be 0.192 EUR/kWh total price. The average price will be 0.268367 EUR/kWh total price. Highest price will be 0.313 EUR/kWh total price. Second lowest price will be 0.2065 EUR/kWh total price. Third lowest price will be 0.2142 EUR/kWh total price. Fourth lowest price will be 0.2255 EUR/kWh total price. Fifth lowest price will be 0.2317 EUR/kWh total price. Sixth lowest price will be 0.2403 EUR/kWh total price. D: Current price (0.2580€) is too high. Abort. (0.1900€) root@raspberrypi4:/data/etc/Spotmarket-Switcher#

ckvsoft commented 12 months ago

@alex90alex Gut das Du getestet hast. Ich hab den Fehler gefunden. Bei abort wurde das script abgebrochen ohne den ladeplan zu stoppen.

Du kannst das nochmal versuchen, allerding muss ich das Morgen noch etwas anpassen. Ich geh mal davon aus das die Shellys und Fritzln auch abgeschalten werden sollen

ckvsoft commented 12 months ago

@christian1980nrw Die Frage für mich stellt sich warum hier überhaupt abgebrochen wird. Evtl. Altbestand?

alex90alex commented 12 months ago

gerne doch Danke euch für die Mühe.

Einfach kurz schreiben wenn ich es wieder testen kann. Viele Grüße Alex

ckvsoft commented 12 months ago

Ja geht schon. Dachte du testen schon:-)

Am 20. Oktober 2023 23:20:38 MESZ schrieb alex90alex @.***>:

gerne doch Danke euch für die Mühe.

Einfach kurz schreiben wenn ich es wieder testen kann. Viele Grüße Alex

-- Reply to this email directly or view it on GitHub: https://github.com/christian1980nrw/Spotmarket-Switcher/issues/81#issuecomment-1773409501 You are receiving this because you were mentioned.

Message ID: @.***> -- Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.

alex90alex commented 12 months ago

Das Beenden der Ladeplanung funktioniert nun. :-)

ckvsoft commented 12 months ago

@christian1980nrw Das Abortproblem scheint behoben zu sein.

Aber wir müssen noch einiges überarbeiten. Bei den Downloads wird bei Fehlschlag oder keine Preise vorhanden das Skript mit exit 1 verlassen. Das ist aber nicht Gut Ich denke auch in diesen Fall sollte versucht werden den Ladevorgang und die Schalter abdrehen. Oder wie Denkst Du darüber?

christian1980nrw commented 12 months ago

@alex90alex Gut das Du getestet hast. Ich hab den Fehler gefunden. Bei abort wurde das script abgebrochen ohne den ladeplan zu stoppen.

Du kannst das nochmal versuchen, allerding muss ich das Morgen noch etwas anpassen. Ich geh mal davon aus das die Shellys und Fritzln auch abgeschalten werden sollen

Eher nicht. Die haben keine Ladeverluste und Akkukosten.

christian1980nrw commented 12 months ago

@christian1980nrw Das Abortproblem scheint behoben zu sein.

Aber wir müssen noch einiges überarbeiten. Bei den Downloads wird bei Fehlschlag oder keine Preise vorhanden das Skript mit exit 1 verlassen. Das ist aber nicht Gut Ich denke auch in diesen Fall sollte versucht werden den Ladevorgang und die Schalter abdrehen. Oder wie Denkst Du darüber?

Wenn Du keine Preise hast, macht das Script keinen Sinn mehr. Also kann es auch abgebrochen werden. Aber an der Stelle könnte man einen Failover einbauen.

ckvsoft commented 12 months ago

Ja die Todaypreise sind ja da, nur die tomorow preise nicht. Bei Tibber und aWATTar geht es ja auch weiter, ohne tomorow preise Und wenn ich keine Preise bekomme und auf Urlaub bin bleibt ein bestehendes laden aufrecht? Denke nicht das es so gewollt ist

ckvsoft commented 12 months ago

@alex90alex Gut das Du getestet hast. Ich hab den Fehler gefunden. Bei abort wurde das script abgebrochen ohne den ladeplan zu stoppen. Du kannst das nochmal versuchen, allerding muss ich das Morgen noch etwas anpassen. Ich geh mal davon aus das die Shellys und Fritzln auch abgeschalten werden sollen

Eher nicht. Die haben keine Ladeverluste und Akkukosten.

@christian1980nrw

Ich meine ja auch nicht die Ladeverlust Rechnung. Wenn am Anfang des scripts ein exit 1 ausgeführt wird bleibt alles was aktiv ist auch aktiv. Also sollte es zumindest einen Schalter geben der den user auswähle lässt ob alles beendet werden soll oder nicht. Weil Strom wird ja auch verbraucht, auch wenn der Akku schon leer ist

christian1980nrw commented 12 months ago

Ich korrigiere es mal eben schnell für die tomorrow Preise.

christian1980nrw commented 12 months ago

@alex90alex Gut das Du getestet hast. Ich hab den Fehler gefunden. Bei abort wurde das script abgebrochen ohne den ladeplan zu stoppen. Du kannst das nochmal versuchen, allerding muss ich das Morgen noch etwas anpassen. Ich geh mal davon aus das die Shellys und Fritzln auch abgeschalten werden sollen

Eher nicht. Die haben keine Ladeverluste und Akkukosten.

@christian1980nrw

Ich meine ja auch nicht die Ladeverlust Rechnung. Wenn am Anfang des scripts ein exit 1 ausgeführt wird bleibt alles was aktiv ist auch aktiv. Also sollte es zumindest einen Schalter geben der den user auswähle lässt ob alles beendet werden soll oder nicht. Weil Strom wird ja auch verbraucht, auch wenn der Akku schon leer ist

Also wir sollten einfach was einbauen wenn keine Today Preise da sind dann alles abzuschalten und das Script zu beenden damit die Verbraucher nicht endlos laufen. Der Fall ist eh unwahrscheinlich, insbesondere in Kombination mit Failover, aber es kann auch mal lokale Internetstörungen geben.

christian1980nrw commented 11 months ago

@alex90alex @ckvsoft I will close this issue, please reopen a new issue if there are still things to do. Regarding the start conditions of the feed-in tariff (charge if the payment for exported electricity is higher than the charging costs from the grid) should be dealt with in a separate issue. This thread is already off topic and becomes too long.