genmad / shellyAPIGen2AndAboveScripts

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

MQTT Server Suggestion? #2

Closed Manos1966 closed 1 month ago

Manos1966 commented 2 months ago

Wir brauchen einen MQTT Server, richtig?

Was würdest empfehlen, für Leute die wenig Ahnung haben?

Ich finde, die einfachste Installation ist mit Home Assistant. Mit Oracle Virtual Box auf Windows (fuer Leute die es zum ersten Mal probieren wollen und keine Linux Maschine haben)

genmad commented 2 months ago

Altuell brauchen wir einen Mqtt Server. Man kann das wahrscheinlich auch ohne realisieren. Müsste ich mal im odob Projekt nachschauen wie man die aktuelle Power abfragen kann. Dann wäre das für alle einfacher, ausser für mich 😂

genmad commented 2 months ago

Also Abfrage der Wr power geht über http. Da Tasmota das auch unterstützt, kann ich da auch ein Webrequest absetzen und dann brauchen wir kein mqtt. Als Option lass ich das aber drinnen.

Müsste sich nur einer finden der das dann testet und „allen möglichen Blödsinn“ damit macht. 🤔

Wenn man du nur jemanden kennen würde. 🙄

Manos1966 commented 2 months ago

Es gibt auch die Leistung von jedem Inverter (ac/power) die per MQTT publiziert wird.

Für sie gibt es keine andere Abfrage-Moeglichkeit?

Und wieder alles grau und Regen heute 🤮

Manos1966 commented 2 months ago

Machen wir uns nicht verrückt. Wenn MQTT notwendig ist, dann müssen die Anwender ein paar Sachen lernen. So, oder so, jemand der 2-3 Wechselrichter+Batterie anschliessen will, muss sich jede Menge Wissen aneignen.

Und (sowieso) waere es fahrlässig, solch ein System zu haben, ohne die Daten zu monitoren (= Datenbank = MQTT) 😉

genmad commented 2 months ago

Es gibt auch die Leistung von jedem Inverter (ac/power) die per MQTT publiziert wird.

Für sie gibt es keine andere Abfrage-Moeglichkeit?

Und wieder alles grau und Regen heute 🤮

Doch, doch die Wr power geht auch per webrequest. Mqtt wäre dann zum steuern nicht mehr nötig.

Manos1966 commented 2 months ago

Es ist (meiner Meinung nach) zweitrangig, (und fuer mich sogar nicht notwendig). Nicht desto trotz, die Moeglichkeit ohne MQTT waere die einfachste Art fuer sehr viele Anwender, die kein Homematik System haben, diese Loesung zu nutzen.

genmad commented 2 months ago

Ausserdem ist es per Direktverbindung ( http) sicherer. Wenn wir kein mqtt benutzen, ist es uns auch egal ob der Server ausfällt.

Manos1966 commented 2 months ago

Ausserdem ist es per Direktverbindung ( http) sicherer.

dann koenntest du direkt nicht nur /power/ac sondern auch:

Ich bin der Meinung, ein kleiner, verständlicher Skript (so wie es jetzt ist), dass den Anwender zwingt sein Gehirn einzuschalten um zu verstehen welche Parameter er eingeben muss, die richtige Art ist.

Das wichtigste ist, Du hast bewiesen, dass es sehr einfach geht und es funktioniert! Und dies war ein Thema, dass seit ein paar Jahren diskutiert wird, aber niemand (ausser dich) eine einfache, praktikable Loesung liefern konnte. 🥇

genmad commented 2 months ago

Ja, man könnte dann alle Werte auslesen und die übernehmen. Dann ist aber beim unteren Leistungslimit die Frage ob dass gleich benutzt wird. Das untere Leistungslimit sagt wann der Wr aus gehen soll. Ist das auch der Wert für unsere minimale Power? … Muss man mal drüber sinnieren.

genmad commented 2 months ago

Das wichtigste ist, Du hast bewiesen, dass es sehr einfach geht und es funktioniert! Und dies war ein Thema, dass seit ein paar Jahren diskutiert wird, aber niemand (ausser dich) eine einfache, praktikable Loesung liefern konnte. 🥇

Das Thema war auch nicht so wichtig, denke ich. Für odob ist es wichtiger einen Wr stabil am laufen zu haben als die paar power user zu supporten.

Ausserdem ist es in odob zu implementieren viel schwieriger, da sicher gesagt wird wir müssen auch unabhängige Wr regeln können.

Mein Ansatz war halt sehr einfach und funktioniert auch nur in diesem abgespeckten Rahmen ( Wr‘s an der selben DC Quelle und nicht an verschiedenen Quellen.)

Was man jetzt noch versuchen könnte, wäre die Regelgeschwindigkeit beim Strombedarfsanstieg zu erhöhen. So dass n Wr‘s in 1/n Zyklus die Spannung nachgestellt haben. Das wird aber komplizierter werden und lohnt den Aufwand wahrscheinlich nicht. Das wäre für mich nur eine schöne Denksportaufgabe, so wie ich das hier bisher auch nur als Denksportaufgabe gesehen habe.

Manos1966 commented 2 months ago

Und doch war es wichtiger als du denkst.

Denn, eine grosse Anzahl Anwender, haben mit HM600 angefangen (damals gab es keine Drosselung). Es sind die jenigen die den naechsten Sprung machen, nachdem sie gesehen haben, dass zwei Solar Panele (die die HM600/HM800 aufnehmen) bei weitem nicht ausreichende Leistung (ausser im Sommer) bringen und heute auch mit Batterien "spielen". Deine "Kleinigkeit" gibt den alten HM600/HM800 die die meisten im Keller haben, ein neues Laben 😉

genmad commented 2 months ago

Bin dabei die HTTP Power Meter Variante zu implementieren. Danach mach ich noch die HTTP Variante für die WR aktuellen Werte. Dann braucht man keinen mqtt server und es ist für andere einfacher und besser nutzbar, hoffentlich.

Danach ist das script dann aber nicht mehr so klein.

genmad commented 2 months ago

So habe angefangen. Http für powermeter müsste funktionieren. http für inverter ist auch schon angefangen aber noch nicht fertig. Deswegen kann man das noch nicht ausprobieren.

Manos1966 commented 2 months ago

sag Bescheid wann ich testen kann - zwischen zwei Schneesturmen versteht sich... 🤮 🤮 🤮 es ist verrueckt hier, wir haben Schneefall ab und zu 🤦‍♂️

gitisgreat2023 commented 2 months ago

Ich habe das skript, rein als Vorbereitung schon mal lauffähig auf meinem Pro3EM. Funktioniert auch mit einem OoB... :-)

Finde die http WR Lösung super, da das Gesamtsystem wenig anfällig wird, wieder eine Abhängigkeit weniger. Tag mich bitte sobald eine erste Version da ist, teste ich gerne auch aus.

So habe angefangen. Http für powermeter müsste funktionieren. http für inverter ist auch schon angefangen aber noch nicht fertig. Deswegen kann man das noch nicht ausprobieren.

genmad commented 2 months ago

So habe jetzt HTTP implementiert und mqtt vollständig entfernt.

HTTP kann verwendet um den LM auszulesen und wird verwendet um die WR Leistungen von den Controllern zu holen. Der WR muss der erste sein der im odob Controller eingerichtet ist. Falls es wie bei @gitisgreat2023 auf dem Pro3EM local läuft muss man local wählen als Wert für netPowerConfig.

Das aktuelle Skript findet ihr hier: https://github.com/genmad/shellyAPIGen2AndAboveScripts/blob/HTTP/src/openDTUonBattery/virtualPowerMeters_oDoB.js

@Manos1966 @gitisgreat2023 ihr könntet dann bitte mal testen und wenn es ok ist, merge ich dass dann später in den master

gitisgreat2023 commented 2 months ago

Super, bin sehr gespannt! Komme frühestens erst Montag dazu, schreibe dann wie es läuft.

Manos1966 commented 2 months ago

@genmad Ich brauche Hilfe

Uncaught Error: Field or method "0" does not already exist, and can't create it on undefined 23:12:43 at newPower = body.inverters[0].AC[0].Power.v; 23:12:43 ^ 23:12:43 in function called from system

Hier ist mein Script https://pastebin.com/Bv8XKbSH

Mein Tasmota Powermeter ist korrekt

71

Vielleicht hat es etwas damit zu tun? // configure http access ( path to the power reading) let httpConfig = { address: "http://192.168.178.75/cm?cmnd=status%208" // the address of the http powerreading required , jsonPath: "StatusSNS/Wohnung/aktuelle_Wirkleistung" // jsonPath for parsing the message for the powerreading, seperate every field by a dot // e.g.: inverters[0].name needs to be represented as: inverters.0.name };

