genmad / shellyAPIGen2AndAboveScripts

Scripts for the shelly API Gen2+
3 stars 0 forks source link

Ein paar Fragen #1

Closed Manos1966 closed 2 months ago

Manos1966 commented 2 months ago

Hi @genmad , ich habe ein paar Verständnis Fragen 🤦‍♂️

Angenommen: 192.168.178.10 Meine Shelly Plus 1PM (gen2) 192.168.178.11 Mein MQTT Server 192.168.178.12 Meine erster Hoymiles 192.168.178.13 Mein zweiter Hoymiles

  1. httpServerEndpoint : the address under which the the virtual powermeter is reachable Was meinst du mit Adresse? Die IP Adresse von der Shelly wo der Skript laeuft?

{ nominalPower_Watt: 100, minRequiredPower_Watt: 50, httpServerEndpoint: 'pwr1', mqttControllerPowerTopic: 'solar/dtuOnBattery/ac/power'}

  1. fuer MQTT, wie soll die adresse aussehen? type: "mqtt" // choose between local e.g. this script is running on a gen2 device which can measure net power
    // or http e.g. this script is running on a gen2 device which can not measure net power and pulls the power readings by http requests -- not yet supported/implemented // or mqtt get the power readings delivered by mqtt topic ( provide the topic in address) , address: "solar/dtuOnBattery/ac/power" // the address of the powerreading required for http or mqtt
genmad commented 2 months ago

Also,

Zunächst einmal muss der shelly auf dem das script laufen soll mit dem Mqtt server konfiguriert werden. Das geht unter settings -> mqtt.

Danach kopiert man das script auf den shelly und setzt scriptId im script auf 1 ( falls es das erste script ist das auf dem shelly läuft.) Weiterhin kann man die Werte für die httpServerEndpoint anpassen. Mit dieser Konfiguration ergeben sich dann die virtuellen Leistungsmesser für die controller der Wechselrichter zu: http://<shellyip>/script/<scriptid>/<httpServerEndpoint>, bei dir wären dass dann: http://192.168.178.10/script/1/pwr1 und http://192.168.178.10/script/1/pwr2. Diese trägst du dann bei den Controllern im Powermeter Bereich ein. Powermeter musst du dann auf http(s) + Json stellen und nur eine Phase verwenden/eintragen.

Die mqtt Adresse setzt sich aus den Einstellungen die du in deinem Controller (oDoB) im mqtt Bereich gemacht hast. Dort gibt es ein Basic Topic. Also trägt man bei address folgenden Wert ein: <BasicTopic>/ac/power für den jeweiligen Controller. Nehmen wir mal an dein topic auf controller1 ist solar/dtuOnBattery1 und auf controller2 solar/dtuOnBattery2. Dann sind die Werte die du unter address eintragen musst solar/dtuOnBattery1/ac/power und solar/dtuOnBattery2/ac/power.

Ich das mal heute Abend noch anpassen, damit ist inline erklärt ist und einfacher.

Ich hoffe das war verständlich.

Manos1966 commented 2 months ago

Oh man, bin ich Doof! ich muss nur das Basis-Topic bei jeder OpenDTU aendern!!!!!! Grrrr....

genmad commented 2 months ago

Ins script auf dem shelly gehen und die Kommentare vor den print entfernen und neue hinzufügen. Alternativ kannst du auch einen curl Befehl absetzen. dass ist das was die dtv auch macht. auf dem Mac ist das commando so: curl -X POST -d '{"id":1,"method":"Ws.GetConfig"}' http://192.168.178.10/script/1/pwr1

Habe ich etwas verpasst, oder warum steht in deiner dtu nicht die ip des Shellys (192.168.178.10)? Hast du die geändert? Oben sagst du dein shelly hat die ip 192.168.178.10 aber du verwendest überall die ip 192.168.188.187. Ist das die ip deines fhem servers?

Manos1966 commented 2 months ago

Ich habe alles zu Hause gebracht (ausser Batterien) weil es draussen am Test-Gelaende zu windig und regnerisch heute ist.

jetzt sind die IP Adressen: 192.168.188.187 Shelly Plus1PM 192.168.188.202 MQTT Server (FHEM) 192.168.188.155 First OpenDTUonBattery: solarMulti1/ac/power 192.168.188.156 Second OpenDTUonBattery: solarMulti2/ac/power 192.168.188.141 Volkszaehler OpenDTUonBattery: solarStromZaehler/powermeter/power1

genmad commented 2 months ago

Aha ich sehe dass du nun andere Ip Adressen verwendest.

genmad commented 2 months ago

Mhmm, dann werde ich heute Abend wohl noch mqtt als Ausgabe für den virtual PowerMeter implementieren. Dann solltest du auf jedenfall im mqtt server Ergebnisse sehen.

genmad commented 2 months ago

Mit neuen hinzufügen meinte ich print( wert der mich interessiert). Dass du dir auch selber print ausgaben erzeugen kannst an stellen die dich interessieren.

Beim json im Powermeter muss PWR stehen.

genmad commented 2 months ago

Das script hast du auch gestartet, oder? Dann solltest du jetzt in der console print ausgaben sehen.

Manos1966 commented 2 months ago

Dann solltest du jetzt in der console print ausgaben sehen

Console? von der Shelly? YEEEES! ich musste Websockets aktivieren! Grrrr... jetzt sind Daten da!!! Capture8

EDIT: Überflüssig

genmad commented 2 months ago

Wir müssen erstmal den 404 Fehler weg bekommen. Dann kriegen wir den rest auch hin. Also du kannst am schnellsten mit dem curl befehl testen. Wenn das läuft kannst du auf die Controller gehen und da alles einstellen.

genmad commented 2 months ago

Ich bin nutzlos....Es hat nicht funktioniert. Ich gehe jetzt schrittweise nach vorn und habe alles bei mir zu Hause gebracht und stelle alles hier zusammen:

Erste Schritt(e): a. Stromzaehler Daten empfangen, b. Script auf die Shelly laufen lassen, c. Ergebnis pwr1 und pwr2 empfangen

  • Zu Hause habe ich einen Volkzaehler fuer den Stromzaehler (Alt Lasten...) Dadurch habe ich eine dritte OpenDTU angeschlossen, um die Daten vom Volkszaehler abzufragen und zum MQTT Server zu schicken - Funktioniert! MQTT: OpenDTU_6912664 OpenDTU_6912664:solar/powermeter/power1 zeigt den Stromzähler Verbrauch! Diese OpentDTU (192.168.188.41) liesst den Stromzaehler korrekt, und sendet per MQTT (OpenDTU_6912664) die Daten zum Server als OpenDTU_6912664:solar/powermeter/power1 Capture

In FHEM sehe dass die Daten dieser OpenDTU per MQTT korrekt empfangen werden: https://pastebin.com/01RsDanW

Daraufhin habe ich dein Script angepasst: let netPowerConfig = { type: "mqtt" , address: "OpenDTU_6912664:solar/powermeter/power1" };

  • Meine Shelly Plus1PM 192.168.188.187 shellyplus1pm-d48afc76ad84 MQTT Funktioniert (MQTT Server 192.168.188.202) ich empfange alle Daten https://pastebin.com/vsGTk5k2

Der Script laeuft und das sieht man an die Information: params_script_1_id | 1 params_script_1_mem_free | 25200 params_script_1_running | true

Trotzdem sehe ich keine Ergebnisse:

  • weder auf mein FHEM (sollte ich nicht pm1 und pm2 als neue Readings bekommen?)
  • noch wenn ich eine direkte Abfrage per Browser mache: Capture2

Dein Script auf die Shelly sieht wie folgt aus: https://pastebin.com/QXwf7s3f

Daraufhin kann ich keine StromzaehlerDaten auf die zwei OpetDTUs die ich fuer Wechselrichter habe, empfangen. Capture3

Dein 1500 Watt wechselrichter sollte für den http endpoint auf pwr2 stehen in der config

genmad commented 2 months ago

Auf jedem Fall, ich sehe (Endlich!) Daten auf meine Shelly-Script-Console! Dann muss du keine Daten extra per MQTT senden (wenn du nicht willst).

Aber, ich sehe nur "GenPower" Daten. Sollte ich auch nicht pwr1 und pwr2 Daten da sehen koennen?

Naechste Frage: Ich sehe Daten wie GenPower: -2568.2080080999910.4 GenPower: -2588.3080080999920.8 GenPower: -2598.7080080999910.6

ZWEI Komma Zeichen (und sogar Punkte?)

Wenn http anfragen kommen, dann sieht man auch andere printouts. Im moment kommen nur die mqtt updates der Wechselrichter an. Warum das bei dir so komisch aussieht weiß ich nicht.🤷‍♂️ Vermute das die Daten falsch verarbeitet werden die ankommen. Musst mal die generatedPower mit deinem mqtt server vergleichen und da die momentane Leistung deiner Wr‘s addieren. Das sollte gleich sein.

Manos1966 commented 2 months ago

Von allen Prints die aktiviert wurden, nur das print("GenPower: " + generatedPower); funktioniert und sendet Daten. Das wurde bedeuten, dass keine andere Daten (pwr1, pwr2) erstellt werden, oder?

genmad commented 2 months ago

Die anderen Daten werden erst berechnet wenn diese auch mittels webrequest abfragt. Also z.b. curl . Da das aus welchen Gründen auch immer noch nicht funktioniert, wird aktuell nur die summe der Wr Leistung ausgegeben.

Manos1966 commented 2 months ago

Ah sooooo!!!!!!

Aber dann, eine Webrequest wie http://192.168.188.187/script/1/pwr1 vom Browser, haette eine Berechnung starten sollen. oder muss es unbedingt CURL sein?

genmad commented 2 months ago

Von allen Prints die aktiviert wurden, nur das print("GenPower: " + generatedPower); funktioniert und sendet Daten. Das wurde bedeuten, dass keine andere Daten (pwr1, pwr2) erstellt werden, oder? Hier ist der Script der z.Zeit laeuft: https://pastebin.com/MJFZdGf3

Die httpEndpoints dürfen nur auf pwr1 und pwr2 lauten. Das ganze zeug was aktuell da davor steht wird automatisch ergänzt vom shelly.

genmad commented 2 months ago

Siehe mein orginal script

genmad commented 2 months ago

Ah sooooo!!!!!!

Aber dann, eine Webrequest wie http://192.168.188.187/script/1/pwr1 vom Browser, haette eine Berechnung starten sollen. oder muss es unbedingt CURL sein?

Ja, hätte sollen. Curl oder web ist egal. Aber bis eben hatte es ja noch nicht funtioniert.

Manos1966 commented 2 months ago

Die httpEndpoints dürfen nur auf pwr1 und pwr2 lauten. Das ganze zeug was aktuell da davor steht wird automatisch ergänzt vom shelly.

Warum hast du es nicht frueher gesagt? 🤣 🤣 🤣 🤣 Tut mir leid, ich habe deine Anleitung von heute Vormittag falsch verstanden 🤦‍♂️

Jetzt kommen viele Daten auf die Console 🍾

Manos1966 commented 2 months ago

Webrequest http://192.168.188.187/script/1/pwr1 funktioniert

PWR: 486

Manos1966 commented 2 months ago

Die Antwort vom Webrequest ist aber auch kein JSON Format, oder?

genmad commented 2 months ago

Mach ich heute Abend + includiere verschiedene Erfahrungen.

genmad commented 2 months ago

Habe jetzt den Bug gefixt, so dass er jetzt Json zurück gibt. Weiterhin habe ich aus der config httpServerEndpoint rausgeschmissen und gegen eine hoffentlich einigermassen gute Erklärung ersetzt. Ausserdem hab ich die mqttControllerPowerTopic gegen ein anderen Namen und einen kürzeren Pfad ausgetauscht.

Also bevor du das Skript einspielst, sichere dir deine Config und übernehme sie und passe sie an. Du brauchst jetzt nur noch das basis topic angeben!!!!

Manos1966 commented 2 months ago

Vielen Dank fuer alle Erklaerungen @genmad ich habe einiges gelernt dadurch! 👍 😄

Manos1966 commented 2 months ago

Es ist etwas frueh um pingelig zu sein aber nur zur Info:

let scriptId=3; und /script/1 passen nicht zusammen

// define in Powermeter the mode https + Json and use http:///script//pwr e.g. for controller2 -> http://1.1.1.1/script/1/pwr2

genmad commented 2 months ago

Die http addresse sollte nur ein Beispiel sein für die davor abstrakte schreibweise eines Pfades. Da muss ich also nochmal ran um das bsp. klarer zu machen.

Manos1966 commented 2 months ago

Draussen tobt der Baehr... ich kann nichts machen, daher spiele ich ein bisschen mit Simulationen.

Ich glaube es gibt ein "Dreher" zwischen den Geraeten: IP: 192.168.188.156 ist die HM1200 MQTT:solarMulti1 (siehe Bild) IP: 192.168.188.155 ist die HM1500 MQTT:solarMulti2 (siehe Bild)

Stromverbrauch: 1776W

Ich gebe ein: { nominalPower_Watt: 2000, minRequiredPower_Watt: 51, mqttControllerBasicTopic: 'solarMulti1/ac/power'} { nominalPower_Watt: 800, minRequiredPower_Watt: 52, mqttControllerBasicTopic: 'solarMulti2/ac/power'}

Da der 1776W Verbrauch kleiner ist als die Max Leistung von 2000W der solarMulti1 , dann gehe ich davon aus, deine Berechnung wird:

  • minRequiredPower_Watt: 52 an solarMulti2/ac/power schicken
  • 1776W-52W= 1724W an solarMulti1/ac/power schicken

Anstatdessen sehe ich

  • solarMulti2/ac/power 1776W
  • solarMulti1/ac/power 52W

Oder sehe ich das falsch? 01

Manos1966 commented 2 months ago

Vielleicht liegt es daran, dass du mit Null anfaengst: 02

Manos1966 commented 2 months ago

Ja, es scheint fest zu sein: Auch bei niedrigerer Einstellung, 0 VPM bleibt bei 1776,36 03

genmad commented 2 months ago

Schau ich mir an. Was brauchst du zur simulation? Weitere odob Controller? Oder hast du da was anderes?

Manos1966 commented 2 months ago

Ich habe 3 verschiedene Stromzaehler (von TASMOTA bis Volkszaehler) um mich herum (ich organisiere die OpeDTUs fuer meine Nachbarn), fuenf OpenDTUs, Victron Emulation um mich herum. Da alles dunkel ist und stürmt sind die Pylontech-Batterien leer, daher teste ich deine Software Tagsueber, bevor ich sie zur Test-Umgebung (ein paar Km weiter) installieren kann.

genmad commented 2 months ago

Wenn deine Simulatoren nicht zurück melden was dass sie Leistung erzeugen, dann sind die werte richtig. In der Startphase gibt es genau das von dir beobachtete überschwingen. Das regelt aich dann weg wenn die Controller melden das sie Strom erzeugen.

Wenn in deinem basic topic unter ac/power 0 zurück kommt habe ich recht, ansonsten ist das ein Fehler.

Manos1966 commented 2 months ago

Sie meldeten zurueck, aber sie hatten nur ein paar Watt Leistung. Alles ist dunkel hier, seit gestern Nachmittag...

Ich hoffe wir haben ein bisschen Sonne morgen...

Manos1966 commented 2 months ago

Trotzdem, wenn { nominalPower_Watt: 2000, minRequiredPower_Watt: 51, mqttControllerBasicTopic: 'solarMulti1/ac/power'} { nominalPower_Watt: 800, minRequiredPower_Watt: 52, mqttControllerBasicTopic: 'solarMulti2/ac/power'}

Es kann nicht sein, dass solarMulti1 anstatt dessen die Anforderung 52W bekommt 😉

Manos1966 commented 2 months ago

Wenn in deinem basic topic unter ac/power 0 zurück kommt habe ich recht, ansonsten ist das ein Fehler.

Moment, das hat mir eine Idee gegeben, was ich pruefen sollte 🤔

Manos1966 commented 2 months ago

OK, ich nehme alles zurueck! Das Program funktioniert wie gewolt 👍 Ich habe nur die Powermeter Eingaben verkehrt rum eingegeben 🤦‍♂️ http://192.168.188.187/script/1/pwr1 da wo MQTT: solarMulti2/ http://192.168.188.187/script/1/pwr2 da wo MQTT: solarMulti1/

Manos1966 commented 2 months ago

scheint gut zu funktionieren, leider aber muss der Regen aufhoeren, damit die Batterien geladen werden und einen zweiten Wechselrichter an die Batterie anschliessen kann (die Busbars sind draussen und beim Wind und Regen nicht so einfach zu erreichen) 😞

Zu Hause sieht es gut aus, da aber keine Sonne zur Zeit, reicht die Solar Leistung nicht aus, um den Stromzaehler auf Null oder minus Werte zu setzen und dadurch testen wie der Algorithmus reagiert... Aergerlich 😭

Manos1966 commented 2 months ago

Ich brauche etwas Hilfe

Ich benutze den DPL eingestellt auf PV Paneele (keine Batterie) Die Limits 31W (HM1200) sowie 42W (HM1500) habe ich auch im DPL eingegeben Settings DPL 01

Der Virtuelle Stromzaehler pendelt auf 0 W Daraufhin setzt dein Program korrekt die Limits auf die Minimums 31 W & 42 W

Die eingestellte Limits laut DPL sind auf 48W (HM1200) aber bleiben auf 150W fuer den HM1500 😨 Dein Program sendet die richtigen Werte. ist das vielleicht ein DPL Problem? 21

Ich frage mich, was braucht der DPL um nach unten zu regeln???? Vielleicht erst wenn der Stromzaehler negative Werte liefert???? Dein algorithmus gibt sie nicht. 22

Manos1966 commented 2 months ago

Erstmal hoch auf 2000W (mehr als die beide Wechselrichter liefern koennen, per DPL sind sie auf max 800W) 25 erstmal hoch

Danach runter auf -200W Beide Wechselrichter haben sofort reagiert. Aber anstatt 31W und 42W wie der Stromzaehler zeigt zu erreichen, haben sich ein Limit von 120W und 225W empfangen! Das ist mir neu... Ich glaube es hat mit der DPL Logik zu tun... 26 danach runter auf -200

es ist die Logik! 5 Minuten spaeter (ich habe nichts geaendert) sind die Limits auf 84W und 150W 27 spaeter weiter auf -200

...und spaeter 28 spaeter weiter auf -200

...spaeter 29 spaeter weiter auf -200

...spaeter 30 spaeter weiter auf -200

OK, das geht so langsam runter, es wuerde die Batterie unnoetig entleeren.

Manos1966 commented 2 months ago

OK, ich habe den Wechselrichter getestet: Nur wenn negative Werte ankommen, passt der DPL die Leistung radikal nach unten!

Du muss ein paar negative Werte fuer eine gewisse Zeit 4-5 Sekunden(?) senden, bevor du sie auf die minRequiredPower_Watt einpendeln lassen kannst.

genmad commented 2 months ago

Steuerst du den Leistungsmesser(LM)? Oder ist das ein richtiger? ( Wo du wirklich die Leistung abrufst)

Ich glaube da gibt es ein Verständnis Problem. Leistungsanforderungen von 500W. Dann reagieren die Wr und die Leistung am LM geht auf null ( Wr‘S liefern 500 W). Abwerfen der Leistung LM zeigt -500W Wr reagieren LM zeigt 0 Watt und die Wrs liefern dass was du in deinem Netz verbrauchst.

So ist mein Verständnis von dem was wir da machen. Wie siehst du das?

genmad commented 2 months ago

Also ich nehme an, dass der LM immer die Summe der Verbräuche und Erzeugung anzeigt. So ist es implementiert.

Manos1966 commented 2 months ago

Du kannst die Nummer loeschen...

Manos1966 commented 2 months ago
  • Ich simuliere den Stromzaehler weil mein Haus Verbrauch zu hoch ist, und die Wechselrichter nicht genug Strom produzieren bei dem Wetter, um eine Null Einspeisung zu erreichen.
  • Ich schicke meine simulierten Stromzaehlerdaten an eine "OpenDTU 192.168.188.141 Stromzaehler" die das Topic MQTT:solarStromZaehler an meinem MQTT Server liefert und danach von der Shelly gelesen wird. So habe ich einen konstanten Fluss an Stromzaehler Daten an die Shelly.
  • Dein Algorithmus nimmt diese Stromzaehlerdaten, teilt sie auf zwei Werte pwr1 und pwr2 und gibt sie bei Bedarf an den Stromzaehler der:
  • Was die OpenDTUs mit diesen Stromzaehler Werte machen, liegt am jeweiligen DPL

Dein Beispiel:

  • Leistungsanforderungen von 500W
  • Dein Algorythmus teilt auf pwr1 u. pwr2
  • Die WR reagieren und die Leistung am LM geht auf null ( Wr‘S liefern 500 W).
  • Gehen die Verbraucher ploetzlich runter und der LM zeigt plotzlich -500W, Jetzt wird es interessant:
    • Dein Algorithmus teilt das -500 auf pwr1 u. pwr2 wie? bei Eingabe des minRequiredPower_Watt, also plotzlich sehen meine HM1200 und meine HM1500 kein -xxxW, sondern pwr1=31W und pwr2=42W Und jetzt regelt der jeweilige DPL gaaaaaanz langsam runter!!!! 🤦‍♂️ Es hat eine Ewigkeit gedauert!

Ich sage nicht, dass es dein Fehler ist. Es ist die Art und Weise wie der DPL regelt. Oder das, was ich gerade erlebt habe!

  • Wenn die Stromzaehler Werte von Plus-Werte auf Minus-Werte wechseln, reagiert der DPL sehr schnell
  • Wenn die Stromzaehler Werte von Plus-Werte auf niedrigere Plus-Werte wechseln, reagiert der DPL anders:
    • erst mit einem grossen Sprung
      • HM1200: von 800W runter auf 120W
      • HM1500: von 800W runter auf 225W
    • danach seeeeehr langsam mit kleinen Schritten auf 5 Minuten Takt
Manos1966 commented 2 months ago

OK, ich kann es anders ausdrucken:

So lange der Stromzaehler Positive Werte gibt, das bedeutet, die Wechselrichter produzieren nicht genug, um den Stromzaehler auf Null zu bringen. Waren sie also am 1000W am produzieren, dann bleiben sie auch da, weil der Stromzaehler positive Werte zeigt (in meinem Fall +42 oder +31) Waren sie am 500W am produzieren, dann bleiben sie auch da, weil der Stromzaehler positive Werte zeigt (in meinem Fall +42 oder +31)

In Wirklichkeit, haben die OpenDTUonBattery Jungs sogar eine Sicherheit programmiert, die die Leistung "drosselt". Und das ist die Situation die ich gesehen habe. Es gibt sogar eine Sicherheit falls der Stromzaehler keine Daten liefert.

genmad commented 2 months ago

Ok, dazu whats appen wir dann heute abend.

genmad commented 2 months ago

So wie ich das verstehe aus deinem 2000W Beispiel, ist das Problem, dass die Leistung der Wechselrichter über Mqtt nicht bzw. nicht richtig an den shelly zurück geliefert werden. Prüfe mal bitte was über deine Eingestellten mqttBasicTopics (ac/power) gesendet wird und ob das auch in dem Skript richtig ankommt.

genmad commented 2 months ago

Kannst mir mal ne whats app schicken, dann melde ich mich wenns passt.

Manos1966 commented 2 months ago

mqttBasicTopics (ac/power) gesendet wird und ob das auch in dem Skript richtig ankommt.

Ich brauche Hilfe, ein Print der ac/power zu erstellen.

Ich bin der Meinung, du brauchst das Current Limit lesen. Weicht es zu weit von eingegeben PWR und ist das minimum als PWR eingestellt., dann sollte das PWR negativ werden, damit der Wechselrichter schneller runter regelt.

Manos1966 commented 2 months ago

Guten Morgen @genmad

zu wenig Sonne heute um richtig zu testen, aber ES FUNKTIONIERT! Die minus-Werte sind da! 🎉 Du hattest Rest, es waren meine Grundeinstellungen und dass ich die Werte regelmaessig und leicht unterschiedlich publizieren muss 🤦‍♂️ Die zwei "Absicherungen" der OpenDTUonBattery haben danach den Rest gemacht...

Jetzt werden minus Daten an beide Wechselrichter geliefert und die Anpassung der Leistung ist sehr fix 👍

31 delivering negative numbers