Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modbus plugin: split modbus and sunspec (BC) #11663

Merged
merged 29 commits into from
Jan 28, 2024
Merged

Modbus plugin: split modbus and sunspec (BC) #11663

merged 29 commits into from
Jan 28, 2024

Conversation

andig
Copy link
Member

@andig andig commented Jan 13, 2024

Purpose of this PR is to increase flexibility for the modbus plugin to allow more write operations. Replaces #11166, #11633

TODO

Out of scope

@andig andig added the enhancement New feature or request label Jan 13, 2024
@andig andig changed the title Modbus: split modbus, mbmd and sunspec Modbus plugin: split modbus and sunspec Jan 13, 2024
templates/definition/meter/fronius-gen24.yaml Outdated Show resolved Hide resolved
templates/definition/meter/solaredge-hybrid.yaml Outdated Show resolved Hide resolved
templates/definition/meter/solaredge-inverter.yaml Outdated Show resolved Hide resolved
templates/definition/meter/solaredge-inverter.yaml Outdated Show resolved Hide resolved
@andig
Copy link
Member Author

andig commented Jan 24, 2024

@premultiply wenn Du Lust hast könntest Du mal versuchen, ob Modbus LSW first Writes funktionieren?

@andig
Copy link
Member Author

andig commented Jan 24, 2024

@premultiply sunspec writes sind auch drin.

@premultiply
Copy link
Member

Ich hab leider auch keinerlei Gerät sowas braucht.
Das wäre dann wohl ein Fall für einen Kostal-Kunden.

@premultiply
Copy link
Member

premultiply commented Jan 28, 2024

W (AC-Power) wäre bei Hybrid immer falsch.
Hier kann nur wie gehabt DCW (- Battery DCW) richtig sein.

@MarcusWichelmann
Copy link
Sponsor

MarcusWichelmann commented Jan 28, 2024

@andig

Was ist hier konkret für welchen Wert zu ändern? AC Power ist- wenns einen Scale Factor gibt- anscheinend ein Sunspec Reading. Dann können wir auch dieses verwenden anstatt mit plain Modbus rumzufieseln.
Ich vermute das wäre dann 103:0:W?

Ich kenne mich mit der Schreibweise nicht aus, aber wenn die Umrechnung aufs gleiche Register führt, dann wird das wohl passen.

Du meinst den StorageRemoteCtrl_CommandMode?

Ja. Hab nur abgekürzt bei mir. ;)

Ich würde die Remote-Steuerung einfach dauerhaft aktivieren und alles darüber machen.

Also evcc setzt beim Start (oder alternativ per cli) die Register um die Remote-Control zu aktivieren:

  • StorageConf_CtrlMode: 0xe004 = 4 (Remote)
  • StorageConf_DefaultMode: 0xe00a = 7 (Maximize self-consumption)
  • StorageRemoteCtrl_CommandTimeout: 0xe00b = X seconds

Deaktivieren könnte man das ganze dann per cli, falls man evcc nicht mehr benutzen möchte. Ansonsten läuft aber auch einfach der timeout ab und dann sollte der WR sowieso in 7 (Maximize self-consumption) zurückfallen, da das der DefaultMode ist. Aber ein Hinweis in den Docs wäre wohl trotzdem gut, dass das den Wechselrichter umkonfiguriert und wie man es rückgängig macht.

evcc könnte beim graceful beenden natürlich auch StorageConf_CtrlMode zurücksetzen auf einen Wert, den der Anwender konfigurieren kann in der Config. Also bei den meisten wäre es vmtl. 1, aber eine Option würde nicht schaden.

image

evcc steuert dann den Akku, indem es regelmäßig den StorageRemoteCtrl_CommandMode neuschreibt. Und ggf. die Charge/Discharge Limits setzt:

  • 1: normal
    • StorageRemoteCtrl_CommandMode = 7
    • StorageRemoteCtrl_ChargeLimit = Maximum
    • StorageRemoteCtrl_DischargeLimit = Maximum
  • 2: hold
    • StorageRemoteCtrl_CommandMode = 7
    • StorageRemoteCtrl_ChargeLimit = Maximum
    • StorageRemoteCtrl_DischargeLimit = 0
  • 3: charge
    • StorageRemoteCtrl_CommandMode = 3
    • StorageRemoteCtrl_ChargeLimit = How many Watts to charge
    • StorageRemoteCtrl_DischargeLimit = 0

Wie man das Maximum fürs Charge/Discharge Limit herausfindet, bin ich gerade nicht sicher. Vlt. einstellbar machen?
Laut @Gifford47 #11663 (comment) ist der Wert wohl beim WR-Neustart zurückgesetzt, heißt man könnte ihn dann auslesen. Sonst hätte ich gerade keine Idee. Kann aber mal vergleichen, ob die max charge/discharge power Register der Batterie den selben Wert liefern.

@andig
Copy link
Member Author

andig commented Jan 28, 2024

Wie man das Maximum fürs Charge/Discharge Limit herausfindet, bin ich gerade nicht sicher. Vlt. einstellbar machen?

Das wollen wir nicht. Keine merkwürdigen Konstanten. Entweder geht das über den Timeout oder es geht halt nicht.

@andig
Copy link
Member Author

andig commented Jan 28, 2024

Also evcc setzt beim Start

@MarcusWichelmann StorageConf_CtrlMode: 0xe004 = 4 (Remote) ist jetzt drin, beim Rest würde ich auf sinnvolle Defaults vertrauen.

Ansonsten gerne mal testen- das wäre es jetzt von meiner Seite. Wenn das mangels magischer Konstanten nicht funktioniert würde ich SE hier wieder raus nehmen bis jemand eine bessere Idee hat.