Leider hat die Aenderung jsonPath: "StatusSNS.Wohnung.aktuelle_Wirkleistung" nichts gebracht

Manos1966 commented 2 months ago

Oder, liegt es daran, dass einer Wechselrichter nicht an die Batterie angeschlossen ist 🙈 und dadurch keine Antwort gibt?

genmad commented 2 months ago

Also der Fehler tritt auf beim Abruf der Wr power von einem deiner Controller.

Gib mal folgendes für jeden Controller im Firefox ein und schau dir das Ergebnis an: Http:///api/livedata/status Schau dir mal das Json an was zurück kommt und bei mindestens einem Controller existiert folgender Pfad nicht: inverters[0].AC[0].Power.v .

Wenn du das gefunden hast, dann poste mal die Json Struktur hier.

Folgende Ursachen könnten das Problem sein: ich habe auf einem Softwarestand von odob von November oder Dezember entwickelt. Welche Softwarestände hast du auf deinen Controllern?

Sind bei dir die Wechselrichter auf Platz 0 gelistet in deinen Controllern ?

Sonstige Gründe 🤷‍♂️

genmad commented 2 months ago

Oder, liegt es daran, dass einer Wechselrichter nicht an die Batterie angeschlossen ist 🙈 und dadurch keine Antwort gibt?

Na wer macht denn sowas? 😂Ja wenn er keine Antwort gibt, dann funktioniert meine Fehlerbehandlung nicht richtig., die für diesen Fall nicht vorhanden ist😏.

Ich verstehe das dann AC[0] nicht da ist, weil odoB keine Daten dafür hat. Das könnte man als bug in odob sehen. Könnte abgefangen werden, falls du mir erklärst dass das nur zum Testen ist.

Aber im Prinzip ist das ja aber das Standard einschaltverhalten nach stromausfall.

Da muss ich wohl noch was machen.

Manos1966 commented 2 months ago

@genmad

Nein, das Problem ist noch da. Die Wechselrichter sind auf Platz 0 Hier die Antworten: https://pastebin.com/zmKTC5ra https://pastebin.com/SsSF5KVA

Ich sehe kein AC, sondern:

"total": {
    "Power": {
        "v": 143,
        "u": "W",
        "d": 1
    },
Manos1966 commented 2 months ago

Das gibt es nicht! die Antwort per WebAPI Http:///api/livedata/status liefert NICHT das Ergebnis wie unter https://github.com/helgeerbe/OpenDTU-OnBattery/wiki/Web-API beschrieben!

genmad commented 2 months ago

Das gibt es nicht! die Antwort per WebAPI Http:///api/livedata/status liefert NICHT das Ergebnis wie unter https://github.com/helgeerbe/OpenDTU-OnBattery/wiki/Web-API beschrieben!

Welche firmware version hast du installiert? Mal ein update auf eine aktuelle machen evtl.?

Manos1966 commented 2 months ago

Natuerlich die aktuelle! Firmwareversion / git Hash | 2024.03.23

Was bekommst du wenn du die Abfrage bei dir machst?

Manos1966 commented 2 months ago

Es ist kein Bug!!!!

NUR wenn du die Abfrage so machsts http://192.168.188.155/api/livedata/status?inv=116xxxxx

Bekommst du die AC Daten!!!!

Es hat sich seit Firmware 24.02.12 geaendert https://github.com/tbnobody/OpenDTU/releases/tag/v24.2.12

Manos1966 commented 2 months ago

Keine Katastrophe, aber etwas Anpassung muss du machen: Du brauchst auch die SerienNr des Wechselrichters addieren und in deiner Formel (siehe unten) "?inv=" + SerienNr ergaenzen.

    dict = {url: "http://" + configs[i].controllerIp + "/api/livedata/status", index: i}
    Timer.set( 2500, true, controllerTimer, dict);
    HTTPServer.registerEndpoint( "pwr" + (i+1) , VirtualPowerMeterReadings, i)
genmad commented 2 months ago

Natuerlich die aktuelle! Firmwareversion / git Hash | 2024.03.23

Was bekommst du wenn du die Abfrage bei dir machst?

Das was aktuell im Wiki steht.

Manos1966 commented 2 months ago

Ich habe VIER OpenDTUs in drei Orten getestet.

NUR die OpenDTU mit alten Firmware liefert Das was aktuell im Wiki steht.

Was zum T... ist hier los?

Manos1966 commented 2 months ago

So, I changed your script in order to formulate a request of the type http://192.168.188.155/api/livedata/status?inv=116xxxxx and no more errors as far as this is concerned.

Next Issue of the Script: NetPower: undefined

Wie ich bereits beschrieben habe, die Eingaben im Skript: address: "http://192.168.178.75/cm?cmnd=status%208" // the address of the http powerreading required , jsonPath: "StatusSNS/Wohnung/aktuelle_Wirkleistung" // jsonPath for parsing the message for the powerreading, seperate every field by a dot

auf meine OpenDTU, die Abfrage funktioniert und liefert das Ergebnis des Stromzaehlers: 71

genmad commented 2 months ago

Wie ich bereits beschrieben habe, die Eingaben im Skript: address: "http://192.168.178.75/cm?cmnd=status%208" // the address of the http powerreading required , jsonPath: "StatusSNS/Wohnung/aktuelle_Wirkleistung" // jsonPath for parsing the message for the powerreading, seperate every field by a dot

stell mal bitte das Ergebnis wenn du die Adresse mit Firefox aufrufst hier ein.

Und benutze mal . Als trenner und nicht backslashes. Also: StatusSNS.Wohnung.aktuelle_Wirkleistung

genmad commented 2 months ago

Natuerlich die aktuelle! Firmwareversion / git Hash | 2024.03.23

Was bekommst du wenn du die Abfrage bei dir machst?

Welches build artefact muss ich eigentlich nehmen, wenn ich ein Firmware update mache. Habs noch nie gemacht und bin etwas verwirrt von den vielen Möglichkeiten. 🙄

Manos1966 commented 2 months ago

Und benutze mal . Als trenner und nicht backslashes.

Verdammt 🤦‍♂️ Meine Dummheit, Sorry! jetzt funktioniert die NetPower 👍

Manos1966 commented 2 months ago

Ich habe deine Routine angepasst: Variabel controllerSr: '11418xxxx' addiert

let configs=[ { nominalPower_Watt: 1500, minRequiredPower_Watt: 51, controllerIp: '192.168.178.65', controllerSr: '11617xxxx' } , { nominalPower_Watt: 800, minRequiredPower_Watt: 52, controllerIp: '192.168.178.93', controllerSr: '11418xxxx' } // , { nominalPower_Watt: 800, minRequiredPower_Watt: 53, controllerIp: '192.168.178.xx', controllerSr: '11418xxxx' } ];

und

dict = {url: "http://" + configs[i].controllerIp + "/api/livedata/status?inv=" + configs[i].controllerSr, index: i}

Manos1966 commented 2 months ago

Welches build artefact muss ich eigentlich nehmen, wenn ich ein Firmware update mache.

Du hast einen einfach ESP32 (keine besondere Platine), oder?

Dann die opendtu-onbattery-generic_esp32 https://github.com/helgeerbe/OpenDTU-OnBattery/releases/download/2024.03.23/opendtu-onbattery-generic_esp32.bin

Wichtig! Die Datei auf deine lokale Festplatte runterladen (Zu Lange Pfads auf eine NAS verursachen manchmal Probleme).

Vor dem Update: Einstellungen-Konfigurationsverwaltung, Sicherung der Konfigurationsdatei config.json (man wiess ja nie...)

Beim Update, warten, manchmal dauert es länger bis das OK gezeigt wird.

Manos1966 commented 2 months ago

Sorry for being a pain but: http://192.168.178.92/script/3/pwr1

with JSON Pfad pwr returns Bad HTTP code: 404

Also in Browser: http://192.168.178.92/script/3/pwr1 http://192.168.178.92/script/3/pwr2

return "not found"

Ich gehe davon aus, ich mache etwas dummes... ich bin trotzdem dankbar fuer jeden Hinweis...

Zur Sicherheit: Wenn ich let scriptId=3 habe, dann bleibt es 3, unabhaengig wieviel Scripts ich auf die Shelly geladen habe, korrekt?

PS. Zur Zeit ist mein Strozaehler negativ (die Grosse Anlage liefert zu viel Strom ins Netz). Das sollte aber keine Rolle Spielen, oder?

Es werden keine weitere Berechnungnen gemacht ausser diese die du hier siehst, obwohl ich jede Menge print() eingeschaltet habe. 73

genmad commented 2 months ago

Script nicht an? Ich denke es sollte 3 bleiben, habe damit aber bisher keine Erfahrungen gemacht. Bei mir ging es halt immer 😎

Manos1966 commented 2 months ago

Was macht das? Timer.set( 2500, true, controllerTimer, dict);

Ich bekomme gar keine Daten von diesem print angezeigt: HTTPServer.registerEndpoint( "pwr" + (i+1) , VirtualPowerMeterReadings, i); print("pwr" + (i+1)+": " + VirtualPowerMeterReadings );

genmad commented 2 months ago

Es werden keine weitere Berechnungnen gemacht ausser diese die du hier siehst, obwohl ich jede Menge print() eingeschaltet habe. ![73]

wenn du überall prints hast und nur die aufgerufen werden, dann wird irgend etwas nicht richtig aufgerufen. Mache mal in jede Funktion ein Print mit dem Funktionsnamen und falls vorhanden mit dem Parameter. Dann kann man nachvollziehen was alles aufgerufen wird und was fehlt.

Manos1966 commented 2 months ago

Die prints funktionieren nicht. sehr merkwuerdig...

Ist es normal, dass keine ; am Ende dieser Linien steht?

    dict = {url: "http://" + configs[i].controllerIp + "/api/livedata/status", index: i}
    Timer.set( 2500, true, controllerTimer, dict);
    HTTPServer.registerEndpoint( "pwr" + (i+1) , VirtualPowerMeterReadings, i)
}
Manos1966 commented 2 months ago

Und hier ist es Es hat sich seit Firmware 24.02.12 geaendert https://github.com/tbnobody/OpenDTU/releases/tag/v24.2.12

genmad commented 2 months ago

Was macht das? Timer.set( 2500, true, controllerTimer, dict);

Ich bekomme gar keine Daten von diesem print angezeigt: HTTPServer.registerEndpoint( "pwr" + (i+1) , VirtualPowerMeterReadings, i); print("pwr" + (i+1)+": " + VirtualPowerMeterReadings );

Konfiguriere das alle 2,5s die funktion controllerTimer aufgerufen wird.

genmad commented 2 months ago

Die prints funktionieren nicht. sehr merkwuerdig...

Ist es normal, dass keine ; am Ende dieser Linien steht?

  dict = {url: "http://" + configs[i].controllerIp + "/api/livedata/status", index: i}
  Timer.set( 2500, true, controllerTimer, dict);
  HTTPServer.registerEndpoint( "pwr" + (i+1) , VirtualPowerMeterReadings, i)
}

Eigentlich meckert er wenn es nicht passt mit den semicolons. Aber kannst ja mal welche hinzufügen. Schauen ob es dann geht.

Manos1966 commented 2 months ago

Ich habe einen ganz merkwuerdigen Fehler: Beim Starten des Skripts, sehe ich nicht die Start Prints.

Loesche ich die initialisierung funktionen aus, werden die Prints die ich am Anfang habe, gesehen.

Ich bin am Ende mit mein Latein...

Ich glaube jetzt ist Zeit dass du die neue Firmware installierst und bei dir probierst.

Ich habe jetzt einen HM1500 und einen HM800 auf die 10kWh Pylontech angeschlossen aber leider haben wir heute nicht viel Sonne und die Batterie steht bei 15%. Ich hoffe sie wird etwas mehr bis heute Abend bekommen.... 🤞

genmad commented 2 months ago

Ich schaue es mir heute Abend an.

Teile bitte nochmal deinen aktuellen Stand

genmad commented 2 months ago

Ich habe jetzt einen HM1500 und einen HM800 auf die 10kWh Pylontech angeschlossen aber leider haben wir heute nicht viel Sonne und die Batterie steht bei 15%. Ich hoffe sie wird etwas mehr bis heute Abend bekommen.... 🤞

Du scheinst ja in dunkel Stadt oder Schlechtwetter Town zu leben. Ob sich da eine Solaranlage je auszahlen wird?

genmad commented 2 months ago

So habe jetzt ein update veröffentlicht. Änderungen:

@Manos1966 @gitisgreat2023

genmad commented 2 months ago

Falls das fertig wird, mache ich evtl. eine Variante die ohne LM auskommt und zu festen Zeiten feste Lasten vorgibt. Wurde auch schon mal in odob gewünscht.

Manos1966 commented 2 months ago

@genmad Link?

genmad commented 2 months ago

Bitte schön https://github.com/genmad/shellyAPIGen2AndAboveScripts/blob/HTTP/src/openDTUonBattery/virtualPowerMeters_oDoB.js