@MarcusWichelmann
Copy link
Sponsor

MarcusWichelmann commented Jan 28, 2024

Okay verstehe. Ja dann ist vermutlich so besser:

Initial:

  • StorageConf_DefaultMode: 0xe00a = 7 (Maximize self-consumption)
  • StorageRemoteCtrl_CommandTimeout: 0xe00b = X seconds

Je nach Modus:

  • 1: normal
    • StorageConf_CtrlMode = 1 (Maximize Self Consumption)
    • Alle Remote-Register sind jetzt irrelevant
  • 2: hold
    • StorageConf_CtrlMode = 4 (Remote)
    • StorageRemoteCtrl_DischargeLimit = 0
    • Regelmäßig neu schreiben:
      • StorageRemoteCtrl_CommandMode = 7
  • 3: charge
    • erstmal nicht implementierbar bis neue Idee (ggf. neuer Merge Request)

Das StorageRemoteCtrl_ChargeLimit wird dann erstmal nie beschrieben, sodass der Default-Wert vom Wechselrichter gültig bleibt.

Das hat auch den Vorteil, dass der Wechselrichter während des "normal" Modes von evcc in einem Zustand ist, als würde man garkein evcc benutzen. evcc greift nur ein beim "hold".

@MarkusGH
Copy link
Contributor

MarkusGH commented Jan 28, 2024

Entschuldigung, dass ich mich hier auch noch einmische, aber ich halte es nicht für gut (und auch nicht für notwendig) StorageConf_CtrlMode automatisch ständig neu zu schreiben. Denn das ist eine Konfigurationsoption, die auch in der SetApp sichtbar ist.

Aus meiner Sicht ein guter Anfang wäre:

Beim Start oder per CLI:

  • StorageConf_CtrlMode = 4
  • StorageConf_DefaultMode = 7
  • StorageRemoteCtrl_CommandTimeout = X seconds

Dann laufend je nach Modus:

  • 1: normal

    • StorageRemoteCtrl_CommandMode = 7
    • StorageRemoteCtrl_ChargeLimit = Maximum
    • StorageRemoteCtrl_DischargeLimit = Maximum
  • 2: hold

    • StorageRemoteCtrl_CommandMode = 7
    • StorageRemoteCtrl_ChargeLimit = Maximum
    • StorageRemoteCtrl_DischargeLimit = 0
    • Regelmäßig neu schreiben:
      • StorageRemoteCtrl_CommandMode = 7
  • 3: charge

    • erstmal nicht implementierbar bis neue Idee (ggf. neuer Merge Request)

Denn dann kann der Anwender wenn was schief geht selber wieder per SetApp StorageRemoteCtrl_CommandMode = 1 setzen.

Maximum kann aus meiner Sicht alles >= 5000 sein, die Wechselrichter können eh' nicht mehr. Bei mir stand das per Default übrigens auf 16384.

@MarkusGH
Copy link
Contributor

Bei neuerer Software scheint StorageConf_CtrlMode=4 per UI übrigens gar nicht einstellbar zu sein, da gibt es wohl einen Mode 5 (Remote + TimeOfUse), der für unsere Zwecke hier auch funktionieren würde.

@andig
Copy link
Member Author

andig commented Jan 28, 2024

Entschuldigung, dass ich mich hier auch noch einmische, aber ich halte es nicht für gut (und auch nicht für notwendig) StorageConf_CtrlMode automatisch

Aussage oben: Anwender kann es nicht setzen. Irgendwo muss es also her kommen.

und vor allem ständig zu schreiben.

Davon ist auch nicht die Rede- siehe Template.

Long story short: ich nehme SE hier wieder raus und wir können das gerne separat weiter diskutieren, es scheint nicht als würde es hier eine Einigung geben. Weiter mit SE in #11904.

@MarcusWichelmann
Copy link
Sponsor

Long story short: ich nehme SE hier wieder raus und wir können das gerne separat weiter diskutieren, es scheint nicht als würde es hier eine Einigung geben.

Verwirrung im Endstatium 😄

Ich mache, wenn ich wieder da bin (2-3h) nen neuen Merge Request, dann können wirs da diskutieren.

@MarkusGH
Copy link
Contributor

Ich mache, wenn ich wieder da bin (2-3h) nen neuen Merge Request, dann können wirs da diskutieren.

Spitze - und sorry für das reingrätschen!

@MarcusWichelmann
Copy link
Sponsor

@MarkusGH

Maximum kann aus meiner Sicht alles >= 5000 sein, die Wechselrichter können eh' nicht mehr. Bei mir stand das per Default übrigens auf 16384.

Ist das der gleiche Wert, der in einem dieser Batterie-Register steht?

image

@MarcusWichelmann
Copy link
Sponsor

@andig Danke dir!

@MarkusGH Antworte dann am besten in #11904, dann verschieben wir alles weitere da hin.

@andig andig changed the title Modbus plugin: split modbus and sunspec Modbus plugin: split modbus and sunspec (BC) Jan 28, 2024
@andig andig merged commit 9517277 into master Jan 28, 2024
6 checks passed
@andig andig deleted the chore/split-modbus branch January 28, 2024 15:30
@sebnaf
Copy link

sebnaf commented Feb 28, 2024

Ich freue mich, wenn der Scale wieder funktioniert. Den benötige ich, um immer einen minimalen Überschuss ins Netz zu haben.

`

  • name: grid
    type: movingaverage
    decay: 0.2
    meter:
    type: custom
    power:
    source: modbus
    model: sunspec
    uri: 10.10.20.7:502
    id: 1
    subdevice: 1
    value: 203:W
    scale: -1.09
    # decay: 0.7
    #timeout: 2000
    `

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants